JP2007528993A - 半導体集積回路のための試験プログラムを開発するための方法及び構造 - Google Patents

半導体集積回路のための試験プログラムを開発するための方法及び構造 Download PDF

Info

Publication number
JP2007528993A
JP2007528993A JP2006519571A JP2006519571A JP2007528993A JP 2007528993 A JP2007528993 A JP 2007528993A JP 2006519571 A JP2006519571 A JP 2006519571A JP 2006519571 A JP2006519571 A JP 2006519571A JP 2007528993 A JP2007528993 A JP 2007528993A
Authority
JP
Japan
Prior art keywords
test
file
header
class
name
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2006519571A
Other languages
English (en)
Other versions
JP4516961B2 (ja
JP2007528993A5 (ja
Inventor
プラマニック、アンカン
エルストン、マーク
クリッシュナスワミィ、ラマチャンドラン
敏明 足立
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Advantest Corp
Original Assignee
Advantest Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Advantest Corp filed Critical Advantest Corp
Publication of JP2007528993A publication Critical patent/JP2007528993A/ja
Publication of JP2007528993A5 publication Critical patent/JP2007528993A5/ja
Application granted granted Critical
Publication of JP4516961B2 publication Critical patent/JP4516961B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/22Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
    • G06F11/26Functional testing
    • GPHYSICS
    • G01MEASURING; TESTING
    • G01RMEASURING ELECTRIC VARIABLES; MEASURING MAGNETIC VARIABLES
    • G01R31/00Arrangements for testing electric properties; Arrangements for locating electric faults; Arrangements for electrical testing characterised by what is being tested not provided for elsewhere
    • G01R31/28Testing of electronic circuits, e.g. by signal tracer
    • G01R31/317Testing of digital circuits
    • G01R31/3181Functional testing
    • G01R31/3183Generation of test inputs, e.g. test vectors, patterns or sequences
    • GPHYSICS
    • G01MEASURING; TESTING
    • G01RMEASURING ELECTRIC VARIABLES; MEASURING MAGNETIC VARIABLES
    • G01R31/00Arrangements for testing electric properties; Arrangements for locating electric faults; Arrangements for electrical testing characterised by what is being tested not provided for elsewhere
    • G01R31/28Testing of electronic circuits, e.g. by signal tracer
    • G01R31/317Testing of digital circuits
    • G01R31/3181Functional testing
    • G01R31/3183Generation of test inputs, e.g. test vectors, patterns or sequences
    • G01R31/318307Generation of test inputs, e.g. test vectors, patterns or sequences computer-aided, e.g. automatic test program generator [ATPG], program translations, test program debugging
    • GPHYSICS
    • G01MEASURING; TESTING
    • G01RMEASURING ELECTRIC VARIABLES; MEASURING MAGNETIC VARIABLES
    • G01R31/00Arrangements for testing electric properties; Arrangements for locating electric faults; Arrangements for electrical testing characterised by what is being tested not provided for elsewhere
    • G01R31/28Testing of electronic circuits, e.g. by signal tracer
    • G01R31/317Testing of digital circuits
    • G01R31/3181Functional testing
    • G01R31/3183Generation of test inputs, e.g. test vectors, patterns or sequences
    • G01R31/318314Tools, e.g. program interfaces, test suite, test bench, simulation hardware, test compiler, test program languages
    • GPHYSICS
    • G01MEASURING; TESTING
    • G01RMEASURING ELECTRIC VARIABLES; MEASURING MAGNETIC VARIABLES
    • G01R31/00Arrangements for testing electric properties; Arrangements for locating electric faults; Arrangements for electrical testing characterised by what is being tested not provided for elsewhere
    • G01R31/28Testing of electronic circuits, e.g. by signal tracer
    • G01R31/317Testing of digital circuits
    • G01R31/3181Functional testing
    • G01R31/3183Generation of test inputs, e.g. test vectors, patterns or sequences
    • G01R31/318342Generation of test inputs, e.g. test vectors, patterns or sequences by preliminary fault modelling, e.g. analysis, simulation
    • GPHYSICS
    • G01MEASURING; TESTING
    • G01RMEASURING ELECTRIC VARIABLES; MEASURING MAGNETIC VARIABLES
    • G01R31/00Arrangements for testing electric properties; Arrangements for locating electric faults; Arrangements for electrical testing characterised by what is being tested not provided for elsewhere
    • G01R31/28Testing of electronic circuits, e.g. by signal tracer
    • G01R31/317Testing of digital circuits
    • G01R31/3181Functional testing
    • G01R31/319Tester hardware, i.e. output processing circuits
    • G01R31/31903Tester hardware, i.e. output processing circuits tester configuration
    • G01R31/31907Modular tester, e.g. controlling and coordinating instruments in a bus based architecture
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/22Detection or location of defective computer hardware by testing during standby operation or during idle time, e.g. start-up testing
    • G06F11/26Functional testing
    • G06F11/263Generation of test inputs, e.g. test vectors, patterns or sequences ; with adaptation of the tested hardware for testability with external testers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • GPHYSICS
    • G11INFORMATION STORAGE
    • G11CSTATIC STORES
    • G11C29/00Checking stores for correct operation ; Subsequent repair; Testing stores during standby or offline operation

Abstract

半導体試験システムのための試験プログラムを開発するための方法が開示される。本方法は、試験プログラム言語(TPL)において試験計画ファイルを記述することであって、試験計画ファイルは試験プログラムの少なくとも1つの試験を記述する、記述すること、システムプログラム言語(SPL)において試験クラスファイルを記述し、TPLにおいて試験クラスファイルの対応するプリヘッダファイルを記述することであって、試験クラスファイルは試験プログラムの少なくとも1つの試験のインプリメンテーションを記述する、記述すること、及び、試験計画ファイル、試験クラスファイル及びプリヘッダファイルを用いて試験プログラムを生成することを含む。

Description

本特許出願は、2004年2月6日に出願の同時係属の米国特許出願第10/772,434号「Method and Structure to Develop a Test Program for Semiconductor Integrated Circuits」の一部継続出願であり、同特許出願の恩典を主張し、同特許出願は、2003年2月14日に出願の米国特許出願第60/447,839号「Method and Structure to Develop a Test Program for Semiconductor Integrated Circuits」の恩典を主張する。また本特許出願は、2004年5月22日に出願の米国仮特許出願第60/573,577号「Software Development in an Open Architecture Test System」の恩典も主張する。それらの特許出願は全て、アドバンテスト社に譲渡され、その全体を参照することにより本明細書に援用される。
本発明は半導体検査のための自動試験装置の分野に関する。詳細には、本発明は、半導体試験システムのための試験プログラムを開発するための方法に関する。
半導体試験システムは、多数のデバイスが同時に動作する複雑なシステム環境を有する。その試験システムは、複数のコントローラを含んでもよく、それらコントローラは複数のベンダモジュール及びその対応する被試験デバイス(DUT)の動作を制御する。半導体試験システムのための試験プログラムは、複雑なシステム環境において動作することが要求される。そのような試験プログラムを開発する1つの方法は、C++のようなシステムプログラム言語(SPL)で直接試験コードを書くことである。しかしながら、この方法を用いる場合、試験技師は複雑な試験システム環境に煩わされる。詳細には、試験技師は多数の複雑なシステムプログラミング規則に従わなければならないと同時に、試験プログラムを開発するためにシステムプログラム言語の要件を満たさなければならない。
既存の方法が抱える別の問題は、SPLで試験プログラムがコンパイルされるまで、又はDUTの試験中に試験プログラムが実行されるまで、試験プログラムのエラーを特定することができないことである。さらには、多くの場合に、複雑な試験システム環境において、試験計画のエラーを特定することは難しく、また時間を要する。そのような制限によって、DUTの製造が遅れる場合もあり、製品の発売が遅れて、市場での好機を失う可能性もある。
それゆえ、試験計画の開発時に、システムプログラミングを複雑にしないようにすることが必要とされている。詳細には、試験システムを複雑にする言語ではなく、試験技師が精通している問題領域に近い言語において試験計画を開発することが必要とされている。さらに、システムコンパイル前に試験計画内のエラーを特定することが必要とされている。試験計画のエラーを早期に検出する結果として、試験プログラム及び試験されるDUTの開発時間の短縮することができる。
本特許出願は、オブジェクト指向構成体、たとえばC++オブジェクト及びクラスを用いる試験プログラム開発を記述する。詳細には、この方法は、本発明の譲受人に譲渡される米国特許出願第60/449,622号、第10/404,002号及び第10/403,817号に記載されるような、オープンアーキテクチャテスタのための試験プログラムを開発するのに適している。
本発明の一実施の形態は、汎用のオブジェクト指向、たとえばC/C++構成体において、試験システム資源、試験システム構成、モジュール構成、試験シーケンス、試験計画、試験条件、試験パターン及びタイミング情報を記述することによって、自動試験装置(ATE)のような半導体検査システムにおいて、被試験デバイス、たとえばICを試験するための試験プログラムを開発するための方法を提供する。これらの記述を含むファイルは、それらのファイルを使用する試験システム又は関連する装置がアクセスできるメモリ、すなわちコンピュータ読取り可能媒体に記憶される。
試験システム資源を記述することは、資源タイプを指定することであって、その資源タイプは、ICに対して1つの試験を実施するための少なくとも1つの試験モジュールに関連付けられる、資源タイプを指定することと、その資源タイプに関連付けられるパラメータタイプを指定することと、及び、そのパラメータタイプのパラメータを指定することとを含んでもよい。
試験システム構成を記述することは、少なくとも1つの試験モジュールを制御するためのサイトコントローラを指定することであって、各試験モジュールはICに対して1つの試験を実施する、サイトコントローラを指定することと、及び、モジュール接続イネーブラの入力ポートを指定することとを含んでもよい。その試験システムは、指定された入力ポートにおいて、サイトコントローラをモジュール接続イネーブラに接続し、モジュール接続イネーブラは、サイトコントローラを1つの試験モジュールに接続する。モジュール接続イネーブラはスイッチマトリクスとして実装してもよい。
モジュール構成を記述することは、モジュールタイプを指定するためのモジュール識別子を指定することと、モジュール識別子によって指定されるモジュールタイプの試験モジュールを制御するための実行可能コードを指定することと、及び、試験モジュールに関連付けられる資源タイプを指定することとを含んでもよい。実行可能コードは、ダイナミックリンクライブラリの形をとることができる。
モジュール構成を記述することはさらに、ユーザが、モジュール接続イネーブラの出力ポートを指定するためのスロット識別子を指定することを含んでもよく、試験システムは、その出力ポートにおいて、試験モジュールをモジュール接続イネーブラに接続し、モジュール接続イネーブラは試験モジュールを対応するサイトコントローラに接続する。またユーザは、試験モジュールの供給元を特定するためのベンダ識別子と、資源タイプに関連して利用することができる資源ユニットの最大数の識別子とを指定してもよい。資源タイプは、たとえばデジタルテスタピン及び資源ユニットテスタチャネルであってもよい。別法では、テスタチャネル資源ユニットはまた、たとえば、アナログテスタピン、RFテスタピン、電源ピン、デジタイザピン及び任意波形発生ピンのような資源タイプに対応してもよい。どの資源ユニットが使用禁止にされるかに関する指標も与えることができる。使用禁止として指示された資源ユニットは、試験モジュールの欠陥のある資源ユニットを表し得る。
試験条件を記述することは、少なくとも1つの試験条件グループを指定することと、少なくとも1つの変数を含む仕様セットを指定することと、及び、変数に結び付けられるべき式を選択するためのセレクタを指定することとを含んでもよい。試験条件グループをその仕様セットのためのセレクタに関連付けることにより、試験条件が規定される。
試験シーケンスを記述することは、種々の試験を実施することができる順序(又はフロー)を指定することを含んでもよい。
試験パターンを記述することは、試験パターン、関連する電圧及び電流レベル、信号値の遷移、対応する立ち上がり及び立ち下がり時間、ならびに関連するタイミングを指定することを含んでもよい。
本発明の一実施の形態のパターンコンパイラは、少なくとも1つのモジュール特有のパターンコンパイラと、パターンソースファイルの対応するモジュール特有のセクション、及びそのパターンソースファイルの共通セクションの両方をコンパイルするように各モジュール特有のコンパイラに指示するためのオブジェクトファイルマネージャとを備える。共通セクションは、全てのモジュール特有のコンパイラがアクセス可能な情報を含む。そのコンパイラの出力は、少なくとも1つのモジュール特有のパターンデータセクションを含む。モジュール特有のパターンローダが、実行するために、対応するモジュール特有のパターンデータセクションからのモジュール特有のパターンデータを対応する試験モジュールにロードする。
試験プログラムを開発するための開示される方法は、その試験計画が扱うことを目的としている問題領域に近い言語において試験計画を記述することにより、システムプログラミングの複雑さを試験計画開発者から切り離す。また、その方法によれば、試験技師は試験プログラム開発の早期の段階において試験計画内のエラーを特定できるようになり、試験プログラム及び試験される対応するDUTの開発時間を短縮することができる。
一実施の形態において、半導体試験システムのための試験プログラムを開発するための方法は、試験プログラム言語(TPL)において試験計画ファイルを記述することであって、試験計画ファイルは試験プログラムの少なくとも1つの試験を記述する、記述すること、システムプログラム言語(SPL)において試験クラスファイルを記述し、TPLにおいて試験クラスファイルの対応するプリヘッダファイルを記述することであって、試験クラスファイルは試験プログラムの少なくとも1つの試験のインプリメンテーションを記述する、記述すること、及び、試験計画ファイル、試験クラスファイル及びプリヘッダファイルを用いて試験プログラムを生成することを含む。
別の実施の形態において、半導体試験システムのための試験プログラムを生成するためのプリヘッダは、試験プログラムの少なくとも1つの属性を指定するためのパラメータセクションと、試験プログラムのヘッダファイル内にソースコードを挿入するためのテンプレートセクションとを含み、試験プログラムの少なくとも1つの属性は1つのパターンリスト及び1つの試験条件に関連する。
さらに別の実施の形態において、半導体試験システムのための試験プログラムの妥当性を検査するための方法は、試験プログラム言語(TPL)において試験計画ファイルを記述することであって、試験計画ファイルは試験プログラムの少なくとも1つの試験を記述する、記述すること、TPLにおいてプリヘッダファイルを記述すること、及び、プリヘッダファイルを用いて試験計画ファイルの妥当性を検査することを含む。
さらに別の実施の形態において、半導体試験システムは、被試験デバイスに少なくとも1つの試験を適用するための少なくとも1つの試験モジュールと、試験計画ファイル、試験クラスファイル及び試験クラスファイルの対応するプリヘッダファイルとを受信するためのコントローラとを備え、試験計画ファイルは試験プログラム言語(TPL)において少なくとも1つの試験を記述し、試験クラスファイルはシステムプログラム言語(SPL)において少なくとも1つの試験のインプリメンテーションを記述する。半導体試験システムはさらに、試験計画ファイル及びプリヘッダファイルをコンパイルする手段であって、それによって、それぞれ導出試験計画ファイル及びヘッダファイルを構成する、試験計画ファイル及びプリヘッダファイルをコンパイルする手段と、試験クラスファイル、導出試験計画ファイル及びヘッダファイルを用いて試験プログラムを生成する手段とを備える。
本発明の上記の特徴及び利点、ならびに本発明のさらに別の特徴及び利点は、添付の図面とともに取り上げられるときに、本発明の実施形態の詳細な説明の結果として、以下においてさらに明確に理解されるであろう。
半導体試験システムのための試験プログラムを開発するための方法及びシステムが提供される。以下の説明は、当業者の誰もが本発明を実施し、使用できるようにするために提示される。特定の実施形態及び応用形態の説明は、例としてのみ提供される。本明細書において説明される例の種々の変更及び組み合わせが当業者には容易に明らかになるはずであり、本発明の精神及び範囲から逸脱することなく、本明細書において規定される一般原理は、他の例及び応用形態にも適用することができる。したがって、本発明は説明及び図示される例に限定されることを意図するのではなく、本明細書に開示される原理及び特徴と合致する最も広い範囲を与えられるべきである。
本発明は包括的には、同じ譲受人による米国特許出願第60/449,622号、第10/404,002号及び第10/403,817号に開示されるようなオープンアーキテクチャ試験システムの観点から説明される。しかしながら、本発明の試験プログラム開発システム及び方法の実施形態が、オープンテスタアーキテクチャだけでなく、固定テスタアーキテクチャにも同様に当てはまることは当業者には認識されよう。
オープンアーキテクチャ試験システムに関する記述は、米国特許出願第10/772,372号「Method and Apparatus for Testing Integrated Circuits」において見ることができ、その特許出願は、同じ譲受人による米国特許出願第60/449,622号の恩典を主張する。
図1は、如何に信号が生成され、被試験デバイス(DUT)に加えられるかを示す、従来のテスタの一般化されたアーキテクチャを示す。各DUT入力ピンが、試験データを加えるドライバ2に接続され、一方、各DUT出力ピンはコンパレータ4に接続される。大抵の場合に、トライステートドライバ−コンパレータが用いられ、各テスタピン(チャネル)が入力ピン、出力ピンのいずれかとして動作できるようにする。単一のDUTのために専用に設けられるテスタピンは合わせて試験サイトを形成し、その試験サイトは、関連するタイミング発生器6、波形発生器8、パターンメモリ10、タイミングデータメモリ12、波形メモリデータ14及びデータ速度を規定するブロック16によって動作する。
図2は、本発明の一実施形態によるシステムアーキテクチャ100を示す。システムコントローラ(SysC)102が多数のサイトコントローラ(SiteC)104に接続される。システムコントローラは、ネットワークにも接続され、ファイルにアクセスすることができる。試験サイト110に配置される1つ又は複数の試験モジュール108を制御するために、各サイトコントローラは、モジュール接続イネーブラ106を通して、試験モジュール108に接続される。モジュール接続イネーブラ106は、接続されるハードウエアモジュール108の構成を変更できるようにするとともに、データ転送用(パターンデータのロード用、応答データの収集用、制御用等)のバスとしての役割も果たす。実現可能なハードウエアの実装形態は、専用接続、交換接続、バス接続、リング接続及びスター接続を含む。モジュール接続イネーブラ106は、たとえばスイッチマトリクスとして実装することができる。各試験サイト110は1つのDUT112に関連付けられ、DUT112は、ロードボード114を通して、対応するサイトのモジュールに接続される。1つの実施形態では、単一のサイトコントローラを多数のDUTサイトに接続することができる。
システムコントローラ102は、システム全体のマネージャとしての役割を果たす。システムコントローラ102は、サイトコントローラの動作状態を調整し、システムレベルの並列試験方法を管理し、さらに、ハンドラ/プローブを制御し、システムレベルのデータロギング及び誤り処理をサポートする。動作環境によっては、システムコントローラ102は、サイトコントローラ104の動作とは別のCPU上に配置することができる。別法では、システムコントローラ102及びサイトコントローラ104は、共通のCPUを共有することができる。同様に、各サイトコントローラ104は、その専用のCPU(中央演算装置)上に配置することができるか、あるいは同じCPU内の別個のプロセス又はスレッドとして配置することができる。
個々のシステムコンポーネントを、集積されたモノリシックシステムの論理的なコンポーネントを見なすことができ、必ずしも1つの分散処理システムの物理的なコンポーネントではないことを前提とすると、図2に示されるシステムアーキテクチャは概念的には分散処理システムと考えることができる。
図3は、本発明の一実施形態によるソフトウエアアーキテクチャ200を示す。ソフトウエアアーキテクチャ200は分散オペレーティングシステムを表しており、関連するハードウエアシステム要素102、104、108に対応する、システムコントローラ220、少なくとも1つのサイトコントローラ240及び少なくとも1つのモジュール260のためのコンポーネントを有する。モジュール260に加えて、アーキテクチャ200は、ソフトウエア内のモジュールエミュレーション280のための対応するコンポーネントを含む。
1つの例示的な選択として、このプラットフォームのための開発環境はマイクロソフト ウインドウズを基にすることができる。このアーキテクチャを用いることによって、プログラム及びサポートの可搬性に関して副次的な利点がもたらされる(たとえば、フィールドサービスエンジニアが、テスタオペレーティングシステムを実行するラップトップを接続して、高度な診断を実行することができる)。しかしながら、大量のコンピュータ集約的な作業(たとえば、テストパターンコンパイル)を行うために、関連するソフトウエアは、分散プラットフォーム上でジョブをスケジューリングできるようにするために個別に実行することができる個別の実体として構成することができる。したがって、バッチジョブのための関連するソフトウエアツールは、多数のプラットフォームタイプ上で動作することができる。
1つの例示的な選択として、ANSI/ISO標準C++を、ソフトウエアのためのネイティブ言語とすることができる。当然、第三者が自ら選択した別の言語を用いるシステムに組み込むことができるようにする多数のオプションが(名目的なC++インターフェース上に層を設けるために)利用可能である。
図3は、テスタオペレーティングシステム、ユーザコンポーネント292(たとえば、試験を実施するためにユーザによって供給される)、システムコンポーネント294(たとえば、基本的な接続性及び通信のためのソフトウエアインフラストラクチャとして供給される)、モジュール開発コンポーネント296(たとえば、モジュール開発者によって供給される)及び外部コンポーネント298(たとえば、モジュール開発者以外の外部供給元によって供給される)を含む、名目的な供給元によって(又はサブシステムとしてまとめて開発するものとして)編成された構成に基づくコンポーネントの陰影を示す。
供給元に基づいて編成されたという見方をすると、テスタオペレーティングシステム(TOS)インターフェース290は、システムコントローラ/サイトコントローラインターフェース222と、フレームワーククラス224と、サイトコントローラ/モジュールインターフェース245と、フレームワーククラス246と、既定モジュールレベルインターフェースと、バックプレーン通信ライブラリ249と、シャーシスロットIF(インターフェース)262と、ロードボードハードウエアIF264と、バックプレーンシミュレーションIF283と、ロードボードシミュレーションIF285と、DUTシミュレーションIF287と、DUTのVerilogモデルのためのVerilog PLI(プログラミング言語インターフェース)288と、DUTのC/C++モデルのためのC/C++言語サポート289とを含む。
ユーザコンポーネント292は、ユーザ試験計画242と、ユーザ試験クラス243と、ハードウエアロードボード265と、DUT266と、DUT Verilogモデル293と、DUT C/C++モデル291とを含む。
システムコンポーネント294は、システムツール226と、通信ライブラリ230と、試験クラス244と、バックプレーンドライバ250と、HWバックプレーン261と、シミュレーションフレームワーク281と、バックプレーンエミュレーション282と、ロードボードシミュレーション286とを含む。
モジュール開発コンポーネント296は、モジュールコマンドインプリメンテーション248と、モジュールハードウエア263と、モジュールエミュレーション284とを含む。
外部コンポーネント298は外部ツール225を含む。
システムコントローラ220は、サイトコントローラへのインターフェース222と、フレームワーククラス224と、システムツール226と、外部ツール225と、通信ライブラリ230とを含む。システムコントローラソフトウエアはユーザのための一次的なインタラクションポイントである。それは、本発明のサイトコントローラへのゲートウエイと、同じ譲受人による米国特許第60/449,622号に記載されるようなマルチサイト/DUT環境におけるサイトコントローラの同期とを提供する。ユーザアプリケーション及びツールは、グラフィカルユーザインターフェース(GUI)に基づくものでも、そうでないものでも、システムコントローラ上で実行される。システムコントローラは、試験計画、試験パターン及び試験パラメータファイルを含む、全ての試験計画関連情報のためのリポジトリとしての役割も果たす。これらのファイルを記憶するメモリは、システムコントローラに対してローカルに存在することができるか、又はオフライン、すなわち或るネットワークを通してシステムコントローラに接続されることができる。試験パラメータファイルは、本発明の一実施形態のオブジェクト指向環境内にある試験クラスのためのパラメータ化データを含む。
第三者の開発者は、標準システムツール226に加えて(又はその代わりに)、複数のツールを提供することができる。システムコントローラ220上の標準インターフェース222は、テスタ及び試験オブジェクトにアクセスするためにそれらのツールが用いるインターフェースを含む。ツール(アプリケーション)225、226によって、試験及びテスタオブジェクトをインタラクティブに、且つバッチで制御できるようになる。それらのツールは、自動能力(たとえば、SECS/TSEMを用いること等による)を提供するためのアプリケーションを含む。
システムコントローラ220上に存在する通信ライブラリ230は、ユーザアプリケーション及び試験プログラムに対してトランスペアレントであるように、サイトコントローラ240と通信するための仕組みを提供する。
システムコントローラ220に関連するメモリ内に存在するインターフェース222は、システムコントローラ上で実行されるフレームワークオブジェクトへのオープンインターフェースを提供する。サイトコントローラに基づくモジュールソフトウエアがパターンデータにアクセスし、それらを検索できるようにするインターフェースが含まれる。また、テスタ及び試験オブジェクトにアクセスするためにアプリケーション及びツールが用いるインターフェース、ならびにスクリプト用エンジンを通してテスタ及び試験コンポーネントにアクセスし、それらを操作する能力を提供するスクリプト用インターフェースも含まれる。これにより、インタラクティブ、バッチ及びリモートアプリケーションのための共通の仕組みが、それらの機能を実行できるようになる。
システムコントローラ220に関連付けられるフレームワーククラス224は、これらの上記のオブジェクトと対話するための仕組みを提供し、標準インターフェースの参照インプリメンテーションを提供する。たとえば、本発明のサイトコントローラ240は機能試験オブジェクトを提供する。システムコントローラフレームワーククラスは、機能試験オブジェクトのリモートシステムコントローラに基づく代理として、対応する機能試験プロキシを提供することができる。こうして、システムコントローラ220上のツールが、標準機能試験インターフェースを利用できるようになる。フレームワーククラスは実効的には、ホストシステムコントローラに関連付けられるオペレーティングシステムを提供する。また、それらのフレームワーククラスは、サイトコントローラへのゲートウエイを提供し、且つマルチサイト/DUT環境におけるサイトコントローラの同期を提供するソフトウエアコンポーネントを構成する。こうして、この層は、通信層で直に取り扱うことを必要とすることなく、サイトコントローラを操作し、それにアクセスするのに適した、本発明の一実施形態におけるオブジェクトモデルを提供する。
サイトコントローラ240は、ユーザ試験計画242、ユーザ試験クラス243、標準試験クラス244、標準インターフェース245、サイトコントローラフレームワーククラス246、モジュールハイレベルコマンドインターフェース(すなわち、既定モジュールレベルインターフェース)247、モジュールコマンドインプリメンテーション248、バックプレーン通信ライブラリ249及びバックプレーンドライバ250のホストとして機能する。試験機能の大部分がサイトコントローラ104/240によって取り扱われ、それにより試験サイト110が個別に動作できるようにすることが好ましい。
試験計画242はユーザによって記述される。その計画は、C++のようなオブジェクト指向構成体を用いて、標準的なコンピュータ言語において直に記述することができるか、又は、C++コードを生成するための、さらに高いレベルの試験プログラミング言語において記述することができ、後に実行可能な試験プログラムにコンパイルすることができる。試験プログラムを開発するために、本発明の1つの実施形態は、譲受人の発明による試験プログラム言語(TPL)コンパイラを利用する。図4を参照すると、試験プログラムコンパイラ400が部分的には、翻訳プログラムセクション402を含むコード生成プログラムとしての役割を果たし、試験及び関連するパラメータを記述する、試験プログラム開発者のソースファイル404を、C++コードのようなオブジェクト指向構成体に翻訳する。さらに、コンパイラセクション406が、コードをコンパイルして、そのコードを実行可能ファイル、たとえばDLLにリンクし、テスタシステムが実行することができる試験プログラムを生成する。TPLコード生成プログラム/翻訳プログラムを試験システムに適用することには新規性があるが、コード生成プログラムは当該技術分野において知られていることに留意されたい。また、コンパイラセクションには、当該技術分野において知られている標準的なC++コンパイラを用いることができる。
試験計画は、そのサイトコントローラに関連するフレームワーククラス246及び/又は標準的な、又はユーザによって供給される試験クラス244を用いることにより試験オブジェクトを作成し、標準インターフェース245を用いてハードウエアを構成し、試験計画フローを規定する。また試験計画は、試験計画の実行中に必要とされる任意の付加的なロジックを提供する。試験計画はいくつかの基本的なサービスをサポートし、デバッグサービス(たとえば、ブレークポイント生成)のような、下層のオブジェクトのサービスへのインターフェースを提供し、下層のフレームワーク及び標準クラスにアクセスできるようにする。
試験プログラムコンパイラ400に入力されるソースコードは、1つの試験計画において用いられるオブジェクト、及びその互いに対する関係を指定する試験計画記述ファイルを含む。このファイルは、標準インターフェースのインプリメンテーションの形で、サイトコントローラ上で実行されるC++コードに翻訳され、それはITestPlanで表すことができる。このコードは、ウインドウズ・ダイナミックリンクライブラリ(DLL)にパッケージングされ、サイトコントローラにロードされることができる。サイトコントローラソフトウエアが試験計画オブジェクトを生成し、それが含む試験計画オブジェクトを戻すために用いることができる標準的な既知のエントリポイントを有するように、試験プログラムDLLが生成される。サイトコントローラソフトウエアは、その試験プログラムDLLを、その処理空間内にロードし、それらのエントリポイントのうちの1つを用いて、試験計画オブジェクトのインスタンスを作成する。一旦、試験計画オブジェクトが作成されたなら、その後、サイトコントローラソフトウエアはその試験計画を実行することができる。
サイトコントローラに関連するフレームワーククラス246は、共通の試験関連動作を実装する1組のクラス及びメソッドである。サイトコントローラレベルフレームワークは、たとえば、電源及びピンエレクトロニクスを一定の順序で配列するためのクラス、レベル及びタイミング条件を設定するためのクラス、測定値を求めるためのクラス、及び試験フローを制御するためのクラスを含む。またフレームワークは、ランタイムサービス及びデバッグのためのメソッドも提供する。フレームワークオブジェクトは、標準インターフェースを実装することによって機能することができる。たとえば、TesterPinフレームワーククラスのインプリメンテーションは、試験クラスがハードウエアモジュールピンと対話するために用いることができる汎用のテスタピンインターフェースを実装するように標準化される。
特定のフレームワークオブジェクトは、モジュールレベルインターフェース247の助けを借りて動作し、モジュールと通信するように実装することができる。サイトコントローラフレームワーククラスは実効的には、各サイトコントローラをサポートするローカルオペレーティングシステムとしての役割を果たすことができる。
一般的には、プログラムコードの90パーセント以上がデバイス試験のためのデータであり、コードの残りの10パーセントは試験方法を実現する。デバイス試験データは、DUTに依存する(たとえば、電源条件、信号電圧条件、タイミング条件等)。試験コードは、指定されたデバイス条件をATEハードウエアにロードするための方法、及びユーザによって指定された目的(データロギング等)を実現するために必要な方法からなる。本発明の一実施形態のフレームワークは、ハードウエアに依存しない試験、及びユーザがDUT試験プログラミングのタスクを実行できるようにするテスタオブジェクトモデルを提供する。
試験コードの再利用性を高めるために、そのようなコードは、任意のデバイス固有のデータ(たとえば、ピン名、刺激データ等)、又はデバイス試験固有のデータ(たとえば、DCユニットのための条件、測定ピン、ターゲットピンの数、パターンファイルの名前、パターンプログラムのアドレス)とは無関係に作成することができる。1つの試験のためのコードがこれらのタイプのデータとコンパイルされる場合には、試験コードの再利用性が減少するであろう。それゆえ、本発明の一実施形態によれば、任意のデバイス固有のデータ又はデバイス試験固有のデータを、コード実行時間中の入力として、外部の試験コードが利用できるようにする。
本発明の一実施形態では、試験クラスは、標準試験インターフェースの1つのインプリメンテーションであり、ここではITestとして表され、特定のタイプの試験のための試験データ及びコードの分離(それゆえ、コードの再利用)を実現する。そのような試験クラスは、それ自体の別個のインスタンスのための「テンプレート」と見なすことができ、それらのインスタンスは、デバイス固有データ及び/又はデバイス試験固有データだけが互いとは異なる。試験クラスは、試験計画ファイルにおいて指定される。各試験クラスは通常、特定のタイプのデバイス試験、又はデバイス試験のための設定を実装する。たとえば、本発明の一実施形態は、DUTのための全ての機能試験のための基本クラスとして、ITestインターフェースの特定のインプリメンテーション、たとえばFunctionalTestを提供することができる。それは、試験条件を設定する機能、パターンを実行する機能、及びストローブに失敗した場合に試験のステータスを判定する機能からなる基本機能を提供する。他のタイプのインプリメンテーションは、ここではACParametricTest及びDCParametricTestとして表される、AC及びDC試験クラスを含むことができる。
全試験タイプは、いくつかの仮想的なメソッド(たとえば、init( )、preExec( )及びpostExec( ))のデフォルトインプリメンテーションを提供することができる。これらのメソッドは、試験技師がデフォルトの挙動を無効にし、任意の試験固有のパラメータを設定するためのエントリポイントになる。しかしながら、試験計画において、カスタム試験クラスを用いることもできる。
試験クラスによって、ユーザは、その試験の特定のインスタンスのためのオプションを指定するために用いられるパラメータを与えることにより、クラス挙動を構成できるようになる。たとえば、機能試験は、パラメータPリスト及びTestConditionを受け取り、それぞれ、実行すべきパターンリスト、及びその試験のためのレベル及びタイミング条件を指定することができる。これらのパラメータのために種々の値を指定することによって(試験計画記述ファイルにおいて種々の「試験」ブロックを用いることによる)、ユーザは機能試験の種々のインスタンスを作成できるようになる。図5は、単一の試験クラスから種々の試験インスタンスを如何に導出することができるかを示す。これらのクラスは、C++コードのような、オブジェクト指向構成体において直にプログラミングすることができるか、又は試験プログラムコンパイラが試験計画ファイルから試験の記述及びそのパラメータを取り込み、対応するC++コードを生成できるようにし、その後、対応するC++コードをコンパイルし、リンクして、試験プログラムを生成することができるように設計することができる。テンプレートライブラリは、一般的なアルゴリズム及びデータ構造の汎用のライブラリとして用いることができる。このライブラリはテスタのユーザから見ることができるので、ユーザは、たとえば、ある試験クラスのインプリメンテーションを変更し、ユーザ定義の試験クラスを作成することができる。
ユーザによって開発された試験クラスに関しては、そのシステムの一実施形態は、全ての試験クラスが単一の試験インターフェース、たとえばITestから派生し、結果として、標準的な1組のシステム試験クラスと同じようにして、フレームワークがそれらの試験クラスを操作できるようになるという点で、そのような試験クラスをフレームワークに組み入れることをサポートする。これらの付加的なファシリティを利用するために試験プログラムにおいてカスタムコードを使用しなければならないことを前提とした上で、ユーザは付加機能をその試験クラスに自由に取り入れることができる。
各試験サイト110は、1つ又は複数のDUT106を専用に試験し、構成変更可能な一群の試験モジュール112を通して機能する。各試験モジュール112は、特定の試験タスクを実行する実体である。たとえば、試験モジュール112には、DCT電源、ピンカード、アナログカード等を用いることができる。このモジュールによる手法は、高い自由度と構成可能性とを提供する。
モジュールコマンドインプリメンテーションクラス248は、モジュールハードウエアベンダが提供することができ、ベンダによって選択されるコマンドインプリメンテーション方法に応じて、ハードウエアモジュールのためのモジュールレベルインターフェース、又は標準インターフェースのモジュール固有のインプリメンテーションを実装する。これらのクラスの外部インターフェースは、既定モジュールレベルインターフェース要件、及びバックプレーン通信ライブラリ要件によって規定される。この層は、標準的な1組の試験コマンドの拡張も可能にし、メソッド(関数)及びデータ要素を追加できるようにする。
バックプレーン通信ライブラリ249は、バックプレーンにわたる標準的な通信のためのインターフェースを提供し、それにより試験サイトに接続されるモジュールと通信するために必要な機能を提供する。これにより、ベンダ固有のモジュールソフトウエアが、バックプレーンドライバ250を用いて、対応するハードウエアモジュールと通信できるようになる。バックプレーン通信プロトコルはパケットに基づくフォーマットを用いることができる。
テスタピンオブジェクトは、物理的なテスタチャネルを表し、ここではITesterPinとして表される、テスタピンインターフェースから派生する。本発明の一実施形態のソフトウエア開発キット(SDK)は、TesterPinとも呼ばれる場合がある、ITesterPinのデフォルトインプリメンテーションを提供し、それは既定モジュールレベルインターフェース、IChannelという形で実装される。ベンダは、IChannelという形でモジュールの機能を実装することができる場合には、自由にTesterPinを利用することができる。そうでない場合には、ベンダは、そのモジュールで正常に機能するためのITesterPinのインプリメンテーションを提供しなければならない。
本発明のテスタシステムによって提供される、ここではIModuleとして表される標準モジュールインターフェースは包括的には、ベンダのハードウエアモジュールを表す。ベンダ供給の、そのシステムのためのモジュール固有のソフトウエアは、ダイナミックリンクライブラリ(DLL)のような実行可能ファイルの形で提供されることができる。1つのベンダからのモジュールタイプ毎のソフトウエアは、単一のDLL内にカプセル化することができる。そのような各ソフトウエアモジュールは、モジュールソフトウエア開発のためのAPIを含む、モジュールインターフェースコマンドのためのベンダ固有のインプリメンテーションを提供するための役割を担う。
モジュールインターフェースコマンドには2つの側面がある。第一に、それらのコマンドは、ユーザがシステム内の特定のハードウエアモジュールと(間接的に)通信するためのインターフェースとしての役割を果たし、第二に、それらのコマンドは、第三者の開発者が、自らのモジュールをサイトコントローラレベルフレームワークに組み込むために利用することができるインターフェースを提供する。したがって、フレームワークによって提供されるモジュールインターフェースコマンドは、2つのタイプに分類される。
最初の、そして最も明らかなコマンドは、フレームワークインターフェースを通してユーザが見ることができる「コマンド」である。こうして、テスタピンインターフェース(ITesterPin)は、レベル及びタイミング値を入手し、設定するための方法を提供し、一方、電源インターフェース(IPowerSupply)は、たとえばパワーアップ及びパワーダウンするための方法を提供する。
さらに、フレームワークは既定モジュールレベルインターフェースの特殊なカテゴリを提供し、それは、モジュールと通信するために用いることができる。これらは、ベンダのモジュールと通信するためにフレームワーククラスによって用いられるインターフェース(すなわち、フレームワークインターフェースの「標準的な」インプリメンテーション)である。
しかしながら、第2の側面、すなわちモジュールレベルインターフェースを用いることはオプションである。それを用いることの利点は、モジュールレベルインターフェースを実装することによってハードウエアに送出される特定のメッセージの内容に重点を置きながら、ベンダがITesterPin及びIPowerSupply等のクラスのインプリメンテーションを利用できることである。しかしながら、これらのインターフェースがそのベンダに適していない場合には、それらのベンダは、フレームワークインターフェースのカスタムインプリメンテーション(たとえば、ITesterPin、IPowerSupply等のベンダインプリメンテーション)を提供することを選択することもできる。その際、これらのベンダは、そのハードウエアに適したカスタム機能を提供するであろう。
バックグラウンドとしてこのオープンアーキテクチャを用いて、本発明の試験プログラム開発システムが以下にさらに説明される。以下のセクションAは、試験プログラムが用いられることになる試験環境を記述するための規則を説明する。セクションBは、試験プログラム開発のための方法及び規則を説明する。セクションCは、試験計画を開発するための方法及び規則、ならびに試験プログラムの主要構造を定義する方法を説明する。セクションDは、オープンアーキテクチャ試験システム上で試験プログラムを実行する方法を説明する。セクションEは、試験パターンのための方法及び規則を説明する。セクションFは、試験パターンのタイミングを記述するための規則を説明する。セクションGは、テスタ動作全体のための規則を説明する。
[A.コンポーネント]
試験環境は、テスタをインストールし、それを1組の試験を実行するために準備するための必要な条件を指定する1組のファイルを含む。試験環境は、以下に記載されるもののためのファイルを含むことが好ましい。
1.テスタ資源定義:そのオープンアーキテクチャ試験システムにおいて利用することができるテスタ資源タイプ、及びそのような資源のためにサポートされるパラメータを指定するためのファイル。
2.テスタ構成:サイトコントローラ、サイト及び対応するマッピングを指定するためのファイル。
3.モジュール構成:各サイト内のハードウエアモジュールを指定するためのファイル。
4.ピン記述:信号ピン、電源のようなDUTピンを命名し、ピングループを記述するためのファイル。
5.ソケット:DUTピン−テスタピンの割当てを指定するためのファイル。
6.ピンオプション:ピンのための特殊なオプション又はモードを指定するためのファイル。
7.パターンリスト:試験パターン及びそのシーケンスを指定するためのファイル。
8.パターン:試験ベクトルを指定するためのファイル。
上記のファイルのうち、項目1〜3はCMD(構成管理データベース)からの情報を用いてICF(インストール及び構成ファイル)によって作成され、既知の場所において入手可能であるのに対して、項目4〜8はユーザによって指定される。このセクションは、上記の項目1〜6のための説明を提供する。項目7及び8はセクションEにおいてさらに詳細に説明される。これらのコンポーネントをそれぞれ開発するために、特定の方法及び規則が用いられることが好ましい。これらの方法及び規則は、例とともにこのセクションにおいて説明されるであろう。
[A1.資源定義]
各ハードウエアモジュールは、試験システムによって用いるための1つ又は複数のタイプのハードウエア資源(略して資源)を提供する。テスタ資源定義は、利用可能な資源タイプのための1組の資源名、並びにそれぞれの特定の資源タイプに関連する1組のパラメータ名及びタイプを宣言するために用いられることが好ましい。たとえば、資源名dpinは、デジタルテスタピンを指すために用いられる。これらの資源は、VIL(入力低電圧用)、VIH(入力高電圧用)、VOL(出力低電圧用)、VOH(出力高電圧用)等のパラメータを有する。資源定義ファイルは、「.rsc」の拡張子を有するであろう。以下に示されるのは、いくつかのテスタ資源を含む、資源定義の一例である。
#
# 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;
}
}
資源パラメータのタイプ(Voltage又はTime等)は標準的な工学単位であることが好ましいことに留意されたい。異なるパラメータを指定することが望ましい特定用途の資源を供給するベンダは、自らの資源定義ファイルを提供すべきである。
[資源定義のための構造]
以下に与えられるのは、本発明の好ましい実施形態による資源定義ファイルのための構造である。
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
上記の未定義の非終端記号は以下のように指定される。
1.version-identifier:集合[0−9a−zA−Z.]からの1つ又は複数の文字からなる文字列。それはバージョン番号を表す。
2.resource-name:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列であり、数字で始まらない。それはdpin又はdpsのような資源の名前を表す。
3.elemantary-type-name:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列であり、数字で始まらない。それは、Voltage(cf.)のような基本タイプの名前を表す。
4.resource-param-name:集合[a−zA−Z_0−9]からの1つ又は複数の文字空なる文字列であり、数字で始まらない。それは、VILのような資源パラメータの名前を表す。
[A2.テスタ構成]
テスタ構成は、特定のシステム構成内のサイトコントローラ、及びサイトコントローラのスイッチマトリクス入力ポートへの接続を記載するために用いられることが好ましい1組の規則である。本発明の一実施形態のアーキテクチャでは、単一のサイトコントローラを単一のスイッチマトリクス入力ポートに接続することができる。したがって、この状況では、スイッチマトリクス接続は、システム内のサイトコントローラのための暗黙の識別子としての役割を果たす(他の構成も可能である)。以下は一般的なテスタ構成の一例である。
#
# 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として入手することができる。1つの実施形態では、ポート1(上記の例では「127.0.0.0」)に接続されるサイトコントローラは特別なステータスを享受することができ、そのステータスでは、そのサイトコントローラが単独でスイッチマトリクスを構成することに留意されたい。この「特殊な」サイトコントローラはSITEC−1と呼ばれるであろう。また、そのサイトコントローラは内部ネットワークによってシステムコントローラに接続することができるので、この例におけるサイトコントローラアドレスはIPアドレスであることにも留意されたい。逆に、システムコントローラは、パターンデータのようなファイルにアクセスするために外部ネットワークに接続することができる。
[テスタ構成のための構造]
以下に与えられるのは、本発明の一実施形態によるシステム構成ファイルのための構造である。
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
上記の未定義の非終端記号は以下のように指定される。
1.version-identifier:集合[0−9a−zA−Z.]からの1つ又は複数の文字からなる文字列。それはバージョン番号を表す。
2.octet:0〜255の負でない整数(10進表記)。
3.name:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列であり、数字で始まらない。それは、ドメイン修飾されたホスト名内の名前部分を表す。
4.input-port:10進表記の負でない整数。
[A3.モジュール構成]
モジュール構成によって、テスタの物理的な構成、たとえばシステムシャーシ内の各モジュールの物理的な場所及びタイプを指定できるようになる。これは、動的なテスタバス構成によって必要とされ、そのテスタバス構成によって、テスタバスアドレスを物理的なスロットの場所にマッピングできるようになる。この情報は、システム構成の妥当性を検査するためにシステムブートアップ時に行われるハードウエア発見プロセスを可能にする。スイッチマトリクスの各出力ポートは物理的なスロットを定義し、そのスロットは単一のハードウエアモジュールによって占有されることが好ましい。以下に示されるのは、本発明の一実施形態による、ファイル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;
}
}
}
先に記載されたように、1つの実施形態では、スロットは、スイッチマトリクスの出力ポートのような、1つのハードウエアモジュールを接続することができるコネクタを指している。各構成定義は、1つ又は複数のスロットに取り付けられる場合があるモジュールについての情報を提供する。構成定義において指定されるVendorIDは、1つのベンダに関連する固有のIDである。ModuleIDは、このベンダによって提供されるモジュールのタイプを指している。1つのテスタ構成内に同じModuleIDのいくつかのインスタンスが存在する場合もある。ModuleDriverは、そのモジュールをサービスするためにベンダ供給DLLを指している。最後に、Resourceは、このモジュールによってサービスされるユニットを指しており、資源タイプのための名前を与える。資源名は資源定義ファイルから得られる。
上記の例は、モジュール構成ファイル内の3つの構成ブロックを記述する。1つの実施態様では、第1の構成ブロック、スロット1〜12及び32〜48はベンダ1によって製造されるモジュールによってサービスされる。このベンダは、そのモジュール、このモジュールタイプを指すための識別子「1」、及びモジュールを制御するためのモジュールドライバライブラリを提供する。このモジュールは2つのタイプの資源ユニットを提供することができ、一方のタイプは資源名「dpin」によって表され、好ましくは全数が32資源ユニット(すなわち「チャネル」)であり、その全てが利用可能であり、他方のタイプは資源名「analog」によって表され、全数が16資源ユニットであり、9から16までのみ利用可能である。第2及び第3の構成ブロックは第1の構成と同じようにして指定される。
チャネルが「使用禁止」として指示されるようにする措置は、他の点では依然として機能するモジュールにおいて欠陥のある資源ユニットを特定できるようにすることであることに留意されたい。また、構成ブロックは1つ又は複数のスロット識別子を有することができることにも留意されたい。1つのブロックが2つ以上のスロット識別子を有するとき、特定されたスロットはクローンであると言われる。
モジュール構成ファイル、Module.cfgは、ICM(インストール構成管理システム)によってシステムプロファイルの一部として作成され(ユーザによって提供される試験フロア固有の情報を含む)、周知の場所において入手することができる。ICMは、試験システム、たとえばシステムコントローラ上にローカルに存在することができるか、又はシステムコントローラが接続されるネットワーク上のいずれかの場所に存在することができるユーティリティである。ICMはCMD(構成管理データベース)を管理し、通常は、システム構成に対するハードウエア変更時に更新される。ICMによって、ユーザは、システム、たとえばサイトコントローラ及びモジュールを構成できるようになる。CMDは、それらの構成を記憶するデータベースである。実際のテスタの場合、構成/動作ICMが構成ファイル、たとえばモジュール構成、及び他のファイルを生成し、それらのファイル、及び特定のモジュールDLLのような関連するファイルをテスタ上にコピーする。
[モジュール構成のための構造]
以下は、好ましい実施形態によるモジュール構成構造である。
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
上記の未定義の非終端記号は以下のように指定される。
1.version-identifier:集合[0−9a−zA−Z.]からの1つ又は複数の文字からなる文字列。ただし、最初の文字は集合[0−9]から選択されなければならない。
2.positive-integer:集合[0−9]からの1つ又は複数の文字からなる文字列であり、0で始まらない。
3.id-code:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列。
4.resource-name:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列。ただし、第1の文字は集合[a−zA−Z]から選択されなければならない。
コメントがサポートされる。コメントは「#」文字で始まり、行の終わりまで続く。
[A4.ピン記述]
DUTピン記述はピン記述ファイルを用いて記述される。ユーザは、ピン記述ファイル内のDUTピンの記述を入手できようになり、その記述は拡張子.pinを有する。このプレーンテキストファイルは、少なくとも、DUTピン名のリストと、定義されたDUTピン名を利用する、命名されたピングループの初期定義とを含む(それらの定義は、たとえばプログラミングによって、後に変更又は追加することができるので「初期」である)。
このデータ指定を試験計画記述から分離することにより、DUTピン定義を広く再利用できるようになり、そのプロセスを特定の試験計画に関連付けることなく、パターンコンパイラが、ピン記述ファイルからピン名(ベクトル指定において用いられるピン名への参照を決定するために必要とされる)を導出できるようになる。
以下に示されるのは、ピン記述ファイルの一例である。
#
# 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
}
}
}
コンパイラがピン及びピングループ定義をLevel等のため許容パラメータ設定と関連付けられるようにするために、DUTピン及びピングループ定義は資源タイプブロック内にカプセル化されることに留意されたい。
ピン記述についての以下の点に留意されたい。
1.ピングループ及びピンは同じ名前空間を共有し、グローバル(すなわち試験計画)範囲を有する。これらの名前をグローバル範囲にする結果の1つは、異なる資源ブロックにおいて宣言されるときでも、ピン及びピングループが重複した名前を使用することができないことである。
2.ピン記述ファイルにおいて少なくとも1つの資源定義が必要とされる。
3.各資源において少なくとも1つのピン名が定義されなければならない。
4.ピン及びピングループ名は資源境界内で固有であることが要求される。
5.2つ以上の資源のために同じピン又はグループ名を定義することができる。しかしながら、同じ資源内に同じものがある場合には無視される。
6.1つのグループ定義内に現れる全てのピン名及びグループ名はその資源内で既に定義されていなければならない。
7.もし与えられる場合には、グループ定義は少なくとも1つのピン名又はグループ名を持たなければならない(すなわち、グループ定義は空であることはできない)。
8.ピングループ定義は、予め定義されたピングループへの参照を含むことができる。
9.ピングループ定義は、予め定義されたピン及び/又はピングループの追加及び削除のような集合演算を含むことができる。
[ピン記述のための構造]
以下に与えられるのは、本発明の好ましい実施形態によるピン記述のための構造である。
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
上記の未定義の非末端部は以下のように指定される。
1.version-identifier:集合[0−9a−zA−Z.]からの1つ又は複数の文字からなる文字列。それはバージョン番号を表す。
2.resource-name:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列であり、数字で始まらない。それはdpin又はdpsのような資源の名前を表す。
3.pin-name:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列であり、数字で始まらない。それは、ピンA0の名前を表す。
4.pin-gourp-name:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列であり、数字で始まらない。それは、ピングループABUSの名前を表す。
5.index:負でない整数。それは、関連するピンのグループの下限又は上限を表す。
[A5.ソケット]
ソケットは、DUTピン名と物理的なテスタピン(チャネル)割当てとの間のマッピングを指定する(物理的なテスタチャネル番号はモジュール構成ファイルにおいて定義される)。異なるソケットを用いて、異なるDUTパッケージ及び異なるロードボード構成等をサポートすることができることに留意されたい。マルチDUTシステムの場合、DUT/チャネル割当てのためのソケット定義は、基本ソケットの多数のサイトへの「クローニング」をサポートすることができる。しかしながら、異なるソケット(すなわち、同じ論理ピンのための異なる物理的なマッピング)はサイトモジュール区分を考慮すべきである。したがって、DUTピンをテスタチャネル割当てに与えることに加えて、ソケットは実効的にはサイト区分も定義する。こうして、ソケットファイルは、いくつかの個別のサイトソケットのための定義を含むことができる。以下に示されるのは、3つのDUTサイトを定義するソケットファイルのサンプルである。
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
ソケットファイルについて以下の点に留意されたい。
1.ソケットファイルは、モジュール構成ファイル、及び所与のDUTタイプのためのユーザのピン記述ファイルの両方からの情報を用いる(上記の例のピン記述の場合の指定を参照されたい)。モジュール構成情報は、ソケットファイルコンパイラが暗黙のうちに利用することができる。ソケットファイルコンパイラは、パターンコンパイラの一部を構成し、ソケットDUT名からテスタチャネルへのマッピング、モジュール構成及びピン記述ファイルを読み出し、分析して、テスタピンのパターンコンパイラによって用いられるDUTピンへのマッピングを設定する。
2.DUTタイプ当たり少なくとも1つのDUTサイト定義が必要とされ、それは、SlotOffset構文ではなく、フルスペック構文を用いなければならない。同じDUTタイプに対して2つ以上のDUTサイト定義が与えられる場合には、第1のサイト定義はフルスペック構文を用いなければならない。
3.後続の各DUTサイト定義(同じDUTタイプ)は、フルスペック構文、SlotOffset構文のいずれかを用いることができるが、両方は用いることができない。これにより、個々のサイトが、標準パターンから逸脱できるようになる(たとえば、動作不能のチャネルに起因する)。
4.SlotOffset構文から導出される結合は、そのDUTタイプのために定義される第1のサイト(フルスペック構文を用いる)に対して定義される。
5.DUTサイトは、実際の物理的な順序で宣言される必要はない。これにより、第1の(物理的な)サイトがそのパターンから逸脱する状況が許される。
6.DUTサイトIDは、ソケット全体にわたって(すなわち、その中で定義される全てのDUTタイプにわたって)固有であることが要求される。
7.DUTサイト定義毎に少なくとも1つの資源定義が必要とされる。
8.サイト定義を、モジュール構成とともに用いて、試験構成が単一サイト/単一DUTであるか、単一サイト/多数DUTであるかを判定しなければならない。
9.全ての場合に、ソケットファイルは、ピン記述ファイル及びモジュール構成ファイルと一致する1組のDUTチャネルマッピングを指定しなければならない。
10.場合によっては、1つ又は複数のDUTチャネルがテスタから切断されることをソケットが指定できるようにすることが望ましいであろう(たとえば、割り当てられた物理チャネルを特殊なID「0.0」を有するチャネルと指定することによる)。この場合、試験プログラムの関連で、これらのDUTチャネルを使用し、参照することができる。そのようなチャネル上での動作の結果として、システム警告が生成されるであろう(ただし、エラーではない)。ロード時に、切断されたチャネルのためのパターンデータは破棄されるであろう。
[ソケットのための構造]
以下は、本発明の好ましい実施形態によるモジュール構成のための構造である。
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
上記の未定義の非終端記号は以下のように指定される。
1.version-identifier:集合[0−9a−zA−Z.]からの1つ又は複数の文字からなる文字列。それはバージョン番号を表す。
2.Dut-type-name:集合[0−9a−zA−Z.]からの1つ又は複数の文字からなる文字列。ただし、最初の文字は集合[0−9]から選択されてはならない。それは、CHIP3のようなDUTのタイプを表す。
3.pin-description-file-name:ファイルの簡単な名前であり、そのディレクトリ名は含まないが、全ての拡張子を含む。そのファイル名は、ホストオペレーティングシステムによって認識される構文からなり、引用符に囲まれる場合には、空白及び他の文字が許される。
4.switch-matrix-input-port-number:10進表記の負でない整数であり、サイトコントローラに接続される入力ポートのポート数を表す。
5.dut-id:10進表記の負でない整数であり、DUTのインスタンスを特定する。
6.resource-name:集合[0−9a−zA−Z]からの1つ又は複数の文字からなる文字列であり、最初の文字は数字であってはならない。それは資源ファイルにおいて定義される資源の名前を表す。
7.resource-item-name:集合[0−9a−zA−Z]からの1つ又は複数の文字からなる文字列であり、最初の文字は数字であってはならない。それは、ピン又はピングループのような資源ユニットの名前を表す。
8.resource-item-index:10進表記の負でない整数であり、資源項目のグループのうちの特定のメンバを表す。resource-item-index-rangeの関連では、それは、資源項目グループの連続した文字列の下限又は上限を表す。
9.resource-unit-index:10進表記の負でない整数であり、資源ユニット(チャネル)のグループのうちの特定のメンバを表す。resource-unit-index-rangeの関連では、それは、資源ユニットグループの連続した文字列の下限又は上限を表す。
[A6.ピン]
論理的なピン名を物理チャネルにマッピングすること(たとえばソケットによって提供される)に加えて、テスタ資源を指定するためにいくつかの属性を用いることができることに留意されたい。たとえば、試験固有、ベンダ固有、及び/又は試験システム固有の場合がある、チャネルのための特定のハードウエア構成を定義するために、複数のオプションを用いることができる。これらのオプションは、ピンモードオプションを用いて記述され、ピンモードオプションファイルを通して入手できるようになるであろう。
ピンモードオプション定義は、テスタチャネルのための特殊なオプション又はモードの構成をサポートするであろう。たとえば、これを用いて、チャネルを選択し、チャネル多重化を構成することができる。ピンモードオプションはチャネル構成をかなり変更することが必要となる場合もあるので、試験計画初期フローの一部としてのみ用いられることが好ましい。ピンオプション構文は、ベンダによって定義されるオプションをサポートする。一例が以下に示される。
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
インストール中に、ホストコンピュータ上に存在するインストール及び構成管理システム(ICM)が、Tester_ACTIVE_CONFIGSの値を設定することが好ましいであろう。ICMが上記のファイルのうちの1つの新たなバージョンを作成する度に、その新たなバージョンを、Tester_ACTIVE_CONFIGSによって指示される場所に置くであろう。上記の3つのファイルに加えて、シミュレーション構成ファイルのような他のシステム構成ファイルも、Tester_ACTIVE_CONFIGSによって指示される場所に置かれることに留意されたい。
[B.試験プログラム開発のための規則]
テスタシステムの2つの主なエンドユーザ向けコンポーネントのうちの1つが試験環境である。他のコンポーネントは、テスタがエンドユーザ(すなわち、試験技師及び試験クラス開発者)に提供するプログラミングファシリティである。
プログラミング環境の主なコンポーネントは試験計画である。試験計画は試験クラス(すなわちTestで表される試験インターフェースの種々のインプリメンテーションである)を使用し、試験クラスは、特定のタイプの試験のための試験データ及びコードの分離を実現する。
その計画はC++試験プログラムとして直に書くことができるか、又は試験計画記述ファイル内に記述することができ、そのファイルは試験プログラム発生プログラム(翻訳プログラム402)によって処理され、C++コードのようなオブジェクト指向コードが生成される。その後、生成されたC++コードをコンパイルして、実行可能試験プログラムを作成することができる。レベル、タイミング等の試験クラスインスタンスを構成するために必要とされるデータは、試験計画記述ファイルにおいてユーザによって指定される。
試験プログラムは、1つのデバイス上で試験を実行するための詳細を指定する、1組のユーザ書込みファイルを含む。本発明の一実施形態は、ユーザがC++構成体を用いてこれらのファイルを書くことができるようにする複数組の規則を含む。
本発明の実施形態による要件のうちの1つは、オープンアーキテクチャ試験システムのモジュール性を追求することである。モジュール式の開発によって、ユーザが試験の種々の側面に関係する個々のコンポーネントを書くことできるようになり、それにより、これらのコンポーネントを種々の態様で様々に組み合わせて、1つの完全な試験プログラムを生成できるようになる。本発明の好ましい実施形態による試験プログラムは以下のような1組のファイルを含む。
ユーザ変数及び定数のためのファイル*.usrv
仕様セットのためのファイル*.spec
レベルのためのファイル*.lvl
タイミングのためのファイル*.tim
試験条件グループのためのファイル*.tcg
ビン定義のためのファイル*.ddefs
カスタム関数及び試験クラス用のファイルプリヘッダのためのファイル*.ph
カスタムタイプのためのファイル*.ctyp
カスタム変数のためのファイル*.cvar
試験計画のためのファイル*.tpl
上記のファイル拡張子は、ファイルのカテゴリ化を容易にする、推奨される決まりである。単一の試験プログラムは、単一の試験計画ファイルと、それがインポートするファイルとを含むことが好ましいであろう。「インポート」は、インポータ(インポートを指定するファイル)によって直に参照されるか、又はインポータによって直に参照されるいくつかの他のファイルによってインポートされるデータを有する他のファイルを指している。試験計画ファイルは、グローバル、フロー、及びそのファイル内の他のそのようなオブジェクトを定義することができるか、又はそのファイルは、他のファイルからこの情報をインポートすることができる。これらの規則によって、上記のコンポーネントのうちの任意のものが、その自らの個々のファイル内に存在できるようになるか、又は試験計画ファイル内に直に並べられるようになる。試験計画は、C言語main()関数に概念的に類似であることに留意されたい。
[試験プログラム主要項目]
・ユーザ変数及び定数
・仕様セット
・レベル
・タイミング
・試験条件
・ビン定義
・プリヘッダ
・カスタムタイプ
・カスタム変数
・試験計画
試験プログラム識別子は、アルファベットの大文字又は小文字で始まり、それに続いて、任意の数のアルファベット文字、数字又はアンダーバー(_)を有することができることが好ましい。それは、以下に与えられる説明において提供されるいくつかのキーワードを有する。これらのキーワードは、Versionのように、太字を用いて、本明細書のコード内で視覚的に特定される。キーワードは予約され、識別子として用いられないことが好ましい。{,}、(,)等のいくつかの特殊な記号、及び他の記号があり、それらの記号が以下に説明される。
[試験オブジェクトのエラボレーション]
試験記述ファイルをインポートすることにより、インポート用ファイルが、インポートされるファイルによって利用可能であるオブジェクトの名前を参照できるようになる。これにより、インポート用ファイルは、インポートされるファイルによって命名されるオブジェクトを参照できるようになる。ピン記述ファイルxxx.pinをインポートするソケットファイルaaa.socについて考える。同じくxxx.pinをインポートする別のbbb.socファイルも存在することができる。しかしながら、これらのインポートのいずれによっても、xxx.pinによって記述されるオブジェクトは発生しない。それらは、既に存在するものと仮定されるオブジェクトを参照するだけである。
そのようなオブジェクトがいつ発生するかという疑問が生じる。これは、試験計画ファイルが根本的に異なる場合である。Cとの類似性から、その中に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がエラボレートされる」のように記述される。試験計画が、エラボレートされる必要がある全てのファイルを直にインポートする必要はない。以下の2つのステートメントのうちのいずれかが正しい場合には、ファイルxがファイルyによってインポートされる。
1.yがxを命名するインポートステートメントを有する。又は、
2.xがzによってインポートされ、yがzを命名するインポートステートメントを有する。
試験プログラムがコンパイルされるとき、それは、試験計画によってインポートされるファイル内の全てのオブジェクトをエラボレートするであろう。1つの試験計画によってインポートされる1組のファイルは、それらのファイルがエラボレートされる順序をもたらすようにトポロジカルソートされる。1つの試験計画によってインポートされる1組のファイルは、その試験計画のインポート閉包と呼ばれる。1つの試験計画のインポート閉包がトポロジカルソートできない場合には、インポートサイクルが存在しなければならない。そのような状況は誤っており、コンパイラによって拒否されるであろう。
[ユーザ変数及び定数]
ユーザ変数及び定数を用いて、グローバル変数及び定数が定義されるであろう。それらの定数は、その値がコンパイル時に固定され、変更することができないオブジェクトである。たとえば、最大整数値は定数になるであろう。一方、変数に結び付けられる式は、APIを介して、実行時に変更することができる。
・整数
・符号なし整数
・ダブル
・ストリング
・ボルト単位の電圧(V)
・ボルト/秒単位の電圧スルー(VPS)
・アンペア単位の電流(A)
・ワット単位の電力(W)
・秒単位の時間(S)
・メートル単位の長さ(M)
・ヘルツ単位の周波数(Hz)
・オーム単位の抵抗(Ohm)
・ファラド単位の静電容量(F)
タイプ整数、符号なし整数、ダブル及びストリングは基本タイプと呼ばれる。基本タイプは測定単位を持たない。基本タイプでない基本的なタイプはダブルであり、関連する測定単位及びスケールを有する。指数記号は、共通の工学指数記号である。
・pF(ピコファラド)の場合のような、10−12の場合のp(ピコ)
・nS(ナノ秒)の場合のような、10−9の場合のn(ナノ)
・uS(マイクロ秒)の場合のような、10−6の場合のu(マイクロ)
・mV(ミリアンペア)の場合のような、10−3の場合のm(ミリ)
・kOhm(キロオーム)の場合のような、10+3の場合のk(キロ)
・MHz(メガヘルツ)の場合のような、10+6の場合のM(メガ)
・GHz(ギガヘルツ)の場合のような、10+9の場合のG(ギガ)
ユーザ変数及び定数を有する別個のファイルは拡張子.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;
}
先に宣言された1組のUserVarsは「=」の左側に変数の定義を有するものと見なされる。結果として、1つの変数又は定数の定義は一度だけ行われることが好ましく、初期化されるべきである。
先に述べられたように、定数は、一旦定義されたなら、変更されないであろう。1つの定数に結び付けられる式は、予め定義された定数と、リテラル値とを含むことができる。一方、変数はAPIを介して変更することができる。変数に結び付けられる式は、予め定義された変数と、定数と、リテラル値とを含むことができる。
各変数は実行時に保持される式オブジェクトに結び付けられる。これは、実行時に変数に関連する式を変更し、その後、全ての変数を再評価する能力を与える。式オブジェクトは、変数又は定数定義の右辺のパースされた形である。1つの実施形態では、実行時に定数を変更するためのファシリティは提供されない。それらの値は、コンパイル時に固定されることが好ましい。
グローバルを有する任意の数のそのようなファイルが、1つの試験計画のインポート閉包内に存在することができる。上記のグローバルファイルは1組の数値限界であるが、ここでは、工学測定単位を用いる1組の工学グローバル及びいくつかのランダムユーザ変数である。
# --------------------------------------------------------
# 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コレクション内の名前分解は以下のように進められる。
名前が修飾されている、すなわち名前が点によって分離される2つの部分を含む場合には、変数は、その点の前にある部分によって名前を付けられる、名前付きユーザ変数コレクションからもたらされる。したがって、上記のMyVars.XはMyVarsコレクション内のXを指している。デフォルトユーザ変数コレクションを明示するために、名前「_UserVars」を用いることができる。
その名前が修飾されず、且つそのコレクション内に同じ名前の定数又は変数が存在する場合には、名前はその定数又は変数に分解する。
そうでない場合には、その名前はデフォルトユーザ変数コレクション内の定数又は変数に分解する。
UserVarsコレクション内の定義のブロックの評価は、最初の定義から最後の定義まで順番に生じるものと考えることができる。これには、各変数が用いられる前に、その変数が定義される必要がある。
さらに、UserVarsコレクションのためにいくつかの定義ブロックが存在することができ、各ブロックがいくつかの変数を定義している。これらの定義ブロックは全て、試験計画において宣言された順序で評価されるものと考えることができ、その後、各ブロックの変数も宣言された順序で検査される。
最後に、いくつかのUserVarsコレクションが存在することができ、各UserVarsコレクションがいくつかの定義ブロックにわたって変数を定義する。再び、それらの変数は全て、宣言された順序で初期化されるものと考えることができる。こうして、上記の例では、評価順序は、MyVars.X、MyVars.Y、YoursVars.X、YoursVars.Y1、YoursVars.Y2、MyVars.Zになるであろう。
UserVarsコレクションが別のコレクションからの変数を用いるとき、UserVarsコレクションはその変数の生データだけを用いることが好ましい。コレクション間では従属性情報は保持されない。それゆえ、従属性に基づく再評価は、ただ1つのコレクションに限定することができる。
各ユーザ変数コレクションはC++ UserVarsクラスのインスタンスを指している。C++ UserVarsクラスのデフォルトオブジェクトは「_UserVars」と名前を付けられる。名前付きでないUserVars宣言内の変数は、デフォルトユーザ変数コレクションからのものであり、このデフォルトオブジェクトに追加される。名前付きユーザ変数コレクション内の変数は、その名前を有するC++ UserVarsクラスのオブジェクトに追加される。上記の例では、「MyVars」C++オブジェクトは、変数X、Y及びZを有することになるであろう。
[ユーザ変数のためのC++]
ユーザ変数は、nameストリング、const/varブーリアン、列挙された値としてのtype及び式木としてのexpressionを有するn個組のコレクションとして実装される。1つの名前の式は、以下のコールによってセットすることができる。
enum ElemenaryType {UnsignedlntegerT, IntegerT,
DoubleT, VoltageT,...};
Status setExpression(const String& name,
const bool isConst,
const elementaryType,
const Expression& expression);
タイプExpressionは、アサインメントの右辺に対応するテキストのパースされた形であるタイプである。UserVarsのグローバルに利用可能なインスタンスが存在するであろう。たとえば、limits.usrv内の1組のユーザ変数の集合(pageを参照)は、以下に示される1組のコールによって実装される。
_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のためのランタイムAPI]
これらの名前及び式を含むC++ UserVarsクラスは、アプリケーションプログラムインターフェース(API)をエクスポートし、実行時にこれらの値を評価し、変更する。UserVarsに関連する式の変更は、UserVarsがいつ再評価されるか、及びその評価の影響が何であるかという問題にも対処する。
最初に、1つの変化の結果としてのUserVarsの再評価がいつトリガされるべきであるかの問題を考える。それが、式に変更を加えるときに直ちにトリガされる場合には、ユーザは、再評価をトリガする前に、一連の関連する変更を加えることができないであろう。したがって、再評価は、ユーザによる明示的なコールによってトリガされる。
次に、再評価の影響を考えることができる。好ましい実施形態によれば、3種類の再評価が利用可能である。
UserVars Collection Re-evaluationは、ただ1つのUserVarsコレクションに限定される再評価である。この演算の意味は、このコレクションの全ての変数をもう一度、再評価することである。
UserVars Targeted Re-evaluationは、ただ1つの名前に結び付けられる式に対する変更に限定される再評価である。これにより、ユーザは、ただ1つの名前の式を変更できるようになり、この特定の変更だけを考慮に入れて、コレクションの再評価が行われるであろう。
UserVars Global Re-evaluationは、全てのUserVarsコレクションの再評価である。これは基本的には、全てのUserVarsコレクションの再評価を、宣言された順序でトリガするので、非常にコストがかかる。
上記の再評価は全て、UserVarsを再評価した後に、Level、Timing等の従属オブジェクトを再評価するであろう。従属オブジェクトは、それが再評価を必要とすることを表すダーティビットを有するであろう。UserVarsコレクションがプログラムによって変更されるときはいつでも、それは、全ての従属オブジェクトにおいてダーティビットもセットするであろう。これは、従属オブジェクトの再評価をトリガするであろう。
要約すると、名前付きUserVarsコレクションは、再評価の影響の問題を封じ込めるのを助ける。再評価は通常、ただ1つのコレクションに限定される。UserVarsを用いる1つの単純な方法は、デフォルト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()コールは、その式の結果として循環的な従属性が生じる場合には、失敗する可能性がある。たとえば、以下の2つのコールが行われる場合には、第2のコールは、循環的な従属性による失敗によって失敗するであろう。
setExpression ("X", true, IntegerT, Expression("Y+1"));
setExpression ("Y", true, IntegerT, Expression("X+1"));
これは、名前に結び付けられる値が式であり、アサインメントでないためである。変数の値が変更されるとき、直接的及び間接的に従属する名前を全て再評価するためのメソッドが提供される。上記の一対の式のような式の結果として、循環的な従属性が生じ、それは許容されない。
このAPIは典型的には要求されていない再評価をサポートしないことに留意されたい。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が記述されるときに、仕様セットにおいてセレクタをセットする演算が以下に説明されるであろう。
構文的には、仕様セットaは、セレクタのリスト(上記の例では、Minnie、Mickey、Goofy及びDaisy)と、変数定義のリスト(上記の例では、xxx、yyy、zzz及びwww)である。変数の定義は、セレクタのリストと同じ長さの式のリストを含むか、又はただ1つの式を含む。
概念的には、仕様セットは式の行列と考えることができ、その列がセレクタであり、その行が変数であり、そのエントリが式である。特定のセレクタ(列)が各変数(行)を特定の式(エントリ)に結び付ける。そのリストがただ1つの式を有する場合には、そのリストは、セレクタが存在するのと同じ数だけ式が繰り返される行を表す。
仕様セットは2つの別個の状況において現れることができる。仕様セットは、.specファイルにおいて別個に宣言されることができ、その場合には、それらの仕様セットは先に示されたように現れる。これらは名前付き仕様セットである。別の状況では、ローカル仕様セットをTest Codition Group内で宣言することができる。そのような宣言では、仕様セットは名前を与えられないであろう。取り囲んでいる試験条件グループに対してだけ意味のあるローカルな仕様セットが存在するであろう。
名前付きユーザ変数コレクションの後に、名前付き仕様セットをモデル化することができる。上記の仕様セットは、Aaaと名前を付けられるUserVarsコレクションとしてモデル化されることができ、それはxxx[Minnie]、xxx[Mickey]、xxx[Goofy]、xxx[Daisy]、yyy[Minnie]等のための式を有するであろう。ある試験の状況において特定のセレクタ(たとえばMickey)が選択されるとき、xxx、yyy及びzzzの値は変数名及び仕様セット名から得られる。
試験条件グループは、ローカル仕様セットか、名前付き仕様セットへの参照かのいずれかである、多くても1つの仕様セットを有することができる。ローカル仕様セットは、試験条件グループの状況においてのみ現われ、明示される名前を持たない。そのような仕様セットは、取り囲んでいる試験条件グループの名前によって定義される暗黙の名前を有する。いくつかの仕様セット及びいくつかのUserVarsコレクションが現われる時点で、1つの試験条件グループ内の1つの名前を分解するために、以下の規則が適用される。
1.その名前が修飾されている場合には、その名前は、名前付きユーザ変数コレクションにおいて分解されなければならない。
2.その名前が修飾されていない場合には、その名前は、その名前が試験条件グループにおいて宣言される場合にはローカル仕様セットにおいて、それが試験条件グループにおいて参照される場合には名前付き仕様セットにおいて分解される。
3.その名前が上記の規則によって分解されない場合には、その名前はデフォルトユーザ変数コレクションにおいて分解される。
これらの規則を例示するために、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.
}
仕様セット内の名前の分解(上記の規則)では、そのセットのセレクタが、名前分解が要求される時点で使用可能にされることが要求される。これは、試験条件グループが、セレクタを指定することによって1つのTestにおいて参照されることになるという事実によって強要されるであろう。
[仕様セットのためのC++]
上記の規則を用いるとき、仕様セットは、C++ SpecificationSetクラスによって実装されることができる。SpecificationSetクラスは基本的には、UserVarsクラスと同じAPIを有するが、セレクタのための余分なストリングパラメータがあることが異なる。したがって、このAPIは詳細には説明されない。
全ての名前付き仕様セットは、その名前の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ブロックは、多数のレベル項目から構成されることが好ましく、各レベル項目は1つのピン又はピングループのためのパラメータを指定する。各レベル項目は多数の資源パラメータを指定することができる。これらのレベル値の設定のための実行時の意味は以下の通りである。
Levelsブロックのレベル項目は宣言された順序で処理される。2つ以上のレベル項目において生じるピンがあれば、何度でも処理されることになる。ただ1つのパラメータのための値の多数の仕様は、指定された順序で保持され、適用されるべきである。
1つのレベル項目内の資源パラメータは、それらが指定された順序で処理される。
次のレベルグループをセットする前に、Delayステートメントによって、レベルをセットするプロセスが概ね指示された持続時間だけ中断する。実際の待ち時間は、指定された遅延を中心にして、小システムによって規定される範囲内にあることができる。したがって、遅延がt秒であった場合には、実際の遅延は以下の式を満たすであろう。
t - Δt <= actual-wait <= t + Δt
Delayステートメントは、Levels指定を多数のサブシーケンスに分割し、各サブシーケンスは、処理するための別個のTest Condition Memory設定を必要とするであろう。
次のレベルグループをセットする前に、MinDelayステートメントによって、レベルをセットするプロセスが少なくとも指定された持続時間だけ中断する。実際の待ち時間は、小システムによって規定される範囲内にあり、指定された最小遅延の最小値を有することができる。したがって、最小遅延がt秒であった場合には、実際の遅延は以下の式を満たすであろう。
t <= actual-wait <= t + Δt
MinDelayステートメントは、Levels指定を多数のサブシーケンスに分割し、各サブシーケンスは、処理するための別個のTest Condition Memory設定を必要とするであろう。
各ピン又はピングループ名はピン記述ファイル(接尾部.pin)内の厳密に1つの資源において指定され、それゆえ、資源ファイル(接尾部.rsc)において指定される、ある1組の実用的な資源パラメータを有する。名前を付けられる全てのパラメータはこの1組の実用的な資源パラメータの中からもたらされるべきであり、それらの値をセットするために用いられる式と同じ基本タイプを有するべきである。資源パラメータの名前及びタイプについての情報は資源ファイルからもたらされる。
資源ファイルResource.rscは暗黙のうちにインポートされ、テスタにdpin及びdpsのような標準的な資源のパラメータのための名前及びタイプを与える。
資源パラメータは、UserVarsを用いることができる式、及び名前付きの仕様セット又は現時点で見ることができるローカル仕様セットからの値を割り当てられる。
dpsピン資源は、特殊なパラメータPRE_WAIT及びPOST_WAITを有する。PRE_WAITパラメータは、電源ピンがその目標電圧に達する時刻から、パターン生成を開始することができる時刻まで経過するのにかかる時間を指定する。POST_WAITパラメータは、パターン生成が停止した時刻から、電源ピンが遮断する時刻まで経過するのにかかる時間を指定する。
またdpsピンは、電圧パラメータがその最終値に如何に達するかも指定する。それらのピンは、全ての他のピンパラメータのように、単に1つの式によって電圧パラメータを指定することができる。その場合、その値は、ハードウエアがそれを可能にするときに、達成されるであろう。またそれらのピンは、Slewステートメントを用いて、それを指定することもできる。Slewステートメントは、電源電圧が、指定された絶対Voltage Slew Rateを有する傾斜で、その初期値から最終値に達することを指定する。
[LevelsのためのC++]
上記の規則を用いて、以下の演算をサポートするC++ Levelsオブジェクトを書くことができる。
・以下の演算が行われる。
Status setParameter(const String& pinOrPinGroupName,
const String& parameterName,
ElementaryType elementaryType,
const Expression& Expression);
この演算は、1つの式を、1つのピン又はピングループのパラメータに結び付ける。たとえば、dpin.InPins VIH値は以下の式によってセットされる。
setParameter ("InPins", "VIH", VoltageT,
Expression("v_ih + 1.0");
この演算は、Levelsオブジェクト内の全ての宣言のために何度もコールされるであろう。
・以下の演算が行われ、その演算は、先に説明されたように、全ての所定のモジュールレベルインターフェースをくまなく調べて、発行し、パラメータの全てのレベルを、指定された順序で割り当てるであろう。セレクタパラメータを用いて、先に指定された規則に従って、それらの式内の名前が分解される。
Status assignLevels(const String& selector);
[試験条件グループ]
試験条件グループ部分言語は、仕様、タイミング及びレベルの記述を一緒にパッケージ化する。Timingオブジェクトは多くの場合に、複数のパラメータを用いて指定される。複数のパラメータを複数のタイミングにおいて用いて、種々のパルスの前縁及び後縁を指定することができる。同様に、Levelsは種々の電圧レベルの最大値、最小値及び典型値を指定することによりパラメータ化することができる。試験条件グループ(TCG)オブジェクトは、仕様と、これらの仕様に基づくTimings及びLevelsのインスタンシエーションとを一纏めにする。
TestConditionGroup宣言はオプションのSpecificationSetを含む。SpecificationSet宣言には、インライン化された(そして名前付きでない)ローカルSpecificationSetを用いることができるか、又は他の場所で宣言された名前付きSpecificationSetへの参照を用いることができる。TCG宣言内のオプションのSpecificationSet宣言には、少なくとも1つのLevels又はTimings宣言が続く。それは、複数のLevel及び複数のTimingの両方を任意の順序で有することができる。しかしながら、それは、2つ以上のLevels及びTimings宣言を有することは許されない。これらの制約は構文的に強制される。
TCG内の仕様セット宣言は、それが名前を持たないことを除いて、別個に宣言される仕様セットと同じである。その名前は暗黙のうちに、取り囲んでいるTCGの名前になる。Timings宣言は、指定されたタイミングファイルからのTimingsオブジェクトのただ1つの宣言を含む。ここに示されるのは、試験条件グループを有するファイルの一例である。
# ---------------------------------------------------------
# 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;
}
上記の例では、試験条件グループTCG1は、「min」、「typ」及び「max」の名前を付けられた3つのセレクタを有する仕様セットを記述する。任意の数の別個のセレクタが存在することができる。仕様セットの本体内で、それらのセレクタに対応する3個1組の値で、変数v_il、v_ih、t_le及びt_teが初期化される。したがって、上記の例では、セレクタ「min」を有するTCG1のインスタンスが、変数v_ilを第1の数値と結合するであろう(vInputLow+0.0)。再び、1つの仕様セットのための複数のセレクタがユーザによって定義され、任意の数のセレクタが許される。唯一の要件は以下の通りである。
1つの仕様セットのセレクタは固有の識別子である。
その仕様セットにおいて指定される各値は、その1組のセレクタと厳密に同じ数の要素を有する値のアレイに関連付けられる。i番目のセレクタを選ぶことにより、各値が、それらの値の関連するベクトルのi番目の値に結び付けられるであろう。
TCG内の仕様セットに続いて、Levels宣言又はTimings宣言、あるいはその両方が存在することができる。Levels宣言を用いて、種々のピンパラメータのためのレベルがセットされる。仕様セットにおいて特定される変数を用いて、これらのレベルがセットされることになり、それにより、TCGを初期化するために用いられるセレクタに基づいて、ピンパラメータのための種々の実際の値を動的に結合できるようになる。
これを例示するために、セレクタ「min」を使用可能にするTestを考える。ページ上に与えられる仕様セットCHIP3Levelsを参照すると、InPinsグループ内のピンのためのピンパラメータ「VIH」は、以下の宣言によって式(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;
}
しかしながら、1つのTCG内に2つ以上のTimings及び2つ以上のLevelsが存在すべきでないことに留意されたい。したがって、要約すると、Timings又はLevelsの少なくとも一方が存在すべきであり、且つ多くてもそれぞれの1つが存在すべきである。
[試験条件]
TestConditionオブジェクトは1つのTCGを特定のセレクタに結び付ける。一旦、TCGが先に示されるように宣言されたなら、以下に示されるように、TestConditionオブジェクトを宣言することができる。
TestCondition TCMin
{
TestConditionGroup = TCG1;
Selector = min;
}
TestCondition TCTyp .
{
TestConditionGroup = TCG1;
Selector = typ;
}
TestCondition TCMax
{
TestConditionGroup = TCG1;
Selector = max;
}
これらのTest Conditionは、以下のように、1つの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;
}
[TCG(試験条件グループ)内の名前分解]
試験条件グループ内の名前の分解は先に説明された。しかしながら、これらの規則が繰返し述べられ、再び以下に与えられる。
1.その名前が修飾されている場合には(ページを参照されたい)、その名前は、名前付きユーザ変数コレクションにおいて分解されなければならない。
2.その名前が修飾されていない場合には、その名前は、その名前が試験条件グループにおいて宣言される場合にはローカル仕様セットにおいて、それが試験条件グループにおいて参照される場合には名前付き仕様セットにおいて分解される。
3.その名前が上記の規則によって分解されない場合には、その名前はデフォルトユーザ変数コレクションにおいて分解される。
[TCGランタイム]
試験条件グループは以下の実行時の意味を有する。
Test(FunctionalTest等)は、インスタンス化されたTestConditionを用いて、そのSpecificationSetからの特定のセレクタを有するTCGを参照するであろう。このセレクタは、SpecificationSet内の各変数を、選択されたセレクタに関連付けられる値に結び付けるであろう。その後、変数とそれらの値とのこの結び付きを用いて、Levels及びTimingsが判定されるであろう。
TestConditionGroup内のパラメータLevelsは、Levelsブロックの提示順に、順番にセットされることが好ましい。したがって、CHIP3Levelsブロックでは、パラメータレベルがセットされることになる順序は以下の通りである(表記法:<resource-name>.<resource-parameter>)。
・InputPins.VIL
・InputPins.VIH
・OutputPins.VIL
・OutputPins.VIH
・Clock.VOL
・Clock.VOH
このようなシーケンシングの順序によって、試験ライタは、電源の明示的なパワーシーケンシングを制御できるようになる。さらに、1つのレベル項目が2回生じ、1つのピンのために同じピンパラメータの名前を付ける場合には、そのピンパラメータは2回セットされるようになる。これは、プログラムによって生じることもできる。
1つのパラメータが以下のようなSlewステートメントによってセットされる場合には、それは、VCCが、毎秒±0.01ボルトの電圧スルーレートの傾斜で、その現在の値から2.0ボルトの最終値に達することを意味する。
VCC = Slew(0.01,2.0 V);
仕様セット変数はTCG内のTimingsオブジェクトにも渡すことができる。その後、Timingsオブジェクトは、選択された変数に基づいて初期化されるであろう。そのような仕組みを用いて、たとえば、波形の前縁及び後縁を指定することにより、Timingsオブジェクトをカスタマイズすることができる。
[TCGのためのC++]
上記の規則を用いて、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クラスはビン、すなわち、数多くのDUTを試験した結果を要約するカウンタのコレクションを定義する。1つのDUTを試験する過程において、そのDUTは、たとえば特定の試験の結果を指示するために、任意のビンにセットされることができる。試験が進められるとき、そのDUTは別のビンにセットされることができる。DUTが最終的にセットされるビンは、その試験の終了時の最後のそのような設定である。この最終的なビンのためのカウンタは、このDUTの試験の終了時にインクリメントされる。ビン定義を有する別個のファイルは接尾部.bdefsを有するべきある。
ビン定義は階層的であることが好ましい。たとえば、最も外側にあるレベルでは、Pass及びFailと名前を付けられる2つのビンを有する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がXのリファインメントである場合には、BinGroupXは、ベースビンのグループであると言われる。したがって、BinGroup SoftBinsは複数のHardBinsのリファインメントであるので、BinGroup HardBinsはベースビンのグループである。複数のSoftBinsのビンはリーフビンと呼ばれる。他のBinGroupがYのリファインメントでない場合には、BinGroupYは、リーフビンのグループであると言われる。
その中にただ1つのBinGroupZを有するBinDefsブロックの悪化した事例は、最も基本的な複数のベースビンのグループ、ならびにリーフビンのグループであるようなZを有するであろう。BinGroup名は、その範囲がグローバルである。任意の数のBinDefsブロックが存在することができるが、宣言された複数のBinGroupsは識別できなければならない。1つのBinDefsブロックからのBinGroupは、別のBinDefsブロックからのBinGroupのリファインメントであることを許される。したがって、上記の例では、複数のSoftBinsは、複数のHardBinsからの別個のBinDefsブロック内に存在することができる。しかしながら、読みやすくするために、全てのBinGroupsが定義されているただ1つのBinDefsブロックを有することが強く推奨される。
ここで、合格したDUTの数及び不合格のDUTの数をカウントするために、別の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のリファインメントであり、リーフビンのグループである。上記の例は、その階層内に3つの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宣言は、このセクションにおいて、継続的な例として用いられるであろう。
1つのBinGroup内の各ビンは、
1.識別子又はストリングリテラルのいずれかである名前と、
2.このビンが何を要約するかを記述する記述と、
3.このビンがリファインメントBinGroup内にある場合には、それがリファインメントであり、ベースビンとしても知られているビンの名前とを有する。
複数のPassFailBin内の2つのビンは「Pass」及び「Fail」と名前を付けられる。複数のHardBin内の5つのビンは、「3GHzPass」、「2.8GHzPass」、「3GHzFail」、「2.8GHzFail」、「LeakageFail」と名前を付けられる。ビン名は、リテラルストリング、又は識別子にすることができる。ビン名は1つのBinGroup内で固有でなければならないが、複数のBinGroupにわたって繰り返されることができる。しかしながら、BinGroup名は、範囲がグローバルであり、1つの試験計画にわたって固有でなければならない。
5つのHardBinのうち、ビン「3GHzPass」及び「2.8GHzPass」はいずれも、PassFailBinの「Pass」ビンにマッピングする。複数のHardBinのうちの残りはPassFailBinのうちの「Fail」ビンにマッピングする。
最後に、8つのSoftBinが存在する。SBFT(ソフトビン機能試験)及びCacheの場合の3GHzにおける2つの不合格は「3GHzFail」HardBinにマッピングする。同様に、SBFT及びCacheの場合の2.8GHzにおける2つの不合格は「2.8GHzFail」HardBinにマッピングする。Leakageに起因する不合格はいずれも、それらが生じた速度にかかわらず、同じ「LeakageFail」HardBinにマッピングする。たとえば、最も粗い(最も外側のレベルでの)試験は、1つのDUTが試験に合格するか、不合格であるかである。たとえば、リファインメントは、そのDUTが特定の周波数、たとえば3GHz等で、試験に合格するか、不合格であるかである。
ビンは以下に述べるようにTest Plan FlowItem内のDUTに割り当てられる。TestPlan FlowItemはResult Clauseを有し、その中で、試験計画は、1つの試験を実施することから特定の結果が戻される結果として行われるべき動作及び遷移を記述する。この時点で、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ステートメントは、1つのDUTにおける試験を実行している過程において実行することができる。その試験が最終的に完了するとき、ランタイムは、そのDUTのためにセットされた最終的なビン、及び全てのそのリファインメントのためのカウンタをインクリメントするであろう。その試験の過程において実行される以下のSetBinステートメントを有するDUTについて考える。
SetBin SoftBins."3GHzSBFTFaiI";
SetBin SoftBins."2.8GHzAllPass";
このDUTは3GHz Cache及びLeakage試験に合格したが、SBFT試験には不合格であったので、「3GHzSBFTFail」ビンに割り当てられる。その後、2.8GHzにおいて試験され、全ての試験に合格した。したがって、最終的なビン割当ては、「2.8GHzAllPass」ビンに対してなされ、それは、1組のSoftBinの中にある。この最終的な割当ては、以下のビンのカウンタをインクリメントするであろう。
1.複数のSoftBin「2.8GHzAllPass」
2.複数のHardBinのリファインメント「2.8GHzPass」
3.複数のPassFailBinのリファインメント「Pass」
その試験が完了するとき、ランタイムは、DUTの最終的なビン割当て、及びそれがリファインメントである全ての他のビンのためのカウンタをインクリメントするであろう。
SetBinステートメントはリーフビンにおいてのみ許される。ベースビンをセットすることは違法である。上記のカウンタインクリメントの意味は、以下のことを仮定する。
1.ビンがリーフビンである場合には、それは、1つのDUTの試験の終了時にこのビンのためにSetBinステートメントが実行された回数である。
2.ビンがベースビンである場合には、それは、それがリファインメントであるビンのカウンタの和である。
こうして、上記の例では、1つのSetBinステートメントにおいて、SoftBinだけが許される。複数のHardBin「LeakageFail」のためのカウンタは、複数のSoftBin「3GHzLeakageFail」及び複数のSoftBin「2.8GHzLeakageFail」のためのカウンタの和である。以下はビン定義に関するいくつかの規則である。
1.BinDefinitions宣言はいくつかのBinGroup宣言から構成される。
2.各BinGroup宣言は、名前と、それがリファインメントであるオプションのBinGroup名と、それに続くビン宣言のブロックとを有する。
各BinGroup宣言は、名前と、それがリファインメントであるオプションのBinGroup名と、それに続くビン宣言のブロックとを有する。
3.ビン宣言は、名前と、それに続く記述と、オプションでそれに続く、このビンがリファインメントであるベースビンの名前とを含む。
4.ビン名はストリングリテラル又はIdにすることができる。空ストリングは有効なビン名にすべきではない。ビン名は、BinGroup宣言内の名前の中で固有であるべきであるが、他のBinGroup宣言において同じ名前を用いることができる。
5.BinGroup宣言Xxxが別のBinGroup宣言Yyyのリファインメントである場合には、Xxx内の全てのビン宣言は、Yyyからのベースビンの名前を宣言しなければならない。したがって、複数のSoftBinは複数のHardBinのリファインメントであることを宣言されるので、複数のSoftBin内の各ビン宣言は複数のHardBinのビンのリファインメントである。
6.PassFailBinのような、別のBinGroup宣言のリファインメントでないBinGroup宣言は、ベースビンを宣言しないBin宣言を有することが好ましい。
ビンBbbは、Bbbがそのリファインメントである完全な1組のビンである1組のベースを有する。正式には以下のように定義される。
1.AaaがBbbのベースビンである場合には、AaaはBbbの1組のベース内にある。
2.Aaaの任意のベースもBbbの1組のベース内にある。
BinGroup名は1つのTestPlanにおいてグローバルである。
ビン名は1つのBinGroupに対してローカルである。
SetBinステートメントはリーフビンの場合にのみ許される。
[ビン定義のためのC++]
上記の規則を用いて、1つのオブジェクトタイプBinGroupを、BinDefs宣言内のBinGroup宣言毎に構成することができる。クラスBinGroupはサブクラスLeafBinGroupを有するであろう。これらの2つのクラスの演算は同じであるが、BinGroup::incrementBinがC++保護演算であるのに対して、LeafBinGroup::incrementBinがC++公開演算であることを除く。
以下は、他のどのBinGroupのリファインメントでもないBinGroup又はLeafBinGroupを構築するデフォルトコンストラクタである。
以下のコンストラクタは、所与のベースBinGroupのリファインメントであるBinGroupを構築する。
BinGroup(BinGroup& baseBinGroup);
LeafBinGroup(BinGroup& baseBinGroup);
以下のメソッドは1つのビン及びその記述を定義する。
Status addBin(const String& binName,
const String& description,
const String& baseBinName);
それが最も基本的なベースビンである場合には、ベースBinNameパラメータは空ストリングでなければならない。
ビンカウンタをインクリメントするためのメソッド。
Status incrementBin(const String&binName);
この演算は、このビン、及びこのビンのベースである全てのビンのためのカウンタをインクリメントするであろう。その演算はクラスBinGroupにおいて保護され、クラスLeafBinGroupにおいて公開される。
ビンカウンタをリセットするためのメソッド。
Status resetBin(const String&binName);
この演算は、このビン、及びこのビンのベースである全てのビンのためのカウンタをリセットするであろう。
1つのビンについての情報をゲットするためのメソッド。
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宣言毎に1つの、多数のBinGroupメンバを含むであろう。上記のBinDefinitionのためのC++は以下のようになるであろう。
// 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");
...
1つのTestPlanのための状態は、未定義のBinGroup(NULL)に初期化されるm_pCurrentBinGroupと未定義のビン名(空ストリング)に初期化されるm_currentBinとを含む。SetBinステートメントが実行される度に、1つのコールによって、m_pCurrentBinGroupが指示された名前付きBinGroupに変更され、m_currentBinがグループ内の名前付きビンに変更される。
// Translation of: SetBin SoftBins."3GHzAllPass";
pTestPlan->setBin("SoftBins", "3GHzAllPass");
試験計画が実行を完了するとき、その試験計画は以下をコールして、このビン及び全てのそのベースビンのカウンタがインクリメントされるようにする。
m_pCurrentBinGroup->incrementBin(m_currentBin);
BinGroupカウンタは、試験計画がエラボレートされるときにリセットされるが、試験が実行される度に再初期化されない。カウンタは、BinGroup::resetBinへの明示的なコールによってリセットすることができる。
[C.試験計画]
試験計画は、試験プログラムの主要構造と考えることができる。試験計画はファイルをインポートし、類似のコンストラクツインラインを定義することができる。こうして、いくつかのグローバルの定義を与えられたファイルをインポートし、付加的なグローバルズインラインを宣言することができる。
[C1.Test Plan Flow及びFlowItem]
試験計画の重要な要素のうちの1つはFlowである。Flowは、有限状態機械をカプセル化する。それはいくつかのFlowItemを含み、それらのFlowItemはIFlowableオブジェクトを実行し、その後、別のフロー項目に遷移する。IFlowableを実行することは、IFlowableインターフェースをインプリメントするオブジェクトを実行することを含む。IFlowableインターフェースをインプリメントする一般的なオブジェクトはTest及びFlowそのものである。
こうして、1つのFlowは、Test及び他のFlowを実行し、その後、別のFlowItemへの遷移を実行するFlowItemを有する。それは、1つの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の演算は以下の通りである。
1.FlowItem FlowTest1_Minを実行することで開始する。
2.FlowTest1_Minは機能試験、MyFunctionalTest1Minを実行する。この試験の詳細は、後に完全な試験計画が提示されるときに与えられる。
3.この試験を実行することから、9つの結果、0、1、2、5、6、7、−6、−5又は−4が予想される。最初の2つのResult句はそれぞれ0及び1を処理し、第3の句は結果値の残り全てを処理する。
4.結果「0」(合格)が生じる場合には、FlowTest1_MinはカウンタPassCounterをインクリメントするであろう。その後、それは新たなFlowItem FlowTest1_Typに遷移するであろう。
5.結果「1」又は結果「2」が生じる場合には、FlowTest1_MinはカウンタFailCounterをインクリメントし、そのフローから戻るであろう。
6.FlowTest1_Typは同じようにして動作し、成功時にFlowTest1_Maxをコールするであろう。
7.FlowTest1_Maxは同じようにして動作し、成功時に、成功した結果(「0」)でFlowTest1から戻るであろう。
こうして、FlowTest1は、実行の成功時に、Test1の最小、典型及び最大バージョンを通してデバイスを動かし、その後、戻るであろう。FlowTest2も同じようにして動作するであろう。
上記のようなFlowは基本的には、状態及び遷移を有する有限状態機械を記述する。FlowItemは基本的には状態であり、それは以下のことを果たすであろう。
1.1つのIFlowableを実行する(それは、以前に定義されたFlow、又はTest、又は上記の規則によってC++においてインプリメントされることができるユーザ定義のFlowを用いることができる)。
2.IFlowableの実行は数値結果を返す。その結果に基づいて、ある特定の動作が行われ(いくつかのカウンタを更新する)、その後、2つの事柄のうちの1つが起こる。
a.Flowは数値結果にとともにコール元に戻る。
b.Flowは、別の状態(FlowItem)に遷移することにより継続する。
こうして、1つのFlowItemは以下のコンポーネントを有する。
・1つのFlowItemは1つの名前を有する。
・1つのFlowItemは実行されるべき1つのFlowableを有する。
・1つのFlowItemは数又はResult句を有する。
・1つのFlowItemの各Result句は動作を提供し、1つの遷移で終了し、1つ又は複数の結果値に関連付けられる。
これらの項目は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、又はFlowのいずれかにすることができる。1つの結果のための動作は、以下に記載される動作のうちの任意のものにすることができる。
・GUIツールによって用いられるストリング値を有する実体を属性結果にセットするためのプロパティ動作。これは上記のFlowTest1の例において見ることができる。
Property PassFail = "Pass";
プロパティは基本的には、1つの結果句に関連付けられる名前付きストリング又は整数値を有する実体である。任意の数のプロパティが存在することができ、プロパティは、この結果に関連する情報を表示するためにユーザが用いることになる、GUIのようなツールによって用いられることが好ましい。プロパティは、試験の実際の結果、すなわち試験のフローに影響を及ぼさない。
いくつかの数のカウンタをインクリメントするためのカウンタ動作。これは上記の例において見ることができる。
IncrementCounters PassCount;
・任意の、又はユーザルーチンをコールするためのルーチンコール動作。これは後に説明される。
最後に、FlowItemは、別のFlowItemに制御を渡すためのGoToステートメント、又はコール元(コール処理フロー、又は試験計画を開始したシステムルーチンのいずれか)に制御を戻すためのReturnステートメントのいずれかにすることができる遷移を有する。
[予め定義されたFlow]
Flowオブジェクトの典型的な使用法は、Testのシーケンスを定義することである。その後、このシーケンスは、試験計画サーバ(TPS)において生じるイベント、すなわちExecute Test Planイベントの結果として実行される。各サイトコントローラ上にある試験計画サーバが、ユーザの試験計画を実行する。しかしながら、Flowオブジェクトは、他のイベントに応答しても実行される。括弧内の名前は、Flowをこれらのイベントに割り当てる際に用いられる名前である。
1.System Load Flow(SysLoadFlow)。このFlowは、1つの試験計画が1つ又は複数のサイトコントローラにロードされるときに、システムコントローラ上で実行される。それは、任意のサイトコントローラ上に試験計画を実際にロードする前に実行される。このフローによって、試験計画開発者は、システムコントローラを起源とすべきである動作を定義できるようになる。そのような動作は、パターンファイルのブロードキャストロード、較正動作等を含む。
2.Site Load Flow(SiteLoadFlow)。このFlowは、1つの試験計画がサイト上にロードされ、初期化された後に、サイトコントローラ上で実行される。これにより、任意のサイト特有の初期化を行うことができる。
3.Lot Start/End Flow(LotStartFlow/LotEndFlow)。これらのFlowは、試験計画サーバが新たなロットの開始を通知されるときに、サイトコントローラ上で実行される。これは典型的には、データログストリームにロット特有の情報で注釈を付すために製造環境において用いられる。
4.DUT Change Flow(DutChangeFlow)。このFlowは、そのDUT情報が変化するときに、サイトコントローラ上で実行される。再び、これは典型的には、アナログストリームを更新するために製造環境において用いられる。
5.TestPlan Start/End Flow(TestPlanStartFlow/TestPlanEndFlow)。これらのFlowは、試験計画サーバが、現在のTest Flowを実行し始めるように指示されるとき、及びそのフローがその実行を終了するときに、サイトコントローラ上で実行される。
6.Test Start/End Flow(TestStartFlow/TestEndFlow)。これらのFlowは、Test Flowが新たなTestを実行し始めているとき、及びそのTestがその実行を終了するときに、サイトコントローラ上で実行される。
7.Test Flow(TestFlow)。このFlowは、試験計画サーバが「Execute Test Plan」メッセージを受信するときに実行される主要Flowオブジェクトであることに留意されたい。
ユーザが、TestFlowでないか、又は他の所定のフローのうちの1つでない、ユーザの試験計画内の1つのFlowを定義する場合には、それを実行させるための好ましい方法は、これらの所定のフローのうちの1つの遷移状態内にそれを含むことであることに留意されたい。
[試験計画例]
以下の例では、フローによってインプリメントされる有限状態機械を記述するコメントとともにFlowが与えられる。その有限状態機械は、遷移行列として与えられる。その行列の行はFlowItemに対応し、列は結果に対応する。その行列の1つの行のエントリは、返された結果が列において指定された値であるときに、その行のFlowItemから遷移されるFlowItemを指示する。
3つのフロー、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;
上記の試験計画は、好ましい順序で以下のように構成される。
1.最初に、バージョン番号が与えられる。この番号を用いて、コンパイラバージョンの互換性が確保される。
2.その後、多数のインポートが宣言される。これらは、その試験計画において用いられる名前を分解するために必要とされる宣言を有する種々のファイルである。
3.次に、試験計画名が宣言され、その後、試験計画のインライン宣言を行う。
4.次に、1組のPListDefsが宣言される。これらは、名前付きファイルからGlobalPListsの名前を付ける、ファイル修飾付きの名前を含む。それらは、パターンリスト変数も含む。パターンリスト変数は、実行時にcustom flowableにおいて初期化されることができる変数である。それらは、ランタイムまで、試験と実際のパターンリストとの結合を遅らせる手段を提供する。
5.次に、1組のUserVarsが宣言される。これらはストリングを含む。
6.その後、合格した試験及び不合格の試験の数を判定するために、いくつかのカウンタが宣言される。カウンタは変数に過ぎず、初期化されて0になり、IncrementCounterステートメントにおいてインクリメントされる。それらは、1つのDUTの試験の終了時に現在セットされているビンだけがインクリメントされるという意味を有する、先に説明されたBinとは異なる。
7.次に、一連のTest Conditionが宣言される。これらはそれぞれ、Test Condition Group及びセレクタを指定する。この例では、Test Condition Groupは、mytestconditionsgroup.tcgからもたらされる。しかしながら、それらは試験計画においてインラインにすることができる。
8.次に、一連のFlowable又はTestが宣言される。これは、パターンリスト及び試験条件を選択する既知のTest FunctionalTestである。こうして、たとえば、MyFunctionalTest1Maxは、試験条件TC1Max及びパターンリストを選択する。
9.この後に、3つのフロー、FlowTest1、FlowTest2及びFlowMainが宣言される。FlowはFlowableを実行する。Flowableは、Test(MyFunctionalTest1Max等)及び他のフロー(FlowTest1及びFlowTest2等)を含む。FlowTest1及びFlowTest2はそれぞれ、Test1及びTest2の最小、典型及び最大バージョンを通る。フローFlowMainは、先に宣言されているフロー、FlowTest1及びFlowTest2をコールする。
10.最後に、TestFlowイベントがFlowMain Flowに割り当てられる。したがって、フローFlowMainは、ユーザがこの計画を実行しようするときに、この試験計画によって実行されることになるフローである。
[FlowのためのC++]
上記の規則を用いて、Flowそのものを除いて、要素の大部分のためのC++インプリメンテーションを果たすことができる。
[FlowItemのためのC++]
FlowItemを表すためのC++クラスは以下のインターフェースを有することができる。
・このFlowItemのために実行されることになるIFlowableをセットすることになる演算。
StatussetFlowable(IFlowable* pIFlowable);
一旦、このIFlowableを実行するための必要とされる1組のコールからFlowItemが戻ったなら、それは、Result値に応じて、カウンタのリストをインクリメントする必要がある。これを果たすために、FlowItemは、インクリメントされることになるカウンタのベクトルを有する必要がある。これは以下のコールによって初期化される。
Status setCounterRefs(unsigned int result,
CounterRefList counterRefs) ;
これをコールすることにより、カウンタへの参照のベクトルがFlowItem内に設定され、結果として、一旦、IFlowableが実行を完了したなら、それはそれらのカウンタをインクリメントできるようになる。たとえば、ステートメントIncrementCounters A,B,Cは、以下のように上記のコールを用いることが好ましいであろう。
// 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()をコールして、カウンタリストが設定される。その後、これを用いて、結果値2及び3のために更新されることになるカウンタアドレスのベクトルが設定される。
その後、FlowItemは、特定の結果において別のFlowItemに遷移する必要があり得る。
Status setTransition(unsigned int result, Flowltem*pFlowItem);
ある特定のResult句が多数の結果値を取り扱う場合には、必然的にいくつかのそのようなコールが行われる必要があり得る。
FlowItemは結果を返す必要があり得る。これは以下のコールによって果たされる。
Status setRetumResult(unsigned int result,
unsigned int returnResult);
たとえば、以前の例におけるFlowItem FirstFlowItemの場合、上記のコールは、「result」の場合には値「2」で、「returnResult」の場合には「1」でコールされるであろう。
・最後に、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」を実行し、その後、それを設定して、結果毎にカウンタの適当なリストをインクリメントし、最後に、必要な動作を行う。結果「0」の場合の必要な動作は、FlowMain_1への遷移であり、結果「1」の場合には、リターンである。
[C2.TestPlanにおけるカウンタサポート]
カウンタは0に初期化される変数であり、試験実行中の種々の時点において、IncrementCounterステートメントによってインクリメントされることができる。これは、試験の終了時にのみインクリメントされるBinとは異なる。さらに、ビンは階層的であるのに対して、カウンタは変数に過ぎない。したがって、カウンタはビンよりもはるかに簡単であり、より制限されたファシリティである。
カウンタは、符号なし整数である1組の名前付きカウンタを保持するCounterクラスのメンバを介して、TestPlanにおいてサポートされることができる。Counter宣言を介して、このクラスにおいてオブジェクトが定義されるであろう。カウンタは試験開始時に自動的にリセットされないので、TestPlanが、数多くのDUTを試験し終えるまでカウントを収集できるようになる。カウンタの値をリセット、インクリメント及び問い合わせるためのメソッドが与えられるであろう。これにより、順番にビンに入れることに対する代替の手段が、試験を実行する結果としてのカウントを判定できるようになる。
TestPlanはメンバ変数、m_modifiedCountersを含むことが好ましく、そのメンバ変数は、1つのDUTにおいて試験を実行することによって変更される1組のカウンタである。この1組のカウンタは試験の開始時に空集合に初期化される。各場所において、IncrementCountersコールが行われ、コードが生成されて、名前付きカウンタをm_modifiedCounterメンバに追加するであろう。こうして、このメンバは、1つのDUTで試験を実行中に変更された全てのカウンタを集める。
[FlowオブジェクトのためのC++]
一旦、全てのFlowItemが作成されたなら、Flowオブジェクトは、以下に示されるように、C++オブジェクトとして作成されることができる。
・FlowItemを追加するための演算。
Status addFlowItem(FlowItem* pFlowItem, bool isInitalFlowItem);
その演算は、指示されたFlowItemをそのFlowに追加するであろう。これがFlowの初期FlowItemである場合には、ブーリアンが真にセットされる。
・Flowを実行するための演算。
Status executeFlow(unsigned int& result);
これは、そのフローを実行する結果として、Flowが戻るときに戻ることが好ましい。この動作は、初期FlowItemでそのフローを実行し始めることである。それは、現在のFlowItemが実行すべき次のFlowItemを返す限り、FlowItemを実行し続けるであろう。現在のFlowItemが結果を返すとき、この演算は、その結果で完了する。
それゆえ、1つのFlowのために生成されるC++コードは、そのFlowにFlowItemを追加するために、addFlowItem()へのコールを何度か繰り返す。executeFlow()演算は、TestPlan内のこのFlowが実行するために選択されるときに生じるであろう。
[C3.Testクラス]
一般に、プログラムコードの大部分はデバイス試験のためのデータであり、残りは、試験方法を実現する試験プログラムのコードである。このデータはDUTに依存する(たとえば、電源条件、信号電圧条件、タイミング条件等)。試験コードは、ATEハードウエアに指定されたデバイス条件をロードするためのメソッドと、ユーザによって指定された目的(データロギング等)を実現するために必要とされるメソッドから構成される。
先に説明されたように、試験コードの再利用性を高めるために、そのようなコードは任意のデバイス固有データ(たとえば、ピン名、刺激データ等)、又はデバイス試験固有のデータ(たとえば、DCユニットのための条件、測定ピン、ターゲットピンの数、パターファイルの名前、パターンプログラムのアドレス等)とは無関係であるべきである。1つの試験のためのコードがこれらのタイプのデータとコンパイルされる場合には、その試験コードの再利用性は低下するであろう。それゆえ、任意のデバイス固有のデータ又はデバイス試験固有のデータは、コード実行時の入力として、その試験コードが外部から入手できるようにすべきである。
オープンアーキテクチャ試験システムでは、ITestインターフェースの1つのインプリメンテーションであるTestクラスが、特定のタイプの試験のための試験データとコードとの分離を(それゆえ、コードの再利用性を)実現する。そのような試験クラスは、それの別個のインスタンスのための「テンプレート」と見なすことができ、デバイス固有のデータ及び/又はデバイス試験固有のデータに基づいてのみ互いとは異なる。試験クラスは、試験計画ファイルにおいて指定される。各試験クラスは典型的には、ある特定のタイプのデバイス試験又はデバイス試験のための設定をインプリメントする。たとえば、機能的なAC及びDCパラメータ試験は、別個の試験クラスによってインプリメントされることが好ましい。しかしながら、カスタム試験クラスも試験計画において用いることができる。
試験クラスによって、ユーザは、その試験の特定のインスタンスのためのオプションを指定するために用いられるパラメータを与えることにより、クラス挙動を構成できるようになる。たとえば、1つの機能試験は、パラメータPリスト及びTestConditionsを取り込み、実行すべきパターンリスト、ならびにその試験のためのレベル及びタイミング条件をそれぞれ指定するであろう。これらのパラメータのために異なる値を指定することにより(試験計画記述ファイル内の異なる「Test」ブロックを用いることによる)、ユーザは、1つの機能試験の種々のインスタンスを作成できるようになる。図5は、ただ1つの試験クラス504から異なる試験インスタンス502が如何に導出されることになるかを示す。
これらの試験クラスは、コンパイラ400が試験及び試験のパラメータの記述を試験計画ファイルから取り込み、正確なC++コードを生成できるようになり、そのC++コードがコンパイル及びリンクされて、試験プログラムを生成することができるように設計されるべきである。試験クラスインスタンスを、試験フローを記述するオブジェクトに追加して、デバイス試験の複雑な実行シーケンスを作成することができる。
[C4.ITest及びIFlowableからの導出]
先に述べられたように、試験クラスはITestから派生する。上記の規則を用いて、これらは、ITestインターフェースをインプリメントするC++クラスにおいてインプリメントされることができる。ITestインターフェースのための指定されるメソッドに加えて、これらのクラスは、デバイス試験の特定のクラスを実行するために必要とされるTest固有のインテリジェンス及びロジックを提供する。また試験クラスはIFlowableインターフェースもインプリメントする。この結果として、Testクラスのインスタンスは、試験を実行するためにFlowItemにおいて用いることができる。
[カスタマイゼーション]
ユーザがC関数をコールできるようにし、ITest及びIFlowableインターフェースをインプリメントする自らのクラスを開発できるようにするために、カスタマイゼーションの仕組みが提供される。
[プリヘッダ]
TPLは、試験システムにおいて試験クラスを定義するための汎用の仕組みを提供する。試験技師はこの仕組みを用いて、付加的なファシリティを用いることなく、試験システムによってロードされ、且つ使用されることができるカスタム試験クラスを作成することができる。試験技師は、上記のITest及びIFlowableインターフェースをインプリメントする自らの試験クラスを開発することもできる。プリヘッダは、C++言語に対してイントロスペクション能力を与えることにより、カスタム試験クラスの機能をサポートする。
1つの試験クラスのオブジェクトが、そのメソッド及びシグネチャに関して問合せを受けることができる場合には、そのオブジェクトは、生成されるソースコード内に包含するのに適したパラメータが入手できることを検証されることができる。そのような特徴は、翻訳段階における誤り検査及び妥当性検査のために極めて有用であろう。試験技師がパラメータの名前、又はこれらのパラメータへの引き数の数(又はおそらくタイプ)を間違った場合には、C++コンパイラからのコンパイル時エラーメッセージを待つ代わりに、翻訳段階において、この間違いが見つけられて、翻訳時に意味のあるエラーメッセージを生成することができる。
イントロスペクションは、オブジェクトに自らの内部を探索し、その属性及びメソッドに関する情報を返すように求める能力を指している。Javaのようないくつかの言語は、その言語の一部としてこの能力を提供する。ビジュアルベーシックのような他の言語は、それとともに用いられることになるオブジェクトにそのような要件を課す。C++は、この機能を提供しない。
一実施形態では、プリヘッダのイントロスペクション能力は、デフォルトパラメータ値、及びオプションのパラメータの指示を提供するためにも有用である。さらに、この能力が試験クラスのインプリメンテーションの一部として提供される場合には、グラフィカルユーザインターフェース(GUI)アプリケーションがこの情報を用いて、ダイアログ及び他のユーザインターフェース要素を動的に構築して、試験技師がこれらのクラスを有効に利用するのを助けることもできる。別の実施形態では、試験クラス開発者は、ただ1つ(試験クラス当たり)のテキストベースソースファイルにおいて、開発者がその試験クラスをパラメータ化するために必要とされるものとして指示した、試験クラスの公開の方法/属性を指定することができる。
ただ1つのソースが好ましいことに留意されたい。つまり、1つのファイル内に1つの試験クラスのパラメータ化インターフェースの記述と、別の個別の(ヘッダ)ファイル内にC++インターフェース記述とを有し、その後、両方のソースを同期させておくための要求を負担することは望ましくない。このような目的で、プリヘッダファイル内に試験クラスの「テキスト系」の記述が埋め込まれ、それがイントロスペクションのために、且つその試験クラスのためのC++ヘッダを生成するためにコンパイラによって用いられる。生成されたC++ヘッダファイルは、試験クラスC++コードを最終的にコンパイルするために用いられるファイルである。
C++においてヘッダを用いることはよく知られている。しかしながら、C++言語はパースし、解釈するのが難しいので、本発明の一実施形態は、TPLコンパイラによってコンパイルされて、C++ヘッダファイルを作成するプリヘッダファイルを定義し、その後、それがC++コンパイラによって用いられて、試験プログラムが作成される。この実施形態によれば、試験クラス開発者はプリヘッダファイルを書き、それにより、対応する試験クラス又は他の試験エンティティ内に視覚化できるようにする。
以下の例は、本発明の好ましい実施形態による、1つの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
[パラメータ化された試験クラスのためのC++]
コンパイラがプリヘッダファイルを処理するとき、コンパイラは、$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試験クラスのための宣言の妥当性を検査し、そのためのソースコードを生成し、その試験クラスのためのC++ヘッダファイルを生成できるようになる。
一例として、便宜上、以下に再現される、先に与えられたFunctionalTest宣言について考える。
Test FunctionalTestFuncTest1
{
PListParam = patList1; # Previously defined pattern list
TestConditionParam = TC1;
TestConditionParam = TC2;
}
コンパイラは、C++ヘッダファイルの宣言に従って、上記のFunctionalTest構成体のための以下のソースコードを生成する。
FunctionalTest FuncTest1;
FuncTest1.setName ("FuncTest1");
FuncTest1.setPatternTree(&patList1);
FuncTest1.addTestCondition(&TC1);
FuncTest1 .addTestCondition(&TC2);
Description関数のために生成される名前にも留意されたい。Xxxと名前を付けられる各パラメータは以下のメンバ関数に関連し、それは、GUIが用いることができるツールチップのための記述を有するストリングを返す。
Status getXxxDescription() const;
[他のプリヘッダの特徴]
プリヘッダは、付加的なタイプとして、いくつかの他のユーザ定義列挙法をサポートする。これにより、GUIは、ある特定のパラメータの値をセットするために用いることができる、取り得る選択肢のドロップダウンリストを提供できるようになる。さらに、プリヘッダは、テーブルと考えることができる多数のパラメータを関連付けるための機能を提供する。たとえば、プリヘッダは、「プロパティ」のアレイを、関連する1組の、名前のためのストリングのアレイ、及び値のための整数のアレイとしてインプリメントするのに都合良く用いることができる。この機能をインプリメントする1つの簡単な方法は、カスタムタイプ(後に説明される)のアレイを用いることである。一実施形態では、この機能は、カスタムタイプのアレイを使用することによって実施される。この機能は、以下の例において示される。
# --------------------------------------------------------
# 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と同じ効果を達成し得る。上に提示された技法は、カスタムタイプを宣言する必要性を避けるための一方法である。
図13は、本発明の一実施形態による試験プログラムを開発するための方法を示す。その方法は、試験プログラム言語(TPL)において試験計画ファイル1302を記述する。その場合、試験計画ファイルは試験プログラムの少なくとも1つの試験を記述する。その方法は、システムプログラム言語(SPL)において試験クラスファイル1306も記述し、またTPLにおいて試験クラスファイルの対応するプリヘッダファイル1304も記述する。その場合に、試験クラスファイルは、試験プログラムの少なくとも1つの試験のインプリメンテーションを記述する。このインプリメンテーションの例では、SPLはC/C++プログラム言語である。C++プログラム言語の代わりに、他のシステムプログラム言語を用いることもできることは当業者には理解されよう。TPLにおいて試験計画ファイルを記述する利点のうちの1つは、それを問題領域に近づけることができることであることに留意されたい。TPLは、システムプログラミングの負荷及び複雑さを試験計画開発者から切り離す。
本発明の一実施形態によれば、プリヘッダファイルは以下の宣言を有する。
・他のTPLファイルの場合のようなオプションのインポート。
・試験クラスの名前。
・このクラスのインプリメンテーションのためのDLLを指定する、オプションのTestClass DLLキーワード。
・公開ベースのオプションリスト。
・この試験クラスのパラメータを指定するパラメータセクション。
・試験クラスのためのインライン化されたテンプレートを提供するテンプレートセクション。
プリヘッダファイルのパラメータセクションは、試験クラスファイル1306のためのパラメータを指定し、それによりユーザ定義の試験を作成するために試験クラス開発者によって用いられる。これらは、インスタンスに関してユーザが指定することができる試験クラスファイルのメンバであり、それゆえ、ユーザが試験作業を細かく制御できるようにする。たとえば、試験クラス開発者はユーザ定義のパラメータTraceLevelを宣言することができ、それは、試験が実行されるときにverbose又はterseのようなトレーシングのレベルを制御するためにユーザによって指定される場合がある。
1つの試験クラスファイルのパラメータセクション内で、3つのタイプのエンティティを宣言することができる。
・Enumキーワードを用いる列挙。Enumキーワードは、試験クラス列挙タイプを定義するために用いられることに留意されたい。その際、試験クラスファイルは、この列挙タイプのパラメータを有することができる。これは、パラメータのために許される値のドロップダウンリストを構成するために、GUIが用いることもできる。
・パラメータタイプを指定する、Integer、Plist等のキーワードを用いるパラメータ。ただし、そのタイプは有効なTPLタイプである。
・ParamGroupキーワードを用いるパラメータのグループ。ParamGourpキーワードは、C++クラスのような、多数の異なるパラメータを1つのグループとして収集するために用いられる。
試験クラスファイルの個々のパラメータはパラメータセクションにおいて宣言することができる。パラメータ宣言は、パラメータのタイプ、その名前、及びパラメータの種々の特性を宣言する構文を有する。以下は1組のパラメータの一例である。
・Cardinality:これは、サポートされるこのタイプのパラメータの数を示す。
・Attribute:このタイプのパラメータ値(複数可)を格納するために用いられるC++変数の名前。
・SetFunction:このパラメータのための値をセットするために用いるための関数の特性。関数に続くオプションのキーワード「[implement]」は、クラスヘッダのインラインメソッドとして利用することができる($ParamFunctionImplementationによって指示される場所に挿入される)。そうでない場合には、ユーザが、その関数のインプリメンテーションを提供する責任がある。
・Description:ストリングリテラルが、たとえばパラメータのランタイム変更中にヘルプを提供するためにGUIによってツールチップとして用いられることができる。Fooと名前を付けられたパラメータのためのカスタムクラスにおいて生成されるC++メンバ関数は「OFC:StringgetFooDescription()const」である。この関数は、指定されたストリングを返す。
・GUIType:このオプションのキーワードは、この試験クラスのインスタンスのためにXML記述子が生成されるときに、GUIに渡されるべきストリングを指定する。それにより、GUIは、特別な方法でこのパラメータ値を表示できるようになる。
プリヘッダのテンプレートセクションは、ヘッダファイル1312に挿入されることになるソースコードを指定する。それは、試験クラス開発者が、この試験クラスファイルのために生成されるC++ヘッダを直に制御できるようにする。テンプレートセクションは、キーワードCPlusPlusBeginとCPlusPlusEndとの間に配置される。それは、種々の宣言のための場所を指定する、種々の置換指示子を用いる($ImportDeclaration、$ClassName、$ParamArrayType、$ParamFunctionDeclaration、$ParamAttribute、$ParamFunctionImplementation等)。
その方法は、TPLコンパイラ1308を用いて、試験計画ファイル1302及びプリヘッダファイル1304をコンパイルする。TPLコンパイラは試験計画ファイル1302をコンパイルして、C++言語において記述される導出試験計画ファイル1310を構成する。TPLコンパイラは、試験計画ファイルをコンパイルしながら、少なくとも2つの重要な関数を実行する。第一に、それは試験計画ファイルをTPL記述からSPL記述に翻訳する。第二に、それはプリヘッダファイルを用いて、試験計画ファイルの妥当性を検査する。詳細には、それは試験計画ファイル内の意味的なエラーを検査する。さらに、それは試験エンティティの属性を検査する。それは、試験エンティティの属性が宣言され、試験計画ファイル又はプリヘッダファイル内に存在することを確実にする。さらに、それは、試験計画の関数コール及びその対応するパラメータを検査する。それは、試験計画ファイルの関数コールが試験クラスインプリメンテーション内に存在すること、及び関数コールのパラメータが定義されることを確実にする。
同様に、TPLコンパイラ1308は、プリヘッダファイル1304をコンパイルして、C++言語において記述されるヘッダファイル1312を構成する。TPLコンパイラ1308はヘッダファイル1312に、プリヘッダファイル1304のパラメータセクションにおいて記述されるパラメータを挿入する。さらに、TPLコンパイラ1308は、ヘッダファイル1312に、プリヘッダファイル1304のテンプレートセクションにおいて参照されるソースコードを挿入する。ヘッダファイル1312は、2つの目的を果たす。第一に、それは、試験クラスオブジェクトファイル1316を生成するためにSPLコンパイラ1314によって用いられる。第二に、それは、試験計画オブジェクトファイル1318を生成するために、SPLコンパイラ1314によって参照される。
最後に、試験クラスオブジェクトファイル1316及び試験計画オブジェクトファイルは、リンカー1320によってリンクされて、試験プログラム1322の実行可能試験計画DLLファイル(TPL.DLL)及び実行可能試験クラスDLLファイル(TCL.DLL)が生成される。
[C5.カスタム関数宣言]
これにより、フロー遷移が行われるときに、ユーザはカスタム関数をコールできるようになる。カスタム関数は、以下のように、プリヘッダを通して宣言される。
# --------------------------------------------------------
# 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++インプリメンテーションに対して責任を持つ。上記の関数は全て、おそらく、暗示的な第1のパラメータとしてITestPlanポインタを取り込むことに留意されたい。このポインタは、関数ライタがTestPlan内の状態Sにアクセスできるようにする。たとえば、関数ライタは、現在の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();
[カスタム関数宣言のためのC++]
上記の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);
}
これらの関数は1つのフローからコールすることができるであろう。
[C6.カスタム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インターフェースをインプリメントするいくつかのクラスが存在する。これらは以下のものを含む。
1.現在のテスタ構成内で試験計画を実行することができるか否かを検査することになるプログラムローディングのためのFlow。
2.特定のパターン及びパターンリストをロードすることになるパターンローディングのためのFlow。
3.ハードウエア及びソフトウエアを既知の状態にし、グローバル変数をロードし、他の初期化及び妥当性検査機能を実施することになる初期化のためのFlow。
4.他の一般的に有用な試験フロー。
[C7.カスタムタイプ]
先のTestクラスパラメータ化に関する説明は、既知のタイプ、すなわち基本タイプ並びにPLists及びTestConditionsのようなテスタ定義のタイプを有するような試験クラスパラメータの場合のみ許される。ユーザの自由度を高めるために、タイプ拡張性を与え、それにより、複数のタイプ(コンパイラには事前にはわかっていない)を作成し、使用できるようにすることが重要である。カスタムタイプ(CT)はCustom Typeにおいて定義されるであろう。これらのカスタムタイプを用いて、C言語ストラクトに対応するタイプ(Plain Old Dataタイプ、すなわちPODとも呼ばれ、C++の同じ名前のものとは大きく異なる)及び関数シグネチャのためのC言語タイプ定義に対応するタイプを定義することができる。ユーザタイプを含む別個のファイルは拡張子.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;
}
[カスタムタイプのためのC++]
先に提示された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において定義されるCTを用いることを望むものと仮定する。
# File MyTesetCTs.ctyp
Version 1.0;

