/** * @brief Basic test of ZDDs. * @return 0 if successful; -1 otherwise. */ static int testZdd(int verbosity) { DdManager *manager; DdNode *f, *var, *tmp; int i, ret; manager = Cudd_Init(0,4,CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS,0); if (!manager) { if (verbosity) { printf("initialization failed\n"); } return -1; } tmp = Cudd_ReadZddOne(manager,0); Cudd_Ref(tmp); for (i = 3; i >= 0; i--) { var = Cudd_zddIthVar(manager,i); Cudd_Ref(var); f = Cudd_zddIntersect(manager,var,tmp); Cudd_Ref(f); Cudd_RecursiveDerefZdd(manager,tmp); Cudd_RecursiveDerefZdd(manager,var); tmp = f; } f = Cudd_zddDiff(manager,Cudd_ReadZddOne(manager,0),tmp); Cudd_Ref(f); Cudd_RecursiveDerefZdd(manager,tmp); if (verbosity) { Cudd_zddPrintMinterm(manager,f); printf("\n"); } Cudd_RecursiveDerefZdd(manager,f); ret = Cudd_CheckZeroRef(manager); if (ret != 0 && verbosity) { printf("%d unexpected non-zero references\n", ret); } Cudd_Quit(manager); return 0; }
ref_t shadow_and(shadow_mgr mgr, ref_t aref, ref_t bref) { ref_t r = REF_ZERO; 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_zddIntersect(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_addAnd, 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, bref, shadow_zero(mgr)); #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 %sAND %s --> %s", buf1, dtype == IS_ZDD ? "Z" : dtype == IS_ADD ? "A" : "" , buf2, buf3); #endif return r; }