/** @brief Implements the recursive step of Cudd_addNegate. @return a pointer to the result. @sideeffect None */ DdNode * cuddAddNegateRecur( DdManager * dd, DdNode * f) { DdNode *res, *fv, *fvn, *T, *E; statLine(dd); /* Check terminal cases. */ if (cuddIsConstant(f)) { res = cuddUniqueConst(dd,-cuddV(f)); return(res); } /* Check cache */ res = cuddCacheLookup1(dd,Cudd_addNegate,f); if (res != NULL) return(res); checkWhetherToGiveUp(dd); /* Recursive Step */ fv = cuddT(f); fvn = cuddE(f); T = cuddAddNegateRecur(dd,fv); if (T == NULL) return(NULL); cuddRef(T); E = cuddAddNegateRecur(dd,fvn); if (E == NULL) { Cudd_RecursiveDeref(dd,T); return(NULL); } cuddRef(E); res = (T == E) ? T : cuddUniqueInter(dd,(int)f->index,T,E); if (res == NULL) { Cudd_RecursiveDeref(dd, T); Cudd_RecursiveDeref(dd, E); return(NULL); } cuddDeref(T); cuddDeref(E); /* Store result. */ cuddCacheInsert1(dd,Cudd_addNegate,f,res); return(res); } /* end of cuddAddNegateRecur */
/**Function******************************************************************** Synopsis [Computes the additive inverse of an ADD.] Description [Computes the additive inverse of an ADD. Returns a pointer to the result if successful; NULL otherwise.] SideEffects [None] SeeAlso [Cudd_addCmpl] ******************************************************************************/ DdNode * Cudd_addNegate( DdManager * dd, DdNode * f) { DdNode *res; do { res = cuddAddNegateRecur(dd,f); } while (dd->reordered == 1); return(res); } /* end of Cudd_addNegate */
/** @brief Computes the additive inverse of an %ADD. @return a pointer to the result if successful; NULL otherwise. @sideeffect None @see Cudd_addCmpl */ DdNode * Cudd_addNegate( DdManager * dd, DdNode * f) { DdNode *res; do { dd->reordered = 0; res = cuddAddNegateRecur(dd,f); } while (dd->reordered == 1); if (dd->errorCode == CUDD_TIMEOUT_EXPIRED && dd->timeoutHandler) { dd->timeoutHandler(dd, dd->tohArg); } return(res); } /* end of Cudd_addNegate */
/**Function******************************************************************** Synopsis [Integer and floating point subtraction.] Description [Integer and floating point subtraction. Returns NULL if not a terminal case; f - g otherwise.] SideEffects [None] SeeAlso [Cudd_addApply] ******************************************************************************/ DdNode * Cudd_addMinus( DdManager * dd, DdNode ** f, DdNode ** g) { DdNode *res; DdNode *F, *G; CUDD_VALUE_TYPE value; F = *f; G = *g; if (F == DD_ZERO(dd)) return(cuddAddNegateRecur(dd,G)); if (G == DD_ZERO(dd)) return(F); if (cuddIsConstant(F) && cuddIsConstant(G)) { value = cuddV(F)-cuddV(G); res = cuddUniqueConst(dd,value); return(res); } return(NULL); } /* end of Cudd_addMinus */