/* 检查缓存 */
if (f->ref != 1 || g->ref != 1) {
//如果已经有对f和g取与的情况,则直接返回
r = cuddcachelookup2(manager, cudd_bddand, f, g); if (r != null) return(r);
}
topf = manager->perm[f->index];
topg = manager->perm[g->index];
/* 计算因子 */
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功能,如下所示:
图4 aig:表示a*b的功能 bdd:表示a*b的功能
5 总结
本文简要介绍了传统的逻辑综合方法,并介绍了netlist、logic network与aig的网络形式,在实现从mv文件经过abc处理并优化生成blif文件的过程中,分析了过程中产生问题的根本原因,并解决了abc对读入mv文件的不足,是通过转换了其读入mv文件过程中的网络形式来解决这个问题。最后给出了结点从aig到bdd功能的转换算法,和一个简单的实例。
参考文献
[1] the vis group.blif-mv.university of berkeley, may 1996.
[2] mvsis group.mvsis manual.uc berkeley, february 2001.
[3] rüdiger ebendt, görschwin fey, rolf drechsler.advanced bdd optimization.university of bremen, 2005.
[4] berkeley logic synthesis and verif
上一页 [1] [2] [3] [4] 下一页