让我们说我有一个黑箱电路,其中有N个输入和1个输出。
我想确定M个输入的值,并找到电路可以满足的其余输入(N-M)的值。如果我在verilog RTL中手动修复了M输入,然后将其转换为CNF(使用abc),会产生正确的结果吗?是解决此类问题的正确方法吗?
答案 0 :(得分:4)
问题的原始搜索空间包含2^N
个条目。通过固定M
个输入,搜索空间减少了2^M
倍,并且有2^(N-M)
个条目。
根据您对固定M
输入值的选择,您可以简化搜索或缩小搜索空间,最终导致无法解决。
您的黑匣子是组合电路,其中输出仅取决于输入的当前状态吗?在RTL
(寄存器传输级别/语言)设置中,您还可以描述一种顺序机制,其中输出也取决于先前的输入。
要考虑固定输入,称为Boolean Constraint Propagation。这可以从根本上简化您的电路,因为可以移除所有具有预定输出的元件。示例:具有一个或多个错误输入的AND
的输出为 false 。具有一个或多个 true 输入的OR
具有一个 true 输出,依此类推。其他简化方法包括消除双重求反和对XOR/XNOR
门的反向输入对。
您可以看看bc2cnf,这是一个从布尔网表格式转换为SAT求解器可消化的DIMACS/CNF文件的转换器。与ABC类似,bc2cnf将传播恒定的输入并提供相当优化的CNF。