真理値表を三元論理関数にマップする方法は?


8

親切にしてください。電気工学でかなりよく知られているかもしれない工学の別の分野からの厄介で重要な質問があります。StackOverflowで同様の質問をしました


5つの入力と1つの出力の真理値表があるとします。Espressoアルゴリズム(たとえば、Logic Friday)を使用してテーブルを最小化し、効率的なVHDLをいくつか記述しました。すべてが正常に動作します。

真理値表を最小化してNANDゲートにマッピングする代わりに、任意の3値論理関数にマッピングしたいと思います。多値ロジックではなく、3つの入力変数を持つ論理関数に興味があります。これらの機能は256個あり、3インチNANDはその1つにすぎません。これらの256の関数のすべてが興味深いとは限りません。一部は2つの入力変数の兄弟に削減されます。

質問:これらの3入力関数のいずれかに真理値表(たとえば、7つの入力)をどのようにマッピングできますか。同様のことを行うツールはすばらしいですが、任意の3値関数に単純化する方法が最善です。


背景:最近のCPUは512ビットレジスタで任意の3値論理演算(たとえば、命令vpternlog)を実行できますが、複雑さのため、コンパイラはそれをプログラマに任せます。


任意のバイナリ関数に「マップ」する正式な方法さえありません。また、すべてのバイナリ関数が完全な機能システムを構成しているわけではありません。三元についても同じことが言えます。
Eugene Sh。

1
これは、バイナリ関数にとってNPハードであると思います。
user110971 2017

@ user110971そうは思いません。SATの問題と混同していると思います。
Eugene Sh。

1
@EugeneSh。問題は、ブール値の最小化(NP困難)に減少すると思います。それ以外の場合は、SAT問題を解決できるためです。少なくともこれはOPが求めていることだと思います。
user110971 2017

2
@ user110971標準アルゴリズムは、(私の知ること)(任意の三元論理機能を低下させない質問)。それらは3インチNANDと3インチANDに単純化されますが、はるかにコンパクトな削減を可能にする他のすべての3インチ論理関数ではありません。
HJLebbink 2017

回答:


4

分析

命令がすべての可能な3値関数をエンコードしていることに注意してください。したがって、3つのブール変数とそれらに対するビット単位の演算があれば、常にエンコーディングバイトを見つけることができます。たとえば、関数が与えられた場合

fブール×ブール×ブールブール
次に、入力値の組み合わせごとに真理値を見つけ、テーブルに格納できます。たとえば、
fabc=ab|c
その後
fabc=TERN101100002abc
真理値表からわかるように。
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


1
あなたは「変換ルールはブール論理から容易に続く」と言うので、私はそれを行うために用語書き換えシステム(TRS)を構築しようとしました。<br/>(最も複雑なソートの)最初の4項BF BF [100010110、 4]真理値表があります:<br/> 0000 => 1 <br/> 0010 => 1 <br/> 0100 => 1 <br/> 1000 => 1 <br/> A'B'C'D + A'B'CD '+ A'BC'D' + AB'C'D '= BF [0xd1,3](A、BF [0x16,3](D、C、B)、BF [0x02,3] (C、B、A))これは、ブルートフォース検索で見つけることができる最小の削減です。<br/> 私の質問:これをどのように(非効率的に)書き直しますか、ブール論理からの変換規則がどのように見えるのかわかりませんここでどんな助けでも。
HJLebbink

1
そして、読んだ6分後にこれをあなたも、非常に機能していない<BR/>削除することはできません
HJLebbinkを

1
書き直す必要はありません。真理値の各組み合わせに対してブルートフォース評価を実行するだけです。
PAL-クリスチャンEngstad

@engstad:ああ、あなたの発言がようやく理解できました:BF [i、K](a_0、...、a_K)= BF [0xCA、3](a_0、BF [upperhalf(i)、K-1 ](a_1、...、a_K)、BF [lowerhalf(i)、K-1](a_1、...、a_K))
HJLebbink 2017

2

私自身の答えからの抜粋。

  1. 真理値表を論理式に変換します。たとえば、ロジックフライデーを使用します。
  2. 論理式をSynopsys方程式形式(.eqn)で保存します。

BF_Q6.eqnの内容:

INORDER = A B C D E F; 
OUTORDER = F0 F1;
F0 = (!A*!B*!C*!D*!E*F) + (!A*!B*!C*!D*E*!F) + (!A*!B*!C*D*!E*!F) + (!A*!B*C*!D*!E*!F) + (!A*B*!C*!D*!E*!F) + (A*!B*!C*!D*!E*!F);
F1 = (!A*!B*!C*!D*E) + (!A*!B*!C*D*!E) + (!A*!B*C*!D*!E) + (!A*B*!C*!D*!E) + (A*!B*!C*!D*!E);
  1. Berkeley Verification and Synthesis Research Centerの「ABC:A System for Sequential Synthesis and Verification」を使用してください。

ABCで私は実行します:

abc 01> read_eqn BF_Q6.eqn
abc 02> choice; if -K 3; ps
abc 03> lutpack -N 3 -S 3; ps
abc 04> show
abc 05> write_bench BF_Q6.bench

実行する必要があるかもしれません choice; if -K 3; psより良い結果を得るには、複数回ます。

結果のBF_Q6.benchには、FPGAの3-LUTが含まれています。

INPUT(A)
INPUT(B)
INPUT(C)
INPUT(D)
INPUT(E)
INPUT(F)
OUTPUT(F0)
OUTPUT(F1)
n11         = LUT 0x01 ( B, C, D )
n12         = LUT 0x1 ( A, E )
n14         = LUT 0x9 ( A, E )
n16         = LUT 0xe9 ( B, C, D )
n18         = LUT 0x2 ( n11, n14 )
F1          = LUT 0xae ( n18, n12, n16 )
n21         = LUT 0xd9 ( F, n11, n14 )
n22         = LUT 0xd9 ( F, n12, n16 )
F0          = LUT 0x95 ( F, n21, n22 )

これは、私が探していたC ++に(機械的に)書き換えることができます。


1
ABCの素敵な使い方!
PAL-クリスチャンEngstad
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.