/** @brief Performs the recursive step of addScalarInverse. @return a pointer to the resulting %ADD in case of success. Returns NULL if any discriminants smaller than epsilon is encountered. @sideeffect None */ DdNode * cuddAddScalarInverseRecur( DdManager * dd, DdNode * f, DdNode * epsilon) { DdNode *t, *e, *res; CUDD_VALUE_TYPE value; statLine(dd); if (cuddIsConstant(f)) { if (ddAbs(cuddV(f)) < cuddV(epsilon)) return(NULL); value = 1.0 / cuddV(f); res = cuddUniqueConst(dd,value); return(res); } res = cuddCacheLookup2(dd,Cudd_addScalarInverse,f,epsilon); if (res != NULL) return(res); checkWhetherToGiveUp(dd); t = cuddAddScalarInverseRecur(dd,cuddT(f),epsilon); if (t == NULL) return(NULL); cuddRef(t); e = cuddAddScalarInverseRecur(dd,cuddE(f),epsilon); 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); cuddCacheInsert2(dd,Cudd_addScalarInverse,f,epsilon,res); return(res); } /* end of cuddAddScalarInverseRecur */
/**Function******************************************************************** Synopsis [Computes the scalar inverse of an ADD.] Description [Computes an n ADD where the discriminants are the multiplicative inverses of the corresponding discriminants of the argument ADD. Returns a pointer to the resulting ADD in case of success. Returns NULL if any discriminants smaller than epsilon is encountered.] SideEffects [None] ******************************************************************************/ DdNode * Cudd_addScalarInverse( DdManager * dd, DdNode * f, DdNode * epsilon) { DdNode *res; if (!cuddIsConstant(epsilon)) { (void) fprintf(dd->err,"Invalid epsilon\n"); return(NULL); } do { dd->reordered = 0; res = cuddAddScalarInverseRecur(dd,f,epsilon); } while (dd->reordered == 1); return(res); } /* end of Cudd_addScalarInverse */
/** @brief Computes the scalar inverse of an %ADD. @details Computes an n %ADD where the discriminants are the multiplicative inverses of the corresponding discriminants of the argument %ADD. @return a pointer to the resulting %ADD in case of success. Returns NULL if any discriminants smaller than epsilon is encountered. @sideeffect None */ DdNode * Cudd_addScalarInverse( DdManager * dd, DdNode * f, DdNode * epsilon) { DdNode *res; if (!cuddIsConstant(epsilon)) { (void) fprintf(dd->err,"Invalid epsilon\n"); return(NULL); } do { dd->reordered = 0; res = cuddAddScalarInverseRecur(dd,f,epsilon); } while (dd->reordered == 1); if (dd->errorCode == CUDD_TIMEOUT_EXPIRED && dd->timeoutHandler) { dd->timeoutHandler(dd, dd->tohArg); } return(res); } /* end of Cudd_addScalarInverse */