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 を使用できるケースをキャッチすることさえできないことがわかります)。