/**Function******************************************************************** Synopsis [Performs the recursive step of Cudd_addCmpl.] Description [Performs the recursive step of Cudd_addCmpl. Returns a pointer to the resulting ADD if successful; NULL otherwise.] SideEffects [None] SeeAlso [Cudd_addCmpl] ******************************************************************************/ DdNode * cuddAddCmplRecur( DdManager * dd, DdNode * f) { DdNode *one,*zero; DdNode *r,*Fv,*Fnv,*t,*e; statLine(dd); one = DD_ONE(dd); zero = DD_ZERO(dd); if (cuddIsConstant(f)) { if (f == zero) { return(one); } else { return(zero); } } r = cuddCacheLookup1(dd,Cudd_addCmpl,f); if (r != NULL) { return(r); } Fv = cuddT(f); Fnv = cuddE(f); t = cuddAddCmplRecur(dd,Fv); if (t == NULL) return(NULL); cuddRef(t); e = cuddAddCmplRecur(dd,Fnv); if (e == NULL) { Cudd_RecursiveDeref(dd,t); return(NULL); } cuddRef(e); r = (t == e) ? t : cuddUniqueInter(dd,(int)f->index,t,e); if (r == NULL) { Cudd_RecursiveDeref(dd, t); Cudd_RecursiveDeref(dd, e); return(NULL); } cuddDeref(t); cuddDeref(e); cuddCacheInsert1(dd,Cudd_addCmpl,f,r); return(r); } /* end of cuddAddCmplRecur */
/**Function******************************************************************** Synopsis [Computes the complement of an ADD a la C language.] Description [Computes the complement of an ADD a la C language: The complement of 0 is 1 and the complement of everything else is 0. Returns a pointer to the resulting ADD if successful; NULL otherwise.] SideEffects [None] SeeAlso [Cudd_addNegate] ******************************************************************************/ DdNode * Cudd_addCmpl( DdManager * dd, DdNode * f) { DdNode *res; do { dd->reordered = 0; res = cuddAddCmplRecur(dd,f); } while (dd->reordered == 1); return(res); } /* end of Cudd_addCmpl */
/**Function******************************************************************** Synopsis [Performs the recursive step for Cudd_BddToAdd.] Description [Performs the recursive step for Cudd_BddToAdd. Returns a pointer to the resulting ADD if successful; NULL otherwise.] SideEffects [None] SeeAlso [] ******************************************************************************/ static DdNode * ddBddToAddRecur( DdManager * dd, DdNode * B) { DdNode *_true; DdNode *res, *res1, *T, *E, *Bt, *Be; int complement = 0; statLine(dd); _true = DD_TRUE(dd); if (Cudd_IsConstant(B)) { if (B == _true) { res = _true; } else { res = DD_FALSE(dd); } return(res); } /* Check visited table */ res = cuddCacheLookup1(dd,ddBddToAddRecur,B); if (res != NULL) return(res); if (Cudd_IsComplement(B)) { complement = 1; Bt = cuddT(Cudd_Regular(B)); Be = cuddE(Cudd_Regular(B)); } else { Bt = cuddT(B); Be = cuddE(B); } T = ddBddToAddRecur(dd, Bt); if (T == NULL) return(NULL); cuddRef(T); E = ddBddToAddRecur(dd, Be); if (E == NULL) { Cudd_RecursiveDeref(dd, T); return(NULL); } cuddRef(E); /* No need to check for T == E, because it is guaranteed not to happen. */ res = cuddUniqueInter(dd, (int) Cudd_Regular(B)->index, T, E); if (res == NULL) { Cudd_RecursiveDeref(dd ,T); Cudd_RecursiveDeref(dd ,E); return(NULL); } cuddDeref(T); cuddDeref(E); if (complement) { cuddRef(res); res1 = cuddAddCmplRecur(dd, res); if (res1 == NULL) { Cudd_RecursiveDeref(dd, res); return(NULL); } cuddRef(res1); Cudd_RecursiveDeref(dd, res); res = res1; cuddDeref(res); } /* Store result. */ cuddCacheInsert1(dd,ddBddToAddRecur,B,res); return(res); } /* end of ddBddToAddRecur */