これらの失敗の理由は何ですか? 私は3つの主なものに名前を付けます:
1. STGへの情熱。 はい、これは美しくて面白いモデルです。マーカーなどで遊ぶのはとても面白いです。 しかし、考えてみてください。回路信号を切り替えるプロセスは、プログラムを実行するプロセスと同じです。 プログラムを説明するためにペトリネットを使用していますか? 回路で発生するプロセスを説明するときに、なぜ必要なのですか? その結果、Petrifyの開発者は、ペトリネットの特性の研究に多大な労力を費やしました。 しかし、スキームの統合の実際の問題はまだ解決されていません。
2.「コンピューティング」に重点を置いています。 これにより、回路の合成には論理関数を計算する必要があるという確信があります。 その結果、合成の問題を解決する代わりに、そのような計算を減らす可能性のみが調査されました。
3.問題の原因を理解できない。 しかし、それについては以下をご覧ください。
Petrifyに何か良いことはありますか? はい、あります! これは分解です。 実際、これは自然で基本的で最も美しい方法です。 速度に依存しない場合、通常、最小2入力要素への分解が通常不可能な理由を理解することだけが重要です。 そして、この理由は複数の信号です。 これにより、サイクルごとに2回以上切り替わる信号、または2つ以上の代替分岐で切り替わる信号を意味します。 Petrifyの作成者はこの事実を確立していません。これは、信号を追加するための「貪欲な」アルゴリズムによって証明されています。 この場合、追加の信号の数は、そのような信号の切り替えの数の増加により減少します。 はい、これにより計算量は減ります(以下に示すように、これはまったく必要ありません)が、分解のための追加の問題が発生します。
私の言いたいことの例を示しましょう。 次の制限のある動作を検討してください。
1.選択の余地はありません。
2.並列性はありません。
3.入力信号なし。
4.交互の動作、「+」、「-」、「-」-「+」の順に続きます。
5.すべての信号は厳密に2回切り替えられます。
上記の制限が維持されていても、CSCの矛盾を排除しても、誰にとっても問題を引き起こすことはありません。 ここで、トリガーの形式で各信号を表します。
だった:
になりました:
その後、各信号の一般的な形式の方程式は次のようになります。
この方程式の信号の動作は次のようになります。
そのような方程式を計算する必要はありません。 グラフ上でx-からピックアップa、b、c、d(反時計回り)のチェーンを見つけ、x +を飛び越える必要があります。 CSCプロパティはこれを提供します。
この方程式を分解してみましょう。
動作は次のようになります。

このように、2つの入力要素で速度に依存しないコンポーネントを合成できます。 トリガーの形での各信号の表示は面倒に見えますが、すべての信号とはほど遠いようです。 結果として生じるシーケンス違反は、非常に簡単に解決されます。これについては、以下に示します。
したがって、上記の5つの制限を満たす任意の動作に対して、2つの入力要素を持つ回路を合成できます。 これらの制限を徐々に削除し始めます。
制限4-代替の要件を削除します。 結果の最終回路では、すべての2入力要素に2種類の動作があります。

制限4の廃止により、問題が1つだけ発生する可能性があります。信号aと信号bの切り替え方向の不一致です。 これは、インバーターを導入することで修正されます(信号c)。 繰り返しますが、速度に依存しないという違反はありません。

これに関して、回路の合成プロセスの最後にサインを配置することができます(追加のインバーターの数を最小限にするため)。
制限3を削除し、入力信号を導入します。 追加の信号を切り替えて入力信号を切り替えるのは悪い習慣なので、これを禁止します。 これに関連して、問題が発生する可能性があり、その兆候は、入力信号を切り替えるときの状況であり、入力信号を切り替える理由です。 合計で、問題のある動作の3つのクラスが区別されます。
1年生。 簡略化された形式では、これは入力信号を連続して2回切り替えています。
この場合、入力の前に追加のイベントを挿入する必要があります。 そうしないと、スキームをまったく構築できません。 これは最も穏やかな方法で行われます。 次のように修正されます。
この場合:
信号a、b、cは、擬似入力、つまり それらの前に追加イベントを挿入することは禁止されています。 次に、上記のように動作を操作できますが、信号nは一般的に考慮から推測できます。
グレード2-2つの入力信号の切り替え順序に応じた選択:

ここでは、選択範囲の使用に関する制限がまだ削除されていないため、先に進みます。 修正の意味は、2つの擬似入力信号のどちらが切り替わるか(hまたはg)に応じて、簡単な選択で動作を取得することです。

