分析
命令がすべての可能な3値関数をエンコードしていることに注意してください。したがって、3つのブール変数とそれらに対するビット単位の演算があれば、常にエンコーディングバイトを見つけることができます。たとえば、関数が与えられた場合
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項関数を指定すると、2項関数を3項関数に変換するだけで済みます。これは、関数の任意の組み合わせを計算できることがわかっているためです。単項ノードとバイナリノードの抽象構文ツリーから始めて、上記の「エンコード」と同様の方法で単項関数とバイナリ関数を表すことから始めます。
だから、私たちの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)