/**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ DdNode * Extra_bddSpaceEquations( DdManager * dd, DdNode * bSpace ) { DdNode * zRes; DdNode * zEquPos; DdNode * zEquNeg; zEquPos = Extra_bddSpaceEquationsPos( dd, bSpace ); Cudd_Ref( zEquPos ); zEquNeg = Extra_bddSpaceEquationsNeg( dd, bSpace ); Cudd_Ref( zEquNeg ); zRes = Cudd_zddUnion( dd, zEquPos, zEquNeg ); Cudd_Ref( zRes ); Cudd_RecursiveDerefZdd( dd, zEquPos ); Cudd_RecursiveDerefZdd( dd, zEquNeg ); Cudd_Deref( zRes ); return zRes; }
ref_t shadow_or(shadow_mgr mgr, ref_t aref, ref_t bref) { ref_t r = REF_ONE; dd_type_t dtype = IS_BDD; bool za = is_zdd(mgr, aref); bool zb = is_zdd(mgr, bref); bool aa = is_add(mgr, aref); bool ab = is_add(mgr, bref); if (mgr->do_cudd && mgr->nzvars > 0) { /* Check whether arguments are ZDDs */ DdNode *an = get_ddnode(mgr, aref); DdNode *bn = get_ddnode(mgr, bref); DdNode *rn; if (za || zb) { if (aa || ab) { err(false, "Can't mix ADDs and ZDDs"); } dtype = IS_ZDD; /* Make sure they're both ZDDs */ if (!za) { an = zconvert(mgr, an); } if (!zb) { bn = zconvert(mgr, bn); } rn = Cudd_zddUnion(mgr->bdd_manager, an, bn); reference_dd(mgr, rn); r = dd2ref(rn, IS_ZDD); add_ref(mgr, r, rn); if (!za) unreference_dd(mgr, an, IS_ZDD); if (!zb) unreference_dd(mgr, bn, IS_ZDD); } } if (mgr->do_cudd) { /* Check whether arguments are ADDs */ DdNode *an = get_ddnode(mgr, aref); DdNode *bn = get_ddnode(mgr, bref); DdNode *rn; if (aa || ab) { dtype = IS_ADD; /* Make sure they're both ADDs */ if (!aa) { an = aconvert(mgr, an); } if (!ab) { bn = aconvert(mgr, bn); } rn = Cudd_addApply(mgr->bdd_manager, Cudd_addOr, an, bn); reference_dd(mgr, rn); r = dd2ref(rn, IS_ADD); add_ref(mgr, r, rn); if (!aa) unreference_dd(mgr, an, IS_ADD); if (!ab) unreference_dd(mgr, bn, IS_ADD); } } if (dtype == IS_BDD) r = shadow_ite(mgr, aref, shadow_one(mgr), bref); #if RPT >= 4 char buf1[24], buf2[24], buf3[24]; shadow_show(mgr, aref, buf1); shadow_show(mgr, bref, buf2); shadow_show(mgr, r, buf3); report(4, "%s %sOR %s --> %s", buf1, dtype == IS_ZDD ? "Z" : dtype == IS_ADD ? "A" : "" , buf2, buf3); #endif return r; }