信号e、j、i、h、f、k、gは、疑似入力として宣言されます。 信号a、bは考慮から除外できます。 上部分岐のより複雑な修正は、a-とb-の切り替え順序によるものです。 上のブランチでそれらを交換すると、ソリューションは下のブランチと同じになります。
Grade 3-レベルによる選択。 選択は、この時点で確立された入力信号bの値に応じて、入力信号a +の切り替え時に行われます。

修正目標は、前のケースと同じです。

信号g、h、f、jは擬似入力として宣言されます。 信号a、b、gはこれ以上考慮することはできません。 選択は、イベントh +およびj +によって決定されます。 あなたがここで見ることができるように、独立したエイズの違反さえありません。
次に、制限5を削除し、複数の信号を導入します。
複数の信号xを中和するために、追加の信号を導入します。
信号x、b、gは擬似入力として宣言されます。 信号xはこれ以上考慮されない場合があります。
制限2をキャンセルし、並列処理を導入します。 次の問題は並行性に関連しています。
1.並列分岐の同期を確保する必要があります。

信号f、gは擬似入力として宣言されます。
2. a-およびb +イベントが並行している場合、a +イベントはb-イベントの原因にはなりません。

上記の問題に加えて、並行性は分解を防ぎません。
最後に、制限1をキャンセルし、選択を導入します。
便宜上、並列性のない動作を検討します。 また、2つの入力信号のいずれかの切り替えに応じて選択が行われます。 有向グラフの形で動作を示します。ここで、頂点は選択ポイントであり、アークは信号の連続的な切り替えです。 各頂点には、正確に2つの出口円弧があります。

合成方法は、選択なしでいくつかの個別の動作が得られるまで、選択で初期動作を連続的に断片化することから成ります。
概念:アークNから到達可能なアークのセットを定義します。これらはすべて、アークNからすべての可能なパスが通過するアークです。さらに、アークNが出る選択ポイントは、各パスの最後です。
たとえば、アーク4の場合、到達可能なアークのセットは{4、5、6、1、2}です。 アーク3の場合-{3、1、2}。 合成アルゴリズムは次のとおりです。 各選択ポイントについて、両方の出力アークについて、到達可能なアークのセットを探します。
1.到達可能なアークのセットが交差しない選択ポイントがある場合。 この時点で、動作を個別の部分に分割できます。 これを行うには、両方の部分で切り替わる信号を分離します。

信号x、c、dが擬似入力になりました。 信号xはこれ以上考慮されません。 現在、両方の部分に共通の信号はありません。 部品間の相互作用は、入力信号と擬似入力信号を使用して実行されます。 そのような各部分は、個別の動作と見なすことができます。 同時に、初期動作と比較した選択ポイントの数は少なくとも1減少しました。
2.すべての選択ポイントについて、到達可能なアークのセットが交差するが、これらのセットが一致しない選択ポイントが存在する場合。 この時点で、動作は2つの部分に分割できますが、より複雑な方法です。

分離は、出力アーク4および3を使用して選択ポイントに沿って行われます。それ以外はすべて同じです。共通信号の分離と、選択ポイントの少ない2つの独立した動作への分離
3.すべての選択ポイントについて、到達可能なアークのセットが一致する場合。 任意のアークを取得し、奇数回スイッチするすべての信号を分離します。

信号x、y、c、dは擬似入力になりました。 その後、複数の信号を分離します。 そのアークでのみ(2回)切り替わる信号のみが、選択したアークに残ります。 このようなアークは、本格的な周期的な動作と見なすことができます。 このアークは初期動作から削除されるため、選択ポイントの数は1減少します。
したがって、選択肢のある動作は、選択肢のない動作に徐々に断片化されます。
上記の方法は人工的なものではなく、発明されたものです。 2入力要素上の回路の合成は極端に思えますが、実際には、可能なソリューションのスペースを制限するという意味で単純です。 たとえば、分解のために複数の信号を分離する必要はなく、選択によって動作を分割する必要もありません。 断熱材は単独で必要です。 それなしでは、複数の信号を2入力回路に統合することは不可能です。 そして、分離が必要な場合、選択によって行動の分解と断片化を拒否することはまったく無意味です。
説明されている問題はすべて、任意の要素ベースでの合成に固有のものです。 通常、これらの問題の解決策のみがランダムであり、明示的ではありません。 そして、これの結果として、それらは冗長です。 たとえば、ソリューションをPetrifyベンチマークと比較しました。 私の決定は1.5倍少ないです。 これは、Petrifyが非標準エレメント(Cエレメント)の使用、2レベルロジックを持つエレメントの使用、エレメント入力数の制限がはるかに少ない、入力インバーター使用時の遅延の制限などの自由を認めているという事実にもかかわらずです。