(57)【要約】【課題】既存のプログラムが行っていた所定の処理を高速かつ精度を落とさずに実行可能なプログラムに変換可能なプログラム変換装置を提供する。【解決手段】字句解析部１１は、第１のプログラミング言語に従って字句を解析し終端記号を送出する。所定入力（出力）端子識別部１１１（１１２）は所定入力（出力）端子を識別する。所定入力（出力）端子構文識別部１２１（１２２）は、所定入力（出力）端子を示す終端記号を含む構文規則を解析する。合致する構文規則があれば変換部１３は第１から第２のプログラミング言語にコード変換する。また、所定入力端子構文識別部１２１又は所定出力端子構文識別部１２２に合致する構文規則があれば、イベント待ち関数挿入部１３１又はディレイ関数挿入部１３２は第２のプログラミング言語中にイベント待ち関数コード又はディレイ関数コードを挿入する。生成部１４は変換されたプログラムコードをファイルに出力する。【選択図】    図１
2004157945.tif 000002
【特許請求の範囲】
【請求項１】
第１のプログラミング言語で記述されたプログラムを、当該第１のプログラミング言語よりも抽象度の高い第２のプログラミング言語のプログラムに変換するプログラム変換装置であって、
前記第１のプログラミング言語により記述されたプログラムコードの字句を解析する字句解析手段と、
前記字句解析手段による解析の結果得られた情報に対して、前記第１のプログラミング言語の構文規則を解析する構文解析手段と、
前記構文解析手段による解析結果に基づいて、前記第１のプログラミング言語により記述されたプログラムコードを第２のプログラミング言語の記述に変換する変換手段と、
前記変換手段によって前記第２のプログラミング言語による記述に変換されたプログラムコードをファイルとして生成する生成手段と、
を備えたことを特徴とするプログラム変換装置。
【請求項２】
前記第１のプログラミング言語により記述されたプログラムコードがハードウェア仕様記述であり、
前記字句解析手段は、前記第１のプログラミング言語により記述されたハードウェア仕様記述の終端記号を識別し、当該識別された終端記号の情報を前記構文解析手段に送出することを特徴とする請求項１記載のプログラム変換装置。
【請求項３】
前記字句解析手段は、前記ハードウェア仕様記述の入力端子のうち、所定の入力端子の終端記号を識別することを特徴とする請求項２記載のプログラム変換装置。
【請求項４】
前記字句解析手段は、前記ハードウェア仕様記述の出力端子のうち、所定の出力端子の終端記号を識別することを特徴とする請求項２記載のプログラム変換装置。
【請求項５】
前記構文解析手段は、前記字句解析手段から送出された情報が示す前記所定の入力端子の終端記号がどの構文規則に合致しているかを解析することを特徴とする請求項２または３記載のプログラム変換装置。
【請求項６】
前記構文解析手段は、前記字句解析手段から送出された情報が示す前記所定の出力端子の終端記号がどの構文規則に合致しているかを解析することを特徴とする請求項２または４記載のプログラム変換装置。
【請求項７】
前記変換手段は、前記構文解析手段が前記所定の入力端子の終端記号を識別すると、前記第２のプログラミング言語による記述に変換されたハードウェア仕様記述にイベント待ち関数を挿入することを特徴とする請求項２、３または５記載のプログラム変換装置。
【請求項８】
前記変換手段は、前記構文解析手段が前記所定の出力端子の終端記号を識別すると、前記第２のプログラミング言語による記述に変換されたハードウェア仕様記述にディレイ関数を挿入することを特徴とする請求項２、４または６記載のプログラム変換装置。
【請求項９】
前記生成手段は、シミュレーションテストベンチを含むハードウェア仕様記述をファイルとして生成することを特徴とする請求項２、３、４、５、６、７または８記載のプログラム変換装置。
【請求項１０】
前記第１のプログラミング言語および前記第２のプログラミング言語は、Ｃ言語またはＣ＋＋言語を拡張したプログラミング言語であることを特徴とする請求項１、２、３、４、５、６、７、８または９記載のプログラム変換装置。
【請求項１１】
コンピュータを請求項１〜１０のいずれか一項に記載のプログラム変換装置に含まれる各手段として実現するためのプログラム変換プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、既存のプログラムが行っていた所定の処理をより高速かつ精度を落とさずに実行可能なプログラムに変換可能なプログラム変換装置に関する。
【０００２】
【従来の技術】
従来より、ＬＳＩ等の集積回路の設計に関しては、設計対象のハードウェアの複雑化および大規模化に伴って、ハードウェアの仕様をハードウェア記述言語（ＨＤＬ）により記述し、ＣＡＤシステム（コンピュータシステム）を利用して論理回路を設計したり、その検証を行うといった手法が用いられている。しかし、ＨＤＬでは純粋な論理仕様記述に加え、クロックを明示的に記述するレジスタトランスファ（ＲＴ）レベルという抽象度が低く情報量が多いレベルで記述する必要があるため、シミュレーション速度が遅いという問題が顕在化しつつある。この問題を解決するために、ＲＴレベルよりも抽象度の高いＣ言語による動作記述からＲＴレベルのＨＤＬを自動生成する動作合成システムが登場した。当該動作合成システムにより、ハードウェアの論理設計検証の効率が飛躍的に向上することが期待されている。
【０００３】
Ｃ言語による動作合成システムは、その入力言語としてＡＮＳＩ−Ｃ規格のＣ言語を採用しているシステムが多い。このシステムでは、ハードウェア特有の入出力ポートの指定等をコメント文やＣプリプロセッサの＿ｐｒａｇｍａ等を用いて行っているため、従来のＣコンパイラでコンパイル・シミュレーションが可能である。
【０００４】
図１８は、Ｃ言語による動作合成システムでの一般的な記述スタイルを示す説明図である。１行目がハードウェアモジュール名、２〜４行目が入出力ポートの定義である。１０行目以降が内部処理記述であり、図１８では入力ａとｂの合計ｙに入力ａを加えたものが出力ｘとなるという内容の処理が記述されている。この処理は、ｘ＝２ａ＋ｙと等価である。これらの記述は通常のＣ関数と同等の記述になるので、Ｃコンパイラでコンパイル・シミュレーションが可能である。
【０００５】
しかし、Ｃ言語動作合成システムでは、入力ポートは参照のたびに読み込み（リード）処理を行うことになっている。つまり、１０行目のａの読み込みと１１行目のａの読み込みが別々のタイミングで行われるため、それぞれのａの値が同じであるという保証がない。これは、Ｃコンパイラでのコンパイル・シミュレーション結果と、Ｃ言語動作合成システムでの合成結果のＨＤＬの動作とが異なることを示している。
【０００６】
【特許文献１】
特開平１０−１４９３８２号公報（第６頁、第１図）
【０００７】
【発明が解決しようとする課題】
仮に設計者がこの記述において１０行目のａの読み込みと１１行目のａの読み込みの各値が異なるつもりで記述していた場合は、Ｃコンパイラでシミュレーションを行っても期待する動作とはならないため、Ｃ言語動作合成システムによる合成前の検証を正確に行えないという問題があった。同様に、合成結果において出力ｘは入力ａが確定してから通常Ｎ（Ｎは自然数）システムクロック後に確定するため、検証には時間を含んだシミュレーションが必要となるが、Ｃ言語では時間を含んだシミュレーションができない。この例では、ＨＤＬを生成して従来のＨＤＬシミュレータを利用しなければ正確なシミュレーションを行えないため、Ｃ言語の抽象度の高い記述によるシミュレーション時間の短縮といった特長が生かせないという問題もあった。
【０００８】
一方で、Ｃ言語にハードウェア記述のための構文を追加してＣ言語でハードウェア記述とシミュレーションを可能としたシステムも存在する。代表的なものがＣ言語を拡張した「ＳｙｓｔｅｍＣ」と呼ばれるシステムである。このシステムでは、ＡＮＳＩ−Ｃ規格のＣ言語動作合成システム向けの記述を手直しすることにより、ＨＤＬシミュレータと同等の精度でシミュレーションを実行することができる。しかし、Ｃ言語動作記述をシミュレーションデバッグのたびに手修正すると、誤りが混入する恐れがあるだけでなく時間がかかってしまうため、Ｃ言語によるシミュレーション時間の短縮といった特長がやはり生かせないという問題があった。
【０００９】
また、特開平１０−１４９３８２号公報（特許文献１）には、汎用プログラミング言語によりハードウェア記述したプログラムから実際の回路動作に近い精度でのシミュレーション・デバッグを行う装置について開示されている。当該装置は、汎用プログラミング言語中より、順次制御する部分の抽出および並行動作する部分の抽出を行い、実際の回路動作に近い精度のプログラムコードに変換生成するものである。しかし、順次制御する部分の抽出および並行動作する部分の抽出は、動作合成ツールと同等の大規模かつ複雑な処理を必要とするために処理時間がかかる上、記述の抽象度が下がり、記述量が増えることにより、シミュレーション速度が低下するという問題点があった。
【００１０】
本発明は、上記従来の問題に鑑みてなされたものであって、既存のプログラムが行っていた所定の処理をより高速かつ精度を落とさずに実行可能なプログラムに変換可能なプログラム変換装置を提供することを目的としている。
【００１１】
【課題を解決するための手段】
上記目的を達成するために、本発明に係るプログラム変換装置は、第１のプログラミング言語で記述されたプログラムを、当該第１のプログラミング言語よりも抽象度の高い第２のプログラミング言語のプログラムに変換するプログラム変換装置であって、前記第１のプログラミング言語により記述されたプログラムコードの字句を解析する字句解析手段と、前記字句解析手段による解析の結果得られた情報に対して、前記第１のプログラミング言語の構文規則を解析する構文解析手段と、前記構文解析手段による解析結果に基づいて、前記第１のプログラミング言語により記述されたプログラムコードを第２のプログラミング言語の記述に変換する変換手段と、前記変換手段によって前記第２のプログラミング言語による記述に変換されたプログラムコードをファイルとして生成する生成手段と、を備えている。
【００１２】
このように、第１のプログラム言語で記述されたプログラムを当該言語よりも抽象度の高い第２のプログラミング言語のプログラムに変換することができれば、第１のプログラミング言語のプログラムで行っていた処理を第２のプログラミング言語のプログラムで行うことができるため、当該処理を高速かつ精度を落とさずに実行することができる。
【００１３】
また、本発明に係るプログラム変換装置は、前記第１のプログラミング言語により記述されたプログラムコードがハードウェア仕様記述であり、前記字句解析手段は、前記第１のプログラミング言語により記述されたハードウェア仕様記述の終端記号を識別し、当該識別された終端記号の情報を前記構文解析手段に送出することが望ましい。
【００１４】
また、本発明に係るプログラム変換装置は、前記字句解析手段は、前記ハードウェア仕様記述の入力端子のうち、所定の入力端子の終端記号を識別することが望ましい。
【００１５】
また、本発明に係るプログラム変換装置は、前記字句解析手段は、前記ハードウェア仕様記述の出力端子のうち、所定の出力端子の終端記号を識別することが望ましい。
【００１６】
また、本発明に係るプログラム変換装置は、前記構文解析手段は、前記字句解析手段から送出された情報が示す前記所定の入力端子の終端記号がどの構文規則に合致しているかを解析することが望ましい。
【００１７】
また、本発明に係るプログラム変換装置は、前記構文解析手段は、前記字句解析手段から送出された情報が示す前記所定の出力端子の終端記号がどの構文規則に合致しているかを解析することが望ましい。
【００１８】
また、本発明に係るプログラム変換装置は、前記変換手段は、前記構文解析手段が前記所定の入力端子の終端記号を識別すると、前記第２のプログラミング言語による記述に変換されたハードウェア仕様記述にイベント待ち関数を挿入することが望ましい。
【００１９】
また、本発明に係るプログラム変換装置は、前記変換手段は、前記構文解析手段が前記所定の出力端子の終端記号を識別すると、前記第２のプログラミング言語による記述に変換されたハードウェア仕様記述にディレイ関数を挿入することが望ましい。
【００２０】
また、本発明に係るプログラム変換装置は、前記生成手段は、シミュレーションテストベンチを含むハードウェア仕様記述をファイルとして生成することが望ましい。
【００２１】
また、本発明に係るプログラム変換装置は、前記第１のプログラミング言語および前記第２のプログラミング言語は、Ｃ言語またはＣ＋＋言語を拡張したプログラミング言語であることが望ましい。したがって、Ｃ言語動作合成システム用のＣ言語動作記述のシミュレーション等を、Ｃ言語を拡張したシミュレーションシステムにて高速かつ精度を落さずに実行できる。
【００２２】
さらに、本発明に係るプログラム変換プログラムは、コンピュータを請求項１〜１０のいずれか一項に記載のプログラム変換装置に含まれる各手段として実現するためのものである。
【００２３】
【発明の実施の形態】
以下、本発明に係るプログラム変換装置の実施の形態について、図面を参照して詳細に説明する。なお、本実施形態のプログラム変換装置は、コンピュータを使用して電子回路等のハードウェアの設計を支援するためのＣＡＤシステムに適用可能であり、特に動作合成可能なＣ言語により記述された論理回路の検証を行うための論理シミュレーションシステムに適用することができる。
【００２４】
図１は、本発明の一実施形態のプログラム変換装置の構成を示すブロック図である。同図に示すように、本実施形態のプログラム変換装置は、特許請求の範囲の字句解析手段に該当する字句解析部１１と、構文解析手段に該当する構文解析部１２と、変換手段に該当する変換部１３と、生成手段に該当する生成部１４とを備えて構成されている。
【００２５】
以下、本実施形態のプログラム変換装置が有する各構成要素について説明する。
まず、字句解析部１１について説明する。字句解析部１１は、第１のプログラミング言語のファイルを読み込み、当該言語の構文規則に従って終端記号（トークン）と呼ばれる最小単位の単語）を認識抽出して、終端記号の情報を構文解析部１２に送出するものであり、所定入力端子識別部１１１および所定出力端子識別部１１２を有する。なお、終端記号は、例えばＣ言語の場合、「識別子」、「定数（数値または文字列）」、「予約語、演算子、区切り記号のそれぞれに対する記号」、すなわち、ｉｆ、ｒｅｔｕｒｎ、ｃｏｎｓｔ、ｓｔａｔｉｃ、ｉｎｔ、ｃｈａｒ、＋、｛｝、「」、；等が含まれる。図２は、終端記号に分解されたＣ言語の関数の例を示す説明図である。
【００２６】
また、字句解析部１１が有する所定入力端子識別部１１１は、第１のプログラミング言語によって記述されたハードウェア仕様記述の入力端子のうち、所定の入力端子（以下「所定入力端子」という。）を識別するものである。この識別のために新たな終端記号が必要となるが、例えばコメント文を利用して、／＊  ｗａｉｔ  ＊／のように“／＊”と“＊／”の間に“ｗａｉｔ”の字句があった場合には、それを入力端子と識別可能な終端記号に定義できる。
【００２７】
また、字句解析部１１が有する所定出力端子識別部１１２は、第１のプログラミング言語によって記述されたハードウェア仕様記述の出力端子のうち、所定の出力端子（以下「所定出力端子」という。）を識別するものである。この識別のために新たな終端記号が必要となるが、例えばコメント文を利用して、／＊  ｄｅｌａｙ５  ＊／のように“／＊”と“＊／”の間に“ｄｅｌａｙ”の字句があった場合には、それを出力端子と識別可能な終端記号に定義できる。また、“５”は、出力端子のデータをディレイ（遅延）させるサイクル数を示している。
【００２８】
字句解析部１１は、例えば、ＵＮＩＸに組み込まれている「ＬＥＸ」というレキシカルアナライザ（字句解析）ジェネレータツールを用いて実現可能である。
このツールは、比較的容易に字句解析が行え、最終的に字句解析を行うプログラムのＣソースコードを生成する。
【００２９】
図３にＬＥＸの記述例を示す。左側に解析したい字句を記述し、その字句が見つかった時のアクションを右側の“｛”と“｝”との間に記述する。例えば、３行目は、「ｉｎｔという字句が見つかったら、アクションとして「ＩＮＴ」というコードを返す。」という意味である。また、１４行目のように空欄のアクションはその字句を削除するという意味であり、この場合、スペース、タブ、改行、復帰コードを削除することになる。また、１５行目は、正規表現にて字句指定を行う例であり、「１文字のａ〜ｚ若しくはＡ〜Ｚ、または“＿”で始まりａ〜ｚ、Ａ〜Ｚまたは１〜９の文字の０回以上の繰り返しで構成される字句が見つかったら、アクションとして“ＩＤＥＮＴＩＦＩＥＲ（識別子）”というコードを返す。」という意味である。
また、１８行目は、「“／＊”で始まり０回以上のスペースかタブの繰り返し、“ｗａｉｔ”という文字列、０回以上のスペースかタブの繰り返し、“＊／”で終了する字句が見つかったら、アクションとして“ＷＡＩＴ”というコードを返す。」という意味である。
【００３０】
このように、ＬＥＸでは複数の文字列から構成される終端記号も認識可能であり、図１における所定入力端子識別部１１１を実現する具体例となる。また、１９行目は、図１における所定出力端子識別部１１２を実現する具体例となる。
【００３１】
次に、構文解析部１２について説明する。構文解析部１２は、ＢＮＦ（バッカス−ナウア）記法により記述されたプログラミング言語の構文規則に基づいて、字句解析部１１から送出された終端記号の組み合わせがどの構文規則に合致しているかを解析するものであり、所定入力端子構文識別部１２１および所定出力端子構文識別部１２２を有する。所定入力端子構文識別部１２１は、所定入力端子を示す終端記号を含む構文規則を解析するものである。また、所定出力端子構文識別部１２２は、所定出力端子を示す終端記号を含む構文規則を解析するものである。
【００３２】
構文解析部１２で合致する構文規則が見つかると、そのアクションとして変換部１３が起動され、第１のプログラミング言語から第２のプログラミング言語にコードが変換される。さらに、構文解析中に所定入力端子構文識別部１２１または所定出力端子構文識別部１２２に合致する構文規則が見つかった場合は、イベント待ち関数挿入部１３１またはディレイ関数挿入部１３２が起動され、第２のプログラミング言語中にイベント待ち関数コードまたはディレイ関数コードが挿入される。
【００３３】
図４に、Ｃ言語のＢＮＦ記法の例を示す。ＢＮＦ記法では“：”を使って構文規則を記述する。同じ左辺をもつ構文規則が複数あるときには、それらの右辺を“｜”を使って列挙して１つの構文規則にまとめることができる。また、構文規則の終わりは“；”で表す。
【００３４】
構文規則の読み方は、例えば図４に示した１〜４行目は、「ｔｒａｎｓｌａｔｉｏｎ−ｕｎｉｔは、ｅｘｔｅｒｎａｌ−ｄｅｃｌａｒａｔｉｏｎまたはｔｒａｎｓｌａｔｉｏｎ−ｕｎｉｔと、ｅｘｔｅｒｎａｌ−ｄｅｃｌａｒａｔｉｏｎとを導出（置き換え）する。」である。なお、“ｔｒａｎｓｌａｔｉｏｎ−ｕｎｉｔ”のような記号を非終端記号と呼び、構文解析は、非終端記号の導出を繰り返して最終的に終端記号の集合を得ることともいえる。図４に示した１４〜１６行目は、変数宣言の構文を示しており、“ｃｈａｒ  ｃ；”や“ｉｎｔ  ａ＝１；”といった構文がこの規則に合致する。また、２４〜２６行目は、「内部変数宣言」と「処理ステートメント」が’｛’と’｝’にはさまれた構文であり、関数等の処理本体の構文であることを示している。
【００３５】
構文解析部１２は、例えば、ＵＮＩＸに組み込まれている「ＹＡＣＣ」というパーサ（構文解析）ジェネレータツールを用いて実現可能である。このツールは、ボトムアップで構文解釈を行うため、ＢＮＦ記法における右辺の規則と解析中の構文とが一致したときに、右辺を左辺に置き換える処理を行う。この処理を「還元（リデュース）」と呼ぶ。ＹＡＣＣでは、この還元が行われる時のアクションをＢＮＦ記法の右側の’｛’と’｝’内に記述することができる。
【００３６】
図５に、ＹＡＣＣのアクションを用いて第１のプログラミング言語から第２のプログラミング言語へプログラムコードの変換を行わずに出力するための記述例を示す。第１のプログラミング言語および第２のプログラミング言語は、同じ言語（例えばＣ言語）を拡張した言語であり文法の多くが同一であるため、変換を行わない処理も必要である。アクション内で＄１、＄２、・・・、＄ｎは、構文規則の右辺の１番目が＄１に相当し、２番目が＄２に相当し、ｎ番目が＄ｎに相当し、終端記号または非終端記号を表す。
【００３７】
この例では、＄１は「ＩＦ」という終端記号を表し、＄２は「’（’）という終端記号を表し、＄３は“ｅｘｐｒｅｓｓｉｏｎ”という非終端記号を表している。また、＄＄はセマンティックスタックと呼ばれ、この構文規則での還元結果を保持しておき、次の文法の還元時に＄１〜＄ｎのいずれかで参照できる。図５に示した１〜７行目は、ｉｆ文のアクションを示している。“ｓｌｉｓｔ”は、Ｃ＋＋言語のＳＴＬ（標準テンプレートライブラリ）のｓｔｒｉｎｇのｌｉｓｔ（リスト）であり、宣言は次のとおりである。
ｔｙｐｅｄｅｆ  ｌｉｓｔ＜ｓｔｒｉｎｇ＞  ｓｌｉｓｔ；
【００３８】
ｓｌｉｓｔは、ｓｔｒｉｎｇノードの値に終端記号または非終端記号の文字列をもつリストであり、”ｉｎｔ  ｃ；  ｃ＝ｂ＋ａ；”を構文解析すると、その結果は図６に示す形に文字列を格納したものとなる。すなわち、図６は、ｓｌｉｓｔに文字列を格納した例を示す説明図である。
【００３９】
図５に示したｐｌ１〜ｐｌ３はｓｌｉｓｔのポインタであり、同図の３〜５行目でｓｌｉｓｔにｓｔｒｉｎｇの”ｉｆ”，”（”，”）”をそれぞれ代入し、そのｓｌｉｓｔのアドレスをｐｌ１〜ｐｌ３に代入する。６行目のｐｕｓｈ＿ｂａｃｋ関数は、引数で与えられたｓｌｉｓｔのうち最も左のｓｌｉｓｔに右側のｓｌｉｓｔを結合していき、最終的に１つのｓｌｉｓｔとし、そのｓｌｉｓｔのアドレスを＄＄に代入する。これによりセマンティックスタックには、図７に示したようにｓｌｉｓｔが格納される。図７は、図５に示したコードをｓｌｉｓｔに格納した状態を示す説明図である。
【００４０】
図８は、所定入力端子構文識別部１２１を実現する記述例である。図４に示した４４〜４７行目の「ｉｄｅｎｔｉｆｉｅｒ−ｌｉｓｔ」の構文規則に対し、図８に示した３行目の規則を追加する。この構文規則を追加することにより、ｉｄｅｎｔｉｆｉｅｒ（識別子）  ／＊  ｗａｉｔ  ＊／という構文、例えば図９の２行目に示すような記述も、コメントではなく構文規則の１つと認識されるようになり、入力端子ａは所定入力端子と指定されているという意味になる。この構文規則の図８の５行目のアクションでは、“ｗａｉｔ＿ｉｄ”という変数に＄１（ｉｄｅｎｔｉｆｉｅｒ）を保存している。“ｉｄｅｎｔｉｆｉｅｒ”は変数名”ａ”に相当している。
【００４１】
同様に、図８の７〜１０行目に所定出力端子構文識別部１２２を実現する記述例を示す。図９の４行目の  ／＊  ｄｅｌａｙ５  ＊／という構文により、出力端子ｘは所定出力端子と指定されているという意味になる。この構文規則の図８の９行目のアクションでは、“ｄｅｌａｙ＿ｉｄ”という変数に＄１（ｉｄｅｎｔｉｆｉｅｒ）を保存している。“ｉｄｅｎｔｉｆｉｅｒ”は変数名”ｘ”に相当している。
【００４２】
次に、変換部１３について説明する。変換部１３は、第１のプログラミング言語で記述されたプログラムコードを第２のプログラミング言語にコード変換するものであり、イベント待ち関数挿入部１３１を有している。イベント待ち関数挿入部１３１は、第２のプログラミング言語中にイベント待ち関数コードを挿入するものである。
【００４３】
変換部１３において、図１０に従ってＹＡＣＣのアクションを用いて第１のプログラミング言語から第２のプログラミング言語にコード変換して出力する方法について以下説明する。この構文規則はビット切り出しの規則であり、ｘが１６ビットの変数であったら、“ｘ（７，０）”は第７ビットから第０ビットまで切り出すという意味である。この記述を第２のプログラミング言語の例えば「ＳｙｓｔｅｍＣ」に変換するには、“ｘ．ｒａｎｇｅ（７，０）”という記述にする必要がある。図１０の３〜６行目にその変換方法を示す。
【００４４】
図１１は、イベント待ち関数挿入部１３１を実現する記述例である。この構文規則は、処理記述が“；”で終了したときに還元される。例えば、“ｘ＝ａ＊５；”等である。図１１に示した３行目のｉｆ文では、現在解析中のｉｄｅｎｔｉｆｉｅｒ（識別子）を示す“ｃｕｒ＿ｉｄ”が“ｗａｉｔ＿ｉｄ”に等しい場合，４行目のｐｌ１に文字”；  ｗａｉｔ（）；”の入ったｓｌｉｓｔのポインタを渡す処理が実行される。“ｃｕｒ＿ｉｄ”が“ｗａｉｔ＿ｉｄ”と等しくない場合、８行目のｐｌ１に文字”；”の入ったｓｌｉｓｔのポインタを渡す処理が実行される。
【００４５】
また、５行目で、元々の処理ｅｘｐｒｅｓｓｉｏｎとｐｌ１のリストが連結され、セマンテックスタックにそのアドレスを代入する。ｅｘｐｒｅｓｓｉｏｎが“ｘ＝ａ＊５；”であり、ｗａｉｔ＿ｉｄがａであった場合は、コードとして“ｘ＝ａ＊５；  ｗａｉｔ（）；”が出力される。この「ｗａｉｔ（）関数」はＳｙｓｔｅｍＣの任意のイベント待ち関数であり、本実施形態ではクロックの立ち上がりまで待つといった使い方をしている。
【００４６】
図１２および図１３は、ディレイ関数挿入部１３２を実現する記述例である。
まず、図１３は、ＴＹＰＥ型（任意の型を示す。）“ｔｍｐ”のデータをｎサイクルディレイさせて返すｄｅｌａｙ関数を示す。３〜５行目のｆｏｒ文では、内部変数ｔ｛ｎ｝に１つ前（１サイクル）のｔ｛ｎ−１｝の内容が順次コピーされる。最後にｔ｛０｝に入力の“ｔｍｐ”がコピーされ、ｔ｛ｎ−１｝がｄｅｌａｙ関数から返される。
【００４７】
一方、図１２は、代入演算処理の構文規則を示す。例えば、“ｙ＝ｂ＋ｃ；”などである。３行目のｉｆ文では現在解析中の代入される左辺のｉｄｅｎｔｉｆｉｅｒ（＄１）が“ｄｅｌａｙ＿ｉｄ”と等しい場合、４〜７行目を実行する。その結果、セマンティックスタックには、“ｔｍｐ＝ｂ＋ｃ；  ｙ＝ｄｅｌａｙ（ｔｍｐ，  ｎ）；”というコードがリストとして格納される。“ｂ＋ｃ”の値を一旦ｔｍｐに移し、ｄｅｌａｙ関数にてｔｍｐをｎサイクルディレイさせ、その結果を“ｙ”に代入するコードに変換される。これにより、出力ｙは任意のサイクル数だけディレイさせて出力することが可能となる。
【００４８】
次に、生成部１４について説明する。生成部１４は、第１のプログラミング言語から第２のプログラミング言語に変換されたプログラムコードをファイルに出力するものである。このとき、生成部１４は、第２のプログラミング言語に必要とされるヘッダファイル（．ｈ）、処理本体ファイル（．ｃｐｐ）の他にテストベンチ用のファイルを生成する。
【００４９】
以下、本実施形態のプログラム変換装置の動作について、図１４を参照して説明する。図１４は、本実施形態のプログラム変換装置が行う動作について説明するフローチャートである。なお、以下の説明では、第１のプログラミング言語としてＡＮＳＩ−Ｃで記述された図９に示したコード（ａｄｄｅｒ）を用い、第２のプログラミング言語としてＳｙｓｔｅｍＣを用いる。但し、第１のプログラミング言語および第２のプログラミング言語とも上記言語に限定されるものではない。
【００５０】
まず、ステップＳ１において、字句解析部１１は第１のプログラミング言語で記述されたファイルのプログラムコードを読み込み、終端記号を抽出する。また、所定入力端子識別部１１１は当該コードから所定入力端子を見つけるとそれを抽出し、所定出力端子識別部１１２は当該コードから所定出力端子を見つけるとそれを抽出する。次に、ステップＳ２では、字句解析部１１がファイルを全て読み終わったかを判断し、終わればステップＳ１５に進み、続くのであればステップＳ３に進む。ステップＳ３において、構文解析部１２は構文解析を行うことによって終端記号として所定入力端子が指定されているかを判断し、指定されていればステップＳ４に進み、指定されていなければステップＳ５に進む。
【００５１】
ステップＳ５では、構文解析部１２は構文解析を行うことによって終端端子として所定出力端子が指定されているかを判断し、指定されていればステップＳ６に進み、指定されていなければステップＳ７に進む。ステップＳ６では、所定出力端子構文識別部１２２が該当構文を認識すると、図８に示した８〜９行目の処理を実行する。一方、ステップＳ４では、所定入力端子構文識別部１２１が該当構文を認識すると、図８に示した４〜５行目の処理を実行する。
【００５２】
次に、ステップＳ７では、構文解析部１２によるコード変換が必要かを判断し、必要であればステップＳ８に進み、必要でなければステップＳ１０に進む。ステップＳ８ではビット指定子かを判断し、ビット指定子であればステップＳ９に進み、ビット指定子でなければステップＳ１０に進む。
【００５３】
ステップＳ９では、変換部１３がビット指定子の変換処理として図１０に示した３〜６行目の処理を実行して、ステップＳ１に戻る。一方、ステップＳ１０では、イベント待ち関数を挿入するかを判断し、挿入する場合はステップＳ１１に進み、挿入しない場合はステップＳ１２に進む。ステップＳ１１では、イベント待ち関数挿入部１３１が図１１に示した４行目の処理を実行して、ステップＳ１に戻る。なお、本例ではｗａｉｔ（）関数が挿入される。また、ステップＳ１２では、ディレイ関数を挿入するかを判断し、挿入する場合はステップＳ１３に進み、挿入しない場合はステップＳ１４に進む。ステップＳ１３では、ディレイ関数挿入部１３２が図１２に示した４〜７行目の処理および図１３に示した処理を実行して、ステップＳ１に戻る。一方、ステップＳ１４では、構文解析部１２は入力したコードをそのまま出力し、ステップＳ１に戻る。
【００５４】
ステップＳ２で字句解析部１１がファイルを全て読み終わった場合はステップＳ１５に進むが、この時点で、第１のプログラミング言語は全て第２のプログラミング言語に変換され、前述のｓｌｉｓｔに格納されている。当該ステップＳ１５において、生成部１４は、第２のプログラミング言語のヘッダファイルおよび処理記述ファイルを生成し出力する。本例では、図９に示したコードから図１５に示すＳｙｓｔｅｍＣ（第２のプログラム言語）のコードが生成される（ａｄｄｅｒモジュール）。図１５（ａ）はａｄｄｅｒモジュールのヘッダファイル（ａｄｄｅｒ．ｈ）であり、図１５（ｂ）はａｄｄｅｒモジュールの処理本体ファイル（ａｄｄｅｒ．ｃｐｐ）である。
【００５５】
ヘッダファイル（ａｄｄｅｒ．ｈ）には入出力ポート宣言、内部変数宣言、内部処理メソッド名、初期化コンストラクタ（ＳＣ＿ＣＴＯＲ）が出力され、入出力ポートの最後にクロック（ｃｌｏｃｋ）が自動的に挿入される。また、処理本体ファイル（ａｄｄｅｒ．ｃｐｐ）には処理コードが出力される。ｗｈｉｌｅ（１）が入っているのは、コードを何回でも繰り返し実行できるようにするためである。また、図１５（ｂ）の６行目と１０行目にｗａｉｔ（）；が挿入されている。これは、ｃｌｏｃｋの立ち上がりエッジが入力するまで待つ機能を持つ。このｗａｉｔ（）；を挿入することにより、５行目でａを読み込んだ時点から１クロック後に７行目でａを読み込むようになり、確実に異なる値をａに読み込むことができるようになる。また、出力ｘは、変数ｔｍｐを介して、関数ｄｅｌａｙ（ｔｍｐ，  ５）にて５クロックディレイして出力される。
【００５６】
ステップＳ１５による処理が終了するとステップＳ１６に移る。当該ステップＳ１６において、生成部１４は、図１５に示したコードをテストするための図１６のＳｙｓｔｅｍＣで記述されたテストパターン記述ファイルを生成して出力する（ｓｔｉｍモジュール）。図１６（ａ）はｓｔｉｍモジュールのテストパターンヘッダファイル（ｓｔｉｍ．ｈ）であり、図１６（ｂ）はｓｔｉｍモジュールのテストパターン記述ファイル（ｓｔｉｍ．ｃｐｐ）である。
【００５７】
ヘッダファイル（ｓｔｉｍ．ｈ）には入出力ポート宣言、内部変数宣言、内部処理メソッド名、初期化コンストラクタ（ＳＣ＿ＣＴＯＲ）が出力され、入出力ポートの最後にクロック（ｃｌｏｃｋ）が自動的に挿入される。なお、入出力ポートの方向は図１５と反対となる。また、テストパターン記述ファイル（ｓｔｉｍ．ｃｐｐ）には、ユーザが自由にテストパターンの記述できるよう何も処理が記述されていない。
【００５８】
ステップＳ１６による処理が終了するとステップＳ１７に移る。当該ステップＳ１７において、生成部１４は、図１７のＳｙｓｔｅｍＣで記述されたテストベンチファイル（ｍａｉｎ．ｃｐｐ）を生成して出力する。当該ファイルは、図１５のａｄｄｅｒモジュールと図１６のｓｔｉｍモジュールを接続してテストするためものである。
【００５９】
図１７に示したファイルの５行目の記述はシミュレーション分解能宣言であり、１ＮＳを指定している。また、６〜９行目はモジュールを接続するためのシグナル宣言である。１０行目はクロック生成宣言で、１サイクルが２ＮＳでデューティは５０％、初期値は０である。１２〜２１行目はモジュール接続で、シグナルａ，ｂ，ｘを使ってａｄｄｅｒモジュールとｓｔｉｍモジュールを接続する。２３行目〜２７行目はシミュレーション時のポートトレース指定で、ここで指定したポートやシグナルがシミュレーション結果ファイル（ｓｔｉｍ．ｖｃｄ）にＶＣＤフォーマットで出力される。ＶＣＤフォーマットは論理シミュレーション結果の波形フォーマットとして標準的なもので、対応する波形ビュワーを使えば、波形としてシミュレーション結果を見ることができる。２９行目はシミュレーション実行指定であり、５００ＮＳシミュレーションを行うことを示している。
【００６０】
このようにして生成したファイルａｄｄｅｒ．ｈ、ａｄｄｅｒ．ｃｐｐ、ｓｔｉｍ．ｈ、ｓｔｉｍ．ｃｐｐ、ｍａｉｎ．ｃｐｐをＣ＋＋コンパイラにてコンパイルすると、ＳｙｓｔｅｍＣライブラリのリンクができる。出来上がったオブジェクトコードを実行することにより、ａｄｄｅｒモジュールの論理シミュレーションが行え、その結果を波形でも確認できる。またＣ＋＋にてシミュレーションを行うため、ＨＤＬ論理シミュレータに比べて非常に高速にシミュレーションが可能となる。
【００６１】
以上説明したように、本実施形態のプログラム変換装置によれば、複雑かつ大規模な集積回路等の設計検証に関するシミュレーション、特に、Ｃ言語動作合成システム用のＣ言語動作記述のシミュレーションを、ＨＤＬシミュレータを使用することなく、Ｃ言語を拡張したシミュレーションシステムにて高速かつ精度を落さずに実行することができる。但し、Ｃ言語による記述のみに適用されるとは限らず、他の言語においても適用可能である。
【００６２】
【発明の効果】
以上説明したように、本発明に係るプログラム変換装置によれば、既存のプログラムが行っていた所定の処理をより高速かつ精度を落とさずに実行可能なプログラムに変換することができる。
【図面の簡単な説明】
【図１】本発明の一実施形態のプログラム変換装置の構成を示すブロック図
【図２】終端記号に分解されたＣ言語の関数の例を示す説明図
【図３】ＬＥＸの記述例を示す説明図
【図４】Ｃ言語のＢＮＦ記法の例を示す説明図
【図５】ＹＡＣＣのアクションを用いて第１のプログラミング言語から第２のプログラミング言語へプログラムコードの変換を行わずに出力するための記述例を示す説明図
【図６】ｓｌｉｓｔに文字列を格納した例を示す説明図
【図７】図５に示したコードをｓｌｉｓｔに格納した状態を示す説明図
【図８】所定入力端子構文識別部を実現する記述例を示した説明図
【図９】所定入力端子構文識別部が解析する実際の構文の例
【図１０】ＹＡＣＣのアクションを用いて第１のプログラミング言語から第２のプログラミング言語へコード変換して出力する方法についての記述例を示す説明図
【図１１】イベント待ち関数挿入部を実現する記述例を示した説明図
【図１２】ディレイ関数挿入部を実現する記述例を示した説明図
【図１３】ディレイ関数挿入部を実現する記述例を示した説明図
【図１４】本発明の一実施形態のプログラム変換装置が行う動作について説明するフローチャート
【図１５】ａｄｄｅｒモジュールのＳｙｓｔｅｍＣ（第２のプログラム言語）での変換出力内容を示す記述例を示した説明図
【図１６】ｓｔｉｍモジュールのＳｙｓｔｅｍＣ（第２のプログラム言語）での出力内容を示す記述例を示した説明図
【図１７】ｍａｉｎテストベンチモジュールのＳｙｓｔｅｍＣ（第２のプログラム言語）での出力内容を示す記述例を示した説明図
【図１８】Ｃ言語による動作合成システムでの一般的な記述スタイルを示す説明図
【符号の説明】
１１  字句解析部
１１１  所定入力端子識別部
１１２  所定出力端子識別部
１２  構文解析部
１２１  所定入力端子構文識別部
１２２  所定出力端子構文識別部
１３  変換部
１３１  イベント待ち関数挿入部
１３２  ディレイ関数挿入部
１４  生成部
【図１】
2004157945.tif 000003
【図２】
2004157945.tif 000004
【図３】
2004157945.tif 000005
【図４】
2004157945.tif 000006
【図５】
2004157945.tif 000007
【図６】
2004157945.tif 000008
【図７】
2004157945.tif 000009
【図８】
2004157945.tif 000010
【図９】
2004157945.tif 000011
【図１０】
2004157945.tif 000012
【図１１】
2004157945.tif 000013
【図１２】
2004157945.tif 000014
【図１３】
2004157945.tif 000015
【図１４】
2004157945.tif 000016
【図１５】
2004157945.tif 000017
【図１６】
2004157945.tif 000018
【図１７】
2004157945.tif 000019
【図１８】
2004157945.tif 000020