分析
注意,该指令对所有可能的三元函数进行了编码。因此,给定任何三个布尔变量和对其进行任何按位运算,我们总能找到编码字节。例如,如果给定函数
则可以为每种输入值组合找到真值,并存储在表格中 例如,如果
则
从真值表可以看出。
f:Bool×Bool×Bool→Bool,
f(a,b,c)=a&(!b|c),
f(a,b,c)=TERN101100002(a,b,c),
a b c | f
------+--
0 0 0 | 0
0 0 1 | 0
0 1 0 | 0
0 1 1 | 0
1 0 0 | 1
1 0 1 | 1
1 1 0 | 0
1 1 1 | 1
由于只有8个输入要编码,而只有2个二进制结果,因此可以将其编码为8位数字,在这种情况下为0b10110000 = 0xB0。
最佳化
给定布尔值的任意n元函数,我们要做的就是将二进制函数转换为三进制函数。我们可以这样做,因为我们知道我们可以计算函数的任意组合。从一元和二进制节点的抽象语法树开始,我们将以与上述“编码”类似的方式表示一元和二进制函数开始。
因此,对于我们的f:
f = AND(a, OR(NOT(b), c)) = BIN[1000](a, BIN[1110](UNARY[10](b), c))
使用递归逻辑,我们可以将BIN和UNARY合并为:
f = AND(a, OR(NOT(b), c)) = BIN[1000](a, BIN[1011](b, c))
然后可以对其进行优化(转换规则很容易遵循布尔逻辑):
f = AND(a, OR(NOT(b), c)) = TERN[10110000](a, b, c)
观察
这与计算FPGA查找表(LUT)的方式非常相似。我很确定您可以找到许多将逻辑映射到LUT的文本和算法。例如:流程图(http://cadlab.cs.ucla.edu/~cong/papers/tcad94.pdf)