论文首页哲学论文经济论文法学论文教育论文文学论文历史论文理学论文工学论文医学论文管理论文艺术论文 |
/* 计算因子 */
if (topf <= topg) {
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 <= topf) {
gv = cuddT(G);
gnv = cuddE(G);
if (Cudd_IsComplement(g)) { //判断g结点是否取过反
gv = Cudd_Not(gv); //对gv结点取反
gnv = Cudd_Not(gnv);
}
} else {
gv = gnv = g;
}
t = cuddBddAndRecur(manager, fv, gv);
e = cuddBddAndRecur(manager, fnv, gnv);
if (t == e) {
r = t;
} else {
if (Cudd_IsComplement(t)) {
//如果已经存在以Cudd_Not(t),Cudd_Not(e)为孩子的结点,则返回,如没有,则重//新创建一个,并且把index赋值于它。
r = cuddUniqueInter(manager,(int)index,Cudd_Not(t),Cudd_Not(e));
r = Cudd_Not(r); //对r结点取反
} else {
r = cuddUniqueInter(manager,(int)index,t,e);
}
}
if (F->ref != 1 || G->ref != 1)
cuddCacheInsert2(manager, Cudd_bddAnd, f, g, r); //加入缓存机制
return(r);
} /* end of cuddBddAndRecur */
这里根据算法,我们举例说明结点功能为AIG,表达式为a*b的情况,其转换成BDD功能,如下所示: