/** * @brief Basic ADD test. * @return 0 if successful; -1 otherwise. */ static int testAdd(int verbosity) { DdManager *manager; DdNode *f, *var, *tmp, *bg; int i, ret; CUDD_VALUE_TYPE pinf; manager = Cudd_Init(0, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0); if (!manager) { if (verbosity) { printf("initialization failed\n"); } return -1; } pinf = Cudd_V(Cudd_ReadPlusInfinity(manager)); if (verbosity) { printf("Plus infinity is %g\n", pinf); } f = Cudd_addConst(manager,5); Cudd_Ref(f); for (i = 3; i >= 0; i--) { var = Cudd_addIthVar(manager,i); Cudd_Ref(var); tmp = Cudd_addApply(manager,Cudd_addTimes,var,f); Cudd_Ref(tmp); Cudd_RecursiveDeref(manager,f); Cudd_RecursiveDeref(manager,var); f = tmp; } if (verbosity) { Cudd_PrintMinterm(manager, f); printf("\n"); } Cudd_RecursiveDeref(manager, f); bg = Cudd_ReadBackground(manager); if (verbosity) { printf("background (%g) minterms : ", Cudd_V(bg)); Cudd_ApaPrintMinterm(Cudd_ReadStdout(manager), manager, bg, 0); } ret = Cudd_CheckZeroRef(manager); if (ret != 0 && verbosity) { printf("%d non-zero ADD reference counts after dereferencing\n", ret); } Cudd_Quit(manager); return ret != 0; }
/**Function******************************************************************** Synopsis [Performs the reordering-sensitive step of Extra_bddWalsh().] Description [Generates in a bottom-up fashion an ADD for all spectral coefficients of the functions represented by a BDD.] SideEffects [] SeeAlso [] ******************************************************************************/ DdNode* extraBddWalsh( DdManager * dd, /* the manager */ DdNode * bFunc, /* the function whose spectrum is being computed */ DdNode * bVars) /* the variables on which the function depends */ { DdNode * aRes; statLine(dd); if ( clock() > s_TimeLimit ) return NULL; /* terminal cases */ if ( bVars == b1 ) { assert( Cudd_IsConstant(bFunc) ); if ( bFunc == b0 ) return a1; else return Cudd_addConst(dd,-1.0); } /* check cache */ // if ( bFunc->ref != 1 ) if ( ( aRes = cuddCacheLookup2(dd, extraBddWalsh, bFunc, bVars) ) ) { s_CacheHit++; return aRes; } else { DdNode * bFunc0, * bFunc1; /* cofactors of the function */ DdNode * aWalsh0, * aWalsh1; /* partial solutions of the problem */ DdNode * aRes0, * aRes1; /* partial results to be composed by ITE */ DdNode * bFuncR = Cudd_Regular(bFunc); /* the regular pointer to the function */ s_CacheMiss++; /* bFunc cannot depend on a variable that is not in bVars */ assert( cuddI(dd,bFuncR->index) >= cuddI(dd,bVars->index) ); /* cofactor the BDD */ if ( bFuncR->index == bVars->index ) { if ( bFuncR != bFunc ) /* bFunc is complemented */ { bFunc0 = Cudd_Not( cuddE(bFuncR) ); bFunc1 = Cudd_Not( cuddT(bFuncR) ); } else { bFunc0 = cuddE(bFuncR); bFunc1 = cuddT(bFuncR); } } else /* bVars is higher in the variable order */ bFunc0 = bFunc1 = bFunc; /* solve subproblems */ aWalsh0 = extraBddWalsh( dd, bFunc0, cuddT(bVars) ); if ( aWalsh0 == NULL ) return NULL; cuddRef( aWalsh0 ); aWalsh1 = extraBddWalsh( dd, bFunc1, cuddT(bVars) ); if ( aWalsh1 == NULL ) { Cudd_RecursiveDeref( dd, aWalsh0 ); return NULL; } cuddRef( aWalsh1 ); /* compute aRes0 = aWalsh0 + aWalsh1 */ aRes0 = cuddAddApplyRecur( dd, Cudd_addPlus, aWalsh0, aWalsh1 ); if ( aRes0 == NULL ) { Cudd_RecursiveDeref( dd, aWalsh0 ); Cudd_RecursiveDeref( dd, aWalsh1 ); return NULL; } cuddRef( aRes0 ); /* compute aRes1 = aWalsh0 - aWalsh1 */ aRes1 = cuddAddApplyRecur( dd, Cudd_addMinus, aWalsh0, aWalsh1 ); if ( aRes1 == NULL ) { Cudd_RecursiveDeref( dd, aWalsh0 ); Cudd_RecursiveDeref( dd, aWalsh1 ); Cudd_RecursiveDeref( dd, aRes0 ); return NULL; } cuddRef( aRes1 ); Cudd_RecursiveDeref(dd, aWalsh0); Cudd_RecursiveDeref(dd, aWalsh1); /* only aRes0 and aRes1 are referenced at this point */ /* consider the case when Res0 and Res1 are the same node */ aRes = (aRes1 == aRes0) ? aRes1 : cuddUniqueInter( dd, bVars->index, aRes1, aRes0 ); if (aRes == NULL) { Cudd_RecursiveDeref(dd, aRes1); Cudd_RecursiveDeref(dd, aRes0); return NULL; } cuddDeref(aRes1); cuddDeref(aRes0); /* insert the result into cache */ // if ( bFunc->ref != 1 ) cuddCacheInsert2(dd, extraBddWalsh, bFunc, bVars, aRes); return aRes; } } /* end of extraBddWalsh */