(57)【要約】【課題】実行効率の良く品質の高いソフトウェアまたはハードウェアの設計記述を効率的に作成する。【解決手段】本発明の設計記述書換装置は、設計記述における複数の第１の関数の少なくとも１つのそれぞれ毎に、前記第１の関数の戻り値の型、前記第１の関数内で呼ばれる他の第１の関数の戻り値の型の少なくとも一方を指定した型指定記述の集合を入力する手段と、前記複数の第１の関数の中から、１つ以上の他の第１の関数内で呼ばれる第２の関数を選択し、前記１つ以上の他の第１の関数および前記第２の関数にそれぞれ対応する型指定記述により指定した型、を包括する型を前記第２の関数の戻り値の型として決定し、前記第２の関数と異なる第３の関数の戻り値の型として、前記第３の関数に対応する型指定記述により指定した型を決定する手段と、前記第２の関数および前記第３の関数の戻り値に対しそれぞれ決定された型を指定するように前記設計記述を書き換える手段とを備える。【選択図】図１
2010079684.tif 000002
【特許請求の範囲】
【請求項１】
複数の第１の関数を用いて記述された、ソフトウェアまたはハードウェアの設計記述を入力する設計記述入力部と、
前記複数の第１の関数の少なくとも１つのそれぞれ毎に、前記第１の関数の戻り値の型、前記第１の関数内で呼ばれる他の第１の関数の戻り値の型、またはこれらの両方を指定した型指定記述の集合を入力する型指定記述入力部と、
前記複数の第１の関数の中から、１つ以上の他の第１の関数内で呼ばれる第２の関数を選択し、
前記第２の関数を呼ぶ前記１つ以上の他の第１の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定した型、および前記第２の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定した型、を包括する型を前記第２の関数の戻り値の型として決定し、
前記複数の第１の関数のうち前記第２の関数と異なる第３の関数の戻り値の型として、前記第３の関数に対応する型指定記述により前記第３の関数の戻り値に対して指定した型を決定する、型決定部と、
前記第２の関数および前記第３の関数の戻り値に対しそれぞれ前記型決定部で決定された型を指定するように前記設計記述を書き換える設計記述書換部と、
を備えた設計記述書換装置。
【請求項２】
前記型決定部は、前記包括する型として、前記第２の関数を呼ぶ前記１つ以上の他の第１の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定した型、および前記第２の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定した型のうち最も広い型を決定する
ことを特徴とする請求項１に記載の設計記述書換装置。
【請求項３】
前記設計記述書換部は、前記第２の関数を呼ぶ前記１つ以上の他の第１の関数のうちの１つの関数に対応する前記型指定記述により前記第２の関数の戻り値に対して指定した型が前記包括する型より狭いときは、前記１つの関数内で前記第２の関数が呼ばれるとき前記第２の関数の戻り値の型を、前記１つの関数に対応する前記型指定記述により指定された型へ変換するように前記設計記述を書き換える
ことを特徴とする請求項１または２に記載の設計記述書換装置。
【請求項４】
前記１つ以上の他の第１の関数内で呼ばれる前記第２の関数は、１つ以上の引数を有し、
前記第２の関数を呼ぶ前記１つ以上の他の第１の関数に対応する型指定記述は、前記第２の関数の引数の型を指定し、また前記１つ以上の他の第１の関数内で定義される変数の型を指定し、
前記型決定部は、
前記包括する型として、前記第２の関数を呼ぶ前記１つ以上の他の第１の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定された型、および前記第２の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定された型のうち最も広い型を決定し、
前記第２の関数の引数の型として、前記第２の関数の戻り値に対して前記最も広い型を指定した型指定記述で指定された型を決定し、
前記設計記述書換部は、
前記第２の関数の引数に対し前記型決定部で決定された型を指定し、
前記１つ以上の他の第１の関数内で定義される変数に対し、前記１つ以上の他の第１の関数に対応する前記型指定記述により指定された型を指定し、
前記１つ以上の他の第１の関数のうちの前記１つにより前記第２の関数が呼ばれる際、前記第２の関数の引数に与える変数の型を、前記第２の関数の引数に対して選択された型へ変換する
ように前記設計記述を書き換える
ことを特徴とする請求項３に記載の設計記述書換装置。
【請求項５】
依存性解析部と、型指定記述検証部とをさらに備え、
各前記型指示記述はそれぞれ対応する前記第１の関数内で定義された変数の型を指定し、
前記依存性解析部は、各前記型指示記述のそれぞれに対応する第１の関数において、前記第１の関数内で定義された変数の使用先および前記第１の関数内で呼ばれる関数の使用先を特定し、
前記型指定記述検証部は、前記第１の関数内で定義された前記変数の型および前記第１の関数内で呼ばれる前記関数の戻り値の型と、前記変数の使用先の型および前記関数の戻り値の使用先の型とが互換であるか否かを、前記第１の関数に対応する前記型指示記述に基づき検証し、互換でないときはその旨を表すエラー情報を出力する
ことを特徴とする請求項１ないし４のいずれか一項に記載の設計記述書換装置。
【請求項６】
依存性解析部と、型指定記述書換部とをさらに備え、
各前記型指示記述はそれぞれ対応する前記第１の関数内で定義された変数の型を指定し、
前記依存性解析部は、各前記型指示記述のそれぞれに対応する第１の関数において、前記第１の関数内で定義された変数の使用先および前記第１の関数内で呼ばれる関数の使用先を特定し、
前記型指定記述書換部は、
前記第１の関数内で定義された変数と、前記変数の使用先とのうちの一方に対する型が指定され他方に対する型が指定されていないとき、前記一方に対する型と同一の型を他方に対して指定し、
前記第１の関数内で呼ばれる関数の戻り値と、前記関数の戻り値の使用先とのうちの一方に対する型が指定され他方に対する型が指定されていないとき、前記一方に対する型と同一の型を他方に対して指定する
ことにより前記第１の関数に対応する前記型指定記述を書き換える
ことを特徴とする請求項１ないし５のいずれか一項に記載の設計記述書換装置。
【請求項７】
前記設計記述は、デジタル回路を含む電子システムの設計記述であり、
前記型は、ビット幅である、
ことを特徴とする１ないし６のいずれか一項に記載の設計記述書換装置。
【請求項８】
コンピュータにおいて実行する設計記述書換方法であって、
設計記述入力部が、複数の第１の関数を用いて記述された、ソフトウェアまたはハードウェアの設計記述を入力し、
型指定記述入力部が、前記複数の第１の関数の少なくとも１つのそれぞれ毎に、前記第１の関数の戻り値の型、前記第１の関数内で呼ばれる他の第１の関数の戻り値の型、またはこれらの両方を指定した型指定記述の集合を入力し、
型決定部が、
前記複数の第１の関数の中から、１つ以上の他の第１の関数内で呼ばれる第２の関数を選択し、
前記第２の関数を呼ぶ前記１つ以上の他の第１の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定した型、および前記第２の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定した型、を包括する型を前記第２の関数の戻り値の型として決定し、
前記複数の第１の関数のうち前記第２の関数と異なる第３の関数の戻り値の型として、前記第３の関数に対応する型指定記述により前記第３の関数の戻り値に対して指定した型を決定し、
設計記述書換部が、前記第２の関数および前記第３の関数の戻り値に対しそれぞれ前記型決定部で決定された型を指定するように前記設計記述を書き換える
ことを特徴とする設計記述書換方法。
【請求項９】
複数の第１の関数を用いて記述された、ソフトウェアまたはハードウェアの設計記述を入力する設計記述入力ステップと、
前記複数の第１の関数の少なくとも１つのそれぞれ毎に、前記第１の関数の戻り値の型、前記第１の関数内で呼ばれる他の第１の関数の戻り値の型、またはこれらの両方を指定した型指定記述の集合を入力する型指定記述入力ステップと、
前記複数の第１の関数の中から、１つ以上の他の第１の関数内で呼ばれる第２の関数を選択し、
前記第２の関数を呼ぶ前記１つ以上の他の第１の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定した型、および前記第２の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定した型、を包括する型を前記第２の関数の戻り値の型として決定し、
前記複数の第１の関数のうち前記第２の関数と異なる第３の関数の戻り値の型として、前記第３の関数に対応する型指定記述により前記第３の関数の戻り値に対して指定した型を決定する、型決定ステップと、
前記第２の関数および前記第３の関数の戻り値に対しそれぞれ前記型決定ステップで決定された型を指定するように前記設計記述を書き換える設計記述書換ステップと、
をコンピュータに実行させるための設計記述書換プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、たとえばソフトウェアの設計開発またはデジタル回路を含む電子システムの設計のための設計記述を当該ソフトウェアおよび電子システムの実効性能が向上するように効率的に書き換える設計記述書換装置、設計記述書換方法および設計記述書換プログラムに関する。
【背景技術】
【０００２】
プログラムやデジタル回路の設計記述において、一般化した型を用いて抽象度の高い記述を行うと、開発効率やメンテナンス性が向上するが、生成される実行プログラムやデジタル回路の実効効率および品質は低下しがちである、一方で、具体化した型を用いて抽象度の低い記述を行うと、記述が煩雑になりモジュール性が低下するため開発効率やメンテナンス性は低下するが、生成物の実行効率や品質が向上する傾向がある。このため、最初の設計では一般化した型を用いて記述を行い、システムレベルのテストなどを経たのち、型を具体化したものに書き換える作業が発生する。
【０００３】
具体例として、高位設計手法による回路記述においては、ビット幅を指定する整数と指定しない整数がこの関係に当たる。ビット幅を指定せずに回路を動作レベルで記述すると、開発効率はよいが、このまま回路を生成すると不要な配線が埋め込まれ、回路のサイズが大きくなり、速度が低下する。ビット幅を指定して回路を詳細に記述すると、記述が煩雑になるため開発効率は悪いが、不要な配線が埋め込まれなくなり、回路サイズは小さく、速度は向上する。
【０００４】
他の例として、ソフトウェアプログラムを動的型付けのスタイルで記述することと、部分的または全体的に静的型付けのスタイルで記述することも同じ関係にあたる。前者は開発効率がよいが、コンパイラの静的解析などが適用できないことから実行効率や信頼性が犠牲になる。後者は開発効率が悪いが、静的解析を援用することで実行効率や信頼性を向上させることができる。
【０００５】
特開 2007-287088号公報「高位合成方法および高位合成システム」や特開 2006-190085号公報「デジタル回路のモデリング方法及び設計方法」では、ビット幅の推論機能を利用・提供している。この装置では、型の波及などを解析して推論を行っているが、型の変更のモジュール性は低く、開発効率が悪い。ここでモジュール性は、ある観点において変更を行う場合にコードを局所的に書き換えるだけで済む性質を意味する。
【０００６】
また特開 2006-228221号公報「アプリケーションプログラムの再構成方法及びそのシステム」は設計記述中の型を書き換える装置を開示しているが、型を書き換える指示にモジュール性を与えておらず、開発効率が悪い。
【特許文献１】特開2007-287088号公報
【特許文献２】特開 2006-190085号公報
【特許文献３】特開 2006-228221号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
本発明は、実行効率の良くかつ品質の高いソフトウェアまたはハードウェアの設計記述を効率的に作成できるようにした設計記述書換装置および設計記述書換方法、設計記述書換プログラムを提供する。
【課題を解決するための手段】
【０００８】
本発明の一態様としての設計記述書換装置は、
複数の第１の関数を用いて記述された、ソフトウェアまたはハードウェアの設計記述を入力する設計記述入力部と、
前記複数の第１の関数の少なくとも１つのそれぞれ毎に、前記第１の関数の戻り値の型、前記第１の関数内で呼ばれる他の第１の関数の戻り値の型、またはこれらの両方を指定した型指定記述の集合を入力する型指定記述入力部と、
前記複数の第１の関数の中から、１つ以上の他の第１の関数内で呼ばれる第２の関数を選択し
前記第２の関数を呼ぶ前記１つ以上の他の第１の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定した型、および前記第２の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定した型、を包括する型を前記第２の関数の戻り値の型として決定し、
前記複数の第１の関数のうち前記第２の関数と異なる第３の関数の戻り値の型として、前記第３の関数に対応する型指定記述により前記第３の関数の戻り値に対して指定した型を決定する、型決定部と、
前記第２の関数および前記第３の関数の戻り値に対しそれぞれ前記型決定部で決定された型を指定するように前記設計記述を書き換える設計記述書換部と、
を備える。
【０００９】
本発明の一態様としての設計記述書換方法は、
コンピュータにおいて実行する設計記述書換方法であって、
設計記述入力部が、複数の第１の関数を用いて記述された、ソフトウェアまたはハードウェアの設計記述を入力し、
型指定記述入力部が、前記複数の第１の関数の少なくとも１つのそれぞれ毎に、前記第１の関数の戻り値の型、前記第１の関数内で呼ばれる他の第１の関数の戻り値の型、またはこれらの両方を指定した型指定記述の集合を入力し、
型決定部が、
前記複数の第１の関数の中から、１つ以上の他の第１の関数内で呼ばれる第２の関数を選択し、
前記第２の関数を呼ぶ前記１つ以上の他の第１の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定した型、および前記第２の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定した型、を包括する型を前記第２の関数の戻り値の型として決定し、
前記複数の第１の関数のうち前記第２の関数と異なる第３の関数の戻り値の型として、前記第３の関数に対応する型指定記述により前記第３の関数の戻り値に対して指定した型を決定し、
設計記述書換部が、前記第２の関数および前記第３の関数の戻り値に対しそれぞれ前記型決定部で決定された型を指定するように前記設計記述を書き換える
ことを特徴とする。
【００１０】
本発明の一態様としての設計記述書換プログラムは、
複数の第１の関数を用いて記述された、ソフトウェアまたはハードウェアの設計記述を入力する設計記述入力ステップと、
前記複数の第１の関数の少なくとも１つのそれぞれ毎に、前記第１の関数の戻り値の型、前記第１の関数内で呼ばれる他の第１の関数の戻り値の型、またはこれらの両方を指定した型指定記述の集合を入力する型指定記述入力ステップと、
前記複数の第１の関数の中から、１つ以上の他の第１の関数内で呼ばれる第２の関数を選択し、
前記第２の関数を呼ぶ前記１つ以上の他の第１の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定した型、および前記第２の関数に対応する型指定記述により前記第２の関数の戻り値に対して指定した型、を包括する型を前記第２の関数の戻り値の型として決定し、
前記複数の第１の関数のうち前記第２の関数と異なる第３の関数の戻り値の型として、前記第３の関数に対応する型指定記述により前記第３の関数の戻り値に対して指定した型を決定する、型決定ステップと、
前記第２の関数および前記第３の関数の戻り値に対しそれぞれ前記型決定ステップで決定された型を指定するように前記設計記述を書き換える設計記述書換ステップと、
をコンピュータに実行させる。
【発明の効果】
【００１１】
本発明により、実行効率の良く品質の高いソフトウェアまたはハードウェアの設計記述を効率的に作成できる。
【実施例１】
【００１２】
図1は、本発明の実施例１に従った設計記述書換装置を示すブロック図である。
【００１３】
設計記述入力部１１は、外部の記憶装置から入力として設計記述を読み出し、設計記述内部表現を出力する。設計記述内部表現とは、設計記述の抽象構文木またはそれに準ずる表現である。設計記述内部表現として設計記述そのものを文字列やバイト列として保持してもよい。
【００１４】
ここでは設計記述入力部１１は、図4に示す設計記述（回路記述）を入力として読み出し、設計記述内部表現を出力する。設計記述の記述言語はSystemCであるとする。
【００１５】
図4に示す設計記述は 3 つのモジュールからなり、それぞれ関数として表現されている。すなわち図４に示す設計記述は、３つの第１の関数adder, mod_a, mod_bを用いて記述されている。
【００１６】
adder は 2 つの数値を入力としその和を出力する加算器モジュールである。
【００１７】
mod_a は何も入力せず、加算器を使用して 3 と 3 の和を計算しその結果を出力するモジュールである。
【００１８】
mod_b は何も入力せず、加算器を使用して 50 と 50 の和を計算しその結果を出力するモジュールである。
【００１９】
これらの演算はすべて int 型（一般化された型）で行われる。int 型のビット幅は記述を実行する環境によって異なるが、32 ビット CPU の環境では 32 ビットとなることが多い。ここでは 32 ビットが採用されたものとする。
【００２０】
これらのモジュールの関係を図21に示す。モジュール間の通信はバスを介して行われる。32 ビットである int 型の値を送受信できるよう、このバスは 32 ビット以上の幅を持つことが要求される。
【００２１】
型書換指示集合入力部１２は、型書換指示の集合を外部の記憶装置から入力として読み出し、型書換指示集合内部表現を出力する。型書換指示集合内部表現は、設計記述の指示の情報を失わない範囲で変形したメモリ表現である。
【００２２】
ここでは型書換指示集合入力部１２は、図5に示す型書換指示集合を入力として読み出し、型書換指示集合内部表現を出力するとする。
【００２３】
図5に示す型書換指示集合は 6 つの型書換指示を含む。
【００２４】
型書換指示は（１）型、（２）識別子、（３）視点の組からなる。ただし視点の記述は省略されうる。視点の記述が省略された場合は、視点はグローバルな視点であると解釈される。視点は、識別子が指している変数を用いている関数、または識別子が指している関数を呼び出している関数に相当する。
【００２５】
1 行目は関数 mod_a の戻り値の型を sc_int<4> に書き換える型書換指示である。視点は省略されている。
【００２６】
2 行目は変数 x と y の型を sc_int<4> に書き換える型書換指示である。視点は関数 mod_a であり、書き換えるべき変数は mod_a 中の x と y に限定される。
【００２７】
3 行目は関数 mod_b の戻り値の型を sc_int<8> に書き換える型書換指示である。視点は省略されている。
【００２８】
4 行目は変数 x と y の型を sc_int<8> に書き換える型書換指示である。視点は関数 mod_b であり、書き換えるべき変数は mod_b 中の x と y に限定される。
【００２９】
5 行目は関数 adder の引数の型を 2 つとも sc_int<4> に書き換え、戻り値の型を sc_int<4> に書き換える型書換指示である。視点は関数 mod_a であり、mod_a から adder を呼ぶときは、adderの引数の型および戻り値の型は、この型sc_int<4>として見えるようになる。なおここではadderの引数x,yの表記は省略しているが、「sc_int<4> adder(sc_int<4>x, sc_int<4>y); call(mod_a)」のように引数を表記するようにしてもよい。
【００３０】
6 行目は関数 adder の引数の型を 2 つとも sc_int<8> に書き換え、戻り値の型を sc_int<8> に書き換える型書換指示である。視点は関数 mod_b であり、mod_b から adder を呼ぶときは、adderの引数の型および戻り値の型は、この型sc_int<8>として見えるようになる。なおここではadderの引数x,yの表記は省略しているが、上述と同様に引数を表記するようにしてもよい。
【００３１】
図５の例では、複数の第１の関数（すなわちadder, mod_a, mod_b）のうち、mod_aとmod_bについて型書換指示が示されており、adderについては型書換指示は示されていない。すなわち、mod_aについて、mod_aの戻り値の型、mod_a内で呼ばれるadderの戻り値の型、mod_a内で定義されている変数（xとy）の型が指定されている。また、mod_bについて、mod_bの戻り値の型、mod_b内で呼ばれるadderの戻り値の型、mod_b内で定義されている変数（xとy）の型が指定されている。adderは、mod_aおよびmod_b内で呼ばれており、本願発明の第２の関数に相当する。mod_aおよびmod_bはいずれの関数にも呼ばれておらず、本願発明の第３の関数に相当する。図５に示される各型書換指示の詳細を説明すると以下の通りである。
【００３２】
図５においてmod_aに関する型書換指示の集合（１行目、２行目、５行目の型書換指示の集合）は、本願発明におけるmod_aに関する型指定記述に相当する。また、mod_bに関する型書換指示の集合（３行目、４行目、６行目の型書換指示の集合）は、本願発明におけるmod_bに関する型指定記述に相当する。
【００３３】
指示対象同定部１３は、設計記述内部表現と型書換指示集合内部表現とを受け取り、型書換指示集合内部表現内の各識別子が示す変数・関数を含む構文（宣言文・定義文）を、各識別子に対応する視点に応じて、設計記述内部表現において同定する。そして、特定した構文を識別子および視点に対応付けることにより同定結果データを生成し、生成した同定結果データを出力する。なお、識別子が示す変数・関数を含む宣言文・定義文が存在しないときは、エラーを報告するようにしてもよい。
【００３４】
ここでは指示対象同定部１３は、図4に示す設計記述の内部表現と、図5に示す型書換指示集合の内部表現とを受け取る。指示対象同定部１３は、型書換指示集合内部表現から変数・関数名の識別子とその視点とを抽出する。そして、変数・関数名の識別子を含む、設計記述内の構文（宣言文または定義文）を視点に応じて特定し、特定した構文を識別子および視点に対応付ける。これにより、指示対象同定部１３は、図6に示す同定結果データを生成する。
【００３５】
型決定部１４は、型書換指示集合内部表現と、同定結果データとを受け取る。
【００３６】
型決定部１４は、同定結果データに同じ複数の構文が含まれるときは、各構文に対応する型書換指示をその視点に応じて型書換指示集合内部表現から特定する。そして、各特定した型書換指示に示される型を包含する型（たとえばこれらの型の中から選択した最も広い型、あるいは当該選択した型よりもさらに広い型）を、これらの構文にする型として決定する。型の包含関係は設計記述を表現する言語に依存し、これらの型を包含する型が存在しない場合はエラーを報告するようにしてもよい。
【００３７】
型決定部１４は、同定結果データに１つしか存在しない構文については、当該構文に対応する型書換指示をその視点に応じて特定し、特定した型書換指示に示される型を、当該構文に対する型として決定する。
【００３８】
型決定部１４は、このようにして各構文に対して型を決定したら、各構文に対して決定した型を表す型決定結果データを出力する。
【００３９】
ここでは型決定部１４は、図5に示す型書換指示集合の内部表現と、図6に示す同定結果データとを受け取る。図6において「adder の関数定義」が 2 つあるため、これらの構文とその視点との組に対応する型書換指示を特定すると、図5から、
sc_int<4> adder(sc_int<4>, sc_int<4>): call(mod_a);
sc_int<8> adder(sc_int<8>, sc_int<8>): call(mod_b);
が得られる。そして、これらの型書換指示に示される型のうちもっとも広い型（最も大きなビット幅）を指示している、sc_int<8> adder(sc_int<8>, sc_int<8>): call(mod_b); に従って、これらの構文に対する型を決定する。この際、型の大小関係（包含関係）は、関数の戻り値の型に従って決定するとする。
【００４０】
「adderの関数定義」 以外の構文はいずれも１つのみであるため、当該構文とその視点とに応じて特定される型書換指示に示される型を、当該構文に対する型として決定する。
【００４１】
以上の結果として、型決定部１４は図7に示す型決定結果データを出力する。
【００４２】
設計記述断片生成部１５は、型書換指示集合内部表現と型決定結果データとを受け取り、型を宣言するための設計記述断片および型を変換する操作を行う設計記述断片を生成し出力する。具体的な宣言方法および変換方法は設計記述を表現する言語に依存する。変換が定義できない場合（たとえば型に互換性がない場合）はエラーを報告するようにしてもよい。
【００４３】
ここでは、設計記述断片生成部１５は、図5に示す型書換指示集合の内部表現と図7に示す型決定結果データとを受け取る。
【００４４】
設計記述断片生成部１５は、図7の型決定結果データにおいて、それぞれ識別子（変数の識別子または関数の識別子）を空欄にすることにより、設計記述断片を生成する。生成された設計記述断片の例を図8に示す。空欄部は * で記述している。
【００４５】
また、設計記述断片生成部１５は、型書換指示集合内部表現から、型決定結果と異なる型（型決定結果より狭い型）を指定している型書換指示を探す。ここでは sc_int<4> adder(sc_int<4>, sc_int<4>): call(mod_a); が見つかる。設計記述断片生成部１５は、関数mod_a内でadderを呼び出す際に図8の最下行に示されるadderの型の定義との適合を図り、かつadderの戻り値をその使用先に適合させるため、一時的に引数に与える変数のビット幅（型）を拡張してから adder を呼び出すとともに戻り値のビット幅（型）を縮小することを指示する設計記述断片を生成する。このように生成された設計記述断片を図9に示す。図9に示される(sc_int<4>)adder((sc_int<8>)*, (sc_int<8>)*)において、( )は型変換（拡張または縮小）を意味する。図8と同様に、識別子は空欄としてある。
【００４６】
設計記述断片生成部１５は図8に示す設計記述断片と図9に示す設計記述断片とをまとめて設計記述断片集合として出力する。
【００４７】
設計記述書換部１６は、上記設計記述内部表現と設計記述断片集合とを受け取り、設計記述内部表現を各設計記述断片に従って書き換える。
【００４８】
ここでは設計記述書換部１６は、図4に示される設計記述の内部表現と、図8および図9に示される設計記述断片集合とを受け取る。設計記述書換部１６は、設計記述内部表現において設計記述断片に示される構文に対して、設計記述断片に示される型を埋め込む。
【００４９】
例えば設計記述断片集合の最初の設計記述断片は、mod_a の関数定義に対して sc_int<4> *() を埋め込むことを表し、関数 mod_a の定義は sc_int<4> mod_a() となる。同様の処理を各設計記述断片について繰り返すことで、図10に示す新しい設計記述の内部表現を得る。
【００５０】
設計記述出力部１７は、設計記述書換部１６が出力した設計記述内部表現を設計記述に変換して出力する。出力された設計記述はたとえば外部の記憶装置に格納される。
【００５１】
ここでは、設計記述出力部１７は、図10に示す設計記述の内部表現を受け取り、図10に示す設計記述を出力する。設計記述出力部１７により出力された設計記述におけるモジュールの関係を図22に示す。バスのビット幅は 8 になっており、無駄な配線を減らすことができたことがわかる。これによって回路の大きさの縮小、回路の実行効率の向上が図れる。
【００５２】
（実施例１の効果）
回路記述の本体は int のように一般化した型を用いて記述するため、開発効率がよく、開発期間の短縮を図れる。かつ、指示記述に従って、sc_int<8> のように具体化された型を用いた記述を得られるため、これを用いて回路を生成することで実行効率や品質の向上も図れる。
【００５３】
従来は型の書き換えを、書き換えの必要な箇所をすべて探しだして、手作業で行っていたが、それに比べ、本実施例では型書換指示により型を指示して自動処理を実行するだけで書き換えが完了する。したがって本実施例はモジュール性が高く、変更箇所を見つけ出す手間や、変更漏れによるバグのデバッグ作業を大幅に軽減することができる。
【実施例２】
【００５４】
図2は、本発明の実施例２に従った設計記述書換装置のブロック図である。
【００５５】
図1の装置に対して依存性解析部２１と、型書換指示検証部（型指定記述検証部）２２とが追加されている。以下、図1の装置との差分について説明する。
【００５６】
依存性解析部２１は、設計記述入力部１１が出力した設計記述内部表現中の変数・関数の使われ方を解析して、依存関係データを出力する。すなわち、変数または関数の定義と、当該変数または関数の戻り値の使用先と特定し、これらの対応を示す依存関係データを出力する。この解析方法は def-use 解析などを使えばよい
ここでは、設計記述入力部１１から図4に示す設計記述の内部表現が出力され、依存性解析部２１がこの設計記述内部表現を受け取り、変数または関数と、その使用先（使用箇所）とを解析する。これにより依存性解析部２１は、図12に示す、依存関係データを出力する。たとえばmod_aで定義された変数ｘは、adderの第１引数として用いられ、mod_aで呼ばれるadderの戻り値は、mod_aの戻り値として用いられる。
【００５７】
型書換指示検証部２２は、設計記述入力部１１が出力した設計記述内部表現と、型書換指示集合入力部１２が出力した型書換指示集合内部表現と、依存性解析部２１が出力した依存関係データと、指示対象同定部１３が出力した同定結果データとを受け取り、設計記述と型書換指示集合に矛盾があるか否かを判定する。型書換指示検証部２２は、設計記述と型書換指示集合との間に矛盾があるとき、矛盾を示すエラーを報告する。これにより設計開発をさらに効率化することができる
ここでは、設計記述入力部１１が図4に示す設計記述の内部表現を出力し、型書換指示集合入力部１２が図11に示す型書換指示集合の内部表現を出力したとする。図11に示す型書換指示集合は、実施例１で説明した図5の型書換指示集合において、関数 mod_b の視点での変数 x と y に対する指示を、sc_intからsc_uintへ変更したものに相当する。sc_int および sc_uint はお互いに自動で変換できる型ではない（すなわちsc_int および sc_uintは互換ではない）とする。
【００５８】
指示対象同定部１３は実施例１と同様に動作し、指示対象同定部１３からは、図6に示す同定結果データが出力されるとする。
【００５９】
型書換指示検証部２２は、図4に示す設計記述の内部表現と、図11に示す型書換指示集合の内部表現と、図6に示す同定結果データと、図12に示す依存関係データとを受け取る。
【００６０】
型書換指示検証部２２は、依存関係データに含まれる依存関係を列挙する。そして、各依存関係について、変数または関数に指定された型と、当該変数または関数の戻り値の使用先（使用箇所）に指定されている型とを、同定結果データと型書換指示集合内部表現に基づき求め、これら 2 つの型が互換であるか否か（すなわちこれら２つの型が矛盾するか否か）を検証する。型書換指示検証部２２は、これら２つの型が互換でないときは、すなわち互換でない依存関係を見つけたら、エラーを報告して処理を終了する。
【００６１】
本例では、図12に示すように、1 つ目の依存関係は「mod_a で定義された変数 x : adder の第 1 引数」である。「mod_a で定義された変数 x」の型は sc_int<4> であり、「adder の第 1 引数」の型は mod_a の視点で sc_int<4> であるため、互換である。
【００６２】
2 つ目の依存関係は「mod_a で定義された変数 y : adder の第 2 引数」である。「mod_a で定義された変数 y」の型は sc_int<4> であり、「adder の第 2 引数」の型は mod_a の視点で sc_int<4> であるため、互換である。
【００６３】
3 つ目の依存関係は「mod_b で定義された変数 x : adder の第 1 引数」である。「mod_b で定義された変数 x」の型は sc_uint<8> であり、「adder の第 1 引数」の型は mod_b の視点で sc_int<8> であるため、互換ではない。このためエラーを報告して処理を終了する。
【００６４】
（実施例２の効果）
実施例１では、矛盾のある型書換指示集合を入力した場合、誤りのある設計記述が出力されてしまう問題がある。それに比べ本実施例では、矛盾のある型書換指示集合を入力した場合にエラーを報告するため、ユーザが気がつかないうちに誤りのある設計記述が出力されることがない。従って問題を開発工程の早期に発見することができ、開発工数を削減することができる。
【実施例３】
【００６５】
図3は、本発明の実施例３に従った設計記述書換装置のブロック図である。
【００６６】
図1の装置に対して依存性解析部２１と、型書換指示追加部３１とが追加されている。依存性解析部２１は図2と同様であるため説明を省略する。
【００６７】
型書換指示追加部３１は、設計記述入力部１１が出力した設計記述内部表現と、型書換指示集合入力部１２が出力した型書換指示集合内部表現と、指示対象同定部１３により出力された同定結果データと、依存性解析部２１により出力された依存関係データとを受け取り、型書換指示集合に追加すべき型書換指示を推論し、追加する。これによりユーザは型書換指示集合にすべての型書換指示を記述する作業が不要になる。すなわち型書換指示追加部３１により推論できる範囲の型書換指示の記述をユーザは省略できるため、設計開発をさらに効率化することができる。
【００６８】
ここでは、設計記述入力部１１が図4に示す設計記述の内部表現を出力し、型書換指示集合入力部１２が図13に示す型書換指示集合の内部表現を出力するとする。図13に示す型書換指示集合は、実施例１で説明した図5の型書換指示集合から、関数 adder に対する指示を削除したものに相当する。
【００６９】
指示対象同定部１３は、図4の設計記述の内部表現と、図13の型書換指示集合の内部表現とを基に、実施例１と同様の動作を行うことにより、図14に示す同定結果データを出力する。
【００７０】
依存性解析部２１は、実施例２と同様の動作を行うことにより、図12に示す依存関係データを出力する。
【００７１】
型書換指示追加部３１は、図4に示す設計記述の内部表現と、図13に示す型書換指示集合の内部表現と、図14に示す同定結果データと、図12に示す依存関係データとを受け取る。
【００７２】
型書換指示追加部３１は、依存関係データに含まれる依存関係を列挙する。そして、各列挙した依存関係について、定義されている変数または関数に指定されている型と、当該変数または関数の戻り値の使用先（使用箇所）に対して指定されている型とを、同定結果データと型書換指示集合内部表現とから求める。一方の型が求められず、他方の型が求められないときは、当該一方の型と同一の型を当該他方に指定する型書換指示を追加する。以下これについて具体的に示す。
【００７３】
1 つ目の依存関係は「mod_a で定義された変数 x : adder の第 1 引数」である。「mod_a で定義された変数 x」の型は sc_int<4> であり、「adder の第 1 引数」の型は指示されていない。このため mod_a の視点で関数 adder の第 1 引数が sc_int<4> となるような型書換指示 * adder(sc_int<4>, *) : call(mod_a)を生成する。
【００７４】
2 つ目の依存関係は「mod_a で定義された変数 y : adder の第 2 引数」である。「mod_a で定義された変数 y」の型は sc_int<4> であり、「adder の第 2 引数」の型は指示されていない。このため上記型書換指示 * adder(sc_int<4>, *) : call(mod_a)を、関数 adder の第 2 引数がmod_a の視点でsc_int<4> となるよう* adder(sc_int<4>, sc_int<4>) : call(mod_a) に変更する。
【００７５】
3 つ目の依存関係は「mod_b で定義された変数 x : adder の第 1 引数」である。「mod_b で定義された変数 x」の型は sc_int<8> であり、「adder の第 1 引数」の型は指示されていない。このため mod_b の視点で関数 adder の第 1 引数が sc_int<8> となるような型書換指示* adder(sc_int<8>, *) : call(mod_b) を生成する。
【００７６】
4 つ目の依存関係は「mod_b で定義された変数 y : adder の第 2 引数」である。「mod_b で定義された変数 y」の型は sc_int<8> であり、「adder の第 2 引数」の型は指示されていない。このため、上記型書換指示 * adder(sc_int<8>, *) : call(mod_b)を、mod_b の視点で関数 adder の第 2 引数が sc_int<8> となるよう* adder(sc_int<8>, sc_int<8>) : call(mod_b)に変更する。
【００７７】
5 つ目の依存関係は「mod_a での adder の戻り値 : mod_a の戻り値」である。「mod_a での adder の戻り値」の型は指示されておらず、「mod_a の戻り値」の型は sc_int<4> である。このため上記型書換指示 * adder(sc_int<4>, sc_int<4>) : call(mod_a)を、mod_a の視点で関数 a の戻り値が sc_int<4> となるようsc_int<4> adder(sc_int<4>, sc_int<4>) : call(mod_a) に変更する。
【００７８】
6 つ目の依存関係は「mod_b での adder の戻り値 : mod_b の戻り値」である。「mod_b での adder の戻り値」の型は指示されておらず、「mod_b の戻り値」の型は sc_int<8> である。このため上記型書換指示 * adder(sc_int<8>, sc_int<8>) : call(mod_b)を、 mod_b の視点で関数 b の戻り値が sc_int<8> となるようsc_int<8> adder(sc_int<8>, sc_int<8>) : call(mod_b) に変更する。
【００７９】
最終的に sc_int<4> adder(sc_int<4>, sc_int<4>) : call(mod_a) と sc_int<8> adder(sc_int<8>, sc_int<8>) : call(mod_b) が新たな型書換指示として得られ、これを図13に示す型書換集合に追加して出力する。これは図5に示す型書換集合と全く同じである。このため、本実施例における残りの動作（型決定部１４、設計記述断片生成部１５、設計記述書換部１６、設計記述出力部１７の動作）は完全に実施例１ に示した例と同じとなる。
【００８０】
（実施例３ の効果）
実施例１では、他の型書換指示から推論可能な型書換指示も明示的に記述しておく必要があった。それに比べ本実施例では、他の型書換指示から推論可能な型書換指示を自動で導出し、型書換集合に追加するため、ユーザが冗長な型書換指示集合をすべて用意する必要がなく、開発工数を削減することができる。
【実施例４】
【００８１】
実施例１〜実施例３では電子回路を含む電子システムの設計記述を想定した例を示したが、本実施例ではソフトウェアの設計記述（プログラム）を想定した例を示す。本実施例のブロック図は図１と同じである。したがって以下では、図１を参照して本実施例について説明する。
【００８２】
設計記述入力部１１は図15に示す設計記述の内部表現を出力する。この設計記述は関数 foo を指定している。引数および戻り値の型は規定せず、加算「＋」のオペレータが実行可能なことだけが仮定されている。引数および戻り値の型は、一般的な型（オブジェクト型）が指定されていると考えることもできる。図15の言語では加算のオペレータの意味が、引数の型に応じて動的に変化するものと考える。例えば整数 2 つが引数として渡された場合はその和を計算し、文字列が渡された場合はそれらを結合した文字列を計算する。
【００８３】
型書換指示集合入力部１２は図16に示す型書換指示集合の内部表現を出力する。この型書換指示は、関数 foo の型を int foo(int, int) に置き換える指示である。
【００８４】
指示対象同定部１３は、図15に示す設計記述の内部表現と図16に示す型書換指示集合の内部表現とを受け取り、型書換指示集合内部表現から変数・関数名の識別子とその視点とを抽出する。そして、変数・関数名の識別子を含む、設計記述内部表現内の構文（宣言文または定義文）を特定し、特定した構文を識別子および視点に対応付ける。これにより、図17に示す同定結果データを生成する。ここでは視点は省略されている。指示対象同定部１３はこの同定結果データを出力する。
【００８５】
型決定部１４は、図16に示す型書換指示集合の内部表現と図17に示す同定結果データとを受け取る。同定結果データには構文が１つしか存在せず、当該構文とその視点との組に対応する型書換指示を図16の型書換指示集合の内部表現から特定する。ここでは図16に示される唯一の型書換指示が特定される。そして、型決定部１４は、特定した型書換指示に示される型を、当該構文に対する型として決定し、これにより図18に示す型決定結果データを出力する。
【００８６】
設計記述断片生成部１５は、図16に示す型書換指示集合の内部表現と図18に示す型決定結果データを受け取る。型決定結果データにおいて、識別子を空欄にすることにより設計記述断片を生成する。生成された設計記述断片の例を図19に示す。空欄部は * で記述している。
【００８７】
また、設計記述断片生成部１５は、型書換指示集合内部表現から、型決定結果と異なる型を指定している型書換指示を探す。本実施例ではそのような指示は存在しないため、設計記述断片生成部１５の動作は終了する。
【００８８】
設計記述書換部１６は、図15に示す設計記述の内部表現と、図19に示す設計記述断片とを受け取る。設計記述内部表現において設計記述断片に示される構文に対して設計記述断片に示される型を埋め込む。図19に示す設計記述断片は、foo の関数定義に対して int *(int *, int *) を埋め込むため、関数 foo の定義は int foo(int x, int y) となる。これによって図20に示す新しい設計記述の内部表現を得る。設計記述書換部１６は、この新しい設計記述の内部表現を出力する。
【００８９】
設計記述出力部１７は、図20に示す設計記述の内部表現を受け取り、図20に示す設計記述を出力する。
【００９０】
（実施例４の効果）
プロトタイプ段階や型の柔軟性が求められるプログラムでは、オペレータの意味が引数の型に応じて動的に変化する方が、開発効率がよく、開発期間の短縮を図れる。一方で、型を限定したプログラムは、引数の型を動的に検査する必要がないため、高速な実行が可能になる。本実施例では、最初は一般化した型を用いて記述することで開発効率を上げ、実行効率が必要なところだけ後から型を指定することが可能になっている。このため開発期間の短縮と品質の向上を両立させることができる。
【００９１】
なお、以上に説明した各実施例における設計仕様書換装置は、例えば、汎用のコンピュータ装置を基本ハードウェアとして用いることでも実現することが可能である。すなわち、設計仕様書換装置における設計記述入力部、型書換指示集合入力部、指示対象同定部、型決定部、設計記述断片生成部、設計記述書換部、設計記述出力部、依存性解析部、型書換指示検証部、型書換指示追加部は、上記のコンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することができる。このとき、設計仕様書換装置は、上記のプログラムをコンピュータ装置にあらかじめインストールすることで実現してもよいし、ＣＤ−ＲＯＭなどの記憶媒体に記憶して、あるいはネットワークを介して上記のプログラムを配布して、このプログラムをコンピュータ装置に適宜インストールすることで実現してもよい。
【図面の簡単な説明】
【００９２】
【図１】本発明の実施例１、４に係る設計記述書換装置のブロック図。
【図２】本発明の実施例２に係る設計記述書換装置のブロック図。
【図３】本発明の実施例３に係る設計記述書換装置のブロック図。
【図４】実施例１に係る設計記述の例を示す図。
【図５】実施例１に係る型書換指示集合の例を示す図。
【図６】実施例１に係る同定結果データの例を示す図。
【図７】実施例１に係る型決定結果データの例を示す図。
【図８】実施例１に係る設計記述断片の例を示す図。
【図９】実施例１に係る設計記述断片の他の例を示す図。
【図１０】実施例１に係る書換後の設計記述の例を示す図。
【図１１】実施例２に係る型書換指示集合の例を示す図。
【図１２】実施例２に係る依存関係データの例を示す図。
【図１３】実施例３に係る型書換指示集合の例を示す図。
【図１４】実施例３に係る同定結果データの例を示す図。
【図１５】実施例４に係る設計記述の例を示す図。
【図１６】実施例４に係る型書換指示の例を示す図。
【図１７】実施例４に係る同定結果データの例を示す図。
【図１８】実施例４に係る型決定結果データの例を示す図。
【図１９】実施例４に係る設計記述断片の例を示す図。
【図２０】実施例４に係る書換後の設計記述の例を示す図。
【図２１】実施例１に係る設計記述に示される各モジュールの関係を示す図。
【図２２】実施例１に係る書換後の設計記述に示される各モジュールの関係を示す図。
【符号の説明】
【００９３】
１１：設計記述入力部
１２：型書換指示集合入力部（型指定記述入力部）
１３：指示対象同定部
１４：型決定部
１５：設計記述断片生成部
１６：設計記述書換部
１７：設計記述出力部
２１：依存性解析部
２２：型書換指示検証部（型指定記述検証部）
３１：型書換指示追加部（型指定記述書換部）
【図１】
2010079684.tif 000003
【図２】
2010079684.tif 000004
【図３】
2010079684.tif 000005
【図４】
2010079684.tif 000006
【図５】
2010079684.tif 000007
【図６】
2010079684.tif 000008
【図７】
2010079684.tif 000009
【図８】
2010079684.tif 000010
【図９】
2010079684.tif 000011
【図１０】
2010079684.tif 000012
【図１１】
2010079684.tif 000013
【図１２】
2010079684.tif 000014
【図１３】
2010079684.tif 000015
【図１４】
2010079684.tif 000016
【図１５】
2010079684.tif 000017
【図１６】
2010079684.tif 000018
【図１７】
2010079684.tif 000019
【図１８】
2010079684.tif 000020
【図１９】
2010079684.tif 000021
【図２０】
2010079684.tif 000022
【図２１】
2010079684.tif 000023
【図２２】
2010079684.tif 000024