我正在使用Espresso 逻辑最小化器来生成一组布尔方程的最小化形式。然而,我希望在标准微处理器上实现这些,而不是为可编程阵列逻辑(这是 Espresso 通常用于)生成逻辑。问题是 Espresso 以合取范式产生输出,这对于 PAL 来说是完美的,但对于 x86 或 PPC 来说不是最佳的。
例如,Espresso 完全忽略 XOR - 在下面的 Espresso 输出中,子表达式(!B0&!B1&B2&!B3) | (!B0&!B1&!B2&B3)
等价于(!B0&!B1&(B2^B3))
. 这种替换确实增加了表达式的门深度/关键路径,但考虑到我正在查看具有足够数量的术语以完全饱和周围任何 CPU 的执行资源的表达式,折衷一些门深度来减少似乎是合理的指令总数。我还想扩展它以了解如何使用我感兴趣的某些处理器上可用的 ANDC 或 NOR 等指令。
我正在查看的 CNF 表达式示例:
O0 = (B0&!B1&!B2&B3) | (!B0&B1&B2&B3) | (!B0&!B1&B2&B3) | (B1&!B3) | (!B0 &!B2&!B3);
O1 = (B0&B1&!B2&B3) | (B0&!B1&B2&!B3) | (B0&B1&B2&!B3) | (!B0&!B1&B2&!B3) | (!B0&!B1&!B2&B3) | (!B0&!B1&B2&B3) | (!B0&!B2&!B3);
O2 = (B0&!B1&!B2&B3) | (B0&!B1&B2&!B3) | (B0&B1&B2&B3) | (!B0&B1&!B3) | (!B0&!B2&B3) | (!B0&!B1&B2&B3);
O3 = (!B0&B1&!B2&!B3) | (B0&B1&B2&B3) | (!B0&B1&B2&B3) | (B0&B1&B2&!B3) | (B0&!B1&!B2) | (!B0&!B1&B2&!B3) | (!B0&!B1&!B2&B3);
因此,要使这成为一个实际问题;按优先顺序:
你知道 Espresso 的选项或扩展会产生我想要的那种表达吗?
您是否知道任何理解(或可以教授)各种门类型的布尔逻辑最小化工具,而不仅仅是为 PAL 生成 CNF?
您是否知道将上述 CNF 表达式转换为使用其他类型门的表达式的算法?
如果您不知道它的算法,您是否知道或可以想到任何有用的启发式方法?
(而且,以防万一你要建议它 - 测试表明 GCC 和 ICC(或者,我敢打赌,现有的任何其他 C 编译器)还不够聪明,无法从 CNF 表达式中为我执行特定于处理器的最小化- 这真的很好,但是检查 -O3 -S 的输出表明他们甚至无法捕捉到可以使用 XOR 的情况)。