CustomTypes
{
Pod Foo
{
String name;
PList patternList;
}

Pod Bar
{
Foo someFoo;
Double dVal;
}
RoutineBinaryOp(Integer, Integer) return Integer;
}
上記のタイプを用いるためにユーザがする必要がある全てのことが、ユーザの試験クラスプリヘッダにおいて上記のファイルをインポートされる。コンパイラが、そのように定義されたCTを解釈するので、コンパイラが試験クラスプリヘッダを処理しているときに、Foo及びBarのための定義を入手することができる。さらに、コンパイラは、上記のタイプFoo及びBarにそれぞれ対応する2つのC言語ストラクト、すなわちストラクト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 .
[カスタムタイプを用いるカスタム試験クラスのためのC++]
最後に、一旦コンパイラがこのプリヘッダファイルを処理したなら、コンパイラは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
[C8.パラメータ化]
先に示されたように、Testクラス、カスタムFlowableクラス、又はカスタム関数定義のためのプリヘッダは、パラメータ化仕様セクションを通して、クラス/関数へのイントロスペクションを制限する。コンパイラはこのセクションを用いて、クラス/関数のためのパラメータ化インターフェースを生成する(そして、クラス/関数ヘッダそのものを生成する)。Testクラス及びFlowableクラスの場合、コンパイラはまた、このセクションを用いて、Test Planコード内のコールを後に生成し、そのクラスのインスタンスを初期化する。プリヘッダ及び対応する宣言に関する以下の点に留意されたい。
1.全てのTest又はカスタムFlowableクラス定義は、プリヘッダ内で指定されることが好ましい。プリヘッダ内のParametersブロックは、そのようなクラスのためのパラメータリストを指定することができる唯一の場所であることが好ましい(したがって、結果として、パターンリスト及び試験条件仕様のようなTestのための「標準的な」パラメータも、プリヘッダのParametersブロックに含まれる必要がある;これにより、全てのパラメータ、標準及びCTが一様に処理されるようになる)。
2.Test又はFlowableクラスのためのプリヘッダにおいて非オプションとして定義される(すなわち、0以外の基数を有する)全てのパラメータが、そのクラスのインスタンスのためのTestブロック又はFlowableブロック宣言の中で初期化されるべきである。
3.Test/Flowableブロックにおいてパラメータの初期化のために用いられるオブジェクトは予め定義されているべきである。
4.置換指示子$Class、$Inc、$ParamAryTypes、$ParamFns、$ParamAttrs及び$ParamImplsが、ユーザが対応する生成されたコードを生成されたクラスヘッダファイル内に挿入させるつもりである、プリヘッダのユーザコードセクション内の正確な場所に現われなければならない。置換指示子毎に特定のコードが生成されるので、これらの置換指示子は厳密に一度だけ現われるべきである。
5.プリヘッダのParametersブロック内のパラメータ仕様の名前(上記の例のPListParam、TestConditionParam又はBarParamのような)は、そのクラスのインスタンスの宣言において用いられることになるパラメータの名前である。
6.以下はパラメータ仕様において用いられる記述子の意味である。
a.Cardinality:これはサポートされることになるこのタイプのパラメータの数を指示する。以下は一実施形態において取り得る値である。
i.1:このパラメータは強制的であり、厳密に一度だけ指定されるべきである。このパラメータは、パラメータのタイプのオブジェクトへのポインタとして保持されるであろう。
ii.0−1:このパラメータはオプションである。指定される場合には、それは一度だけ指定されなければならない。このパラメータは、パラメータのタイプのオブジェクトへのポインタとして保持されるであろう。
iii.1−n:このパラメータは強制的である。さらに、このパラメータのために多数の値を指定することができる。この値は指定された順序で記憶されるであろう。
iv.0−n:このパラメータはオプションである。このパラメータのために多数の値を指定することができる。この値は指定された順序で記憶されるであろう。
上記の()及び()の場合に、全ての指定された値が、パラメータのタイプへのポインタ上でテンプレート化される、STLベクトル<>に記憶されることになることに留意されたい。このベクトルのタイプは定義され、$ParamAryTypesによって指示される場所に挿入されるであろう。これらのタイプ定義のためのアクセスレベルは常に公開である。
b.Attribute:このタイプのパラメータ値(複数可)のための記憶として用いるためのC++変数の名前。その名前は、C++クラスの私用データメンバとして全く同じ語で再現されることになり、C++識別子のための要件に準拠しなければならない。この属性のタイプに関して、以下のことに留意されたい。
i.ただ1つの値だけが許される場合には、そのパラメータのタイプへのポインタである。
ii.多数の値が許される場合には、そのパラメータのタイプへのポインタ上にテンプレート化されるSTLベクトル<>である(上記の()を参照)。
それらの属性はTest Planによって作成され、ポピュレートされるオブジェクトへの参照を保持し、これらのオブジェクトを所有しないことに留意されたい。オブジェクトの寿命は常に、Test Planそのものによって管理される。
c.SetFunction:このパラメータのための値をセットするために用いるための関数の名前。以下の点に留意されたい。
i.その名前は全く同じ語で再現されることになり、それゆえ、C++言語要件に準拠しなければならない。
ii.その関数のアクセスレベルは常に公開である。
iii.リターンタイプは常に空である。
iv.その関数は常に、タイプポインタ/パラメータタイプのただ1つの引き数をとる。
1つの値が常に1つずつセットされる;すなわち、多数の値を指定できるようにするパラメータの場合に、Test Plan内の生成されたコードが、指定された値毎に一度、この関数を繰返しコールし、各値がSTLベクトル(先に説明されたような)に追加されることになることに留意されたい。
関数名に続くオプションのキーワード[インプリメント]は、この関数のための普通のインプリメンテーションが、クラスヘッダ($ParamImplsによって指示される場所において挿入される)においてインラインメソッドとして利用できるようになることを指示する。そうでない場合には、ユーザがその関数のインプリメンテーションを提供する役割を担う。
d.Description:このパラメータのランタイム変更中にヘルプを提供するために、GUIツールによって用いられることになるツールチップであるストリングリテラル。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;
}
}
}
上記のコードにおいて、以下の点について留意されたい。
1.ここでPListDefsセクションは、いくつかのPList名とともに、いくつかのPList変数も有する。PList名は、試験において直に用いることができる名前である。PList変数は試験において用いることができる変数であり、その値は、ランタイムにおいて、カスタム化されたFlowable内のコードによって実際のPListに結び付けられる。
2.PListDefsセクションはオプションである。存在しない場合には、その内容は種々のTest宣言からコンパイラによって推測されるであろう。存在する場合には、それは、用いられるTestのPListパラメータの全てを宣言しなければならないが、それはさらに多くのパラメータを宣言することもできる。
3.値をPList変数に割り当てるために、ランタイムAPIを利用できるであろう。TestPlanクラスは以下の関数を有するであろう。そのFlowableはPListVariableを特定のPListに結び付けるためにその関数を用いることができるであろう。
Status SetPListVariable(const Tester::String& varName,
const Tester: :String& fileQualifiedPListName);
4.別のFlowableに制御を渡すことか、リターンかのいずれかである遷移の直前に、FlowItemにおいてユーザ関数及び関数をコールすることができる。
[ユーザ関数コールのためのC++]
複数のフローにおいてカスタム関数コールを呼び出すことを除いて、コンパイラによって生成されることになる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()をコールし、その自らのフロー項目名、及び現在の結果の値を渡すであろう。これにより、上記のコードが実行されることになり、必要とされるユーザ定義関数が呼び出される。
[C9.試験プログラムコンパイル]
先に説明されたように、Test Plan記述ファイルは、1つの試験計画において用いられる複数のオブジェクトと、それらの互いに対する関係とを指定する。一実施形態では、このファイルはC++コードに翻訳され、それは、標準インターフェースITestPlanのインプリメンテーションの形でサイトコントローラにおいて実行されることになる。このコードは、サイトコントローラ上にロードされることができるウインドウズ・ダイナミックリンクライブラリ(DLL)にパッケージ化されることができる。Test Program DLLは、サイトコントローラソフトウエアが試験計画オブジェクトを生成し、それが含む試験計画オブジェクトを返すために用いることができる標準的な既知のエントリポイントを有するように生成される。
[試験計画記述からの構成]
1つの試験計画記述からITestPlanのインプリメンテーションへの変換のプロセスは、試験プログラムコンパイラ400によって達成される。このプロセスは2段階、すなわち翻訳及びコンパイルにおいて行われる。
翻訳段階402では、コンパイラ400は試験計画ファイル(及びそれがインポートする種々の他のファイル)と、試験計画において用いられる全ての試験タイプのためのプリヘッダとを処理する。この段階では、コンパイラ400は、MSVC++(マイクロソフト・ビジュアルC++)ワークスペース及びプロジェクトファイル、DLL「ボイラープレート」コード等の全ての他のサポート用ファイルとともに、Test PlanオブジェクトのためのC++コード、及び出合った試験タイプのためのC++ヘッダを作成する。コンパイラ400は、生成されたコードにファイル及び行指示文を挿入し、コンパイル時エラーメッセージが、生成されたコードの中を指示する代わりに、記述ファイル内の適当な場所に戻って参照できるようにする。
コンパイラが必要なファイルを作成した後に行われるコンパイル段階では、MSVC++コンパイラのような標準的なコンパイラ404が呼び出され、ファイルをコンパイルし、それらのファイルをDLLにリンクする。
コンパイラは、入力として、有効な試験計画ファイル(及び全ての関連するファイル)を取り込み、必要に応じて、試験計画ファイル内の「インポート」指示文によって表される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」を指定し、DLLを構築する。エラー及び/又は警告があれば、ユーザに対して示されるであろう。
Test Planを構築した後に、ユーザがTiming1.timに変更を加えた場合には、ユーザはコンパイラを呼び出し、コンパイラにMyTestPlan.tplを渡す。コンパイラは(タイムスタンプ情報によって)メイン試験計画ファイルが変更されていないことを認めるので、MyTestPlan.h/.cppは作成し直されないであろう。しかしながら、メイン試験計画ファイルを処理している間に、Timing.timファイルが変更されていることがわかるであろう。それゆえ、コンパイラはTiming1.cppファイルを作成し直し、MSVC++アプリケーションを呼び出し、DLLを構築し直すであろう。これにより、MyTestPlan.cppをコンパイルし直すのが避けられ、Timing1.cppのみがコンパイルされ、DDLがリンクし直される。この手法は、コンパイルするのにかなりの時間を要する大きな試験計画の場合に、コンパイル及びリンクし直す時間を切り詰める際に特に有用であろう。
[D.試験プログラムの実行]
サイトコントローラソフトウエアは、その処理空間内にTest Program DLLをロードし、DLL内の「ファクトリ」関数をコールして、Test Planオブジェクトのインスタンスを作成する。一旦Test Planオブジェクトが作成されたなら、サイトコントローラソフトウエアは、その試験計画を実行するか、又は必要とされる任意の他の方法で試験計画とやりとりすることができる。
[非インタラクティブビルド]
ウインドウズ環境の大部分のC++ソフトウエア開発者にとってアプリケーション(又はDLL、ライブラリ等)を構築することは、開発環境(MSビジュアルC++、ボーランドC++等)を構築し、コードを編集し、そして(多くの場合に)ボタンを押してプロダクトを構築することを意味する。
本発明の1つの実施形態の試験環境は、類似の1組の機能を有するであろう。Test Plan開発者は、コードを編集し、それらのTest Planを構築する必要があるであろう。しかしながら、テスタは、結果として生成されるTest Plan DLLを生成するために、Test Plan開発者がC++開発環境を構築することを要求しないであろう。
これを果たすために、本発明は非インタラクティブビルドの概念を利用する。非インタラクティブビルドは、非インタラクティブモードにおいてMSビジュアルC++を用いるビルドと定義される。この場合でも依然として、他のツールがインタラクティブに用いられ、そのようなビルドを管理できるようになることに留意されたい。唯一意味することは、ビジュアルC++が非インタラクティブに用いられることである。
[想定される環境]
ユーザの環境について、ある特定の想定がなされる。それらの想定は以下の通りである。
1.Test Plan開発者は、上記の方法及び規則に従って、自らのTest Planを開発しているであろう。
2.Test Plan開発者はC++の熟練者レベルの知識を持たない場合もある。
3.Test Plan開発者は、ファイル(複数可)をTest Plan DLLに変換するために、コマンドラインツール又はGUIツールを利用できるであろう。
[ボタンを使用しないアプリケーションの構築]
MSビジュアルスタジオで非インタラクティブに作業するには、2つの手法のうちの1つが必要になる。第1の(そして最も簡単な)手法はコマンドラインインターフェースを用いることである。第2の(そしてより自由度のある)手法は自動インターフェースを用いることである。このセクションは両方の手法を説明する。
[プロジェクトの作成]
ビジュアルスタジオを非インタラクティブに使用するために、1つ又は複数の有効なプロジェクトを含むワーキングソリューションで開始すべきである。残念なことに、これは、コマンドライン手法又は自動手法のいずれからも達成することができないタスクである。いずれの方法もプロジェクト作成のための仕組みを提供しない。しかしながら、ビジュアルスタジオのためのプロジェクト及びソリューションはテンプレートから作成することができる。それゆえ、プロジェクト名及びテンプレートを与えて開始することにより、ビジュアルスタジオのためのソリューション/プロジェクトを作成することができる。
[プロジェクトのポピュレーション]
コマンドラインがサポートしないので、生成されたプロジェクトに新たなファイルを追加するために、ビジュアルスタジオ自動モデルが用いられる。プロジェクトに新たなファイル及び既存のファイルを追加するために、2つのビジュアルスタジオマクロが提供される。ActiveScriptエンジン(VBScript、JScript、ActivePerl、ActivePython等のような)を用いて同じタスクを実行するために、外部スクリプトが類似のコードを用いることができる。それゆえ、本発明のコード生成ツールは新たなファイルを作成し、自動モデルを用いて、それらのファイルを既存のビジュアルスタジオプロジェクトに追加することができる。ファイルが作成された後に、それらのファイルは、必要に応じて、ツールによって更新することができる。
[プロジェクトの構築]
一旦、適当なソリューション及びプロジェクトが得られたなら、ビジュアルスタジオを非インタラクティブに用いて、Test Planを構築することに対していくつかのオプションがある。最も単純なオプションは、コマンドラインからそれを呼び出すことである。そのようなコマンドラインは以下のようになるであろう。
devenv solutionFile /build solutionCfg
ただし、solutionFileはビジュアルスタジオソリューションファイルであり、solutionCfgは、そのソリューション内のプロジェクトに適用することができる特定の構成である。別のソリューションは、自動のためのビジュアルスタジオオブジェクトモデルを用いることである。これにより、そのビルド及び構成プロセスを、さらに細かく制御できるようになる。上記のように、それは、コマンドラインからプロジェクトを構築するために、Perlスクリプトのリストを含む。このプログラムは、構築するためのプロジェクト及び構成を指定する構成ファイル(及びそれらのプロジェクトについての他の情報)を読み出し、自動モデルを用いてそれらを全て構築する。1つのスクリプトにおいて自動オブジェクトを用いる方法を例示するために、このスクリプトにおける$msdevオブジェクトの使用を考える。
[デバッガサポート]
Testクラスの開発者がその作業を検査し、デバックするために、サイトコントローラ内でブレークし、そのコードの中を逐次的に進むことができるようにするデバッガを利用する必要がある。コンパイラによって生成されるコードはMSVC++によってコンパイルされるC++であるので、MSVC++デバッガを用いて、Testクラスインプリメンテーションがデバッグされる。この特徴は、C++において直に作業するTestクラス開発者等だけを対象にしていることに留意されたい。生成されたC++コードを直に参照することなくTestプログラムの動作をデバッグするか、又は逐次的に進めることを望む試験技師に対して他の仕組みが提供されるであろう。
[システムソフトウエア環境]
このセクションは、テスタのための一般的なソフトウエア環境、すなわちユーザ試験計画によって必要とされるファイルのための場所、そのようなファイルのための代替の場所を指定するための仕組み、ならびに試験計画及びモジュール制御ソフトウエアの場所を指定するための方法を説明する。
[試験計画によって必要とされる環境]
システムの標準的な場所、及び1つの試験計画によって必要とされる
1.パターンリスト
2.パターン
3.タイミングデータ
4.試験クラスDLL、のための探索経路のランタイム構成を、環境構成ファイルによって指定されるような、「環境」変数によって構成することができる。これらはテキストファイルであり、以下のような単純な構文を用いる。
Tester_PATOBJ_PATH = "patterns\data;D:\projects\SC23\patterns\data"
ネイティブOSによってサポートされる環境変数を用いる代わりに、テキストファイルにおいて、そのような「環境」を定義する利点は、そのインプリメンテーションが後に、OSによってサポートされる環境変数が最大ストリング長を有する等の共通の制約によって制限されないことである。以下の「環境」(設定)変数は、先に記載されたエンティティのために用いられるであろう。
・パターンリスト:Tester_PATLIST_PATH
・パターンオブジェクトファイル:Tester_PATOBJ_PATH
・パターンソースファイル:Tester_PATSRC_PATH(これはオプションである;以下を参照)
・Timingデータファイル:Tester_TIMING_PATH
・TestクラスDLL:Tester_TEST_CLASS_LIBPATH
特殊な事例をサポートするために、有用なデフォルト挙動を保持しながら、3つの構成レベルが提供される。これは、優先順位が高くなる順に説明される。
第一に、システム環境設定ファイル、
$Tester_INSTALLATIONROOT\cfg\setups\Setup.envが、「環境」変数のデフォルト値を指定するであろう。他の構成の仕組みが利用できない場合には、このファイルが必要とされるであろう。一般的に、それは、システム上で実行される全ての試験計画の場合に利用可能であろう。このファイルはインストール中にインストール及び構成管理(ICM)システムによって作成され、インストーラからの入力が先に述べられた3つの変数のためのデフォルト値を割り当てる(上記の3つの変数のためのシステムデフォルトに加えて、このファイルは、以下のサブセクションにおいて説明されるような、ある特定の他のテスタ「環境」変数のためのシステムデフォルトも含むことに留意されたい)。
第二に、環境設定ファイルを、試験計画に対するランタイム引き数としてユーザが指定することができる。このランタイム構成の変数は、デフォルト定義よりも高い優先順位を取るであろう。
最後に、試験計画が特殊なブロックを用いて、その実行時に用いられることになる環境変数を指定することができる。試験計画において定義される変数は、デフォルトシステムファイル又はユーザ定義ファイル内の変数よりも高い優先順位を取るであろう。
一般的に、全ての必要な変数は、上記の仕組みのうちの1つを通して定義されるべきである。変数が定義されない場合には、ランタイムエラーが生じることになる。
[他の環境設定]
ユーザ試験計画によって必要とされる「環境」変数に加えて、試験環境によって、以下の2つの「環境」変数が必要とされる。
1.Tester_TEST_PLAN_LIBPATH:これは、ロードされるべきであるユーザ試験計画DLLを見つけるためにシステムコントローラが用いることになる探索経路を指定する。ユーザピン記述及びソケットファイルを見つけるためにも同じ探索経路が用いられることに留意されたい。ICMへのインストール時間中に指定される、この変数のためのデフォルト値は、ICMによって、ファイル$Tester_INSTALLATION_ROOT\cfg\setups\Setup.envに格納される。
2.Tester_MODULE_LIBPATH:これは、ベンダ提供ハードウエアモジュール制御ソフトウエアDLLをロードするためにシステムが用いることになる探索経路を指定する。構成管理データベース(CMD)から引き出されるこの情報も、ICMによってファイル$Tester_INSTALLATION_ROOT\cfg\setups\Setup.envに格納される。
ユーザはTester_TEST_PLAN_LIBPATH変数のためのSetup.envファイル内に与えられる値を無効にすることができるが、ユーザがベンダ提供ハードウエアモジュール制御ソフトウエアDLLのための探索経路を明示的に変更することを望まない限り、Tester_MODULE_LIBPATHのためのSetup.envファイル内に与えられる値は変更されるべきでないことに留意されたい。
[探索経路指定の意味]
探索経路を指定する「環境」変数について以下の点に留意されたい。
1.各変数は、ある特定のタイプの参照されるファイルを見つけるためにシステムが探索することになるディレクトリ名の、セミコロン(「;」)によって分離されたリストにすべきである。
2.システムがそのような「環境」変数の値を最初に調べた後に、その値に対してユーザによって行われた任意の変更(たとえば、環境構成ファイルを編集することによる)は、それを行うための必要性をユーザが明示的にシステムに「通知する」ときにのみ、システムによって登録されるであろう。
3.テスタが正常に動作する環境のような分散環境内の「カレントワーキングディレクトリ」(CWD)の表記法は、ユーザが直観的に予想するものではないかもしれないので、CWDに対する経路が曖昧な結果に繋がる可能性があるとき、探索経路内の相対経路名は、関連する環境変数(ルートを定義する機能を提供する)の特定の設定に関連するように解釈されるであろう。探索経路内の全ての相対経路名が基づくことになると想定されるルートを指示する、この関連する環境変数は、「Tester_INSTALLATION_ROOT」変数であり、それはユーザのシステムへのテスタインストールのトップレベル(すなわち「ルート」)ディレクトリの場所を与える。
4.ディレクトリエントリは集合[V:?<>|;]内の文字を含むことができない。セミコロン(「;」)を除いて、この集合内の全ての他の文字はウインドウズファイル名において違法であることに留意されたい。セミコロン(「;」)は探索経路内のエントリを区切るために用いられるので、セミコロンは探索経路エントリにおいて用いられるべきでない。経路名には空白を埋め込むことができるが、経路名の直前及び直後に生じる(すなわち、経路名内の空白でない最初の文字の前及び最後の文字の後の)全ての空白は経路名の一部であるとは見なされず、全て無視されるであろうことに留意されたい。
5.探索経路ディレクトリは、定義の中に現われた順序に探索されるであろう。最初に現われたファイルが選択されるであろう。
[E.試験パターン]
非常に大きな1組の試験パターンファイルの効率的な管理、取り扱い及びローディングは、本発明の1つの実施形態のフレームワークのアーキテクチャに関する重要な側面である。階層的なパターンリストの概念は、扱いやすい概念化を提供し、エンドユーザがシステムを使いやすくする際の効率的な手段であると見なされる。
DUTへの刺激は、試験ベクトルを通して試験システムが入手できるようになる。ベクトルは一般的に、シーケンシャル(又は線形)、スキャンあるいはアルゴリズムパターン発生器(APG)導出として分類することができる。本発明の1つの実施形態のシステムでは、試験ベクトルは、試験時にDUTに加えられるパターンの観点から編成される。パターンは、ユーザの試験プログラム内のパターンオブジェクトによって表される。そのシステムでは、パターンは、パターンリストオブジェクトによってプログラムに基づいて表されるパターンリストとして編成される。パターンリストオブジェクトは、パターンの順序付きリスト又は他のパターンリストを表す。その順序は、リストコンポーネントの宣言の順序で暗示される。ただ1つのパターンしか必要とされない場合には、そのパターンはそれだけでリスト内にカプセル化される必要があることに留意されたい。
ユーザの試験プログラム内のパターンリストオブジェクトは、ディスク上のパターンリストファイルに関連付けられ、そのファイルはパターンリストの実際の定義を含む。こうして、パターンリストの内容は、関連するディスクファイルの内容によって動的に判定される(これについては後にさらに説明されるであろう)。
パターンリストの定義は、そのパターンリストのための明示的な名前を与え、ファイル名の連想を通して、パターンの順序付きリスト及び/又は他のパターンリストを特定する。それは、実行オプションの仕様も提供し、それらのオプションはパターンリスト及びパターンの両方に適用されることができるので、パターンオブジェクトが説明された後にさらに詳細に説明されるであろう。パターンリストは以下の規則に従うべきである。
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
以下は、先に用いられた未定義の非終端記号の記述である。
1.version-identifier:集合[0−9]からの1つ又は複数の文字からなる文字列であり、最初の文字は数字でなければならない。
2.name:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列であり、最初の文字は[a−zA−Z_]から選択されなければならない。
3.pattern-list-name:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列であり、最初の文字は[a−zA−Z_]から選択されなければならない。
4.file-name:有効なウインドウズファイル名(ファイル名内に任意の空白が含まれる場合には、それは二重引用符で囲まれなければならない)。これは単純なファイル名でなければならない、すなわちディレクトリコンポーネントを持つべきでないことに留意されたい。pattern-list-referenceは、同じファイル内のパターンリストを内部参照することができるか、又は別のファイル内のパターンリストを外部参照することができる。外部参照はファイル名によって修飾される必要がある。
5.oprion-name:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列であり、最初の文字は[a−zA−Z_]から選択されなければならない。
6.option-parameter:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列。
パターンリストファイルはコメントをサポートし、コメントはパターンリストファイルパーサによって無視されなければならない。コメントは「#」文字で開始し、その行の終わりまで続く。
[E1.パターンリストのための規則]
パターンリストのための静的規則又はコンパイル時の規則は宣言及び名前の分解を規定する。パターンリスト言語内の名前は、global-pattern-list-definition及びlocal-pattern-list-definitionによって宣言される。それらの名前は、pattern-list-referenceによって参照される。以下は、これらの宣言及び参照を規定するいくつかの規則である。
1.global-pattern-list-definition又はlocal-pattern-list-definitionはパターンリストの名前を宣言する。pattern-list-referenceは、宣言されたパターンリストの名前を参照する。グローバルパターンリストの名前はグローバルに知られている。ローカルパターンリストの名前は、それらの宣言されたリストブロック内でのみ知られている。それらの名前は、修飾を用いることなく、そのリストブロック内で直に参照されることができる。さらに深くネストされた宣言では、ローカルパターンリストは、修飾された名前によって参照される必要があるであろう。
2.ローカルパターンリスト名は、包含パターンリストの範囲内で知られており、グローバルパターンリスト名はシステムの範囲内で知られている。たとえば、以下を参照されたい。
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
}
3.グローバルパターンリストはパターンリストファイルの最も外側のレベルにおいて定義されることができるか、又は包含パターンリスト内でネストされるように定義されることができる。しかしながら、そのネスティングは単に便宜的なものである。それらは、ファイル内の最も外側のレベルにおいてグローバルパターンリストとして概念的に定義される。ネストされたグローバルパターンリストは、同じ名前の最も外側の(ネストされない)グローバルパターンリストと意味的に同等である。したがって、たとえば、以下を参照されたい。
GlobalPList Gl
{
GlobalPList G2
}
is semantically equivalent to:
GlobalPList G1
{
PList G2; # References G2
}
GlobalPList G2 ...
4.全てのグローバルパターンリストは固有に名前を付けられる。
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.
{
...
}
5.ローカルパターンリストは常に、ローカルパターンリストの名前の範囲も決定する、包含パターンリスト内でネストされた定義を有する。ローカルパターンリストは、その包含パターンリスト内で固有に名前を付けられる。ローカルパターンリストは構文的に、パターンリストファイル内の最も外側のレベルにおいて生じることを許されない。
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;
{
}
}
6.各パターンリストファイルは、1つ又は複数のグローバルパターンリストのための定義を含む。これは構文から直に生じる。最も外側のレベルはglobal-pattern-list-definitionであり、それらのうちの少なくとも1つが存在しなければならない。
7.Pattern-nameは、Patキーワードに続く、1つのパターンへの参照である。それは、その名前が接尾語.patをパターン名に連結することによって得られるパターンファイル内に存在するパターンを参照する。そのファイルは、パターンのために定義された1つの探索経路に沿って得られることになる1つのファイルを示す。
8.pattern-list-referenceは、PListキーワードに続くパターンリストへの参照である。その参照は、オプションのファイル名、及びそれに続く、修飾されたパターンリスト名からなり、そのパターンリスト名は単に、ドットによって分離される名前のリストである。したがって、たとえば、以下は、ファイルfoo.plist内にあるグローバルパターンリストG1内にネストされるL1内にネストされるL2内にネストされるローカルパターンリストL3を参照するpattern-list-referenceとして用いることができる。その名前の最も左側の名前部分はG1である。
PList foo.plist:G1.L1.L2.L3;
最も左側の名前部分は、グローバルパターンリストに分解しなければならないか、又は参照点から見ることができるローカルパターンリストに分解しなければならない。
pattern-list-referenceの名前分解は以下のように進められる。
1.各名前部分は、その前にある接頭部に照らして宣言される名前に分解する。
2.ファイル修飾がある場合には、最も左側の名前部分は、名前を付けられたファイルにおいて宣言されるグローバルパターンリストに分解する。
3.ファイル修飾がない場合には、最も左側の名前は、包含範囲内のローカルパターンリストに分解することができ、それが失敗する場合には、次の包含範囲内のローカルパターンリストに分解することができ、それが包含グローバル範囲まで続けられる。
4.グローバル範囲がパターンリストファイル内の最も外側のレベルにおいて宣言されたかのように、グローバル範囲の意味を保持するために、最も近くにある包含グローバル範囲への範囲の探索を制限する必要がある。ネストされたグローバル範囲が最も外側のレベルにおいて(同等に)テキスト形式で宣言された場合には、名前分解探索は、その範囲を検査した後に終了するであろう。
5.その参照が以前のステップによって分解されていなかった場合には、最も左側の名前部分が、この同じファイル内のグローバルパターンリストに分解されることができる。
6.その参照が以前のステップによって分解されていなかった場合には、最も左側の名前部分が、.plist接尾部を最も左側の名前部分に追加することにより、そのファイル内で名前を付けられるグローバルパターンリストに分解されることができる。
7.その参照が以前のステップによって分解されていなかった場合には、その参照はエラー状態である。
先に述べられたように、上記の規則は、最も左側の名前部分が、参照点から見ることができるローカルパターンリスト、又はグローバルパターンリストのいずれかに分解することを指示する。
以下の例はこれらの概念のいくつかを例示する。
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;
}
パターン及びパターンリストの構文的な記述は、それらの記述においてオプションを指定できるようにする。一般的に、オプションはベンダ特有である。構文は、任意のパターン又はパターンリストが、それぞれ複数のパラメータで指定される複数のオプションを有することができるようにする。大部分のベンダによって認識されることになるいくつかのサポートされるオプションが記述される。
パターン実行シーケンスを定義した後に、パターン木の動的な(すなわち実行時の)意味が記述される。
[E2.パターン]
図6は、本発明の一実施形態によるパターンコンパイラ602及びパターンローダ604を示す。パターンのユーザ定義の内容は、プレーンテキストファイルであるパターンソースファイル606において入手することができる。パターンコンパイラは、ソースファイルを、テスタハードウエア上にロードするのに適したモジュール特有のフォーマットにコンパイルする責任を担うであろう。この後者のファイルはパターンオブジェクトファイルと呼ばれるであろう。以下はその一般的な属性である。
1.パターンオブジェクトは、ユーザが作成することはできない。むしろ、ユーザは、他のパターンリスト及び/又はパターンのコレクションであるパターンリストを常に取り扱う。パターンリストオブジェクトは、必要に応じてユーザがアクセスできるようにしながら、その中に含まれるパターンオブジェクトを作成し、所有し、保持する。
2.パターンは1つの試験計画内で固有に名前を付けられる。すなわち、その試験計画内では、同じ名前を有する2つのパターンは存在することはできない。パターンの名前は、それを含むファイルの名前とは異なる。パターンファイル名は、1つのパターンを参照するためにパターンリストファイルにおいて用いられる名前であり、一方、そのパターンの実際の名前はパターンファイルにおいて定義される。
本発明の一実施形態では、一般的に、ただ1つのDUT(被試験デバイス)が、種々のベンダからのテスタモジュールに接続されることもある。これは、全パターンのコンパイル−ロード−実行連鎖にとって複数の意味を有する。主なものがこのセクションにおいて説明される。
[E3.パターンコンパイル]
こうして、パターンコンパイラ602は、(用いられるベンダ特有のデジタルモジュールに照らして)特定のサイト構成をターゲットにする必要がある。この説明の残りの部分において、用語「モジュール」は、一例として、デジタルモジュールを指すために用いられるであろう。種々のベンダからのモジュール608をシステムに組み込むことができるようにするために、以下の手順が好ましい。
1.各モジュールベンダは、動的にロード可能なライブラリ又は個別の実行可能プログラムの形で、自ら所有するモジュール特有のパターンコンパイラ610を提供する責任を担うであろう。このコンパイラライブラリ/実行可能プログラムは、最低でも、引き数とみなされる既知のcompile()関数を提供するであろう。
a.(1つ又は複数の)パターンソースファイルパス名のアレイ
b.Pin Descriptionファイル名
c.Socketファイル名
d.コンパイルされるオブジェクトの宛先を指定するオプションのディレクトリパス名
e.任意のベンダ特有のパラメータの指定を許可するストリング名/数値対のオプションのアレイ(他のベンダによって無視され得る)

2.パターンソースファイルは、2つの異なるタイプのセクションを収容するであろう。
a.全てのコンパイラがアクセス可能である情報を含む「共通」セクション(ただし、必ずしも用いられる必要はない)。
b.固有ベンダコードによってそれぞれ特定され、特定のベンダコンパイラによって使用可能な情報のための1つ又は複数のオプションのベンダ特有のセクション。
3.ベンダのコンパイラは、パターンオブジェクトファイルを直に作成しないであろう。代わりに、テスタは、パターンコンパイラの一部であるオブジェクトファイルマネージャ(OFM)614によって管理されるパターンオブジェクト「metafile」612を提供するであろう。パターンコンパイラは、システムコントローラとして動作するコンピュータ上に、又はオフラインで、たとえばシステムコントローラが接続されるネットワーク上に配置することができる。これまで抽象語において参照された「パターンオブジェクトファイル」は、実際にはこのオブジェクトメタファイルである。オブジェクトメタファイルは、パターンソースファイルと同じ名前を付けられることになり、ソースファイル拡張子がオブジェクトファイル拡張子によって置き換えられる。OFMは、このファイルの読出し及び書込みを行うためのアプリケーションプログラミングインターフェース(API)を提供するであろう。オブジェクトメタファイルは、以下のものを格納するための手段を有するであろう。
a.共通ヘッダ情報
b.対応するモジュール、及びそのモジュールためのパターンデータの場所を特定する情報を含む、モジュール特有のヘッダ情報
c.モジュールベンダの要求に応じて編成され、モジュールベンダによって解釈されることができる、モジュール特有のパターンデータ
OFM APIによって、モジュールベンダのコンパイラは、モジュール特有のヘッダ情報及びデータをオブジェクトメタファイルに書き込むことができるようになるであろう。オブジェクトメタファイルのこのレイアウトによって、ターゲットにされたサイトにおいて2つ以上のモジュールが同じ場合であっても、パターンデータがモジュール毎に編成されるようになることに留意されたい。
直接メモリアクセス(DMA)のような効率的なデータ通信を利用することができる、モジュール特有のハードウエアローディング情報の生成を容易にするために、パターンコンパイラによって、さらに多くのベンダ供給構成情報が必要とされる場合もあることに留意されたい。
[E4.モジュールのためのパターンロード]
各モジュールベンダが、一般的な手法に従い、自らのパターンローディング機構615を提供する責任を担うであろう。モジュール608のパターンオブジェクトメタファイル612は、種々のセクション616にモジュール特有のデータを格納する。ベンダインプリメンテーションは、パターンオブジェクトメタファイルから関連するモジュール特有のセクションにアクセスするために、OFM APIを用いるであろう。さらにテスタフレームワークは、各モジュールのロードパターンメソッドをコールし、モジュール特有のデータをメタファイルの適当なセクションからモジュールにロードする責任を担う。
[E5.パターンファイル]
各コンパイラベンダは複数のパターンのための種々のプレーンテキストフォーマットを完全に指定することができ、それは実際には大部分の場合に必要になるであろう。しかしながら、一般的に、全てのベクトルのために複数のモジュールにわたる統一性及び同一の意味が必要になる、サイクルベースの試験環境の場合、パターンファイルのための、共有され、一般化された構文が望ましいだけでなく、必要になるであろう。この共有された構文は、パターンソースファイル内の「共通」セクションのために指定されることになる構文である。実際には、大抵の場合に、「共通」セクションはパターンファイルにおいて必要とされる唯一のセクション(ヘッダ情報を除く)であり、全てのベンダのコンパイラはそのセクションにおいてのみ正常に動作することが想定される。このセクションは、全てのコンパイラが解釈できるべきである、パターンファイルのための規則を表す。パターンファイルは以下のように編成されるであろう。
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
以下は、先に用いられた未定義の非終端記号の記述である。
1.version-identifier:集合[0−9]からの1つ又は複数の文字からなる文字列であり、最初の文字は数字でなければならない。
2.identifier:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列であり、最初の文字は[a−zA−Z_]から選択されなければならない。
3.vendor-section-contents:ベンダ特有のコンパイラに対してのみ意味のある任意のテキスト。
4.file-name:有効なウインドウズファイル名(ファイル名内に任意の空白が含まれる場合には、それは二重引用符で囲まれなければならない)。これは単純なファイル名でなければならない、すなわちディレクトリコンポーネントを持つべきでないことに留意されたい。
5.waveform-table-pin-group-name:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列であり、最初の文字は[a−zA−Z_]から選択されなければならない。この変数は他の場所で宣言され、ピンのグループに共通である波形テーブルの名前を保持する。
6.24bit number:最大16777215までの有効な10進数。
7.8bit number:最大256までの有効な10進数。
8.index-register:有効な10進数。1つのモジュールの実施形態では、これは値[1−8]を有することができる。
9.vector:これは、STIL内のVectorステートメントに類似である。これは、信号名及び信号グループ名を参照し、コンパイラがPin Descriptionファイルにアクセスできるようにするために必要になることに留意されたい。
10.waveform-time-reference:集合[a−zA−Z_0−9]からの1つ又は複数の文字からなる文字列であり、最初の文字は[a−zA−Z_]から選択されなければならない。
パターンファイルはコメントをサポートし、コメントはパターンファイルコンパイラによって無視されることになっている。コメントは「#」文字で始まり、その行の終わりまで続く。
パターンファイルのヘッダ及び「共通」セクションの構成体を参照して、以下の点に留意されたい。
1.pattern-name項目は、パターンファイルがそのためのデータを含むPatternオブジェクトに関連付けられることになる名前を指定する。これは、対応するパターンオブジェクトメタファイル内のヘッダに引き継がれるようになる。
2.waveform-time-referenceは、Timingファイル内の、パターンファイルに対して外部から定義されることになる特定のwaveform-and-timing定義のための名前である。パターンファイルにおいてwaveform-time-referenceを指定することにより、別のwaveform-time-referenceが現われるまで、(waveform-and-timingのための)特定の名前が全ての後続のベクトルに結合されるであろう。
3.サブルーチンコールのためのオペランド(たとえば、JSR及びJSRC)は、同じパターンファイルにおいて以前に現われたpattern-specラベル、又は外部から定義されたサブルーチンパターン内のpattern-specラベルであるストリングである。このオペランドは最終的には、サブルーチンをロード/処理するために分解されるであろう。サブルーチンコールオペランドのためのラベルは、システムにわたって固有である必要がある。
waveform-time-reference名は、構文的に正確であるなら何でも用いることができるが、特定のハードウエア含意に起因して、waveform-time-reference名は予めわかっている明確な集合に限定される必要があり得る(さらに読みやすくするために、それはオプションでは、ユーザ選択の名前にユーザによってマッピングされることができ、そのマッピングはオプションのファイルにおいて提示される)ことに留意されたい。
また、パターン及びwaveform-time-referenceソースファイルは、物理的なテスタチャネルに接続される全てのDUTチャネルのための初期構成データを提供すべきであることにも留意されたい。任意のDUTチャネルの場合に後続のデータが省略される場合には、パターンコンパイラは、パターンデータを「パッド」して、初期レベルからの出力を保持するであろう。
[パターンファイル例]
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; } }
}
}
}
パターンソースファイル内のメインヘッダ及び共通セクションからの要約情報は、オブジェクトメタファイル内のメインヘッダに格納される。その要約は、アドレス等のプリロード分解を助けるために、又はデータロギングにおいて助けるために、迅速に抽出するために通常必要とされる情報からなる。共通セクションの意味は全てのコンパイラの場合と厳密に同じであるので、全てのコンパイラが同じ要約情報を提供することができ、メタファイルを書く第1のコンパイラがこの情報を格納するであろう。以下は、格納されることになる情報である。
1.パターンソースファイル名
2.ソースファイルにおいて宣言されるようなパターンのタイプ
3.ソースファイルからのバージョン情報
4.パターンソースファイルの共通セクションにおいて用いられる全てのwaveform-and-timing名のリスト
5.パターンソースファイルの共通セクション内の(相対的な)ベクトルアドレスへの全てのサブルーチン参照のマップ
6.パターンソースファイルの共通セクション内の(相対的な)ベクトルアドレスへの全てのラベル参照のマップ
7.一般的なブックキーピング情報:ベクトルカウント、命令カウント等。
オープンアーキテクチャ試験システムは、明示的で、且つ異なる拡張子を有するために、パターン及びパターンリストファイルの両方を必要とする。パターンファイルの場合、これは、プレーンテキストソース及びコンパイルされたオブジェクトファイルの両方に当てはまる。これは、ディレクトリリスティング等において視覚的にファイルタイプを迅速に特定するために、及び拡張子に基づいて連想がなされるようにするために、ユーザにとって好都合であると考えられる。パターンリストファイルパーサは、これらの拡張子を用いてファイル名を予想するであろう。
プレーンテキストパターンソースファイル:.pat
コンパイルされたパターンオブジェクトメタファイル:.pobj
パターンリストファイル:.plst
ユーザは、たとえば、テスタ環境変数又は設定オプションを通して、これらのデフォルト値を無効にすることができる。
テスタは、以下に記述される環境構成ファイルのうちの少なくとも1つにおいて、ファイル探索経路のための以下の「環境」変数の定義を必要とするであろう。
Tester_PATLIST_PATH:パターンリストファイルの場合。
Tester_PATSRC_PATH:パターンソースファイル(オプション)の場合。
Tester_PATOBJ_PATH:パターンオブジェクトメタファイルの場合。
オプションの環境/設定変数Tester_PATSRC_PATHが定義されない場合には、Tester_PATOBJ_PATHと同じであると仮定されることに留意されたい。一般的に、Tester_PATOBJ_PATHと同じ値である場合、Tester_PATSRC_PATHを定義するよりも、定義しないほうが、より効率的であろう。
[E6.ソフトウエア表現]
パターンオブジェクトはユーザによって作成されない。むしろ、ユーザは常に、他のパターンリスト及び/又はパターンのコレクションであるパターンリストオブジェクトを処理する。ユーザがアクセスできるようにしながら、パターンリストオブジェクトは、その中に含まれるパターンオブジェクトを作成し、所有し、保持する。ユーザの試験プログラム内のパターンリストオブジェクトは、パターンリストの実際の定義を含む、ディスク上のパターンリストファイルに関連する。パターンリストの定義は、そのパターンリストのための明示的な名前を提供し、ファイル名連想を通して、パターンの順序付きリスト及び/又は他のパターンリストを特定する。このセクションは、パターンリスト及びパターンのソフトウエアがテスタフレームワークにおいて如何に操作されるかを理解するための前置きとして、それらのソフトウエア表現を記述する。
[パターンリスト連想]
試験システム内の1つの試験サイト(及び拡大解釈して、その中にある試験計画)は、多数のトップレベルパターンリストに関連付けることができる。しかしながら、複数の試験計画に対して、常に1つの実行文脈だけが存在する。トップレベルパターンリストは、それによって(階層的に)参照されるパターンのための実行シーケンスを定義するので、アクティブな実行文脈は、現在選択されているトップレベルパターンリストに対応するものである。これは、ある時点において、1つのパターンリスト内に含まれるパターンだけがハードウエア上にロードされることができることを意味しないことに留意されたい。むしろ、1つの実行シーケンスを実行可能にするためにハードウエア上にロードされる必要がある1組のパターンは常に、現在ロードされている全てのパターンのサブセットでなければならない。
[パターン木]
直観的には、トップレベルパターンリストを表現するための1つの方法は、ある種の木データ構造によると考えられる。図7は、本発明の順序付きのパターン木の1つの実施形態を示しており、パターンリストAがトップレベルパターンリストであると仮定する。
[パターン木情報内容]
以下の情報がパターン木の全てのノードにおいて格納されるであろう。
1.そのノードに関連するエンティティ(パターンリスト又はパターン)の名前。
2.定義ソースのタイプ。葉(パターンノード)の場合、これは常にパターンファイルになるであろう。中間(パターンリスト)ノードの場合、これは「トップレベルファイル」(トップレベルパターンリスト定義用)、又は「エンベデッド・イン・ファイル」(ネストされたパターンリスト定義用)のいずれかにすることができる。
3.そのノードが関連するディスク上のファイルの最後の変更タイムスタンプ。
以下の付加情報は、中間(パターンリスト)ノードにおいてのみ格納されるであろう。
1.そのノードによって表されるパターンリストオブジェクト上に(もしあるなら)セットされる実行オプション、すなわちそのオブジェクトオプション。
2.その子毎に、そのノードによって表されるパターンリスト定義内の各子参照上に(もしあるなら)セットされる実行オプション、すなわち参照オプション。
こうして、ルートから中間ノードへの固有の経路において現われるノードのコレクション、及びそれらに出合ったシーケンスは、そのノードによって表される、組み合わせられた有効な実行オプションを決定するために必要とされる全ての情報を含む。1つのパターンの実行オプションは、その中間の親の有効な実行オプションと、それと組み合わせた、その中間の親がそのために有することができる参照オプションによって決定される。
ここで、パターンリストパーサがパターン木を作成している過程にあるときに、その使用の文脈が後の時点まで分解されない場合もあるので、ある特定の実行オプションが単にストリングとして値を最初に格納する必要があるかもしれないことに留意されたい。そのようなオプションの1つの例は「マスク」オプションであり、それは、ピンマスク情報を指定する。パターンリストはSocket情報に関連しないので、ピンマスクオプション(ピン及びグループ名)は、ローディング前に分解されるべきストリングとして格納される。
以下の付加情報は葉(パターン)ノードにおいてのみ格納されるであろう。
1.実行木として編成される、外部及び内部両方のパターンによってコールされるサブルーチンへの全ての(おそらく遷移的な)参照。
当然、全てのパターンノードはさらに、オブジェクトメタファイル共通ヘッダにおいて入手可能な全てのパターンファイル要約情報にアクセスでき、そしてそれらをキャッシュすることができるであろう。
[パターンリスト変更の処理]
パターンリストの内容に対してなされる変更は概念的には、そのパターンリストへの全ての参照に影響を及ぼす。必要に応じてパターンオブジェクト及びパターンリストオブジェクトに適用される以下の規則が、そのような変更を管理するために用いられるであろう。
1.ディスク上のパターンリストファイルの内容に対してなされる変更は、そのパターンリスト上(又はそれを参照する任意の他のパターンリスト上)で実行されるload()コマンドにおいてのみ、試験システムの中に伝えられるであろう。言い換えると、ソフトウエア内のパターンリスト階層は常に、ハードウエア上に現在ロードされているパターンリストを反映するであろう。
2.ユーザは、パターンリストをそれらのディスクファイルソースと同期させるために、ロード時間中に行われる検査を無効にするモードをセットすることができるであろう。これにより、生成モードの動作を、より迅速且つ安全にすることができるであろう。
[パターン木ナビゲーション]
試験サイト(及び拡大解釈して、そのサイトのための試験計画)に関連するトップレベルパターンリストは公開(グローバル)範囲を有する。そのシステムは、ユーザが個々のノード及び副木にアクセスできるように、トップレベルパターンリストを表すパターン木をナビゲートするためのAPIを提供する。
[E7.パターンリスト動力学]
パターンリストの静的な規則は先に説明された。パターンリストの動的な(実行)規則の記述がここで提示される。
パターン木は包括的なパターン管理のために不可欠である。たとえば、1つのパターンロードシーケンスのための開始点は、サイト又は試験計画に現在関連しているパターン木上でのload()メソッドへのコールである。しかしながら、1つのパターン木は孤立して動作しない。完全に初期化されたパターン木を用いて、以下の2つのフレームワークオブジェクトが作成されるであろう。
1.トップレベルパターンリストは、複数のパターンのための1つのPattern Execution Sequenceを定義する。それは、そのような実行シーケンスをそのトップレベルパターンリストに対応するパターン木から如何に導出することができるかを記述する。たとえば、図7に示されるパターン木Aに対応するパターン実行シーケンスは{q、s、t、q、r、q、u、u、v}である。Pattern Execution Sequenceは概念的には、そのパターン木を通して記述される実行シーケンスを反映する順序木である。フレームワークは、パターン木ノードと、Pattern Execution Sequence内の対応するエントリとの間の任意の必要なナビゲーションリンクを確立し、保持する。
2.Pattern Setは、そのパターン木内の全ての固有のパターン(サブルーチンを含む)のリストに過ぎない。したがって、これは、ハードウエア上にロードされるべきである個々のパターンを決定するために用いられることになるリストである。フレームワークは、パターン木ノードと、Pattern Set内の対応するエントリとの間の任意の必要なナビゲーションリンクを確立し、保持する。図7のパターン木のためのPattern Setは(q、s、t、r、u、v)である(パターンリストA内のパターンはいずれも如何なるサブルーチンコールも含まないものと仮定される)。
Pattern Execution Sequence及びPattern Setはいずれも、常に、パターン木から導出することができることに留意されたい。しかしながら、多くの場合に、実用的である限り、初期構成後に、それらをキャッシュことが理にかなっているであろう。
[パターンリスト実行オプション]
上記のように、各パターンリスト宣言(その定義に先行する)又はパターンリスト/パターン参照エントリの後に、多数の実行オプションが続くことができる。パターンリスト実行オプションは、パターンリストのランタイム実行を変更する。さらに拡張できるようにするために、これらのオプションのための名前(及びオプション値)がパターンコンパイラのパターンリストファイルパーサによって単にストリングとして処理され、必要に応じて特定のバージョンによって解釈されることになる。テスタは、以下に記述される、1組のオプション及びそれらの解釈を規定する。しかしながら、ベンダはその1組のオプションを拡張することができる。オプション構文をパース時に妥当性検査できるようにするために、パターンリストファイルパーサは、ある特定のバージョンのための情報ファイルを読み出すことができる。そのような情報ファイルを用いて、ある特定のバージョンがそもそも実行オプションの指定をサポートするか否かを指定することもできる。
1組の実行オプションをサポートするバージョンの場合、以下の一般的な規則がそれらの使用法を決定するであろう。これらの規則を理解するために、パターンリスト/パターンの階層的なコレクションを順序木として視覚化することが有用である。
1.パターンリスト定義上(すなわち、ファイル内の「local-pattern-list-declaration、global-pattern-list-declaration」生成物内)でセットされるIntrinsicオプションは、事実上、ユーザの試験プログラム内の対応するパターンリストオブジェクト上での直接的なオプション設定である。したがって、これは、そのパターンリストオブジェクトへの全ての参照に当てはまり、オブジェクトオプションと呼ばれる。
2.パターンリスト/パターンへの参照上(すなわち、ファイル内の「pattern-entry」及び「pattern-list-entry」生成物内)でセットされるReferentialオプションは、オプションの範囲を、その階層内の特有の経路、すなわち木のルートから考慮中の参照に導く経路(パターンリスト/パターンの宣言順序によって確立される)に制限する。したがって、これらは、特定のオブジェクト参照上のオプションであり(且つ、オブジェクトそのものにおけるオプションではない)、参照オプションと呼ばれる。
3.コレクション階層(パターンリスト/パターンの宣言順序によって確立される)内の任意のリスト/パターンのための有効オプション設定は、木のルートからそのリスト/パターンまでの経路に沿って出合うオブジェクトオプション及び参照オプションの組み合わせである。その特定の組み合わせの仕組み(たとえば、集合の結び、集合の交わり、又は任意の他の競合解消アルゴリズム)は、オプションそのもののプロパティである。
上記の規則の結果、そして1つのパターンファイル内のパターン定義上で実行オプションをセットするためのファシリティがないという事実は、1つのパターンへの全ての参照に当てはまるオプションをセットするための直接的な規則が存在しないということであることに留意されたい。これを果たすための仕組みは、単一パターンのパターンリストを用いることである。
テスタは、そのバースト挙動を変更し、その実行シーケンスを変更する、ある1組のパターンリスト実行オプションを指定する。
1つのパターンリストのための実行シーケンスがハードウエアに提示されるとき、ハードウエアはバーストを生成する。Burstは、ソフトウエアが何も関与することなく、ハードウエアによって直にパターンのシーケンスを実行することである。Burst Discontinuityは、先行するバーストが終了し、新たなバーストが開始される、実行シーケンス内の場所である。
パターン管理ソフトウエアの目的の1つは、バーストを生成するために必要とされる実行シーケンスをハードウエアに与えることである。デフォルトによって、1つのパターン木は1つの実行シーケンスを生成し、それがハードウエアに提示される場合には、結果として1つのバーストが生成されるであろう。しかしながら、この挙動は、パターンリスト上でオプションを用いることにより変更することができる。したがって、オプション結果を用いる結果として、バースト不連続部が生じ得る。
さらに、ユーザは多くの場合に、全てのパターン又は全てのバーストの前又は後に実行されることになるプロローグ又はエピローグパターンを必要とするであろう。これは、ハードウエアに提示されることになる実行シーケンスを変更する。
Pattern Execution Sequenceオブジェクトの作成又は変更中に、フレームワークは、指定された実行オプションと、パターン木によって具現される特定の実行シーケンスとの組み合わせから生じるパターンバースト内のブレークを判定するために必要な全ての情報を有し、必要に応じて報告する。これを果たすときに、システム内のモジュールのハードウエア能力を調査することが必要な場合もある。たとえば、1つのハードウエアインプリメンテーションによれば、ピンマスクのために4つの構成を格納できるようになり、そのうちの2つ(0及び3)は(Mask This Vector、MTVをサポートするために)デフォルトマスク及びアンマスク演算のために用いられる。こうして、ユーザは、バーストモードをブレークすることなく、2つの異なるグローバルピンマスク構成を許される。
或るモジュールベンダがハードウエアにおいてパターンリストインプリメンテーションをサポートしない場合には、Pattern Execution Sequenceのベンダの処理の結果として、実行シーケンス内の全てのパターンが個別に実行されることになることに留意されたい。Site-Compatible及びSite-Heterogeneousの両方のシステムにおいて、サイトのバースト能力は、「最小共通分母」によって制限されるであろう。テスタは、ある特定のデフォルトの1組のオプションを提供し、それらのパラメータが以下に記述される。各オプションは以下のことを述べることにより指定される。
・それがIntrinsicである(すなわち、Global又はLocalキーワードを伴う定義に関連する)か、Referentialである(すなわち、Pat又はPListキーワードを伴う参照に関連する)か。Intrinsicオプションは、定義の場所及び全ての参照において当てはまるが、Referentialオプションは、それらが関連する参照においてのみ当てはまる。
・さらに、オプションが全ての静的に(構文的に)又は動的に(参照されることにより意味的に)ネストされたパターン又はパターンリストに再帰的に当てはまるものと仮定される場合には、そのオプションは「子によって継承される」と言われる。
以下はオプションのリストである。全ての準拠するベンダは、これらのオプションを指定されたとおりに解釈するであろう。
1.Mask<pin/pin group>
GlobalPList、LocalPListに適用されるときにIntrinsic。
PList、Patに適用されるときにReferential。
子によって継承される。
このパターンリストは常に、使用禁止の指示されたピン又はピングループによって参照されるピンの比較回路を有するであろう。多くの場合に、ハードウエアの制限の結果として、バースト不連続部が生じることになる。
2.BurstOff
GlobalPList、LocalPListに適用されるときにIntrinsic。
PList、Patに適用されるときにReferential。
子によって継承されない。
このパターンリストは常に、非バーストモードにおいて実行されるであろう。このオプションは子によって継承されないが、BurstOffDeepオプション(下記)は子によって継承される。
3.BurstOffDeep
GlobalPList、LocalPListに適用されるときにIntrinsic。
PList、Patに適用されるときにReferential。
子によって継承される。
このパターンリストは常に、非バーストモードにおいて実行されるであろう。このオプションは子によって継承されるが、BurstOffオプション(上記)は子によって継承されない。BurstOffDeepオプションは子によって消されないことに留意されたい。
4.PreBurst<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
指定されたバーストオプションを有しない子ノードによってのみ継承される。
指示されるパターンは、このパターンリスト内の全てのバーストに前置されるべきである。PreBurstパターンは、このパターンリストノードに起因して開始される全てのバーストの直前に生じる。そのオプションは、同じパターンであるPreBurstオプションを有するバースト内に既にあるときには適用されない。
5.PostBurst<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
指定されたバーストオプションを有しない子ノードによってのみ継承される。
指示されるパターンは、このパターンリスト内の全てのバーストに後置されるべきである。PostBurstパターンは、このパターンリストノードに起因して開始される全てのバーストの直後に生じる。そのオプションは、同じパターンであるPostBurstオプションを有するバースト内に既にあるときには適用されない。
6.PrePattern<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
指示されるパターンは、このパターンリスト内の全てのパターンに前置されるべきである。
7.PostPattern<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
指示されるパターンは、このパターンリスト内の全てのパターンに後置されるべきである。
8.Alpg<alpg object name>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
名前付きALPGオブジェクトは、低速APGレジスタ設定、読出し待ち時間、中間データレジスタ、アドレススクランブル、データ反転、データ発生器等の関連する情報を格納する。
9.StartPattern<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
そのパターンリストは、その実行シーケンスにおいてStartPatternが最初に現われるときに実行し始めるであろう。
10.StopPattern<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
そのパターンリストは、その実行シーケンスにおいてStopPatternが最初に現れるときに実行するのを止めるであろう。
11.StartAddr<vector offset or label>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
これはStartPatternオプションを伴わなければならない。そのパターンリストは、その実行シーケンスにおいてStartPatternが最初に現われるときのStartAddrにおいて実行し始めなければならない。
12.StopAddr<vector offset or label>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
これはStopPatternオプションを伴わなければならない。そのパターンリストは、その実行シーケンスにおいてStopPatternが最初に現われるときにStopAddrにおいて実行するのを止めなければならない。
13.EnableCompare_StartPattern<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
パターン比較は、指示されるパターンが最初に現われるときに開始するであろう。
14.EnableCompare_StartAddr、EnableCompare_StartCycle
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
これは、EnabelCompare_StartPatternを伴わなければならない。パターン比較が開始することになるパターン内のアドレス又はサイクルを指示する。
15.EnableCompare_StopPattern<pattern>
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
パターン比較は、指示されるパターンが最初に現われるときに終了するであろう。
16.EnableCompare_StopAddr、EnableCompare_StopCycle
GlobalPList、LocalPListに適用されるときにIntrinsic。
子によって継承されない。
これは、EnableCompare_StopPatternを伴わなければならない。パターン比較が終了することになるパターン内のアドレス又はサイクルを指示する。
17.Skip
PList、Patに適用されるときにReferential。
子によって継承されない。
パターンリストによって支配されるパターン又はサブシーケンス全体がスキップされるようにする。これは、このパターンリスト副木のルートにおいて全てのオプションもスキップさせるであろう。それは、このパターン副木が実行するために存在しなかったかのようにする。
[パターンリストバースト制御]
先に説明されたように、或るパターンリストのための実行シーケンスがハードウエアに提示されるとき、ハードウエアは、ソフトウエアが関与することなく、パターンのシーケンスのバーストを生成する。バースト不連続部は、先行するバーストが終了し、新たなバーストが開始される、実行シーケンス内の場所である。上記のオプションリストに示されるように、PreBurst、PostBurst、BurstOff及びBurstOffDeepオプションは、バースト不連続部が生じる場所を制御する。PreBurst及びPostBurstオプションは、以下に記述されるある特定の付加的な規則に対するバースト不連続部サブジェクトを決定する。
1.親リストがPreBurst及びPostBurstオプションを有し、ネストされたリストが同じ対応するオプションを有するとき、バースト不連続部は存在せず、ネストされたリストのPreBurst及びPostBurstオプションは当てはまらない。親リストのPreBurst及びPostBurstを適用するただ1つのバーストだけが存在する。
2.ネストされたリストがバーストオプションを持たないとき、それは、これらのオプションの記述によって親リストと同じPreBurst及びPostBurstオプションを有することと同じであることに留意されたい。結果として、バーストオプションを持たないネストされたリストはバースト不連続部を生じない。
3.上記の規則1が当てはまらず、且つ親リストの開始からネストされたリストの開始までパターン実行シーケンスへの寄与がある場合には、ネストされたリストの開始時にバースト不連続部が存在する。この場合、親リストのPreBurst及びPostBurstは、親リストからのパターン実行シーケンスへのこの寄与に当てはまる。ネストされたリストのPreBurst及びPostBurstは、ネストされたリストに当てはまる。
4.上記の規則1が当てはまらず、且つネストされたリストの終了から親リストの終了までのパターン実行シーケンスへの寄与がある場合には、ネストされたリストの終了時にバースト不連続部が存在する。この場合、親リストのPreBurst及びPostBurstは、親リストからのパターン実行シーケンスへのこの寄与に当てはまる。ネストされたリストのPreBurst及びPostBurstは、ネストされたリストに当てはまる。
5.上記の規則1が当てはまらず、且つネストされたリストから以外の親リストからのパターン実行シーケンスへの寄与がない場合には、親リストのPreBurst及びPostBurstは当てはまらない。ネストされたリストのPreBurst及びPostBurstを適用するただ1つのバーストだけが存在する。
以下は、実行シーケンスへのオプションの影響を示す数例である。簡略化するために、全てのパターンリストがただ1つのファイルにおいて指定されるものと仮定する。
[例1:BurstOffの使用]
この例はBurstOff及びPreBurstを例示する。特に強調されるのは、BurstOffによって、複数のパターンが、1パターン長である複数のバースト内で1つずつ実行されることである。それゆえ、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;
};
Aをルートとする木は図8に表されるであろう。
このパターンのための実行シーケンスが以下に示される。|文字はバーストブレークを示す。このパターンリストは10バーストにおいて実行され、第1のバーストはパターンz及びqを有し、最後のバーストはパターンeを有する。
zq|ab|zr|zs|t|c|d|c|d|e
この実行シーケンスについて以下のことに留意されたい。
1.A上のBurstOffオプションはBによって継承されないので、B内のパターンa及びbはバーストとして動作する。
2.A上のPreBurstオプションはBによって継承されないので、Bによるバースト内のa及びbはzによって前置されない。
3.zによる前置は、aの直接の子であることに起因して実行されるパターン、すなわちパターンq、r及びsの場合にのみ起こる。これらのパターンは、BurstOffオプションを有するAに起因して1パターン長だけであるバースト内にあるかのように1つずつ実行される。BurstOffは、パターンに、1パターン長バーストにおいて個別に実行されることを要求する。それゆえ、PreBurst及びPostBurstオプションは依然として当てはまる。
4.パターンリストDは、その子c及びdが1つずつ実行される固有バーストオフオプションを有する。それは、AからのPreBurst zを継承しない。
[例2:BurstOffDeepの使用]
この例はBurstOffBurstOffオプションを例示する。パターンリスト定義中のBurstOffDeepは、ネストされる定義及び参照されるリストに影響を及ぼす。しかしながら、PreBurst及びPostBurstオプションは、ネストされたリスト及び参照されたリストによって継承されない。その例は、例1の場合と同じパターンA、B、C、D、Eを用いるが、それらのオプションが異なる。
5.Aの定義上のオプション:[BurstOffDeep]、[PreBurst z]、[PostBurst y]
6.任意の他のノード上の他のオプションはない。
実行シーケンスは以下のとおりである。先に説明されたように、|文字はバーストブレークを示す。
zqy|a|b|zry|zsy|t|c|d|c|d|e
この実行シーケンスについて以下のことに留意されたい。
1.PreBurst及びPostBurstはB、C、D、Eによって継承されない。
2.BurstOffDeepはB、C、D、Eによって継承される。
[例3:PreBurst及びPostBurst禁止]
ここで、例1のパターンリスト木について考えるものとする。ただし、オプションは以下のとおりである。
1.Aの定義上のオプション:[PreBurst x]、[PostBurst y]
2.Cの定義上のオプション:[PreBurst x]、[PostBurst z]
3.任意の他のノード上の他のオプションはない。
実行シーケンスは以下のようになるであろう。
xqabrstcdcdey
「tcd」サブシーケンスが「xtcdz」でない理由は以下のとおりである。
1.最初のxは、実際には現在のバーストに関連するプレバーストオプションxに等しいので、禁止される。
2.最後のzは、PostBurst zがDに継承されず、zが付加されることができるCから生成されるパターンが存在しないので、禁止される。
[例4:Skipの使用]
この例は、ネストされた定義及び参照されるリストへのSkipオプションの影響を例示する。その例は、例1の場合と同じパターンA、B、C、D、Eを用いるが、それらのオプションが異なる。
1.Aの定義上のオプション:[Skip]、[PreBurst z]、[PostBurst y]
2.rへの参照上のオプション:[Skip]
3.Cの定義上のオプション:[Skip]
その実行シーケンスは、以下のような、ブレークのない単一のバーストである。
zqabscdey
この実行シーケンスについて以下のことに留意されたい。
1.r及びCのためのノードはスキップされる。
2.バーストブレークは全く存在しない。
[例5:Maskの使用]
この例はMaskオプションの影響と、パターンならびにパターンリスト定義及び参照へのその影響とを例示する。その例は、例1の場合と同じパターンA、B、C、D、Eを用いるが、それらのオプションが異なる。
1.Aの定義上のオプション:[mask pin1_pin2]、[PreBurst z]
2.Bの参照上のオプション:[mask pin3]
3.Bの定義上のオプション:[mask pin4]
4.eの参照上のオプション:[mask pin5]
5.任意のノード上の他のオプションはない。
名前「pin1_pin2」はPin1及びPin2をマスクするグループを指定する。名前「pin3」、「pin4」及び「pin5」はそれぞれPin3、Pin4及びPin5をマスクすることを指定する。実行シーケンスが以下に与えられ、|はバーストブレークを示している。各パターンの下の数字は、そのパターン実行中にマスクされるピンを示す。
zqabzrzstcdcd|e
1111111111111 1
2222222222222 2
33 5
44
この実行シーケンスについて以下のことに留意されたい。
1.ベンダのハードウエアは、バーストブレークを生じることなく、2つのマスクブロックだけしか収容することができない。eが実行されるまで、2つのマスクブロックはピン{1、2}及びピン{1、2、3、4}である。パターンeがピン{1、2、5}の異なるマスクブロックで到着するとき、ハードウエアはバーストブレークを要求する。
[例6:継承されるオプション及び参照の使用]
この例は、或る定義において継承されるオプションが、その定義が参照されるときには当てはまらないことを例示する。以下の例について考える。
Global A
{
Global B [BurstOffDeep]
{
Global C
{
...
};
...
};
...

PList C;
};

