(57)【要約】  半導体試験システムのための試験プログラムを開発するための方法が開示される。本方法は、試験プログラム言語（ＴＰＬ）において試験計画ファイルを記述することであって、試験計画ファイルは試験プログラムの少なくとも１つの試験を記述する、記述すること、システムプログラム言語（ＳＰＬ）において試験クラスファイルを記述し、ＴＰＬにおいて試験クラスファイルの対応するプリヘッダファイルを記述することであって、試験クラスファイルは試験プログラムの少なくとも１つの試験のインプリメンテーションを記述する、記述すること、及び、試験計画ファイル、試験クラスファイル及びプリヘッダファイルを用いて試験プログラムを生成することを含む。
2007528993.tif 000002
【特許請求の範囲】
【請求項１】
半導体試験システムのための試験プログラムを開発するための方法であって、該試験システムは、該試験プログラムに従って被試験デバイスに少なくとも１つの試験を適用するための少なくとも１つの試験モジュールを含み、該方法は、
試験プログラム言語（ＴＰＬ）において試験計画ファイルを記述することであって、該試験計画ファイルは前記試験プログラムの少なくとも１つの試験を記述する、記述すること、
システムプログラム言語（ＳＰＬ）において試験クラスファイルを記述し、前記ＴＰＬにおいて該試験クラスファイルの対応するプリヘッダファイルを記述することであって、該試験クラスファイルは前記試験プログラムの前記少なくとも１つの試験のインプリメンテーションを記述する、記述すること、及び
前記試験計画ファイル、前記試験クラスファイル及び前記プリヘッダファイルを用いて前記試験プログラムを生成すること
を含む、半導体試験システムのための試験プログラムを開発するための方法。
【請求項２】
前記システムプログラム言語はＣ／Ｃ＋＋である、請求項１に記載の方法。
【請求項３】
前記試験プログラムを生成することは、
ＴＰＬコンパイラによって前記試験計画ファイルをコンパイルすることであって、それによって、前記ＳＰＬにおいて記述される導出試験計画ファイルを構成する、前記試験計画ファイルをコンパイルすること、及び
前記ＴＰＬコンパイラによって前記プリヘッダファイルをコンパイルすることであって、それによって、前記ＳＰＬにおいて記述されるヘッダファイルを構成する、前記プリヘッダファイルをコンパイルすること
を含む、請求項１に記載の方法。
【請求項４】
前記試験計画ファイルをコンパイルすることは、
前記試験計画ファイルを前記ＴＰＬから前記ＳＰＬに翻訳すること、及び
前記プリヘッダファイルを用いて前記試験計画ファイルの妥当性を検査すること
を含む、請求項３に記載の方法。
【請求項５】
前記プリヘッダファイルをコンパイルすることは、
前記ヘッダファイル内に、前記プリヘッダファイルのパラメータセクションにおいて記述されるパラメータを挿入すること、及び
前記ヘッダファイル内に、前記プリヘッダファイルのテンプレートセクションにおいて参照されるソースコードを挿入すること
を含む、請求項３に記載の方法。
【請求項６】
ＳＰＬコンパイラによって前記導出試験計画ファイルをコンパイルすることであって、それによって、試験計画オブジェクトファイルを構成し、該試験計画オブジェクトファイルは前記ヘッダファイルを参照する、前記導出試験計画ファイルをコンパイルすること、及び
前記ＳＰＬコンパイラによって前記試験クラスファイルをコンパイルすることであって、それによって、試験クラスオブジェクトファイルを構成し、前記ＳＰＬコンパイラは前記ヘッダファイルを用いて、前記試験クラスオブジェクトファイルを構成する、前記試験クラスファイルをコンパイルすること
をさらに含む、請求項３に記載の方法。
【請求項７】
前記試験計画オブジェクトファイル及び前記試験クラスオブジェクトファイルをリンクすることであって、それによって、前記試験プログラムを構成する、リンクすることをさらに含み、該試験プログラムは前記半導体試験システムによって実行可能である、請求項６に記載の方法。
【請求項８】
半導体試験システムのための試験プログラムを生成するためのプリヘッダであって、
前記試験プログラムの少なくとも１つの属性を指定するためのパラメータセクションと、
前記試験プログラムのヘッダファイル内にソースコードを挿入するためのテンプレートセクションと
を含む、半導体試験システムのための試験プログラムを生成するためのプリヘッダ。
【請求項９】
前記試験プログラムの前記少なくとも１つの属性は１つのパターンリスト及び１つの試験条件に関連する、請求項８に記載のプリヘッダ。
【請求項１０】
前記パターンリストは、
基数、
トレースレベル、
メンバ名、
セット関数、及び
パラメータ記述
のうちの少なくとも１つのパラメータを含む、請求項９に記載のプリヘッダ。
【請求項１１】
前記試験条件は、
基数、
トレースレベル、
メンバ名、
セット関数、及び
パラメータ記述
のうちの少なくとも１つのパラメータを含む、請求項９に記載のプリヘッダ。
【請求項１２】
前記テンプレートセクションは、
クラス名、
インポート宣言、
パラメータアレイタイプ、
パラメータ属性、
パラメータ関数、及び
パラメータ関数インプリメンテーション
を含む、請求項８に記載のプリヘッダ。
【請求項１３】
ヘッダファイルを生成するために試験プログラム言語（ＴＰＬ）コンパイラによって用いられ、前記ヘッダファイルはシステムプログラム言語（ＳＰＬ）において記述される、請求項８に記載のプリヘッダ。
【請求項１４】
前記ヘッダファイルは、試験クラスオブジェクトファイルを生成するために、ＳＰＬコンパイラによって用いられ、前記ヘッダファイルは、試験計画オブジェクトファイルを生成するために前記ＳＰＬコンパイラによって参照される、請求項１３に記載のプリヘッダ。
【請求項１５】
前記試験プログラムにおいてユーザ定義の試験をサポートするために用いられる、請求項８に記載のプリヘッダ。
【請求項１６】
半導体試験システムのための試験プログラムの妥当性を検査するための方法であって、該試験システムは、該試験プログラムに従って被試験デバイスに少なくとも１つの試験を適用するための少なくとも１つの試験モジュールを含み、該方法は、
試験プログラム言語（ＴＰＬ）において試験計画ファイルを記述することであって、該試験計画ファイルは前記試験プログラムの少なくとも１つの試験を記述する、記述すること、
前記ＴＰＬにおいてプリヘッダファイルを記述すること、及び
前記プリヘッダファイルを用いて前記試験計画ファイルの妥当性を検査すること
を含む、半導体試験システムのための試験プログラムの妥当性を検査するための方法。
【請求項１７】
前記プリヘッダファイルは、
前記試験プログラムの少なくとも１つの属性を指定するためのパラメータセクションと、
前記試験プログラムのヘッダファイル内にソースコードを挿入するためのテンプレートセクションとを含む、請求項１６に記載の方法。
【請求項１８】
前記試験プログラムの前記少なくとも１つの属性はパターンリスト及び試験条件に関連する、請求項１７に記載のプリヘッダ。
【請求項１９】
前記試験計画ファイルの妥当性を検査することは、前記試験計画ファイルの意味を検査することを含む、請求項１６に記載の方法。
【請求項２０】
前記試験計画ファイルの妥当性を検査することは、前記試験計画ファイルの試験エンティティ属性を検査することをさらに含む、請求項１６に記載の方法。
【請求項２１】
前記試験計画ファイルの妥当性を検査することは、前記試験計画の関数コール及びその対応するパラメータを検査することをさらに含む、請求項１６に記載の方法。
【請求項２２】
半導体試験システムであって、
被試験デバイスに少なくとも１つの試験を適用するための少なくとも１つの試験モジュールと、
試験計画ファイル、試験クラスファイル及び該試験クラスファイルの対応するプリヘッダファイルとを受信するためのコントローラであって、該試験計画ファイルは試験プログラム言語（ＴＰＬ）において前記少なくとも１つの試験を記述し、前記試験クラスファイルはシステムプログラム言語（ＳＰＬ）において前記少なくとも１つの試験のインプリメンテーションを記述する、コントローラと、
前記試験計画ファイル及び前記プリヘッダファイルをコンパイルする手段であって、それによって、それぞれ導出試験計画ファイル及びヘッダファイルを構成する、前記試験計画ファイル及び前記プリヘッダファイルをコンパイルする手段と、
前記試験クラスファイル、前記導出試験計画ファイル及び前記ヘッダファイルを用いて試験プログラムを生成する手段と
を備える、半導体試験システム。
【請求項２３】
前記プリヘッダファイルは、
前記試験プログラムの少なくとも１つの属性を指定するためのパラメータセクションと、
前記試験プログラムの前記ヘッダファイル内にソースコードを挿入するためのテンプレートセクションと
を含む、請求項２２に記載の半導体試験システム。
【請求項２４】
前記試験プログラムの前記少なくとも１つの属性は１つのパターンリスト及び１つの試験条件に関連する、請求項２３に記載の半導体試験システム。
【請求項２５】
前記パターンリストは、
基数、
トレースレベル、
メンバ名、
セット関数、及び
パラメータ記述
のうちの少なくとも１つのパラメータを含む、請求項２４に記載の半導体試験システム。
【請求項２６】
前記試験条件は、
基数、
トレースレベル、
メンバ名、
セット関数、及び
パラメータ記述
のうちの少なくとも１つのパラメータを含む、請求項２４に記載の半導体試験システム。
【請求項２７】
前記テンプレートセクションは、
クラス名、
インポート宣言、
パラメータアレイタイプ、
パラメータ属性、
パラメータ関数、及び
パラメータ関数インプリメンテーション
を含む、請求項２３に記載の半導体試験システム。
【請求項２８】
前記システムプログラム言語はＣ／Ｃ＋＋である、請求項２２に記載の半導体試験システム。
【請求項２９】
前記システム計画ファイルをコンパイルする手段は、
前記試験計画ファイルを前記ＴＰＬから前記ＳＰＬに翻訳する手段と、
前記プリヘッダファイルを用いて前記試験計画の妥当性を検査する手段と
を備える、請求項２２に記載の半導体試験システム。
【請求項３０】
前記プリヘッダファイルをコンパイルする手段は、
前記ヘッダファイル内に、前記プリヘッダファイルのパラメータセクションにおいて記述されるパラメータを挿入する手段と、
前記ヘッダファイル内に、前記プリヘッダファイルのテンプレートセクションにおいて参照されるソースコードを挿入する手段と
を備える、請求項２２に記載の半導体試験システム。
【請求項３１】
前記試験プログラムを生成する手段は、
前記導出試験計画ファイルをコンパイルする手段であって、それによって、試験計画オブジェクトファイルを構成し、該試験計画オブジェクトファイルは前記ヘッダファイルを参照する、前記導出試験計画ファイルをコンパイルする手段と、
前記試験クラスファイルをコンパイルする手段であって、それによって、試験クラスオブジェクトファイルを構成し、前記ヘッダファイルを用いて、前記試験クラスオブジェクトファイルを構成する、前記試験クラスファイルをコンパイルする手段と
をさらに備える、請求項２２に記載の半導体試験システム。
【請求項３２】
前記試験計画オブジェクトファイル及び前記試験クラスオブジェクトファイルをリンクする手段であって、それによって、試験プログラムを構成する、リンクする手段をさらに備え、該試験プログラムは前記半導体試験システムによって実行可能である、請求項３１に記載の半導体試験システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本特許出願は、２００４年２月６日に出願の同時係属の米国特許出願第１０／７７２，４３４号「Method and Structure to Develop a Test Program for Semiconductor Integrated Circuits」の一部継続出願であり、同特許出願の恩典を主張し、同特許出願は、２００３年２月１４日に出願の米国特許出願第６０／４４７，８３９号「Method and Structure to Develop a Test Program for Semiconductor Integrated Circuits」の恩典を主張する。また本特許出願は、２００４年５月２２日に出願の米国仮特許出願第６０／５７３，５７７号「Software Development in an Open Architecture Test System」の恩典も主張する。それらの特許出願は全て、アドバンテスト社に譲渡され、その全体を参照することにより本明細書に援用される。
【０００２】
本発明は半導体検査のための自動試験装置の分野に関する。詳細には、本発明は、半導体試験システムのための試験プログラムを開発するための方法に関する。
【背景技術】
【０００３】
半導体試験システムは、多数のデバイスが同時に動作する複雑なシステム環境を有する。その試験システムは、複数のコントローラを含んでもよく、それらコントローラは複数のベンダモジュール及びその対応する被試験デバイス（ＤＵＴ）の動作を制御する。半導体試験システムのための試験プログラムは、複雑なシステム環境において動作することが要求される。そのような試験プログラムを開発する１つの方法は、Ｃ＋＋のようなシステムプログラム言語（ＳＰＬ）で直接試験コードを書くことである。しかしながら、この方法を用いる場合、試験技師は複雑な試験システム環境に煩わされる。詳細には、試験技師は多数の複雑なシステムプログラミング規則に従わなければならないと同時に、試験プログラムを開発するためにシステムプログラム言語の要件を満たさなければならない。
【０００４】
既存の方法が抱える別の問題は、ＳＰＬで試験プログラムがコンパイルされるまで、又はＤＵＴの試験中に試験プログラムが実行されるまで、試験プログラムのエラーを特定することができないことである。さらには、多くの場合に、複雑な試験システム環境において、試験計画のエラーを特定することは難しく、また時間を要する。そのような制限によって、ＤＵＴの製造が遅れる場合もあり、製品の発売が遅れて、市場での好機を失う可能性もある。
【発明の開示】
【発明が解決しようとする課題】
【０００５】
それゆえ、試験計画の開発時に、システムプログラミングを複雑にしないようにすることが必要とされている。詳細には、試験システムを複雑にする言語ではなく、試験技師が精通している問題領域に近い言語において試験計画を開発することが必要とされている。さらに、システムコンパイル前に試験計画内のエラーを特定することが必要とされている。試験計画のエラーを早期に検出する結果として、試験プログラム及び試験されるＤＵＴの開発時間の短縮することができる。
【課題を解決するための手段】
【０００６】
本特許出願は、オブジェクト指向構成体、たとえばC++オブジェクト及びクラスを用いる試験プログラム開発を記述する。詳細には、この方法は、本発明の譲受人に譲渡される米国特許出願第６０／４４９，６２２号、第１０／４０４，００２号及び第１０／４０３，８１７号に記載されるような、オープンアーキテクチャテスタのための試験プログラムを開発するのに適している。
【０００７】
本発明の一実施の形態は、汎用のオブジェクト指向、たとえばC/C++構成体において、試験システム資源、試験システム構成、モジュール構成、試験シーケンス、試験計画、試験条件、試験パターン及びタイミング情報を記述することによって、自動試験装置（ＡＴＥ）のような半導体検査システムにおいて、被試験デバイス、たとえばＩＣを試験するための試験プログラムを開発するための方法を提供する。これらの記述を含むファイルは、それらのファイルを使用する試験システム又は関連する装置がアクセスできるメモリ、すなわちコンピュータ読取り可能媒体に記憶される。
【０００８】
試験システム資源を記述することは、資源タイプを指定することであって、その資源タイプは、ＩＣに対して１つの試験を実施するための少なくとも１つの試験モジュールに関連付けられる、資源タイプを指定することと、その資源タイプに関連付けられるパラメータタイプを指定することと、及び、そのパラメータタイプのパラメータを指定することとを含んでもよい。
【０００９】
試験システム構成を記述することは、少なくとも１つの試験モジュールを制御するためのサイトコントローラを指定することであって、各試験モジュールはＩＣに対して１つの試験を実施する、サイトコントローラを指定することと、及び、モジュール接続イネーブラの入力ポートを指定することとを含んでもよい。その試験システムは、指定された入力ポートにおいて、サイトコントローラをモジュール接続イネーブラに接続し、モジュール接続イネーブラは、サイトコントローラを１つの試験モジュールに接続する。モジュール接続イネーブラはスイッチマトリクスとして実装してもよい。
【００１０】
モジュール構成を記述することは、モジュールタイプを指定するためのモジュール識別子を指定することと、モジュール識別子によって指定されるモジュールタイプの試験モジュールを制御するための実行可能コードを指定することと、及び、試験モジュールに関連付けられる資源タイプを指定することとを含んでもよい。実行可能コードは、ダイナミックリンクライブラリの形をとることができる。
【００１１】
モジュール構成を記述することはさらに、ユーザが、モジュール接続イネーブラの出力ポートを指定するためのスロット識別子を指定することを含んでもよく、試験システムは、その出力ポートにおいて、試験モジュールをモジュール接続イネーブラに接続し、モジュール接続イネーブラは試験モジュールを対応するサイトコントローラに接続する。またユーザは、試験モジュールの供給元を特定するためのベンダ識別子と、資源タイプに関連して利用することができる資源ユニットの最大数の識別子とを指定してもよい。資源タイプは、たとえばデジタルテスタピン及び資源ユニットテスタチャネルであってもよい。別法では、テスタチャネル資源ユニットはまた、たとえば、アナログテスタピン、ＲＦテスタピン、電源ピン、デジタイザピン及び任意波形発生ピンのような資源タイプに対応してもよい。どの資源ユニットが使用禁止にされるかに関する指標も与えることができる。使用禁止として指示された資源ユニットは、試験モジュールの欠陥のある資源ユニットを表し得る。
【００１２】
試験条件を記述することは、少なくとも１つの試験条件グループを指定することと、少なくとも１つの変数を含む仕様セットを指定することと、及び、変数に結び付けられるべき式を選択するためのセレクタを指定することとを含んでもよい。試験条件グループをその仕様セットのためのセレクタに関連付けることにより、試験条件が規定される。
【００１３】
試験シーケンスを記述することは、種々の試験を実施することができる順序（又はフロー）を指定することを含んでもよい。
【００１４】
試験パターンを記述することは、試験パターン、関連する電圧及び電流レベル、信号値の遷移、対応する立ち上がり及び立ち下がり時間、ならびに関連するタイミングを指定することを含んでもよい。
【００１５】
本発明の一実施の形態のパターンコンパイラは、少なくとも１つのモジュール特有のパターンコンパイラと、パターンソースファイルの対応するモジュール特有のセクション、及びそのパターンソースファイルの共通セクションの両方をコンパイルするように各モジュール特有のコンパイラに指示するためのオブジェクトファイルマネージャとを備える。共通セクションは、全てのモジュール特有のコンパイラがアクセス可能な情報を含む。そのコンパイラの出力は、少なくとも１つのモジュール特有のパターンデータセクションを含む。モジュール特有のパターンローダが、実行するために、対応するモジュール特有のパターンデータセクションからのモジュール特有のパターンデータを対応する試験モジュールにロードする。
【００１６】
試験プログラムを開発するための開示される方法は、その試験計画が扱うことを目的としている問題領域に近い言語において試験計画を記述することにより、システムプログラミングの複雑さを試験計画開発者から切り離す。また、その方法によれば、試験技師は試験プログラム開発の早期の段階において試験計画内のエラーを特定できるようになり、試験プログラム及び試験される対応するＤＵＴの開発時間を短縮することができる。
【００１７】
一実施の形態において、半導体試験システムのための試験プログラムを開発するための方法は、試験プログラム言語（ＴＰＬ）において試験計画ファイルを記述することであって、試験計画ファイルは試験プログラムの少なくとも１つの試験を記述する、記述すること、システムプログラム言語（ＳＰＬ）において試験クラスファイルを記述し、ＴＰＬにおいて試験クラスファイルの対応するプリヘッダファイルを記述することであって、試験クラスファイルは試験プログラムの少なくとも１つの試験のインプリメンテーションを記述する、記述すること、及び、試験計画ファイル、試験クラスファイル及びプリヘッダファイルを用いて試験プログラムを生成することを含む。
【００１８】
別の実施の形態において、半導体試験システムのための試験プログラムを生成するためのプリヘッダは、試験プログラムの少なくとも１つの属性を指定するためのパラメータセクションと、試験プログラムのヘッダファイル内にソースコードを挿入するためのテンプレートセクションとを含み、試験プログラムの少なくとも１つの属性は１つのパターンリスト及び１つの試験条件に関連する。
【００１９】
さらに別の実施の形態において、半導体試験システムのための試験プログラムの妥当性を検査するための方法は、試験プログラム言語（ＴＰＬ）において試験計画ファイルを記述することであって、試験計画ファイルは試験プログラムの少なくとも１つの試験を記述する、記述すること、ＴＰＬにおいてプリヘッダファイルを記述すること、及び、プリヘッダファイルを用いて試験計画ファイルの妥当性を検査することを含む。
【００２０】
さらに別の実施の形態において、半導体試験システムは、被試験デバイスに少なくとも１つの試験を適用するための少なくとも１つの試験モジュールと、試験計画ファイル、試験クラスファイル及び試験クラスファイルの対応するプリヘッダファイルとを受信するためのコントローラとを備え、試験計画ファイルは試験プログラム言語（ＴＰＬ）において少なくとも１つの試験を記述し、試験クラスファイルはシステムプログラム言語（ＳＰＬ）において少なくとも１つの試験のインプリメンテーションを記述する。半導体試験システムはさらに、試験計画ファイル及びプリヘッダファイルをコンパイルする手段であって、それによって、それぞれ導出試験計画ファイル及びヘッダファイルを構成する、試験計画ファイル及びプリヘッダファイルをコンパイルする手段と、試験クラスファイル、導出試験計画ファイル及びヘッダファイルを用いて試験プログラムを生成する手段とを備える。
【００２１】
本発明の上記の特徴及び利点、ならびに本発明のさらに別の特徴及び利点は、添付の図面とともに取り上げられるときに、本発明の実施形態の詳細な説明の結果として、以下においてさらに明確に理解されるであろう。
【発明を実施するための最良の形態】
【００２２】
半導体試験システムのための試験プログラムを開発するための方法及びシステムが提供される。以下の説明は、当業者の誰もが本発明を実施し、使用できるようにするために提示される。特定の実施形態及び応用形態の説明は、例としてのみ提供される。本明細書において説明される例の種々の変更及び組み合わせが当業者には容易に明らかになるはずであり、本発明の精神及び範囲から逸脱することなく、本明細書において規定される一般原理は、他の例及び応用形態にも適用することができる。したがって、本発明は説明及び図示される例に限定されることを意図するのではなく、本明細書に開示される原理及び特徴と合致する最も広い範囲を与えられるべきである。
【００２３】
本発明は包括的には、同じ譲受人による米国特許出願第６０／４４９，６２２号、第１０／４０４，００２号及び第１０／４０３，８１７号に開示されるようなオープンアーキテクチャ試験システムの観点から説明される。しかしながら、本発明の試験プログラム開発システム及び方法の実施形態が、オープンテスタアーキテクチャだけでなく、固定テスタアーキテクチャにも同様に当てはまることは当業者には認識されよう。
【００２４】
オープンアーキテクチャ試験システムに関する記述は、米国特許出願第１０／７７２，３７２号「Method and Apparatus for Testing Integrated Circuits」において見ることができ、その特許出願は、同じ譲受人による米国特許出願第６０／４４９，６２２号の恩典を主張する。
【００２５】
図１は、如何に信号が生成され、被試験デバイス（ＤＵＴ）に加えられるかを示す、従来のテスタの一般化されたアーキテクチャを示す。各ＤＵＴ入力ピンが、試験データを加えるドライバ２に接続され、一方、各ＤＵＴ出力ピンはコンパレータ４に接続される。大抵の場合に、トライステートドライバ−コンパレータが用いられ、各テスタピン（チャネル）が入力ピン、出力ピンのいずれかとして動作できるようにする。単一のＤＵＴのために専用に設けられるテスタピンは合わせて試験サイトを形成し、その試験サイトは、関連するタイミング発生器６、波形発生器８、パターンメモリ１０、タイミングデータメモリ１２、波形メモリデータ１４及びデータ速度を規定するブロック１６によって動作する。
【００２６】
図２は、本発明の一実施形態によるシステムアーキテクチャ１００を示す。システムコントローラ（ＳｙｓＣ）１０２が多数のサイトコントローラ（ＳｉｔｅＣ）１０４に接続される。システムコントローラは、ネットワークにも接続され、ファイルにアクセスすることができる。試験サイト１１０に配置される１つ又は複数の試験モジュール１０８を制御するために、各サイトコントローラは、モジュール接続イネーブラ１０６を通して、試験モジュール１０８に接続される。モジュール接続イネーブラ１０６は、接続されるハードウエアモジュール１０８の構成を変更できるようにするとともに、データ転送用（パターンデータのロード用、応答データの収集用、制御用等）のバスとしての役割も果たす。実現可能なハードウエアの実装形態は、専用接続、交換接続、バス接続、リング接続及びスター接続を含む。モジュール接続イネーブラ１０６は、たとえばスイッチマトリクスとして実装することができる。各試験サイト１１０は１つのＤＵＴ１１２に関連付けられ、ＤＵＴ１１２は、ロードボード１１４を通して、対応するサイトのモジュールに接続される。１つの実施形態では、単一のサイトコントローラを多数のＤＵＴサイトに接続することができる。
【００２７】
システムコントローラ１０２は、システム全体のマネージャとしての役割を果たす。システムコントローラ１０２は、サイトコントローラの動作状態を調整し、システムレベルの並列試験方法を管理し、さらに、ハンドラ／プローブを制御し、システムレベルのデータロギング及び誤り処理をサポートする。動作環境によっては、システムコントローラ１０２は、サイトコントローラ１０４の動作とは別のＣＰＵ上に配置することができる。別法では、システムコントローラ１０２及びサイトコントローラ１０４は、共通のＣＰＵを共有することができる。同様に、各サイトコントローラ１０４は、その専用のＣＰＵ（中央演算装置）上に配置することができるか、あるいは同じＣＰＵ内の別個のプロセス又はスレッドとして配置することができる。
【００２８】
個々のシステムコンポーネントを、集積されたモノリシックシステムの論理的なコンポーネントを見なすことができ、必ずしも１つの分散処理システムの物理的なコンポーネントではないことを前提とすると、図２に示されるシステムアーキテクチャは概念的には分散処理システムと考えることができる。
【００２９】
図３は、本発明の一実施形態によるソフトウエアアーキテクチャ２００を示す。ソフトウエアアーキテクチャ２００は分散オペレーティングシステムを表しており、関連するハードウエアシステム要素１０２、１０４、１０８に対応する、システムコントローラ２２０、少なくとも１つのサイトコントローラ２４０及び少なくとも１つのモジュール２６０のためのコンポーネントを有する。モジュール２６０に加えて、アーキテクチャ２００は、ソフトウエア内のモジュールエミュレーション２８０のための対応するコンポーネントを含む。
【００３０】
１つの例示的な選択として、このプラットフォームのための開発環境はマイクロソフト  ウインドウズを基にすることができる。このアーキテクチャを用いることによって、プログラム及びサポートの可搬性に関して副次的な利点がもたらされる（たとえば、フィールドサービスエンジニアが、テスタオペレーティングシステムを実行するラップトップを接続して、高度な診断を実行することができる）。しかしながら、大量のコンピュータ集約的な作業（たとえば、テストパターンコンパイル）を行うために、関連するソフトウエアは、分散プラットフォーム上でジョブをスケジューリングできるようにするために個別に実行することができる個別の実体として構成することができる。したがって、バッチジョブのための関連するソフトウエアツールは、多数のプラットフォームタイプ上で動作することができる。
【００３１】
１つの例示的な選択として、ANSI/ISO標準C++を、ソフトウエアのためのネイティブ言語とすることができる。当然、第三者が自ら選択した別の言語を用いるシステムに組み込むことができるようにする多数のオプションが（名目的なC++インターフェース上に層を設けるために）利用可能である。
【００３２】
図３は、テスタオペレーティングシステム、ユーザコンポーネント２９２（たとえば、試験を実施するためにユーザによって供給される）、システムコンポーネント２９４（たとえば、基本的な接続性及び通信のためのソフトウエアインフラストラクチャとして供給される）、モジュール開発コンポーネント２９６（たとえば、モジュール開発者によって供給される）及び外部コンポーネント２９８（たとえば、モジュール開発者以外の外部供給元によって供給される）を含む、名目的な供給元によって（又はサブシステムとしてまとめて開発するものとして）編成された構成に基づくコンポーネントの陰影を示す。
【００３３】
供給元に基づいて編成されたという見方をすると、テスタオペレーティングシステム（ＴＯＳ）インターフェース２９０は、システムコントローラ／サイトコントローラインターフェース２２２と、フレームワーククラス２２４と、サイトコントローラ／モジュールインターフェース２４５と、フレームワーククラス２４６と、既定モジュールレベルインターフェースと、バックプレーン通信ライブラリ２４９と、シャーシスロットＩＦ（インターフェース）２６２と、ロードボードハードウエアＩＦ２６４と、バックプレーンシミュレーションＩＦ２８３と、ロードボードシミュレーションＩＦ２８５と、ＤＵＴシミュレーションＩＦ２８７と、ＤＵＴのVerilogモデルのためのVerilog PLI（プログラミング言語インターフェース）２８８と、ＤＵＴのC/C++モデルのためのC/C++言語サポート２８９とを含む。
【００３４】
ユーザコンポーネント２９２は、ユーザ試験計画２４２と、ユーザ試験クラス２４３と、ハードウエアロードボード２６５と、ＤＵＴ２６６と、ＤＵＴ  Verilogモデル２９３と、ＤＵＴ  C/C++モデル２９１とを含む。
【００３５】
システムコンポーネント２９４は、システムツール２２６と、通信ライブラリ２３０と、試験クラス２４４と、バックプレーンドライバ２５０と、ＨＷバックプレーン２６１と、シミュレーションフレームワーク２８１と、バックプレーンエミュレーション２８２と、ロードボードシミュレーション２８６とを含む。
【００３６】
モジュール開発コンポーネント２９６は、モジュールコマンドインプリメンテーション２４８と、モジュールハードウエア２６３と、モジュールエミュレーション２８４とを含む。
【００３７】
外部コンポーネント２９８は外部ツール２２５を含む。
【００３８】
システムコントローラ２２０は、サイトコントローラへのインターフェース２２２と、フレームワーククラス２２４と、システムツール２２６と、外部ツール２２５と、通信ライブラリ２３０とを含む。システムコントローラソフトウエアはユーザのための一次的なインタラクションポイントである。それは、本発明のサイトコントローラへのゲートウエイと、同じ譲受人による米国特許第６０／４４９，６２２号に記載されるようなマルチサイト／ＤＵＴ環境におけるサイトコントローラの同期とを提供する。ユーザアプリケーション及びツールは、グラフィカルユーザインターフェース（ＧＵＩ）に基づくものでも、そうでないものでも、システムコントローラ上で実行される。システムコントローラは、試験計画、試験パターン及び試験パラメータファイルを含む、全ての試験計画関連情報のためのリポジトリとしての役割も果たす。これらのファイルを記憶するメモリは、システムコントローラに対してローカルに存在することができるか、又はオフライン、すなわち或るネットワークを通してシステムコントローラに接続されることができる。試験パラメータファイルは、本発明の一実施形態のオブジェクト指向環境内にある試験クラスのためのパラメータ化データを含む。
【００３９】
第三者の開発者は、標準システムツール２２６に加えて（又はその代わりに）、複数のツールを提供することができる。システムコントローラ２２０上の標準インターフェース２２２は、テスタ及び試験オブジェクトにアクセスするためにそれらのツールが用いるインターフェースを含む。ツール（アプリケーション）２２５、２２６によって、試験及びテスタオブジェクトをインタラクティブに、且つバッチで制御できるようになる。それらのツールは、自動能力（たとえば、ＳＥＣＳ／ＴＳＥＭを用いること等による）を提供するためのアプリケーションを含む。
【００４０】
システムコントローラ２２０上に存在する通信ライブラリ２３０は、ユーザアプリケーション及び試験プログラムに対してトランスペアレントであるように、サイトコントローラ２４０と通信するための仕組みを提供する。
【００４１】
システムコントローラ２２０に関連するメモリ内に存在するインターフェース２２２は、システムコントローラ上で実行されるフレームワークオブジェクトへのオープンインターフェースを提供する。サイトコントローラに基づくモジュールソフトウエアがパターンデータにアクセスし、それらを検索できるようにするインターフェースが含まれる。また、テスタ及び試験オブジェクトにアクセスするためにアプリケーション及びツールが用いるインターフェース、ならびにスクリプト用エンジンを通してテスタ及び試験コンポーネントにアクセスし、それらを操作する能力を提供するスクリプト用インターフェースも含まれる。これにより、インタラクティブ、バッチ及びリモートアプリケーションのための共通の仕組みが、それらの機能を実行できるようになる。
【００４２】
システムコントローラ２２０に関連付けられるフレームワーククラス２２４は、これらの上記のオブジェクトと対話するための仕組みを提供し、標準インターフェースの参照インプリメンテーションを提供する。たとえば、本発明のサイトコントローラ２４０は機能試験オブジェクトを提供する。システムコントローラフレームワーククラスは、機能試験オブジェクトのリモートシステムコントローラに基づく代理として、対応する機能試験プロキシを提供することができる。こうして、システムコントローラ２２０上のツールが、標準機能試験インターフェースを利用できるようになる。フレームワーククラスは実効的には、ホストシステムコントローラに関連付けられるオペレーティングシステムを提供する。また、それらのフレームワーククラスは、サイトコントローラへのゲートウエイを提供し、且つマルチサイト／ＤＵＴ環境におけるサイトコントローラの同期を提供するソフトウエアコンポーネントを構成する。こうして、この層は、通信層で直に取り扱うことを必要とすることなく、サイトコントローラを操作し、それにアクセスするのに適した、本発明の一実施形態におけるオブジェクトモデルを提供する。
【００４３】
サイトコントローラ２４０は、ユーザ試験計画２４２、ユーザ試験クラス２４３、標準試験クラス２４４、標準インターフェース２４５、サイトコントローラフレームワーククラス２４６、モジュールハイレベルコマンドインターフェース（すなわち、既定モジュールレベルインターフェース）２４７、モジュールコマンドインプリメンテーション２４８、バックプレーン通信ライブラリ２４９及びバックプレーンドライバ２５０のホストとして機能する。試験機能の大部分がサイトコントローラ１０４／２４０によって取り扱われ、それにより試験サイト１１０が個別に動作できるようにすることが好ましい。
【００４４】
試験計画２４２はユーザによって記述される。その計画は、Ｃ＋＋のようなオブジェクト指向構成体を用いて、標準的なコンピュータ言語において直に記述することができるか、又は、C++コードを生成するための、さらに高いレベルの試験プログラミング言語において記述することができ、後に実行可能な試験プログラムにコンパイルすることができる。試験プログラムを開発するために、本発明の１つの実施形態は、譲受人の発明による試験プログラム言語（ＴＰＬ）コンパイラを利用する。図４を参照すると、試験プログラムコンパイラ４００が部分的には、翻訳プログラムセクション４０２を含むコード生成プログラムとしての役割を果たし、試験及び関連するパラメータを記述する、試験プログラム開発者のソースファイル４０４を、C++コードのようなオブジェクト指向構成体に翻訳する。さらに、コンパイラセクション４０６が、コードをコンパイルして、そのコードを実行可能ファイル、たとえばＤＬＬにリンクし、テスタシステムが実行することができる試験プログラムを生成する。ＴＰＬコード生成プログラム／翻訳プログラムを試験システムに適用することには新規性があるが、コード生成プログラムは当該技術分野において知られていることに留意されたい。また、コンパイラセクションには、当該技術分野において知られている標準的なC++コンパイラを用いることができる。
【００４５】
試験計画は、そのサイトコントローラに関連するフレームワーククラス２４６及び／又は標準的な、又はユーザによって供給される試験クラス２４４を用いることにより試験オブジェクトを作成し、標準インターフェース２４５を用いてハードウエアを構成し、試験計画フローを規定する。また試験計画は、試験計画の実行中に必要とされる任意の付加的なロジックを提供する。試験計画はいくつかの基本的なサービスをサポートし、デバッグサービス（たとえば、ブレークポイント生成）のような、下層のオブジェクトのサービスへのインターフェースを提供し、下層のフレームワーク及び標準クラスにアクセスできるようにする。
【００４６】
試験プログラムコンパイラ４００に入力されるソースコードは、１つの試験計画において用いられるオブジェクト、及びその互いに対する関係を指定する試験計画記述ファイルを含む。このファイルは、標準インターフェースのインプリメンテーションの形で、サイトコントローラ上で実行されるC++コードに翻訳され、それはITestPlanで表すことができる。このコードは、ウインドウズ・ダイナミックリンクライブラリ（ＤＬＬ）にパッケージングされ、サイトコントローラにロードされることができる。サイトコントローラソフトウエアが試験計画オブジェクトを生成し、それが含む試験計画オブジェクトを戻すために用いることができる標準的な既知のエントリポイントを有するように、試験プログラムＤＬＬが生成される。サイトコントローラソフトウエアは、その試験プログラムＤＬＬを、その処理空間内にロードし、それらのエントリポイントのうちの１つを用いて、試験計画オブジェクトのインスタンスを作成する。一旦、試験計画オブジェクトが作成されたなら、その後、サイトコントローラソフトウエアはその試験計画を実行することができる。
【００４７】
サイトコントローラに関連するフレームワーククラス２４６は、共通の試験関連動作を実装する１組のクラス及びメソッドである。サイトコントローラレベルフレームワークは、たとえば、電源及びピンエレクトロニクスを一定の順序で配列するためのクラス、レベル及びタイミング条件を設定するためのクラス、測定値を求めるためのクラス、及び試験フローを制御するためのクラスを含む。またフレームワークは、ランタイムサービス及びデバッグのためのメソッドも提供する。フレームワークオブジェクトは、標準インターフェースを実装することによって機能することができる。たとえば、ＴｅｓｔｅｒＰｉｎフレームワーククラスのインプリメンテーションは、試験クラスがハードウエアモジュールピンと対話するために用いることができる汎用のテスタピンインターフェースを実装するように標準化される。
【００４８】
特定のフレームワークオブジェクトは、モジュールレベルインターフェース２４７の助けを借りて動作し、モジュールと通信するように実装することができる。サイトコントローラフレームワーククラスは実効的には、各サイトコントローラをサポートするローカルオペレーティングシステムとしての役割を果たすことができる。
【００４９】
一般的には、プログラムコードの９０パーセント以上がデバイス試験のためのデータであり、コードの残りの１０パーセントは試験方法を実現する。デバイス試験データは、ＤＵＴに依存する（たとえば、電源条件、信号電圧条件、タイミング条件等）。試験コードは、指定されたデバイス条件をＡＴＥハードウエアにロードするための方法、及びユーザによって指定された目的（データロギング等）を実現するために必要な方法からなる。本発明の一実施形態のフレームワークは、ハードウエアに依存しない試験、及びユーザがＤＵＴ試験プログラミングのタスクを実行できるようにするテスタオブジェクトモデルを提供する。
【００５０】
試験コードの再利用性を高めるために、そのようなコードは、任意のデバイス固有のデータ（たとえば、ピン名、刺激データ等）、又はデバイス試験固有のデータ（たとえば、ＤＣユニットのための条件、測定ピン、ターゲットピンの数、パターンファイルの名前、パターンプログラムのアドレス）とは無関係に作成することができる。１つの試験のためのコードがこれらのタイプのデータとコンパイルされる場合には、試験コードの再利用性が減少するであろう。それゆえ、本発明の一実施形態によれば、任意のデバイス固有のデータ又はデバイス試験固有のデータを、コード実行時間中の入力として、外部の試験コードが利用できるようにする。
【００５１】
本発明の一実施形態では、試験クラスは、標準試験インターフェースの１つのインプリメンテーションであり、ここではITestとして表され、特定のタイプの試験のための試験データ及びコードの分離（それゆえ、コードの再利用）を実現する。そのような試験クラスは、それ自体の別個のインスタンスのための「テンプレート」と見なすことができ、それらのインスタンスは、デバイス固有データ及び／又はデバイス試験固有データだけが互いとは異なる。試験クラスは、試験計画ファイルにおいて指定される。各試験クラスは通常、特定のタイプのデバイス試験、又はデバイス試験のための設定を実装する。たとえば、本発明の一実施形態は、ＤＵＴのための全ての機能試験のための基本クラスとして、ITestインターフェースの特定のインプリメンテーション、たとえばFunctionalTestを提供することができる。それは、試験条件を設定する機能、パターンを実行する機能、及びストローブに失敗した場合に試験のステータスを判定する機能からなる基本機能を提供する。他のタイプのインプリメンテーションは、ここではACParametricTest及びDCParametricTestとして表される、ＡＣ及びＤＣ試験クラスを含むことができる。
【００５２】
全試験タイプは、いくつかの仮想的なメソッド（たとえば、init( )、preExec( )及びpostExec( )）のデフォルトインプリメンテーションを提供することができる。これらのメソッドは、試験技師がデフォルトの挙動を無効にし、任意の試験固有のパラメータを設定するためのエントリポイントになる。しかしながら、試験計画において、カスタム試験クラスを用いることもできる。
【００５３】
試験クラスによって、ユーザは、その試験の特定のインスタンスのためのオプションを指定するために用いられるパラメータを与えることにより、クラス挙動を構成できるようになる。たとえば、機能試験は、パラメータＰリスト及びTestConditionを受け取り、それぞれ、実行すべきパターンリスト、及びその試験のためのレベル及びタイミング条件を指定することができる。これらのパラメータのために種々の値を指定することによって（試験計画記述ファイルにおいて種々の「試験」ブロックを用いることによる）、ユーザは機能試験の種々のインスタンスを作成できるようになる。図５は、単一の試験クラスから種々の試験インスタンスを如何に導出することができるかを示す。これらのクラスは、C++コードのような、オブジェクト指向構成体において直にプログラミングすることができるか、又は試験プログラムコンパイラが試験計画ファイルから試験の記述及びそのパラメータを取り込み、対応するC++コードを生成できるようにし、その後、対応するC++コードをコンパイルし、リンクして、試験プログラムを生成することができるように設計することができる。テンプレートライブラリは、一般的なアルゴリズム及びデータ構造の汎用のライブラリとして用いることができる。このライブラリはテスタのユーザから見ることができるので、ユーザは、たとえば、ある試験クラスのインプリメンテーションを変更し、ユーザ定義の試験クラスを作成することができる。
【００５４】
ユーザによって開発された試験クラスに関しては、そのシステムの一実施形態は、全ての試験クラスが単一の試験インターフェース、たとえばITestから派生し、結果として、標準的な１組のシステム試験クラスと同じようにして、フレームワークがそれらの試験クラスを操作できるようになるという点で、そのような試験クラスをフレームワークに組み入れることをサポートする。これらの付加的なファシリティを利用するために試験プログラムにおいてカスタムコードを使用しなければならないことを前提とした上で、ユーザは付加機能をその試験クラスに自由に取り入れることができる。
【００５５】
各試験サイト１１０は、１つ又は複数のＤＵＴ１０６を専用に試験し、構成変更可能な一群の試験モジュール１１２を通して機能する。各試験モジュール１１２は、特定の試験タスクを実行する実体である。たとえば、試験モジュール１１２には、ＤＣＴ電源、ピンカード、アナログカード等を用いることができる。このモジュールによる手法は、高い自由度と構成可能性とを提供する。
【００５６】
モジュールコマンドインプリメンテーションクラス２４８は、モジュールハードウエアベンダが提供することができ、ベンダによって選択されるコマンドインプリメンテーション方法に応じて、ハードウエアモジュールのためのモジュールレベルインターフェース、又は標準インターフェースのモジュール固有のインプリメンテーションを実装する。これらのクラスの外部インターフェースは、既定モジュールレベルインターフェース要件、及びバックプレーン通信ライブラリ要件によって規定される。この層は、標準的な１組の試験コマンドの拡張も可能にし、メソッド（関数）及びデータ要素を追加できるようにする。
【００５７】
バックプレーン通信ライブラリ２４９は、バックプレーンにわたる標準的な通信のためのインターフェースを提供し、それにより試験サイトに接続されるモジュールと通信するために必要な機能を提供する。これにより、ベンダ固有のモジュールソフトウエアが、バックプレーンドライバ２５０を用いて、対応するハードウエアモジュールと通信できるようになる。バックプレーン通信プロトコルはパケットに基づくフォーマットを用いることができる。
【００５８】
テスタピンオブジェクトは、物理的なテスタチャネルを表し、ここではITesterPinとして表される、テスタピンインターフェースから派生する。本発明の一実施形態のソフトウエア開発キット（ＳＤＫ）は、TesterPinとも呼ばれる場合がある、ITesterPinのデフォルトインプリメンテーションを提供し、それは既定モジュールレベルインターフェース、IChannelという形で実装される。ベンダは、IChannelという形でモジュールの機能を実装することができる場合には、自由にTesterPinを利用することができる。そうでない場合には、ベンダは、そのモジュールで正常に機能するためのITesterPinのインプリメンテーションを提供しなければならない。
【００５９】
本発明のテスタシステムによって提供される、ここではIModuleとして表される標準モジュールインターフェースは包括的には、ベンダのハードウエアモジュールを表す。ベンダ供給の、そのシステムのためのモジュール固有のソフトウエアは、ダイナミックリンクライブラリ（ＤＬＬ）のような実行可能ファイルの形で提供されることができる。１つのベンダからのモジュールタイプ毎のソフトウエアは、単一のＤＬＬ内にカプセル化することができる。そのような各ソフトウエアモジュールは、モジュールソフトウエア開発のためのＡＰＩを含む、モジュールインターフェースコマンドのためのベンダ固有のインプリメンテーションを提供するための役割を担う。
【００６０】
モジュールインターフェースコマンドには２つの側面がある。第一に、それらのコマンドは、ユーザがシステム内の特定のハードウエアモジュールと（間接的に）通信するためのインターフェースとしての役割を果たし、第二に、それらのコマンドは、第三者の開発者が、自らのモジュールをサイトコントローラレベルフレームワークに組み込むために利用することができるインターフェースを提供する。したがって、フレームワークによって提供されるモジュールインターフェースコマンドは、２つのタイプに分類される。
【００６１】
最初の、そして最も明らかなコマンドは、フレームワークインターフェースを通してユーザが見ることができる「コマンド」である。こうして、テスタピンインターフェース（ITesterPin）は、レベル及びタイミング値を入手し、設定するための方法を提供し、一方、電源インターフェース（IPowerSupply）は、たとえばパワーアップ及びパワーダウンするための方法を提供する。
【００６２】
さらに、フレームワークは既定モジュールレベルインターフェースの特殊なカテゴリを提供し、それは、モジュールと通信するために用いることができる。これらは、ベンダのモジュールと通信するためにフレームワーククラスによって用いられるインターフェース（すなわち、フレームワークインターフェースの「標準的な」インプリメンテーション）である。
【００６３】
しかしながら、第２の側面、すなわちモジュールレベルインターフェースを用いることはオプションである。それを用いることの利点は、モジュールレベルインターフェースを実装することによってハードウエアに送出される特定のメッセージの内容に重点を置きながら、ベンダがITesterPin及びIPowerSupply等のクラスのインプリメンテーションを利用できることである。しかしながら、これらのインターフェースがそのベンダに適していない場合には、それらのベンダは、フレームワークインターフェースのカスタムインプリメンテーション（たとえば、ITesterPin、IPowerSupply等のベンダインプリメンテーション）を提供することを選択することもできる。その際、これらのベンダは、そのハードウエアに適したカスタム機能を提供するであろう。
【００６４】
バックグラウンドとしてこのオープンアーキテクチャを用いて、本発明の試験プログラム開発システムが以下にさらに説明される。以下のセクションＡは、試験プログラムが用いられることになる試験環境を記述するための規則を説明する。セクションＢは、試験プログラム開発のための方法及び規則を説明する。セクションＣは、試験計画を開発するための方法及び規則、ならびに試験プログラムの主要構造を定義する方法を説明する。セクションＤは、オープンアーキテクチャ試験システム上で試験プログラムを実行する方法を説明する。セクションＥは、試験パターンのための方法及び規則を説明する。セクションＦは、試験パターンのタイミングを記述するための規則を説明する。セクションＧは、テスタ動作全体のための規則を説明する。
【００６５】
［Ａ．コンポーネント］
試験環境は、テスタをインストールし、それを１組の試験を実行するために準備するための必要な条件を指定する１組のファイルを含む。試験環境は、以下に記載されるもののためのファイルを含むことが好ましい。
１．テスタ資源定義：そのオープンアーキテクチャ試験システムにおいて利用することができるテスタ資源タイプ、及びそのような資源のためにサポートされるパラメータを指定するためのファイル。
２．テスタ構成：サイトコントローラ、サイト及び対応するマッピングを指定するためのファイル。
３．モジュール構成：各サイト内のハードウエアモジュールを指定するためのファイル。
４．ピン記述：信号ピン、電源のようなＤＵＴピンを命名し、ピングループを記述するためのファイル。
５．ソケット：ＤＵＴピン−テスタピンの割当てを指定するためのファイル。
６．ピンオプション：ピンのための特殊なオプション又はモードを指定するためのファイル。
７．パターンリスト：試験パターン及びそのシーケンスを指定するためのファイル。
８．パターン：試験ベクトルを指定するためのファイル。
【００６６】
上記のファイルのうち、項目１〜３はＣＭＤ（構成管理データベース）からの情報を用いてＩＣＦ（インストール及び構成ファイル）によって作成され、既知の場所において入手可能であるのに対して、項目４〜８はユーザによって指定される。このセクションは、上記の項目１〜６のための説明を提供する。項目７及び８はセクションＥにおいてさらに詳細に説明される。これらのコンポーネントをそれぞれ開発するために、特定の方法及び規則が用いられることが好ましい。これらの方法及び規則は、例とともにこのセクションにおいて説明されるであろう。
【００６７】
［Ａ１．資源定義］
各ハードウエアモジュールは、試験システムによって用いるための１つ又は複数のタイプのハードウエア資源（略して資源）を提供する。テスタ資源定義は、利用可能な資源タイプのための１組の資源名、並びにそれぞれの特定の資源タイプに関連する１組のパラメータ名及びタイプを宣言するために用いられることが好ましい。たとえば、資源名ｄｐｉｎは、デジタルテスタピンを指すために用いられる。これらの資源は、ＶＩＬ（入力低電圧用）、ＶＩＨ（入力高電圧用）、ＶＯＬ（出力低電圧用）、ＶＯＨ（出力高電圧用）等のパラメータを有する。資源定義ファイルは、「．ｒｓｃ」の拡張子を有するであろう。以下に示されるのは、いくつかのテスタ資源を含む、資源定義の一例である。
【００６８】
#
# File Resources.rsc
#
Version 0.1.2;
ResourceDefs
{
# digital pins
dpin
{
# Low and High voltages for input pins
Voltage VIL, VIH;
# Low and High voltages for output pins
Voltage VOL, VOH;
}
# power supplies
dps
{
#
# PRE_WAIT specifies the time to wait after voltage
#   reached its final value to start pattern
#   generation.  The actual time that the system
#   will wait is a small system specified range:
#   PRE_WAIT-delta <= actual <= PRE_WAIT+delta
#
# PRE_WAIT_MIN is a minimum amount to wait after voltage
#   reached its final value to start pattern generation.
#   It is a system specified range:
#   PRE_WAIT_MIN <= actual <=
PRE_WAIT_MIN+delta
#
# POST_WAIT specifies the time to wait after pattern
#   generation ends to shut down the power. The actual
#   time that the system will wait is a small system
#   defined range:
#   POST_WAIT-delta <= actual <= POST_WAIT+delta
#
# POST_WAIT_MIN specifies the time to wait after pattern
#   generation ends to shut down the power. The actual
#   time that the system will wait is a small system
#   defined range:
#   POST_WAIT_MIN <= actual <=
POST_WAIT_MIN+delta
#
Time PRE_WAIT;
Time PRE_WAIT_MIN;
Time POST_WAIT;
Time POST_WAIT_MIN;
# The voltage.
Voltage VCC;
}
}
【００６９】
資源パラメータのタイプ（Ｖｏｌｔａｇｅ又はＴｉｍｅ等）は標準的な工学単位であることが好ましいことに留意されたい。異なるパラメータを指定することが望ましい特定用途の資源を供給するベンダは、自らの資源定義ファイルを提供すべきである。
【００７０】
［資源定義のための構造］
以下に与えられるのは、本発明の好ましい実施形態による資源定義ファイルのための構造である。
【００７１】
resource-file:
version-info resource-defs
version-info:
Version version-identifer;
resource-defs:
ResourceDefs {resource-def-list}
resource-def-list:
resource-def
resource-def-list resource-def
resource-def:
resource-name {resource-params-decl-list}
resource-params-decl-list:
resource-params-decl
resource-params-decl-list resource-params-decl
resource-params-decl:
elementary-type-name resource-param-name-list;
resource-param-name-list:
resource-param-name
resource-param-name-list , resource-param-name 
【００７２】
上記の未定義の非終端記号は以下のように指定される。
１．version-identifier：集合［０−９ａ−ｚＡ−Ｚ．］からの１つ又は複数の文字からなる文字列。それはバージョン番号を表す。
２．resource-name：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列であり、数字で始まらない。それはｄｐｉｎ又はｄｐｓのような資源の名前を表す。
３．elemantary-type-name：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列であり、数字で始まらない。それは、Voltage(cf.)のような基本タイプの名前を表す。
４．resource-param-name：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字空なる文字列であり、数字で始まらない。それは、ＶＩＬのような資源パラメータの名前を表す。
【００７３】
［Ａ２．テスタ構成］
テスタ構成は、特定のシステム構成内のサイトコントローラ、及びサイトコントローラのスイッチマトリクス入力ポートへの接続を記載するために用いられることが好ましい１組の規則である。本発明の一実施形態のアーキテクチャでは、単一のサイトコントローラを単一のスイッチマトリクス入力ポートに接続することができる。したがって、この状況では、スイッチマトリクス接続は、システム内のサイトコントローラのための暗黙の識別子としての役割を果たす（他の構成も可能である）。以下は一般的なテスタ構成の一例である。
【００７４】
#
# Tester Configuration, Sys.cfg
#
Version 1.2.5;
SysConfig
{
#
# The first field is the hostname of the Site Controller machine;
# it can be specified as either a dotted-decimal IP address or a
# domain-qualified hostname.
#
# The second field is the switch matrix input port number, which 
# implicitly serves as the identifier for the Site Controller 
# connected to it.
#
zeus. olympus.deities.org   2;
127.0.0.2   4;
127.0.0.0   1; # SITEC-1
127.0.0.3   3; 
}
【００７５】
特定の試験フロアシステムのためのシステム構成はシステムプロファイルの一部であり、システム構成ファイルSys.cfgとして入手することができる。１つの実施形態では、ポート１（上記の例では「１２７．０．０．０」）に接続されるサイトコントローラは特別なステータスを享受することができ、そのステータスでは、そのサイトコントローラが単独でスイッチマトリクスを構成することに留意されたい。この「特殊な」サイトコントローラはＳＩＴＥＣ−１と呼ばれるであろう。また、そのサイトコントローラは内部ネットワークによってシステムコントローラに接続することができるので、この例におけるサイトコントローラアドレスはＩＰアドレスであることにも留意されたい。逆に、システムコントローラは、パターンデータのようなファイルにアクセスするために外部ネットワークに接続することができる。
【００７６】
［テスタ構成のための構造］
以下に与えられるのは、本発明の一実施形態によるシステム構成ファイルのための構造である。
【００７７】
system-config-file:
version-info system-config
version-info:
Version version-identifer;
system-config:
SysConfig{ site-controller-connection-list}
site-controller-connection-list:
site-controller-connection
site-controller-connection-list site-controller-connection
site-controller-connection:
site-controller-hostname input-port;
site-controller-hostname:
ip-address
domain-qualified-hostname
ip-address:
octet . octet .octet . octet
domain-qualified hostname:
name
domain-qualified-hostname . name
【００７８】
上記の未定義の非終端記号は以下のように指定される。
１．version-identifier：集合［０−９ａ−ｚＡ−Ｚ．］からの１つ又は複数の文字からなる文字列。それはバージョン番号を表す。
２．octet：０〜２５５の負でない整数（１０進表記）。
３．name：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列であり、数字で始まらない。それは、ドメイン修飾されたホスト名内の名前部分を表す。
４．input-port：１０進表記の負でない整数。
【００７９】
［Ａ３．モジュール構成］
モジュール構成によって、テスタの物理的な構成、たとえばシステムシャーシ内の各モジュールの物理的な場所及びタイプを指定できるようになる。これは、動的なテスタバス構成によって必要とされ、そのテスタバス構成によって、テスタバスアドレスを物理的なスロットの場所にマッピングできるようになる。この情報は、システム構成の妥当性を検査するためにシステムブートアップ時に行われるハードウエア発見プロセスを可能にする。スイッチマトリクスの各出力ポートは物理的なスロットを定義し、そのスロットは単一のハードウエアモジュールによって占有されることが好ましい。以下に示されるのは、本発明の一実施形態による、ファイルModules.cfgにおいて指定されるモジュール構成の一例である。
【００８０】
#
# Module Configuration File, Modules.cfg
#
Version0.0.1;
ModuleConfig
{
#
# A configuration definition which provides information about
# the module type that is attached to slots 1-12 and 32-48.
# Note that a module might provide more than
# a single type of resource.
#
Slot1-12, 32-48              # Switch matrix output ports
# which use the configuration
# defined below.
{
VendorID 1;              # defined vendor code.
ModuleID 1;              # Vendor-defined id code.
ModuleDriver mod1. dll;  # Module software.
#
# Resource named dpin specifies channels
# for digital data. The name dpin is not
# a keyword. It is simply the name of a hardware
# resource, and is obtained from the resource
# definition file.
#
Resource dpin
{
MaxAvailable32;           # Resource units 1 .. 32.
}
Resource analog
{
MaxAvailablel6;           # Resource units 1 .. 16.
Disabled 1-8;              # Disabled resources 1 .. 8.
# So, enabled ones are 9 .. 16.
}
}
#
# A configuration definition which provides information about
# the module type that is attached to slots16-30, 50, and 61-64.
#
# Slot 16-30, 50, 61-64
{
Resource dpin
{
MaxAvailable32;           # Max available resource 
units.
Disabled 3,30-32;          # Disabled resources.
}
ModuleDriver      "module two.dll";
VendorID           2;
ModuleID           2;
}
#
# A configuration definition, which provides information about
# the module type that is attached to slots 65-66.
#
Slot 65-66
{
ModulelD      4;      # DPS module with 8 supplies.
ModuleDriver      mod4.dll;
VendorID      1;
#
# Resource type dps specifying resource units for a 
# Device Power Supply
#
Resource dps
{
MaxAvailable 4;
Disabled 1; 
}
}
}
【００８１】
先に記載されたように、１つの実施形態では、スロットは、スイッチマトリクスの出力ポートのような、１つのハードウエアモジュールを接続することができるコネクタを指している。各構成定義は、１つ又は複数のスロットに取り付けられる場合があるモジュールについての情報を提供する。構成定義において指定されるVendorIDは、１つのベンダに関連する固有のＩＤである。ModuleIDは、このベンダによって提供されるモジュールのタイプを指している。１つのテスタ構成内に同じModuleIDのいくつかのインスタンスが存在する場合もある。ModuleDriverは、そのモジュールをサービスするためにベンダ供給ＤＬＬを指している。最後に、Resourceは、このモジュールによってサービスされるユニットを指しており、資源タイプのための名前を与える。資源名は資源定義ファイルから得られる。
【００８２】
上記の例は、モジュール構成ファイル内の３つの構成ブロックを記述する。１つの実施態様では、第１の構成ブロック、スロット１〜１２及び３２〜４８はベンダ１によって製造されるモジュールによってサービスされる。このベンダは、そのモジュール、このモジュールタイプを指すための識別子「１」、及びモジュールを制御するためのモジュールドライバライブラリを提供する。このモジュールは２つのタイプの資源ユニットを提供することができ、一方のタイプは資源名「dpin」によって表され、好ましくは全数が３２資源ユニット（すなわち「チャネル」）であり、その全てが利用可能であり、他方のタイプは資源名「analog」によって表され、全数が１６資源ユニットであり、９から１６までのみ利用可能である。第２及び第３の構成ブロックは第１の構成と同じようにして指定される。
【００８３】
チャネルが「使用禁止」として指示されるようにする措置は、他の点では依然として機能するモジュールにおいて欠陥のある資源ユニットを特定できるようにすることであることに留意されたい。また、構成ブロックは１つ又は複数のスロット識別子を有することができることにも留意されたい。１つのブロックが２つ以上のスロット識別子を有するとき、特定されたスロットはクローンであると言われる。
【００８４】
モジュール構成ファイル、Module.cfgは、ＩＣＭ（インストール構成管理システム）によってシステムプロファイルの一部として作成され（ユーザによって提供される試験フロア固有の情報を含む）、周知の場所において入手することができる。ＩＣＭは、試験システム、たとえばシステムコントローラ上にローカルに存在することができるか、又はシステムコントローラが接続されるネットワーク上のいずれかの場所に存在することができるユーティリティである。ＩＣＭはＣＭＤ（構成管理データベース）を管理し、通常は、システム構成に対するハードウエア変更時に更新される。ＩＣＭによって、ユーザは、システム、たとえばサイトコントローラ及びモジュールを構成できるようになる。ＣＭＤは、それらの構成を記憶するデータベースである。実際のテスタの場合、構成／動作ＩＣＭが構成ファイル、たとえばモジュール構成、及び他のファイルを生成し、それらのファイル、及び特定のモジュールＤＬＬのような関連するファイルをテスタ上にコピーする。
【００８５】
［モジュール構成のための構造］
以下は、好ましい実施形態によるモジュール構成構造である。
【００８６】
file-contents:
version-info module-config-def
version-info:
Version version-identifier;
module-config-def:
ModuleConfig {slot-entry-list}
slot-entry-list:
slot-entry
slot-entry-list slot-entry
slot-entry:
Slot positive-integer-list {slot-info}
slot-info:
required-config-list
required-config-list:
required-config
required-config-list required-config
required-coiifig:
VendorID   id-code ;
ModuleID   id-code ;
ModuleDriver   file-name ;
Resource resource-name {max-spec disabled specopt}
max-spec:
MaxAvailable positive-integer ;
disabled-spec:
Disabled positive-integer-list;
positive-integer-list:
positive-integer-list-entry 
positive-integer-list , positive-integer-list-entry 
positive- inte ger-list-entry:
positive-integer 
positive-integer-number-range
positive-integer-number-range:
positive-integer - pos-integer
【００８７】
上記の未定義の非終端記号は以下のように指定される。
１．version-identifier：集合［０−９ａ−ｚＡ−Ｚ．］からの１つ又は複数の文字からなる文字列。ただし、最初の文字は集合［０−９］から選択されなければならない。
２．positive-integer：集合［０−９］からの１つ又は複数の文字からなる文字列であり、０で始まらない。
３．id-code：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列。
４．resource-name：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列。ただし、第１の文字は集合［ａ−ｚＡ−Ｚ］から選択されなければならない。
【００８８】
コメントがサポートされる。コメントは「＃」文字で始まり、行の終わりまで続く。
【００８９】
［Ａ４．ピン記述］
ＤＵＴピン記述はピン記述ファイルを用いて記述される。ユーザは、ピン記述ファイル内のＤＵＴピンの記述を入手できようになり、その記述は拡張子．ｐｉｎを有する。このプレーンテキストファイルは、少なくとも、ＤＵＴピン名のリストと、定義されたＤＵＴピン名を利用する、命名されたピングループの初期定義とを含む（それらの定義は、たとえばプログラミングによって、後に変更又は追加することができるので「初期」である）。
【００９０】
このデータ指定を試験計画記述から分離することにより、ＤＵＴピン定義を広く再利用できるようになり、そのプロセスを特定の試験計画に関連付けることなく、パターンコンパイラが、ピン記述ファイルからピン名（ベクトル指定において用いられるピン名への参照を決定するために必要とされる）を導出できるようになる。
【００９１】
以下に示されるのは、ピン記述ファイルの一例である。
【００９２】
#
# Pin description file, myDUT.pin.
#
# Note that this implicitly imports the resource
# configuration file,Resources.rsc.
#
Version 1.1.3a;
PinDescription
{
Resource dpin
{
A0;
A1;
A2;
A3;
A4;
# This syntax expands to the names "ABUS[1]"
and "ABUS[2]"
ABUS[1:2];
A5;
BBUS[1:8];
DIR;
CLK;
Group Grp1
{
DIR, CLK, A0, A1, A2, A3, A4, BBUS[1:4]
}
Group Grp2
{
A5,
#
# The following line will expand to 
# "DIR, Al, A2, A4, A5, BBUS[2]":
#
Grp1 - CLK - A0 - A3 - BBUS [1] - BBUS [3:4] + A5,
BBUS[5:8]
}
}
Resource dps
{
vcc1;
vcc2;
vcc3;
Group PSG
{
vcc1, vcc2 
}
}
}
【００９３】
コンパイラがピン及びピングループ定義をＬｅｖｅｌ等のため許容パラメータ設定と関連付けられるようにするために、ＤＵＴピン及びピングループ定義は資源タイプブロック内にカプセル化されることに留意されたい。
【００９４】
ピン記述についての以下の点に留意されたい。
１．ピングループ及びピンは同じ名前空間を共有し、グローバル（すなわち試験計画）範囲を有する。これらの名前をグローバル範囲にする結果の１つは、異なる資源ブロックにおいて宣言されるときでも、ピン及びピングループが重複した名前を使用することができないことである。
２．ピン記述ファイルにおいて少なくとも１つの資源定義が必要とされる。
３．各資源において少なくとも１つのピン名が定義されなければならない。
４．ピン及びピングループ名は資源境界内で固有であることが要求される。
５．２つ以上の資源のために同じピン又はグループ名を定義することができる。しかしながら、同じ資源内に同じものがある場合には無視される。
６．１つのグループ定義内に現れる全てのピン名及びグループ名はその資源内で既に定義されていなければならない。
７．もし与えられる場合には、グループ定義は少なくとも１つのピン名又はグループ名を持たなければならない（すなわち、グループ定義は空であることはできない）。
８．ピングループ定義は、予め定義されたピングループへの参照を含むことができる。
９．ピングループ定義は、予め定義されたピン及び／又はピングループの追加及び削除のような集合演算を含むことができる。
【００９５】
［ピン記述のための構造］
以下に与えられるのは、本発明の好ましい実施形態によるピン記述のための構造である。
【００９６】
pin-description-file:
version-info pin-description
version-info:
Version version-identifier;
pin-description:
PinDescription {resource-pins-def-list}
resource-pins-def-list:
resource-pins-def
resource-pins-def-list resource-pins-def
resource-pins-def:
Resource resource-name {pin-or-pin-group-def-list}
pin-or-pin-group-def-list:
pin-or-pin-group-def
pin-or-pin-group-def-list pin-or-pin-group-def
pindef-or-pin-groupdef:
pin-def;
pin-group-def
pin-def:
pin-name
pin-name [index : index]
pin-group-def:
Group pin-group-name {pin-group-def-item-list}
pin-group-def-item-list:
pin-def
pin-group-def-item-list, pin-def
【００９７】
上記の未定義の非末端部は以下のように指定される。
１．version-identifier：集合［０−９ａ−ｚＡ−Ｚ．］からの１つ又は複数の文字からなる文字列。それはバージョン番号を表す。
２．resource-name：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列であり、数字で始まらない。それはｄｐｉｎ又はｄｐｓのような資源の名前を表す。
３．pin-name：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列であり、数字で始まらない。それは、ピンＡ０の名前を表す。
４．pin-gourp-name：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列であり、数字で始まらない。それは、ピングループＡＢＵＳの名前を表す。
５．index：負でない整数。それは、関連するピンのグループの下限又は上限を表す。
【００９８】
［Ａ５．ソケット］
ソケットは、ＤＵＴピン名と物理的なテスタピン（チャネル）割当てとの間のマッピングを指定する（物理的なテスタチャネル番号はモジュール構成ファイルにおいて定義される）。異なるソケットを用いて、異なるＤＵＴパッケージ及び異なるロードボード構成等をサポートすることができることに留意されたい。マルチＤＵＴシステムの場合、ＤＵＴ／チャネル割当てのためのソケット定義は、基本ソケットの多数のサイトへの「クローニング」をサポートすることができる。しかしながら、異なるソケット（すなわち、同じ論理ピンのための異なる物理的なマッピング）はサイトモジュール区分を考慮すべきである。したがって、ＤＵＴピンをテスタチャネル割当てに与えることに加えて、ソケットは実効的にはサイト区分も定義する。こうして、ソケットファイルは、いくつかの個別のサイトソケットのための定義を含むことができる。以下に示されるのは、３つのＤＵＴサイトを定義するソケットファイルのサンプルである。
【００９９】
Version 1.1.3
SocketDef
{
DUTType CHIP3
{
PinDescription dutP3.pin; # The pin description file for CHIP3
DUT 2 # Uses the full-specification syntax
{
SiteController 1; # Switch Matrix input port
Resource dpin
{
#
# The CLK pin is assigned to resource dpin, 
# slot 2, resource unit (channel) 13.
#
CLK   2.13;
#
# The DIR pin is assigned to resource dpin,
# slot 5, resource unit 15.
DIR   5.15;
#
# The following statement will be expanded to
#      BBUS [7]   5.4
#      BBUS [6]   5.5
#      BBUS [5]   5.6
#
# So for example, the pin sequence BBUS[7], BBUS[6],
# BBUS[5] is assigned to the same slot 5, and to
# resource units 4,5 and 6 respectively.
#
BBUS [7:5]      5.[4:6];
BBUS[1:4]      7.[21:18];
BBUS [8]      9.16;
}
Resource dps
{
#
# The V1 pin is assigned to resource dps,
# slot 1, resource unit (channel) 1.
#
VCC1 1.1;
#
# The VCC2 pin is assigned to resource dps,
# slot 1, resource unit (channel) 2.
#
VCC2 1.2;
}
}# End DUT 2
DUT 1 # This is "cloned" from DUT 2 above
{
SiteController 1; # Same Site Controller as for DUT 2
Resource dpin
{
SIotOffset 1;      # Offset value for slots
}
Resource dps
{
SlotOffset 10; # Offset value for slots
}
#
# The offset syntax above indicates that the slot/resource
# unit assignments are "cloned" from the first DUT defined
# for this DUTType, i.e., DUT 2, with the slots offset by 
# the SlotOffset values.
#
# Looking at the definition of dpin resource units for
# DUT 2, CLK is bound to slot 2. Hence, for the present
# DUT, CLK is bound to slot 2 + 1= 3.
#
# Some of the new bindings in effect due to the offset 
# assignments are shown in the table below:
#
#---------------------------------------------------------------------
#   Pin      Resource      RUnit      Slot      
# -----------------------------------------------------------------------
#   CLK        dpin          13          2 + 1 = 3.
#   DIR        dpin          15           5 + 1= 6
#   BBUS [8]   dpin          16          9 + 1 = 10 
#   VCC1       dps           1           1 + 10 = 11
#   VCC2       dps           2           1 + 10 = 11
#
} # End DUT 1
} # End DUTType CHIP3
DUTType 74LS245
{
PinDescription dutLS.pin;
DUT 3 disabled # This DUT site is disabled, and will be
ignored
{
・・・
}
}# End DUTType 74LS245
} # End SocketDef 
【０１００】
ソケットファイルについて以下の点に留意されたい。
１．ソケットファイルは、モジュール構成ファイル、及び所与のＤＵＴタイプのためのユーザのピン記述ファイルの両方からの情報を用いる（上記の例のピン記述の場合の指定を参照されたい）。モジュール構成情報は、ソケットファイルコンパイラが暗黙のうちに利用することができる。ソケットファイルコンパイラは、パターンコンパイラの一部を構成し、ソケットＤＵＴ名からテスタチャネルへのマッピング、モジュール構成及びピン記述ファイルを読み出し、分析して、テスタピンのパターンコンパイラによって用いられるＤＵＴピンへのマッピングを設定する。
２．ＤＵＴタイプ当たり少なくとも１つのＤＵＴサイト定義が必要とされ、それは、SlotOffset構文ではなく、フルスペック構文を用いなければならない。同じＤＵＴタイプに対して２つ以上のＤＵＴサイト定義が与えられる場合には、第１のサイト定義はフルスペック構文を用いなければならない。
３．後続の各ＤＵＴサイト定義（同じＤＵＴタイプ）は、フルスペック構文、SlotOffset構文のいずれかを用いることができるが、両方は用いることができない。これにより、個々のサイトが、標準パターンから逸脱できるようになる（たとえば、動作不能のチャネルに起因する）。
４．SlotOffset構文から導出される結合は、そのＤＵＴタイプのために定義される第１のサイト（フルスペック構文を用いる）に対して定義される。
５．ＤＵＴサイトは、実際の物理的な順序で宣言される必要はない。これにより、第１の（物理的な）サイトがそのパターンから逸脱する状況が許される。
６．ＤＵＴサイトＩＤは、ソケット全体にわたって（すなわち、その中で定義される全てのＤＵＴタイプにわたって）固有であることが要求される。
７．ＤＵＴサイト定義毎に少なくとも１つの資源定義が必要とされる。
８．サイト定義を、モジュール構成とともに用いて、試験構成が単一サイト／単一ＤＵＴであるか、単一サイト／多数ＤＵＴであるかを判定しなければならない。
９．全ての場合に、ソケットファイルは、ピン記述ファイル及びモジュール構成ファイルと一致する１組のＤＵＴチャネルマッピングを指定しなければならない。
１０．場合によっては、１つ又は複数のＤＵＴチャネルがテスタから切断されることをソケットが指定できるようにすることが望ましいであろう（たとえば、割り当てられた物理チャネルを特殊なＩＤ「０．０」を有するチャネルと指定することによる）。この場合、試験プログラムの関連で、これらのＤＵＴチャネルを使用し、参照することができる。そのようなチャネル上での動作の結果として、システム警告が生成されるであろう（ただし、エラーではない）。ロード時に、切断されたチャネルのためのパターンデータは破棄されるであろう。
【０１０１】
［ソケットのための構造］
以下は、本発明の好ましい実施形態によるモジュール構成のための構造である。
【０１０２】
socket-file:
version-info socket-def
version-info:
Version version-identifer;
socket-def:
SocketDef {device-specific-socket-def-list}
device-specific-socket-def-list:
device-specific-socket-def
device-specific-socket-def list device-specific-socket-def
device-specific-socket-def:
DUTType DUT-type-name {pin-description-file dut-info-list}
pin-description-file:
PinDesc pin-description-file-name ;
dut-info-list:
dut-info
dut-info-list dut-info
dut-info:
DUT dut-id {site-controller-input-port resource-info-list}
site-controller-input-port:
SiteController switch-matrix-input-port-number;
resource-info-list:
resource-info
resource-info-list resource-info
resource-info:
Resource resource-name {resource-item-unit-assignment-list}
resource-item-unit-assignment-list:
resource-item-unit-assignment
resource item-unit-assignment-list resource-item-unit-assignment
resource-item-unit-assignment:
resource-item-name slot-number. resource-unit;
resource-item-name [resource-item-index] slot-number. resource-
unit-index;
resource-item-name [resource-item-index-range]
slot-number. [resource-unit-index-range];
resource-item-index-range:
resource-item-index : resource-item-index
resource-unit-index-range:
resource-unit-index : resource-unit-index
【０１０３】
上記の未定義の非終端記号は以下のように指定される。
１．version-identifier：集合［０−９ａ−ｚＡ−Ｚ．］からの１つ又は複数の文字からなる文字列。それはバージョン番号を表す。
２．Dut-type-name：集合［０−９ａ−ｚＡ−Ｚ．］からの１つ又は複数の文字からなる文字列。ただし、最初の文字は集合［０−９］から選択されてはならない。それは、ＣＨＩＰ３のようなＤＵＴのタイプを表す。
３．pin-description-file-name：ファイルの簡単な名前であり、そのディレクトリ名は含まないが、全ての拡張子を含む。そのファイル名は、ホストオペレーティングシステムによって認識される構文からなり、引用符に囲まれる場合には、空白及び他の文字が許される。
４．switch-matrix-input-port-number：１０進表記の負でない整数であり、サイトコントローラに接続される入力ポートのポート数を表す。
５．dut-id：１０進表記の負でない整数であり、ＤＵＴのインスタンスを特定する。
６．resource-name：集合［０−９ａ−ｚＡ−Ｚ］からの１つ又は複数の文字からなる文字列であり、最初の文字は数字であってはならない。それは資源ファイルにおいて定義される資源の名前を表す。
７．resource-item-name：集合［０−９ａ−ｚＡ−Ｚ］からの１つ又は複数の文字からなる文字列であり、最初の文字は数字であってはならない。それは、ピン又はピングループのような資源ユニットの名前を表す。
８．resource-item-index：１０進表記の負でない整数であり、資源項目のグループのうちの特定のメンバを表す。resource-item-index-rangeの関連では、それは、資源項目グループの連続した文字列の下限又は上限を表す。
９．resource-unit-index：１０進表記の負でない整数であり、資源ユニット（チャネル）のグループのうちの特定のメンバを表す。resource-unit-index-rangeの関連では、それは、資源ユニットグループの連続した文字列の下限又は上限を表す。
【０１０４】
［Ａ６．ピン］
論理的なピン名を物理チャネルにマッピングすること（たとえばソケットによって提供される）に加えて、テスタ資源を指定するためにいくつかの属性を用いることができることに留意されたい。たとえば、試験固有、ベンダ固有、及び／又は試験システム固有の場合がある、チャネルのための特定のハードウエア構成を定義するために、複数のオプションを用いることができる。これらのオプションは、ピンモードオプションを用いて記述され、ピンモードオプションファイルを通して入手できるようになるであろう。
【０１０５】
ピンモードオプション定義は、テスタチャネルのための特殊なオプション又はモードの構成をサポートするであろう。たとえば、これを用いて、チャネルを選択し、チャネル多重化を構成することができる。ピンモードオプションはチャネル構成をかなり変更することが必要となる場合もあるので、試験計画初期フローの一部としてのみ用いられることが好ましい。ピンオプション構文は、ベンダによって定義されるオプションをサポートする。一例が以下に示される。
【０１０６】
PinModeOptions
{
clock      IN      double;
a0       OUT      single;
・・・
};
【０１０７】
［試験環境構成］
先に指摘されたように、資源定義ファイル（Resource.rsc）、システム構成ファイル（Sys.cfg）及びモジュール構成ファイル（Module.cfg）は、「周知の」場所において入手できることが好ましい。この「周知の」場所は、システム環境変数Tester_ACTIVE_CONFIGSの値によって指定されるディレクトリである。たとえば、Tester_ACTIVE_CONFIGSの値がディレクトリF:\Tester_SYS\configsである場合には、システムは、以下のファイルが存在するものと予想するであろう。
・F:\Tester_SYS\configs\Resources.rsc
・F:\Tester_SYS\configs\Sys.cfg
・F:\Tester_SYS\configs\Modules.cfg
【０１０８】
インストール中に、ホストコンピュータ上に存在するインストール及び構成管理システム（ＩＣＭ）が、Tester_ACTIVE_CONFIGSの値を設定することが好ましいであろう。ＩＣＭが上記のファイルのうちの１つの新たなバージョンを作成する度に、その新たなバージョンを、Tester_ACTIVE_CONFIGSによって指示される場所に置くであろう。上記の３つのファイルに加えて、シミュレーション構成ファイルのような他のシステム構成ファイルも、Tester_ACTIVE_CONFIGSによって指示される場所に置かれることに留意されたい。
【０１０９】
［Ｂ．試験プログラム開発のための規則］
テスタシステムの２つの主なエンドユーザ向けコンポーネントのうちの１つが試験環境である。他のコンポーネントは、テスタがエンドユーザ（すなわち、試験技師及び試験クラス開発者）に提供するプログラミングファシリティである。
【０１１０】
プログラミング環境の主なコンポーネントは試験計画である。試験計画は試験クラス（すなわちTestで表される試験インターフェースの種々のインプリメンテーションである）を使用し、試験クラスは、特定のタイプの試験のための試験データ及びコードの分離を実現する。
【０１１１】
その計画はC++試験プログラムとして直に書くことができるか、又は試験計画記述ファイル内に記述することができ、そのファイルは試験プログラム発生プログラム（翻訳プログラム４０２）によって処理され、C++コードのようなオブジェクト指向コードが生成される。その後、生成されたC++コードをコンパイルして、実行可能試験プログラムを作成することができる。レベル、タイミング等の試験クラスインスタンスを構成するために必要とされるデータは、試験計画記述ファイルにおいてユーザによって指定される。
【０１１２】
試験プログラムは、１つのデバイス上で試験を実行するための詳細を指定する、１組のユーザ書込みファイルを含む。本発明の一実施形態は、ユーザがC++構成体を用いてこれらのファイルを書くことができるようにする複数組の規則を含む。
【０１１３】
本発明の実施形態による要件のうちの１つは、オープンアーキテクチャ試験システムのモジュール性を追求することである。モジュール式の開発によって、ユーザが試験の種々の側面に関係する個々のコンポーネントを書くことできるようになり、それにより、これらのコンポーネントを種々の態様で様々に組み合わせて、１つの完全な試験プログラムを生成できるようになる。本発明の好ましい実施形態による試験プログラムは以下のような１組のファイルを含む。
ユーザ変数及び定数のためのファイル*.usrv
仕様セットのためのファイル*.spec
レベルのためのファイル*.lvl
タイミングのためのファイル*.tim
試験条件グループのためのファイル*.tcg
ビン定義のためのファイル*.ddefs
カスタム関数及び試験クラス用のファイルプリヘッダのためのファイル*.ph
カスタムタイプのためのファイル*.ctyp
カスタム変数のためのファイル*.cvar
試験計画のためのファイル*.tpl
【０１１４】
上記のファイル拡張子は、ファイルのカテゴリ化を容易にする、推奨される決まりである。単一の試験プログラムは、単一の試験計画ファイルと、それがインポートするファイルとを含むことが好ましいであろう。「インポート」は、インポータ（インポートを指定するファイル）によって直に参照されるか、又はインポータによって直に参照されるいくつかの他のファイルによってインポートされるデータを有する他のファイルを指している。試験計画ファイルは、グローバル、フロー、及びそのファイル内の他のそのようなオブジェクトを定義することができるか、又はそのファイルは、他のファイルからこの情報をインポートすることができる。これらの規則によって、上記のコンポーネントのうちの任意のものが、その自らの個々のファイル内に存在できるようになるか、又は試験計画ファイル内に直に並べられるようになる。試験計画は、Ｃ言語ｍａｉｎ（）関数に概念的に類似であることに留意されたい。
【０１１５】
［試験プログラム主要項目］
・ユーザ変数及び定数
・仕様セット
・レベル
・タイミング
・試験条件
・ビン定義
・プリヘッダ
・カスタムタイプ
・カスタム変数
・試験計画
【０１１６】
試験プログラム識別子は、アルファベットの大文字又は小文字で始まり、それに続いて、任意の数のアルファベット文字、数字又はアンダーバー（＿）を有することができることが好ましい。それは、以下に与えられる説明において提供されるいくつかのキーワードを有する。これらのキーワードは、Ｖｅｒｓｉｏｎのように、太字を用いて、本明細書のコード内で視覚的に特定される。キーワードは予約され、識別子として用いられないことが好ましい。｛，｝、（，）等のいくつかの特殊な記号、及び他の記号があり、それらの記号が以下に説明される。
【０１１７】
［試験オブジェクトのエラボレーション］
試験記述ファイルをインポートすることにより、インポート用ファイルが、インポートされるファイルによって利用可能であるオブジェクトの名前を参照できるようになる。これにより、インポート用ファイルは、インポートされるファイルによって命名されるオブジェクトを参照できるようになる。ピン記述ファイルxxx.pinをインポートするソケットファイルaaa.socについて考える。同じくxxx.pinをインポートする別のbbb.socファイルも存在することができる。しかしながら、これらのインポートのいずれによっても、xxx.pinによって記述されるオブジェクトは発生しない。それらは、既に存在するものと仮定されるオブジェクトを参照するだけである。
【０１１８】
そのようなオブジェクトがいつ発生するかという疑問が生じる。これは、試験計画ファイルが根本的に異なる場合である。Ｃとの類似性から、その中にmain()ルーチンを有するファイルが存在するであろう。試験計画ファイル内の「Import」ステートメントは、これらのオブジェクトをエラボレートするであろう。すなわち、「Import」ステートメントによって、これらのオブジェクトが発生する。以下に示される試験計画mickey.tplによって、xxx.pin及びaaa.soc内のオブジェクトがエラボレートされる。
【０１１９】
# File for Mickey's Test Plan
Version 3.4.5.;
#
# These import statements will actually cause the
# objects to come into existence:
#
Import xxx.pin; # Elaborates pin and pin-group objects
Import aaa.soc; # Elaborates site socket map objects
# Other imports as necessary
・・・
Flow Flow 1
{
・・・
} 
【０１２０】
試験計画にxxx.pinをインポートすることにより、xxx.pinにおいて宣言される全てのピン及びピングループオブジェクトがエラボレートされる。これは、「ファイルxxx.pinがエラボレートされる」のように記述される。試験計画が、エラボレートされる必要がある全てのファイルを直にインポートする必要はない。以下の２つのステートメントのうちのいずれかが正しい場合には、ファイルｘがファイルｙによってインポートされる。
１．ｙがｘを命名するインポートステートメントを有する。又は、
２．ｘがｚによってインポートされ、ｙがｚを命名するインポートステートメントを有する。
【０１２１】
試験プログラムがコンパイルされるとき、それは、試験計画によってインポートされるファイル内の全てのオブジェクトをエラボレートするであろう。１つの試験計画によってインポートされる１組のファイルは、それらのファイルがエラボレートされる順序をもたらすようにトポロジカルソートされる。１つの試験計画によってインポートされる１組のファイルは、その試験計画のインポート閉包と呼ばれる。１つの試験計画のインポート閉包がトポロジカルソートできない場合には、インポートサイクルが存在しなければならない。そのような状況は誤っており、コンパイラによって拒否されるであろう。
【０１２２】
［ユーザ変数及び定数］
ユーザ変数及び定数を用いて、グローバル変数及び定数が定義されるであろう。それらの定数は、その値がコンパイル時に固定され、変更することができないオブジェクトである。たとえば、最大整数値は定数になるであろう。一方、変数に結び付けられる式は、ＡＰＩを介して、実行時に変更することができる。
・整数
・符号なし整数
・ダブル
・ストリング
・ボルト単位の電圧（Ｖ）
・ボルト／秒単位の電圧スルー（ＶＰＳ）
・アンペア単位の電流（Ａ）
・ワット単位の電力（Ｗ）
・秒単位の時間（Ｓ）
・メートル単位の長さ（Ｍ）
・ヘルツ単位の周波数（Ｈｚ）
・オーム単位の抵抗（Ｏｈｍ）
・ファラド単位の静電容量（Ｆ）
【０１２３】
タイプ整数、符号なし整数、ダブル及びストリングは基本タイプと呼ばれる。基本タイプは測定単位を持たない。基本タイプでない基本的なタイプはダブルであり、関連する測定単位及びスケールを有する。指数記号は、共通の工学指数記号である。
・ｐＦ（ピコファラド）の場合のような、１０−１２の場合のｐ（ピコ）
・ｎＳ（ナノ秒）の場合のような、１０−９の場合のｎ（ナノ）
・ｕＳ（マイクロ秒）の場合のような、１０−６の場合のｕ（マイクロ）
・ｍＶ（ミリアンペア）の場合のような、１０−３の場合のｍ（ミリ）
・ｋＯｈｍ（キロオーム）の場合のような、１０＋３の場合のｋ（キロ）
・ＭＨｚ（メガヘルツ）の場合のような、１０＋６の場合のＭ（メガ）
・ＧＨｚ（ギガヘルツ）の場合のような、１０＋９の場合のＧ（ギガ）
【０１２４】
ユーザ変数及び定数を有する別個のファイルは拡張子.usrvを有するであろう。以下は、いくつかのグローバル定数を有するファイルの一例である。いくつかの変数を有するファイルの一例は後に与えられる。
【０１２５】
# -------------------------------------------------------- 
# File limits.usrv
# --------------------------------------------------------
Version 1.0.0;
#
# This UserVars collection declaration declares a set of
# globally available variables and constants.
#
UserVars
{
# Some constant Integer globals used in various places.
Const Integer MaxInteger = 2147483647;
Const Integer Minlnteger = -2147483648; 
# Smallest value such that 1.0 + Epsilon!= 1.0
Const Double Epsilon =2.2204460492503131 e-016;
# Some important constants related to Double
Const Double MaxDouble = 1.7976931348623158e+308;
Const Double MinDouble = - MaxDouble;
Const Double ZeroPlus = 2.2250738585072014e-308;
Const Double ZeroMinus = - ZeroPlus; 
}
【０１２６】
先に宣言された１組のUserVarsは「＝」の左側に変数の定義を有するものと見なされる。結果として、１つの変数又は定数の定義は一度だけ行われることが好ましく、初期化されるべきである。
【０１２７】
先に述べられたように、定数は、一旦定義されたなら、変更されないであろう。１つの定数に結び付けられる式は、予め定義された定数と、リテラル値とを含むことができる。一方、変数はＡＰＩを介して変更することができる。変数に結び付けられる式は、予め定義された変数と、定数と、リテラル値とを含むことができる。
【０１２８】
各変数は実行時に保持される式オブジェクトに結び付けられる。これは、実行時に変数に関連する式を変更し、その後、全ての変数を再評価する能力を与える。式オブジェクトは、変数又は定数定義の右辺のパースされた形である。１つの実施形態では、実行時に定数を変更するためのファシリティは提供されない。それらの値は、コンパイル時に固定されることが好ましい。
【０１２９】
グローバルを有する任意の数のそのようなファイルが、１つの試験計画のインポート閉包内に存在することができる。上記のグローバルファイルは１組の数値限界であるが、ここでは、工学測定単位を用いる１組の工学グローバル及びいくつかのランダムユーザ変数である。
【０１３０】
# -------------------------------------------------------- 
# File myvars.usrv
# --------------------------------------------------------
Version 0.1;
#
# This declares a UserVars collection of some engineering
# globals.
#
UserVars MyVars
{
# Engineering quantities.
Const Voltage VInLow = 0.0;   # 0 Volts
Const Voltage VInHigh= 5.0;   # 5 Volts
Const Voltage VOutLow = 400.0 mV;   # 400 milliVolts
Const Voltage VOutHigh= 5.1;   # 5.1 Volts
Const Time DeltaT = 2.0E-9;   # 2 nanoseconds
Const TimeClkTick =1.0ns;   # 1 nanosecond
Const Resistance R10 = 10.0 kOhms;   # 10 kilo Ohms
# Some variables are declared below.
Current ILow = 1.0 mA;   #1 milliAmp
Current IHigh = 2.0 mA;   # 2 milliAmp
Power PLow = ILow * VInLow;   # Low power value
Power PHigh = IHigh * VInHigh;   # High power value
#
# An array of low values for all A bus pins.
# The vil for A0 will be in ABusVil [0], A1
# in ABusVil [1], so on.
#
Voltage ABusVil[8] ={1.0, 1.2, Others = 1.5};
}
【０１３１】
コンパイラは、単位及びタイプが一致することを確認することが好ましい。電圧×電圧は電力になるので、上記のPlow及びPHighのための式はコンパイルされることに留意されたい。しかしながら、以下に記載されるようなステートメントは典型的にはコンパイルされないであろう。
【０１３２】
#
# Does not compile because a Current and a Voltage cannot be added
# to yield a Power.
#
Power Pxxx = IHigh + VInHigh; 
【０１３３】
コンパイラは、ある特定の自動タイプ変換を可能にするであろう。
【０１３４】
Power Pxxx = 2; # Set the power to 2.0 watts
Integer Y = 3.6; # Y gets assigned 3
Power Pyyy = Y; # Pyyy gets assigned 3.0 watts
Double Z = Pyyy; # Pyyy gets converted to a unitless Double 
【０１３５】
ダブル、符号なし整数及び整数への明示タイプ変換も許される。
【０１３６】
Power Pxxx = 3.5;
# Explicit type conversion is allowed, but not required.
# X becomes 3.5
Double X = Double (Pxxx);   #X becomes 3.5
Integer Y = Integer (Pxxx);   #Y becomes 3 
【０１３７】
中間の基本タイプに変換することにより、非関連タイプ間の変換も可能である。
【０１３８】
Power Pxxx = 3.5;
# Explicit type conversion is required.
Length L = Double (Pxxx); #L becomes 3.5 meters
Voltage V = Integer (Pxxx); #V becomes 3.0 Volts.
【０１３９】
試験計画オブジェクトは、名前及びその関連する式、値並びにタイプを含むコレクションであるUserVarsクラスを提供する。ユーザ変数は、デフォルトユーザ変数コレクションに、又は命名ユーザ変数コレクションに入ることができる。上記の例のUserVars宣言は、指定された名前はなく、デフォルトコレクションに入る。しかしながら、以下のように、コレクションを明示的に命名することができる。
【０１４０】
# Declare X and Y in the MyVars UserVars collection.
UserVars MyVars
{
Integer X = 2.0;
#
# Refers to the above X, and to the globally
# available MaxInteger from the default
# UserVars collection.
#
Integer Y =MaxInteger - X;
}
# Declare X, Y1 and Y2 in the YourVars UserVars collection.
UserVars YourVars
{
Integer X = 3.0;
# Refers to the X from MyVars.
Integer Y1 =MaxInteger - MyVars.X;
# Refers to the X declared above.
Integer Y2 =MaxInteger - X;
}
# More variables being added to the MyVars collection
UserVars MyVars
{
#
# Refers to X and Y from the earlier declaration
# of MyVars.
#
Integer Z = X + Y; 
}
【０１４１】
UserVarsコレクション内の名前分解は以下のように進められる。
名前が修飾されている、すなわち名前が点によって分離される２つの部分を含む場合には、変数は、その点の前にある部分によって名前を付けられる、名前付きユーザ変数コレクションからもたらされる。したがって、上記のMyVars.XはMyVarsコレクション内のＸを指している。デフォルトユーザ変数コレクションを明示するために、名前「_UserVars」を用いることができる。
【０１４２】
その名前が修飾されず、且つそのコレクション内に同じ名前の定数又は変数が存在する場合には、名前はその定数又は変数に分解する。
【０１４３】
そうでない場合には、その名前はデフォルトユーザ変数コレクション内の定数又は変数に分解する。
【０１４４】
UserVarsコレクション内の定義のブロックの評価は、最初の定義から最後の定義まで順番に生じるものと考えることができる。これには、各変数が用いられる前に、その変数が定義される必要がある。
【０１４５】
さらに、UserVarsコレクションのためにいくつかの定義ブロックが存在することができ、各ブロックがいくつかの変数を定義している。これらの定義ブロックは全て、試験計画において宣言された順序で評価されるものと考えることができ、その後、各ブロックの変数も宣言された順序で検査される。
【０１４６】
最後に、いくつかのUserVarsコレクションが存在することができ、各UserVarsコレクションがいくつかの定義ブロックにわたって変数を定義する。再び、それらの変数は全て、宣言された順序で初期化されるものと考えることができる。こうして、上記の例では、評価順序は、MyVars.X、MyVars.Y、YoursVars.X、YoursVars.Y1、YoursVars.Y2、MyVars.Zになるであろう。
【０１４７】
UserVarsコレクションが別のコレクションからの変数を用いるとき、UserVarsコレクションはその変数の生データだけを用いることが好ましい。コレクション間では従属性情報は保持されない。それゆえ、従属性に基づく再評価は、ただ１つのコレクションに限定することができる。
【０１４８】
各ユーザ変数コレクションはC++ UserVarsクラスのインスタンスを指している。C++ UserVarsクラスのデフォルトオブジェクトは「_UserVars」と名前を付けられる。名前付きでないUserVars宣言内の変数は、デフォルトユーザ変数コレクションからのものであり、このデフォルトオブジェクトに追加される。名前付きユーザ変数コレクション内の変数は、その名前を有するC++ UserVarsクラスのオブジェクトに追加される。上記の例では、「MyVars」C++オブジェクトは、変数Ｘ、Ｙ及びＺを有することになるであろう。
【０１４９】
［ユーザ変数のためのC++］
ユーザ変数は、nameストリング、const/varブーリアン、列挙された値としてのtype及び式木としてのexpressionを有するｎ個組のコレクションとして実装される。１つの名前の式は、以下のコールによってセットすることができる。
【０１５０】
enum ElemenaryType {UnsignedlntegerT, IntegerT,
DoubleT, VoltageT,...};
Status setExpression(const String& name,
const bool isConst,
const elementaryType,
const Expression& expression); 
【０１５１】
タイプExpressionは、アサインメントの右辺に対応するテキストのパースされた形であるタイプである。UserVarsのグローバルに利用可能なインスタンスが存在するであろう。たとえば、limits.usrv内の１組のユーザ変数の集合（pageを参照）は、以下に示される１組のコールによって実装される。
【０１５２】
_UserVars.setExpression ("MaxInteger", true, IntegerT,
Expression (2147483647));
_UserVars.setExpression ("MinInteger", true, IntegerT,
Expression(-2147483648));
_UserVars.setExpression ("Epsilon", true, DoubleT,
Expression (2.2204460492503131e-016)); 
_UserVars.setExpression ("MaxDouble", true, DoubleT,
Expression (1.7976931348623158e+308)); 
_UserVars.setExpression ("MinDouble", true, DoubleT,
Expression("- MaxDouble") ); 
_UserVars.setExpression("ZeroPlus", true, DoubleT,
Expression(2.2250738585072014e-308));
_UserVars.setExpression("ZeroMinus", true, DoubleT,
Expression("- ZeroPlus") );
【０１５３】
以下は、myvars.usrvにおいて宣言される変数のために実行されることになるC++ステートメントである。
【０１５４】
myVars.setExpression("VInLow", true, VoltageT,
Expression(0.0));
myVars.setExpression("VInHigh", true, VoltageT,
Expression(5.0));
myVars.setExpression("DeltaT", true, TimeT,
Expression(2.0E-9));
myVars.setExpression("ClkTick", true, TimeT,
Expression (1.0E-9));
myVars.setExpression("R10", true, ResistanceT,
Expression(10.0E+3));
myVars.setExpression("ILow", false, CurrentT,
Expression (1.0E-3));
myVars.setExpression("IHigh", false, CurrentT,
Expression(2.0E-3));
myVars.setExpression("PLow", false, PowerT,
Expression("ILow * VInLow")); 
myVars.setExpression("PHigh", false, PowerT,
Expression("IHigh * VInHigh"));
myVars.setExpression ("ABusVil[0]", false, VoltageT,
Expression(1.0));
myVars.setExpression("ABusVil[l]", false, VoltageT,
Expression(1.2));
myVars.setExpression("ABusVil[2]", false, VoltageT,
Expression( 1.5));
myVars.setExpression("ABusVil[3]", false, VoltageT,
Expression(1.5));
myVars.setExpression("ABusVil[4]", false, VoltageT,
Expression(I .5));
myVars.setExpression("ABusVil[5]", false, VoltageT,
Expression( 1.5));
myVars.setExpression("ABusVil[6]", false, VoltageT,
Expression(1.5));
myVars.setExpression("ABusVil[7]", false, VoltageT,
Expression(1.5));
【０１５５】
上記のコードでは、Expressionクラスは式のパースされた形を表すコンストラクタを有することが好ましい。Expressionはいくつかのコンストラクタを有し、その中には、ストリングリテラルを受け取り、それをパースするコンストラクタ、及びストリングリテラルを受け取り、ストリングリテラルとしてだけ用いる別のコンストラクタが含まれる。これらは、読みやすくするためにこれまでは指定されていない付加的なパラメータによって区別される。
【０１５６】
デフォルトユーザ変数コレクション内のユーザ変数は、クラスUserVarsの_UserVarsオブジェクトによって管理されるであろう。名前付きユーザ変数コレクションXxx内のユーザ変数は、Xxxと名前を付けられたUserVarsオブジェクトによって管理されるであろう。
【０１５７】
［UserVarsのためのランタイムＡＰＩ］
これらの名前及び式を含むC++ UserVarsクラスは、アプリケーションプログラムインターフェース（ＡＰＩ）をエクスポートし、実行時にこれらの値を評価し、変更する。UserVarsに関連する式の変更は、UserVarsがいつ再評価されるか、及びその評価の影響が何であるかという問題にも対処する。
【０１５８】
最初に、１つの変化の結果としてのUserVarsの再評価がいつトリガされるべきであるかの問題を考える。それが、式に変更を加えるときに直ちにトリガされる場合には、ユーザは、再評価をトリガする前に、一連の関連する変更を加えることができないであろう。したがって、再評価は、ユーザによる明示的なコールによってトリガされる。
【０１５９】
次に、再評価の影響を考えることができる。好ましい実施形態によれば、３種類の再評価が利用可能である。
【０１６０】
UserVars Collection Re-evaluationは、ただ１つのUserVarsコレクションに限定される再評価である。この演算の意味は、このコレクションの全ての変数をもう一度、再評価することである。
【０１６１】
UserVars Targeted Re-evaluationは、ただ１つの名前に結び付けられる式に対する変更に限定される再評価である。これにより、ユーザは、ただ１つの名前の式を変更できるようになり、この特定の変更だけを考慮に入れて、コレクションの再評価が行われるであろう。
【０１６２】
UserVars Global Re-evaluationは、全てのUserVarsコレクションの再評価である。これは基本的には、全てのUserVarsコレクションの再評価を、宣言された順序でトリガするので、非常にコストがかかる。
【０１６３】
上記の再評価は全て、UserVarsを再評価した後に、Level、Timing等の従属オブジェクトを再評価するであろう。従属オブジェクトは、それが再評価を必要とすることを表すダーティビットを有するであろう。UserVarsコレクションがプログラムによって変更されるときはいつでも、それは、全ての従属オブジェクトにおいてダーティビットもセットするであろう。これは、従属オブジェクトの再評価をトリガするであろう。
【０１６４】
要約すると、名前付きUserVarsコレクションは、再評価の影響の問題を封じ込めるのを助ける。再評価は通常、ただ１つのコレクションに限定される。UserVarsを用いる１つの単純な方法は、デフォルトUserVarsコレクションだけを用いることであろう。そのように、変更を加えることの波及効果は、全てのUserVarsに起こり得る。この波及効果は、いくつかの名前付きUserVarsコレクションを有することによって制限することができる。
【０１６５】
多数のコレクションが互いからの変数を参照することができるが、それらの変数に結び付けられる値は使用時に固定される。UserVarsコレクション間の従属性は保持されない。
【０１６６】
基本タイプXxx（符号なし整数、電流、電圧等）毎に、値をゲットするためのメソッドは、以下の通りである。
【０１６７】
Status getXxxValue(const String& name, Xxx& value) const;
【０１６８】
値を直にセットするためのメソッドは存在しないので、それは、式をセットするためのコールと、その後のreevaluateCollection()へのコールとを通して行われることに留意されたい。
【０１６９】
式をゲットし、セットするためのメソッド。setExpression()コールを用いて、これまでに定義されていなかった新たな変数を定義することもできる。
【０１７０】
enum elementaryType
{
UnsignedlntegerT, IntegerT, DoubleT, VoltageT, ...
};
Status getExpression(const String& name,
Expression& expression) const;
Status setExpression(const String& name,
const bool isConst,
const elementaryType,
const Expression& expression);
【０１７１】
setExpression()コールは、その式の結果として循環的な従属性が生じる場合には、失敗する可能性がある。たとえば、以下の２つのコールが行われる場合には、第２のコールは、循環的な従属性による失敗によって失敗するであろう。
【０１７２】
setExpression ("X", true, IntegerT, Expression("Y+1"));
setExpression ("Y", true, IntegerT, Expression("X+1"));
【０１７３】
これは、名前に結び付けられる値が式であり、アサインメントでないためである。変数の値が変更されるとき、直接的及び間接的に従属する名前を全て再評価するためのメソッドが提供される。上記の一対の式のような式の結果として、循環的な従属性が生じ、それは許容されない。
【０１７４】
このＡＰＩは典型的には要求されていない再評価をサポートしないことに留意されたい。setExpression()へのコールでは、変数、及びその変数に従属する全ての他の変数が自動的には再評価されない場合がある。全ての変数に結び付けられる値は、reevaluateCollection()（以下）へのコールが生じるまで、変更されないままであろう。
【０１７５】
特定の名前が定数であるか否かを判定するためのメソッド。
【０１７６】
Status getIsConst(const String& name, bool& isConst);
【０１７７】
タイプをゲットするためのメソッド。
【０１７８】
enum ElementaryType
{
UnsignedIntegerT, IntegerT, DoubleT, VoltageT, ...
};
Status getType(const String& name,
ElementaryType& elementaryType) const;
【０１７９】
UserVars Collection Re-evaluationメソッド。
【０１８０】
Status reevaluateCollection();
【０１８１】
そのクラスは、全ての変数及びそれらの従属する変数に関連する式を保持するであろう。このメソッドがコールされるとき、全ての変数が再評価されるようになるであろう。
【０１８２】
UserVars Targeted Re-evaluationメソッド。
【０１８３】
Status reevaluateTargeted(const String& var);
【０１８４】
そのクラスは、全ての変数及びそれらの従属する変数に関連する式を保持するであろう。このメソッドがコールされるとき、名前付き変数、及びその従属変数の全てが再評価されるようになるであろう。
・UserVars Global Re-evaluationメソッド。
【０１８５】
static Status reevaluateAllCollections();
【０１８６】
そのクラスは、全ての変数及びそれらの従属する変数に関連する式を保持するであろう。このメソッドがコールされるとき、全てのUserVarsコレクション上で、reevaluateCollection()が不特定の順序でコールされる。
【０１８７】
特定の名前が定義されるか否かを判定するためのメソッド。
【０１８８】
StatusgetIsDefined(const String& name, bool& isDefined) const;
【０１８９】
現在定義されている全てのユーザ変数を判定するためのメソッド。
【０１９０】
Status getNames(StringList& names) const;
【０１９１】
現在定義されている変数を削除するためのメソッド。
【０１９２】
Status deleteName(const String& name);
【０１９３】
この演算は、その名前が他の変数を含む式において用いられる場合には、失敗するであろう。
・所与の変数又は定数に従属する変数及び定数のリストをゲットするためのメソッド。
【０１９４】
Status getDependents(const String& name, StringList& dependents);
【０１９５】
［仕様セット］
仕様セットは、セレクタに基づいて値を取り込むことができる変数のコレクションを供給するために用いられる。たとえば、セレクタMinnie、Mickey、Goofy及びDaisyを用いる以下のSpecification Setについて考える。
【０１９６】
# ---------------------------------------------------------
# File Aaa. spec
# ---------------------------------------------------------
Version 1.0;
Import Limits.usrv;
SpecificationSet Aaa (Minnie, Mickey, Goofy, Daisy)
{
Double xxx = 1.0, 2.0, 3.0, 4.0;
Integer yyy = 10, 20, 30, 40;
Integer zzz =MaxInteger - xxx,
MaxInteger - xxx - 1,
MaxInteger - xxx - 2,
Maxlnteger - xxx;
# The following declaration associates a single
# value, which will be chosen regardless of the
# selector. It is equivalent to:
# Integer www = yyy + zzz, yyy + zzz, yyy + zzz, yyy + zzz
Integer www = yyy + zzz; }
}
【０１９７】
セレクタGoofyを有する上記の仕様セットは以下のように連想するであろう。
【０１９８】
xxx= 3.0;
yyy = 30;
zzz =MaxInteger - xxx - 2;
www = yyy + zzz;
【０１９９】
Testが記述されるときに、仕様セットにおいてセレクタをセットする演算が以下に説明されるであろう。
【０２００】
構文的には、仕様セットａは、セレクタのリスト（上記の例では、Minnie、Mickey、Goofy及びDaisy）と、変数定義のリスト（上記の例では、xxx、yyy、zzz及びwww）である。変数の定義は、セレクタのリストと同じ長さの式のリストを含むか、又はただ１つの式を含む。
【０２０１】
概念的には、仕様セットは式の行列と考えることができ、その列がセレクタであり、その行が変数であり、そのエントリが式である。特定のセレクタ（列）が各変数（行）を特定の式（エントリ）に結び付ける。そのリストがただ１つの式を有する場合には、そのリストは、セレクタが存在するのと同じ数だけ式が繰り返される行を表す。
【０２０２】
仕様セットは２つの別個の状況において現れることができる。仕様セットは、.specファイルにおいて別個に宣言されることができ、その場合には、それらの仕様セットは先に示されたように現れる。これらは名前付き仕様セットである。別の状況では、ローカル仕様セットをTest Codition Group内で宣言することができる。そのような宣言では、仕様セットは名前を与えられないであろう。取り囲んでいる試験条件グループに対してだけ意味のあるローカルな仕様セットが存在するであろう。
【０２０３】
名前付きユーザ変数コレクションの後に、名前付き仕様セットをモデル化することができる。上記の仕様セットは、Aaaと名前を付けられるUserVarsコレクションとしてモデル化されることができ、それはxxx[Minnie]、xxx[Mickey]、xxx[Goofy]、xxx[Daisy]、yyy[Minnie]等のための式を有するであろう。ある試験の状況において特定のセレクタ（たとえばMickey）が選択されるとき、xxx、yyy及びzzzの値は変数名及び仕様セット名から得られる。
【０２０４】
試験条件グループは、ローカル仕様セットか、名前付き仕様セットへの参照かのいずれかである、多くても１つの仕様セットを有することができる。ローカル仕様セットは、試験条件グループの状況においてのみ現われ、明示される名前を持たない。そのような仕様セットは、取り囲んでいる試験条件グループの名前によって定義される暗黙の名前を有する。いくつかの仕様セット及びいくつかのUserVarsコレクションが現われる時点で、１つの試験条件グループ内の１つの名前を分解するために、以下の規則が適用される。
１．その名前が修飾されている場合には、その名前は、名前付きユーザ変数コレクションにおいて分解されなければならない。
２．その名前が修飾されていない場合には、その名前は、その名前が試験条件グループにおいて宣言される場合にはローカル仕様セットにおいて、それが試験条件グループにおいて参照される場合には名前付き仕様セットにおいて分解される。
３．その名前が上記の規則によって分解されない場合には、その名前はデフォルトユーザ変数コレクションにおいて分解される。
【０２０５】
これらの規則を例示するために、Test Conditions Group（後に説明されることになる）を用いる以下の例について考える。
【０２０６】
Version 1.2.3;
Import limits. usrv; # Picks up the limits UserVars file above.
Import aaa. spec; # Picks up the Specification Set AAA above.
TestConditionGroup TCG1
{
SpecificationSet(Min, Max, Typ)
{
vcc = 4.9, 5.1, 5.0;
}
# Rule 1: Resolution in a named user variables collection.
# A reference to MyVars.VInLow refers to VInLow from MyVars.
# Rule 2: Resolution in a local specification set.
# A reference to "vcc" here will resolve in the context
# of the local specification set above.
# Rule 3: Resolution in default user variables collection.
# A reference to"MaxInteger" here will resolve to limits.usrv.
# Error: Resolution of xxx
# A reference to xxx does not resolve because it is neither in
# the local specification set, nor in limits.usrv.
# Error: Resolution of Aaa.xxx
# Looks for a named UserVars collection named Aaa. The named
# specification set does not qualify.
}
TestConditionGroup TCG2
{
SpecificationSet Aaa; # References the imported specification set
# Rule 1: Resolution in a named user variables collection.
# A reference to MyVars.VInLow refers to VInLow from MyVars.
# Rule 2: Resolution in a named specification set.
# A reference to "xxx" here will resolve in the context
# of the local specification set Aaa above.
# Rule 3: Resolution in default user variables collection.
# A reference to"MaxInteger" here will resolve to limits.usrv.
# Error: Resolution of vcc 
# A reference to vcc does not resolve because it is neither in 
# the named specification set Aaa, nor in limits.usrv.
# Error: Resolution of Aaa.xxx 
# Looks for a named UserVars collection named Aaa. The named
# specification set does not qualify.
}
【０２０７】
仕様セット内の名前の分解（上記の規則）では、そのセットのセレクタが、名前分解が要求される時点で使用可能にされることが要求される。これは、試験条件グループが、セレクタを指定することによって１つのTestにおいて参照されることになるという事実によって強要されるであろう。
【０２０８】
［仕様セットのためのC++］
上記の規則を用いるとき、仕様セットは、C++ SpecificationSetクラスによって実装されることができる。SpecificationSetクラスは基本的には、UserVarsクラスと同じＡＰＩを有するが、セレクタのための余分なストリングパラメータがあることが異なる。したがって、このＡＰＩは詳細には説明されない。
【０２０９】
全ての名前付き仕様セットは、その名前のC++オブジェクトに関連付けられることが好ましい。ある試験条件グループの状況におけるローカル仕様セットは、その試験条件グループに固有の名前を有するであろう。そのローカル仕様セットが定義される試験条件グループの状況以外では、ローカル仕様セットの変数を参照することは違法である。
【０２１０】
［レベル］
Levelは、ピン及びピングループのパラメータを指定するために用いられる。それは、以下の形の宣言のコレクションである。
【０２１１】
<pin-or-pin-group-name>
{
<pin-param-1> = xxx;
<pin-param-2> = yyy;
...
}
【０２１２】
そのような宣言は、名前付きピン又はピングループの種々のパラメータの設定を指定する。たとえば、以下の例に示されるように、そのようなステートメントを用いて、InputPinsグループ内の全てのピンのためのVIL値をセットすることができる。
【０２１３】
# ------------------------------------------------------
# File CHIPlevels.lvl
# ------------------------------------------------------
Version 1.0;
Import CHIP3resources.rsc;
Import CHIP3pins.pin;
Levels CHIP3Levels
{
#
# Specifies pin-parameters for various pins and 
# pin groups using globals and values from
# the specification set.
#
# The order of specification is significant.
# Pin parameters will be set in order from
# first to last in this Levels section, and
# from first to last for each pin or pin-group 
# subsection.
#
# From the imported pin description fileCHIP3pins.pin,
# the InPins group is in the "dpin" resource. From the 
# imported resource definition file CHIP3resources.rsc,
# the "dps" resource has parameters named VIL and VIH.
#
InPins { VIL = v_il; VIH = v_ih+ 1.0;}
# The following statement requires a delay of 10 uS after
# the call to set the InPins levels. Actual delay will be
# a small system defined range around 10.0E-6:
#   10.0E-6 - delta <= actual <= 10.0E-6 + delta
Delay 10.0E-6;
#
# For the OutPins, the levels for the parameters
# VOL and VOH are specified.
#
OutPins{ VOL = v_ol/ 2.0; VOH = v_oh; }
# The clock pin will have special values.
Clock { VOL = 0.0; VOH = v_ih/ 2.0;} 
# A Delay of 10 uS after the call to set Clock levels.
# This is a minimum delay, that is guaranteed to be for
# at least 10.0 uS, though it may be a little more:
#      10.0E-6 <= actual <= 10.0E-6 + delta
MinDelay 10.0 uS;
#
# The PowerPins group is in the "dps" resource. Pins of this
# pin group have special parameters:
# PRE_WAIT specifies the time to wait after voltage
#    reached its final value to start pattern
#    generation. Actual wait time will be a small
#    system defined range around PRE_WAIT (see)
# POST_WAIT specifies the time to wait after pattern
#    generation ends to shut down the power. Actual
#    wait time will be a small system defined range
#    around PRE_WAIT (see).
#
PowerPins
{
PRE_WAIT = 10.0 ms;
POST_WAIT= 10.0 ms;
# VCC reaches its final value of 2.0 V from its
# present value in a ramp with a Voltage Slew Rate
# of ±.01 Volts per Second.
VCC =Slew(0.01, 2.0 V);
}
}
Levels CHIP4Levels
{
# ... 
}
【０２１４】
上記のように、各Levelブロックは、多数のレベル項目から構成されることが好ましく、各レベル項目は１つのピン又はピングループのためのパラメータを指定する。各レベル項目は多数の資源パラメータを指定することができる。これらのレベル値の設定のための実行時の意味は以下の通りである。
【０２１５】
Levelsブロックのレベル項目は宣言された順序で処理される。２つ以上のレベル項目において生じるピンがあれば、何度でも処理されることになる。ただ１つのパラメータのための値の多数の仕様は、指定された順序で保持され、適用されるべきである。
【０２１６】
１つのレベル項目内の資源パラメータは、それらが指定された順序で処理される。
【０２１７】
次のレベルグループをセットする前に、Delayステートメントによって、レベルをセットするプロセスが概ね指示された持続時間だけ中断する。実際の待ち時間は、指定された遅延を中心にして、小システムによって規定される範囲内にあることができる。したがって、遅延がｔ秒であった場合には、実際の遅延は以下の式を満たすであろう。
【０２１８】
t - Δt <= actual-wait <= t + Δt
【０２１９】
Ｄｅｌａｙステートメントは、Levels指定を多数のサブシーケンスに分割し、各サブシーケンスは、処理するための別個のTest Condition Memory設定を必要とするであろう。
【０２２０】
次のレベルグループをセットする前に、MinDelayステートメントによって、レベルをセットするプロセスが少なくとも指定された持続時間だけ中断する。実際の待ち時間は、小システムによって規定される範囲内にあり、指定された最小遅延の最小値を有することができる。したがって、最小遅延がｔ秒であった場合には、実際の遅延は以下の式を満たすであろう。
【０２２１】
t <= actual-wait <= t + Δt
【０２２２】
MinDelayステートメントは、Levels指定を多数のサブシーケンスに分割し、各サブシーケンスは、処理するための別個のTest Condition Memory設定を必要とするであろう。
【０２２３】
各ピン又はピングループ名はピン記述ファイル（接尾部.pin）内の厳密に１つの資源において指定され、それゆえ、資源ファイル（接尾部.rsc）において指定される、ある１組の実用的な資源パラメータを有する。名前を付けられる全てのパラメータはこの１組の実用的な資源パラメータの中からもたらされるべきであり、それらの値をセットするために用いられる式と同じ基本タイプを有するべきである。資源パラメータの名前及びタイプについての情報は資源ファイルからもたらされる。
【０２２４】
資源ファイルResource.rscは暗黙のうちにインポートされ、テスタにdpin及びｄｐｓのような標準的な資源のパラメータのための名前及びタイプを与える。
【０２２５】
資源パラメータは、UserVarsを用いることができる式、及び名前付きの仕様セット又は現時点で見ることができるローカル仕様セットからの値を割り当てられる。
【０２２６】
dpsピン資源は、特殊なパラメータPRE_WAIT及びPOST_WAITを有する。PRE_WAITパラメータは、電源ピンがその目標電圧に達する時刻から、パターン生成を開始することができる時刻まで経過するのにかかる時間を指定する。ＰＯＳＴ＿ＷＡＩＴパラメータは、パターン生成が停止した時刻から、電源ピンが遮断する時刻まで経過するのにかかる時間を指定する。
【０２２７】
またdpsピンは、電圧パラメータがその最終値に如何に達するかも指定する。それらのピンは、全ての他のピンパラメータのように、単に１つの式によって電圧パラメータを指定することができる。その場合、その値は、ハードウエアがそれを可能にするときに、達成されるであろう。またそれらのピンは、Slewステートメントを用いて、それを指定することもできる。Slewステートメントは、電源電圧が、指定された絶対Voltage Slew Rateを有する傾斜で、その初期値から最終値に達することを指定する。
【０２２８】
［LevelsのためのＣ＋＋］
上記の規則を用いて、以下の演算をサポートするC++ Levelsオブジェクトを書くことができる。
・以下の演算が行われる。
【０２２９】
Status setParameter(const String& pinOrPinGroupName,
const String& parameterName,
ElementaryType elementaryType,
const Expression& Expression);
【０２３０】
この演算は、１つの式を、１つのピン又はピングループのパラメータに結び付ける。たとえば、dpin.InPins VIH値は以下の式によってセットされる。
【０２３１】
setParameter ("InPins", "VIH", VoltageT,
Expression("v_ih + 1.0");
【０２３２】
この演算は、Levelsオブジェクト内の全ての宣言のために何度もコールされるであろう。
・以下の演算が行われ、その演算は、先に説明されたように、全ての所定のモジュールレベルインターフェースをくまなく調べて、発行し、パラメータの全てのレベルを、指定された順序で割り当てるであろう。セレクタパラメータを用いて、先に指定された規則に従って、それらの式内の名前が分解される。
【０２３３】
Status assignLevels(const String& selector);
【０２３４】
［試験条件グループ］
試験条件グループ部分言語は、仕様、タイミング及びレベルの記述を一緒にパッケージ化する。Timingオブジェクトは多くの場合に、複数のパラメータを用いて指定される。複数のパラメータを複数のタイミングにおいて用いて、種々のパルスの前縁及び後縁を指定することができる。同様に、Levelsは種々の電圧レベルの最大値、最小値及び典型値を指定することによりパラメータ化することができる。試験条件グループ（ＴＣＧ）オブジェクトは、仕様と、これらの仕様に基づくTimings及びLevelsのインスタンシエーションとを一纏めにする。
【０２３５】
TestConditionGroup宣言はオプションのSpecificationSetを含む。SpecificationSet宣言には、インライン化された（そして名前付きでない）ローカルSpecificationSetを用いることができるか、又は他の場所で宣言された名前付きSpecificationSetへの参照を用いることができる。ＴＣＧ宣言内のオプションのSpecificationSet宣言には、少なくとも１つのLevels又はTimings宣言が続く。それは、複数のLevel及び複数のTimingの両方を任意の順序で有することができる。しかしながら、それは、２つ以上のLevels及びTimings宣言を有することは許されない。これらの制約は構文的に強制される。
【０２３６】
ＴＣＧ内の仕様セット宣言は、それが名前を持たないことを除いて、別個に宣言される仕様セットと同じである。その名前は暗黙のうちに、取り囲んでいるＴＣＧの名前になる。Timings宣言は、指定されたタイミングファイルからのTimingsオブジェクトのただ１つの宣言を含む。ここに示されるのは、試験条件グループを有するファイルの一例である。
【０２３７】
# ---------------------------------------------------------
# File myTestConditionGroups.tcg 
# --------------------------------------------------------- 
Version 0.1;
Import CHIPlevels.lvl;
Import edges.spec;
Importtimingl.tim;
Import timing2.tim;
TestConditionGroup TCG1
{
# This Local SpecificationSet uses user-defined selectors
# "min", "max" and "typ". Any number of selectors with any
# user defined names is allowed.
#
# The specification set specifies a table giving values for 
# variables that can be used in expressions to initialize
# timings and levels. The specification set below defines
# values for variables as per the following table:
#            min               max            typ
#   v_cc      2.9               3.1               3.0
#   v_ih   vInHigh + 0.0   vInHigh + 0.2   vInHigh + 0.1
#   v_il   vInLow + 0.0   vInLow + 0.2   vInLow + 0.1
# ...
# A reference such as"vlnHigh" must be previously defined 
# in a blockof UserVars.
#
# Thus, if the "max" selector was selected in a functional
# test, then the "max" column of values would be bound to
# the variables, setting v_cc to 3.1, v_ih to vInHigh+2.0
# and so on.
#
# Note that this is a local specification set, and has no
# name.
SpecificationSet(min, max, typ)
{
# Minimum, Maximum and Typical specifications for
# voltages.
Voltage v_cc = 2.9, 3.1, 3.0;
Voltage v_ih = vInHigh + 0.0,
vInHigh + 0.2,
vInHigh + 0.1;
Voltage v_il = vInLow + 0.0,
vInLow + 0.2,
vInLow + 0.1;
# Minimum, Maximum and Typical specifications for
# leading and trailing timing edges.  The base
# value of 1.0E-6 uS corresponds to 1 picosecond,
# and is given as an example of using scientific
# notation for numbers along with units.
Time t_le = 1.0E-6 uS,
1.0E-6 uS + 4.0 * DeltaT,
1.0E-6 uS + 2.0 * DeltaT;
Time t_te = 30ns,
30ns + 4.0 * DeltaT,
30ns + 2.0 * DeltaT;
}
# Refers to the CHIP3Levels imported earlier. It
# is one of possibly many levels objects that have been
# imported from the above file.
Levels CHIP3Levels;
# Refers to filetimingl.tim containing the single
# timing Timingl. The filename should be quoted if
# it has whitespace characters in it.
Timings Timing 1 ;
}
# Another test condition group
TestConditionGroup TCG2
{
# CIockAndDataEdgesSpecs is a specification set which
# is available in the edges.specs file. Assume it has
# the following declaration:
# Specification Set ClockAndDataEdgesSpecs (min, max, typ)
# {
#   Time clock_le = 10.00 uS, 10.02 uS, 10.01 uS;
#   Time clock_te = 20.00 uS, 20.02 uS, 20.01 uS;
#   Timedata_le = 10.0 uS, 10.2 uS, 10.1 uS;
#   Time data_te = 30.0 uS, 30.2 uS, 30.1 uS;
# }
# A Specification Set reference to this named set is below:
SpecificationSet ClockAndDataEdgesSpecs;
# An inlined levels declaration. Since the associated
# specification set (above) does not have variables such
# as VInLow, VInHigh, VOutLow and VOutHigh, they must
# resolve in the default UserVars collection.
Levels
{
InPins { VIL = VInLow; VIH = VInHigh + 1.0;}
OutPins { VOL = VOutLow/ 2.0; VOH = VOutHigh;}
}
# This Timing is from the file "timing2.tim". The timings 
# will need the leading and trailing edge timings for clock 
# and data as specified in the above specification set.
Timings Timing2;
}
【０２３８】
上記の例では、試験条件グループＴＣＧ１は、「min」、「typ」及び「max」の名前を付けられた３つのセレクタを有する仕様セットを記述する。任意の数の別個のセレクタが存在することができる。仕様セットの本体内で、それらのセレクタに対応する３個１組の値で、変数v_il、v_ih、t_le及びt_teが初期化される。したがって、上記の例では、セレクタ「min」を有するＴＣＧ１のインスタンスが、変数v_ilを第１の数値と結合するであろう（vInputLow+0.0）。再び、１つの仕様セットのための複数のセレクタがユーザによって定義され、任意の数のセレクタが許される。唯一の要件は以下の通りである。
【０２３９】
１つの仕様セットのセレクタは固有の識別子である。
【０２４０】
その仕様セットにおいて指定される各値は、その１組のセレクタと厳密に同じ数の要素を有する値のアレイに関連付けられる。ｉ番目のセレクタを選ぶことにより、各値が、それらの値の関連するベクトルのｉ番目の値に結び付けられるであろう。
【０２４１】
ＴＣＧ内の仕様セットに続いて、Levels宣言又はTimings宣言、あるいはその両方が存在することができる。Levels宣言を用いて、種々のピンパラメータのためのレベルがセットされる。仕様セットにおいて特定される変数を用いて、これらのレベルがセットされることになり、それにより、ＴＣＧを初期化するために用いられるセレクタに基づいて、ピンパラメータのための種々の実際の値を動的に結合できるようになる。
【０２４２】
これを例示するために、セレクタ「min」を使用可能にするTestを考える。ページ上に与えられる仕様セットCHIP3Levelsを参照すると、InPinsグループ内のピンのためのピンパラメータ「ＶＩＨ」は、以下の宣言によって式（v_ih+1.0）に初期化されるであろう。
【０２４３】
InPins { VIL = v_il; VIH = v_ih + 1.0; }
【０２４４】
セレクタ「min」が使用可能にされるとき、これは（VInHigh+0.0+1.0）に分解する。同様に、Timingsオブジェクトは、仕様セット変数の選択された値に基づいて初期化することができる。Timings及びLevels宣言の両方を有する必要はない。以下の例によって例示されるように、いずれかがそれだけで存在することができるか、又は両方が任意の順序で存在することができる。
【０２４５】
# ------------------------------------------------------
# File LevelsOnlyAndTimingsOnly.tcg
# ------------------------------------------------------
Version 0.1;
# A Levels-only Test Condition Group.
TestConditionGroup LevelsOnlyTCG
{
SpecificationSet(Min, Max, Typ)
{
Voltage v_il = 0.0, 0.2, 0.1;
Voltagev_ih = 3.9, 4.1, 4.0;
}
# An inlined levels declaration. Since the associated
# specification set (above) does not have variables such
# as VInLow, VInHigh, VOutLow and VOutHigh, they must
# resolve in the default UserVars collection.
Levels
{
InPins { VIL v_il; VIH v_ih + 1.0;}
OutPins { VOL v_il/ 2.0; VOH v_ih;}
}
}
# A Timings-only Test Condition Group
TestConditionGroup TimingsOnlyTCG
{
SpecificationSet(Min, Max, Typ)
{
Time t_le = 0.9E-3, 1.1E-3,1.0E-3;
}
Timings Timing2;
}
【０２４６】
しかしながら、１つのＴＣＧ内に２つ以上のTimings及び２つ以上のLevelsが存在すべきでないことに留意されたい。したがって、要約すると、Timings又はLevelsの少なくとも一方が存在すべきであり、且つ多くてもそれぞれの１つが存在すべきである。
【０２４７】
［試験条件］
TestConditionオブジェクトは１つのＴＣＧを特定のセレクタに結び付ける。一旦、ＴＣＧが先に示されるように宣言されたなら、以下に示されるように、TestConditionオブジェクトを宣言することができる。
【０２４８】
TestCondition TCMin
{
TestConditionGroup = TCG1;
Selector = min;
}
TestCondition TCTyp . 
{
TestConditionGroup = TCG1;
Selector = typ;
}
TestCondition TCMax
{
TestConditionGroup = TCG1;
Selector = max;
}
【０２４９】
これらのTest Conditionは、以下のように、１つのTest Planにおいてインスタンス化されるであろう。
【０２５０】
#
# Declare a FunctionalTest"MyFunctionaITest" that refers to three
# Test Condition Group instances.
#
Test FunctionalTest MyFunctionalTest
{
# Specify the Pattern List
PList = patlAlist;
# Any number of TestConditions can be specified:
TestCondition = TCMin;
TestCondition = TCMax;
TestCondition = TCTyp;
}
【０２５１】
［ＴＣＧ（試験条件グループ）内の名前分解］
試験条件グループ内の名前の分解は先に説明された。しかしながら、これらの規則が繰返し述べられ、再び以下に与えられる。
１．その名前が修飾されている場合には（ページを参照されたい）、その名前は、名前付きユーザ変数コレクションにおいて分解されなければならない。
２．その名前が修飾されていない場合には、その名前は、その名前が試験条件グループにおいて宣言される場合にはローカル仕様セットにおいて、それが試験条件グループにおいて参照される場合には名前付き仕様セットにおいて分解される。
３．その名前が上記の規則によって分解されない場合には、その名前はデフォルトユーザ変数コレクションにおいて分解される。
【０２５２】
［ＴＣＧランタイム］
試験条件グループは以下の実行時の意味を有する。
【０２５３】
Test（FunctionalTest等）は、インスタンス化されたTestConditionを用いて、そのSpecificationSetからの特定のセレクタを有するＴＣＧを参照するであろう。このセレクタは、SpecificationSet内の各変数を、選択されたセレクタに関連付けられる値に結び付けるであろう。その後、変数とそれらの値とのこの結び付きを用いて、Levels及びTimingsが判定されるであろう。
【０２５４】
TestConditionGroup内のパラメータLevelsは、Levelsブロックの提示順に、順番にセットされることが好ましい。したがって、CHIP3Levelsブロックでは、パラメータレベルがセットされることになる順序は以下の通りである（表記法：<resource-name>.<resource-parameter>）。
・InputPins.VIL
・InputPins.VIH
・OutputPins.VIL
・OutputPins.VIH
・Clock.VOL
・Clock.VOH
【０２５５】
このようなシーケンシングの順序によって、試験ライタは、電源の明示的なパワーシーケンシングを制御できるようになる。さらに、１つのレベル項目が２回生じ、１つのピンのために同じピンパラメータの名前を付ける場合には、そのピンパラメータは２回セットされるようになる。これは、プログラムによって生じることもできる。
【０２５６】
１つのパラメータが以下のようなSlewステートメントによってセットされる場合には、それは、ＶＣＣが、毎秒±０．０１ボルトの電圧スルーレートの傾斜で、その現在の値から２．０ボルトの最終値に達することを意味する。
【０２５７】
VCC = Slew(0.01,2.0 V);
【０２５８】
仕様セット変数はＴＣＧ内のTimingsオブジェクトにも渡すことができる。その後、Timingsオブジェクトは、選択された変数に基づいて初期化されるであろう。そのような仕組みを用いて、たとえば、波形の前縁及び後縁を指定することにより、Timingsオブジェクトをカスタマイズすることができる。
【０２５９】
［ＴＣＧのためのＣ＋＋］
上記の規則を用いて、Test Condition GroupがC++ TestConditionGroupクラスにおいて宣言されることができ、それを以下のように初期化することができる。
【０２６０】
以下のTestConditionGroupメンバ関数へのコールが行われる。
【０２６１】
Status setSpecificationSet(SpecificationSet *pSpecificationSet); 
【０２６２】
その関数はTestConditionGroupのための仕様セットをセットするであろう。これは、ローカル仕様セット、又は名前付き仕様セット、又はヌル（存在しない場合）のいずれかにすることができる。
【０２６３】
以下のTestConditionGroupメンバ関数へのコールが行われる。
【０２６４】
Status setLevels(Levels *pLevels);
【０２６５】
その関数はTestConditionGroupのためのLevelsオブジェクトをセットするであろう。これは、ローカルに宣言されるレベルオブジェクト、又は外部から宣言されるレベルオブジェクト、又はヌル（存在しない場合）のいずれかにすることができる。
【０２６６】
以下のTestConditionGroupメンバ関数へのコールが行われる。
【０２６７】
Status setTimings(Timings *pTimings);
【０２６８】
その関数はTestConditionGroupのためのTimingsオブジェクトをセットするであろう。これは、外部から宣言されるTimingsオブジェクト、又はヌル（存在しない場合）のいずれかにすることができる。
【０２６９】
［ビン定義］
Bin Definitionクラスはビン、すなわち、数多くのＤＵＴを試験した結果を要約するカウンタのコレクションを定義する。１つのＤＵＴを試験する過程において、そのＤＵＴは、たとえば特定の試験の結果を指示するために、任意のビンにセットされることができる。試験が進められるとき、そのＤＵＴは別のビンにセットされることができる。ＤＵＴが最終的にセットされるビンは、その試験の終了時の最後のそのような設定である。この最終的なビンのためのカウンタは、このＤＵＴの試験の終了時にインクリメントされる。ビン定義を有する別個のファイルは接尾部.bdefsを有するべきある。
【０２７０】
ビン定義は階層的であることが好ましい。たとえば、最も外側にあるレベルでは、Pass及びFailと名前を付けられる２つのビンを有するPassFailBinが存在することができる。その際、いくつかのHardBinが存在することができ、そのうちのいくつかはPassビンにマッピングし、他のものはFailビンにマッピングする。HardBinは、PassFailBinのリファインメントと言われる。最後に、多数のSoftBin、すなわちHardBinのリファインメントが存在することができ、それらの多くが同じHardビンにマッピングする。以下はビンの階層を示す一例である。
【０２７１】
# -------------------------------------------------------------
# File CHIPbins.bdefs
# --------------------------------------------------------------
Version 1.2.3;
BinDefs
{
# The HardBins are an outermost level of
# bins. They are not a refinement of any other
# bins.
BinGroup HardBins
{
"3GHzPass": "DUTs passing 3GHz"; 
"2.8GHzPass": "DUTs passing 2.8GHz";
"3GHzFail": "DUTs failing 3GHz";
"2.8GHzFail": "DUTs failing 2.8GHz";
LeakageFail: "DUTs failing leakage";
}
# The SoftBins are a next level of refinement.
# SoftBins are a refinement of HardBins.
BinGroup SoftBins : HardBins
{
"3GHzAllPass":
"Good DUTs at 3GHz", "3GHzPass";
"3GHzCacheFail":
"Cache Fails at 3GHz", "3GHzFail";
"3GHzSBFTFail":
"SBFT Fails at 3GHz", "3GHzFail";
"3GHzLeakage":
"Leakages at 3GHz", LeakageFail;
"2.8GHzAllPass": 
"Good DUTs at 2.8GHz", "2.8GHzPass";
"2.8GHzCacheFail":
"Cache Fails at2.8GHz","2.8GHzFail";
"2.8GHzSBFTFail":
"SBFT Fails at 2.8GHz", "2.8GHzFail";
"2.8GHzLeakage":
"Leakages at 2.8GHz", LeakageFail;
}
}
【０２７２】
上記の例では、複数の最も基本的なベースビンはBinGroup HardBinsである。いくつかの他のBinGroupがＸのリファインメントである場合には、BinGroupXは、ベースビンのグループであると言われる。したがって、BinGroup SoftBinsは複数のHardBinsのリファインメントであるので、BinGroup HardBinsはベースビンのグループである。複数のSoftBinsのビンはリーフビンと呼ばれる。他のBinGroupがＹのリファインメントでない場合には、BinGroupYは、リーフビンのグループであると言われる。
【０２７３】
その中にただ１つのBinGroupZを有するBinDefsブロックの悪化した事例は、最も基本的な複数のベースビンのグループ、ならびにリーフビンのグループであるようなＺを有するであろう。BinGroup名は、その範囲がグローバルである。任意の数のBinDefsブロックが存在することができるが、宣言された複数のBinGroupsは識別できなければならない。１つのBinDefsブロックからのBinGroupは、別のBinDefsブロックからのBinGroupのリファインメントであることを許される。したがって、上記の例では、複数のSoftBinsは、複数のHardBinsからの別個のBinDefsブロック内に存在することができる。しかしながら、読みやすくするために、全てのBinGroupsが定義されているただ１つのBinDefsブロックを有することが強く推奨される。
【０２７４】
ここで、合格したＤＵＴの数及び不合格のＤＵＴの数をカウントするために、別のBinGroupを追加することにより、上記の階層を拡張することができる。
【０２７５】
# -------------------------------------------------------------
File CHIPbins.bdefs
# -------------------------------------------------------------
Version 1.2.3;
BinDefs
{
# The PassFailBins are an outermost level of
# bins. They are not a refinement of any other
# bins.
BinGroup PassFailBins
{
Pass: "Count of passing DUTS.";
Fail: "Count of failing DUTS.";
}
# The HardBins are a next level of refinement.
# HardBins are a refinement of the PassFailBins,
# as indicated by "HardBins : PassFailBins".
BinGroup HardBins : PassFailBins
{
"3GHzPass": "DUTs passing 3GHz", Pass;
"2.8GHzPass": "DUTs passing 2.8GHz", Pass;
"3GHzFail": "DUTs failing 3GHz", Fail;
"2.8GHzFail": "DUTs failing 2.8GHz", Fail;
LeakageFail: "DUTs failing leakage", Fail;
}
# The SoftBins are a next level of refinement.
# SoftBins are a refinement of HardBins.
BinGroup SoftBins : HardBins
{
"3 GHzAllPass" :
"Good DUTs at 3GHz", "3GHzPass";
"3 GHzCacheFail":
"Cache Fails at 3GHz", "3GHzFail";
"3 GHzSBFTFail":
"SBFT Fails at 3GHz", "3GHzFail";
"3GHzLeakage":
"Leakages at 3GHz", LeakageFail;
"2.8GHzAllPass":
"Good DUTs at 2.8GHz", "2.8GHzPass";
"2.8GHzCacheFail":
"Cache Fails at2.8GHz", "2.8GHzFail";
"2.8GHzSBFTFail":
"SBFT Fails at 2.8GHz", "2.8GHzFail";
"2.8GHzLeakage":
"Leakages at 2.8GHz", LeakageFail; 
}
}
【０２７６】
今度は、複数の最も基本的なベースビンがBinGroup PassFailBinsである。それらは典型的には任意のビンのリファインメントではない。BinGroup HardBinsは複数のPassFailBinsのリファインメントであり、ベースビンでもある。複数のSoftBinsは複数のHardBinsのリファインメントであり、リーフビンのグループである。上記の例は、その階層内に３つのBinGroupしか持たない。以下は、さらに複雑な階層である。
【０２７７】
BinDefs
{
# A group of most base bins
BinGroup A { ... }
# A group of base bins that is a refinement of A
BinGroup Ax : A { ... }
# A group of leaf bins that is a refinement of Ax
BinGroup Axx : Ax { ... }
# A group of base bins that is a refinement of A
BinGroup Ay : A{ ...}
# A group of leaf bins that is a refinement of Ay
BinGroup Ayy : Ay { ... }
# A group of most base bins
BinGroup B { ... }
# A group of leaf bins that is a refinement of B
BinGroup Bx : B { ... } 
}
【０２７８】
この例では、Ax及びAyはAのリファインメントであり、AxxはAxのリファインメントであり、AyyはAyのリファインメントである。この例は、BinGroupB及びBxも提供し、BxはBのリファインメントである。PassFailBins、HardBins及びSoftBinsと名前を付けられたBinGroupを有する上記のBinDefs宣言は、このセクションにおいて、継続的な例として用いられるであろう。
【０２７９】
１つのBinGroup内の各ビンは、
１．識別子又はストリングリテラルのいずれかである名前と、
２．このビンが何を要約するかを記述する記述と、
３．このビンがリファインメントBinGroup内にある場合には、それがリファインメントであり、ベースビンとしても知られているビンの名前とを有する。
【０２８０】
複数のPassFailBin内の２つのビンは「Pass」及び「Fail」と名前を付けられる。複数のHardBin内の５つのビンは、「3GHzPass」、「2.8GHzPass」、「3GHzFail」、「2.8GHzFail」、「LeakageFail」と名前を付けられる。ビン名は、リテラルストリング、又は識別子にすることができる。ビン名は１つのBinGroup内で固有でなければならないが、複数のBinGroupにわたって繰り返されることができる。しかしながら、BinGroup名は、範囲がグローバルであり、１つの試験計画にわたって固有でなければならない。
【０２８１】
５つのHardBinのうち、ビン「3GHzPass」及び「2.8GHzPass」はいずれも、PassFailBinの「Pass」ビンにマッピングする。複数のHardBinのうちの残りはPassFailBinのうちの「Fail」ビンにマッピングする。
【０２８２】
最後に、８つのSoftBinが存在する。ＳＢＦＴ（ソフトビン機能試験）及びCacheの場合の3GHzにおける２つの不合格は「3GHzFail」HardBinにマッピングする。同様に、ＳＢＦＴ及びCacheの場合の2.8GHzにおける２つの不合格は「2.8GHzFail」HardBinにマッピングする。Leakageに起因する不合格はいずれも、それらが生じた速度にかかわらず、同じ「LeakageFail」HardBinにマッピングする。たとえば、最も粗い（最も外側のレベルでの）試験は、１つのＤＵＴが試験に合格するか、不合格であるかである。たとえば、リファインメントは、そのＤＵＴが特定の周波数、たとえば３ＧＨｚ等で、試験に合格するか、不合格であるかである。
【０２８３】
ビンは以下に述べるようにTest Plan FlowItem内のＤＵＴに割り当てられる。TestPlan FlowItemはResult Clauseを有し、その中で、試験計画は、１つの試験を実施することから特定の結果が戻される結果として行われるべき動作及び遷移を記述する。この時点で、SetBinステートメントが生じることができる。
【０２８４】
# A FlowItem Result clause. It is described later.
Result 0
{
# Action to be taken on getting a 0 back from
# executing a test.
# Set the bin to SoftBin."3GHZPass" expressing that the
# DUT was excellent.
SetBin SoftBins."3GHzPass";
}
【０２８５】
多くのSetBinステートメントは、１つのＤＵＴにおける試験を実行している過程において実行することができる。その試験が最終的に完了するとき、ランタイムは、そのＤＵＴのためにセットされた最終的なビン、及び全てのそのリファインメントのためのカウンタをインクリメントするであろう。その試験の過程において実行される以下のSetBinステートメントを有するＤＵＴについて考える。
【０２８６】
SetBin SoftBins."3GHzSBFTFaiI";
SetBin SoftBins."2.8GHzAllPass";
【０２８７】
このＤＵＴは3GHz Cache及びLeakage試験に合格したが、ＳＢＦＴ試験には不合格であったので、「3GHzSBFTFail」ビンに割り当てられる。その後、2.8GHzにおいて試験され、全ての試験に合格した。したがって、最終的なビン割当ては、「2.8GHzAllPass」ビンに対してなされ、それは、１組のSoftBinの中にある。この最終的な割当ては、以下のビンのカウンタをインクリメントするであろう。
１．複数のSoftBin「2.8GHzAllPass」
２．複数のHardBinのリファインメント「2.8GHzPass」
３．複数のPassFailBinのリファインメント「Pass」
【０２８８】
その試験が完了するとき、ランタイムは、ＤＵＴの最終的なビン割当て、及びそれがリファインメントである全ての他のビンのためのカウンタをインクリメントするであろう。
【０２８９】
SetBinステートメントはリーフビンにおいてのみ許される。ベースビンをセットすることは違法である。上記のカウンタインクリメントの意味は、以下のことを仮定する。
１．ビンがリーフビンである場合には、それは、１つのＤＵＴの試験の終了時にこのビンのためにSetBinステートメントが実行された回数である。
２．ビンがベースビンである場合には、それは、それがリファインメントであるビンのカウンタの和である。
【０２９０】
こうして、上記の例では、１つのSetBinステートメントにおいて、SoftBinだけが許される。複数のHardBin「LeakageFail」のためのカウンタは、複数のSoftBin「3GHzLeakageFail」及び複数のSoftBin「2.8GHzLeakageFail」のためのカウンタの和である。以下はビン定義に関するいくつかの規則である。
１．BinDefinitions宣言はいくつかのBinGroup宣言から構成される。
２．各BinGroup宣言は、名前と、それがリファインメントであるオプションのBinGroup名と、それに続くビン宣言のブロックとを有する。
各BinGroup宣言は、名前と、それがリファインメントであるオプションのBinGroup名と、それに続くビン宣言のブロックとを有する。
３．ビン宣言は、名前と、それに続く記述と、オプションでそれに続く、このビンがリファインメントであるベースビンの名前とを含む。
４．ビン名はストリングリテラル又はＩｄにすることができる。空ストリングは有効なビン名にすべきではない。ビン名は、BinGroup宣言内の名前の中で固有であるべきであるが、他のBinGroup宣言において同じ名前を用いることができる。
５．BinGroup宣言Xxxが別のBinGroup宣言Ｙｙｙのリファインメントである場合には、Xxx内の全てのビン宣言は、Yyyからのベースビンの名前を宣言しなければならない。したがって、複数のSoftBinは複数のHardBinのリファインメントであることを宣言されるので、複数のSoftBin内の各ビン宣言は複数のHardBinのビンのリファインメントである。
６．PassFailBinのような、別のBinGroup宣言のリファインメントでないBinGroup宣言は、ベースビンを宣言しないBin宣言を有することが好ましい。
【０２９１】
ビンBbbは、Bbbがそのリファインメントである完全な１組のビンである１組のベースを有する。正式には以下のように定義される。
１．AaaがBbbのベースビンである場合には、AaaはBbbの１組のベース内にある。
２．Aaaの任意のベースもBbbの１組のベース内にある。
【０２９２】
BinGroup名は１つのTestPlanにおいてグローバルである。
【０２９３】
ビン名は１つのBinGroupに対してローカルである。
【０２９４】
SetBinステートメントはリーフビンの場合にのみ許される。
【０２９５】
［ビン定義のためのＣ＋＋］
上記の規則を用いて、１つのオブジェクトタイプBinGroupを、BinDefs宣言内のBinGroup宣言毎に構成することができる。クラスBinGroupはサブクラスLeafBinGroupを有するであろう。これらの２つのクラスの演算は同じであるが、BinGroup::incrementBinがC++保護演算であるのに対して、LeafBinGroup::incrementBinがC++公開演算であることを除く。
【０２９６】
以下は、他のどのBinGroupのリファインメントでもないBinGroup又はLeafBinGroupを構築するデフォルトコンストラクタである。
【０２９７】
以下のコンストラクタは、所与のベースBinGroupのリファインメントであるBinGroupを構築する。
【０２９８】
BinGroup(BinGroup& baseBinGroup);
LeafBinGroup(BinGroup& baseBinGroup);
【０２９９】
以下のメソッドは１つのビン及びその記述を定義する。
【０３００】
Status addBin(const String& binName,
const String& description,
const String& baseBinName); 
【０３０１】
それが最も基本的なベースビンである場合には、ベースBinNameパラメータは空ストリングでなければならない。
【０３０２】
ビンカウンタをインクリメントするためのメソッド。
【０３０３】
Status incrementBin(const String&binName);
【０３０４】
この演算は、このビン、及びこのビンのベースである全てのビンのためのカウンタをインクリメントするであろう。その演算はクラスBinGroupにおいて保護され、クラスLeafBinGroupにおいて公開される。
【０３０５】
ビンカウンタをリセットするためのメソッド。
【０３０６】
Status resetBin(const String&binName);
【０３０７】
この演算は、このビン、及びこのビンのベースである全てのビンのためのカウンタをリセットするであろう。
【０３０８】
１つのビンについての情報をゲットするためのメソッド。
【０３０９】
Status getBinDescription(const String& binName,
String& description);
Status getBaseBin(const String& binName,
BinGroup* pBaseBinGroup,
String& baseBinName);
Status getBinValue(const String& binName,
unsigned int& value);
【０３１０】
現在定義されている全てのビン名を知るために繰返し子が与えられるであろう。
【０３１１】
TestPlan状態は、BinGroup宣言毎に１つの、多数のBinGroupメンバを含むであろう。上記のBinDefinitionのためのＣ＋＋は以下のようになるであろう。
【０３１２】
// TestPlan constructor
TestPlan::TestPlan()
:m_PassFailBins, // Default Constructor
m_HardBins(&m_PassFaiIBins),
m_SoftBins(&m_HardBins)
{}
// Bin initializations
m_PassFailBins.addBin("Pass", "Count of passing DUTS.","");
m_PassFailBins.addBin("Fail", "Count of failing DUTS.","");
m_HardBins.addBin("3GHzPass", "Duts passing 3GHz", "Pass");
...
【０３１３】
１つのTestPlanのための状態は、未定義のBinGroup(NULL)に初期化されるm_pCurrentBinGroupと未定義のビン名（空ストリング）に初期化されるm_currentBinとを含む。SetBinステートメントが実行される度に、１つのコールによって、m_pCurrentBinGroupが指示された名前付きBinGroupに変更され、m_currentBinがグループ内の名前付きビンに変更される。
【０３１４】
// Translation of: SetBin SoftBins."3GHzAllPass";
pTestPlan->setBin("SoftBins", "3GHzAllPass");
【０３１５】
試験計画が実行を完了するとき、その試験計画は以下をコールして、このビン及び全てのそのベースビンのカウンタがインクリメントされるようにする。
m_pCurrentBinGroup->incrementBin(m_currentBin);
【０３１６】
BinGroupカウンタは、試験計画がエラボレートされるときにリセットされるが、試験が実行される度に再初期化されない。カウンタは、BinGroup::resetBinへの明示的なコールによってリセットすることができる。
【０３１７】
［Ｃ．試験計画］
試験計画は、試験プログラムの主要構造と考えることができる。試験計画はファイルをインポートし、類似のコンストラクツインラインを定義することができる。こうして、いくつかのグローバルの定義を与えられたファイルをインポートし、付加的なグローバルズインラインを宣言することができる。
【０３１８】
［Ｃ１．Test Plan Flow及びFlowItem］
試験計画の重要な要素のうちの１つはFlowである。Flowは、有限状態機械をカプセル化する。それはいくつかのFlowItemを含み、それらのFlowItemはIFlowableオブジェクトを実行し、その後、別のフロー項目に遷移する。IFlowableを実行することは、IFlowableインターフェースをインプリメントするオブジェクトを実行することを含む。IFlowableインターフェースをインプリメントする一般的なオブジェクトはTest及びFlowそのものである。
【０３１９】
こうして、１つのFlowは、Test及び他のFlowを実行し、その後、別のFlowItemへの遷移を実行するFlowItemを有する。それは、１つのIFlowableを実行することに起因する種々のリターン結果において、ユーザがカスタマイズしたルーチンをコールするための機会も提供する。典型的には、こうして、Flowは以下の形式を有する。
【０３２０】
#
# FlowTest1 implements a finite state machine for the
# Min, Typ and Max flavors of MyFunctionalTest1. On
# success it testsTest1Min, Test1Typ,Test1Max 
# and then returns to its caller with 0 as a successful
# status. On failure, it returns 1 as a failing status.
#
# Assume that the testsMyFunctionalTest1Min, ... all
# return a Result of 0 (Pass), 1 and 2(for a couple
# of levels of failure).
#            Result 0   Result 1   Result 2
# Test1Min   Test1Typ  return 1   return 1
# Test1Typ   Test1Max   return 1   return 1
# Test1Max   return 0   return 1   return 1
#
Flow FlowTest1
{
FlowItem FlowTest1_Min MyFunctionalTest1Min
{
Result 0
{
PropertyPassFail = "Pass";
IncrementCounters PassCount;
GoTo FlowTest1_Typ;
}
Result 1
{
Property PassFail = "Fail";
IncrementCounters FailCount;
Return 1;
}
# This result block will be executed if
# MyFunctionalTest1Min returns any of
# 2, 5, 6, 7,-6, -5 or-4
Result 2, 5:7, -6:-4 
{
Property PassFail = "Fail";
IncrementCounters FailCount;
Return 1;
}
}
FlowItem FlowTest1_Typ { ... }
FlowItem FlowTest1_Max { ... } 
}
【０３２１】
フローFlowTest1の演算は以下の通りである。
１．FlowItem FlowTest1_Minを実行することで開始する。
２．FlowTest1_Minは機能試験、MyFunctionalTest1Minを実行する。この試験の詳細は、後に完全な試験計画が提示されるときに与えられる。
３．この試験を実行することから、９つの結果、０、１、２、５、６、７、−６、−５又は−４が予想される。最初の２つのResult句はそれぞれ０及び１を処理し、第３の句は結果値の残り全てを処理する。
４．結果「０」（合格）が生じる場合には、FlowTest1_MinはカウンタPassCounterをインクリメントするであろう。その後、それは新たなFlowItem FlowTest1_Typに遷移するであろう。
５．結果「１」又は結果「２」が生じる場合には、FlowTest1_MinはカウンタFailCounterをインクリメントし、そのフローから戻るであろう。
６．FlowTest1_Typは同じようにして動作し、成功時にFlowTest1_Maxをコールするであろう。
７．FlowTest1_Maxは同じようにして動作し、成功時に、成功した結果（「０」）でFlowTest1から戻るであろう。
【０３２２】
こうして、FlowTest1は、実行の成功時に、Test1の最小、典型及び最大バージョンを通してデバイスを動かし、その後、戻るであろう。FlowTest2も同じようにして動作するであろう。
【０３２３】
上記のようなFlowは基本的には、状態及び遷移を有する有限状態機械を記述する。FlowItemは基本的には状態であり、それは以下のことを果たすであろう。
１．１つのIFlowableを実行する（それは、以前に定義されたFlow、又はTest、又は上記の規則によってＣ＋＋においてインプリメントされることができるユーザ定義のFlowを用いることができる）。
２．IFlowableの実行は数値結果を返す。その結果に基づいて、ある特定の動作が行われ（いくつかのカウンタを更新する）、その後、２つの事柄のうちの１つが起こる。
ａ．Flowは数値結果にとともにコール元に戻る。
ｂ．Flowは、別の状態(FlowItem)に遷移することにより継続する。
【０３２４】
こうして、１つのFlowItemは以下のコンポーネントを有する。
・１つのFlowItemは１つの名前を有する。
・１つのFlowItemは実行されるべき１つのFlowableを有する。
・１つのFlowItemは数又はResult句を有する。
・１つのFlowItemの各Result句は動作を提供し、１つの遷移で終了し、１つ又は複数の結果値に関連付けられる。
【０３２５】
これらの項目はFlowItem内で構文的に以下のようになる。
【０３２６】
FlowItem <name> <IFlowable to be executed>
{
Result <one or more result values>
{
<actions for these result values>
<transition for these result values>
}
Result<one or more other result values>
{
...
}
...
}
【０３２７】
実行されるべきIFlowableは、Test、又はユーザ定義IFlowable、又はＦｌｏｗのいずれかにすることができる。１つの結果のための動作は、以下に記載される動作のうちの任意のものにすることができる。
・ＧＵＩツールによって用いられるストリング値を有する実体を属性結果にセットするためのプロパティ動作。これは上記のFlowTest1の例において見ることができる。
【０３２８】
Property PassFail = "Pass";
【０３２９】
プロパティは基本的には、１つの結果句に関連付けられる名前付きストリング又は整数値を有する実体である。任意の数のプロパティが存在することができ、プロパティは、この結果に関連する情報を表示するためにユーザが用いることになる、ＧＵＩのようなツールによって用いられることが好ましい。プロパティは、試験の実際の結果、すなわち試験のフローに影響を及ぼさない。
【０３３０】
いくつかの数のカウンタをインクリメントするためのカウンタ動作。これは上記の例において見ることができる。
【０３３１】
IncrementCounters PassCount;
・任意の、又はユーザルーチンをコールするためのルーチンコール動作。これは後に説明される。
【０３３２】
最後に、FlowItemは、別のFlowItemに制御を渡すためのGoToステートメント、又はコール元（コール処理フロー、又は試験計画を開始したシステムルーチンのいずれか）に制御を戻すためのReturnステートメントのいずれかにすることができる遷移を有する。
【０３３３】
［予め定義されたFlow］
Ｆｌｏｗオブジェクトの典型的な使用法は、Testのシーケンスを定義することである。その後、このシーケンスは、試験計画サーバ（ＴＰＳ）において生じるイベント、すなわちExecute Test Planイベントの結果として実行される。各サイトコントローラ上にある試験計画サーバが、ユーザの試験計画を実行する。しかしながら、Ｆｌｏｗオブジェクトは、他のイベントに応答しても実行される。括弧内の名前は、Ｆｌｏｗをこれらのイベントに割り当てる際に用いられる名前である。
１．System Load Flow(SysLoadFlow)。このFlowは、１つの試験計画が１つ又は複数のサイトコントローラにロードされるときに、システムコントローラ上で実行される。それは、任意のサイトコントローラ上に試験計画を実際にロードする前に実行される。このフローによって、試験計画開発者は、システムコントローラを起源とすべきである動作を定義できるようになる。そのような動作は、パターンファイルのブロードキャストロード、較正動作等を含む。
２．Site Load Flow(SiteLoadFlow)。このFlowは、１つの試験計画がサイト上にロードされ、初期化された後に、サイトコントローラ上で実行される。これにより、任意のサイト特有の初期化を行うことができる。
３．Lot Start/End Flow(LotStartFlow/LotEndFlow)。これらのFlowは、試験計画サーバが新たなロットの開始を通知されるときに、サイトコントローラ上で実行される。これは典型的には、データログストリームにロット特有の情報で注釈を付すために製造環境において用いられる。
４．DUT Change Flow(DutChangeFlow)。このFlowは、そのＤＵＴ情報が変化するときに、サイトコントローラ上で実行される。再び、これは典型的には、アナログストリームを更新するために製造環境において用いられる。
５．TestPlan Start/End Flow(TestPlanStartFlow/TestPlanEndFlow)。これらのFlowは、試験計画サーバが、現在のTest Flowを実行し始めるように指示されるとき、及びそのフローがその実行を終了するときに、サイトコントローラ上で実行される。
６．Test Start/End Flow(TestStartFlow/TestEndFlow)。これらのFlowは、Test Flowが新たなTestを実行し始めているとき、及びそのTestがその実行を終了するときに、サイトコントローラ上で実行される。
７．Test Flow(TestFlow)。このFlowは、試験計画サーバが「Execute Test Plan」メッセージを受信するときに実行される主要Flowオブジェクトであることに留意されたい。
【０３３４】
ユーザが、TestFlowでないか、又は他の所定のフローのうちの１つでない、ユーザの試験計画内の１つのFlowを定義する場合には、それを実行させるための好ましい方法は、これらの所定のフローのうちの１つの遷移状態内にそれを含むことであることに留意されたい。
【０３３５】
［試験計画例］
以下の例では、フローによってインプリメントされる有限状態機械を記述するコメントとともにFlowが与えられる。その有限状態機械は、遷移行列として与えられる。その行列の行はFlowItemに対応し、列は結果に対応する。その行列の１つの行のエントリは、返された結果が列において指定された値であるときに、その行のFlowItemから遷移されるFlowItemを指示する。
【０３３６】
３つのフロー、FlowTest1、FlowTest2及びFlowMainを有する試験計画が以下に示される。FlowTest1は先に説明されたように動作するであろう。それは、「min」、「typ」及び「max」の各構成において、MyFunctionalTest1と名前を付けられた試験を実行するであろう。同様に、FlowTest2は、これらの各構成において、MyFunctionalTest2を実行するであろう。最後に、FlowMainは、FlowTest1及びFlowTest2を実行するであろう。これらの各フローの開始時に、コメントにおいて、有限状態機械遷移行列が与えられる。
【０３３７】
# -------------------------------------------------------------
# File mySimpleTestPlan.tpl
# -------------------------------------------------------------
Version 0.1;
Import xxx.pin;   # Pins
# Constants and variables giving limiting values.
Import limits.usrv;
# Import test condition groups
Import myTestConditionGroups.tcg;
# Import some bin definitions.
Import bins.bdefs;
# -------------------------------------------------------------
# Start of the test plan
# -------------------------------------------------------------
TestPlan Sample;
# This block defines Pattern Lists file-qualified names and
# Pattern List variables that are used in Test declarations.
# Pattern list variables are deferred till customization is 
# examined.
PListDefs
{
# File qualified pattern list names
pllA.plist:patlAlist,
pl2A.plist:pat2AList
}
# The socket for the tests in this test plan (this is not imported,
# but resolved at activation time):
SocketDef = mytest. soc;
# Declare some user variables inline
UserVars
{
# String name for current test
String CurrentTest ="MyTest";
}
TestConditionTClMin
{
TestConditionGroup = TCG1;
Selector = min;
}
TestCondition.TClTyp 
{
TestConditionGroup = TCG1;
Selector = typ;
}
TestCondition TC1Max
{
TestConditionGroup = TCG1;
Selector max;
}
# Likewise for TC2Min, TC2Typ, TC2Max ...
#
# Declare a FunctionalTest. "FunctionalTest" refers to a C++
# test class that runs the test, and returns a 0,1 or 2 as
# a Result. The Test Condition Group TCG1 is selected with
# the "min" selector by referring to theTClMin TestCondition.
#
Test FunctionalTest MyFunctionalTest1Min
{
PListParam = patlAList;
TestConditionParam =TClMin;
}
# Another FunctionalTest selecting TCG1 with "typ"
Test FunctionalTestMyFunctionalTest1Typ
{
PListParam = patlAList;
TestConditionParam = TC1Typ;
}
# Another FunctionalTest selecting TCG1 with "max"
Test FunctionalTest MyFunctionalTest1Max
{
PListParam = patlAList;
TestConditionParam = TC1Max;
}
# Now select TCG2 with "min"
Test FunctionalTest MyFunctionalTest2Min
{
PListParam pat2AList;
TestConditionParam = TC2Min;
}
# Likewise for TCG2 with "typ" and TCG2 with "max"
Test FunctionalTest MyFunctionalTest2Typ
{
PListParam patlAList;
TestConditionParam = TC2Typ;
}
Test FunctionalTest MyFunctionalTest2Max
{
PListParam patlAList;
TestConditionParam = TC2Max;
}
#
# At this time the following Test objects have been defined
#   MyFunctionalTest1Min
#   MyFunctionalTest1Typ
#   MyFunctionalTest1Max
#   MyFunctionalTest2Min
#   MyFunctionalTest2Typ
#   MyFunctionalTest2Max
#
#
# Counters are variables that are incremented during the
# execution of a test. They areUnsignedIntegers that are
# initialized to zero.
#
Counters {PassCount, FailCount}
#
# Flows can now be presented. A Flow is an object that
# essentially represents a finite state machine which
# can execute "Flowables", and transition to other flowables based
# on the Result returned from executing a Flowable. A Flow can also
# call another flow.
#
# A Flow consists of a numberof FlowItems and transitions
# between them.FlowItems have names which are unique in
# the enclosing Flow, execute a "Flowable" object, and then
# transition to another FlowItem in the same enclosing Flow.
#
# Flowable objects include Tests and other Flows. When
# a Flowable object executes, it returns a numeric Result
# which is used by the FlowItem to transition to another
# FlowItem. As a result of this, both Tests and Flows
# terminate by returning a numeric Result value.
# 
# FlowTest1 implements a finite state machine for the
# Min, Typ and Max flavors of MyFunctionalTest1 . On
# success it tests Test1Min,Test1Typ, Test1Max
# and then returns to its caller with 0 as a successful
# Result. On failure, it returns 1 as a failing Result.
#
# Assume that the testsMyFunctionalTest1Min, ... all
# return a Result of 0 (Pass), 1 'and 2 (for a couple
# of levels of failure). The Transition Matrix of the
# finite state machine implemented by FlowTest1 is:
# -------------------------------------------------------------
#       Result 0      Result 1      Result 2
# -------------------------------------------------------------
# FlowTest1_Min   FlowTest1_Typ   return 1   return 1
# FlowTest1_Typ   FlowTest1_Max   return 1   return 1
# FlowTest1_Max   return 0         return 1    return 1
#
# where the IFlowables run by each FlowItem are:
#   FlowItem   IFlowable that is run 
#   FlowTest1_Min   MyFunctionalTest1Min
#   FlowTest1_Typ   MyFunctionalTest1Typ
#   FlowTest1_Max   MyFunctionalTest1Max
#
Flow FlowTest1
{
FlowItem FlowTest1_Min MyFunctionalTest1Min
{
Result 0
{
PropertyPassFail = "Pass";
IncrementCounters PassCount;
GoTo FlowTest1_Typ;
}
Result 1,2
{
PropertyPassFail = "Fail";
IncrementCounters Fail Count;
Return 1;
}
}
FlowItem FlowTest1_Typ MyFunctionalTest1Typ
{
Result 0
{
PropertyPassFail = "Pass";
IncrementCounters PassCount;
GoToFlowTest1_Max;
}
Result 1,2
{
PropertyPassFail ="Fail";
IncrementCountersFaiICount;
Return 1;
}
}
# Likewise for FlowTest1_Max
FlowItem FlowTest1_Max MyFunctionalTest1Max
{
Result 0
{
PropertyPassFail = "Pass";
IncrementCounters PassCount;
Return 0;
}
Result 1,2
{
PropertyPassFail = "Fail";
IncrementCountersFailCount;
Return 1;
}
}
}
#
# FlowTest2 is similar to FlowTest1. It implements a
# finite state machine for the Min, Typ and Max flavors
# of MyFunctionalTest2. On success it tests Test2Min,
# Test2Typ, Test2Max and then returns to its caller with
# 0 as a successful Result. On failure, it returns 1 as
# a failing Result.
#
# Assume that the testsMyFunctionalTest2Min, ... all
# return a Result of 0 (Pass), 1 and 2 (for a couple
# of levels of failure). The Transition Matrix of the
# finite state machine implemented by FlowTest2 is:
# -------------------------------------------------------------
#                     Result 0         Result 1   Result 2
# -------------------------------------------------------------
#   FlowTest2_Min   FlowTest2_Typ   return 1   return 1
#   FlowTest2_Typ   FIowTest2_Max   return 1   return 1
#   FlowTest2_Max   return 0         return 1   return 1
#
# Where the IFlowables run by eachFlowItem are:
#   FlowItem         IFlowable that is run
#   FIowTest2_Min      MyFunctionalTest2Min
#   FlowTest2_Typ      MyFunctionalTest2Typ
#   FlowTest2_Max      MyFunctionalTest2Max
#
Flow FlowTest2
{
# ...
}
#
# Now the FlowMain, the main test flow, can be presented. It
# implements a finite state machine that calls FlowTest1
# and FlowTest2 as below:
# --------------------------------------------------------
#                  Result 0       Result 1
# --------------------------------------------------------
#   FlowMain_1   FlowMain_2   return 1
#   FlowMain_2   return 0       return 1
#
# Where the IFlowables run by each FlowItem are:
#      FlowItem   IFlowable that is run
#      FlowMain_l   FlowTest1
#      FlowMain_2   FlowTest2
Flow FlowMain
{
# The first declared flow is the initial flow to be
# executed. It goes to FlowMain_2 on success, and
# returns 1 on failure.
FlowItem FlowMain_1 FlowTest1
{
Result 0
{
PropertyPassFail "Pass";
IncrementCounters PassCount;
GoTo FlowMain_2;
}
Result 1
{
# Sorry ... FlowTest1 failed
PropertyPassFail = "Fail";
IncrementCounters FailCount;
# Add to the right soft bin
SetBin SoftBins. "3GHzSBFTFail";
Return 1;
}
}
FlowItem FlowMain_2 FlowTest2
{
Result 0
{
# All passed!
PropertyPassFail = "Pass";
IncrementCounters PassCount;
# Add to the right soft bin
SetBin SoftBins."3GHzAllPass";
Return 0;
}
Result 1
{
# FlowTest1 passed, but FlowTest2 failed
PropertyPassFail = "Fail";
IncrementCounters FailCount;
# Add to the right soft bin
SetBin SoftBins."3GHzCacheFail";
Return 1;
{
}
}
TestFlow = FlowMain; 
【０３３８】
上記の試験計画は、好ましい順序で以下のように構成される。
１．最初に、バージョン番号が与えられる。この番号を用いて、コンパイラバージョンの互換性が確保される。
２．その後、多数のインポートが宣言される。これらは、その試験計画において用いられる名前を分解するために必要とされる宣言を有する種々のファイルである。
３．次に、試験計画名が宣言され、その後、試験計画のインライン宣言を行う。
４．次に、１組のPListDefsが宣言される。これらは、名前付きファイルからGlobalPListsの名前を付ける、ファイル修飾付きの名前を含む。それらは、パターンリスト変数も含む。パターンリスト変数は、実行時にcustom flowableにおいて初期化されることができる変数である。それらは、ランタイムまで、試験と実際のパターンリストとの結合を遅らせる手段を提供する。
５．次に、１組のUserVarsが宣言される。これらはストリングを含む。
６．その後、合格した試験及び不合格の試験の数を判定するために、いくつかのカウンタが宣言される。カウンタは変数に過ぎず、初期化されて０になり、IncrementCounterステートメントにおいてインクリメントされる。それらは、１つのＤＵＴの試験の終了時に現在セットされているビンだけがインクリメントされるという意味を有する、先に説明されたＢｉｎとは異なる。
７．次に、一連のTest Conditionが宣言される。これらはそれぞれ、Test Condition Group及びセレクタを指定する。この例では、Test Condition Groupは、mytestconditionsgroup.tcgからもたらされる。しかしながら、それらは試験計画においてインラインにすることができる。
８．次に、一連のFlowable又はTestが宣言される。これは、パターンリスト及び試験条件を選択する既知のTest FunctionalTestである。こうして、たとえば、MyFunctionalTest1Maxは、試験条件TC1Max及びパターンリストを選択する。
９．この後に、３つのフロー、FlowTest1、FlowTest2及びFlowMainが宣言される。FlowはFlowableを実行する。Flowableは、Test（MyFunctionalTest1Max等）及び他のフロー（FlowTest1及びFlowTest2等）を含む。FlowTest1及びFlowTest2はそれぞれ、Test1及びTest2の最小、典型及び最大バージョンを通る。フローFlowMainは、先に宣言されているフロー、FlowTest1及びFlowTest2をコールする。
１０．最後に、TestFlowイベントがFlowMain Flowに割り当てられる。したがって、フローFlowMainは、ユーザがこの計画を実行しようするときに、この試験計画によって実行されることになるフローである。
【０３３９】
［FlowのためのＣ＋＋］
上記の規則を用いて、Flowそのものを除いて、要素の大部分のためのC++インプリメンテーションを果たすことができる。
【０３４０】
［FlowItemのためのＣ＋＋］
FlowItemを表すためのC++クラスは以下のインターフェースを有することができる。
・このFlowItemのために実行されることになるIFlowableをセットすることになる演算。
【０３４１】
StatussetFlowable(IFlowable* pIFlowable);
【０３４２】
一旦、このIFlowableを実行するための必要とされる１組のコールからFlowItemが戻ったなら、それは、Result値に応じて、カウンタのリストをインクリメントする必要がある。これを果たすために、FlowItemは、インクリメントされることになるカウンタのベクトルを有する必要がある。これは以下のコールによって初期化される。
【０３４３】
Status setCounterRefs(unsigned int result,
CounterRefList counterRefs) ;
【０３４４】
これをコールすることにより、カウンタへの参照のベクトルがFlowItem内に設定され、結果として、一旦、IFlowableが実行を完了したなら、それはそれらのカウンタをインクリメントできるようになる。たとえば、ステートメントIncrementCounters  Ａ，Ｂ，Ｃは、以下のように上記のコールを用いることが好ましいであろう。
【０３４５】
// Somewhere earlier
CounterRefList counters;
...
// Code for Result clause
// Result 2, 3 {...}
// of flowobject.
counters.reset();
counters.add(&A);
counters.add(&B);
counters.add(&C);
flowObject.setCounterRefs(2, counters) ;
flowObject.setCounterRefs(3, counters) ; 
【０３４６】
カウンタで名前を付けられた一時的なCounterRefListオブジェクトが用いられる。最初に、counters.reset()がコールされ、その後、多数のcounters.add()をコールして、カウンタリストが設定される。その後、これを用いて、結果値２及び３のために更新されることになるカウンタアドレスのベクトルが設定される。
【０３４７】
その後、FlowItemは、特定の結果において別のFlowItemに遷移する必要があり得る。
【０３４８】
Status setTransition(unsigned int result, Flowltem*pFlowItem);
【０３４９】
ある特定のResult句が多数の結果値を取り扱う場合には、必然的にいくつかのそのようなコールが行われる必要があり得る。
【０３５０】
FlowItemは結果を返す必要があり得る。これは以下のコールによって果たされる。
【０３５１】
Status setRetumResult(unsigned int result,
unsigned int returnResult);
【０３５２】
たとえば、以前の例におけるFlowItem FirstFlowItemの場合、上記のコールは、「result」の場合には値「２」で、「returnResult」の場合には「１」でコールされるであろう。
・最後に、FlowItemは演算を実行する必要がある。
【０３５３】
Status execute(unsigned int& result, FlowItem* pNextFlowItem);
【０３５４】
この演算は、IFlowableを実行し、その後、指示されたカウンタを更新し、その後、Result、又は次のFlowItemへのポインタを返すであろう。このポインタがヌルである場合には、その結果は返された値である。
【０３５５】
FlowItem FlowMain_1のために生成されることになるコードは以下の通りである。
【０３５６】
FlowItem FlowMain_l;
FlowItem FlowMain_2;
CounterRefList counters;
FlowMain_1.setFlowable(FIowTest1);
// Result 0
counters.reset();
counters.add(&PassCount);
FlowMain_1.setCounterRefs (0, counters) ;
FlowMain_1.setTransition (0, &FlowMain_2);
// Result 1
counters.reset();
counters.add(&FailCount);
FlowMain_1.setCounterRefs (1, counters) ;
// The following call from ITestPlan will set the 
// current bin group and bin name.
pTestPlan->setBin("SoftBins","3GHzSBFTFaiI");
FlowMain_1.setReturnResult (1, 1) ;
【０３５７】
上で生成されたコードはFlowMain_1を設定し、IFlowable「FlowTest1」を実行し、その後、それを設定して、結果毎にカウンタの適当なリストをインクリメントし、最後に、必要な動作を行う。結果「０」の場合の必要な動作は、FlowMain_1への遷移であり、結果「１」の場合には、リターンである。
【０３５８】
［Ｃ２．TestPlanにおけるカウンタサポート］
カウンタは０に初期化される変数であり、試験実行中の種々の時点において、IncrementCounterステートメントによってインクリメントされることができる。これは、試験の終了時にのみインクリメントされるＢｉｎとは異なる。さらに、ビンは階層的であるのに対して、カウンタは変数に過ぎない。したがって、カウンタはビンよりもはるかに簡単であり、より制限されたファシリティである。
【０３５９】
カウンタは、符号なし整数である１組の名前付きカウンタを保持するCounterクラスのメンバを介して、TestPlanにおいてサポートされることができる。Counter宣言を介して、このクラスにおいてオブジェクトが定義されるであろう。カウンタは試験開始時に自動的にリセットされないので、TestPlanが、数多くのＤＵＴを試験し終えるまでカウントを収集できるようになる。カウンタの値をリセット、インクリメント及び問い合わせるためのメソッドが与えられるであろう。これにより、順番にビンに入れることに対する代替の手段が、試験を実行する結果としてのカウントを判定できるようになる。
【０３６０】
TestPlanはメンバ変数、m_modifiedCountersを含むことが好ましく、そのメンバ変数は、１つのＤＵＴにおいて試験を実行することによって変更される１組のカウンタである。この１組のカウンタは試験の開始時に空集合に初期化される。各場所において、IncrementCountersコールが行われ、コードが生成されて、名前付きカウンタをm_modifiedCounterメンバに追加するであろう。こうして、このメンバは、１つのＤＵＴで試験を実行中に変更された全てのカウンタを集める。
【０３６１】
［FlowオブジェクトのためのＣ＋＋］
一旦、全てのFlowItemが作成されたなら、Flowオブジェクトは、以下に示されるように、C++オブジェクトとして作成されることができる。
・FlowItemを追加するための演算。
【０３６２】
Status addFlowItem(FlowItem* pFlowItem, bool isInitalFlowItem);
【０３６３】
その演算は、指示されたFlowItemをそのFlowに追加するであろう。これがFlowの初期FlowItemである場合には、ブーリアンが真にセットされる。
・Ｆｌｏｗを実行するための演算。
【０３６４】
Status executeFlow(unsigned int& result);
【０３６５】
これは、そのフローを実行する結果として、Flowが戻るときに戻ることが好ましい。この動作は、初期FlowItemでそのフローを実行し始めることである。それは、現在のFlowItemが実行すべき次のFlowItemを返す限り、FlowItemを実行し続けるであろう。現在のFlowItemが結果を返すとき、この演算は、その結果で完了する。
【０３６６】
それゆえ、１つのFlowのために生成されるC++コードは、そのFlowにFlowItemを追加するために、addFlowItem()へのコールを何度か繰り返す。executeFlow()演算は、TestPlan内のこのFlowが実行するために選択されるときに生じるであろう。
【０３６７】
［Ｃ３．Ｔｅｓｔクラス］
一般に、プログラムコードの大部分はデバイス試験のためのデータであり、残りは、試験方法を実現する試験プログラムのコードである。このデータはＤＵＴに依存する（たとえば、電源条件、信号電圧条件、タイミング条件等）。試験コードは、ＡＴＥハードウエアに指定されたデバイス条件をロードするためのメソッドと、ユーザによって指定された目的（データロギング等）を実現するために必要とされるメソッドから構成される。
【０３６８】
先に説明されたように、試験コードの再利用性を高めるために、そのようなコードは任意のデバイス固有データ（たとえば、ピン名、刺激データ等）、又はデバイス試験固有のデータ（たとえば、ＤＣユニットのための条件、測定ピン、ターゲットピンの数、パターファイルの名前、パターンプログラムのアドレス等）とは無関係であるべきである。１つの試験のためのコードがこれらのタイプのデータとコンパイルされる場合には、その試験コードの再利用性は低下するであろう。それゆえ、任意のデバイス固有のデータ又はデバイス試験固有のデータは、コード実行時の入力として、その試験コードが外部から入手できるようにすべきである。
【０３６９】
オープンアーキテクチャ試験システムでは、ITestインターフェースの１つのインプリメンテーションであるTestクラスが、特定のタイプの試験のための試験データとコードとの分離を（それゆえ、コードの再利用性を）実現する。そのような試験クラスは、それの別個のインスタンスのための「テンプレート」と見なすことができ、デバイス固有のデータ及び／又はデバイス試験固有のデータに基づいてのみ互いとは異なる。試験クラスは、試験計画ファイルにおいて指定される。各試験クラスは典型的には、ある特定のタイプのデバイス試験又はデバイス試験のための設定をインプリメントする。たとえば、機能的なＡＣ及びＤＣパラメータ試験は、別個の試験クラスによってインプリメントされることが好ましい。しかしながら、カスタム試験クラスも試験計画において用いることができる。
【０３７０】
試験クラスによって、ユーザは、その試験の特定のインスタンスのためのオプションを指定するために用いられるパラメータを与えることにより、クラス挙動を構成できるようになる。たとえば、１つの機能試験は、パラメータＰリスト及びTestConditionsを取り込み、実行すべきパターンリスト、ならびにその試験のためのレベル及びタイミング条件をそれぞれ指定するであろう。これらのパラメータのために異なる値を指定することにより（試験計画記述ファイル内の異なる「Test」ブロックを用いることによる）、ユーザは、１つの機能試験の種々のインスタンスを作成できるようになる。図５は、ただ１つの試験クラス５０４から異なる試験インスタンス５０２が如何に導出されることになるかを示す。
【０３７１】
これらの試験クラスは、コンパイラ４００が試験及び試験のパラメータの記述を試験計画ファイルから取り込み、正確なC++コードを生成できるようになり、そのC++コードがコンパイル及びリンクされて、試験プログラムを生成することができるように設計されるべきである。試験クラスインスタンスを、試験フローを記述するオブジェクトに追加して、デバイス試験の複雑な実行シーケンスを作成することができる。
【０３７２】
［Ｃ４．ITest及びIFlowableからの導出］
先に述べられたように、試験クラスはITestから派生する。上記の規則を用いて、これらは、ITestインターフェースをインプリメントするC++クラスにおいてインプリメントされることができる。ITestインターフェースのための指定されるメソッドに加えて、これらのクラスは、デバイス試験の特定のクラスを実行するために必要とされるTest固有のインテリジェンス及びロジックを提供する。また試験クラスはIFlowableインターフェースもインプリメントする。この結果として、Testクラスのインスタンスは、試験を実行するためにFlowItemにおいて用いることができる。
【０３７３】
［カスタマイゼーション］
ユーザがＣ関数をコールできるようにし、ITest及びIFlowableインターフェースをインプリメントする自らのクラスを開発できるようにするために、カスタマイゼーションの仕組みが提供される。
【０３７４】
［プリヘッダ］
ＴＰＬは、試験システムにおいて試験クラスを定義するための汎用の仕組みを提供する。試験技師はこの仕組みを用いて、付加的なファシリティを用いることなく、試験システムによってロードされ、且つ使用されることができるカスタム試験クラスを作成することができる。試験技師は、上記のITest及びIFlowableインターフェースをインプリメントする自らの試験クラスを開発することもできる。プリヘッダは、Ｃ＋＋言語に対してイントロスペクション能力を与えることにより、カスタム試験クラスの機能をサポートする。
【０３７５】
１つの試験クラスのオブジェクトが、そのメソッド及びシグネチャに関して問合せを受けることができる場合には、そのオブジェクトは、生成されるソースコード内に包含するのに適したパラメータが入手できることを検証されることができる。そのような特徴は、翻訳段階における誤り検査及び妥当性検査のために極めて有用であろう。試験技師がパラメータの名前、又はこれらのパラメータへの引き数の数（又はおそらくタイプ）を間違った場合には、C++コンパイラからのコンパイル時エラーメッセージを待つ代わりに、翻訳段階において、この間違いが見つけられて、翻訳時に意味のあるエラーメッセージを生成することができる。
【０３７６】
イントロスペクションは、オブジェクトに自らの内部を探索し、その属性及びメソッドに関する情報を返すように求める能力を指している。Ｊａｖａのようないくつかの言語は、その言語の一部としてこの能力を提供する。ビジュアルベーシックのような他の言語は、それとともに用いられることになるオブジェクトにそのような要件を課す。Ｃ＋＋は、この機能を提供しない。
【０３７７】
一実施形態では、プリヘッダのイントロスペクション能力は、デフォルトパラメータ値、及びオプションのパラメータの指示を提供するためにも有用である。さらに、この能力が試験クラスのインプリメンテーションの一部として提供される場合には、グラフィカルユーザインターフェース（ＧＵＩ）アプリケーションがこの情報を用いて、ダイアログ及び他のユーザインターフェース要素を動的に構築して、試験技師がこれらのクラスを有効に利用するのを助けることもできる。別の実施形態では、試験クラス開発者は、ただ１つ（試験クラス当たり）のテキストベースソースファイルにおいて、開発者がその試験クラスをパラメータ化するために必要とされるものとして指示した、試験クラスの公開の方法／属性を指定することができる。
【０３７８】
ただ１つのソースが好ましいことに留意されたい。つまり、１つのファイル内に１つの試験クラスのパラメータ化インターフェースの記述と、別の個別の（ヘッダ）ファイル内にC++インターフェース記述とを有し、その後、両方のソースを同期させておくための要求を負担することは望ましくない。このような目的で、プリヘッダファイル内に試験クラスの「テキスト系」の記述が埋め込まれ、それがイントロスペクションのために、且つその試験クラスのためのC++ヘッダを生成するためにコンパイラによって用いられる。生成されたC++ヘッダファイルは、試験クラスC++コードを最終的にコンパイルするために用いられるファイルである。
【０３７９】
Ｃ＋＋においてヘッダを用いることはよく知られている。しかしながら、Ｃ＋＋言語はパースし、解釈するのが難しいので、本発明の一実施形態は、ＴＰＬコンパイラによってコンパイルされて、Ｃ＋＋ヘッダファイルを作成するプリヘッダファイルを定義し、その後、それがＣ＋＋コンパイラによって用いられて、試験プログラムが作成される。この実施形態によれば、試験クラス開発者はプリヘッダファイルを書き、それにより、対応する試験クラス又は他の試験エンティティ内に視覚化できるようにする。
【０３８０】
以下の例は、本発明の好ましい実施形態による、１つのTestクラスのためのプリヘッダファイルの概念を例示する。試験FuncTest1について、ソースファイルから抜粋された以下の部分を考える。
【０３８１】
...
TestCondition TC 1
{
TestConditionGroup = TCG1;   # Previously defined TCG for Levels
Selector = min;
}
TestCondition TC2
{
TestConditionGroup = TCG2;   # Previously defined TCG for Timing
Selector = min;
}
...
Test FunctionalTest FuncTest1
{
PListParam = patList1;         # Previously defined pattern list
TestConditionParam = TC1;
TestConditionParam = TC2;
}
【０３８２】
上記のFuncTest1の宣言が正当であるか否かを判定するために、C++コンパイラは、FunctionalTestが何を引き起こすかを知る必要がある。FunctionalTestの知識をC++コンパイラに組み込むのではなく、FunctionalTestが何を引き起こすかの定義を、プリヘッダにおいて指定することができる。
【０３８３】
FunctionalTestが、ベースクラスTest1及びTest2を有し、且つパラメータリスト（PList）であるメンバ及び試験状態（TestConditon）のアレイを有するC++クラスであると仮定する。C++コンパイラは、FuncTest1の上記の宣言が正当であることを認識するために、FunctionalTestのメンバのタイプについて知る必要がある。
【０３８４】
さらに、FuncTest1のためのC++オブジェクト宣言を生成するために、クラスFunctionalTestのためのC++ヘッダが構成される必要がある。これは、C++コンパイラに対して、FunctionalTestクラスのベースクラス、そのメンバの名前及び他のそのような情報について知ることも要求する。
【０３８５】
本発明の一実施形態のプリヘッダは、C++コンパイラに、宣言の正当性を認識し、且つ宣言に対応するC++ヘッダ及びオブジェクト宣言を生成するために必要とされる情報を提供する。
【０３８６】
FunctionalTestは簡単なタイプにすることができ（パラメータ化が関係している限り）、それゆえパラメータ化のために簡単な記述を用いることに留意されたい。試験クラス開発者が、以下のように、上記のパラメータ化をサポートするプリヘッダ、FunctionalTest.phを書く（プリヘッダがベース試験クラスTest1及びTest2のために利用できるものと仮定する）。
【０３８７】
Version 1.0;
#
# Parameterization specification pre-header for FunctionalTest
#
ImportTest1.ph;                    # For base class Test1
Import Test2. ph;                  # For base class Test2
TestClass = FunctionalTest;        # The name of this test class
PublicBases = Test1, Test2;         # List of public base classes
# The parameters list or "parameter block":
Parameters
{
# The following declaration specifies that a FunctionalTest has
# - a parameter of type PList
# - [represented by C++ typeTester::PatternTree]
# - stored in a member named m_pPatList
# - a function to set it named setPatternTree.
# - a parameter description for the GUI to use as a tool tip
PList PListParam
{
Cardinality = 1;
Attribute =m_pPatList;
SetFunction = setPatternTree;
Description = "The PList parameter for a FunctionalTest";
}
#
# The following declaration specifies that a FunctionalTest has
# - 1 or more parameters of type TestCondition
# - [represented by C++ type Tester::TestCondition]
# - stored in a member named m_testCondnsArray 
# - a function to set it named addTestCondition.
# - a parameter description for the GUI to use as a tool tip 
# The [implement] clause causes the translation phase of to 
# generate a default implementation of this function.
#
TestCondition TestConditionParam
{
Cardinality = 1-n;
Attribute = m_testCondnsArray;
SetFunction = addTestCondition [Implement] ;
Description = "The TestCondition parameter for a
FunctionalTest";
}
}
#
# The section below is part of the Pre-Header which is an escape
# into C++ code. This will be referred to as a "template block."
#
# Everything in this section will be reproduced verbatim in the 
# generated header file, except for "$Class", "$Inc",
# "$ParamAryTypes", "$ParamAttrs","$ParamFns" and
"$ParamImpls".
#
# Note that no comments beginning with the "#" character are
supported
# within the following section.
#
CPlusPlusBegin
$Inc
namespace
{
class $Class
{
// Array types for parameters storage:
$ParamAryTypes
public:
virtual void preExec();
virtual voidexec();
virtual voidpostExec();
$ParamFns 
...
private:
double m_someVar;
$ParamAttrs
...
};
...
$ParamImpls
} // End namespace
CPlusPlusEnd
【０３８８】
［パラメータ化された試験クラスのためのＣ＋＋］
コンパイラがプリヘッダファイルを処理するとき、コンパイラは、$Inc、$Class、$ParamAryTypes等のコンパイラ変数の値を蓄積する。これにより、その後、コンパイラは上記と全く同じようにC++コードを生成し、指示された場所においてコンパイラ変数$Inc、$Class等の値に拡張することにより、以下のC++ヘッダを作成できるようになる。FunctionalTest.phの場合、コンパイラは、FunctionalTestクラスのための以下のC++ヘッダファイルFunctionalTest.hを作成する。
【０３８９】
#line 7 "./FunctionalTest.ph"
#include <ITest.h>
#line 5 "./FunctionalTest.ph"
#include <Test1.h>
#line 6 "./FunctionalTest.ph"
#include <Test2.h>
#line 55 "./FunctionalTest.ph"
#include <vector>
#line 55"./FunctionalTest.ph"
#include <Levels.h>
#line 55 "./FunctionalTest.ph"
#include <TestCondnGrp.h>
...
#line 56 "./FunctionalTest.ph"
namespace
{
#line 7 "./FunctionalTest.ph"
class FunctionalTest : public ITest,
#line 8 "./FunctionalTest.ph"
public Test1,
#line 8 "./FunctionalTest.ph"
public Test2
#line 59 "./FunctionalTest.ph"
{
// Array types for parameters storage:
#line 61"./FunctionalTest.ph"
public:
#line 37 "./FunctionalTest.ph"
typedef std::vector<Tester::TestCondition *>
TestConditionPtrsAry_t; 
#line 62 "./FunctionalTest.ph" 
public: 
virtual void preExec(); 
virtual voidexec();
virtual void postExec();
public:
#line 7 "./FunctionalTest.ph"
void setName(OFCString &name); # Automatic for all tests
#line 22 "./FunctionalTest.ph"
void setPatternTree(PatternTree *);
#line 23 "./FunctionalTest.ph"
StringgetPListParamDescriptionO const;
#line 39 "./FunctionalTest.ph"
void addTestCondition(TestCondition*);
#line 40 "./FunctionalTest.ph"
void getTestConditionParamDescription () const;
#line 67 "./FunctionalTest.ph"
...
private:
double m_someVar;
#line 70 "./FunctionalTest.ph"
private:
#line 7 "./FunctionalTest.ph"
OFCString m_name; # Automatic for all tests
#line 21 "./FunctionalTest.ph"
Tester::PatternTree *m_pPatList;
#line 38 "./FunctionalTest.ph"
TestConditionPtrsAry_tm testCondnsArray; 
#line 71 "./FunctionalTest.ph"
...
}; 
...
#line 7 "./FunctionalTest.ph" 
inline void 
#line 7 "./FunctionalTest.ph" 
FunctionalTest::setName(OFCString &name)
#line 74 "./FunctionalTest.h"
{ 
m_name = name; 
return; 
} 
#line 39 "./FunctionalTest.ph"
inline void
#line 39 "./FunctionalTest.ph"
FunctionalTest::addTestCondition(TestCondition *arg)
#line 74 "./FunctionalTest.ph"
{
m_testCondusArray.push_back(arg);
return;
}
#line 23 "./FunctionalTest.ph"
inline void
Tester::String FunctionalTest::getPListParamDescription()
{
return "The PList parameter for a FunctionalTest";
}
#line 40"./FunctionalTest.ph"
inline void
Tester: :StringFunctionalTest::getTestConditionParamDescription()
{
return "The TestCondition parameter for a FunctionalTest";
}
#line 75"./FunctionalTest.ph"
} // End namespace 
【０３９０】
上記のように、プリヘッダファイルによって、コンパイラはFunctional試験クラスのための宣言の妥当性を検査し、そのためのソースコードを生成し、その試験クラスのためのＣ＋＋ヘッダファイルを生成できるようになる。
【０３９１】
一例として、便宜上、以下に再現される、先に与えられたFunctionalTest宣言について考える。
【０３９２】
Test FunctionalTestFuncTest1
{
PListParam = patList1;         # Previously defined pattern list
TestConditionParam = TC1;
TestConditionParam = TC2;
}
【０３９３】
コンパイラは、Ｃ＋＋ヘッダファイルの宣言に従って、上記のFunctionalTest構成体のための以下のソースコードを生成する。
【０３９４】
FunctionalTest FuncTest1;
FuncTest1.setName ("FuncTest1");
FuncTest1.setPatternTree(&patList1);
FuncTest1.addTestCondition(&TC1);
FuncTest1 .addTestCondition(&TC2);
【０３９５】
Description関数のために生成される名前にも留意されたい。Xxxと名前を付けられる各パラメータは以下のメンバ関数に関連し、それは、ＧＵＩが用いることができるツールチップのための記述を有するストリングを返す。
【０３９６】
Status getXxxDescription() const;
【０３９７】
［他のプリヘッダの特徴］
プリヘッダは、付加的なタイプとして、いくつかの他のユーザ定義列挙法をサポートする。これにより、ＧＵＩは、ある特定のパラメータの値をセットするために用いることができる、取り得る選択肢のドロップダウンリストを提供できるようになる。さらに、プリヘッダは、テーブルと考えることができる多数のパラメータを関連付けるための機能を提供する。たとえば、プリヘッダは、「プロパティ」のアレイを、関連する１組の、名前のためのストリングのアレイ、及び値のための整数のアレイとしてインプリメントするのに都合良く用いることができる。この機能をインプリメントする１つの簡単な方法は、カスタムタイプ（後に説明される）のアレイを用いることである。一実施形態では、この機能は、カスタムタイプのアレイを使用することによって実施される。この機能は、以下の例において示される。
【０３９８】
# --------------------------------------------------------
# File FooBarTest.ph 
#
# Parameterization specification pre-header for
# custom test class FoobarTest
# --------------------------------------------------------
Version 1.0; 
Import Test1.ph;   # For base class Test1 
TestClass = FoobarTest; # The name of this test class
PublicBases = Test1; # List of public base classes
# The parameters list:
Parameters
{
# An enumerated type
Enum FBEnum = FB1, FB2, FB3;
# Define an FBEnum parameter.
FBEnum FBE
{
Cardinality = 1;
Attribute = m_ww;
SetFunction = setWw;
Description = "The WW parameter for a Foobar Test";
}
# This class has an array of name-number pairs that is 
# interpreted in the class.
ParamGroup
{
Cardinality = 0-n;
# The Name field in this array is:
# - of type String
# - [represented by C++ type Tester::String]
# - stored in a member named m_NameArray
# - a function to set it named addName.
# - a parameter description for the GUI to use as a tool tip
String Name
{
Attribute = m_NameArray;
SetFunction = addName;
Description = "A Name with a Value";
}
# The Number field in this array is:
# - of type Integer
# - [represented by C++ type int] 
# - stored in a member named m_NumberArray
# - a function to set it named addNumber.
# - a parameter description for the GUI to use as a tool tip
Integer Number
{
Attribute =m_NumberArray;
SetFunction = addNumber;
Description = "The value of the Name";
}
}
# The following declaration specifies that a FunctionalTest has
# - a parameter of type PList
# - [represented by C++ type Tester::PatternTree]
# - stored in a member named m_pPatList
# - a function to set it named setPattemTree.
# - a parameter description for the GUI to use as a tool tip
PList PListParam
{
Cardinality =1;
Attribute =m_pPatList;
SetFunction = setPatternTree;
Description = "The PList parameter for a FunctionalTest";
}
#
#   The following declaration specifies that a FunctionalTest has
#   - 1 or more parameters of type TestCondition
#   - [represented by C++ type Tester::TestCondition]
#   - stored in a member named m_testCondnsArray
#   - a function to set it named addTestCondition.
# The [implement] clause causes the translation phase of to
# generate a default implementation of this function.
#
TestCondition TestConditionParam
{
Cardinality = 1-n;
Attribute =m_testCondnsArray;
SetFunction = addTestCondition [Implement];
Description = "The TestCondition parameter for a FunctionalTest";
}
}
CPlusPlusBegin
$Inc
namespace
{
class $Class
{
// Array types for parameters storage:
$ParamAryTypes
public:
virtual void preExec();
virtual void exec();
virtual void postExec();
$ParamFns
// ...
private:
double m_someVar;
$ParamAttrs
// ...
};
// ...
$ParamImpls
}// End namespace
CPlusPlusEnd
【０３９９】
カスタムタイプ名前−数値対が宣言されることに留意されたい。そのカスタムタイプのアレイパラメータを用いて、パラメータの上記のParamGroupと同じ効果を達成し得る。上に提示された技法は、カスタムタイプを宣言する必要性を避けるための一方法である。
【０４００】
図１３は、本発明の一実施形態による試験プログラムを開発するための方法を示す。その方法は、試験プログラム言語（ＴＰＬ）において試験計画ファイル１３０２を記述する。その場合、試験計画ファイルは試験プログラムの少なくとも１つの試験を記述する。その方法は、システムプログラム言語（ＳＰＬ）において試験クラスファイル１３０６も記述し、またＴＰＬにおいて試験クラスファイルの対応するプリヘッダファイル１３０４も記述する。その場合に、試験クラスファイルは、試験プログラムの少なくとも１つの試験のインプリメンテーションを記述する。このインプリメンテーションの例では、ＳＰＬはＣ／Ｃ＋＋プログラム言語である。Ｃ＋＋プログラム言語の代わりに、他のシステムプログラム言語を用いることもできることは当業者には理解されよう。ＴＰＬにおいて試験計画ファイルを記述する利点のうちの１つは、それを問題領域に近づけることができることであることに留意されたい。ＴＰＬは、システムプログラミングの負荷及び複雑さを試験計画開発者から切り離す。
【０４０１】
本発明の一実施形態によれば、プリヘッダファイルは以下の宣言を有する。
・他のＴＰＬファイルの場合のようなオプションのインポート。
・試験クラスの名前。
・このクラスのインプリメンテーションのためのＤＬＬを指定する、オプションのTestClass DLLキーワード。
・公開ベースのオプションリスト。
・この試験クラスのパラメータを指定するパラメータセクション。
・試験クラスのためのインライン化されたテンプレートを提供するテンプレートセクション。
【０４０２】
プリヘッダファイルのパラメータセクションは、試験クラスファイル１３０６のためのパラメータを指定し、それによりユーザ定義の試験を作成するために試験クラス開発者によって用いられる。これらは、インスタンスに関してユーザが指定することができる試験クラスファイルのメンバであり、それゆえ、ユーザが試験作業を細かく制御できるようにする。たとえば、試験クラス開発者はユーザ定義のパラメータTraceLevelを宣言することができ、それは、試験が実行されるときにverbose又はterseのようなトレーシングのレベルを制御するためにユーザによって指定される場合がある。
【０４０３】
１つの試験クラスファイルのパラメータセクション内で、３つのタイプのエンティティを宣言することができる。
・Enumキーワードを用いる列挙。Enumキーワードは、試験クラス列挙タイプを定義するために用いられることに留意されたい。その際、試験クラスファイルは、この列挙タイプのパラメータを有することができる。これは、パラメータのために許される値のドロップダウンリストを構成するために、ＧＵＩが用いることもできる。
・パラメータタイプを指定する、Integer、Plist等のキーワードを用いるパラメータ。ただし、そのタイプは有効なＴＰＬタイプである。
・ParamGroupキーワードを用いるパラメータのグループ。ParamGourpキーワードは、Ｃ＋＋クラスのような、多数の異なるパラメータを１つのグループとして収集するために用いられる。
【０４０４】
試験クラスファイルの個々のパラメータはパラメータセクションにおいて宣言することができる。パラメータ宣言は、パラメータのタイプ、その名前、及びパラメータの種々の特性を宣言する構文を有する。以下は１組のパラメータの一例である。
【０４０５】
・Cardinality：これは、サポートされるこのタイプのパラメータの数を示す。
・Attribute：このタイプのパラメータ値（複数可）を格納するために用いられるＣ＋＋変数の名前。
・SetFunction：このパラメータのための値をセットするために用いるための関数の特性。関数に続くオプションのキーワード「[implement]」は、クラスヘッダのインラインメソッドとして利用することができる（$ParamFunctionImplementationによって指示される場所に挿入される）。そうでない場合には、ユーザが、その関数のインプリメンテーションを提供する責任がある。
・Description：ストリングリテラルが、たとえばパラメータのランタイム変更中にヘルプを提供するためにＧＵＩによってツールチップとして用いられることができる。Fooと名前を付けられたパラメータのためのカスタムクラスにおいて生成されるＣ＋＋メンバ関数は「OFC:StringgetFooDescription()const」である。この関数は、指定されたストリングを返す。
・GUIType：このオプションのキーワードは、この試験クラスのインスタンスのためにＸＭＬ記述子が生成されるときに、ＧＵＩに渡されるべきストリングを指定する。それにより、ＧＵＩは、特別な方法でこのパラメータ値を表示できるようになる。
【０４０６】
プリヘッダのテンプレートセクションは、ヘッダファイル１３１２に挿入されることになるソースコードを指定する。それは、試験クラス開発者が、この試験クラスファイルのために生成されるＣ＋＋ヘッダを直に制御できるようにする。テンプレートセクションは、キーワードCPlusPlusBeginとCPlusPlusEndとの間に配置される。それは、種々の宣言のための場所を指定する、種々の置換指示子を用いる（$ImportDeclaration、$ClassName、$ParamArrayType、$ParamFunctionDeclaration、$ParamAttribute、$ParamFunctionImplementation等）。
【０４０７】
その方法は、ＴＰＬコンパイラ１３０８を用いて、試験計画ファイル１３０２及びプリヘッダファイル１３０４をコンパイルする。ＴＰＬコンパイラは試験計画ファイル１３０２をコンパイルして、Ｃ＋＋言語において記述される導出試験計画ファイル１３１０を構成する。ＴＰＬコンパイラは、試験計画ファイルをコンパイルしながら、少なくとも２つの重要な関数を実行する。第一に、それは試験計画ファイルをＴＰＬ記述からＳＰＬ記述に翻訳する。第二に、それはプリヘッダファイルを用いて、試験計画ファイルの妥当性を検査する。詳細には、それは試験計画ファイル内の意味的なエラーを検査する。さらに、それは試験エンティティの属性を検査する。それは、試験エンティティの属性が宣言され、試験計画ファイル又はプリヘッダファイル内に存在することを確実にする。さらに、それは、試験計画の関数コール及びその対応するパラメータを検査する。それは、試験計画ファイルの関数コールが試験クラスインプリメンテーション内に存在すること、及び関数コールのパラメータが定義されることを確実にする。
【０４０８】
同様に、ＴＰＬコンパイラ１３０８は、プリヘッダファイル１３０４をコンパイルして、Ｃ＋＋言語において記述されるヘッダファイル１３１２を構成する。ＴＰＬコンパイラ１３０８はヘッダファイル１３１２に、プリヘッダファイル１３０４のパラメータセクションにおいて記述されるパラメータを挿入する。さらに、ＴＰＬコンパイラ１３０８は、ヘッダファイル１３１２に、プリヘッダファイル１３０４のテンプレートセクションにおいて参照されるソースコードを挿入する。ヘッダファイル１３１２は、２つの目的を果たす。第一に、それは、試験クラスオブジェクトファイル１３１６を生成するためにＳＰＬコンパイラ１３１４によって用いられる。第二に、それは、試験計画オブジェクトファイル１３１８を生成するために、ＳＰＬコンパイラ１３１４によって参照される。
【０４０９】
最後に、試験クラスオブジェクトファイル１３１６及び試験計画オブジェクトファイルは、リンカー１３２０によってリンクされて、試験プログラム１３２２の実行可能試験計画ＤＬＬファイル（TPL.DLL）及び実行可能試験クラスＤＬＬファイル（TCL.DLL）が生成される。
【０４１０】
［Ｃ５．カスタム関数宣言］
これにより、フロー遷移が行われるときに、ユーザはカスタム関数をコールできるようになる。カスタム関数は、以下のように、プリヘッダを通して宣言される。
【０４１１】
# --------------------------------------------------------
# File MyFunctions.ph
#
# Parameterization specification pre-header for MyFunctions
# --------------------------------------------------------
Version 1.0;
Functions MyFunctions;   # The name of this group of functions
# Declare the following C++ function in the
# MyFunctions namespace to determine the minimum
# of two values.
#   // Return the minimum of x, y
#   double MyRoutines::Min
#         (ITestPlan* pITestPlan,int& x, int& y);
Integer Min(Integer x, Integer y);
# Declare the following C++ function in the
# UserRoutines namespace to return the average of
# an array.
#   // Return the average of the array
#   double MyRoutines::Avg
#         (ITestPlan* pITestPlan, double* a, const inta_size);
#   The C++ function will be called with a and a'Length
Double Avg(Double a[]);
# Declare the following C++ function in the
# UserRoutines namespace to print the dut id
# and a message
#   // Return the average of the array
#   double MyRoutines::Print
#         (ITestPlan* pITestPlan, String* msg, unsigned int&dutId);
# The C++ function will be called with a and a'Length
Void Print(String msg, Unsignedlnteger dutld);
【０４１２】
典型的には、コンパイラが標準的な方法でこれらの宣言を拡張するとき、上記の宣言のためにC++セクションが与えられる必要がある。当然、ユーザはこれらの関数のC++インプリメンテーションに対して責任を持つ。上記の関数は全て、おそらく、暗示的な第１のパラメータとしてITestPlanポインタを取り込むことに留意されたい。このポインタは、関数ライタがTestPlan内の状態Ｓにアクセスできるようにする。たとえば、関数ライタは、現在のFlow、そのフロー内の現在のFlowItem、現在のResult句、UserVarsの値及び他のそのような情報にアクセスするために、ITestPlanインターフェースを用いることができる。ファイルFunctions.phにおいて用いるために、ある特定のテスタによって定義される関数を利用することができる。
【０４１３】
Version 1.2.3;
#
# File Functions.ph
#
Functions = Functions;   # The name of this group of functions
# Declare the following C++ function in the
# Functions namespace
# Returns the ID of the current DUT being tested by the
# caller.
UnsignedlntegerGetDUTID();
【０４１４】
［カスタム関数宣言のためのＣ＋＋］
上記のMyFunctionsのためにコンパイラによって生成されることになるC++コードは、MyFunctions名前空間において単純にいくつかの関数を宣言することである。
【０４１５】
namespace MyFunctions
{
double Min(ITestPlan* pITestPlan, int& x, int& y);
double Avg(ITestPlan* pITestPlan, double* a, const int a_size);
void Print(ITestPlan* pITestPlan, char* Msg, unsigned int dutID);
}
【０４１６】
これらの関数は１つのフローからコールすることができるであろう。
【０４１７】
［Ｃ６．カスタムFlowables］
プリヘッダを用いて、C++ IFlowableインターフェースをインプリメントするプリヘッダを作成することもできる。これにより、ユーザは、FlowItem内で実行することができるカスタムフローアブルを定義できるようになる。以下に示されるのは、ユーザ定義のFlowable MyFlowableのためのプリヘッダである。
【０４１８】
# --------------------------------------------------------
# File MyFlowable.ph
#
# Parameterization specification pre-header for MyFlowable
# --------------------------------------------------------
Version 1.2.4;
FlowableClass = MyFlowable;      # The name of this custom class
# The parameters list:
Parameters
{
# The following declaration specifies that a MyFlowable has
#   - 1 optional parameter Intl of type Integer
#   - [represented by C++ type int]
#   - stored in a member namedm_intl Val
#   - a function to set it named setIntlVal.
Integer Int1
{
Cardinality= 0-1;
Attribute = m_int1Val;
SetFunction = setIntl Val;
}
# The following declaration specifies that a MyFlowable has
#   - 1 mandatory parameter Int2 of type Integer
#   - [represented by C++ type int]
#   - stored in a member named m_int2Val
#   - a function to set it named setInt2Val.
Integer Int2
{
Cardinality = 1;
Attribute =m_int2VaI;
SetFunction = setInt2Val;
}
# The following declaration specifies that a MyFlowable has
#   - one or more parameters of type String
# - [represented by C++ type Tester::String]
# - stored in a member named m_stringArrVal
# - a function to set it named addStr.ingVal.
String Stringltem
{
Cardinality = 1-n;
Attribute = m_stringArrVal;
SetFunction = addStringVal;
}
# The following declaration specifies that a MyFlowable has
# - A single PList parameter
# - [represented by the C++ type Tester::PList]
# - stored in a member named m_plist
# - a function to set it named setPListParam
PList PListParam
{
Cardinality =1;
Attribute = m_plist;
SetFunction = setPListParam;
}
}
#
# The section below is part of the Pre-Header which is an escape
# into C++ code.
#
# Everything in this section will be reproduced verbatim in the
# generated header file, except for"$Class", "$Inc",
# "$ParamAryTypes","$ParamAttrs", "$ParamFns" and"$ParamImpls".
#
# Note that no comments beginning with the character are supported
# within the following section.
#
CPlusPlusBegin
$Inc
namespace
{
class $Class
{
// Array types for parameters storage:
$ParamAryTypes
public:
virtual void preExec();
virtual void exec();
virtual void postExec();
$ParamFns
// ... 
private:
double m_someVar;
$ParamAttrs
// ...
};
// ...
$ParamImpls
}// End namespace
CPlusPlusEnd 
【０４１９】
IFlowableインターフェースをインプリメントするいくつかのクラスが存在する。これらは以下のものを含む。
１．現在のテスタ構成内で試験計画を実行することができるか否かを検査することになるプログラムローディングのためのFlow。
２．特定のパターン及びパターンリストをロードすることになるパターンローディングのためのFlow。
３．ハードウエア及びソフトウエアを既知の状態にし、グローバル変数をロードし、他の初期化及び妥当性検査機能を実施することになる初期化のためのＦｌｏｗ。
４．他の一般的に有用な試験フロー。
【０４２０】
［Ｃ７．カスタムタイプ］
先のＴｅｓｔクラスパラメータ化に関する説明は、既知のタイプ、すなわち基本タイプ並びにPLists及びTestConditionsのようなテスタ定義のタイプを有するような試験クラスパラメータの場合のみ許される。ユーザの自由度を高めるために、タイプ拡張性を与え、それにより、複数のタイプ（コンパイラには事前にはわかっていない）を作成し、使用できるようにすることが重要である。カスタムタイプ（ＣＴ）はCustom Typeにおいて定義されるであろう。これらのカスタムタイプを用いて、Ｃ言語ストラクトに対応するタイプ（Plain Old Dataタイプ、すなわちＰＯＤとも呼ばれ、Ｃ＋＋の同じ名前のものとは大きく異なる）及び関数シグネチャのためのＣ言語タイプ定義に対応するタイプを定義することができる。ユーザタイプを含む別個のファイルは拡張子.ctypを有するであろう。ここに示されるのは、本発明の好ましい実施形態によるユーザタイプ宣言の一例である。
【０４２１】
# --------------------------------------------------------
# File MyCustomTypes.ctyp
# --------------------------------------------------------
Version 1.0.0;
CustomTypes
{
# A structured Plain-Old-Data type
Pod Foo
{
String   S1;   # String is a standard type
Integer   I1;   # ... and so is Integer
String   S2;
}
# Another structured type using Foo
Pod Bar
{
Foo   Fool;
String   S1;
Foo   Foo2;
}
#
# A pointer to a function.
#   Return type:   Integer
#   Parameters: Integer, Integer
#
Routine BinaryOp(Integer, Integer) Returns Integer;
#
# Another pointer to. a function.
#   Return type:   Void
#   Parameter: Integer
#
Routine UnaryOp(Integer) Returns Void;
#
# A pointer to a function that takes
# no parameters and does not return a value.
#
Routine NullaryOp () Void;
}
【０４２２】
［カスタムタイプのためのＣ＋＋］
先に提示されたCustomType宣言は、コンパイラによって以下のC++コードに翻訳されるであろう。
【０４２３】
namespace CustomTypes
{
struct Foo
{
Tester:: String   S1;
int   I1;
Tester:: String   S2
};
struct Bar
{
Foo   Foo 1;
Tester::   String S1;
Foo   Foo2;
};
typedef int (*BinaryOp) (int&, int&);
typedef void (*UnaryOp)(int);
typedef void (*NullaryOp)();
}
【０４２４】
これらのタイプのオブジェクトは、次に示されるように、パラメータとしてTestクラスに渡すことができる。
【０４２５】
［試験クラスパラメータとしてのカスタムタイプの使用］
ユーザがある試験を拡張する場合について考えると、その試験は、パターンリスト及び試験条件に加えて、他のクラスオブジェクト、ならびにCustom Type（すなわち、.ctypファイル）を含むファイル内で定義される任意の（すなわち、ユーザ定義の）オブジェクトで初期化される必要がある。たとえば、ユーザがファイルMyTestCTs.ctypにおいて定義されるＣＴを用いることを望むものと仮定する。
【０４２６】
# File MyTesetCTs.ctyp
Version 1.0;
CustomTypes
{
Pod Foo
{
String name;
PList patternList;
}
Pod Bar
{
Foo someFoo;
Double dVal;
}
RoutineBinaryOp(Integer, Integer) return Integer;
}
【０４２７】
上記のタイプを用いるためにユーザがする必要がある全てのことが、ユーザの試験クラスプリヘッダにおいて上記のファイルをインポートされる。コンパイラが、そのように定義されたＣＴを解釈するので、コンパイラが試験クラスプリヘッダを処理しているときに、Foo及びBarのための定義を入手することができる。さらに、コンパイラは、上記のタイプFoo及びBarにそれぞれ対応する２つのＣ言語ストラクト、すなわちストラクトFoo及びストラクトBarを定義し、それらの定義がファイルmyTestCTs.h内に置かれる。myTestCTs.cttのためのImportステートメントによって、ファイルmyTestCTs.hは、生成された試験クラスC++ヘッダ内に含まれるようになる。以下の例はこのプロセスを例示する。最初に、試験計画内の試験のための宣言を考える（パターンリスト及び試験条件のための宣言は、明確にするために省略されている）。
【０４２８】
...
Import MyFunctions.ph;
Import MyCustomTypes.ctyp;
...
# TheCustomVars block defines variables of the Custom
# types defined earlier.
CustomVars
{
...
Bar bar 1 =
{
{"This is a Foo", somePatList},   # someFoo
3.14159   # dVal
}
#
# A function object that is a binary operator.
# The name on the right hand side of the assignment
# is a routine declared in MyFunctions, for which,
# of course, the user has to provide an implementation.
#
BinaryOp bop1= MyFunctions.Min;
}
...
Test MyFancyTest MyTest1
{
...
BarParam = bar1;
BinaryOpParam =bop1;
}
...
【０４２９】
上記の例では、試験計画にCustomVarsブロックが含まれる。カスタム化変数を含む別個のファイルは拡張子.cvarを有するであろう。ユーザは、以下のようにして、上記のパラメータ化をサポートするMyFuncyTestのためのプリヘッダを書くであろう（パターンリスト及び試験条件のためのパラメータ化宣言は、明確にするために省略されている）。
【０４３０】
# --------------------------------------------------------
# File MyFancyTest.ph 
#
# Parameterization specification pre-header for MyFancyTest
# --------------------------------------------------------
Version 1.0.2;
Import MyCustomTypes.ctyp;   # For CTs used in MyFancyTest
Import FunctionalTest. ph;   # For base class FunctionalTest
TestClass = MyFancyTest;   # The name of this test class
PublicBases = FunctionalTest;   # List of public base classes
# The parameters list:
Parameters
{
# The following declaration specifies that a MyFancyTest has
#   - an optional array of parameters of custom type Bar
#   - [represented by C++ type CustomTypes::Bar]
#   - stored in a member named m_barsArray
#   - a function to set it named addBarParam.
# An implementation. will be generated for addBarParam.
Bar BarParam
{
Cardinality = 0-n;
Attribute =m_barsArray;
SetFunction = addBarParam [Implement];
}
# The following declaration specifies that a MyFancyTest has
#   - an optional parameter of custom type BinaryOp
#   - [represented by C++ type CustomTypes::BinaryOp]
#   - stored in a member named m_binaryOp
#   - a function to set it named setBinaryOpParam.
# An implementation will be generated for setBinaryOpParam.
BinaryOp BinaryOpParam
{
Cardinality = 0-1;
Attribute = m_binary0p;
SetFunction = setBinaryOpParam [Implement];
}
}
CPlusPlusBegin
$Inc
namespace
{
class $Class
{
$ParamAryTypes
public:
virtual void preExec();
virtual void exec();
virtual void postExec();
$ParamFns
// ...
private:
double m_someVar;
$ParamAttrs
// ...
};
// ...
$ParamImpls
}// End namespace
CPlusPlusEnd .
【０４３１】
［カスタムタイプを用いるカスタム試験クラスのためのＣ＋＋］
最後に、一旦コンパイラがこのプリヘッダファイルを処理したなら、コンパイラはMyFuncyTestクラスのための以下のC++ヘッダファイル、すなわちMyFuncyTest.hを作成するであろう。
【０４３２】
#include <MyCustomTypes.h>
#include <ITest.h>
#include <FunctionalTest.h>
...
namespace
{
class MyFancyTest : public ITest,
public Functional Test
{
public:
typedef std::vector<CustomTypes::Bar *> Bar Ary_t;
public:
virtual void preExec();
virtual void exec();
virtual void postExec();
public:
void setName(OFCString &name); # Automatic for all tests
void setPatternTree(PatternTree *);
void addTestCondition(TestCondition *);
void addBarParam(CustomTypes::Bar *) ;
voidsetBinaryOpParam(CustomTypes::BinaryOp *);
...
private:
double m_someVar;
private:
OFCString m_name; # Automatic for all tests
PatternTree*m_pPatList;
TestConditionPtrsAry_t m_testCondnsArray;
BarAry_t m_barsArray;
BinaryOp*m_binary0p;
...
}; // End class MyFancyTest
...
inline void
MyFancyTest: :addBarParam (CustomTypes::Bar *arg)
{
m_barsArray.push_back(arg);
return;
}
inline void
MyFancyTest::setBinaryOpParam(CustomTypes: :BinaryOp *arg)
{
m_binaryOp = arg;
return;
}
} // End namespace
【０４３３】
［Ｃ８．パラメータ化］
先に示されたように、Testクラス、カスタムFlowableクラス、又はカスタム関数定義のためのプリヘッダは、パラメータ化仕様セクションを通して、クラス／関数へのイントロスペクションを制限する。コンパイラはこのセクションを用いて、クラス／関数のためのパラメータ化インターフェースを生成する（そして、クラス／関数ヘッダそのものを生成する）。Testクラス及びFlowableクラスの場合、コンパイラはまた、このセクションを用いて、Test Planコード内のコールを後に生成し、そのクラスのインスタンスを初期化する。プリヘッダ及び対応する宣言に関する以下の点に留意されたい。
１．全てのTest又はカスタムFlowableクラス定義は、プリヘッダ内で指定されることが好ましい。プリヘッダ内のParametersブロックは、そのようなクラスのためのパラメータリストを指定することができる唯一の場所であることが好ましい（したがって、結果として、パターンリスト及び試験条件仕様のようなTestのための「標準的な」パラメータも、プリヘッダのParametersブロックに含まれる必要がある；これにより、全てのパラメータ、標準及びＣＴが一様に処理されるようになる）。
２．Test又はFlowableクラスのためのプリヘッダにおいて非オプションとして定義される（すなわち、０以外の基数を有する）全てのパラメータが、そのクラスのインスタンスのためのTestブロック又はFlowableブロック宣言の中で初期化されるべきである。
３．Test/Flowableブロックにおいてパラメータの初期化のために用いられるオブジェクトは予め定義されているべきである。
４．置換指示子$Class、$Inc、$ParamAryTypes、$ParamFns、$ParamAttrs及び$ParamImplsが、ユーザが対応する生成されたコードを生成されたクラスヘッダファイル内に挿入させるつもりである、プリヘッダのユーザコードセクション内の正確な場所に現われなければならない。置換指示子毎に特定のコードが生成されるので、これらの置換指示子は厳密に一度だけ現われるべきである。
５．プリヘッダのParametersブロック内のパラメータ仕様の名前（上記の例のPListParam、TestConditionParam又はBarParamのような）は、そのクラスのインスタンスの宣言において用いられることになるパラメータの名前である。
６．以下はパラメータ仕様において用いられる記述子の意味である。
ａ．Cardinality：これはサポートされることになるこのタイプのパラメータの数を指示する。以下は一実施形態において取り得る値である。
ｉ．１：このパラメータは強制的であり、厳密に一度だけ指定されるべきである。このパラメータは、パラメータのタイプのオブジェクトへのポインタとして保持されるであろう。
ｉｉ．０−１：このパラメータはオプションである。指定される場合には、それは一度だけ指定されなければならない。このパラメータは、パラメータのタイプのオブジェクトへのポインタとして保持されるであろう。
ｉｉｉ．１−ｎ：このパラメータは強制的である。さらに、このパラメータのために多数の値を指定することができる。この値は指定された順序で記憶されるであろう。
ｉｖ．０−ｎ：このパラメータはオプションである。このパラメータのために多数の値を指定することができる。この値は指定された順序で記憶されるであろう。
上記の（）及び（）の場合に、全ての指定された値が、パラメータのタイプへのポインタ上でテンプレート化される、ＳＴＬベクトル＜＞に記憶されることになることに留意されたい。このベクトルのタイプは定義され、＄ＰａｒａｍＡｒｙＴｙｐｅｓによって指示される場所に挿入されるであろう。これらのタイプ定義のためのアクセスレベルは常に公開である。
ｂ．Attribute：このタイプのパラメータ値（複数可）のための記憶として用いるためのC++変数の名前。その名前は、C++クラスの私用データメンバとして全く同じ語で再現されることになり、C++識別子のための要件に準拠しなければならない。この属性のタイプに関して、以下のことに留意されたい。
ｉ．ただ１つの値だけが許される場合には、そのパラメータのタイプへのポインタである。
ｉｉ．多数の値が許される場合には、そのパラメータのタイプへのポインタ上にテンプレート化されるＳＴＬベクトル＜＞である（上記の（）を参照）。
それらの属性はTest Planによって作成され、ポピュレートされるオブジェクトへの参照を保持し、これらのオブジェクトを所有しないことに留意されたい。オブジェクトの寿命は常に、Test Planそのものによって管理される。
ｃ．SetFunction：このパラメータのための値をセットするために用いるための関数の名前。以下の点に留意されたい。
ｉ．その名前は全く同じ語で再現されることになり、それゆえ、C++言語要件に準拠しなければならない。
ｉｉ．その関数のアクセスレベルは常に公開である。
ｉｉｉ．リターンタイプは常に空である。
ｉｖ．その関数は常に、タイプポインタ／パラメータタイプのただ１つの引き数をとる。
【０４３４】
１つの値が常に１つずつセットされる；すなわち、多数の値を指定できるようにするパラメータの場合に、Test Plan内の生成されたコードが、指定された値毎に一度、この関数を繰返しコールし、各値がＳＴＬベクトル（先に説明されたような）に追加されることになることに留意されたい。
【０４３５】
関数名に続くオプションのキーワード［インプリメント］は、この関数のための普通のインプリメンテーションが、クラスヘッダ（$ParamImplsによって指示される場所において挿入される）においてインラインメソッドとして利用できるようになることを指示する。そうでない場合には、ユーザがその関数のインプリメンテーションを提供する役割を担う。
ｄ．Description：このパラメータのランタイム変更中にヘルプを提供するために、ＧＵＩツールによって用いられることになるツールチップであるストリングリテラル。Xxxと名前を付けられたパラメータのためのカスタムクラスにおいて生成されるC++メンバ関数は以下の通りであり、その関数は指定されたストリングを返すであろう。
【０４３６】
String getXxxDescription () const;
【０４３７】
［カスタム化を用いる試験計画例］
以下に示されるのは、いくつかのカスタム化を用いて説明される試験計画例である。
【０４３８】
# --------------------------------------------------------
# File MyCustomizedTestPlan.tpl
# --------------------------------------------------------
Version 0.1;
#
# Imports as before ...
# The following import is implicit, but can be explicitly
# provided.
Import FunctionalTest.ph;
# Import for MyFlowables, MyFunctions and Functions
Import MyFlowables.ph;
Import MyFunctions.ph;
Import Functions.ph;
# --------------------------------------------------------
# Start of the test plan
# --------------------------------------------------------
TestPlan Sample;
# This block defines Pattern Lists file-qualified names and
# Pattern List variables that are used in Test declarations.
# The file-qualified names refer to pattern lists in the named
# files. The variables refer to String variables which will
# hold the pattern list names at run time. User defined Flowable
# objects could set the values of these variables through an
# API.
PListDefs
{
# File qualified pattern list names
pl1A. plist:pat1Alist,
pl2A.plist:pat2AList,
# Pattern list variables
plistXxx,
plistYyy,
plistZzz
}
# SocketDef, UserVars declaration as before ...
# Declarations of TestConditions TC1Min, TC1Typ, TC1Max,
# TC2Min, TC2Typ, TC2Max as before ...
#
# Declare a FunctionalTest. "FunctionalTest" refers to a C++
# test class that runs the test, and returns a 0,1 or 2 as
# a Result. The Test Condition Group TCG1 is selected with
# the "min" selector by referring to theTClMin TestCondition.
#
# Note that compiler can compile this because of the imported
# FunctionalTest.ph file.
#
Test FunctionalTest MyFunctionalTest1Min
{
PListParam = patlAList;
TestConditionParam = TC1Min;
}
#
# Additional FunctionalTest declarations for the following, as before
#   MyFunctionalTest1Typ
#   MyFunctionalTest1Max
#   MyFunctionalTest2Min
#   MyFunctionalTest2Typ
#   MyFunctionalTest2Max
#
# Here is a declaration of MyFlowable. It uses a PatternList variable
# plistXxx which is initialized by the flowable prior to use here.
#
# Compiler can compile this because of the imported MyFlowables.ph file:
Flowable MyFlowable MyFlowable1
{
Int1 = 10;
Int2 = 20;
Stringltem = "Hello World";
PListParam = plistXxx;
}
# Counters for PassCount and FailCount as before...
# Flows as before. Flows FlowTest1 and FlowTest2 are
# unchanged from the previous example.
Flow FlowTest1
{
# ...
}
Flow FlowTest2
{
# ...
}
#
# Now FlowMain, a main flow, can be presented. It
# implements a finite state machine that calls FlowTest1
# and FlowTest2 as below:
# --------------------------------------------------------
#                  Result 0      Result 1
# --------------------------------------------------------
#   FlowMain_1   Flowmain_2   return 1
#   FlowMain_2   FlowMain_3   return 1
#   FlowMain_3   FlowMain_4   return 1
#   FIowMain_4   FlowMain_5   return 1
#   FlowMain_5   return 0   return 1
#
# Where the IFlowables run by eachFlowltem are:
# --------------------------------------------------------
#   Flowltem      IFlowable that is run
# --------------------------------------------------------
#   FlowMain_l   Myflowable1
#   FlowMain_2   DatalogStartFlow
#   Flowmain_3   FlowTest1
#   Flowmain_4   FlowTest2
#   FlowMain_5   DatalogStopFlow
#
Flow FlowMain
{
#
# The first declared flow is the initial flow to be
# executed.  It goes to Flowmain_Initializationflow
# on success, and returns 1 on failure.
#
FlowItem FlowMain_1 MyFlowable1
{
Result 0
{
Property PassFail = "Pass";
IncrementCounters PassCount;
# A user function call
MyFunctions.Print ("PassedMyFlowable1",
Functions.GetDUTID());
GoTo FlowMain_2;
}
Result 1
{
Property PassFail = "Fail";
IncrementCounters FailCount;
# A user function call
MyFunctions.Print("Failed Myflowable1",
Functions.GetDUTID());
SetBin SoftBins."3GHzLeakage";
Return 1;
}
}
#
# Goes to FlowMain_3 on success
# and returns 1 on failure.
#
FlowItem FlowMain_2 DatalogStartFlow
{
Result 0
{
Property PassFail = "Pass";
IncrementCounters PassCount;
# A user function call
MyFunctions.Print("Passed DatalogStartFlow",
Functions.GetDUTIDO);
GoTo FlowMain_3;
}
Result 1
{
Property PassFail = "Fail";
IncrementCounters FailCount;
MyFunctions.Print("Failed DatalogStartFlow",
Functions.GetDUTID());
Return 1;
}
}
# This FlowItem calls the previously defined FlowTest1
FlowItem FlowMain 3 FlowTest1
{
Result 0
{
Property PassFail = "Pass";
IncrementCounters PassCount;
# A user function call
MyFunctions.Print("Passed FlowTest1",
Functions.GetDUTID());
GoTo FlowMain_4;
}
Result 1
{
Property PassFail = "Fail";
IncrementCounters FailCount;
# A user function call
MyFunctions.Print("Failed FlowTest1",
Functions.GetDUTID());
SetBin SoftBins."3GHzCacheFail";
Return 1;
}
}
# This Flowltem calls the previously defined FIowTest2
Flowltem FlowMain 4 FlowTest2
{
Result 0
{
Property PassFail = "Pass";
IncrementCounters PassCount;
# A user function call
MyFunctions.Print("Passed FlowTest2",
Functions.GetDUTID());
GoTo FlowMain_5;
}
Result 1
{
# FlowTest1 passed, but FlowTest2 failed
Property PassFail = "Fail";
IncrementCounters FailCount;
# A user function call
MyFunctions.Print("Failed FlowTest2",
Functions.GetDUTID());
SetBin SoftBins."3GHzSBFTFail";
Return 1;
}
}
FlowItem FlowMain_5DatalogStopFlow
{
Result 0
{
# All Passed!
Property PassFail = "Pass";
IncrementCounters PassCount;
# A user function call
MyFunctions.Print ("Passed all!",
Functions.GetDUTID());
SetBin SoftBins."3GHzAllPass";
Return 0;
}
Result 1
{
# FlowTest1 and FlowTest2 passed,
# but DatalogStopFlow failed
Property PassFail = "Fail";
IncrementCounters FailCount;
# A user function call
MyFunctions.Print("Failed DatalogStopFlow",
Functions.GetDUTID());
Return1; 
}
}
}
【０４３９】
上記のコードにおいて、以下の点について留意されたい。
１．ここでPListDefsセクションは、いくつかのPList名とともに、いくつかのPList変数も有する。PList名は、試験において直に用いることができる名前である。PList変数は試験において用いることができる変数であり、その値は、ランタイムにおいて、カスタム化されたFlowable内のコードによって実際のPListに結び付けられる。
２．PListDefsセクションはオプションである。存在しない場合には、その内容は種々のTest宣言からコンパイラによって推測されるであろう。存在する場合には、それは、用いられるTestのPListパラメータの全てを宣言しなければならないが、それはさらに多くのパラメータを宣言することもできる。
３．値をPList変数に割り当てるために、ランタイムＡＰＩを利用できるであろう。TestPlanクラスは以下の関数を有するであろう。そのFlowableはPListVariableを特定のPListに結び付けるためにその関数を用いることができるであろう。
【０４４０】
Status SetPListVariable(const Tester::String& varName,
const Tester: :String& fileQualifiedPListName);
【０４４１】
４．別のFlowableに制御を渡すことか、リターンかのいずれかである遷移の直前に、FlowItemにおいてユーザ関数及び関数をコールすることができる。
【０４４２】
［ユーザ関数コールのためのＣ＋＋］
複数のフローにおいてカスタム関数コールを呼び出すことを除いて、コンパイラによって生成されることになるC++コードが、先に提示された種々のカスタム化技法のために示されている。FlowItem内のユーザ関数コールは、各FlowのIUserCallsメンバによって取り扱われることが好ましい。各Flowは、以下に示されるように、単一の仮想メンバ関数をエクスポートするインターフェースIUserCallsのメンバを有することが好ましい。
【０４４３】
class IUserCalls
{
public:
virtual void exec(const String& flowItemName,
unsigned int result) = 0;
} ;
【０４４４】
ユーザ関数コールを有するFlowに直面するとき、そのFlowは、上記のインターフェースをインプリメントするクラスのインスタンスでポピュレートされるようになる。たとえば、その例内のFlowMainでは、フローは以下のクラスのインスタンスでポピュレートされるであろう。
【０４４５】
class FlowMain_UserCalls : public IUserCalls
{
public:
virtual void exec(const String& flowItemName,
unsigned int result)
{
if (flowItemName == "FlowMain_1")
{
//...
} else if(flowItemName== "FlowMain_2")
{
//...
} else if (flowItemName == "FlowMain_3")
{
switch (result)
{
case 0:
MyFunctions::Print("Passed FlowTest1",
Functions: :GetDUTID());
return;
case 1:
MyFunctions::Print("Failed FlowTest1",
Functions: :GetDUTID());
return;
default:
return;
}
}
else if (flowItemName =="FlowMain_4")
{
// ...
}
else if (flowItemName =="FlowMain_5")
{
// ...
}
}
};
【０４４６】
FlowItem::execute()演算はフロー項目の名前を知っている。それは次のフローへのポインタとともに戻る前に、それは取り囲んでいるフローのためのIUserCalls::exec()をコールし、その自らのフロー項目名、及び現在の結果の値を渡すであろう。これにより、上記のコードが実行されることになり、必要とされるユーザ定義関数が呼び出される。
【０４４７】
［Ｃ９．試験プログラムコンパイル］
先に説明されたように、Test Plan記述ファイルは、１つの試験計画において用いられる複数のオブジェクトと、それらの互いに対する関係とを指定する。一実施形態では、このファイルはC++コードに翻訳され、それは、標準インターフェースITestPlanのインプリメンテーションの形でサイトコントローラにおいて実行されることになる。このコードは、サイトコントローラ上にロードされることができるウインドウズ・ダイナミックリンクライブラリ（ＤＬＬ）にパッケージ化されることができる。Test Program DLLは、サイトコントローラソフトウエアが試験計画オブジェクトを生成し、それが含む試験計画オブジェクトを返すために用いることができる標準的な既知のエントリポイントを有するように生成される。
【０４４８】
［試験計画記述からの構成］
１つの試験計画記述からITestPlanのインプリメンテーションへの変換のプロセスは、試験プログラムコンパイラ４００によって達成される。このプロセスは２段階、すなわち翻訳及びコンパイルにおいて行われる。
【０４４９】
翻訳段階４０２では、コンパイラ４００は試験計画ファイル（及びそれがインポートする種々の他のファイル）と、試験計画において用いられる全ての試験タイプのためのプリヘッダとを処理する。この段階では、コンパイラ４００は、MSVC++（マイクロソフト・ビジュアルC++）ワークスペース及びプロジェクトファイル、ＤＬＬ「ボイラープレート」コード等の全ての他のサポート用ファイルとともに、Test PlanオブジェクトのためのC++コード、及び出合った試験タイプのためのC++ヘッダを作成する。コンパイラ４００は、生成されたコードにファイル及び行指示文を挿入し、コンパイル時エラーメッセージが、生成されたコードの中を指示する代わりに、記述ファイル内の適当な場所に戻って参照できるようにする。
【０４５０】
コンパイラが必要なファイルを作成した後に行われるコンパイル段階では、MSVC++コンパイラのような標準的なコンパイラ４０４が呼び出され、ファイルをコンパイルし、それらのファイルをＤＬＬにリンクする。
【０４５１】
コンパイラは、入力として、有効な試験計画ファイル（及び全ての関連するファイル）を取り込み、必要に応じて、試験計画ファイル内の「インポート」指示文によって表されるTestPlanファイル及び全ての他のファイルを生成する。さらに、コンパイラは、MSVC++「ソリューション」を生成し、Test Plan DLLを構築する。たとえば、メインファイル（MyTestPlan.tpl）が、タイミング情報を組み入れるためのTiming1.timを含んでいた場合には、コンパイラは、（中でも）以下のファイルを作成するであろう。
【０４５２】
MyTestPlan.h
MyTestPlan.cpp
Timing1.cpp
MyTestPlan.sln (MSVC++ "Solution" file)
MyTestPlan.vcproj (MSVC++ "Project" file)
【０４５３】
全てのファイルが作成（又は更新）された後に、コンパイラはMSVC++アプリケーションを呼び出し、そのアプリケーションが作成する「Solution」を指定し、ＤＬＬを構築する。エラー及び／又は警告があれば、ユーザに対して示されるであろう。
【０４５４】
Test Planを構築した後に、ユーザがTiming1.timに変更を加えた場合には、ユーザはコンパイラを呼び出し、コンパイラにMyTestPlan.tplを渡す。コンパイラは（タイムスタンプ情報によって）メイン試験計画ファイルが変更されていないことを認めるので、MyTestPlan.h/.cppは作成し直されないであろう。しかしながら、メイン試験計画ファイルを処理している間に、Timing.timファイルが変更されていることがわかるであろう。それゆえ、コンパイラはTiming1.cppファイルを作成し直し、MSVC++アプリケーションを呼び出し、ＤＬＬを構築し直すであろう。これにより、MyTestPlan.cppをコンパイルし直すのが避けられ、Timing1.cppのみがコンパイルされ、ＤＤＬがリンクし直される。この手法は、コンパイルするのにかなりの時間を要する大きな試験計画の場合に、コンパイル及びリンクし直す時間を切り詰める際に特に有用であろう。
【０４５５】
［Ｄ．試験プログラムの実行］
サイトコントローラソフトウエアは、その処理空間内にTest Program DLLをロードし、ＤＬＬ内の「ファクトリ」関数をコールして、Test Planオブジェクトのインスタンスを作成する。一旦Test Planオブジェクトが作成されたなら、サイトコントローラソフトウエアは、その試験計画を実行するか、又は必要とされる任意の他の方法で試験計画とやりとりすることができる。
【０４５６】
［非インタラクティブビルド］
ウインドウズ環境の大部分のC++ソフトウエア開発者にとってアプリケーション（又はＤＬＬ、ライブラリ等）を構築することは、開発環境（ＭＳビジュアルC++、ボーランドC++等）を構築し、コードを編集し、そして（多くの場合に）ボタンを押してプロダクトを構築することを意味する。
【０４５７】
本発明の１つの実施形態の試験環境は、類似の１組の機能を有するであろう。Test Plan開発者は、コードを編集し、それらのTest Planを構築する必要があるであろう。しかしながら、テスタは、結果として生成されるTest Plan DLLを生成するために、Test Plan開発者がC++開発環境を構築することを要求しないであろう。
【０４５８】
これを果たすために、本発明は非インタラクティブビルドの概念を利用する。非インタラクティブビルドは、非インタラクティブモードにおいてＭＳビジュアルC++を用いるビルドと定義される。この場合でも依然として、他のツールがインタラクティブに用いられ、そのようなビルドを管理できるようになることに留意されたい。唯一意味することは、ビジュアルC++が非インタラクティブに用いられることである。
【０４５９】
［想定される環境］
ユーザの環境について、ある特定の想定がなされる。それらの想定は以下の通りである。
１．Test Plan開発者は、上記の方法及び規則に従って、自らのTest Planを開発しているであろう。
２．Test Plan開発者はC++の熟練者レベルの知識を持たない場合もある。
３．Test Plan開発者は、ファイル（複数可）をTest Plan DLLに変換するために、コマンドラインツール又はＧＵＩツールを利用できるであろう。
【０４６０】
［ボタンを使用しないアプリケーションの構築］
ＭＳビジュアルスタジオで非インタラクティブに作業するには、２つの手法のうちの１つが必要になる。第１の（そして最も簡単な）手法はコマンドラインインターフェースを用いることである。第２の（そしてより自由度のある）手法は自動インターフェースを用いることである。このセクションは両方の手法を説明する。
【０４６１】
［プロジェクトの作成］
ビジュアルスタジオを非インタラクティブに使用するために、１つ又は複数の有効なプロジェクトを含むワーキングソリューションで開始すべきである。残念なことに、これは、コマンドライン手法又は自動手法のいずれからも達成することができないタスクである。いずれの方法もプロジェクト作成のための仕組みを提供しない。しかしながら、ビジュアルスタジオのためのプロジェクト及びソリューションはテンプレートから作成することができる。それゆえ、プロジェクト名及びテンプレートを与えて開始することにより、ビジュアルスタジオのためのソリューション／プロジェクトを作成することができる。
【０４６２】
［プロジェクトのポピュレーション］
コマンドラインがサポートしないので、生成されたプロジェクトに新たなファイルを追加するために、ビジュアルスタジオ自動モデルが用いられる。プロジェクトに新たなファイル及び既存のファイルを追加するために、２つのビジュアルスタジオマクロが提供される。ActiveScriptエンジン（VBScript、JScript、ActivePerl、ActivePython等のような）を用いて同じタスクを実行するために、外部スクリプトが類似のコードを用いることができる。それゆえ、本発明のコード生成ツールは新たなファイルを作成し、自動モデルを用いて、それらのファイルを既存のビジュアルスタジオプロジェクトに追加することができる。ファイルが作成された後に、それらのファイルは、必要に応じて、ツールによって更新することができる。
【０４６３】
［プロジェクトの構築］
一旦、適当なソリューション及びプロジェクトが得られたなら、ビジュアルスタジオを非インタラクティブに用いて、Test Planを構築することに対していくつかのオプションがある。最も単純なオプションは、コマンドラインからそれを呼び出すことである。そのようなコマンドラインは以下のようになるであろう。
【０４６４】
devenv solutionFile /build solutionCfg
【０４６５】
ただし、solutionFileはビジュアルスタジオソリューションファイルであり、solutionCfgは、そのソリューション内のプロジェクトに適用することができる特定の構成である。別のソリューションは、自動のためのビジュアルスタジオオブジェクトモデルを用いることである。これにより、そのビルド及び構成プロセスを、さらに細かく制御できるようになる。上記のように、それは、コマンドラインからプロジェクトを構築するために、Perlスクリプトのリストを含む。このプログラムは、構築するためのプロジェクト及び構成を指定する構成ファイル（及びそれらのプロジェクトについての他の情報）を読み出し、自動モデルを用いてそれらを全て構築する。１つのスクリプトにおいて自動オブジェクトを用いる方法を例示するために、このスクリプトにおける$msdevオブジェクトの使用を考える。
【０４６６】
［デバッガサポート］
Ｔｅｓｔクラスの開発者がその作業を検査し、デバックするために、サイトコントローラ内でブレークし、そのコードの中を逐次的に進むことができるようにするデバッガを利用する必要がある。コンパイラによって生成されるコードはMSVC++によってコンパイルされるC++であるので、MSVC++デバッガを用いて、Testクラスインプリメンテーションがデバッグされる。この特徴は、Ｃ＋＋において直に作業するTestクラス開発者等だけを対象にしていることに留意されたい。生成されたC++コードを直に参照することなくTestプログラムの動作をデバッグするか、又は逐次的に進めることを望む試験技師に対して他の仕組みが提供されるであろう。
【０４６７】
［システムソフトウエア環境］
このセクションは、テスタのための一般的なソフトウエア環境、すなわちユーザ試験計画によって必要とされるファイルのための場所、そのようなファイルのための代替の場所を指定するための仕組み、ならびに試験計画及びモジュール制御ソフトウエアの場所を指定するための方法を説明する。
【０４６８】
［試験計画によって必要とされる環境］
システムの標準的な場所、及び１つの試験計画によって必要とされる
１．パターンリスト
２．パターン
３．タイミングデータ
４．試験クラスＤＬＬ、のための探索経路のランタイム構成を、環境構成ファイルによって指定されるような、「環境」変数によって構成することができる。これらはテキストファイルであり、以下のような単純な構文を用いる。
【０４６９】
Tester_PATOBJ_PATH = "patterns\data;D:\projects\SC23\patterns\data"
【０４７０】
ネイティブＯＳによってサポートされる環境変数を用いる代わりに、テキストファイルにおいて、そのような「環境」を定義する利点は、そのインプリメンテーションが後に、ＯＳによってサポートされる環境変数が最大ストリング長を有する等の共通の制約によって制限されないことである。以下の「環境」（設定）変数は、先に記載されたエンティティのために用いられるであろう。
・パターンリスト：Tester_PATLIST_PATH
・パターンオブジェクトファイル：Tester_PATOBJ_PATH
・パターンソースファイル：Tester_PATSRC_PATH（これはオプションである；以下を参照）
・Timingデータファイル：Tester_TIMING_PATH
・TestクラスDLL：Tester_TEST_CLASS_LIBPATH
【０４７１】
特殊な事例をサポートするために、有用なデフォルト挙動を保持しながら、３つの構成レベルが提供される。これは、優先順位が高くなる順に説明される。
【０４７２】
第一に、システム環境設定ファイル、
$Tester_INSTALLATIONROOT\cfg\setups\Setup.envが、「環境」変数のデフォルト値を指定するであろう。他の構成の仕組みが利用できない場合には、このファイルが必要とされるであろう。一般的に、それは、システム上で実行される全ての試験計画の場合に利用可能であろう。このファイルはインストール中にインストール及び構成管理（ＩＣＭ）システムによって作成され、インストーラからの入力が先に述べられた３つの変数のためのデフォルト値を割り当てる（上記の３つの変数のためのシステムデフォルトに加えて、このファイルは、以下のサブセクションにおいて説明されるような、ある特定の他のテスタ「環境」変数のためのシステムデフォルトも含むことに留意されたい）。
【０４７３】
第二に、環境設定ファイルを、試験計画に対するランタイム引き数としてユーザが指定することができる。このランタイム構成の変数は、デフォルト定義よりも高い優先順位を取るであろう。
【０４７４】
最後に、試験計画が特殊なブロックを用いて、その実行時に用いられることになる環境変数を指定することができる。試験計画において定義される変数は、デフォルトシステムファイル又はユーザ定義ファイル内の変数よりも高い優先順位を取るであろう。
【０４７５】
一般的に、全ての必要な変数は、上記の仕組みのうちの１つを通して定義されるべきである。変数が定義されない場合には、ランタイムエラーが生じることになる。
【０４７６】
［他の環境設定］
ユーザ試験計画によって必要とされる「環境」変数に加えて、試験環境によって、以下の２つの「環境」変数が必要とされる。
１．Tester_TEST_PLAN_LIBPATH：これは、ロードされるべきであるユーザ試験計画ＤＬＬを見つけるためにシステムコントローラが用いることになる探索経路を指定する。ユーザピン記述及びソケットファイルを見つけるためにも同じ探索経路が用いられることに留意されたい。ＩＣＭへのインストール時間中に指定される、この変数のためのデフォルト値は、ＩＣＭによって、ファイル$Tester_INSTALLATION_ROOT\cfg\setups\Setup.envに格納される。
２．Tester_MODULE_LIBPATH：これは、ベンダ提供ハードウエアモジュール制御ソフトウエアＤＬＬをロードするためにシステムが用いることになる探索経路を指定する。構成管理データベース（ＣＭＤ）から引き出されるこの情報も、ＩＣＭによってファイル$Tester_INSTALLATION_ROOT\cfg\setups\Setup.envに格納される。
【０４７７】
ユーザはTester_TEST_PLAN_LIBPATH変数のためのSetup.envファイル内に与えられる値を無効にすることができるが、ユーザがベンダ提供ハードウエアモジュール制御ソフトウエアＤＬＬのための探索経路を明示的に変更することを望まない限り、Tester_MODULE_LIBPATHのためのSetup.envファイル内に与えられる値は変更されるべきでないことに留意されたい。
【０４７８】
［探索経路指定の意味］
探索経路を指定する「環境」変数について以下の点に留意されたい。
１．各変数は、ある特定のタイプの参照されるファイルを見つけるためにシステムが探索することになるディレクトリ名の、セミコロン（「；」）によって分離されたリストにすべきである。
２．システムがそのような「環境」変数の値を最初に調べた後に、その値に対してユーザによって行われた任意の変更（たとえば、環境構成ファイルを編集することによる）は、それを行うための必要性をユーザが明示的にシステムに「通知する」ときにのみ、システムによって登録されるであろう。
３．テスタが正常に動作する環境のような分散環境内の「カレントワーキングディレクトリ」（ＣＷＤ）の表記法は、ユーザが直観的に予想するものではないかもしれないので、ＣＷＤに対する経路が曖昧な結果に繋がる可能性があるとき、探索経路内の相対経路名は、関連する環境変数（ルートを定義する機能を提供する）の特定の設定に関連するように解釈されるであろう。探索経路内の全ての相対経路名が基づくことになると想定されるルートを指示する、この関連する環境変数は、「Tester_INSTALLATION_ROOT」変数であり、それはユーザのシステムへのテスタインストールのトップレベル（すなわち「ルート」）ディレクトリの場所を与える。
４．ディレクトリエントリは集合［Ｖ：＊？＜＞｜；］内の文字を含むことができない。セミコロン（「；」）を除いて、この集合内の全ての他の文字はウインドウズファイル名において違法であることに留意されたい。セミコロン（「；」）は探索経路内のエントリを区切るために用いられるので、セミコロンは探索経路エントリにおいて用いられるべきでない。経路名には空白を埋め込むことができるが、経路名の直前及び直後に生じる（すなわち、経路名内の空白でない最初の文字の前及び最後の文字の後の）全ての空白は経路名の一部であるとは見なされず、全て無視されるであろうことに留意されたい。
５．探索経路ディレクトリは、定義の中に現われた順序に探索されるであろう。最初に現われたファイルが選択されるであろう。
【０４７９】
［Ｅ．試験パターン］
非常に大きな１組の試験パターンファイルの効率的な管理、取り扱い及びローディングは、本発明の１つの実施形態のフレームワークのアーキテクチャに関する重要な側面である。階層的なパターンリストの概念は、扱いやすい概念化を提供し、エンドユーザがシステムを使いやすくする際の効率的な手段であると見なされる。
【０４８０】
ＤＵＴへの刺激は、試験ベクトルを通して試験システムが入手できるようになる。ベクトルは一般的に、シーケンシャル（又は線形）、スキャンあるいはアルゴリズムパターン発生器（ＡＰＧ）導出として分類することができる。本発明の１つの実施形態のシステムでは、試験ベクトルは、試験時にＤＵＴに加えられるパターンの観点から編成される。パターンは、ユーザの試験プログラム内のパターンオブジェクトによって表される。そのシステムでは、パターンは、パターンリストオブジェクトによってプログラムに基づいて表されるパターンリストとして編成される。パターンリストオブジェクトは、パターンの順序付きリスト又は他のパターンリストを表す。その順序は、リストコンポーネントの宣言の順序で暗示される。ただ１つのパターンしか必要とされない場合には、そのパターンはそれだけでリスト内にカプセル化される必要があることに留意されたい。
【０４８１】
ユーザの試験プログラム内のパターンリストオブジェクトは、ディスク上のパターンリストファイルに関連付けられ、そのファイルはパターンリストの実際の定義を含む。こうして、パターンリストの内容は、関連するディスクファイルの内容によって動的に判定される（これについては後にさらに説明されるであろう）。
【０４８２】
パターンリストの定義は、そのパターンリストのための明示的な名前を与え、ファイル名の連想を通して、パターンの順序付きリスト及び／又は他のパターンリストを特定する。それは、実行オプションの仕様も提供し、それらのオプションはパターンリスト及びパターンの両方に適用されることができるので、パターンオブジェクトが説明された後にさらに詳細に説明されるであろう。パターンリストは以下の規則に従うべきである。
【０４８３】
file-contents :
version-info global-pattern-list-definitions
version-info :
Version version- identifier;
global-pattern-list-definitions :
global-pattern-list-definition
global-pattern-list-definitions global-pattern-list-definition
global-pattern-list-definition :
global-pattern-list-declaration {list-block}
global-pattern-list-declaration :
GlobalPList pattern-list-name optionsopt
list-block :
list-entry
list-block list-entry
list-entry :
pattern-entry ;
pattern-list-entry ;
global-pattern-list-definition ;
local-pattern-list-definition
pattern-entry :
Pat pattern-name optionsopt
pattern-list-entry :
PList pattern-list-reference optionsopt
pattern-list-reference :
pattern-list-qualified-name
file-name ':' pattern-list-qualified-name
pattern-list-qualified-name :
pattern-list-name
pattern-list-qualified-name '.' pattern-list-name
local-pattern-list-definition :
local-pattern-list-declaration {list-block}
local-pattern-list-declaration :
LocalPList pattern-list-name optionsopt
options :
option
options option
option :
[option-definition]
option-definition :
option-name option-parametersopt
option-parameters:
option-parameter
option-parameters ',' option-parameter 
【０４８４】
以下は、先に用いられた未定義の非終端記号の記述である。
１．version-identifier：集合［０−９］からの１つ又は複数の文字からなる文字列であり、最初の文字は数字でなければならない。
２．name：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列であり、最初の文字は［ａ−ｚＡ−Ｚ＿］から選択されなければならない。
３．pattern-list-name：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列であり、最初の文字は［ａ−ｚＡ−Ｚ＿］から選択されなければならない。
４．file-name：有効なウインドウズファイル名（ファイル名内に任意の空白が含まれる場合には、それは二重引用符で囲まれなければならない）。これは単純なファイル名でなければならない、すなわちディレクトリコンポーネントを持つべきでないことに留意されたい。pattern-list-referenceは、同じファイル内のパターンリストを内部参照することができるか、又は別のファイル内のパターンリストを外部参照することができる。外部参照はファイル名によって修飾される必要がある。
５．oprion-name：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列であり、最初の文字は［ａ−ｚＡ−Ｚ＿］から選択されなければならない。
６．option-parameter：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列。
【０４８５】
パターンリストファイルはコメントをサポートし、コメントはパターンリストファイルパーサによって無視されなければならない。コメントは「＃」文字で開始し、その行の終わりまで続く。
【０４８６】
［Ｅ１．パターンリストのための規則］
パターンリストのための静的規則又はコンパイル時の規則は宣言及び名前の分解を規定する。パターンリスト言語内の名前は、global-pattern-list-definition及びlocal-pattern-list-definitionによって宣言される。それらの名前は、pattern-list-referenceによって参照される。以下は、これらの宣言及び参照を規定するいくつかの規則である。
１．global-pattern-list-definition又はlocal-pattern-list-definitionはパターンリストの名前を宣言する。pattern-list-referenceは、宣言されたパターンリストの名前を参照する。グローバルパターンリストの名前はグローバルに知られている。ローカルパターンリストの名前は、それらの宣言されたリストブロック内でのみ知られている。それらの名前は、修飾を用いることなく、そのリストブロック内で直に参照されることができる。さらに深くネストされた宣言では、ローカルパターンリストは、修飾された名前によって参照される必要があるであろう。
２．ローカルパターンリスト名は、包含パターンリストの範囲内で知られており、グローバルパターンリスト名はシステムの範囲内で知られている。たとえば、以下を参照されたい。
【０４８７】
GlobalPList Gl
{
LocalPList L1
{
LocalPList L2
{
...
}
GlobalPList G2
{
...
}
PList L2;      # OK. Name L2 is known in this scope
PList G2      # OK. Name G2 is global
}
PList L2;         # Error. Name L2 is not known here.
PListL1.L2;      # OK. Name L1 is known here. L2 is known by
#   qualification.
PList G1.L1.L2;  # OK. Qualification by G1 is not needed but
# is allowed.
PList G2;         # OK. Name G2 is global 
}
３．グローバルパターンリストはパターンリストファイルの最も外側のレベルにおいて定義されることができるか、又は包含パターンリスト内でネストされるように定義されることができる。しかしながら、そのネスティングは単に便宜的なものである。それらは、ファイル内の最も外側のレベルにおいてグローバルパターンリストとして概念的に定義される。ネストされたグローバルパターンリストは、同じ名前の最も外側の（ネストされない）グローバルパターンリストと意味的に同等である。したがって、たとえば、以下を参照されたい。
【０４８８】
GlobalPList Gl
{
GlobalPList G2
}
is semantically equivalent to:
GlobalPList G1
{
PList G2; # References G2
}
GlobalPList G2 ...
４．全てのグローバルパターンリストは固有に名前を付けられる。
【０４８９】
GlobalPList G1
{
# Note that this is as if declared at the outermost level
# with a reference to it right here.
GlobalPList G2
{
...
}
}
# This declaration will be an error in this or any other file,
# as the name G2 is already taken.
GlobalPList G2 # Error.  Global name G2 is taken.
{
...
}
５．ローカルパターンリストは常に、ローカルパターンリストの名前の範囲も決定する、包含パターンリスト内でネストされた定義を有する。ローカルパターンリストは、その包含パターンリスト内で固有に名前を付けられる。ローカルパターンリストは構文的に、パターンリストファイル内の最も外側のレベルにおいて生じることを許されない。
【０４９０】
GlobalPList G1
{
LocalPList L
{
}
LocalPList L2
{
LocalPList L1 # OK. No local name L1 is declared
directly
# in the enclosing scope defined by L2.
{
}
PList Ll;    #OK. Refers to Ll declared in L2
PListG1.L1; #OK. Refers to L1 declared in G1.
}
# Error. Redeclaring name L1 when the enclosing scope
# defined by G1 already has an Ll declared in it.
LocalPList L1;
{
}
}
６．各パターンリストファイルは、１つ又は複数のグローバルパターンリストのための定義を含む。これは構文から直に生じる。最も外側のレベルはglobal-pattern-list-definitionであり、それらのうちの少なくとも１つが存在しなければならない。
７．Pattern-nameは、Ｐａｔキーワードに続く、１つのパターンへの参照である。それは、その名前が接尾語．ｐａｔをパターン名に連結することによって得られるパターンファイル内に存在するパターンを参照する。そのファイルは、パターンのために定義された１つの探索経路に沿って得られることになる１つのファイルを示す。
８．pattern-list-referenceは、PListキーワードに続くパターンリストへの参照である。その参照は、オプションのファイル名、及びそれに続く、修飾されたパターンリスト名からなり、そのパターンリスト名は単に、ドットによって分離される名前のリストである。したがって、たとえば、以下は、ファイルfoo.plist内にあるグローバルパターンリストＧ１内にネストされるＬ１内にネストされるＬ２内にネストされるローカルパターンリストＬ３を参照するpattern-list-referenceとして用いることができる。その名前の最も左側の名前部分はＧ１である。
【０４９１】
PList foo.plist:G1.L1.L2.L3;
【０４９２】
最も左側の名前部分は、グローバルパターンリストに分解しなければならないか、又は参照点から見ることができるローカルパターンリストに分解しなければならない。
【０４９３】
pattern-list-referenceの名前分解は以下のように進められる。
１．各名前部分は、その前にある接頭部に照らして宣言される名前に分解する。
２．ファイル修飾がある場合には、最も左側の名前部分は、名前を付けられたファイルにおいて宣言されるグローバルパターンリストに分解する。
３．ファイル修飾がない場合には、最も左側の名前は、包含範囲内のローカルパターンリストに分解することができ、それが失敗する場合には、次の包含範囲内のローカルパターンリストに分解することができ、それが包含グローバル範囲まで続けられる。
４．グローバル範囲がパターンリストファイル内の最も外側のレベルにおいて宣言されたかのように、グローバル範囲の意味を保持するために、最も近くにある包含グローバル範囲への範囲の探索を制限する必要がある。ネストされたグローバル範囲が最も外側のレベルにおいて（同等に）テキスト形式で宣言された場合には、名前分解探索は、その範囲を検査した後に終了するであろう。
５．その参照が以前のステップによって分解されていなかった場合には、最も左側の名前部分が、この同じファイル内のグローバルパターンリストに分解されることができる。
６．その参照が以前のステップによって分解されていなかった場合には、最も左側の名前部分が、.plist接尾部を最も左側の名前部分に追加することにより、そのファイル内で名前を付けられるグローバルパターンリストに分解されることができる。
７．その参照が以前のステップによって分解されていなかった場合には、その参照はエラー状態である。
【０４９４】
先に述べられたように、上記の規則は、最も左側の名前部分が、参照点から見ることができるローカルパターンリスト、又はグローバルパターンリストのいずれかに分解することを指示する。
【０４９５】
以下の例はこれらの概念のいくつかを例示する。
【０４９６】
GlobalPlist G1
{
PList G3; # OK. Refers to a pattern list later in this file.
PList G4; # OK. Refers to a pattern list in file "G4.plist
# OK. Refers to Gl in the file "my_plists.plist".
PList my_plists.plist:Gl;
# OK. Refers to a pattern list in file "my_plists.plist". The
# qualified name refers to a local pattern list named L2
declared
# in the scope of a local pattern list named L1 declared in
the
# scope of a global pattern list named G1.
PList my_plists.plist:Gl.Ll.L2;
LocalPList L1
{
LocalPList L2
{
}
}
PList L1; # OK. Refers to L1 declared in the
# enclosing scope of Gl
}
GlobalPlist G2
{
LocalPList L2
{
}
GlobalPList G3
{
LocalPList L3
{
}
PList L1;   # Error. No L1 declared in this or any enclosing
# scope;
# Error. The name L2 is not declared in this scope. Also
# though L2 is declared in the enclosing scope, this scope
# is global, and so no further enclosing scope is examined.
#
# Contrast with reference to name L2 in LocalPList L3 below.
PList L2;
PListG1.L1;   #OK. Refers to L1 in G1.
# Error. G3 is not really nested inside G1.  Since G3
# is global, it is really declared at an outermost level,
# and so G1.G3 is meaningless.
PList G2.G3.L3;
}
LocalPList L3
{
# OK. Refers to G2.L2. The enclosing global scope is G2
# and the name L2 is declared in G2.
PList L2;
}
}
【０４９７】
全てのパターンリストファイル名及びパターンファイル名は、それらを用いる試験計画の中で固有であることが要求される。
【０４９８】
パターンリスト参照は、同じファイル内の参照の前後いずれかにおいて定義されるパターンリストを参照することができる。
【０４９９】
再帰的及び相互に再帰的なパターンリスト定義は許されない。ユーザがそのような定義を作成するのを防ぐために、パターンリストファイル構文内には何も存在しないが、パーサがそのような条件を検出するとき、パーサはエラーフラグを立てるであろう。そのような条件を検出することに関連して或るコストがかかることに留意されたい。ユーザは、入力空間が相互に再帰的な定義を免れることを保証する責任を負うことができるか否かの検査のスイッチを切ることができるであろう。
【０５００】
GlobalPList G1
{
LocalPList L2
{
LocalPList L3
{
# Error. L2 runs L3 which runs L2.
# This is a recursive reference to L2
PList L2;
PList G2;
}
}
}
GlobalPList G2
{
# Error. G1.L2 runs L3 which runs G2 which runs GI.L2.
# This is a mutually recursive reference to G1.L2.
PList G1.L2;
}
【０５０１】
パターン及びパターンリストの構文的な記述は、それらの記述においてオプションを指定できるようにする。一般的に、オプションはベンダ特有である。構文は、任意のパターン又はパターンリストが、それぞれ複数のパラメータで指定される複数のオプションを有することができるようにする。大部分のベンダによって認識されることになるいくつかのサポートされるオプションが記述される。
【０５０２】
パターン実行シーケンスを定義した後に、パターン木の動的な（すなわち実行時の）意味が記述される。
【０５０３】
［Ｅ２．パターン］
図６は、本発明の一実施形態によるパターンコンパイラ６０２及びパターンローダ６０４を示す。パターンのユーザ定義の内容は、プレーンテキストファイルであるパターンソースファイル６０６において入手することができる。パターンコンパイラは、ソースファイルを、テスタハードウエア上にロードするのに適したモジュール特有のフォーマットにコンパイルする責任を担うであろう。この後者のファイルはパターンオブジェクトファイルと呼ばれるであろう。以下はその一般的な属性である。
１．パターンオブジェクトは、ユーザが作成することはできない。むしろ、ユーザは、他のパターンリスト及び／又はパターンのコレクションであるパターンリストを常に取り扱う。パターンリストオブジェクトは、必要に応じてユーザがアクセスできるようにしながら、その中に含まれるパターンオブジェクトを作成し、所有し、保持する。
２．パターンは１つの試験計画内で固有に名前を付けられる。すなわち、その試験計画内では、同じ名前を有する２つのパターンは存在することはできない。パターンの名前は、それを含むファイルの名前とは異なる。パターンファイル名は、１つのパターンを参照するためにパターンリストファイルにおいて用いられる名前であり、一方、そのパターンの実際の名前はパターンファイルにおいて定義される。
【０５０４】
本発明の一実施形態では、一般的に、ただ１つのＤＵＴ（被試験デバイス）が、種々のベンダからのテスタモジュールに接続されることもある。これは、全パターンのコンパイル−ロード−実行連鎖にとって複数の意味を有する。主なものがこのセクションにおいて説明される。
【０５０５】
［Ｅ３．パターンコンパイル］
こうして、パターンコンパイラ６０２は、（用いられるベンダ特有のデジタルモジュールに照らして）特定のサイト構成をターゲットにする必要がある。この説明の残りの部分において、用語「モジュール」は、一例として、デジタルモジュールを指すために用いられるであろう。種々のベンダからのモジュール６０８をシステムに組み込むことができるようにするために、以下の手順が好ましい。
１．各モジュールベンダは、動的にロード可能なライブラリ又は個別の実行可能プログラムの形で、自ら所有するモジュール特有のパターンコンパイラ６１０を提供する責任を担うであろう。このコンパイラライブラリ／実行可能プログラムは、最低でも、引き数とみなされる既知のcompile()関数を提供するであろう。
ａ．（１つ又は複数の）パターンソースファイルパス名のアレイ
ｂ．Pin Descriptionファイル名
ｃ．Socketファイル名
ｄ．コンパイルされるオブジェクトの宛先を指定するオプションのディレクトリパス名
ｅ．任意のベンダ特有のパラメータの指定を許可するストリング名／数値対のオプションのアレイ（他のベンダによって無視され得る）
２．パターンソースファイルは、２つの異なるタイプのセクションを収容するであろう。
ａ．全てのコンパイラがアクセス可能である情報を含む「共通」セクション（ただし、必ずしも用いられる必要はない）。
ｂ．固有ベンダコードによってそれぞれ特定され、特定のベンダコンパイラによって使用可能な情報のための１つ又は複数のオプションのベンダ特有のセクション。
３．ベンダのコンパイラは、パターンオブジェクトファイルを直に作成しないであろう。代わりに、テスタは、パターンコンパイラの一部であるオブジェクトファイルマネージャ（ＯＦＭ）６１４によって管理されるパターンオブジェクト「metafile」６１２を提供するであろう。パターンコンパイラは、システムコントローラとして動作するコンピュータ上に、又はオフラインで、たとえばシステムコントローラが接続されるネットワーク上に配置することができる。これまで抽象語において参照された「パターンオブジェクトファイル」は、実際にはこのオブジェクトメタファイルである。オブジェクトメタファイルは、パターンソースファイルと同じ名前を付けられることになり、ソースファイル拡張子がオブジェクトファイル拡張子によって置き換えられる。ＯＦＭは、このファイルの読出し及び書込みを行うためのアプリケーションプログラミングインターフェース（ＡＰＩ）を提供するであろう。オブジェクトメタファイルは、以下のものを格納するための手段を有するであろう。
ａ．共通ヘッダ情報
ｂ．対応するモジュール、及びそのモジュールためのパターンデータの場所を特定する情報を含む、モジュール特有のヘッダ情報
ｃ．モジュールベンダの要求に応じて編成され、モジュールベンダによって解釈されることができる、モジュール特有のパターンデータ
【０５０６】
ＯＦＭ  ＡＰＩによって、モジュールベンダのコンパイラは、モジュール特有のヘッダ情報及びデータをオブジェクトメタファイルに書き込むことができるようになるであろう。オブジェクトメタファイルのこのレイアウトによって、ターゲットにされたサイトにおいて２つ以上のモジュールが同じ場合であっても、パターンデータがモジュール毎に編成されるようになることに留意されたい。
【０５０７】
直接メモリアクセス（ＤＭＡ）のような効率的なデータ通信を利用することができる、モジュール特有のハードウエアローディング情報の生成を容易にするために、パターンコンパイラによって、さらに多くのベンダ供給構成情報が必要とされる場合もあることに留意されたい。
【０５０８】
［Ｅ４．モジュールのためのパターンロード］
各モジュールベンダが、一般的な手法に従い、自らのパターンローディング機構６１５を提供する責任を担うであろう。モジュール６０８のパターンオブジェクトメタファイル６１２は、種々のセクション６１６にモジュール特有のデータを格納する。ベンダインプリメンテーションは、パターンオブジェクトメタファイルから関連するモジュール特有のセクションにアクセスするために、ＯＦＭ  ＡＰＩを用いるであろう。さらにテスタフレームワークは、各モジュールのロードパターンメソッドをコールし、モジュール特有のデータをメタファイルの適当なセクションからモジュールにロードする責任を担う。
【０５０９】
［Ｅ５．パターンファイル］
各コンパイラベンダは複数のパターンのための種々のプレーンテキストフォーマットを完全に指定することができ、それは実際には大部分の場合に必要になるであろう。しかしながら、一般的に、全てのベクトルのために複数のモジュールにわたる統一性及び同一の意味が必要になる、サイクルベースの試験環境の場合、パターンファイルのための、共有され、一般化された構文が望ましいだけでなく、必要になるであろう。この共有された構文は、パターンソースファイル内の「共通」セクションのために指定されることになる構文である。実際には、大抵の場合に、「共通」セクションはパターンファイルにおいて必要とされる唯一のセクション（ヘッダ情報を除く）であり、全てのベンダのコンパイラはそのセクションにおいてのみ正常に動作することが想定される。このセクションは、全てのコンパイラが解釈できるべきである、パターンファイルのための規則を表す。パターンファイルは以下のように編成されるであろう。
【０５１０】
file_contents   :
version_info pattern_definitions
version_info   :
Version_version-identifier ';'
pattern_definitions   :
pattern_definition
pattern_definitions pattern_definition
pattern_definition   :
main_header '{' main_section '}'
main_header '{' main_section vendor-sections '}'
subr_header '{' subr_section '}'
subr_header '{' subr_section vendor_sections '}'
main_header   :
MainPattern identifier
main_section   :
CommonSection '{'common_contents
main_section_domains '}'
common_contents   :
timing_reference timing_map_reference
timing_reference   :
Timing file-name ';'
timing_map_reference
TimingMap file-name ';'
main_section_domains   :
main_section_domains main_section_domain
main_section_domain
main_section_domain   :
Domain domain_name '{'main_section_contents'}'
domain_name   :
identifier
main_section_contents :
main_section_contents main_section_content
main_section_content
main_section_content   :
label_spec main_pattern_spec
main_pattern_spec
label_spec   :
label ':'
label   :
identifier
main_pattern_spec   :
main_operation capture_mask_flag '{'
vectors_and_waveforms '}'
main_operation   : /* empty */
common_operation
jal_op
jsr_op
jsrc_op
jsc_op
exit_op
common_operation   :
idxi_op
idxin_op
jec_op
jech_op
jff_op
jffi_op
jni_op
ldin_op
nop_op
pause_op
sndc_op
sndt_op
stfi_op
sti_op
stps_op
wait_op
/*
* Instructions specific to the MAIN Patterns
*/
jsr_op      :
JSR identifier
jsrc_op      :
JSRC identifier
jsc_op      :
JSC identifier
jal_op:      :
JAL identifier
exit_op      :
EXIT
/*
* Instructions common to both MAIN and SUBR Patterns
*/
idxi_op      :
IDXI 24-bit number
idxin_op      :
IDXIn index-register
jec_op      :
JEC identifier
jech_op      :
JECH identifier
jff_op      :
JFF identifier
jffi_op      :
JFFI identifier
jni_op       :
JNI identifier
ldin_op      :
LDIN index-register
nop_op      :
NOP
pause_op      :
PAUSE
sndc_op      :
SNDC 8-bit number
sndt_op      :
SNDT 8-bit number
stfi_op      :
STFI 24-bit number
sti_op      :
STI 24-bit number
stps_op      :
STPS
wait_op      :
WAIT
capture_mask_flag   :/* empty */
capture_mask_flag   CTV
capture_mask_flag   MTV
capture_mask_flag   MATCH
vectors_and_waveforms : /* empty */
vectors_and_waveforms vector
vectors_and_waveforms waveform
vector      :
vector_declaration '{' vector_data '}'
vector_declaration   :
Vector
V
vector_data      :
vector_datum
vector_data vector_datum
vector_datum      :
pin_name '=' vector_value ';'
pin_name '=' identifier ';'
waveform      :
waveform_declaration '{' waveform_data '}'
waveform_declaration   :
Waveform
W
waveform_data      :
waveform_datum
waveform_data waveform_datum
waveform_datum      :
waveform-table-pin-group-name '=' identifier ';'
pin_name      :
identifier
vendor_sections      :
vendor_sections_vendor_section {}
vendor_section {}
vendor_section      :
VendorSection '{' vendor_section_contents '}'
subr_header      :
SubrPattern
subr_section      :
CommonSection '{' common_contents
source_selection_table subr_section_domains '}'
CommonSection '{' common_contents
subr_section_domains '}'
subr_section_domains   :
subr_section_domains subr_section_domain
subr_section_domain
subr_section_domain   :
Domain domain_name '{' subr_section_contents '}'
source_selection_table   :
SourceSelectionTable '{' source_selector_definitions '}'
source_selector_definitions   :
source_selector_definitions source_selector_definition
source_selector_definition
source_selector_definition   :
SourceSelector source_selector_name '{'
source_mappings '}'
source_selector_name   :
identifier
source_mappings   :
source_mappings source_mapping 
source_mapping
source_mapping
pin_name '=' source ';'
source      :
MAIN
INVERT_MAIN
SUBR
INVERT_SUBR
subr_section_contents   :
subr_section_contents subr_section_content
subr_section_content
subr_section_content   :
label_spec_subr_pattern_spec
subr_pattern_spec
subr_pattern_spec   :
subr_operation capture_mask_flag '{'
vectors_and_waveforms '}'
subr_operation   : /* empty */
common_operation
rtn_op
stss_op
/*
* Instructions specific to the SUBR Patterns
*/
rtn_op      :
RTN
stss_op      :
STSS identifier
【０５１１】
以下は、先に用いられた未定義の非終端記号の記述である。
１．version-identifier：集合［０−９］からの１つ又は複数の文字からなる文字列であり、最初の文字は数字でなければならない。
２．identifier：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列であり、最初の文字は［ａ−ｚＡ−Ｚ＿］から選択されなければならない。
３．vendor-section-contents：ベンダ特有のコンパイラに対してのみ意味のある任意のテキスト。
４．file-name：有効なウインドウズファイル名（ファイル名内に任意の空白が含まれる場合には、それは二重引用符で囲まれなければならない）。これは単純なファイル名でなければならない、すなわちディレクトリコンポーネントを持つべきでないことに留意されたい。
５．waveform-table-pin-group-name：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列であり、最初の文字は［ａ−ｚＡ−Ｚ＿］から選択されなければならない。この変数は他の場所で宣言され、ピンのグループに共通である波形テーブルの名前を保持する。
６．24bit number：最大１６７７７２１５までの有効な１０進数。
７．8bit number：最大２５６までの有効な１０進数。
８．index-register：有効な１０進数。１つのモジュールの実施形態では、これは値［１−８］を有することができる。
９．vector：これは、ＳＴＩＬ内のＶｅｃｔｏｒステートメントに類似である。これは、信号名及び信号グループ名を参照し、コンパイラがPin Descriptionファイルにアクセスできるようにするために必要になることに留意されたい。
１０．waveform-time-reference：集合［ａ−ｚＡ−Ｚ＿０−９］からの１つ又は複数の文字からなる文字列であり、最初の文字は［ａ−ｚＡ−Ｚ＿］から選択されなければならない。
【０５１２】
パターンファイルはコメントをサポートし、コメントはパターンファイルコンパイラによって無視されることになっている。コメントは「＃」文字で始まり、その行の終わりまで続く。
【０５１３】
パターンファイルのヘッダ及び「共通」セクションの構成体を参照して、以下の点に留意されたい。
１．pattern-name項目は、パターンファイルがそのためのデータを含むＰａｔｔｅｒｎオブジェクトに関連付けられることになる名前を指定する。これは、対応するパターンオブジェクトメタファイル内のヘッダに引き継がれるようになる。
２．waveform-time-referenceは、Timingファイル内の、パターンファイルに対して外部から定義されることになる特定のwaveform-and-timing定義のための名前である。パターンファイルにおいてwaveform-time-referenceを指定することにより、別のwaveform-time-referenceが現われるまで、（waveform-and-timingのための）特定の名前が全ての後続のベクトルに結合されるであろう。
３．サブルーチンコールのためのオペランド（たとえば、ＪＳＲ及びＪＳＲＣ）は、同じパターンファイルにおいて以前に現われたpattern-specラベル、又は外部から定義されたサブルーチンパターン内のpattern-specラベルであるストリングである。このオペランドは最終的には、サブルーチンをロード／処理するために分解されるであろう。サブルーチンコールオペランドのためのラベルは、システムにわたって固有である必要がある。
【０５１４】
waveform-time-reference名は、構文的に正確であるなら何でも用いることができるが、特定のハードウエア含意に起因して、waveform-time-reference名は予めわかっている明確な集合に限定される必要があり得る（さらに読みやすくするために、それはオプションでは、ユーザ選択の名前にユーザによってマッピングされることができ、そのマッピングはオプションのファイルにおいて提示される）ことに留意されたい。
【０５１５】
また、パターン及びwaveform-time-referenceソースファイルは、物理的なテスタチャネルに接続される全てのＤＵＴチャネルのための初期構成データを提供すべきであることにも留意されたい。任意のＤＵＴチャネルの場合に後続のデータが省略される場合には、パターンコンパイラは、パターンデータを「パッド」して、初期レベルからの出力を保持するであろう。
【０５１６】
［パターンファイル例］
MAIN Patternソースファイルの簡単な例が、その使用法を例示するのを助けるであろう。
【０５１７】
#
# Filename : good1.pat
#
Version 1.0 ;
# -------------------------------------------------------------
# Main Pattern definition: 
# -------------------------------------------------------------
MainPattern good1
{
CommonSection
{
MacroDef   defaultDataVal   (XXXXXXXX)
MacroDef   nopInstr    (NOP)
MacroDef   label1   (Label1:)
MacroDef   jniInst   (JNI)
# -------------------------------------------------------------
#   Timing Specifications
# -------------------------------------------------------------
Timing "productionTiming.tim";
TimingMap "productionTimingOpenSTARMap.tmap";
# -------------------------------------------------------------
#   Default Domain Cycles
# -------------------------------------------------------------
Domain default
{
# -------------------------------------------------------------
# label: instruction {Vector/Waveform Data}
# -------------------------------------------------------------
NOP         { V { DATA = $defaultDataVal; CLK = 1;} W
{DATA = wfs1; CLK = wfs1; } }
JAL   myAPG   { V { DATA = 00000000; } }
JSC   mySCAN   { V { DATA = 10101010; } }
JSRC   mySubroutine   { V { DATA = 01010101; } }
JSR   myAPG   { V { DATA = 00110011; } }
STI   100   { }
labZero:   NOP   { V { DATA = 00000011; } }
JNI   labZero   { V { DATA = 11111100; } }
IDXI   3000   { V { DATA = 10101010; } }
IDXIn   3   { V { DATA = 01010101; } }
$label1   NOP   { V { DATA = $defaultDataVal; } }
IDXI   2000   { V { DATA = 10101010; } }
NOP   { }
EXIT      { V { DATA =LLHHLLHH; } } 
}
}
}
【０５１８】
SUBROUTINEパターンソースファイルを例示する別の例が以下に示される。
【０５１９】
# -------------------------------------------------------------
# Subroutine Pattern mySubrPat1 definition:
# -------------------------------------------------------------
SubrPattern mySubrPat1
{
CommonSection
{
# -------------------------------------------------------------
#   Timing Specifications 
# -------------------------------------------------------------
Timing "productionTiming.tim";
TimingMap "productionTimingOpenSTARMap.tmap";
# -------------------------------------------------------------
#   Source Selection Specifications 
# -------------------------------------------------------------
SourceSelectionTable
{
SourceSelectorSrcSelDef
{
DATA=SUBR; CLK=SUBR; DATA=SUBR;
}
SourceSelector SrcSelOne
{
DATA=MAIN; CLK=MAIN;
}
}
# -------------------------------------------------------------
#   Default Domain Cycles
# -------------------------------------------------------------
Domain default
{
# -------------------------------------------------------------
# label :   instruction   { Vector and Waveform Data setups }
# -------------------------------------------------------------
STI   100   { Vector { DATA =00000000; } }
IDXI   3000   { Vector { DATA = 00001111; } }
IDXIn   3   { Vector { DATA = 00110011; } }
$label1   NOP   { Vector { DATA =LLHHLLHH; } }
NOP   { Vector { DATA =LLXXXXXX; } }
NOP   { Vector { DATA =LLHHXXXX; } }
JNI Label1   { Vector { DATA =LLHHLLHH; } }
STSS SrcSelOne   { Vector { DATA = LHLHLHLH; } }
RTN   { Vector { DATA = LLXXXXXX; } }
}
}
}
【０５２０】
パターンソースファイル内のメインヘッダ及び共通セクションからの要約情報は、オブジェクトメタファイル内のメインヘッダに格納される。その要約は、アドレス等のプリロード分解を助けるために、又はデータロギングにおいて助けるために、迅速に抽出するために通常必要とされる情報からなる。共通セクションの意味は全てのコンパイラの場合と厳密に同じであるので、全てのコンパイラが同じ要約情報を提供することができ、メタファイルを書く第１のコンパイラがこの情報を格納するであろう。以下は、格納されることになる情報である。
１．パターンソースファイル名
２．ソースファイルにおいて宣言されるようなパターンのタイプ
３．ソースファイルからのバージョン情報
４．パターンソースファイルの共通セクションにおいて用いられる全てのwaveform-and-timing名のリスト
５．パターンソースファイルの共通セクション内の（相対的な）ベクトルアドレスへの全てのサブルーチン参照のマップ
６．パターンソースファイルの共通セクション内の（相対的な）ベクトルアドレスへの全てのラベル参照のマップ
７．一般的なブックキーピング情報：ベクトルカウント、命令カウント等。
【０５２１】
オープンアーキテクチャ試験システムは、明示的で、且つ異なる拡張子を有するために、パターン及びパターンリストファイルの両方を必要とする。パターンファイルの場合、これは、プレーンテキストソース及びコンパイルされたオブジェクトファイルの両方に当てはまる。これは、ディレクトリリスティング等において視覚的にファイルタイプを迅速に特定するために、及び拡張子に基づいて連想がなされるようにするために、ユーザにとって好都合であると考えられる。パターンリストファイルパーサは、これらの拡張子を用いてファイル名を予想するであろう。
プレーンテキストパターンソースファイル：.pat
コンパイルされたパターンオブジェクトメタファイル：.pobj
パターンリストファイル：.plst
【０５２２】
ユーザは、たとえば、テスタ環境変数又は設定オプションを通して、これらのデフォルト値を無効にすることができる。
【０５２３】
テスタは、以下に記述される環境構成ファイルのうちの少なくとも１つにおいて、ファイル探索経路のための以下の「環境」変数の定義を必要とするであろう。
Tester_PATLIST_PATH：パターンリストファイルの場合。
Tester_PATSRC_PATH：パターンソースファイル（オプション）の場合。
Tester_PATOBJ_PATH：パターンオブジェクトメタファイルの場合。
【０５２４】
オプションの環境／設定変数Tester_PATSRC_PATHが定義されない場合には、Tester_PATOBJ_PATHと同じであると仮定されることに留意されたい。一般的に、Tester_PATOBJ_PATHと同じ値である場合、Tester_PATSRC_PATHを定義するよりも、定義しないほうが、より効率的であろう。
【０５２５】
［Ｅ６．ソフトウエア表現］
パターンオブジェクトはユーザによって作成されない。むしろ、ユーザは常に、他のパターンリスト及び／又はパターンのコレクションであるパターンリストオブジェクトを処理する。ユーザがアクセスできるようにしながら、パターンリストオブジェクトは、その中に含まれるパターンオブジェクトを作成し、所有し、保持する。ユーザの試験プログラム内のパターンリストオブジェクトは、パターンリストの実際の定義を含む、ディスク上のパターンリストファイルに関連する。パターンリストの定義は、そのパターンリストのための明示的な名前を提供し、ファイル名連想を通して、パターンの順序付きリスト及び／又は他のパターンリストを特定する。このセクションは、パターンリスト及びパターンのソフトウエアがテスタフレームワークにおいて如何に操作されるかを理解するための前置きとして、それらのソフトウエア表現を記述する。
【０５２６】
［パターンリスト連想］
試験システム内の１つの試験サイト（及び拡大解釈して、その中にある試験計画）は、多数のトップレベルパターンリストに関連付けることができる。しかしながら、複数の試験計画に対して、常に１つの実行文脈だけが存在する。トップレベルパターンリストは、それによって（階層的に）参照されるパターンのための実行シーケンスを定義するので、アクティブな実行文脈は、現在選択されているトップレベルパターンリストに対応するものである。これは、ある時点において、１つのパターンリスト内に含まれるパターンだけがハードウエア上にロードされることができることを意味しないことに留意されたい。むしろ、１つの実行シーケンスを実行可能にするためにハードウエア上にロードされる必要がある１組のパターンは常に、現在ロードされている全てのパターンのサブセットでなければならない。
【０５２７】
［パターン木］
直観的には、トップレベルパターンリストを表現するための１つの方法は、ある種の木データ構造によると考えられる。図７は、本発明の順序付きのパターン木の１つの実施形態を示しており、パターンリストＡがトップレベルパターンリストであると仮定する。
【０５２８】
［パターン木情報内容］
以下の情報がパターン木の全てのノードにおいて格納されるであろう。
１．そのノードに関連するエンティティ（パターンリスト又はパターン）の名前。
２．定義ソースのタイプ。葉（パターンノード）の場合、これは常にパターンファイルになるであろう。中間（パターンリスト）ノードの場合、これは「トップレベルファイル」（トップレベルパターンリスト定義用）、又は「エンベデッド・イン・ファイル」（ネストされたパターンリスト定義用）のいずれかにすることができる。
３．そのノードが関連するディスク上のファイルの最後の変更タイムスタンプ。
【０５２９】
以下の付加情報は、中間（パターンリスト）ノードにおいてのみ格納されるであろう。
１．そのノードによって表されるパターンリストオブジェクト上に（もしあるなら）セットされる実行オプション、すなわちそのオブジェクトオプション。
２．その子毎に、そのノードによって表されるパターンリスト定義内の各子参照上に（もしあるなら）セットされる実行オプション、すなわち参照オプション。
【０５３０】
こうして、ルートから中間ノードへの固有の経路において現われるノードのコレクション、及びそれらに出合ったシーケンスは、そのノードによって表される、組み合わせられた有効な実行オプションを決定するために必要とされる全ての情報を含む。１つのパターンの実行オプションは、その中間の親の有効な実行オプションと、それと組み合わせた、その中間の親がそのために有することができる参照オプションによって決定される。
【０５３１】
ここで、パターンリストパーサがパターン木を作成している過程にあるときに、その使用の文脈が後の時点まで分解されない場合もあるので、ある特定の実行オプションが単にストリングとして値を最初に格納する必要があるかもしれないことに留意されたい。そのようなオプションの１つの例は「マスク」オプションであり、それは、ピンマスク情報を指定する。パターンリストはＳｏｃｋｅｔ情報に関連しないので、ピンマスクオプション（ピン及びグループ名）は、ローディング前に分解されるべきストリングとして格納される。
【０５３２】
以下の付加情報は葉（パターン）ノードにおいてのみ格納されるであろう。
１．実行木として編成される、外部及び内部両方のパターンによってコールされるサブルーチンへの全ての（おそらく遷移的な）参照。
【０５３３】
当然、全てのパターンノードはさらに、オブジェクトメタファイル共通ヘッダにおいて入手可能な全てのパターンファイル要約情報にアクセスでき、そしてそれらをキャッシュすることができるであろう。
【０５３４】
［パターンリスト変更の処理］
パターンリストの内容に対してなされる変更は概念的には、そのパターンリストへの全ての参照に影響を及ぼす。必要に応じてパターンオブジェクト及びパターンリストオブジェクトに適用される以下の規則が、そのような変更を管理するために用いられるであろう。
１．ディスク上のパターンリストファイルの内容に対してなされる変更は、そのパターンリスト上（又はそれを参照する任意の他のパターンリスト上）で実行されるｌｏａｄ（）コマンドにおいてのみ、試験システムの中に伝えられるであろう。言い換えると、ソフトウエア内のパターンリスト階層は常に、ハードウエア上に現在ロードされているパターンリストを反映するであろう。
２．ユーザは、パターンリストをそれらのディスクファイルソースと同期させるために、ロード時間中に行われる検査を無効にするモードをセットすることができるであろう。これにより、生成モードの動作を、より迅速且つ安全にすることができるであろう。
【０５３５】
［パターン木ナビゲーション］
試験サイト（及び拡大解釈して、そのサイトのための試験計画）に関連するトップレベルパターンリストは公開（グローバル）範囲を有する。そのシステムは、ユーザが個々のノード及び副木にアクセスできるように、トップレベルパターンリストを表すパターン木をナビゲートするためのＡＰＩを提供する。
【０５３６】
［Ｅ７．パターンリスト動力学］
パターンリストの静的な規則は先に説明された。パターンリストの動的な（実行）規則の記述がここで提示される。
【０５３７】
パターン木は包括的なパターン管理のために不可欠である。たとえば、１つのパターンロードシーケンスのための開始点は、サイト又は試験計画に現在関連しているパターン木上でのload()メソッドへのコールである。しかしながら、１つのパターン木は孤立して動作しない。完全に初期化されたパターン木を用いて、以下の２つのフレームワークオブジェクトが作成されるであろう。
【０５３８】
１．トップレベルパターンリストは、複数のパターンのための１つのPattern Execution Sequenceを定義する。それは、そのような実行シーケンスをそのトップレベルパターンリストに対応するパターン木から如何に導出することができるかを記述する。たとえば、図７に示されるパターン木Ａに対応するパターン実行シーケンスは｛ｑ、ｓ、ｔ、ｑ、ｒ、ｑ、ｕ、ｕ、ｖ｝である。Pattern Execution Sequenceは概念的には、そのパターン木を通して記述される実行シーケンスを反映する順序木である。フレームワークは、パターン木ノードと、Pattern Execution Sequence内の対応するエントリとの間の任意の必要なナビゲーションリンクを確立し、保持する。
【０５３９】
２．Pattern Setは、そのパターン木内の全ての固有のパターン（サブルーチンを含む）のリストに過ぎない。したがって、これは、ハードウエア上にロードされるべきである個々のパターンを決定するために用いられることになるリストである。フレームワークは、パターン木ノードと、Pattern Set内の対応するエントリとの間の任意の必要なナビゲーションリンクを確立し、保持する。図７のパターン木のためのPattern Setは（ｑ、ｓ、ｔ、ｒ、ｕ、ｖ）である（パターンリストＡ内のパターンはいずれも如何なるサブルーチンコールも含まないものと仮定される）。
【０５４０】
Pattern Execution Sequence及びPattern Setはいずれも、常に、パターン木から導出することができることに留意されたい。しかしながら、多くの場合に、実用的である限り、初期構成後に、それらをキャッシュことが理にかなっているであろう。
【０５４１】
［パターンリスト実行オプション］
上記のように、各パターンリスト宣言（その定義に先行する）又はパターンリスト／パターン参照エントリの後に、多数の実行オプションが続くことができる。パターンリスト実行オプションは、パターンリストのランタイム実行を変更する。さらに拡張できるようにするために、これらのオプションのための名前（及びオプション値）がパターンコンパイラのパターンリストファイルパーサによって単にストリングとして処理され、必要に応じて特定のバージョンによって解釈されることになる。テスタは、以下に記述される、１組のオプション及びそれらの解釈を規定する。しかしながら、ベンダはその１組のオプションを拡張することができる。オプション構文をパース時に妥当性検査できるようにするために、パターンリストファイルパーサは、ある特定のバージョンのための情報ファイルを読み出すことができる。そのような情報ファイルを用いて、ある特定のバージョンがそもそも実行オプションの指定をサポートするか否かを指定することもできる。
【０５４２】
１組の実行オプションをサポートするバージョンの場合、以下の一般的な規則がそれらの使用法を決定するであろう。これらの規則を理解するために、パターンリスト／パターンの階層的なコレクションを順序木として視覚化することが有用である。
１．パターンリスト定義上（すなわち、ファイル内の「local-pattern-list-declaration、global-pattern-list-declaration」生成物内）でセットされるIntrinsicオプションは、事実上、ユーザの試験プログラム内の対応するパターンリストオブジェクト上での直接的なオプション設定である。したがって、これは、そのパターンリストオブジェクトへの全ての参照に当てはまり、オブジェクトオプションと呼ばれる。
２．パターンリスト／パターンへの参照上（すなわち、ファイル内の「pattern-entry」及び「pattern-list-entry」生成物内）でセットされるReferentialオプションは、オプションの範囲を、その階層内の特有の経路、すなわち木のルートから考慮中の参照に導く経路（パターンリスト／パターンの宣言順序によって確立される）に制限する。したがって、これらは、特定のオブジェクト参照上のオプションであり（且つ、オブジェクトそのものにおけるオプションではない）、参照オプションと呼ばれる。
３．コレクション階層（パターンリスト／パターンの宣言順序によって確立される）内の任意のリスト／パターンのための有効オプション設定は、木のルートからそのリスト／パターンまでの経路に沿って出合うオブジェクトオプション及び参照オプションの組み合わせである。その特定の組み合わせの仕組み（たとえば、集合の結び、集合の交わり、又は任意の他の競合解消アルゴリズム）は、オプションそのもののプロパティである。
【０５４３】
上記の規則の結果、そして１つのパターンファイル内のパターン定義上で実行オプションをセットするためのファシリティがないという事実は、１つのパターンへの全ての参照に当てはまるオプションをセットするための直接的な規則が存在しないということであることに留意されたい。これを果たすための仕組みは、単一パターンのパターンリストを用いることである。
【０５４４】
テスタは、そのバースト挙動を変更し、その実行シーケンスを変更する、ある１組のパターンリスト実行オプションを指定する。
【０５４５】
１つのパターンリストのための実行シーケンスがハードウエアに提示されるとき、ハードウエアはバーストを生成する。Burstは、ソフトウエアが何も関与することなく、ハードウエアによって直にパターンのシーケンスを実行することである。Burst Discontinuityは、先行するバーストが終了し、新たなバーストが開始される、実行シーケンス内の場所である。
【０５４６】
パターン管理ソフトウエアの目的の１つは、バーストを生成するために必要とされる実行シーケンスをハードウエアに与えることである。デフォルトによって、１つのパターン木は１つの実行シーケンスを生成し、それがハードウエアに提示される場合には、結果として１つのバーストが生成されるであろう。しかしながら、この挙動は、パターンリスト上でオプションを用いることにより変更することができる。したがって、オプション結果を用いる結果として、バースト不連続部が生じ得る。
【０５４７】
さらに、ユーザは多くの場合に、全てのパターン又は全てのバーストの前又は後に実行されることになるプロローグ又はエピローグパターンを必要とするであろう。これは、ハードウエアに提示されることになる実行シーケンスを変更する。
【０５４８】
Pattern Execution Sequenceオブジェクトの作成又は変更中に、フレームワークは、指定された実行オプションと、パターン木によって具現される特定の実行シーケンスとの組み合わせから生じるパターンバースト内のブレークを判定するために必要な全ての情報を有し、必要に応じて報告する。これを果たすときに、システム内のモジュールのハードウエア能力を調査することが必要な場合もある。たとえば、１つのハードウエアインプリメンテーションによれば、ピンマスクのために４つの構成を格納できるようになり、そのうちの２つ（０及び３）は（Mask This Vector、ＭＴＶをサポートするために）デフォルトマスク及びアンマスク演算のために用いられる。こうして、ユーザは、バーストモードをブレークすることなく、２つの異なるグローバルピンマスク構成を許される。
【０５４９】
或るモジュールベンダがハードウエアにおいてパターンリストインプリメンテーションをサポートしない場合には、Pattern Execution Sequenceのベンダの処理の結果として、実行シーケンス内の全てのパターンが個別に実行されることになることに留意されたい。Site-Compatible及びSite-Heterogeneousの両方のシステムにおいて、サイトのバースト能力は、「最小共通分母」によって制限されるであろう。テスタは、ある特定のデフォルトの１組のオプションを提供し、それらのパラメータが以下に記述される。各オプションは以下のことを述べることにより指定される。
・それがIntrinsicである（すなわち、Global又はLocalキーワードを伴う定義に関連する）か、Referentialである（すなわち、Pat又はPListキーワードを伴う参照に関連する）か。Intrinsicオプションは、定義の場所及び全ての参照において当てはまるが、Referentialオプションは、それらが関連する参照においてのみ当てはまる。
・さらに、オプションが全ての静的に（構文的に）又は動的に（参照されることにより意味的に）ネストされたパターン又はパターンリストに再帰的に当てはまるものと仮定される場合には、そのオプションは「子によって継承される」と言われる。
【０５５０】
以下はオプションのリストである。全ての準拠するベンダは、これらのオプションを指定されたとおりに解釈するであろう。
１．Mask<pin/pin group>
GlobalPList、LocalPListに適用されるときにIntrinsic。
PList、Patに適用されるときにReferential。
子によって継承される。
このパターンリストは常に、使用禁止の指示されたピン又はピングループによって参照されるピンの比較回路を有するであろう。多くの場合に、ハードウエアの制限の結果として、バースト不連続部が生じることになる。
２．BurstOff
GlobalPList、LocalPListに適用されるときにIntrinsic。
PList、Patに適用されるときにReferential。
子によって継承されない。
このパターンリストは常に、非バーストモードにおいて実行されるであろう。このオプションは子によって継承されないが、BurstOffDeepオプション（下記）は子によって継承される。
３．BurstOffDeep
GlobalPList、LocalPListに適用されるときにIntrinsic。
PList、Patに適用されるときにReferential。
子によって継承される。
このパターンリストは常に、非バーストモードにおいて実行されるであろう。このオプションは子によって継承されるが、BurstOffオプション（上記）は子によって継承されない。BurstOffDeepオプションは子によって消されないことに留意されたい。
４．PreBurst<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
指定されたバーストオプションを有しない子ノードによってのみ継承される。
指示されるパターンは、このパターンリスト内の全てのバーストに前置されるべきである。PreBurstパターンは、このパターンリストノードに起因して開始される全てのバーストの直前に生じる。そのオプションは、同じパターンであるPreBurstオプションを有するバースト内に既にあるときには適用されない。
５．PostBurst<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
指定されたバーストオプションを有しない子ノードによってのみ継承される。
指示されるパターンは、このパターンリスト内の全てのバーストに後置されるべきである。PostBurstパターンは、このパターンリストノードに起因して開始される全てのバーストの直後に生じる。そのオプションは、同じパターンであるPostBurstオプションを有するバースト内に既にあるときには適用されない。
６．PrePattern<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
指示されるパターンは、このパターンリスト内の全てのパターンに前置されるべきである。
７．PostPattern<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
指示されるパターンは、このパターンリスト内の全てのパターンに後置されるべきである。
８．Alpg<alpg object name>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
名前付きＡＬＰＧオブジェクトは、低速ＡＰＧレジスタ設定、読出し待ち時間、中間データレジスタ、アドレススクランブル、データ反転、データ発生器等の関連する情報を格納する。
９．StartPattern<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
そのパターンリストは、その実行シーケンスにおいてStartPatternが最初に現われるときに実行し始めるであろう。
１０．StopPattern<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
そのパターンリストは、その実行シーケンスにおいてStopPatternが最初に現れるときに実行するのを止めるであろう。
１１．StartAddr<vector offset or label>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
これはStartPatternオプションを伴わなければならない。そのパターンリストは、その実行シーケンスにおいてStartPatternが最初に現われるときのStartAddrにおいて実行し始めなければならない。
１２．StopAddr<vector offset or label>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
これはStopPatternオプションを伴わなければならない。そのパターンリストは、その実行シーケンスにおいてStopPatternが最初に現われるときにStopAddrにおいて実行するのを止めなければならない。
１３．EnableCompare_StartPattern<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
パターン比較は、指示されるパターンが最初に現われるときに開始するであろう。
１４．EnableCompare_StartAddr、EnableCompare_StartCycle
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
これは、EnabelCompare_StartPatternを伴わなければならない。パターン比較が開始することになるパターン内のアドレス又はサイクルを指示する。
１５．EnableCompare_StopPattern<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
パターン比較は、指示されるパターンが最初に現われるときに終了するであろう。
１６．EnableCompare_StopAddr、EnableCompare_StopCycle
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
これは、EnableCompare_StopPatternを伴わなければならない。パターン比較が終了することになるパターン内のアドレス又はサイクルを指示する。
１７．Skip
PList、Patに適用されるときにReferential。
子によって継承されない。
パターンリストによって支配されるパターン又はサブシーケンス全体がスキップされるようにする。これは、このパターンリスト副木のルートにおいて全てのオプションもスキップさせるであろう。それは、このパターン副木が実行するために存在しなかったかのようにする。
【０５５１】
［パターンリストバースト制御］
先に説明されたように、或るパターンリストのための実行シーケンスがハードウエアに提示されるとき、ハードウエアは、ソフトウエアが関与することなく、パターンのシーケンスのバーストを生成する。バースト不連続部は、先行するバーストが終了し、新たなバーストが開始される、実行シーケンス内の場所である。上記のオプションリストに示されるように、PreBurst、PostBurst、BurstOff及びBurstOffDeepオプションは、バースト不連続部が生じる場所を制御する。PreBurst及びPostBurstオプションは、以下に記述されるある特定の付加的な規則に対するバースト不連続部サブジェクトを決定する。
１．親リストがPreBurst及びPostBurstオプションを有し、ネストされたリストが同じ対応するオプションを有するとき、バースト不連続部は存在せず、ネストされたリストのPreBurst及びPostBurstオプションは当てはまらない。親リストのPreBurst及びPostBurstを適用するただ１つのバーストだけが存在する。
２．ネストされたリストがバーストオプションを持たないとき、それは、これらのオプションの記述によって親リストと同じPreBurst及びPostBurstオプションを有することと同じであることに留意されたい。結果として、バーストオプションを持たないネストされたリストはバースト不連続部を生じない。
３．上記の規則１が当てはまらず、且つ親リストの開始からネストされたリストの開始までパターン実行シーケンスへの寄与がある場合には、ネストされたリストの開始時にバースト不連続部が存在する。この場合、親リストのPreBurst及びPostBurstは、親リストからのパターン実行シーケンスへのこの寄与に当てはまる。ネストされたリストのPreBurst及びPostBurstは、ネストされたリストに当てはまる。
４．上記の規則１が当てはまらず、且つネストされたリストの終了から親リストの終了までのパターン実行シーケンスへの寄与がある場合には、ネストされたリストの終了時にバースト不連続部が存在する。この場合、親リストのPreBurst及びPostBurstは、親リストからのパターン実行シーケンスへのこの寄与に当てはまる。ネストされたリストのPreBurst及びPostBurstは、ネストされたリストに当てはまる。
５．上記の規則１が当てはまらず、且つネストされたリストから以外の親リストからのパターン実行シーケンスへの寄与がない場合には、親リストのPreBurst及びPostBurstは当てはまらない。ネストされたリストのPreBurst及びPostBurstを適用するただ１つのバーストだけが存在する。
【０５５２】
以下は、実行シーケンスへのオプションの影響を示す数例である。簡略化するために、全てのパターンリストがただ１つのファイルにおいて指定されるものと仮定する。
【０５５３】
［例１：BurstOffの使用］
【０５５４】
この例はBurstOff及びPreBurstを例示する。特に強調されるのは、BurstOffによって、複数のパターンが、１パターン長である複数のバースト内で１つずつ実行されることである。それゆえ、PreBurstオプションは依然として当てはまる。入力パターンリストは以下のとおりである。
【０５５５】
Global A   [BurstOff] [PreBurst pat_z]
{
Pat  q;
PList   B;
Pat   r;
Pat   s;
Grobal C
{
Pat   t;
PList   D;
};
PList D;
PList E;
};
Global B
{
Pat a;
Pat b;
};
Global D [BurstOff]
{
Pat c;
Pat d;
};
Global E
{
Pat e;
};
【０５５６】
Ａをルートとする木は図８に表されるであろう。
【０５５７】
このパターンのための実行シーケンスが以下に示される。｜文字はバーストブレークを示す。このパターンリストは１０バーストにおいて実行され、第１のバーストはパターンｚ及びｑを有し、最後のバーストはパターンｅを有する。
ｚｑ｜ａｂ｜ｚｒ｜ｚｓ｜ｔ｜ｃ｜ｄ｜ｃ｜ｄ｜ｅ
【０５５８】
この実行シーケンスについて以下のことに留意されたい。
１．Ａ上のBurstOffオプションはＢによって継承されないので、Ｂ内のパターンａ及びｂはバーストとして動作する。
２．Ａ上のPreBurstオプションはＢによって継承されないので、Ｂによるバースト内のａ及びｂはｚによって前置されない。
３．ｚによる前置は、ａの直接の子であることに起因して実行されるパターン、すなわちパターンｑ、ｒ及びｓの場合にのみ起こる。これらのパターンは、BurstOffオプションを有するＡに起因して１パターン長だけであるバースト内にあるかのように１つずつ実行される。BurstOffは、パターンに、１パターン長バーストにおいて個別に実行されることを要求する。それゆえ、PreBurst及びPostBurstオプションは依然として当てはまる。
４．パターンリストＤは、その子ｃ及びｄが１つずつ実行される固有バーストオフオプションを有する。それは、ＡからのPreBurst zを継承しない。
【０５５９】
［例２：BurstOffDeepの使用］
【０５６０】
この例はBurstOffBurstOffオプションを例示する。パターンリスト定義中のBurstOffDeepは、ネストされる定義及び参照されるリストに影響を及ぼす。しかしながら、PreBurst及びPostBurstオプションは、ネストされたリスト及び参照されたリストによって継承されない。その例は、例１の場合と同じパターンＡ、Ｂ、Ｃ、Ｄ、Ｅを用いるが、それらのオプションが異なる。
５．Ａの定義上のオプション：［BurstOffDeep］、［PreBurst z］、［PostBurst y］
６．任意の他のノード上の他のオプションはない。
【０５６１】
実行シーケンスは以下のとおりである。先に説明されたように、｜文字はバーストブレークを示す。
ｚｑｙ｜ａ｜ｂ｜ｚｒｙ｜ｚｓｙ｜ｔ｜ｃ｜ｄ｜ｃ｜ｄ｜ｅ
【０５６２】
この実行シーケンスについて以下のことに留意されたい。
１．PreBurst及びPostBurstはＢ、Ｃ、Ｄ、Ｅによって継承されない。
２．BurstOffDeepはＢ、Ｃ、Ｄ、Ｅによって継承される。
【０５６３】
［例３：PreBurst及びPostBurst禁止］
【０５６４】
ここで、例１のパターンリスト木について考えるものとする。ただし、オプションは以下のとおりである。
１．Ａの定義上のオプション：［PreBurst x］、［PostBurst y］
２．Ｃの定義上のオプション：［PreBurst x］、［PostBurst z］
３．任意の他のノード上の他のオプションはない。
【０５６５】
実行シーケンスは以下のようになるであろう。
ｘｑａｂｒｓｔｃｄｃｄｅｙ
【０５６６】
「ｔｃｄ」サブシーケンスが「ｘｔｃｄｚ」でない理由は以下のとおりである。
１．最初のｘは、実際には現在のバーストに関連するプレバーストオプションｘに等しいので、禁止される。
２．最後のｚは、PostBurst zがＤに継承されず、ｚが付加されることができるＣから生成されるパターンが存在しないので、禁止される。
【０５６７】
［例４：Skipの使用］
【０５６８】
この例は、ネストされた定義及び参照されるリストへのＳｋｉｐオプションの影響を例示する。その例は、例１の場合と同じパターンＡ、Ｂ、Ｃ、Ｄ、Ｅを用いるが、それらのオプションが異なる。
１．Ａの定義上のオプション：［Skip］、［PreBurst z］、［PostBurst y］
２．ｒへの参照上のオプション：［Skip］
３．Ｃの定義上のオプション：［Skip］
【０５６９】
その実行シーケンスは、以下のような、ブレークのない単一のバーストである。
ｚｑａｂｓｃｄｅｙ
【０５７０】
この実行シーケンスについて以下のことに留意されたい。
１．ｒ及びＣのためのノードはスキップされる。
２．バーストブレークは全く存在しない。
【０５７１】
［例５：Maskの使用］
【０５７２】
この例はMaskオプションの影響と、パターンならびにパターンリスト定義及び参照へのその影響とを例示する。その例は、例１の場合と同じパターンＡ、Ｂ、Ｃ、Ｄ、Ｅを用いるが、それらのオプションが異なる。
１．Ａの定義上のオプション：［mask pin1_pin2］、［PreBurst z］
２．Ｂの参照上のオプション：［mask pin3］
３．Ｂの定義上のオプション：［mask pin4］
４．ｅの参照上のオプション：［mask pin5］
５．任意のノード上の他のオプションはない。
【０５７３】
名前「pin1_pin2」はPin1及びPin2をマスクするグループを指定する。名前「pin3」、「pin4」及び「pin5」はそれぞれPin3、Pin4及びPin5をマスクすることを指定する。実行シーケンスが以下に与えられ、｜はバーストブレークを示している。各パターンの下の数字は、そのパターン実行中にマスクされるピンを示す。
【０５７４】
ｚｑａｂｚｒｚｓｔｃｄｃｄ｜ｅ
１１１１１１１１１１１１１  １
２２２２２２２２２２２２２  ２
３３                  ５
４４
【０５７５】
この実行シーケンスについて以下のことに留意されたい。
１．ベンダのハードウエアは、バーストブレークを生じることなく、２つのマスクブロックだけしか収容することができない。ｅが実行されるまで、２つのマスクブロックはピン｛１、２｝及びピン｛１、２、３、４｝である。パターンｅがピン｛１、２、５｝の異なるマスクブロックで到着するとき、ハードウエアはバーストブレークを要求する。
【０５７６】
［例６：継承されるオプション及び参照の使用］
【０５７７】
この例は、或る定義において継承されるオプションが、その定義が参照されるときには当てはまらないことを例示する。以下の例について考える。
【０５７８】
Global A
{
Global B [BurstOffDeep]
{
Global C
{
...
};
...
};
...
PList C;
};
Global D
{
PList C;
};
【０５７９】
BurstOffDeepオプションは、その定義の時点においてＣによって継承される。しかしながら、それは固有オプションではないので、その参照のいずれの時点においてもＣに適用されない。
【０５８０】
［例７：ネストされたリストを有するPreBurst及びPostBurst］
以下の例について考える。
GlobalPList A [PreBurst x] [PostBurst y]
{
Pat p1;
LocalPList B [PreBurst x] [PostBurst y]
{
Pat p2;
}
LocalPList C
{
Pat p3;
}
LocalPList D [PreBurst x] [PostBurst z]
{
Pat p4;
}
LocalPList E [PreBurst w] [PostBurst y] .
{
Pat p5;
}
Pat p6; 
}
実行シーケンスは以下のとおりである。
ｘ  ｐ１  ｐ２  ｐ３  ｙ｜ｘ  ｐ４  ｚ｜ｗ  ｐ５  ｙ｜ｘ  ｐ６  ｙ
【０５８１】
１．ネストされたリストのPreBurst及びPostBurstオプションは親と同じように指定されるので、パターンｐ２はｐ１と同じバーストの中にある。これらのオプションは親と同じように継承されるので、パターンｐ３も同じバーストの中にある。これらのオプションは、残りのネストされたリスト内に少なくとも１つの異なるメンバを有し、バースト不連続部を生じる。
【０５８２】
［タイミング］
ユーザは主に、パターンファイルを用いて試験設定を定義することにより、システムとやりとりする。Timing Fileは、これらのパターンのTimingを記述するために用いられる。このファイルは、分解されるべき基礎的な定義のための他のシステムファイル（たとえば、Pin、SpecSelector）を必要とする。さらに、Timing定義において用いられる種々の変数を分解するために用いられるSpec-Selector及びGlobal定義は、複合TestConditionGroupオブジェクトにカプセル化される。Test Planファイルのような、さらに上位のファイルはさらに、このTestConditionGroupインスタンスを使用する。
【０５８３】
Test Plan Fileは、TestConditionGroupオブジェクトへの参照を含む。Pattern Source Fileは、TimingMapオブジェクト内のWaveformSelectorコンポーネントを参照する。TimingオブジェクトそのものはＰｉｎオブジェクトを参照する。オプションでは、Timingオブジェクトは、SpecSelectorオブジェクトによって変更される変数も参照する場合がある。これらの関係が図９に示される。
【０５８４】
Pattern-List内のPatternオブジェクトは、１組のパターン文字のために用いるためのWaveformSelectorオブジェクトの名前を指定する。Timing Mapファイルがそのパターンにおいて指定されることにも留意されたい。このマップが変更されない場合には、パターンはコンパイルされる必要はない。
【０５８５】
Version 1.0;
MainPattern
{
CommonSection
{
...
Timing = myGalxy.tim;
TimingMap = myGalxyMap.tmap;
...
Domain default
{
NOP V {SIG= 1;CLK= 1; DATA=L;} W {SIG=wfs1;
FASTCLK=wfs1;}                *
NOP W {SIG=wfs2;}
NOP V {SIG=L;}
NOP V {SIG=0;}
}
}
}
*Here we define the
WaveformSelector 
component of the TimingMap 
to use for the pattern 
characters.
【０５８６】
TestConditionGroup Fileオブジェクトは、使用するためのTimingオブジェクト及び使用するためのTimingMapオブジェクトをインポートする。各Testは、そのインスタンスのためのTestConditionGroupオブジェクトから導出されるTimingConditionインスタンスを使用する。こうして、同じ１組の波形テーブルをサポートする多数のTimingオブジェクトがテスタフレームワーク内に格納されることができ、必要に応じてスワップされることができる。同様に、多数のTest Plan Fileが、共通のTestConditionGroupオブジェクトを共有することができる。
【０５８７】
Test Plan記述ファイルの一例が、以下のTimingオブジェクトの使用を例示する。
【０５８８】
Import patlist1.plist;
Importtim1.tim;
Import tim2.tim;
Import tmap1.tmap;
TestConditionGroup tim1_prod
{
SpecSet = prodTmgSpec (min, max, typ)
{
period = 10ns, 15ns, 12ns;
}
Timings
{
Timing = tim1;                                 **
TimingMap = tmap1;
}
}
TestConditionGroup tim2_prod
{
SpecSet = prodTmgSpec(min,max,typ)
{
period = 10ns, 15ns, 12ns;
}
Timings
{
Timing = tim2;
TimingMap = tmap1;
}
}
TestCondition tim1_prod_typ
{
TestConditionGroup = tim1_prod;
Selector = typ;
}
TestCondition tim2_prod_max
{
TestConditionGroup = tim2_prod;
Selector = max;
}
Test FunctionalTest MyFunctionalTestSlow
{
PListParam = patlist1;
TestConditionParam = tim1_prod_typ;
}
TestFunctionalTest MyFunctionalTestFast
{
PListParam = patList1;
TestConditionParam = tim2_prod_max;
}
**Two Tests within a Test Plan 
using different timing objects 
defined earlier
【０５８９】
Timingオブジェクトはピン毎に種々の波形を定義する。Timingファイル及びTiming Mapファイルにおいて用いられるピンは、Ｐｉｎ定義ファイルにおいて適当に定義される必要がある。
【０５９０】
TimingオブジェクトはSpecificationSetオブジェクトを用いて、波形オブジェクト内の値を定義することができる。Timingオブジェクトは種々の属性のためのハードコード化された値を含むことができるが、通常は、ユーザが、変数を用いて種々の属性に値を設定するというのが実情である。これらの変数はさらに、SpecificationSetオブジェクトにも依存することができる。この使用法の一例が以下に示される。
【０５９１】
Version 1.0;
Timing basic_functional
{
...
Pin SIG
{
WaveformTable wfs1
{
{ 1 { U@t_le ; D@t_te D; Z@45ns;} }                **
};
};
Pin CLK
{
WaveformTable wfs1
{
{ 0 { U@20ns; D@40ns; }};
};
};
}
**This variable, which defines 
the edge placement, is 
defined elsewhere and is 
dependent on a 
SpecificationSet.
【０５９２】
SpecSelectorは以下に示されるように定義される。
【０５９３】
SpecificationSet prodTmgSpec( min, max, typ)
{
t_le = 10ns, 14ns, 12ns;
t_te = 30ns, 34ns, 32ns;
...
}
【０５９４】
specを変更することによって用いられるタイミングの変化が以下の例に示される。
【０５９５】
TestCondition prodTmp_typ
{
TestConditionGroup = prodTmgSpec;
SpecSelector = typ;                              *
}
TestConditionGroup prodTmp_max
{
TestConditionGroup = prodTmgSpec;
SpecSelector = max;                               **
};
*This timing uses the 
typical specification in the 
SpecSelector.
**This timing uses the 
max specification in the 
SpecSelector.
【０５９６】
［Ｆ２．テスタのタイミングコンポーネントへのマッピング］
テスタモジュールの２つのコンポーネントが、波形の生成及びその関連するタイミングに直に関与する。２つのモジュールは、パターン発生器（ＰＧ）及びフレームプロセッサ（ＦＰ）である。オープンアーキテクチャ試験システムアーキテクチャ内のフレームプロセッサによる波形フォーマッティング及びタイミング発生を例示する簡略化されたブロック図が図１０に示される。波形の発生の簡単な説明が以下に与えられる。
【０５９７】
パターン発生器１００２は、モジュール内の全てのピンに共通であるタイミングセットを生成する。このタイミングセットはGlobal Timing Set(GTS)と呼ばれる。パターン発生器を設定することができる３つのモードがある。これらの３つのモードは、ＧＴＳを記述するために用いることができるビットの数に影響を及ぼす。さらに、これらの設定は、バンクを選択するために用いられるビットの数、及びCapture This Vector(CTV)及びMask This Vector(MTV)がセットされるか否かにも影響を及ぼす。テスタにこのベクトルの結果を収集するように指示するために、ユーザはパターンファイルにおいてＣＴＶフラグを用いる。同様に、テスタに現在のベクトルの結果をマスクするように指示するために、ユーザはそのパターンにおいてＭＴＶフラグを用いる。これが以下の表１に示される。パターン発生器１００２は、Waveform Character(WFC)を生成する責任も担う。ＷＦＣはピン毎に生成される。テスタモジュールは一定のビット数を用いて、ＷＦＣを記述する。
【０５９８】
【表１】
2007528993.tif 000003
【０５９９】
テスタモジュールはピン毎に１つのフレームプロセッサ１００４を設ける。各フレームプロセッサは、Timing Set Scrambler(TSS)１００６を含み、それは、この例では、１０２４までの全深を有する。ＴＳＳ１００６は、先に説明され、図１０に示されるパターン発生器のモードに応じて、多数のバンク１００８に分割されることができる。ここでは、バンク当たり６４エントリの１６バンクが用いられている。ＴＳＳは、ピン毎にWaveform Tableを定義する能力において、より高い自由度を与えることができるように設けられる。「ＦＰ」モードでは、ＴＳＳは、２ビットを用いてTiming Setを出力する。こうして、ＴＳＳは、ピン当たり全部で４つの個別の物理的なTiming Setを生成するであろう。これらのTiming Setは、Local Timing Set(LTS)と呼ばれる。
【０６００】
フレームプロセッサ１００４はＬＴＳ及びＷＦＣを組み合わせて、Waveform Memory１０１２及びTiming Memory１０１４へのインデックス１０１０を作成する。「ＦＰ」モードでは、５ビット値が、ＬＴＳによって生成される２ビットと、ＷＦＣによって生成される３ビットに分割される。こうして、最大４つの物理的なTiming Setを用いることができるが、物理的なWaveform Memory及びTiming Memoryの深さはピン当たり３２の深さである。Waveform Memoryは、波形を形成する使用可能なタイミングエッジを含む。使用可能なエッジのためのタイミング値はTiming Memoryから得られる。こうして、フレームプロセッサは波形をフォーマットする。
【０６０１】
［マッピング方法］
その方法は、ピン毎の全てのWaveformTableブロックをテスタ内のＬＴＳにマッピングすることである。テスタハードウエアが４ＬＴＳをサポートする場合には、ユーザは最大４つのWaveformTableブロックを定義することができる。各WaveformTableブロックは、テスタデジタルモジュールのために最大ｎ個の波形定義を有することができる。
【０６０２】
Timing-Mapファイルは、Timing-Mapブロックにおいて定義されるLogical WaveformSelectorの、オープンアーキテクチャ試験システム内のモジュールのためのWaveformTableへのマッピングを提供する。この場合、テスタは２５６までのLogical WaveformSelectorをサポートする。オープンアーキテクチャ試験システムでは、Logical WaveformSelectorはＧＴＳに直にマッピングする。パターンコンパイラは、Timing-Map及びTimingブロックの両方に基づいて、パターンファイルをコンパイルすることができる。しかしながら、TimingブロックのWaveformTable内の波形文字が変更されないか、又はTiming-Mapブロック内のWaveformSelectorマッピングが変更されない場合には、そのパターンをコンパイルし直す必要はない。
【０６０３】
［このマッピング方法を用いる例］
【０６０４】
テスタDigital Moduleへのマッピングを例示するために、以下のことが仮定される。フレームプロセッサはＦＰモードにセットされる。ＣＴＶ及びＭＴＶビットは、ＧＴＳビットの全数が６であり、Timing Bank Selectorビットの総数が４であるようにセットされる。
【０６０５】
Timingブロックにおいて定義される各WaveformTableは、Timingファイル内の個別のＬＴＳにマッピングされる。これはピン毎に行われる。こうして、WaveformTable seq1はＬＴＳ１にマッピングされる。「ＳＩＧ」ピンの場合には、全部で８個の取り得る波形エントリを使い果たす。しかしながら、「ＣＬＫ」ピンは、ただ１つの波形エントリを必要とし、それゆえ、Waveformメモリ（ＷＦＴ）及びWaveform Timingメモリ（ＷＴＭ）内のただ１つの行を使い果たす。
【０６０６】
「ＳＩＧ」ピンの最初の２つの物理的な波形のマッピングが図１１に示される。このWaveformTableはエッジの個別の構成を必要とする２つの波形文字をマッピングするので、Waveformメモリ（ＷＦＴ）１１１２及びWaveform Timingメモリ（ＷＴＭ）１１１４において２つのエントリを割り当てることにする。波形の形状はＷＦＭに格納され、タイミングの詳細はＷＴＭに格納される。そのモジュールの一実施形態は、Ｔ１、Ｔ２、Ｔ３、Ｔ４、Ｔ５及びＴ６の全部で６個のタイミングエッジを有する。これらは、TimingブロックのEdge Resourceセクション内の波形において定義されるEvent E1、E2、...に直にマッピングする。７個以上のイベントがTimingブロックにおいて定義され、上記のモジュールとともに用いられる場合には、エラーが生じるであろう。
【０６０７】
図１１の例では、第１の波形文字「０」はTiming Edge T1を用いて、「Force Down」又は「Ｄ」イベントをプログラミングし、それはそのサイクル内の１０ｎｓにおいて生じる。Ｔｉｍｉｎｇ  Ｅｄｇｅ  Ｔ２も、時刻３０ｎｓにおいて「Force Down」又は「Ｄ」イベントを生成するために用いられる。最後に、Timing Edge T3は、時刻４５ｎｓにおいて「Force Off」又は「Ｚ」イベントを生成するために用いられる。
【０６０８】
第２の波形文字「１」はTiming Edge T1を用いて、「Force Up」又は「Ｕ」イベントをプログラミングし、それはそのサイクル内の１０ｎｓにおいて生じる。Timing Edge T2も、時刻３０ｎｓにおいて「Force Down」又は「Ｄ」イベントを生成するために用いられる。最後に、Timing Edge T3は、時刻４５ｎｓにおいて「Force Off」又は「Ｚ」イベントを生成するために用いられる。
【０６０９】
このようにして、ＷＦＣは、フレームプロセッサのＷＦＭメモリ及びＷＴＭメモリにマッピングされる。ピン「ＳＩＧ」のためのＬＴＳ１のWaveform Memory WFMの最後の設定が以下の表２に示される。
【０６１０】
【表２】
2007528993.tif 000004
【０６１１】
ピン「ＳＩＧ」のためのＬＴＳ１のWaveform Timing Memory WTMの最後の設定が以下の表３に示される。
【０６１２】
【表３】
2007528993.tif 000005
【０６１３】
「ＣＬＫ」ピンはただ１つの波形を使い果たすので、このピンのためのＷＦＭ及びＷＦＴは非常に簡単である。「ＣＬＫ」ピンのためのＬＴＳ１のWaveform Memory WFMの最後の設定が以下の表４に示される。
【０６１４】
【表４】
2007528993.tif 000006
【０６１５】
ＬＴＳ２のWaveform Timing Memory WTMの最後の設定が以下の表５に示される。
【０６１６】
【表５】
2007528993.tif 000007
【０６１７】
TimingMapブロックは、WaveformSelectorをTimingブロックのWaveformテーブルに明示的にマッピングする。或るテスタシステムの場合、これは要するに、Timing Set Scrambler(TSS)メモリを設定することになる。ＴＳＳは基本的には、それらの設定を保持する、ＧＴＳからＬＴＳへのマッピングを含む。ピンＳＩＧのための本発明の例のためのＴＳＳ設定は、以下の表６のようになるであろう。
【０６１８】
【表６】
2007528993.tif 000008
【０６１９】
最後に、ＴＳＳ及びＬＴＳ設定マッピングが分解された後に、Pattern Compilerはこの情報を用いて、用いるための正確な波形テーブル（ＬＴＳ）及び正確な波形文字を用いてパターンをプログラミングすることができる。こうして、本発明の例による、ピン「ＳＩＧ」だけを考慮した擬似パターンが図１１に示される。このコンパイルはTimingブロックに依存せず、Timing-Mapブロックだけに依存することに留意されたい。
【０６２０】
［Ｇ．テスタ動作］
このセクションはテスタオペレーティングシステム（ＴＯＳ）の基本動作を記述する。このセクションにおいて考えられる動作は以下のものである。
・システム初期化
・Test Planローディング
・パターンローディング
・Test Planの実行
・個々のTestの実行
【０６２１】
［システム初期化］
一実施形態ではシステムを初期化するために、ある特定の仮定が満たされなければならず、且つある特定の条件が満たされなければならない。以下のサブセクションがこれらを記載する。
【０６２２】
［事前条件］
関連するシステムソフトウエアコンポーネントのコピーが中央に格納され、その場所がシステムコントローラに知られている。これは、システムコントローラそのものに存在することができるか、又はネットワーク実装ディレクトリを有する（又は別の仕組みを介してＳＹＳＣに知られている）他のシステム上に存在することができ、どのような仕組みであっても、システムが機能することができる前に、システムコントローラが使用するために、全てのソフトウエアが入手できなければならない。このソフトウエアは以下のものを含む。
ベンダハードウエア制御（すなわちモジュールソフトウエア）ＤＬＬ
標準又はユーザ試験クラスＤＬＬ
ユーザ試験計画ＤＬＬ
【０６２３】
システムモジュール構成ファイルはシステムコントローラ上で入手することができる。このファイルによって、ユーザがテスタの物理的な構成、たとえばシステムシャーシ内の各モジュールの物理的な場所及びタイプ、ならびにモジュールソフトウエアＤＬＬの名前を指定できるようになることを思い起こされたい。
【０６２４】
システム構成ファイルはシステムコントローラ上で入手することができる。このファイルはシステム内のサイトコントローラのリスト、及びサイトコントローラホスト名のSwitch Matrix入力ポートアドレスへのマップを含むことを思い起こされたい。
【０６２５】
サイトコントローラは、Site Configuration Manager(SCM)と呼ばれるサービスを実行する。このサービスは、「ハードウエア発見」と呼ばれるプロセスによって、どんなハードウエアが各スロットにインストールされるかを判定する責任を担う。またそれは、システムコントローラでのシステム初期化プロセスに関与する責任も担う。一実施形態では、Switch Matrix動作プロトコルは、Switch Matrix入力ポート接続アドレス１とともに、ただ１つのSite Controller上のSCMを常に用いて、モジュールに対するSwitch Matrix接続を構成すべきであることに留意されたい。この「特別な」サイトはSITEC-1として表されることを思い起こされたい。
【０６２６】
システムコントローラは、各サイトコントローラのＳＣＭに、そのSwitch Matrix接続アドレスを提供する責任を担う。
【０６２７】
各サイトコントローラのＳＣＭは、Test Plan Server(TPS)と呼ばれるプロセスを開始することができる。各サイトコントローラ上のTest Plan Serverは最終的に、ユーザの１つの試験計画（又は、１つのサイトコントローラが多数のＤＵＴ上で試験を実行している場合には、複数の試験計画）を保持し、実行する責任を担う。
【０６２８】
［初期化段階Ｉ：システム妥当性検査］
一旦、上記の仮定及び事前条件が満たされたなら、システム初期化は最初に、以下のようなシステム妥当性検査ステップを開始する。
１．システムコントローラが、システム及びモジュール構成ファイルを読み出し、システムのユーザ指定の意図を初期化する。
２．指定されたシステム構成情報を用いて、システムコントローラは、指定されたサイトコントローラが動作中であり、接触可能であり、しかも準備できている（すなわち、ＳＣＭを実行している）ことを確認する。この確認ステップ中にエラーがあれば、システムエラーが引き起こされて、初期化は中止されるであろう。
３．その後、システムコントローラは、ＳＩＴＥＣ−１にあるＳＣＭサービスに、スイッチマトリックスを構成して、全てのハードウエアモジュールにアクセスできるようにすることを指示し、ハードウエア発見を実行するように要求する。
４．ＳＩＴＥＣ−１におけるＳＣＭサービスは、{vendor,hardware}タプルのための全ての利用可能なモジュールスロット（既知のハードウエアの場所）をポーリングし、{vendor,hardware}タプルのスロットへのマッピングを生成する。したがって、終了時に、このポーリングは、完全なシステム内に存在する完全な１組の{vendor,hardware,slot}結合を特定している。このポーリングの結果はシステムコントローラに送られる。
５．システムコントローラは、上記のハードウエア発見ステップの結果が、モジュール構成ファイル内のユーザ指定の構成と一致することを確認する。この確認ステップ中に何らかのエラーがあれば、システムエラーが引き起こされ、初期化は中止されるであろう。
６．その後、システムコントローラは、周知の場所（複数の場合もあり）において環境設定ファイル（複数の場合もあり）からデフォルト環境（モジュールＤＬＬを探すための探索経路、パターンリスト、パターン、試験計画ＤＬＬ、試験クラスＤＬＬ等）をロードする。
７．システムコントローラは、全ての特定されたモジュールソフトウエアＤＬＬが存在することを確実にする。システムコントローラ上で入手できない場合には、可能であるなら、中央記憶装置から検索される。そうでない場合には、システムエラーが引き起こされ、初期化が中止される。
【０６２９】
［初期化段階ＩＩ：サイト構成（オプション）］
サイト構成、すなわちサイト分割は、利用可能なシステムハードウエアモジュールを種々のサイトに（すなわち、多数のＤＵＴにサービスするために）ソフトウエアレベルで割り当てることを含む。サイト分割情報はソケットファイルにおいて提供されることを思い起こされたい。
【０６３０】
テスタシステムによって、試験計画ロードの一部として（各試験計画は特定のソケットに関連するため）、且つ個別のユーザコール可能なステップとして、サイト（再）分割が実行されるようになる。後者の場合、ユーザは、システムを分割するためにのみ用いられるソケットファイルを提供することにより、サイト分割を開始する。これは、各サイトが異なるＤＵＴタイプを試験するマルチＤＵＴ試験の場合のシステム初期化中に特に有用である。しかしながら、このステップは、初期化段階ではオプションであり、ユーザはそれを実行しないように選択し、代わりに、試験計画ロードがシステムを適当に分割できるようにすることを選択することができる。
【０６３１】
サイト分割を達成するためにどの手段が選択されるにしても（個別のコールによるか、又は試験計画ロードを通して暗黙的に）、その仕組みは同じである。この仕組みが以下に記載される。
１．ソケットが与えられるとき、システムコントローラは最初に、現時点で存在しているシステム分割がソケットに適合するか否か、又は再分割が必要であるか否かを判定する。初期化中のデフォルト分割は、全ての利用可能なモジュールがＳＩＴＥＣ−１に接続される分割である。以下の残りのステップは、再分割が必要とされる場合のみ実行される。
２．システムコントローラは各サイトコントローラＳＣＭに構成メッセージを送り、新たなソケットの下でそのために使用可能にされるＤＵＴサイトの数及び識別でそのものを再構成する。これは一般的な手順であり、１つのサイトコントローラによって制御されるＤＵＴサイトの数が１つである場合を取り扱うことに留意されたい。新たなソケット情報はＳＣＭにも伝達される。
３．各ＳＣＭは、もしあれば、実行中のＴＰＳを停止して、新たなＴＰＳを開始し、新たなソケットと、新たなソケットの下でそのために使用可能にされるＤＵＴサイトの数及び識別とを用いてそれを初期化する。
４．システムコントローラは、どのサイトが、必要とされるシステムモジュールのどのサブセットを必要とするかを判定する。これを行いながら、システムコントローラはサイトのためのハードウエアスロット情報も準備する。サイト毎の最終的な結果は、そのサイトに割り当てられるモジュールＤＬＬに対するスロットのリストである。このサイト特有のリストは、Site Module DLL Slot List（SITE-MDSL）として表されるであろう。
５．システムコントローラは適当なSITE-MDSL、及び必要なモジュールＤＬＬを各ＳＣＭに提供する。各ＳＣＭはさらに、新たに開始されたＴＰＳがこの情報を入手できるようにする。
６．その後、システムコントローラは、適当なサイト−スロット間接続のために、すなわち、サイト分割作業のために、SITEC-1にSwitch Matrixを構成するように要求する。
７．サイト１〜ｎ上のＴＰＳは、そのSITE-MDSLにおいて指定されるＤＬＬをロードする。これらの各ＤＬＬは、initialize()という名前の関数を有し、その関数はスロット番号のアレイを取得する。ＴＰＳは、そのモジュールタイプのための適当なスロットリストでinitialize()をコールする。この時点で誤動作があれば、システムエラーが引き起こされて、初期化が中止される。initialize()メソッドは以下のことを行う。
ａ．標準インターフェースIXXXModuleに基づいて具体的なクラスを作成する。たとえば、或るデジタルモジュールに関連するＤＬＬは、それが関連する各スロットにサービスするために、１つのIPinModuleベースオブジェクトを作成するであろう。
ｂ．インターフェースIResourceに基づいて、そのモジュール内の「資源ユニット」毎に１つの複数の具体的なクラスを作成する。再び、或るデジタルモジュールの場合、各IPinModuleベースオブジェクトは、デジタルモジュールによって占有されるスロットのコレクション内の全てのピンのためのITesterPinベースオブジェクトを作成するであろう。
８．その後、サイト１〜ｎ上のＴＰＳは、ロードされた各モジュールＤＬＬにおいてgetXXXModule()をコールし、モジュール内容情報を検索する。
９．getXXXModule()へのコールの度に、
IModuleポインタとして<VendorHWType>Moduleクラスオブジェクトが返される（たとえば、AdvantestPinModule）。そのような各IModuleポインタはＴＰＳによってキャッシュされ、ＴＰＳは、フレームワーク／ユーザコードがこれらを入手できるようにする。IModule、IResource等のコレクションは永続的である（少なくともＴＰＳの寿命にわたって）ことに留意されたい。
１０．一旦、上記のステップが完了したなら、ＴＰＳは、その割り当てられた（既知の）ポートにおいて、listen()を開始する。これは、ＴＰＳが標準（すなわちサイト分割された）動作を開始する「準備ができている」ことを、システムコントローラに伝える。
【０６３２】
［試験計画ロード］
このセクションは、ユーザTest Plan DLLがサイトコントローラ上にロードされる（１つ又は複数のＤＵＴ試験のために）ステップを記述する。
【０６３３】
一旦、システム初期化（及びオプションで初期サイト分割）が完了したなら、ユーザ試験計画をロードすることができる。ユーザ試験計画のサイトコントローラ上へのローディングは、以下のように進められる。
１．システムコントローラは最初に、試験計画ＤＬＬをその自らの処理空間内にロードし、それに、関連するソケットファイル及びＤＵＴタイプ識別子を問い合わせる。この情報を用いて、この試験計画を実行するサイト（複数の場合もあり）、それゆえこの試験計画がロードされることになるサイトコントローラ（複数の場合もあり）が特定される。
２．その後、システムコントローラは、その試験計画に関連するソケット情報を用いて、先に略述されたような再分割プロセスを開始する。
３．システムコントローラは、試験計画ＤＬＬから、試験計画によって用いられる試験クラスＤＬＬのリストを抽出し、一旦、システムコントローラが、ＴＰＳが標準（すなわち、サイト分割された）動作を開始する準備ができていることを確認したなら、試験クラスＤＬＬを、そして最後に、試験Plan DLLそのものを適当なＴＰＳに送出する。
４．ＴＰＳはLoadLibrary()をコールして、それを処理空間にロードする。それは、ＤＬＬにおいて周知の関数をコールして、それがサービスするサイト（すなわちＤＵＴ）の数と同じ数の試験計画オブジェクトを作成する。
５．ＴＰＳは、必要なテスタフレームワークオブジェクトで試験計画オブジェクト（複数の場合もあり）を初期化する。初期化中に、ＴＰＳは、試験計画オブジェクト（複数の場合もあり）によって用いられる試験クラスに適したＤＬＬを処理空間にロードし、試験クラスインスタンスを作成する。
６．ＴＰＳはシステムコントローラに対する通信チャネルを試験計画オブジェクト（複数の場合もあり）に設定する。
７．システムコントローラはＴＰＳと通信し、試験計画オブジェクト（複数の場合もあり）のためのプロキシを構築する。
【０６３４】
その結果として、サイトコントローラ上のユーザの試験計画のロードに成功する。
【０６３５】
［試験計画の実行］
予め定義されたフローロジックにしたがって試験計画内の全ての試験を実行するための方法は以下のとおりである。
１．ユーザのアプリケーションがRunTestPlanメッセージをＴＰＳに送信する。ＴＰＳはExecutingTestPlanメッセージを全ての接続されたアプリケーションに送る。その後、ＴＰＳはTest Plan上でexecute()をコールする。
２．１つのサイトコントローラで多数のＤＵＴを試験することは、そのサイトコントローラ上で、ＤＵＴ当たり１つの多数のスレッドを用いて実行される。各スレッドは、同じ試験計画オブジェクトの異なる個別のインスタンスを実行する。この場合には、モジュール制御ソフトウエアＤＬＬを複数のＤＵＴにわたって共有することができるので、ＤＵＴ識別子パラメータを取得するために、ハードウエア通信のためのモジュールコマンドが必要とされる。
３．試験計画オブジェクトは、そのコレクション内の各試験にわたって繰り返され（別法では、そのＦｌｏｗオブジェクトに、フローロジックに従って各試験を処理するように指示し）、preExec()、execute()及びpostExec()をコールする。
４．各試験が実行されるとき、全ての接続されるアプリケーションに対してステータスメッセージが返送される。
【０６３６】
［単一の試験の実行］
ユーザは、全ての試験ではなく、１つの試験計画内のただ１つの試験を実行したい場合もある。ただ１つの試験を実行する場合、その方法は以下のとおりである。
１．ユーザアプリケーションがRunTestメッセージをＴＰＳに送信する。ＴＰＳはExecutingTestメッセージを全ての接続されるアプリケーションに送る。その後、ＴＰＳは、Test PlanにおいてexecuteTest()をコールし、実行するための試験を指定する。
２．Test Planオブジェクトは、その試験オブジェクトにおいてpreExec()、execute()及びpostExec()をコールすることにより、指定された試験を実行する。
３．その試験が実行されるとき、それは全ての接続されるアプリケーションにステータスメッセージを返送する。
【０６３７】
開示される方法によって、試験プログラムを開発する際に少なくとも２つの利点が達成される。第一に、その方法は、その試験計画が扱うことを目的としている問題領域に近い言語において試験計画を記述することにより、システムプログラミングの複雑さを試験計画開発者から切り離す。第二に、その方法によれば、試験技師は試験プログラム開発の早期の段階において試験計画のエラーを特定できるようになり、試験プログラム及び試験される対応するＤＵＴの開発時間を短縮することができる。
【０６３８】
同じ基本的な根底にある仕組み及び方法をこれまでどおり利用しながら、開示される実施形態の多数の実現可能な変更及び組み合わせを用いることができることは、関連技術分野の熟練者（当業者）には理解されよう。上記の記述は、説明することを目的としており、特定の実施形態を参照しながら記述されてきた。しかしながら、上記の例示的な説明は、本発明を包括的に述べることや、本発明を開示される形態と全く同じものに限定することは意図していない。上記の教示に鑑みて、数多くの変更及び変形が可能である。それらの実施形態は、本発明の原理及びその実用的な応用形態を説明するために、且つ当業者が考えている特定の用途に相応しいように、種々の変更を加えて本発明及び種々の実施形態を最大限に利用できるようにするために選択され、説明された。
【図面の簡単な説明】
【０６３９】
【図１】従来のテスタアーキテクチャを示す図である。
【図２】本発明の一実施形態による、テスタアーキテクチャを示す図である。
【図３】本発明の一実施形態による、テスタソフトウエアアーキテクチャを示す図である。
【図４】本発明の一実施形態による、試験プログラムコンパイラを示す図である。
【図５】本発明の一実施形態による、単一の試験クラスから種々の試験インスタンスを如何に導出することができるかを示す図である。
【図６】本発明の一実施形態による、パターンコンパイラを示す図である。
【図７】本発明の一実施形態による、順序パターン木の例を示す図である。
【図８】本発明の一実施形態による、別の順序パターン木の例を示す図である。
【図９】本発明の一実施形態による、試験プログラムによって必要とされるファイル間の関係を示す図である。
【図１０】本発明の一実施形態による、波形発生を示す図である。
【図１１】本発明の一実施形態による、タイミングのために用いられるマッピングを示す図である。
【図１２】本発明の一実施形態による、タイミングのために用いられる別のマッピングを示す図である。
【図１３】本発明の一実施形態による、試験プログラムを開発するための方法を示す図である。
【図１】
2007528993.tif 000009
【図２】
2007528993.tif 000010
【図３】
2007528993.tif 000011
【図４】
2007528993.tif 000012
【図５】
2007528993.tif 000013
【図６】
2007528993.tif 000014
【図７】
2007528993.tif 000015
【図８】
2007528993.tif 000016
【図９】
2007528993.tif 000017
【図１０】
2007528993.tif 000018
【図１１】
2007528993.tif 000019
【図１２】
2007528993.tif 000020
【図１３】
2007528993.tif 000021
【国際調査報告】
2007528993.tif 000022
2007528993.tif 000023
2007528993.tif 000024
2007528993.tif 000025