/**Function******************************************************************** Synopsis [Checks whether g is the BDD of a cube.] Description [Checks whether g is the BDD of a cube. Returns 1 in case of success; 0 otherwise. The constant 1 is a valid cube, but all other constant functions cause cuddCheckCube to return 0.] SideEffects [None] SeeAlso [] ******************************************************************************/ int cuddCheckCube( DdManager * dd, DdNode * g) { DdNode *g1,*g0,*one,*zero; one = DD_ONE(dd); if (g == one) return(1); if (Cudd_IsConstant(g)) return(0); zero = Cudd_Not(one); cuddGetBranches(g,&g1,&g0); if (g0 == zero) { return(cuddCheckCube(dd, g1)); } if (g1 == zero) { return(cuddCheckCube(dd, g0)); } return(0); } /* end of cuddCheckCube */
/**Function******************************************************************** Synopsis [Computes the compatible projection of R w.r.t. cube Y.] Description [Computes the compatible projection of relation R with respect to cube Y. Returns a pointer to the c-projection if successful; NULL otherwise. For a comparison between Cudd_CProjection and Cudd_PrioritySelect, see the documentation of the latter.] SideEffects [None] SeeAlso [Cudd_PrioritySelect] ******************************************************************************/ DdNode * Cudd_CProjection( DdManager * dd, DdNode * R, DdNode * Y) { DdNode *res; DdNode *support; if (cuddCheckCube(dd,Y) == 0) { (void) fprintf(dd->err, "Error: The third argument of Cudd_CProjection should be a cube\n"); dd->errorCode = CUDD_INVALID_ARG; return(NULL); } /* Compute the support of Y, which is used by the abstraction step ** in cuddCProjectionRecur. */ support = Cudd_Support(dd,Y); if (support == NULL) return(NULL); cuddRef(support); do { dd->reordered = 0; res = cuddCProjectionRecur(dd,R,Y,support); } while (dd->reordered == 1); if (res == NULL) { Cudd_RecursiveDeref(dd,support); return(NULL); } cuddRef(res); Cudd_RecursiveDeref(dd,support); cuddDeref(res); return(res); } /* end of Cudd_CProjection */