⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cuddbddabs.c

📁 主要进行大规模的电路综合
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (F->ref != 1 && (res = cuddCacheLookup2(manager, Cudd_bddExistAbstract, f, cube)) != NULL) {	return(res);    }    /* Compute the cofactors of f. */    T = cuddT(F); E = cuddE(F);    if (f != F) {	T = Cudd_Not(T); E = Cudd_Not(E);    }    /* If the two indices are the same, so are their levels. */    if (F->index == cube->index) {	if (T == one || E == one || T == Cudd_Not(E)) {	    return(one);	}	res1 = cuddBddExistAbstractRecur(manager, T, cuddT(cube));	if (res1 == NULL) return(NULL);	if (res1 == one) {	    if (F->ref != 1)		cuddCacheInsert2(manager, Cudd_bddExistAbstract, f, cube, one);	    return(one);	}        cuddRef(res1);	res2 = cuddBddExistAbstractRecur(manager, E, cuddT(cube));	if (res2 == NULL) {	    Cudd_IterDerefBdd(manager,res1);	    return(NULL);	}        cuddRef(res2);	res = cuddBddAndRecur(manager, Cudd_Not(res1), Cudd_Not(res2));	if (res == NULL) {	    Cudd_IterDerefBdd(manager, res1);	    Cudd_IterDerefBdd(manager, res2);	    return(NULL);	}	res = Cudd_Not(res);	cuddRef(res);	Cudd_IterDerefBdd(manager, res1);	Cudd_IterDerefBdd(manager, res2);	if (F->ref != 1)	    cuddCacheInsert2(manager, Cudd_bddExistAbstract, f, cube, res);	cuddDeref(res);        return(res);    } else { /* if (cuddI(manager,F->index) < cuddI(manager,cube->index)) */	res1 = cuddBddExistAbstractRecur(manager, T, cube);	if (res1 == NULL) return(NULL);        cuddRef(res1);	res2 = cuddBddExistAbstractRecur(manager, E, cube);	if (res2 == NULL) {	    Cudd_IterDerefBdd(manager, res1);	    return(NULL);	}        cuddRef(res2);	/* ITE takes care of possible complementation of res1 and of the        ** case in which res1 == res2. */	res = cuddBddIteRecur(manager, manager->vars[F->index], res1, res2);	if (res == NULL) {	    Cudd_IterDerefBdd(manager, res1);	    Cudd_IterDerefBdd(manager, res2);	    return(NULL);	}	cuddDeref(res1);	cuddDeref(res2);	if (F->ref != 1)	    cuddCacheInsert2(manager, Cudd_bddExistAbstract, f, cube, res);        return(res);    }	    } /* end of cuddBddExistAbstractRecur *//**Function********************************************************************  Synopsis [Takes the exclusive OR of two BDDs and simultaneously abstracts the  variables in cube.]  Description [Takes the exclusive OR of two BDDs and simultaneously abstracts  the variables in cube. The variables are existentially abstracted.  Returns a  pointer to the result is successful; NULL otherwise.]  SideEffects [None]  SeeAlso     [Cudd_bddAndAbstract]******************************************************************************/DdNode *cuddBddXorExistAbstractRecur(  DdManager * manager,  DdNode * f,  DdNode * g,  DdNode * cube){    DdNode *F, *fv, *fnv, *G, *gv, *gnv;    DdNode *one, *zero, *r, *t, *e, *Cube;    unsigned int topf, topg, topcube, top, index;    statLine(manager);    one = DD_ONE(manager);    zero = Cudd_Not(one);    /* Terminal cases. */    if (f == g) {	return(zero);    }    if (f == Cudd_Not(g)) {	return(one);    }    if (cube == one) {	return(cuddBddXorRecur(manager, f, g));    }    if (f == one) {	return(cuddBddExistAbstractRecur(manager, Cudd_Not(g), cube));    }    if (g == one) {	return(cuddBddExistAbstractRecur(manager, Cudd_Not(f), cube));    }    if (f == zero) {	return(cuddBddExistAbstractRecur(manager, g, cube));    }    if (g == zero) {	return(cuddBddExistAbstractRecur(manager, f, cube));    }    /* At this point f, g, and cube are not constant. */    if (f > g) { /* Try to increase cache efficiency. */	DdNode *tmp = f;	f = g;	g = tmp;    }    /* Check cache. */    r = cuddCacheLookup(manager, DD_BDD_XOR_EXIST_ABSTRACT_TAG, f, g, cube);    if (r != NULL) {	return(r);    }    /* Here we can skip the use of cuddI, because the operands are known    ** to be non-constant.    */    F = Cudd_Regular(f);    topf = manager->perm[F->index];    G = Cudd_Regular(g);    topg = manager->perm[G->index];    top = ddMin(topf, topg);    topcube = manager->perm[cube->index];    if (topcube < top) {	return(cuddBddXorExistAbstractRecur(manager, f, g, cuddT(cube)));    }    /* Now, topcube >= top. */    if (topf == top) {	index = F->index;	fv = cuddT(F);	fnv = cuddE(F);	if (Cudd_IsComplement(f)) {	    fv = Cudd_Not(fv);	    fnv = Cudd_Not(fnv);	}    } else {	index = G->index;	fv = fnv = f;    }    if (topg == top) {	gv = cuddT(G);	gnv = cuddE(G);	if (Cudd_IsComplement(g)) {	    gv = Cudd_Not(gv);	    gnv = Cudd_Not(gnv);	}    } else {	gv = gnv = g;    }    if (topcube == top) {	Cube = cuddT(cube);    } else {	Cube = cube;    }    t = cuddBddXorExistAbstractRecur(manager, fv, gv, Cube);    if (t == NULL) return(NULL);    /* Special case: 1 OR anything = 1. Hence, no need to compute    ** the else branch if t is 1.    */    if (t == one && topcube == top) {	cuddCacheInsert(manager, DD_BDD_XOR_EXIST_ABSTRACT_TAG, f, g, cube, one);	return(one);    }    cuddRef(t);    e = cuddBddXorExistAbstractRecur(manager, fnv, gnv, Cube);    if (e == NULL) {	Cudd_IterDerefBdd(manager, t);	return(NULL);    }    cuddRef(e);    if (topcube == top) {	/* abstract */	r = cuddBddAndRecur(manager, Cudd_Not(t), Cudd_Not(e));	if (r == NULL) {	    Cudd_IterDerefBdd(manager, t);	    Cudd_IterDerefBdd(manager, e);	    return(NULL);	}	r = Cudd_Not(r);	cuddRef(r);	Cudd_IterDerefBdd(manager, t);	Cudd_IterDerefBdd(manager, e);	cuddDeref(r);    } else if (t == e) {	r = t;	cuddDeref(t);	cuddDeref(e);    } else {	if (Cudd_IsComplement(t)) {	    r = cuddUniqueInter(manager,(int)index,Cudd_Not(t),Cudd_Not(e));	    if (r == NULL) {		Cudd_IterDerefBdd(manager, t);		Cudd_IterDerefBdd(manager, e);		return(NULL);	    }	    r = Cudd_Not(r);	} else {	    r = cuddUniqueInter(manager,(int)index,t,e);	    if (r == NULL) {		Cudd_IterDerefBdd(manager, t);		Cudd_IterDerefBdd(manager, e);		return(NULL);	    }	}	cuddDeref(e);	cuddDeref(t);    }    cuddCacheInsert(manager, DD_BDD_XOR_EXIST_ABSTRACT_TAG, f, g, cube, r);    return (r);} /* end of cuddBddXorExistAbstractRecur *//**Function********************************************************************  Synopsis    [Performs the recursive steps of Cudd_bddBoleanDiff.]  Description [Performs the recursive steps of Cudd_bddBoleanDiff.  Returns the BDD obtained by XORing the cofactors of f with respect to  var if successful; NULL otherwise. Exploits the fact that dF/dx =  dF'/dx.]  SideEffects [None]  SeeAlso     []******************************************************************************/DdNode *cuddBddBooleanDiffRecur(  DdManager * manager,  DdNode * f,  DdNode * var){    DdNode *T, *E, *res, *res1, *res2;    statLine(manager);    if (cuddI(manager,f->index) > manager->perm[var->index]) {	/* f does not depend on var. */	return(Cudd_Not(DD_ONE(manager)));    }    /* From now on, f is non-constant. */    /* If the two indices are the same, so are their levels. */    if (f->index == var->index) {	res = cuddBddXorRecur(manager, cuddT(f), cuddE(f));        return(res);    }    /* From now on, cuddI(manager,f->index) < cuddI(manager,cube->index). */    /* Check the cache. */    res = cuddCacheLookup2(manager, cuddBddBooleanDiffRecur, f, var);    if (res != NULL) {	return(res);    }    /* Compute the cofactors of f. */    T = cuddT(f); E = cuddE(f);    res1 = cuddBddBooleanDiffRecur(manager, T, var);    if (res1 == NULL) return(NULL);    cuddRef(res1);    res2 = cuddBddBooleanDiffRecur(manager, Cudd_Regular(E), var);    if (res2 == NULL) {	Cudd_IterDerefBdd(manager, res1);	return(NULL);    }    cuddRef(res2);    /* ITE takes care of possible complementation of res1 and of the    ** case in which res1 == res2. */    res = cuddBddIteRecur(manager, manager->vars[f->index], res1, res2);    if (res == NULL) {	Cudd_IterDerefBdd(manager, res1);	Cudd_IterDerefBdd(manager, res2);	return(NULL);    }    cuddDeref(res1);    cuddDeref(res2);    cuddCacheInsert2(manager, cuddBddBooleanDiffRecur, f, var, res);    return(res);} /* end of cuddBddBooleanDiffRecur *//*---------------------------------------------------------------------------*//* Definition of static functions                                            *//*---------------------------------------------------------------------------*//**Function********************************************************************  Synopsis [Checks whether cube is an BDD representing the product of  positive literals.]  Description [Returns 1 in case of success; 0 otherwise.]  SideEffects [None]******************************************************************************/static intbddCheckPositiveCube(  DdManager * manager,  DdNode * cube){    if (Cudd_IsComplement(cube)) return(0);    if (cube == DD_ONE(manager)) return(1);    if (cuddIsConstant(cube)) return(0);    if (cuddE(cube) == Cudd_Not(DD_ONE(manager))) {        return(bddCheckPositiveCube(manager, cuddT(cube)));    }    return(0);} /* end of bddCheckPositiveCube */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -