Abc_CommandCut
使用该命令之前必须确保abc所保存的网络pNtk是经过strash后获得的aig网络,因为该命令只针对aig做cut。
何为Cut?
有几个点需要注意,
1、Cut是Nodes的集合,例如{Node1},{Node2,Node3},这都是Cut。
2、K-feasible Cut指的是Cut内的Nodes数量不超过K。
3、Node的K-feasible Cuts是指一个集合,是多个Cut的集合,例如把上面两个cut组合起来形成{{Node1},{Node2,Node3}}。
4、什么是dominated cut?如果有一个Cut1={a,b,c,d},另一个Cut2={a,b,c},那么Cut1就是dominated by Cut2。
以下讲解将以C17.aig电路作为例子,
首先要做的是为PIs生成trivial cut,即仅包含该节点自身的cut。
例如,节点G1的trivial cut为{{G1}}, 节点G2的trivial cut为{{G2}},。。。,以此类推至G5节点。
而后针对内部节点求cut,首先按需要是节点8,
实际上Abc_CommandCut命令如果不额外指定特殊-option的话,默认对内部节点有DAG node和Tree node之分。简单一点来说就是,如果节点的扇出个数大于1,则该节点为DAG节点,否则为Tree节点。注意,ABC对于Tree节点是不产生trivial cut的。
由于节点8是Tree node,所以不产生以自身{{8}}作为初始的trivial cut。接着就会向节点8的扇入节点寻找,即G1和G3。
需要注意的是,此时的G1和G3因为是PIs,所以他们的cut分别是,{{G1}},{{G3}}。
实际上,在向下寻找cut的过程中,ABC会首先判断扇入节点所包含的cut中是否有cut的size(节点个数)大于等于k-feasible
,节点个数大于等于k的cut就被舍弃了,因为不舍弃的话,后面cut与cut组合以后必然是会大于k的。
举个例子,如果k=3,Cut_Fanin0 = {{x}, {x, y}, {x, a, b}},那么{x, a, b}是不会被考虑的,因为这个cut的size已经等于k了,在往下组合下去没有必要了。
言归正传,节点8的扇入节点的cut是各只包含自身的trivial cut,{{G1}},{{G3}}。那他俩一组合就变成{G1,G3},注意在ABC内部,cut内的节点是按节点序号从小到大排序的。
因为G1,G3是PIs没法再往下寻找了,所以此时节点8的cut为{{G1,G3}}。
节点9和节点8类似,不过节点9是DAG节点,所以会多一个自身的trivial cut。它最终的cut是{{9},{G3,G4}}。trivial cu不参与扇入的cut之间的合并操作。
节点10,DAG节点,扇入G2:{{G2}},扇入9:{{9},{G3,G4}},首先节点10会自己生成一个trivial cut,{{10}}。然后就是扇入之间的合并操作,这个合并操作就是与乘法运算,{G2}会先和{9}结合得到{G2,9},然后{G2}再和{G3,G4}结合得到{G2,G3,G4}。所以节点10最终的cut为{{10},{G2,9},{G2,G3,G4}}。
在以节点11举个例子,
首先,节点11不是DAG节点,所以不生成trivial cut。那么寻找节点11的扇入节点,8和10。
8的cut为{{G1,G3}},10的cut为{{10},{G2,9},{G2,G3,G4}}
那么理论上,此时节点11的cut应为{{G1,G3,10},{G1,G2,G3,9},{G1,G2,G3,G4}},因为cut和{G1,G2,G3,9}cut{G1,G2,G3,G4}的size大于等于k-feasible
,所以这两个个cut会被丢弃。
所以节点11最终的cut应为{{G1,G3,10}}。
cut还有个Computer signature的概念,后续更新
为什么要使用signature?
寻找Node的Cuts集合过程中,尝试的Cuts的总数大大超过了发现的k-feasible cuts的数量。这使得检查cut的k可行性,以及测试单个cut是否已经存在和是否被其他cut dominated,成为cut计算的性能瓶颈。