Global D
{
PList C;
};
BurstOffDeepオプションは、その定義の時点においてCによって継承される。しかしながら、それは固有オプションではないので、その参照のいずれの時点においてもCに適用されない。
[例7:ネストされたリストを有する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;
}
実行シーケンスは以下のとおりである。
x p1 p2 p3 y|x p4 z|w p5 y|x p6 y
1.ネストされたリストのPreBurst及びPostBurstオプションは親と同じように指定されるので、パターンp2はp1と同じバーストの中にある。これらのオプションは親と同じように継承されるので、パターンp3も同じバーストの中にある。これらのオプションは、残りのネストされたリスト内に少なくとも1つの異なるメンバを有し、バースト不連続部を生じる。
[タイミング]
ユーザは主に、パターンファイルを用いて試験設定を定義することにより、システムとやりとりする。Timing Fileは、これらのパターンのTimingを記述するために用いられる。このファイルは、分解されるべき基礎的な定義のための他のシステムファイル(たとえば、Pin、SpecSelector)を必要とする。さらに、Timing定義において用いられる種々の変数を分解するために用いられるSpec-Selector及びGlobal定義は、複合TestConditionGroupオブジェクトにカプセル化される。Test Planファイルのような、さらに上位のファイルはさらに、このTestConditionGroupインスタンスを使用する。
Test Plan Fileは、TestConditionGroupオブジェクトへの参照を含む。Pattern Source Fileは、TimingMapオブジェクト内のWaveformSelectorコンポーネントを参照する。TimingオブジェクトそのものはPinオブジェクトを参照する。オプションでは、Timingオブジェクトは、SpecSelectorオブジェクトによって変更される変数も参照する場合がある。これらの関係が図9に示される。
Pattern-List内のPatternオブジェクトは、1組のパターン文字のために用いるための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インスタンスを使用する。こうして、同じ1組の波形テーブルをサポートする多数の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ファイルにおいて用いられるピンは、Pin定義ファイルにおいて適当に定義される必要がある。
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.
[F2.テスタのタイミングコンポーネントへのマッピング]
テスタモジュールの2つのコンポーネントが、波形の生成及びその関連するタイミングに直に関与する。2つのモジュールは、パターン発生器(PG)及びフレームプロセッサ(FP)である。オープンアーキテクチャ試験システムアーキテクチャ内のフレームプロセッサによる波形フォーマッティング及びタイミング発生を例示する簡略化されたブロック図が図10に示される。波形の発生の簡単な説明が以下に与えられる。
パターン発生器1002は、モジュール内の全てのピンに共通であるタイミングセットを生成する。このタイミングセットはGlobal Timing Set(GTS)と呼ばれる。パターン発生器を設定することができる3つのモードがある。これらの3つのモードは、GTSを記述するために用いることができるビットの数に影響を及ぼす。さらに、これらの設定は、バンクを選択するために用いられるビットの数、及びCapture This Vector(CTV)及びMask This Vector(MTV)がセットされるか否かにも影響を及ぼす。テスタにこのベクトルの結果を収集するように指示するために、ユーザはパターンファイルにおいてCTVフラグを用いる。同様に、テスタに現在のベクトルの結果をマスクするように指示するために、ユーザはそのパターンにおいてMTVフラグを用いる。これが以下の表1に示される。パターン発生器1002は、Waveform Character(WFC)を生成する責任も担う。WFCはピン毎に生成される。テスタモジュールは一定のビット数を用いて、WFCを記述する。
Figure 2007528993
テスタモジュールはピン毎に1つのフレームプロセッサ1004を設ける。各フレームプロセッサは、Timing Set Scrambler(TSS)1006を含み、それは、この例では、1024までの全深を有する。TSS1006は、先に説明され、図10に示されるパターン発生器のモードに応じて、多数のバンク1008に分割されることができる。ここでは、バンク当たり64エントリの16バンクが用いられている。TSSは、ピン毎にWaveform Tableを定義する能力において、より高い自由度を与えることができるように設けられる。「FP」モードでは、TSSは、2ビットを用いてTiming Setを出力する。こうして、TSSは、ピン当たり全部で4つの個別の物理的なTiming Setを生成するであろう。これらのTiming Setは、Local Timing Set(LTS)と呼ばれる。
フレームプロセッサ1004はLTS及びWFCを組み合わせて、Waveform Memory1012及びTiming Memory1014へのインデックス1010を作成する。「FP」モードでは、5ビット値が、LTSによって生成される2ビットと、WFCによって生成される3ビットに分割される。こうして、最大4つの物理的なTiming Setを用いることができるが、物理的なWaveform Memory及びTiming Memoryの深さはピン当たり32の深さである。Waveform Memoryは、波形を形成する使用可能なタイミングエッジを含む。使用可能なエッジのためのタイミング値はTiming Memoryから得られる。こうして、フレームプロセッサは波形をフォーマットする。
[マッピング方法]
その方法は、ピン毎の全てのWaveformTableブロックをテスタ内のLTSにマッピングすることである。テスタハードウエアが4LTSをサポートする場合には、ユーザは最大4つのWaveformTableブロックを定義することができる。各WaveformTableブロックは、テスタデジタルモジュールのために最大n個の波形定義を有することができる。
Timing-Mapファイルは、Timing-Mapブロックにおいて定義されるLogical WaveformSelectorの、オープンアーキテクチャ試験システム内のモジュールのためのWaveformTableへのマッピングを提供する。この場合、テスタは256までのLogical WaveformSelectorをサポートする。オープンアーキテクチャ試験システムでは、Logical WaveformSelectorはGTSに直にマッピングする。パターンコンパイラは、Timing-Map及びTimingブロックの両方に基づいて、パターンファイルをコンパイルすることができる。しかしながら、TimingブロックのWaveformTable内の波形文字が変更されないか、又はTiming-Mapブロック内のWaveformSelectorマッピングが変更されない場合には、そのパターンをコンパイルし直す必要はない。
[このマッピング方法を用いる例]
テスタDigital Moduleへのマッピングを例示するために、以下のことが仮定される。フレームプロセッサはFPモードにセットされる。CTV及びMTVビットは、GTSビットの全数が6であり、Timing Bank Selectorビットの総数が4であるようにセットされる。
Timingブロックにおいて定義される各WaveformTableは、Timingファイル内の個別のLTSにマッピングされる。これはピン毎に行われる。こうして、WaveformTable seq1はLTS1にマッピングされる。「SIG」ピンの場合には、全部で8個の取り得る波形エントリを使い果たす。しかしながら、「CLK」ピンは、ただ1つの波形エントリを必要とし、それゆえ、Waveformメモリ(WFT)及びWaveform Timingメモリ(WTM)内のただ1つの行を使い果たす。
「SIG」ピンの最初の2つの物理的な波形のマッピングが図11に示される。このWaveformTableはエッジの個別の構成を必要とする2つの波形文字をマッピングするので、Waveformメモリ(WFT)1112及びWaveform Timingメモリ(WTM)1114において2つのエントリを割り当てることにする。波形の形状はWFMに格納され、タイミングの詳細はWTMに格納される。そのモジュールの一実施形態は、T1、T2、T3、T4、T5及びT6の全部で6個のタイミングエッジを有する。これらは、TimingブロックのEdge Resourceセクション内の波形において定義されるEvent E1、E2、...に直にマッピングする。7個以上のイベントがTimingブロックにおいて定義され、上記のモジュールとともに用いられる場合には、エラーが生じるであろう。
図11の例では、第1の波形文字「0」はTiming Edge T1を用いて、「Force Down」又は「D」イベントをプログラミングし、それはそのサイクル内の10nsにおいて生じる。Timing Edge T2も、時刻30nsにおいて「Force Down」又は「D」イベントを生成するために用いられる。最後に、Timing Edge T3は、時刻45nsにおいて「Force Off」又は「Z」イベントを生成するために用いられる。
第2の波形文字「1」はTiming Edge T1を用いて、「Force Up」又は「U」イベントをプログラミングし、それはそのサイクル内の10nsにおいて生じる。Timing Edge T2も、時刻30nsにおいて「Force Down」又は「D」イベントを生成するために用いられる。最後に、Timing Edge T3は、時刻45nsにおいて「Force Off」又は「Z」イベントを生成するために用いられる。
このようにして、WFCは、フレームプロセッサのWFMメモリ及びWTMメモリにマッピングされる。ピン「SIG」のためのLTS1のWaveform Memory WFMの最後の設定が以下の表2に示される。
Figure 2007528993
ピン「SIG」のためのLTS1のWaveform Timing Memory WTMの最後の設定が以下の表3に示される。
Figure 2007528993
「CLK」ピンはただ1つの波形を使い果たすので、このピンのためのWFM及びWFTは非常に簡単である。「CLK」ピンのためのLTS1のWaveform Memory WFMの最後の設定が以下の表4に示される。
Figure 2007528993
LTS2のWaveform Timing Memory WTMの最後の設定が以下の表5に示される。
Figure 2007528993
TimingMapブロックは、WaveformSelectorをTimingブロックのWaveformテーブルに明示的にマッピングする。或るテスタシステムの場合、これは要するに、Timing Set Scrambler(TSS)メモリを設定することになる。TSSは基本的には、それらの設定を保持する、GTSからLTSへのマッピングを含む。ピンSIGのための本発明の例のためのTSS設定は、以下の表6のようになるであろう。
Figure 2007528993
最後に、TSS及びLTS設定マッピングが分解された後に、Pattern Compilerはこの情報を用いて、用いるための正確な波形テーブル(LTS)及び正確な波形文字を用いてパターンをプログラミングすることができる。こうして、本発明の例による、ピン「SIG」だけを考慮した擬似パターンが図11に示される。このコンパイルはTimingブロックに依存せず、Timing-Mapブロックだけに依存することに留意されたい。
[G.テスタ動作]
このセクションはテスタオペレーティングシステム(TOS)の基本動作を記述する。このセクションにおいて考えられる動作は以下のものである。
・システム初期化
・Test Planローディング
・パターンローディング
・Test Planの実行
・個々のTestの実行
[システム初期化]
一実施形態ではシステムを初期化するために、ある特定の仮定が満たされなければならず、且つある特定の条件が満たされなければならない。以下のサブセクションがこれらを記載する。
[事前条件]
関連するシステムソフトウエアコンポーネントのコピーが中央に格納され、その場所がシステムコントローラに知られている。これは、システムコントローラそのものに存在することができるか、又はネットワーク実装ディレクトリを有する(又は別の仕組みを介してSYSCに知られている)他のシステム上に存在することができ、どのような仕組みであっても、システムが機能することができる前に、システムコントローラが使用するために、全てのソフトウエアが入手できなければならない。このソフトウエアは以下のものを含む。
ベンダハードウエア制御(すなわちモジュールソフトウエア)DLL
標準又はユーザ試験クラスDLL
ユーザ試験計画DLL
システムモジュール構成ファイルはシステムコントローラ上で入手することができる。このファイルによって、ユーザがテスタの物理的な構成、たとえばシステムシャーシ内の各モジュールの物理的な場所及びタイプ、ならびにモジュールソフトウエアDLLの名前を指定できるようになることを思い起こされたい。
システム構成ファイルはシステムコントローラ上で入手することができる。このファイルはシステム内のサイトコントローラのリスト、及びサイトコントローラホスト名のSwitch Matrix入力ポートアドレスへのマップを含むことを思い起こされたい。
サイトコントローラは、Site Configuration Manager(SCM)と呼ばれるサービスを実行する。このサービスは、「ハードウエア発見」と呼ばれるプロセスによって、どんなハードウエアが各スロットにインストールされるかを判定する責任を担う。またそれは、システムコントローラでのシステム初期化プロセスに関与する責任も担う。一実施形態では、Switch Matrix動作プロトコルは、Switch Matrix入力ポート接続アドレス1とともに、ただ1つのSite Controller上のSCMを常に用いて、モジュールに対するSwitch Matrix接続を構成すべきであることに留意されたい。この「特別な」サイトはSITEC-1として表されることを思い起こされたい。
システムコントローラは、各サイトコントローラのSCMに、そのSwitch Matrix接続アドレスを提供する責任を担う。
各サイトコントローラのSCMは、Test Plan Server(TPS)と呼ばれるプロセスを開始することができる。各サイトコントローラ上のTest Plan Serverは最終的に、ユーザの1つの試験計画(又は、1つのサイトコントローラが多数のDUT上で試験を実行している場合には、複数の試験計画)を保持し、実行する責任を担う。
[初期化段階I:システム妥当性検査]
一旦、上記の仮定及び事前条件が満たされたなら、システム初期化は最初に、以下のようなシステム妥当性検査ステップを開始する。
1.システムコントローラが、システム及びモジュール構成ファイルを読み出し、システムのユーザ指定の意図を初期化する。
2.指定されたシステム構成情報を用いて、システムコントローラは、指定されたサイトコントローラが動作中であり、接触可能であり、しかも準備できている(すなわち、SCMを実行している)ことを確認する。この確認ステップ中にエラーがあれば、システムエラーが引き起こされて、初期化は中止されるであろう。
3.その後、システムコントローラは、SITEC−1にあるSCMサービスに、スイッチマトリックスを構成して、全てのハードウエアモジュールにアクセスできるようにすることを指示し、ハードウエア発見を実行するように要求する。
4.SITEC−1におけるSCMサービスは、{vendor,hardware}タプルのための全ての利用可能なモジュールスロット(既知のハードウエアの場所)をポーリングし、{vendor,hardware}タプルのスロットへのマッピングを生成する。したがって、終了時に、このポーリングは、完全なシステム内に存在する完全な1組の{vendor,hardware,slot}結合を特定している。このポーリングの結果はシステムコントローラに送られる。
5.システムコントローラは、上記のハードウエア発見ステップの結果が、モジュール構成ファイル内のユーザ指定の構成と一致することを確認する。この確認ステップ中に何らかのエラーがあれば、システムエラーが引き起こされ、初期化は中止されるであろう。
6.その後、システムコントローラは、周知の場所(複数の場合もあり)において環境設定ファイル(複数の場合もあり)からデフォルト環境(モジュールDLLを探すための探索経路、パターンリスト、パターン、試験計画DLL、試験クラスDLL等)をロードする。
7.システムコントローラは、全ての特定されたモジュールソフトウエアDLLが存在することを確実にする。システムコントローラ上で入手できない場合には、可能であるなら、中央記憶装置から検索される。そうでない場合には、システムエラーが引き起こされ、初期化が中止される。
[初期化段階II:サイト構成(オプション)]
サイト構成、すなわちサイト分割は、利用可能なシステムハードウエアモジュールを種々のサイトに(すなわち、多数のDUTにサービスするために)ソフトウエアレベルで割り当てることを含む。サイト分割情報はソケットファイルにおいて提供されることを思い起こされたい。
テスタシステムによって、試験計画ロードの一部として(各試験計画は特定のソケットに関連するため)、且つ個別のユーザコール可能なステップとして、サイト(再)分割が実行されるようになる。後者の場合、ユーザは、システムを分割するためにのみ用いられるソケットファイルを提供することにより、サイト分割を開始する。これは、各サイトが異なるDUTタイプを試験するマルチDUT試験の場合のシステム初期化中に特に有用である。しかしながら、このステップは、初期化段階ではオプションであり、ユーザはそれを実行しないように選択し、代わりに、試験計画ロードがシステムを適当に分割できるようにすることを選択することができる。
サイト分割を達成するためにどの手段が選択されるにしても(個別のコールによるか、又は試験計画ロードを通して暗黙的に)、その仕組みは同じである。この仕組みが以下に記載される。
1.ソケットが与えられるとき、システムコントローラは最初に、現時点で存在しているシステム分割がソケットに適合するか否か、又は再分割が必要であるか否かを判定する。初期化中のデフォルト分割は、全ての利用可能なモジュールがSITEC−1に接続される分割である。以下の残りのステップは、再分割が必要とされる場合のみ実行される。
2.システムコントローラは各サイトコントローラSCMに構成メッセージを送り、新たなソケットの下でそのために使用可能にされるDUTサイトの数及び識別でそのものを再構成する。これは一般的な手順であり、1つのサイトコントローラによって制御されるDUTサイトの数が1つである場合を取り扱うことに留意されたい。新たなソケット情報はSCMにも伝達される。
3.各SCMは、もしあれば、実行中のTPSを停止して、新たなTPSを開始し、新たなソケットと、新たなソケットの下でそのために使用可能にされるDUTサイトの数及び識別とを用いてそれを初期化する。
4.システムコントローラは、どのサイトが、必要とされるシステムモジュールのどのサブセットを必要とするかを判定する。これを行いながら、システムコントローラはサイトのためのハードウエアスロット情報も準備する。サイト毎の最終的な結果は、そのサイトに割り当てられるモジュールDLLに対するスロットのリストである。このサイト特有のリストは、Site Module DLL Slot List(SITE-MDSL)として表されるであろう。
5.システムコントローラは適当なSITE-MDSL、及び必要なモジュールDLLを各SCMに提供する。各SCMはさらに、新たに開始されたTPSがこの情報を入手できるようにする。
6.その後、システムコントローラは、適当なサイト−スロット間接続のために、すなわち、サイト分割作業のために、SITEC-1にSwitch Matrixを構成するように要求する。
7.サイト1〜n上のTPSは、そのSITE-MDSLにおいて指定されるDLLをロードする。これらの各DLLは、initialize()という名前の関数を有し、その関数はスロット番号のアレイを取得する。TPSは、そのモジュールタイプのための適当なスロットリストでinitialize()をコールする。この時点で誤動作があれば、システムエラーが引き起こされて、初期化が中止される。initialize()メソッドは以下のことを行う。
a.標準インターフェースIXXXModuleに基づいて具体的なクラスを作成する。たとえば、或るデジタルモジュールに関連するDLLは、それが関連する各スロットにサービスするために、1つのIPinModuleベースオブジェクトを作成するであろう。
b.インターフェースIResourceに基づいて、そのモジュール内の「資源ユニット」毎に1つの複数の具体的なクラスを作成する。再び、或るデジタルモジュールの場合、各IPinModuleベースオブジェクトは、デジタルモジュールによって占有されるスロットのコレクション内の全てのピンのためのITesterPinベースオブジェクトを作成するであろう。
8.その後、サイト1〜n上のTPSは、ロードされた各モジュールDLLにおいてgetXXXModule()をコールし、モジュール内容情報を検索する。
9.getXXXModule()へのコールの度に、
IModuleポインタとして<VendorHWType>Moduleクラスオブジェクトが返される(たとえば、AdvantestPinModule)。そのような各IModuleポインタはTPSによってキャッシュされ、TPSは、フレームワーク/ユーザコードがこれらを入手できるようにする。IModule、IResource等のコレクションは永続的である(少なくともTPSの寿命にわたって)ことに留意されたい。
10.一旦、上記のステップが完了したなら、TPSは、その割り当てられた(既知の)ポートにおいて、listen()を開始する。これは、TPSが標準(すなわちサイト分割された)動作を開始する「準備ができている」ことを、システムコントローラに伝える。
[試験計画ロード]
このセクションは、ユーザTest Plan DLLがサイトコントローラ上にロードされる(1つ又は複数のDUT試験のために)ステップを記述する。
一旦、システム初期化(及びオプションで初期サイト分割)が完了したなら、ユーザ試験計画をロードすることができる。ユーザ試験計画のサイトコントローラ上へのローディングは、以下のように進められる。
1.システムコントローラは最初に、試験計画DLLをその自らの処理空間内にロードし、それに、関連するソケットファイル及びDUTタイプ識別子を問い合わせる。この情報を用いて、この試験計画を実行するサイト(複数の場合もあり)、それゆえこの試験計画がロードされることになるサイトコントローラ(複数の場合もあり)が特定される。
2.その後、システムコントローラは、その試験計画に関連するソケット情報を用いて、先に略述されたような再分割プロセスを開始する。
3.システムコントローラは、試験計画DLLから、試験計画によって用いられる試験クラスDLLのリストを抽出し、一旦、システムコントローラが、TPSが標準(すなわち、サイト分割された)動作を開始する準備ができていることを確認したなら、試験クラスDLLを、そして最後に、試験Plan DLLそのものを適当なTPSに送出する。
4.TPSはLoadLibrary()をコールして、それを処理空間にロードする。それは、DLLにおいて周知の関数をコールして、それがサービスするサイト(すなわちDUT)の数と同じ数の試験計画オブジェクトを作成する。
5.TPSは、必要なテスタフレームワークオブジェクトで試験計画オブジェクト(複数の場合もあり)を初期化する。初期化中に、TPSは、試験計画オブジェクト(複数の場合もあり)によって用いられる試験クラスに適したDLLを処理空間にロードし、試験クラスインスタンスを作成する。
6.TPSはシステムコントローラに対する通信チャネルを試験計画オブジェクト(複数の場合もあり)に設定する。
7.システムコントローラはTPSと通信し、試験計画オブジェクト(複数の場合もあり)のためのプロキシを構築する。
その結果として、サイトコントローラ上のユーザの試験計画のロードに成功する。
[試験計画の実行]
予め定義されたフローロジックにしたがって試験計画内の全ての試験を実行するための方法は以下のとおりである。
1.ユーザのアプリケーションがRunTestPlanメッセージをTPSに送信する。TPSはExecutingTestPlanメッセージを全ての接続されたアプリケーションに送る。その後、TPSはTest Plan上でexecute()をコールする。
2.1つのサイトコントローラで多数のDUTを試験することは、そのサイトコントローラ上で、DUT当たり1つの多数のスレッドを用いて実行される。各スレッドは、同じ試験計画オブジェクトの異なる個別のインスタンスを実行する。この場合には、モジュール制御ソフトウエアDLLを複数のDUTにわたって共有することができるので、DUT識別子パラメータを取得するために、ハードウエア通信のためのモジュールコマンドが必要とされる。
3.試験計画オブジェクトは、そのコレクション内の各試験にわたって繰り返され(別法では、そのFlowオブジェクトに、フローロジックに従って各試験を処理するように指示し)、preExec()、execute()及びpostExec()をコールする。
4.各試験が実行されるとき、全ての接続されるアプリケーションに対してステータスメッセージが返送される。
[単一の試験の実行]
ユーザは、全ての試験ではなく、1つの試験計画内のただ1つの試験を実行したい場合もある。ただ1つの試験を実行する場合、その方法は以下のとおりである。
1.ユーザアプリケーションがRunTestメッセージをTPSに送信する。TPSはExecutingTestメッセージを全ての接続されるアプリケーションに送る。その後、TPSは、Test PlanにおいてexecuteTest()をコールし、実行するための試験を指定する。
2.Test Planオブジェクトは、その試験オブジェクトにおいてpreExec()、execute()及びpostExec()をコールすることにより、指定された試験を実行する。
3.その試験が実行されるとき、それは全ての接続されるアプリケーションにステータスメッセージを返送する。
開示される方法によって、試験プログラムを開発する際に少なくとも2つの利点が達成される。第一に、その方法は、その試験計画が扱うことを目的としている問題領域に近い言語において試験計画を記述することにより、システムプログラミングの複雑さを試験計画開発者から切り離す。第二に、その方法によれば、試験技師は試験プログラム開発の早期の段階において試験計画のエラーを特定できるようになり、試験プログラム及び試験される対応するDUTの開発時間を短縮することができる。
同じ基本的な根底にある仕組み及び方法をこれまでどおり利用しながら、開示される実施形態の多数の実現可能な変更及び組み合わせを用いることができることは、関連技術分野の熟練者(当業者)には理解されよう。上記の記述は、説明することを目的としており、特定の実施形態を参照しながら記述されてきた。しかしながら、上記の例示的な説明は、本発明を包括的に述べることや、本発明を開示される形態と全く同じものに限定することは意図していない。上記の教示に鑑みて、数多くの変更及び変形が可能である。それらの実施形態は、本発明の原理及びその実用的な応用形態を説明するために、且つ当業者が考えている特定の用途に相応しいように、種々の変更を加えて本発明及び種々の実施形態を最大限に利用できるようにするために選択され、説明された。
従来のテスタアーキテクチャを示す図である。 本発明の一実施形態による、テスタアーキテクチャを示す図である。 本発明の一実施形態による、テスタソフトウエアアーキテクチャを示す図である。 本発明の一実施形態による、試験プログラムコンパイラを示す図である。 本発明の一実施形態による、単一の試験クラスから種々の試験インスタンスを如何に導出することができるかを示す図である。 本発明の一実施形態による、パターンコンパイラを示す図である。 本発明の一実施形態による、順序パターン木の例を示す図である。 本発明の一実施形態による、別の順序パターン木の例を示す図である。 本発明の一実施形態による、試験プログラムによって必要とされるファイル間の関係を示す図である。 本発明の一実施形態による、波形発生を示す図である。 本発明の一実施形態による、タイミングのために用いられるマッピングを示す図である。 本発明の一実施形態による、タイミングのために用いられる別のマッピングを示す図である。 本発明の一実施形態による、試験プログラムを開発するための方法を示す図である。

Claims (32)

  1. 半導体試験システムのための試験プログラムを開発するための方法であって、該試験システムは、該試験プログラムに従って被試験デバイスに少なくとも1つの試験を適用するための少なくとも1つの試験モジュールを含み、該方法は、
    試験プログラム言語(TPL)において試験計画ファイルを記述することであって、該試験計画ファイルは前記試験プログラムの少なくとも1つの試験を記述する、記述すること、
    システムプログラム言語(SPL)において試験クラスファイルを記述し、前記TPLにおいて該試験クラスファイルの対応するプリヘッダファイルを記述することであって、該試験クラスファイルは前記試験プログラムの前記少なくとも1つの試験のインプリメンテーションを記述する、記述すること、及び
    前記試験計画ファイル、前記試験クラスファイル及び前記プリヘッダファイルを用いて前記試験プログラムを生成すること
    を含む、半導体試験システムのための試験プログラムを開発するための方法。
  2. 前記システムプログラム言語はC/C++である、請求項1に記載の方法。
  3. 前記試験プログラムを生成することは、
    TPLコンパイラによって前記試験計画ファイルをコンパイルすることであって、それによって、前記SPLにおいて記述される導出試験計画ファイルを構成する、前記試験計画ファイルをコンパイルすること、及び
    前記TPLコンパイラによって前記プリヘッダファイルをコンパイルすることであって、それによって、前記SPLにおいて記述されるヘッダファイルを構成する、前記プリヘッダファイルをコンパイルすること
    を含む、請求項1に記載の方法。
  4. 前記試験計画ファイルをコンパイルすることは、
    前記試験計画ファイルを前記TPLから前記SPLに翻訳すること、及び
    前記プリヘッダファイルを用いて前記試験計画ファイルの妥当性を検査すること
    を含む、請求項3に記載の方法。
  5. 前記プリヘッダファイルをコンパイルすることは、
    前記ヘッダファイル内に、前記プリヘッダファイルのパラメータセクションにおいて記述されるパラメータを挿入すること、及び
    前記ヘッダファイル内に、前記プリヘッダファイルのテンプレートセクションにおいて参照されるソースコードを挿入すること
    を含む、請求項3に記載の方法。
  6. SPLコンパイラによって前記導出試験計画ファイルをコンパイルすることであって、それによって、試験計画オブジェクトファイルを構成し、該試験計画オブジェクトファイルは前記ヘッダファイルを参照する、前記導出試験計画ファイルをコンパイルすること、及び
    前記SPLコンパイラによって前記試験クラスファイルをコンパイルすることであって、それによって、試験クラスオブジェクトファイルを構成し、前記SPLコンパイラは前記ヘッダファイルを用いて、前記試験クラスオブジェクトファイルを構成する、前記試験クラスファイルをコンパイルすること
    をさらに含む、請求項3に記載の方法。
  7. 前記試験計画オブジェクトファイル及び前記試験クラスオブジェクトファイルをリンクすることであって、それによって、前記試験プログラムを構成する、リンクすることをさらに含み、該試験プログラムは前記半導体試験システムによって実行可能である、請求項6に記載の方法。
  8. 半導体試験システムのための試験プログラムを生成するためのプリヘッダであって、
    前記試験プログラムの少なくとも1つの属性を指定するためのパラメータセクションと、
    前記試験プログラムのヘッダファイル内にソースコードを挿入するためのテンプレートセクションと
    を含む、半導体試験システムのための試験プログラムを生成するためのプリヘッダ。
  9. 前記試験プログラムの前記少なくとも1つの属性は1つのパターンリスト及び1つの試験条件に関連する、請求項8に記載のプリヘッダ。
  10. 前記パターンリストは、
    基数、
    トレースレベル、
    メンバ名、
    セット関数、及び
    パラメータ記述
    のうちの少なくとも1つのパラメータを含む、請求項9に記載のプリヘッダ。
  11. 前記試験条件は、
    基数、
    トレースレベル、
    メンバ名、
    セット関数、及び
    パラメータ記述
    のうちの少なくとも1つのパラメータを含む、請求項9に記載のプリヘッダ。
  12. 前記テンプレートセクションは、
    クラス名、
    インポート宣言、
    パラメータアレイタイプ、
    パラメータ属性、
    パラメータ関数、及び
    パラメータ関数インプリメンテーション
    を含む、請求項8に記載のプリヘッダ。
  13. ヘッダファイルを生成するために試験プログラム言語(TPL)コンパイラによって用いられ、前記ヘッダファイルはシステムプログラム言語(SPL)において記述される、請求項8に記載のプリヘッダ。
  14. 前記ヘッダファイルは、試験クラスオブジェクトファイルを生成するために、SPLコンパイラによって用いられ、前記ヘッダファイルは、試験計画オブジェクトファイルを生成するために前記SPLコンパイラによって参照される、請求項13に記載のプリヘッダ。
  15. 前記試験プログラムにおいてユーザ定義の試験をサポートするために用いられる、請求項8に記載のプリヘッダ。
  16. 半導体試験システムのための試験プログラムの妥当性を検査するための方法であって、該試験システムは、該試験プログラムに従って被試験デバイスに少なくとも1つの試験を適用するための少なくとも1つの試験モジュールを含み、該方法は、
    試験プログラム言語(TPL)において試験計画ファイルを記述することであって、該試験計画ファイルは前記試験プログラムの少なくとも1つの試験を記述する、記述すること、
    前記TPLにおいてプリヘッダファイルを記述すること、及び
    前記プリヘッダファイルを用いて前記試験計画ファイルの妥当性を検査すること
    を含む、半導体試験システムのための試験プログラムの妥当性を検査するための方法。
  17. 前記プリヘッダファイルは、
    前記試験プログラムの少なくとも1つの属性を指定するためのパラメータセクションと、
    前記試験プログラムのヘッダファイル内にソースコードを挿入するためのテンプレートセクションとを含む、請求項16に記載の方法。
  18. 前記試験プログラムの前記少なくとも1つの属性はパターンリスト及び試験条件に関連する、請求項17に記載のプリヘッダ。
  19. 前記試験計画ファイルの妥当性を検査することは、前記試験計画ファイルの意味を検査することを含む、請求項16に記載の方法。
  20. 前記試験計画ファイルの妥当性を検査することは、前記試験計画ファイルの試験エンティティ属性を検査することをさらに含む、請求項16に記載の方法。
  21. 前記試験計画ファイルの妥当性を検査することは、前記試験計画の関数コール及びその対応するパラメータを検査することをさらに含む、請求項16に記載の方法。
  22. 半導体試験システムであって、
    被試験デバイスに少なくとも1つの試験を適用するための少なくとも1つの試験モジュールと、
    試験計画ファイル、試験クラスファイル及び該試験クラスファイルの対応するプリヘッダファイルとを受信するためのコントローラであって、該試験計画ファイルは試験プログラム言語(TPL)において前記少なくとも1つの試験を記述し、前記試験クラスファイルはシステムプログラム言語(SPL)において前記少なくとも1つの試験のインプリメンテーションを記述する、コントローラと、
    前記試験計画ファイル及び前記プリヘッダファイルをコンパイルする手段であって、それによって、それぞれ導出試験計画ファイル及びヘッダファイルを構成する、前記試験計画ファイル及び前記プリヘッダファイルをコンパイルする手段と、
    前記試験クラスファイル、前記導出試験計画ファイル及び前記ヘッダファイルを用いて試験プログラムを生成する手段と
    を備える、半導体試験システム。
  23. 前記プリヘッダファイルは、
    前記試験プログラムの少なくとも1つの属性を指定するためのパラメータセクションと、
    前記試験プログラムの前記ヘッダファイル内にソースコードを挿入するためのテンプレートセクションと
    を含む、請求項22に記載の半導体試験システム。
  24. 前記試験プログラムの前記少なくとも1つの属性は1つのパターンリスト及び1つの試験条件に関連する、請求項23に記載の半導体試験システム。
  25. 前記パターンリストは、
    基数、
    トレースレベル、
    メンバ名、
    セット関数、及び
    パラメータ記述
    のうちの少なくとも1つのパラメータを含む、請求項24に記載の半導体試験システム。
  26. 前記試験条件は、
    基数、
    トレースレベル、
    メンバ名、
    セット関数、及び
    パラメータ記述
    のうちの少なくとも1つのパラメータを含む、請求項24に記載の半導体試験システム。
  27. 前記テンプレートセクションは、
    クラス名、
    インポート宣言、
    パラメータアレイタイプ、
    パラメータ属性、
    パラメータ関数、及び
    パラメータ関数インプリメンテーション
    を含む、請求項23に記載の半導体試験システム。
  28. 前記システムプログラム言語はC/C++である、請求項22に記載の半導体試験システム。
  29. 前記システム計画ファイルをコンパイルする手段は、
    前記試験計画ファイルを前記TPLから前記SPLに翻訳する手段と、
    前記プリヘッダファイルを用いて前記試験計画の妥当性を検査する手段と
    を備える、請求項22に記載の半導体試験システム。
  30. 前記プリヘッダファイルをコンパイルする手段は、
    前記ヘッダファイル内に、前記プリヘッダファイルのパラメータセクションにおいて記述されるパラメータを挿入する手段と、
    前記ヘッダファイル内に、前記プリヘッダファイルのテンプレートセクションにおいて参照されるソースコードを挿入する手段と
    を備える、請求項22に記載の半導体試験システム。
  31. 前記試験プログラムを生成する手段は、
    前記導出試験計画ファイルをコンパイルする手段であって、それによって、試験計画オブジェクトファイルを構成し、該試験計画オブジェクトファイルは前記ヘッダファイルを参照する、前記導出試験計画ファイルをコンパイルする手段と、
    前記試験クラスファイルをコンパイルする手段であって、それによって、試験クラスオブジェクトファイルを構成し、前記ヘッダファイルを用いて、前記試験クラスオブジェクトファイルを構成する、前記試験クラスファイルをコンパイルする手段と
    をさらに備える、請求項22に記載の半導体試験システム。
  32. 前記試験計画オブジェクトファイル及び前記試験クラスオブジェクトファイルをリンクする手段であって、それによって、試験プログラムを構成する、リンクする手段をさらに備え、該試験プログラムは前記半導体試験システムによって実行可能である、請求項31に記載の半導体試験システム。
