NODE * str2tree(const char ** pstr) { /* examples: * () * (2), (2+) * (2(1)(3)), (2+(1)(3)), (2(1+)(3+)) * (2(1+)()), (2()(3+)) */ int k; const char * p = *pstr; NODE * x = 0; assert(*p == '('); p++; assert(isdigit(*p) || *p == ')'); if (isdigit(*p)) { k = 0; while (isdigit(*p)) k = k * 10 + (*p++ - '0'); if (*p == '+') { x = alloc_node(k, R); p++; } else { assert(*p == '(' || *p == ')'); x = alloc_node(k, B); } if (*p == '(') { x->L = str2tree(&p); if (x->L != nil) x->L->P = x; x->R = str2tree(&p); if (x->R !=nil) x->R->P = x; } } else { x = nil; } assert(*p == ')'); p++; printf("processed "); for (const char * q = *pstr; q < p; q++) printf("%s%c%s", GREEN, *q, NOCOLOR); printf("\n"); *pstr = p; return x; }
ACCExpr *cleanupBool(ACCExpr *expr) { if (!expr) return expr; inBool++; // can be invoked recursively! walkReplaceBuiltin(expr); inBool--; int varIndex = 0; VarMap varMap; DdManager * mgr = Cudd_Init(MAX_NAME_COUNT,0,CUDD_UNIQUE_SLOTS,CUDD_CACHE_SLOTS,0); varIndex = 0; varMap.clear(); DdNode *bdd = tree2BDD(mgr, expr, varMap); char const *inames[MAX_NAME_COUNT]; for (auto item: varMap) inames[item.second->index] = strdup(item.first.c_str()); char * fform = Cudd_FactoredFormString(mgr, bdd, inames); Cudd_RecursiveDeref(mgr, bdd); int err = Cudd_CheckZeroRef(mgr); if (trace_bool) printf("%s: expr '%s' val = %s\n", __FUNCTION__, tree2str(expr).c_str(), fform); assert(err == 0 && "Reference counting"); ACCExpr *ret = str2tree(fform); free(fform); Cudd_Quit(mgr); return ret; }
NODE * init_rbtree(const char * tstr) { nil = alloc_node(-1, B); /* the sentinel */ nil->P = nil; nil->L = nil; nil->R = nil; NODE * head= alloc_node(INT_MAX, B); head->P = nil; head->L = str2tree(&tstr); head->R = nil; assert(*tstr == '\0'); return head; }