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; }
// VISITORS virtual void visit(AstNetlist* nodep, AstNUser*) { //VV***** We reset all userp() on the netlist m_modVarMap.clear(); nodep->iterateChildren(*this); }