使用一级结构散列,它使得每一对边最多只能做为一个结点输入。这样,结构散列就能保证:对于每个与门结点,就没有其它带相同子结点的与门;没有仅一个输入的结点;每个与门的层次就能反应输入的层次。所有这些,使得操作aigs比较操作logic networks要快很多。
2.2 发现问题及其根本原因
在研究的过程中,我们发现会产生abc输入mv文件经过优化后的blif 文件的输入输出的个数与原先读入mv文件的输入输出个数的不一致问题。这是因为abc输入mv文件时,主要经过了两步处理。输入mv时,abc把mv文件转成了netlist,这一步是完全正确的,但在netlist转成aig时,出现了问题,abc把latch的输入当成了主输出,把latch的输出当成了主输入,从而造成了有几个latch,就多了几个输出输入。
笔者认为根本原因在于,abc对mv文件中的时序电路支持得有限,在将时序转化为组合的过程中,也就是在netlist转成aig时,采用了不正确的方式去除了latch,从而造成了有几个latch,就多了几个输出输入。
3 问题的解决方案及生成blif
3.1 解决问题
在尝试直接把netlist网络转成aig网络时,来处理这个问题,都归于失败。最后不得不考虑在生成的中间网络上找解决方法。
首先,abc处理mv文件的过程如下:
shape \* mergeformat
然后,我们查看了abc处理blif文件的过程,如下:
shape \* mergeformat
经过讨论,我们试想能不能构造出如下的一种处理方法来解决问题:
经过研究,我们发现这条路是可行的。但在解决的过程中我们发现,.mv文件生成的netlist网络与.blif文件生成的netlist网络存在不同。在前面mv2blif软件的实现方法中寻求灵感,我们试着将这两个相同类型网络转化,最后我们成功解决了这个问题,从而实现了abc对.mv文件能直接进行处理,并且解决了输入输出个数与原先的输入输出个数的不一致的问题。最终实现了如下版本:
shape \* mergeformat
3.2 生成blif文件
abc中读入mv文件后形成aig网络,要想输出blif文件,可进行如下操作:
shape \* mergeformat
4 算法实现及举例
对网络中的功能node进行转换,以下是转换node从aig功能到bdd功能的算法,对于网络只需要用一个遍历,把其所有node转换即可。
ddnode * cuddbddandrecur( ddmanager * manager, ddnode * f, ddnode * g)
{
ddnode *f, *fv, *fnv, *g, *gv, *gnv;
ddnode *one, *r, *t, *e;
unsigned int topf, topg, index;
statline(manager); //循环次数加1
one = dd_one(manager); //返回manger->one,即常数结点1
//得到结点的正则状态,如果结点取过反,则返回没有取反的状态
f = cudd_regular(f);
g = cudd_regular(g);
if (f == g) {
if (f == g) return(f);
else return(cudd_not(one)); //cudd_not为取反
}
if (f == one) {
if (f == one) return(g);
else return(f);
}
if (g == one) {
if (g == one) return(f);
else return(g);
}
上一页 [1] [2] [3] [4] 下一页