JP2006519571A 2004-05-22 2005-05-23 半導体試験システム、試験プログラムを生成するための方法、及びプリヘッダ Expired - Fee Related JP4516961B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US57357704P 2004-05-22 2004-05-22
US10/918,714 US7197417B2 (en) 2003-02-14 2004-08-13 Method and structure to develop a test program for semiconductor integrated circuits
PCT/JP2005/009813 WO2005114235A2 (en) 2004-05-22 2005-05-23 Method and structure to develop a test program for semiconductor integrated circuits

Publications (3)

Publication Number Publication Date
JP2007528993A true JP2007528993A (ja) 2007-10-18
JP2007528993A5 JP2007528993A5 (ja) 2010-02-12
JP4516961B2 JP4516961B2 (ja) 2010-08-04

Family

ID=34975206

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2006519571A Expired - Fee Related JP4516961B2 (ja) 2004-05-22 2005-05-23 半導体試験システム、試験プログラムを生成するための方法、及びプリヘッダ

Country Status (6)

Country Link
US (1) US7197417B2 (ja)
EP (1) EP1756601B1 (ja)
JP (1) JP4516961B2 (ja)
KR (1) KR20070014206A (ja)
TW (1) TWI365387B (ja)
WO (1) WO2005114235A2 (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013531779A (ja) * 2010-05-05 2013-08-08 テラダイン、 インコーポレイテッド 半導体デバイスの同時試験のためのシステム
KR20200063987A (ko) * 2018-11-28 2020-06-05 도쿄엘렉트론가부시키가이샤 검사 장치, 메인터넌스 방법, 및 프로그램

Families Citing this family (60)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7437261B2 (en) * 2003-02-14 2008-10-14 Advantest Corporation Method and apparatus for testing integrated circuits
US7184917B2 (en) 2003-02-14 2007-02-27 Advantest America R&D Center, Inc. Method and system for controlling interchangeable components in a modular test system
US7197417B2 (en) * 2003-02-14 2007-03-27 Advantest America R&D Center, Inc. Method and structure to develop a test program for semiconductor integrated circuits
US7340364B1 (en) * 2003-02-26 2008-03-04 Advantest Corporation Test apparatus, and control method
CN1567223A (zh) * 2003-07-09 2005-01-19 松下电器产业株式会社 程序生成装置、方法及程序
US7430486B2 (en) * 2004-05-22 2008-09-30 Advantest America R&D Center, Inc. Datalog support in a modular test system
US7210087B2 (en) * 2004-05-22 2007-04-24 Advantest America R&D Center, Inc. Method and system for simulating a modular test system
US7197416B2 (en) * 2004-05-22 2007-03-27 Advantest America R&D Center, Inc. Supporting calibration and diagnostics in an open architecture test system
KR100548199B1 (ko) * 2004-07-15 2006-02-02 삼성전자주식회사 아날로그/디지털 혼합 신호 반도체 디바이스 테스트 장치
US8725748B1 (en) * 2004-08-27 2014-05-13 Advanced Micro Devices, Inc. Method and system for storing and retrieving semiconductor tester information
US7865880B2 (en) * 2004-11-16 2011-01-04 Lsi Corporation System and/or method for implementing efficient techniques for testing common information model providers
US8484618B2 (en) 2005-01-12 2013-07-09 Advanced Testing Technologies, Inc. Test program set obsolescence mitigation through software and automatic test equipment processes
US7624379B2 (en) * 2005-01-12 2009-11-24 Advanced Testing Technologies, Inc. Test program set obsolescence mitigation through software and automatic test equipment system processes
US8214800B2 (en) * 2005-03-02 2012-07-03 Advantest Corporation Compact representation of vendor hardware module revisions in an open architecture test system
US7254508B2 (en) * 2005-04-29 2007-08-07 Teradyne, Inc. Site loops
US7487422B2 (en) * 2005-04-29 2009-02-03 Teradyne, Inc. Delayed processing of site-aware objects
US7253607B2 (en) * 2005-04-29 2007-08-07 Teradyne, Inc. Site-aware objects
JP4427002B2 (ja) * 2005-05-20 2010-03-03 株式会社アドバンテスト 半導体試験用プログラムデバッグ装置
US7528622B2 (en) * 2005-07-06 2009-05-05 Optimal Test Ltd. Methods for slow test time detection of an integrated circuit during parallel testing
US7458043B1 (en) * 2005-09-15 2008-11-25 Unisys Corporation Generation of tests used in simulating an electronic circuit design
US7567947B2 (en) 2006-04-04 2009-07-28 Optimaltest Ltd. Methods and systems for semiconductor testing using a testing scenario language
US10838714B2 (en) * 2006-04-24 2020-11-17 Servicenow, Inc. Applying packages to configure software stacks
US7590903B2 (en) * 2006-05-15 2009-09-15 Verigy (Singapore) Pte. Ltd. Re-configurable architecture for automated test equipment
US7532024B2 (en) * 2006-07-05 2009-05-12 Optimaltest Ltd. Methods and systems for semiconductor testing using reference dice
US7558770B2 (en) * 2006-08-23 2009-07-07 International Business Machines Corporation Method and system to detect application non-conformance
US8359585B1 (en) 2007-01-18 2013-01-22 Advanced Testing Technologies, Inc. Instrumentation ATS/TPS mitigation utilizing I/O data stream
US7761471B1 (en) * 2007-10-16 2010-07-20 Jpmorgan Chase Bank, N.A. Document management techniques to account for user-specific patterns in document metadata
US7809520B2 (en) * 2007-11-05 2010-10-05 Advantest Corporation Test equipment, method for loading test plan and program product
US20090319997A1 (en) * 2008-06-20 2009-12-24 Microsoft Corporation Precondition rules for static verification of code
WO2010055964A1 (en) * 2008-11-17 2010-05-20 Industry-University Cooperation Foundation Hanyang University Method of testing semiconductor device
US8149721B2 (en) * 2008-12-08 2012-04-03 Advantest Corporation Test apparatus and test method
US20110012902A1 (en) * 2009-07-16 2011-01-20 Jaganathan Rajagopalan Method and system for visualizing the performance of applications
KR101028359B1 (ko) * 2009-12-10 2011-04-11 주식회사 이노와이어리스 스크립트를 이용한 dut 자동화 테스트 장치
US10089119B2 (en) 2009-12-18 2018-10-02 Microsoft Technology Licensing, Llc API namespace virtualization
US8776014B2 (en) 2010-09-23 2014-07-08 Microsoft Corporation Software build analysis
JP5626786B2 (ja) * 2010-11-09 2014-11-19 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation ソフトウエア開発支援方法とソフトウエア開発支援装置とソフトウエア開発支援プログラム
TW201301135A (zh) * 2011-06-16 2013-01-01 Hon Hai Prec Ind Co Ltd 零件資料轉檔系統及方法
EP2557501B1 (en) * 2011-08-11 2016-03-16 Intel Deutschland GmbH Circuit arrangement and method for testing same
US8776094B2 (en) 2011-08-11 2014-07-08 Microsoft Corporation Runtime system
US8695021B2 (en) 2011-08-31 2014-04-08 Microsoft Corporation Projecting native application programming interfaces of an operating system into other programming languages
US9217772B2 (en) * 2012-07-31 2015-12-22 Infineon Technologies Ag Systems and methods for characterizing devices
US8789006B2 (en) * 2012-11-01 2014-07-22 Nvidia Corporation System, method, and computer program product for testing an integrated circuit from a command line
CN103092156B (zh) * 2012-12-26 2016-02-10 莱诺斯科技(北京)有限公司 设备可替换型自动化测试系统及方法
US9785542B2 (en) * 2013-04-16 2017-10-10 Advantest Corporation Implementing edit and update functionality within a development environment used to compile test plans for automated semiconductor device testing
US9785526B2 (en) * 2013-04-30 2017-10-10 Advantest Corporation Automated generation of a test class pre-header from an interactive graphical user interface
US10635504B2 (en) 2014-10-16 2020-04-28 Microsoft Technology Licensing, Llc API versioning independent of product releases
WO2016066950A1 (fr) * 2014-10-30 2016-05-06 Spherea Test & Services Banc et logiciel pour tester un appareillage electrique, notamment un calculateur
EP3032270A1 (en) * 2014-12-12 2016-06-15 Airbus Defence and Space, S.A. Method and system for performing electrical tests to complex devices
KR101688632B1 (ko) * 2015-07-31 2016-12-22 한국전자통신연구원 라이브러리 적재 탐지를 위한 방법 및 장치
US10095596B1 (en) * 2015-12-18 2018-10-09 Amazon Technologies, Inc. Executing integration tests in a distributed load and performance evaluation framework
US9733930B2 (en) * 2015-12-21 2017-08-15 Successfactors, Inc. Logical level difference detection between software revisions
US10191736B2 (en) * 2017-04-28 2019-01-29 Servicenow, Inc. Systems and methods for tracking configuration file changes
TWI676906B (zh) * 2018-04-13 2019-11-11 和碩聯合科技股份有限公司 提示方法及其電腦系統
KR102583174B1 (ko) 2018-06-12 2023-09-26 삼성전자주식회사 테스트 인터페이스 보드, 이를 포함하는 테스트 시스템 및 이의 동작 방법
US11159303B1 (en) 2018-11-20 2021-10-26 Mitsubishi Electric Corporation Communication system, list distribution station, communication method, and computer readable medium
US11182265B2 (en) * 2019-01-09 2021-11-23 International Business Machines Corporation Method and apparatus for test generation
CN110082666B (zh) * 2019-04-10 2022-02-22 杭州微纳核芯电子科技有限公司 芯片测试分析方法、装置、设备及存储介质
CN111880079B (zh) * 2020-07-24 2022-12-13 安测半导体技术(江苏)有限公司 一种芯片测试监控方法及服务器
CN112100954A (zh) * 2020-08-31 2020-12-18 北京百度网讯科技有限公司 验证芯片的方法、装置和计算机存储介质
CN113051114A (zh) * 2021-03-19 2021-06-29 无锡市软测认证有限公司 一种用于提高芯片测试效率的方法

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2001067395A (ja) * 1999-06-28 2001-03-16 Advantest Corp イベントベース半導体試験システム及びlsiデバイス設計試験システム
JP2003173266A (ja) * 2001-12-05 2003-06-20 Mitsubishi Electric Corp プログラム生成システム、プログラム変換システム、プログラム変換方法、半導体装置開発システム、記録媒体及びプログラム
US20030217343A1 (en) * 2002-04-11 2003-11-20 Rochit Rajsuman Manufacturing method and apparatus to avoid prototype-hold in ASIC/SOC manufacturing
JP3939336B2 (ja) * 2003-02-14 2007-07-04 株式会社アドバンテスト 半導体集積回路用のテストプログラムを開発する方法および構造
EP1756601B1 (en) * 2004-05-22 2009-12-09 Advantest Corporation Method and structure to develop a test program for semiconductor integrated circuits

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0143623A3 (en) * 1983-11-25 1987-09-23 Mars Incorporated Automatic test equipment
US5488573A (en) 1993-09-02 1996-01-30 Matsushita Electric Industrial Co., Ltd. Method for generating test programs
US5892949A (en) 1996-08-30 1999-04-06 Schlumberger Technologies, Inc. ATE test programming architecture
US6182258B1 (en) 1997-06-03 2001-01-30 Verisity Ltd. Method and apparatus for test generation during circuit design
US6028439A (en) 1997-10-31 2000-02-22 Credence Systems Corporation Modular integrated circuit tester with distributed synchronization and control
US6195774B1 (en) 1998-08-13 2001-02-27 Xilinx, Inc. Boundary-scan method using object-oriented programming language
US6601018B1 (en) 1999-02-04 2003-07-29 International Business Machines Corporation Automatic test framework system and method in software component testing
US6427223B1 (en) 1999-04-30 2002-07-30 Synopsys, Inc. Method and apparatus for adaptive verification of circuit designs
US6405364B1 (en) 1999-08-31 2002-06-11 Accenture Llp Building techniques in a development architecture framework
US6779140B2 (en) 2001-06-29 2004-08-17 Agilent Technologies, Inc. Algorithmically programmable memory tester with test sites operating in a slave mode
US7437261B2 (en) 2003-02-14 2008-10-14 Advantest Corporation Method and apparatus for testing integrated circuits
US7184917B2 (en) 2003-02-14 2007-02-27 Advantest America R&D Center, Inc. Method and system for controlling interchangeable components in a modular test system

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2001067395A (ja) * 1999-06-28 2001-03-16 Advantest Corp イベントベース半導体試験システム及びlsiデバイス設計試験システム
JP2003173266A (ja) * 2001-12-05 2003-06-20 Mitsubishi Electric Corp プログラム生成システム、プログラム変換システム、プログラム変換方法、半導体装置開発システム、記録媒体及びプログラム
US20030217343A1 (en) * 2002-04-11 2003-11-20 Rochit Rajsuman Manufacturing method and apparatus to avoid prototype-hold in ASIC/SOC manufacturing
JP3939336B2 (ja) * 2003-02-14 2007-07-04 株式会社アドバンテスト 半導体集積回路用のテストプログラムを開発する方法および構造
EP1756601B1 (en) * 2004-05-22 2009-12-09 Advantest Corporation Method and structure to develop a test program for semiconductor integrated circuits

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013531779A (ja) * 2010-05-05 2013-08-08 テラダイン、 インコーポレイテッド 半導体デバイスの同時試験のためのシステム
JP2016105103A (ja) * 2010-05-05 2016-06-09 テラダイン、 インコーポレイテッド 半導体デバイスの同時試験のためのシステム
KR20200063987A (ko) * 2018-11-28 2020-06-05 도쿄엘렉트론가부시키가이샤 검사 장치, 메인터넌스 방법, 및 프로그램
KR102184429B1 (ko) 2018-11-28 2020-11-30 도쿄엘렉트론가부시키가이샤 검사 장치, 메인터넌스 방법, 및 프로그램

Also Published As

Publication number Publication date
WO2005114235A2 (en) 2005-12-01
JP4516961B2 (ja) 2010-08-04
KR20070014206A (ko) 2007-01-31
TWI365387B (en) 2012-06-01
WO2005114235A3 (en) 2006-04-20
EP1756601B1 (en) 2009-12-09
EP1756601A2 (en) 2007-02-28
US7197417B2 (en) 2007-03-27
US20050154551A1 (en) 2005-07-14
TW200617704A (en) 2006-06-01

Similar Documents

Publication Publication Date Title
JP4516961B2 (ja) 半導体試験システム、試験プログラムを生成するための方法、及びプリヘッダ
JP3890079B1 (ja) モジュール式試験システムにおける交換可能コンポーネントを制御するための方法及びシステム
JP4332179B2 (ja) パターンコンパイラ
JP4332200B2 (ja) モジュール式試験システム内のパターンオブジェクトファイルを管理するための方法およびモジュール式試験システム
JP3939336B2 (ja) 半導体集積回路用のテストプログラムを開発する方法および構造
US8255198B2 (en) Method and structure to develop a test program for semiconductor integrated circuits
JP2007528993A5 (ja)
US7809520B2 (en) Test equipment, method for loading test plan and program product
KR20070035507A (ko) 모듈식 테스트 시스템에서 호환성있는 컴포넌트를 제어하는방법 및 시스템
KR20070023762A (ko) 반도체 집적 회로를 위한 테스트 프로그램을 개발하는 방법및 구조
Dollas et al. A KNOWLEDGE BASED ENVIRONMENT FOR INTEGRATED CIRCUIT TESTING

Legal Events

Date Code Title Description
A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20080707

RD13 Notification of appointment of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7433

Effective date: 20090925

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20090925

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20091211

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20100112

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20100305

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20100511

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20100517

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130521

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130521

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130521

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140521

Year of fee payment: 4

LAPS Cancellation because of no payment of annual fees