예제 #1
0
/**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;
}
예제 #2
0
파일: shadow.c 프로젝트: rebryant/Cloud-BDD
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;
}