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

📄 cuddaddabs.c

📁 主要进行大规模的电路综合
💻 C
📖 第 1 页 / 共 2 页
字号:
	Cudd_RecursiveDeref(manager,res1);	Cudd_RecursiveDeref(manager,res2);	cuddCacheInsert2(manager, Cudd_addExistAbstract, f, cube, res);	cuddDeref(res);        return(res);    } else { /* if (cuddI(manager,f->index) < cuddI(manager,cube->index)) */	res1 = cuddAddExistAbstractRecur(manager, T, cube);	if (res1 == NULL) return(NULL);        cuddRef(res1);	res2 = cuddAddExistAbstractRecur(manager, E, cube);	if (res2 == NULL) {	    Cudd_RecursiveDeref(manager,res1);	    return(NULL);	}        cuddRef(res2);	res = (res1 == res2) ? res1 :	    cuddUniqueInter(manager, (int) f->index, res1, res2);	if (res == NULL) {	    Cudd_RecursiveDeref(manager,res1);	    Cudd_RecursiveDeref(manager,res2);	    return(NULL);	}	cuddDeref(res1);	cuddDeref(res2);	cuddCacheInsert2(manager, Cudd_addExistAbstract, f, cube, res);        return(res);    }	    } /* end of cuddAddExistAbstractRecur *//**Function********************************************************************  Synopsis    [Performs the recursive step of Cudd_addUnivAbstract.]  Description [Performs the recursive step of Cudd_addUnivAbstract.  Returns the ADD obtained by abstracting the variables of cube from f,  if successful; NULL otherwise.]  SideEffects [None]  SeeAlso     []******************************************************************************/DdNode *cuddAddUnivAbstractRecur(  DdManager * manager,  DdNode * f,  DdNode * cube){    DdNode	*T, *E, *res, *res1, *res2, *one, *zero;    statLine(manager);    one = DD_ONE(manager);    zero = DD_ZERO(manager);    /* Cube is guaranteed to be a cube at this point.    ** zero and one are the only constatnts c such that c*c=c.    */    if (f == zero || f == one || cube == one) {  	return(f);    }    /* Abstract a variable that does not appear in f. */    if (cuddI(manager,f->index) > cuddI(manager,cube->index)) {	res1 = cuddAddUnivAbstractRecur(manager, f, cuddT(cube));	if (res1 == NULL) return(NULL);	cuddRef(res1);	/* Use the "internal" procedure to be alerted in case of	** dynamic reordering. If dynamic reordering occurs, we	** have to abort the entire abstraction.	*/	res = cuddAddApplyRecur(manager, Cudd_addTimes, res1, res1);	if (res == NULL) {	    Cudd_RecursiveDeref(manager,res1);	    return(NULL);	}	cuddRef(res);	Cudd_RecursiveDeref(manager,res1);	cuddDeref(res);	return(res);    }    if ((res = cuddCacheLookup2(manager, Cudd_addUnivAbstract, f, cube)) != NULL) {	return(res);    }    T = cuddT(f);    E = cuddE(f);    /* If the two indices are the same, so are their levels. */    if (f->index == cube->index) {	res1 = cuddAddUnivAbstractRecur(manager, T, cuddT(cube));	if (res1 == NULL) return(NULL);        cuddRef(res1);	res2 = cuddAddUnivAbstractRecur(manager, E, cuddT(cube));	if (res2 == NULL) {	    Cudd_RecursiveDeref(manager,res1);	    return(NULL);	}        cuddRef(res2);	res = cuddAddApplyRecur(manager, Cudd_addTimes, res1, res2);	if (res == NULL) {	    Cudd_RecursiveDeref(manager,res1);	    Cudd_RecursiveDeref(manager,res2);	    return(NULL);	}	cuddRef(res);	Cudd_RecursiveDeref(manager,res1);	Cudd_RecursiveDeref(manager,res2);	cuddCacheInsert2(manager, Cudd_addUnivAbstract, f, cube, res);	cuddDeref(res);        return(res);    } else { /* if (cuddI(manager,f->index) < cuddI(manager,cube->index)) */	res1 = cuddAddUnivAbstractRecur(manager, T, cube);	if (res1 == NULL) return(NULL);        cuddRef(res1);	res2 = cuddAddUnivAbstractRecur(manager, E, cube);	if (res2 == NULL) {	    Cudd_RecursiveDeref(manager,res1);	    return(NULL);	}        cuddRef(res2);	res = (res1 == res2) ? res1 :	    cuddUniqueInter(manager, (int) f->index, res1, res2);	if (res == NULL) {	    Cudd_RecursiveDeref(manager,res1);	    Cudd_RecursiveDeref(manager,res2);	    return(NULL);	}	cuddDeref(res1);	cuddDeref(res2);	cuddCacheInsert2(manager, Cudd_addUnivAbstract, f, cube, res);        return(res);    }} /* end of cuddAddUnivAbstractRecur *//**Function********************************************************************  Synopsis    [Performs the recursive step of Cudd_addOrAbstract.]  Description [Performs the recursive step of Cudd_addOrAbstract.  Returns the ADD obtained by abstracting the variables of cube from f,  if successful; NULL otherwise.]  SideEffects [None]  SeeAlso     []******************************************************************************/DdNode *cuddAddOrAbstractRecur(  DdManager * manager,  DdNode * f,  DdNode * cube){    DdNode	*T, *E, *res, *res1, *res2, *one;    statLine(manager);    one = DD_ONE(manager);    /* Cube is guaranteed to be a cube at this point. */    if (cuddIsConstant(f) || cube == one) {  	return(f);    }    /* Abstract a variable that does not appear in f. */    if (cuddI(manager,f->index) > cuddI(manager,cube->index)) {	res1 = cuddAddOrAbstractRecur(manager, f, cuddT(cube));	if (res1 == NULL) return(NULL);	cuddRef(res1);	/* Use the "internal" procedure to be alerted in case of	** dynamic reordering. If dynamic reordering occurs, we	** have to abort the entire abstraction.	*/	res = cuddAddApplyRecur(manager, Cudd_addOr, res1, res1);	if (res == NULL) {	    Cudd_RecursiveDeref(manager,res1);	    return(NULL);	}	cuddRef(res);	Cudd_RecursiveDeref(manager,res1);	cuddDeref(res);	return(res);    }    if ((res = cuddCacheLookup2(manager, Cudd_addOrAbstract, f, cube)) != NULL) {	return(res);    }    T = cuddT(f);    E = cuddE(f);    /* If the two indices are the same, so are their levels. */    if (f->index == cube->index) {	res1 = cuddAddOrAbstractRecur(manager, T, cuddT(cube));	if (res1 == NULL) return(NULL);        cuddRef(res1);	if (res1 != one) {	    res2 = cuddAddOrAbstractRecur(manager, E, cuddT(cube));	    if (res2 == NULL) {		Cudd_RecursiveDeref(manager,res1);		return(NULL);	    }	    cuddRef(res2);	    res = cuddAddApplyRecur(manager, Cudd_addOr, res1, res2);	    if (res == NULL) {		Cudd_RecursiveDeref(manager,res1);		Cudd_RecursiveDeref(manager,res2);		return(NULL);	    }	    cuddRef(res);	    Cudd_RecursiveDeref(manager,res1);	    Cudd_RecursiveDeref(manager,res2);	} else {	    res = res1;	}	cuddCacheInsert2(manager, Cudd_addOrAbstract, f, cube, res);	cuddDeref(res);        return(res);    } else { /* if (cuddI(manager,f->index) < cuddI(manager,cube->index)) */	res1 = cuddAddOrAbstractRecur(manager, T, cube);	if (res1 == NULL) return(NULL);        cuddRef(res1);	res2 = cuddAddOrAbstractRecur(manager, E, cube);	if (res2 == NULL) {	    Cudd_RecursiveDeref(manager,res1);	    return(NULL);	}        cuddRef(res2);	res = (res1 == res2) ? res1 :	    cuddUniqueInter(manager, (int) f->index, res1, res2);	if (res == NULL) {	    Cudd_RecursiveDeref(manager,res1);	    Cudd_RecursiveDeref(manager,res2);	    return(NULL);	}	cuddDeref(res1);	cuddDeref(res2);	cuddCacheInsert2(manager, Cudd_addOrAbstract, f, cube, res);        return(res);    }} /* end of cuddAddOrAbstractRecur *//*---------------------------------------------------------------------------*//* Definition of static functions                                            *//*---------------------------------------------------------------------------*//**Function********************************************************************  Synopsis    [Checks whether cube is an ADD representing the product  of positive literals.]  Description [Checks whether cube is an ADD representing the product of  positive literals. Returns 1 in case of success; 0 otherwise.]  SideEffects [None]  SeeAlso     []******************************************************************************/static intaddCheckPositiveCube(  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) == DD_ZERO(manager)) {        return(addCheckPositiveCube(manager, cuddT(cube)));    }    return(0);} /* end of addCheckPositiveCube */

⌨️ 快捷键说明

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