基本的なデータ構造

回路構造を表すクラス

回路全体は TpgNetwork で表す. 予め対象となる故障の種類を指定する必要がある.

縮退故障を対象として blif ファイルを読み込む場合には 以下のようなコードを用いる.

network = TpgNetwork::read_blif(filename, FaultType::StuckAt)

もとの blif ファイルが D-FF を含む( .latch 文を含む)場合にも D-FF の出力を擬似入力,D-FF の入力を擬似出力とみなした回路となる.

遷移故障を対象として .bench ( iscas89 )ファイルを読み込む場合には 以下のようなコードを用いる.

network = TpgNetwork::read_iscas89(filename, FaultType::TransitionDelay)

blif ファイルの .names 文および .bench ファイルのゲートは TpgGate に対応する. 論理的には TpgNetworkTpgGate を節点とした有向グラフで表される. 縮退故障および遷移故障は TpgGate の入力および出力に対して 設定される.

ただし,テスト生成や故障シミュレーションを効率よく行うためには 各々の節点が単純な論理ゲートであることが望ましい. そこで, BUF, NOT, AND, NAND, OR, NOR, XOR, XNOR の機能を持つ TpgNode を用意する. もしも TpgGate の実現している機能が複雑な論理式で表されている 場合には複数の TpgNode に分解する. そこで,実際には TpgNetworkTpgNode の有向グラフとして 表されている. 故障の定義は TpgGate を対象に行われる.

互いに連結したファンアウト数が1の TpgNode で構成される 部分グラフを「ファンアウトフリー領域(Fanout Free Region: FFR)」 と呼ぶ. FFR は TpgFFR で表される.

ある節点 u と v に対して,節点 u から外部出力へ至るいかなる経路も節点 v を含む時,v は u の支配節点(dominator)であると言う. 節点 v を支配節点とするような節点 u の集合から誘導される部分グラフを 節点 v を根とした「ファンアウトフリーコーン(Fanout Free Cone: FFC)」 と呼ぶ,ファンアウトフリーコーンのなかで極大なものを 「極大ファンアウトフリーコーン(Maximal Fanout Free Cone: MFFC)」 と呼ぶ. 明らかに MFFC の根の節点は自分自身以外に支配節点を持たない. MFFC は TpgMFFC で表される. MFFC は1つもしくは複数の FFR から構成される.

TpgNetworkTpgNode はすべて TpgBase の派生クラスとなっている. TpgBase は内部で NetworkRep というクラスへの共有ポインタを持ってい る. この NetworkRep が実際の回路構造を持っており, すべての NetworkRep への参照がなくなった時にそのオブジェクトは破棄さ れる仕組みになっている. これはネットワーク本体のオブジェクトが破棄されたあとで内部のノードに対 するポインタが参照されるバグを予防するためのものである.

そのため TpgNodeTpgFault はコピーや代入も実際には 内部の NetworkRep の共有ポインタをコピーするだけの 簡単な操作で実現できる.

そのため TpgNode のリストを表すためには std::vector<TpgNode> で実装することも可能で問題なく動作するが, 例えば回路全体のノードのリストを取得しようと思った場合, ノードごとに共有ポインタのコピーが発生するのはあまり効率的ではない. そこで TpgNodeList では NetworkRep の共有ポインタを1つだけ持ち, 残りはノード番号のリストを保持することで意味的には std::vector<TpgNode> と同等の操作を行えるようにしている. TpgXXXList はすべて同様の実装方法で作られている.

故障を表すクラス

druid では縮退故障と遷移故障をあつかう. ゲート遷移故障も対応可能となっている. 故障の種類は FaultType で表す. 縮退故障および遷移故障の場合は故障箇所 と故障値を定める必要がある.

故障箇所は TpgGate の出力もしくは入力 である.出力の場合,「ステム(Stem)」の故障, 入力の場合,「ブランチ(Branch)」の故障となる. ブランチの故障の場合には TpgGate だけではなく 入力番号も必要となる.

縮退故障の故障値は 0 か 1 なのでそれぞれ Fval2::zero および Fval2::one で表す. 遷移故障も同様に表すが,立ち上がり遅延と 立ち下がり遅延を 0 と 1 で区別するのは わかりにくいため関数 is_rise_transition() および is_fall_transition() を用意している.

値の割り当てを表すクラス

テストパタンや部分的な値の割り当てを表すために いくつかのデータ構造を用意している.

まず,単独の TpgNode (の出力)に対する値割り当てを表すクラスとして Assign を用いる. 単純には TpgNode と値(0 か 1)の組だが, 遷移故障を扱う場合には前の時刻の値と現在の時刻の値の2種類が あるので TpgNode ,時刻(0 か 1),値(0 か 1) の3つ組 で表される. AssignListAssign のリストである.

ワード(現代のアーキテクチャでは64ビット)内に ビットを詰め込むために PackedVal という型を定義している. これは c++ の標準ライブラリの std::uint64_t の別名である. PackedVal を2つ使って3値のベクタを表すクラスが PackedVal3 である. 通常の整数型と同様のビットワイズ論理演算をサポートしている.

PackedVal3 を複数用いてテストベクタ全体を表すクラスが BitVector である. ただし,関数のシグネチャで型を区別するために InputVectorDffVectorTestVector という異なった継承クラスを定義している. 中身は全て同じである.