(57)【要約】【課題】  ループ処理に対するユーザの習熟度を問わず、実行性能が高いコード変換を速やかに実現することができるコード生成装置を得ることを目的とする。【解決手段】  アルゴリズムが記述されているコードリスト１を解析し、そのコードリスト１の中でループ処理を実施している記述部分を識別するループ識別部１１と、そのループ識別部１１により識別された記述部分のパイプライン化を実現するコード変換処理を実施するコード変換部１３とを設け、そのコード変換部１３によるコード変換処理後のコードリストからハードウェアに実装可能なＨＤＬ言語のコード１９を生成する。【選択図】        図１
2007041796.tif 000002
【特許請求の範囲】
【請求項１】
アルゴリズムが記述されているコードリストを解析し、そのコードリストの中でループ処理を実施している記述部分を識別するループ処理識別手段と、上記ループ処理識別手段により識別された記述部分のパイプライン化を実現するコード変換処理を実施するコード変換手段と、上記コード変換手段によるコード変換処理後のコードリストからハードウェアに実装可能な言語のコードを生成するコード生成手段とを備えたコード生成装置。
【請求項２】
コード変換手段は、ループ処理識別手段によりループ処理を実施している記述部分が複数識別された場合、各々の記述部分に対してコード変換処理を実施することを特徴とする請求項１記載のコード生成装置。
【請求項３】
コード変換手段は、ループ処理識別手段によりループ処理を実施している記述部分が複数識別された場合、複数の記述部分を融合し、融合後の記述部分に対してコード変換処理を実施することを特徴とする請求項１記載のコード生成装置。
【請求項４】
コード変換手段は、ループ処理におけるデータの入出力関係を示す入出力仕様を満足するようにコード変換処理を実施することを特徴とする請求項１から請求項３のうちのいずれか１項記載のコード生成装置。
【請求項５】
コード変換手段から複数のコードリストが出力された場合、ハードウェアの要求仕様に応じて最適のコードリストを選択し、そのコードリストをコード生成手段に出力するコードリスト選択手段を設けたことを特徴とする請求項１から請求項４のうちのいずれか１項記載のコード生成装置。
【請求項６】
コードリスト選択手段は、ハードウェアの要求仕様が回路面積の制約を示している場合、回路面積が最小になるコードリストを選択することを特徴とする請求項５記載のコード生成装置。
【請求項７】
コードリスト選択手段は、ハードウェアの要求仕様が処理時間の制約を示している場合、処理時間が最小になるコードリストを選択することを特徴とする請求項５記載のコード生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、例えば、Ｃ言語のようなプログラミング言語でアルゴリズムが記述されたコードリストからハードウェアに実装可能なＨＤＬ言語のコードを生成するコード生成装置に関するものである。
【背景技術】
【０００２】
従来のコード生成装置では、例えば、Ｃ言語のようなプログラミング言語でアルゴリズムが記述されたコードリストからハードウェアに実装可能なＨＤＬ言語のコードを生成する際、ユーザがコードリストの中でループ処理を実施している記述部分を指定するとともに、ユーザがループ・アンロールやループ・パイプラインなどの変換方法を指定すると、それらの変換方法によるループ処理の実行時間を見積もる処理を実施する。
そして、ユーザがその見積もり結果を見て、変換方法を最終的に決定すると、コード生成装置が、その変換方法にしたがってループ処理を実施している記述部分のコード変換を実施する（例えば、特許文献１参照）。
【０００３】
なお、以下の非特許文献１には、ループ変換におけるループ融合（ｌｏｏｐ  ｆｕｓｉｏｎ）の実施方法が開示されている。
【０００４】
【特許文献１】ＵＳ２００３０００５４０４ （ＦＩＧ．３）
【非特許文献１】Antoine Fraboulet, Karen Godary, and Anne Mignotte. Loop Fusion for Memory Space Optimization. In International Symposium on System Synthesis (ISSS 2001), Montre'al, Canada, pages 95-100, October 2001. IEEE Press.
【発明の開示】
【発明が解決しようとする課題】
【０００５】
従来のコード生成装置は以上のように構成されているので、ユーザがループ処理を実施している記述部分とループ処理の変換方法を指定すれば、そのループ処理を実施している記述部分のコード変換を実施することができるが、ユーザがループ処理に対する習熟度が低い場合、実行性能が高いコード変換を実現することができず、また、多くの時間を必要とする課題があった。
また、ループ融合のように、ループ間に跨る変換処理は、ユーザが処理の依存関係を満足させながらコードを修正しなければならない。そのため、多くの時間を要するとともに、不具合を挿入してしまう可能性が高まる課題もあった。
【０００６】
この発明は上記のような課題を解決するためになされたもので、ループ処理に対するユーザの習熟度を問わず、実行性能が高いコード変換を速やかに実現することができるコード生成装置を得ることを目的とする。
【課題を解決するための手段】
【０００７】
この発明に係るコード生成装置は、アルゴリズムが記述されているコードリストを解析し、そのコードリストの中でループ処理を実施している記述部分を識別するループ処理識別手段と、そのループ処理識別手段により識別された記述部分のパイプライン化を実現するコード変換処理を実施するコード変換手段とを設け、そのコード変換手段によるコード変換処理後のコードリストからハードウェアに実装可能な言語のコードを生成するようにしたものである。
【発明の効果】
【０００８】
この発明によれば、アルゴリズムが記述されているコードリストを解析し、そのコードリストの中でループ処理を実施している記述部分を識別するループ処理識別手段と、そのループ処理識別手段により識別された記述部分のパイプライン化を実現するコード変換処理を実施するコード変換手段とを設け、そのコード変換手段によるコード変換処理後のコードリストからハードウェアに実装可能な言語のコードを生成するように構成したので、ループ処理に対するユーザの習熟度を問わず、実行性能が高いコード変換を速やかに実現することができる効果がある。
【発明を実施するための最良の形態】
【０００９】
実施の形態１．
図１はこの発明の実施の形態１によるコード生成装置を示す構成図であり、図において、コードリスト１はＣ言語のようなプログラミング言語でアルゴリズムが記述されているリストである。
入出力仕様２はループ処理におけるデータの入出力関係を示す仕様書である。
要求仕様３はハードウェアの回路面積の制約や、ハードウェアの処理時間の制約などが記述されているハードウェアの仕様書である。
【００１０】
ループ識別部１１はコードリスト１を入力すると、そのコードリスト１を解析して、そのコードリスト１の中でループ処理を実施している記述部分を識別する処理を実施する。また、ループ識別部１１はループ処理を実施している記述部分が複数存在する場合、それらのループ処理間のデータ入出力の依存関係を把握し、データ入出力の依存関係がある記述部分をグループ化する処理を実施する。なお、ループ識別部１１はループ処理識別手段を構成している。
ループ選択部１２はループ識別部１１から１以上のグループを受けると、いずれかのグループを選択して、そのグループをコード変換部１３に出力する処理を実施する。
【００１１】
コード変換部１３は第１の変換処理部１４と第２の変換処理部１５から構成されており、ループ選択部１２から出力されたグループに含まれているループ処理の記述部分のパイプライン化を実現するコード変換処理を実施する。なお、コード変換部１３はコード変換手段を構成している。
コード変換部１３の第１の変換処理部１４はループ選択部１２からデータ入出力の依存関係がある複数のループ処理の記述部分を含むグループを受けると起動し、各々の記述部分に対してコード変換処理を実施して、それらの変換結果を接続する処理を実施する。
第１の変換処理部１４のループ・パイプライン部１４ａは入出力仕様２を満足するように、グループに含まれている各々の記述部分に対してコード変換処理を実施する
第１の変換処理部１４のループ間バッファ生成・接続部１４ｂはループ・パイプライン部１４ａによるコード変換処理後のループ処理を相互に接続する処理を実施する。
【００１２】
コード変換部１３の第２の変換処理部１５はループ選択部１２からデータ入出力の依存関係がないループ処理の記述部分を受けると起動し、それらの記述部分を融合して、融合後の記述部分に対してコード変換処理を実施し、それらの変換結果を接続する処理を実施する。
第２の変換処理部１５のループ融合部１５ａはデータ入出力の依存関係がない複数のループ処理の記述部分を融合する処理を実施する。
第２の変換処理部１５のループ・パイプライン部１５ｂは入出力仕様２を満足するように、ループ融合部１５ａによる融合後の記述部分に対してコード変換処理を実施する。
第２の変換処理部１５のループ間バッファ生成・接続部１５ｃは融合後の記述部分が複数存在する場合、ループ・パイプライン部１５ｂによるコード変換処理後のループ処理を相互に接続する処理を実施する。
【００１３】
コードリスト選択部１６はコード変換部１３からコード変換処理後のコードリストが複数出力された場合、ハードウェアの要求仕様３に応じて最適のコードリストを選択し、そのコードリストをループ処理確定部１７に出力する処理を実施する。なお、コードリスト選択部１６はコードリスト選択手段を構成している。
ループ処理確定部１７はコードリスト選択部１６により選択されたコードリストを受けると、そのコードリストをコード生成部１８に出力する処理などを実施する。
コード生成部１８はループ処理確定部１７から出力されたコード変換処理後のコードリストからハードウェアに実装可能なＨＤＬ言語のコード１９を生成する処理を実施する。
なお、コード生成部１８はコード生成手段を構成している。
【００１４】
次に動作について説明する。
コード生成装置には、例えば、Ｃ言語のようなプログラミング言語でアルゴリズムが記述されているコードリスト１が入力される。なお、コードリスト１には、ループ処理を実施する記述部分が含まれている。
ここでは、説明の便宜上、Ｃ言語のようなプログラミング言語でアルゴリズムが記述されているコードリスト１が入力されるものについて示しているが、これに限るものではなく、他の言語でアルゴリズムが記述されているコードリスト１が入力されるものであってもよい。
【００１５】
図２はコードリスト１の一例を示す説明図である。
図２において、左辺にある“１”から“７”までの数字は、コードの説明を容易にするために便宜上付けている行番号であり、実際のコードリスト１には記述されていない。
図２の例では、行番号３及び行番号４にループ処理（行番号３には、このループ処理の名称「ＬＯＯＰ  Ｌ１」がコメントとして付記されている）が記述されており、また、行番号５及び行番号６にもループ処理（行番号５には、このループ処理の名称「ＬＯＯＰ  Ｌ２」がコメントとして付記されている）が記述されている。
【００１６】
「ＬＯＯＰ  Ｌ１」のループ処理では、インデックス変数“ｉ”を使用して、ループ回数が規定されており、そのループ処理中で使用されるデータは、ａ［］，ｂ［］の配列変数で表されている。
同様に、「ＬＯＯＰ  Ｌ２」のループ処理でも、インデックス変数“ｉ”を使用して、ループ回数が規定されており、そのループ処理中で使用されるデータは、ｂ［］，ｃ［］の配列変数で表されている。
【００１７】
また、コード生成装置には、ループ処理におけるデータの入出力関係を示す入出力仕様２が入力される。
即ち、入出力仕様２は、コード生成装置がコードリスト１からハードウェアに実装可能な最終的なコードであるＨＤＬコード１９を生成するに際して、ハードウェアとして実行されるコードが、外部のデータを入出力する際に規定される通信仕様を表しているものである。
このような通信仕様としては、生成するハードウェアが接続されるバスの通信仕様である場合がある。
バスの仕様としては、例えば、非特許文献 “ＡＲＭプロセッサ”（ＣＱ出版社）における“８．５  ＡＭＢＡ（Ａｄｖａｎｃｅｄ  Ｍｉｃｒｏｃｏｎｔｒｏｌｌｅｒ  Ｂｕｓ  Ａｒｃｈｉｔｅｃｔｕｒｅ）”のようなものがある。
ここでは、説明の便宜上、下記に示すようなバスの通信仕様が、入出力仕様２として入力されるものとする。
【００１８】
バスの通信仕様
・バス・クロック          →                バスの動作周波数
・バス転送サイズ          →                転送するデータのデータ幅
・バス・トランザクション  →  データの転送モード（バーストモードの可否）
なお、バーストモード（ｂｕｒｓｔ  ｍｏｄｅ）は、データを転送する際、最初の一回目だけアドレスを指定し、二回目以降のデータ転送時にはアドレスを指定しないで、データを連続的に送信するモードのことである。
バーストモードは、アドレス指定を省略する分だけ、データの転送速度が速くなる特徴を有しており、例えば、配列データのように、アドレス順に複数のデータが並んでいるような場合には、バーストモードを使用すれば、非常に高速なデータ転送を実施することが可能になる。
【００１９】
一般的なバスにおいては、バス転送サイズがバイト、半ワード又はワードであり、ワードにおける単発のリードアクセスやライトアクセスは通常可能な仕様であるため、ここでは、パイプライン合成において重要となる情報「どのバス転送サイズ（データ幅）で、バースト転送が可能か」が仕様として提供されているとする。
したがって、この実施の形態１では、下記に示すような入出力仕様２が入力されるものとする。
入出力仕様２の一例
ＣＬＯＣＫ＿ＦＲＥＱ：    ５０  ＭＨｚ      ／  バス・クロック  ／
ＳＩＺＥ：                ３２  ＢＩＴ      ／  バス転送サイズ  ／
ＴＲＡＮＳＡＣＴＩＯＮ：  ＢＵＲＳＴ        ／  バス・トランザクション ／
【００２０】
また、コード生成装置には、ハードウェアの回路面積の制約や、ハードウェアの処理時間の制約などが記述されている要求仕様３が入力される。
要求仕様３に記述されている回路面積の制約としては、回路を実現するターゲット・デバイスが、例えば、ゲートアレーのようなＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）で実現する場合には“最大ゲート数”などの制約が相当し、ターゲット・デバイスがＦＰＧＡである場合には“最大ＬＥ（Ｌｏｇｉｃ  Ｅｌｅｍｅｎｔ）数”などの制約が相当する。
また、要求仕様３に記述されている処理時間の制約としては、ハードウェアが“処理を開始してから、処理を終了するまでの時間が、何ｍｓ以内でなければならない”などの時間的な制約が相当する。
【００２１】
したがって、この実施の形態１では、下記に示すような要求仕様３が入力されるものとする。
要求仕様３の一例
ＭＡＸ＿ＡＲＥＡ：            １００００  ＬＥ    ／  面積制約  ／
ＭＡＸ＿ＰＲＯＣ＿ＴＩＭＥ：  ３３  ＭＳ          ／  処理時間  ／
ＰＲＩＯＲＩＴＹ：            ＡＲＥＡ            ／  面積重視か時間重視か ／
ＥＲＲＯＲ：                  ＦＩＮＩＳＨ        ／  エラー時  ／
【００２２】
なお、上記の「ＰＲＩＯＲＩＴＹ」は、回路面積と処理時間の両方の制約を満足する変換処理後のコードリストが複数存在する場合、どちらの制約を優先的に判断して、どちらのコードリストを選択するかを決定するための指標である。
例えば、「ＰＲＩＯＲＩＴＹ」で「ＡＲＥＡ」が指定されていれば、面積重視であるため、より回路面積が小さくなるコードリストを選択する。
一方、「ＰＲＩＯＲＩＴＹ」で「ＰＲＯＣ＿ＴＩＭＥ」が指定されていれば、処理時間重視であるため、より処理時間が短くなるコードリストを選択する。
【００２３】
上記の「ＥＲＲＯＲ」は、要求仕様を満足するコードリストが存在しない場合の処理内容を記述している。
例えば、「ＥＲＲＯＲ」で「ＦＩＮＩＳＨ」が指定されている場合、要求仕様を満足するコードリストが存在しなければ、コードの生成処理を終了する。
また、「ＥＲＲＯＲ」で「ＳＥＬＥＣＴ」が指定されている場合、要求仕様を満足するコードリストが存在しなければ、最も要求仕様に近いコードリストを選択する。
【００２４】
コード生成装置のループ識別部１１は、図２に示すようなコードリスト１を入力すると、そのコードリスト１を解析して、そのコードリスト１の中でループ処理を実施している記述部分を識別する処理を実施する。
図２の例では、「ＬＯＯＰ  Ｌ１」のループ処理が記述されている行番号３，４が識別されるとともに、「ＬＯＯＰ  Ｌ２」のループ処理が記述されている行番号５，６が識別される。
なお、ループ処理を実施している記述部分の識別処理は、例えば、ｆｏｒ（）などのループ処理を実施する関数を検出することにより行う。
【００２５】
また、ループ識別部１１は、ループ処理を実施している記述部分が複数存在する場合、それらのループ処理間のデータ入出力の依存関係を把握し、データ入出力の依存関係がある記述部分をグループ化する処理を実施する。
即ち、どのループ処理にも依存関係が存在しなければ、各々のループ処理を並列に独立して実行することが可能であり、各々のループ処理を独立にパイプライン化することが可能であるため、複数のループ処理間のデータ入出力の依存関係を把握する。
そして、コードリスト１に含まれている１以上のループ処理の中で、データ入出力を依存しているループ処理同士を同一のグループの分類し、データ入出力の依存関係がないループ処理は異なるグループに分類する。
図２の例では、「ＬＯＯＰ  Ｌ１」のループ処理（以下、ループ処理Ｌ１という）と「ＬＯＯＰ  Ｌ２」のループ処理（以下、ループ処理Ｌ２という）が存在し、ループ処理Ｌ１におけるｂ［ｉ］が、ループ処理Ｌ２の入力であるため、ループ処理Ｌ１とループ処理Ｌ２は、データ入出力の依存関係がある。
したがって、ループ処理Ｌ１とループ処理Ｌ２は、同一のグループに分類される。
図２の例では、コードリスト１にはループ処理Ｌ１とループ処理Ｌ２だけが含まれており、他のループ処理が含まれていないので、生成されるグループの個数は１個である。
【００２６】
ループ選択部１２は、ループ識別部１１から１以上のグループを受けると、いずれかのグループを選択して、そのグループをコード変換部１３に出力する処理を実施する。
図２の例では、ループ識別部１１からループ処理Ｌ１とループ処理Ｌ２を含むグループだけが出力されるので、そのグループをコード変換部１３の第１の変換処理部１４とコード変換部１３の第２の変換処理部１５とに出力する。
ループ選択部１２では、ループ識別部１１から受け取った複数のグループに対して、各々コード変換部１３以降の処理を実施し、ＨＤＬコード１９を入手する。
【００２７】
最初に第１の変換処理部１４について説明を行う。第１の変換処理部１４のループ・パイプライン部１４ａは、ループ選択部１２からループ処理Ｌ１とループ処理Ｌ２を含むグループを受けると、入出力仕様２を満足する条件の下で、ループ処理Ｌ１のパイプライン化を実現するコード変換処理を実施する。同様に、
ループ処理Ｌ２のパイプライン化を実現するコード変換処理を実施する。
ここで、ループ処理のパイプライン化は、ループ処理における複数のイタレーションをオーバーラップさせながら、同時に実行することにより、処理の性能を高める（実行時間を短縮する）技術である。
例えば、図３に示すようなループ処理をパイプライン化すると、このループ処理は、図４に示すような実行形態になる。
図４において、開始間隔は、あるイタレーションｉの実行を開始してから、次のイタレーションｉ＋１の実行を開始するまでのサイクル数である。
また、レイテンシは、一つのイタレーションを開始してから終了するまでのサイクル数である。なお、図３においてA()，B()，C()は各々同じ開始間隔を持つ関数であり、それらがfor文の中で、iを引数としてコール（呼び出される）事を表している。
【００２８】
例えば、ループ処理をパイプライン化したときの全実行サイクルがＰｃ、開始間隔がＩ、ループ実行回数がＮ、レイテンシがＬである場合、全実行サイクルＰｃは、下記の式（１）に示すようになる。
Ｐｃ＝Ｉ×（Ｎ−１）＋Ｌ                                        （１）
一方、ループ処理がパイプライン化されない場合の全実行サイクルＮｃは、一般的に、下記の式（２）に示すようになる。
Ｎｃ＝Ｎ×Ｌ                                                    （２）
したがって、ループ処理をパイプライン化することにより、処理サイクル数の減少割合Ｐｃ／Ｎｃは、下記の式（３）に示すようになる。
Ｐｃ／Ｎｃ＝Ｉ／Ｌ×（１−１／Ｎ）＋１／Ｎ                      （３）
式（３）から明らかなように、ループ回数Ｎが増えれば増えるほど、減少割合Ｐｃ／Ｎｃが大きく減少するため、ループ処理の実現ではパイプライン化がなされることが多い。
なお、ループ処理のパイプライン化に関しては、例えば、特開平８−４４７７３号公報や、特開２００４−３２６４６３号公報などに詳述されている。
【００２９】
ループ・パイプライン部１４ａがループ処理Ｌ１，Ｌ２のパイプライン化を実現するに際して、ループ処理Ｌ１，Ｌ２が必要とする入力データと、ループ処理Ｌ１，Ｌ２が生成する出力データとが、どのような時系列で取り込まれ（ＲＥＡＤ）、もしくは、どのような時系列で書き出される（ＷＲＩＴＥ）かが重要となる。
例えば、図２の関数ｆｉｌｔｅｒ（）の場合、入力データが配列変数ａ［］になり、出力データが配列変数ｃ［］になるが、この配列変数ａ［］とｃ［］のＲＥＡＤ／ＷＲＩＴＥアクセスに対して、どのような入出力仕様が与えられるかが重要になる。
何ら入出力仕様が与えられなければ、ターゲット・デバイス上で実現可能な回路の動作周波数や、パイプラインの開始間隔や、レイテンシの中で、任意のパイプラン動作としての実現を選択することが可能であるが、一般的には、少なくとも、入力データか、出力データが入出力仕様２として与えられる。
【００３０】
例えば、入出力仕様２として、「５０ＭＨｚ  ＋  ３２ｂｉｔ  ＋  ＢＵＲＳＴ」がループ・パイプライン部１４ａに入力された場合、ループ・パイプライン部１４ａは、ループ処理Ｌ１の入力データである配列変数ａ［］と、ループ処理Ｌ２の出力データである配列変数ｃ［］が入出力仕様２を満足するように、ループ処理Ｌ１，Ｌ２に対してコード変換処理を実施する。
即ち、配列変数ａ［］が「５０ＭＨｚ  ＋  ３２ｂｉｔ  ＋  ＢＵＲＳＴ」の入力仕様を満足し、配列変数ｃ［］が「５０ＭＨｚ  ＋  ３２ｂｉｔ  ＋  ＢＵＲＳＴ」の出力仕様を満足するように、ループ処理Ｌ１，Ｌ２に対してコード変換処理を実施する。ここで
、入力仕様を満足するという事は、50MHz毎に配列a[i]の値がインデックスiの順番通り、順次filter()に取り込まれる、という事を表しており、出力仕様を満足するという事は50MHz毎に配列c[i]の値がインデックスiの順番通り、順次filter()から出力されるという事を表している。
ただし、ループ処理Ｌ１の出力であり、かつ、ループ処理Ｌ２の入力データである配列変数ｂ［］には、入出力仕様が規定されていない。そのため、ループ処理Ｌ１における配列変数ｂ［］に対する書き込み（ＷＲＩＴＥ）仕様と、ループ処理Ｌ２における配列変数ｂ［］からの読み込み（ＲＥＡＤ）仕様は、配列変数ａ［］，ｃ［］に対する入出力仕様を満足する形態で適当に規定するものとする。
【００３１】
図２の例では、ループ処理Ｌ１のパイプライン化を実現するに際して、ａ［０］，ａ［１］，ａ［２］,・・・という入力シーケンスに対して、出力データであるｂ［］は、次のように、順次確定することができる。
ａ［０］：  確定出来るｂ［］なし
ａ［１］：  確定出来るｂ［］なし
ａ［２］：  ｂ［１］
ａ［３］：  ｂ［２］
ａ［４］：  ｂ［３］
そのため、ループ処理Ｌ１における出力データであるｂ［］に対しては、ａ［］の取り込みタイミング、即ち、ａ［］の入出力仕様である「５０ＭＨｚ  ＋  ３２ｂｉｔ  ＋  ＢＵＲＳＴ」と同じタイミングで、ｂ［］がｂ［１］からｂ［９９９８］まで順次生成される。
【００３２】
また、ループ処理Ｌ２のパイプライン化を実現するに際して、ｃ［１００］，ｃ［１０１］，・・・の出力値を順次確定するために、ループ処理Ｌ２への入力データであるｂ［］が、下記のように取り込めなければ、出力仕様を満足することができるｃ［］の出力シーケンスを生成することができない。
ｃ［１００］  ：    ｂ［０］，ｂ［１００］，ｂ［２００］
ｃ［１０１］  ：    ｂ［１］，ｂ［１０１］，ｂ［２０１］
ｃ［１０２］  ：    ｂ［２］，ｂ［１０２］，ｂ［２０２］
…
ｃ［９８９８］：    ｂ［９７９８］，ｂ［９８９８］，ｂ［９９９８］
そのため、出力サイクル（５０ＭＨｚ）毎に、ｂ［ｉ−１００］，ｂ［ｉ］，ｂ［ｉ＋１００］がアクセスできる事を前提に、ループ処理Ｌ２のパイプライン化が行われる。
【００３３】
第１の変換処理部１４のループ間バッファ生成・接続部１４ｂは、上記のようにして、ループ・パイプライン部１４ａがループ処理Ｌ１，Ｌ２のパイプライン化を行うと、パイプライン化されたループ処理Ｌ１とループ処理Ｌ２を接続するために、ｂ［］の接続処理を実施する。
即ち、ループ間バッファ生成・接続部１４ｂは、ループ処理Ｌ１，Ｌ２の間で必要となるデータのハンドリングを行うための信号線の接続や、データ一時保持用のバッファの生成や、ループ処理Ｌ１，Ｌ２の間の開始・終了制御信号の生成を行う。
図２の例では、ループ処理Ｌ１のパイプライン出力b[]を２００個分（b[0]〜b[199]）バッファリングし、サイクル毎に、ループ処理Ｌ２のパイプライン入力に対して、（ｂ［ｉ−１００］，ｂ［ｉ］，ｂ［ｉ＋１００］）を出力するとともに、ｂ［］が２００個分のバッファリングが終わると、ループ処理Ｌ２のパイプラインの動作開始信号を生成する接続回路を生成する。
これにより、第１の変換処理部１４から、ループ処理Ｌ１，Ｌ２のパイプライン実行形態を内包しているコードリストが生成される。
【００３４】
第２の変換処理部１５は、ループ選択部１２から複数のループ処理を含むグループを受け取り、グループ内の各ループ処理に対し、１つのループ処理に纏める処理である。例えば、図５に示すような３つのループ処理を１つのループ処理に纏めると、図３のようなループ処理になる。
このように、複数のループ処理の融合を行うことにより、処理の並列度が高まり、より短い時間で処理を完了することが可能になる。ループ融合に関しては、上記の非特許文献１に詳述されている。
【００３５】
ただし、コードリスト１に記述されているコードからループ融合を行うには、それらのコードの変換前後で、ループ処理間における全ての依存関係（例えば、フロー依存、逆依存、出力依存）が保存される必要があるため、ループ融合部１５ａでは、最初に依存関係が保存されるかを判断し、保存されるのであればループ融合を行うようにする。
その際、ループアライメント、ループピーリングやスカラーリプレースメントのようなループ融合に必要となる各種前処理も実施する。これら前処理に関しても、上記の非特許文献１に詳述されている。
例えば、図２のコードリスト１に対して各種の前処理を実施して、ループ融合を実施すると、図６のようになる。
ただし、依存関係の問題からループ融合が出来なかった場合には、ループ融合が出来るループのみを選択し、ループ融合を行う。
【００３６】
第２の変換処理部１５のループ・パイプライン部１５ｂは、ループ融合部１５ａが複数のループ処理の記述部分を融合すると、入出力仕様２を満足するように、ループ融合部１５ａによる融合後の記述部分に対してコード変換処理を実施する。
ループ・パイプライン部１５ｂにおけるコード変換処理は、第１の変換処理部１４のループ・パイプライン部１４ａにおけるコード変換処理と同様であるため、詳細な説明を省略する。
【００３７】
第２の変換処理部１５のループ間バッファ生成・接続部１５ｃは、融合後の記述部分が複数存在する場合、ループ・パイプライン部１５ｂによるコード変換処理後のループ処理を相互に接続する処理を実施する。
ループ間バッファ生成・接続部１５ｃにおける接続処理は、第１の変換処理部１４のループ間バッファ生成・接続部１４ｂにおける接続処理と同様であるため、詳細な説明を省略する。
【００３８】
コードリスト選択部１６は、第１の変換処理部１４からコード変換処理後のコードリストが出力され、第２の変換処理部１５からコード変換処理後のコードリストが出力されると、ハードウェアの要求仕様３に応じて最適のコードリストを選択し、そのコードリストをループ処理確定部１７に出力する処理を実施する。
即ち、コードリスト選択部１６は、双方のコードリストが要求仕様３に記述されている回路面積の制約と、処理時間の制約とを満足しているか否かを判断し、例えば、第１の変換処理部１４から出力されたコードリストが両方の制約を満足しているが、第２の変換処理部１５から出力されたコードリストがいずれかの制約を満足していなければ、第１の変換処理部１４から出力されたコードリストを選択して、そのコードリストをループ処理確定部１７に出力する処理を実施する。
逆に、第２の変換処理部１５から出力されたコードリストが両方の制約を満足しているが、第１の変換処理部１４から出力されたコードリストがいずれかの制約を満足していなければ、第２の変換処理部１５から出力されたコードリストを選択して、そのコードリストをループ処理確定部１７に出力する処理を実施する。
【００３９】
また、両方のコードリストが両方の制約を満足している場合、要求仕様３に記述されている優先度（ＡＲＥＡ  ｏｒ  ＰＲＯＣ＿ＴＩＭＥ） を基準にして、より適切なコードリストを選択する。
例えば、回路面積の制約の点では、第１の変換処理部１４から出力されたコードリストが第２の変換処理部１５から出力されたコードリストより優れているが、処理時間の制約の点では、第２の変換処理部１５から出力されたコードリストが第１の変換処理部１４から出力されたコードリストより優れている場合において、「ＰＲＩＯＲＩＴＹ」で「ＡＲＥＡ」が指定されていれば、面積重視であるため、第１の変換処理部１４から出力されたコードリストを選択する。
一方、「ＰＲＩＯＲＩＴＹ」で「ＰＲＯＣ＿ＴＩＭＥ」が指定されていれば、処理時間重視であるため、第２の変換処理部１５から出力されたコードリストを選択する。
【００４０】
また、両方のコードリストが共に、制約を満足していない場合には（両方の制約を満足していない場合の他、片方の制約を満足していない場合も含む）、「ＥＲＲＯＲ」で「ＳＥＬＥＣＴ」が指定されていれば、上記のように、要求仕様３に記述されている優先度（ＡＲＥＡ  ｏｒ  ＰＲＯＣ＿ＴＩＭＥ） を基準にして、より適切なコードリストを選択する。
「ＥＲＲＯＲ」で「ＦＩＮＩＳＨ」が指定されていれば、いずれのコードリストも選択せずに、適切なコードリストが存在しない旨をループ処理確定部１７に通知する。
【００４１】
ループ処理確定部１７は、コードリスト選択部１６により選択されたコードリストを受けると、そのコードリストをコード生成部１８に出力する。
ただし、コードリスト選択部１６から適切なコードリストが存在しない旨の通知を受けると、一連のコード生成処理を終了する。
コード生成部１８は、ループ処理確定部１７からコード変換処理後のコードリストを受けると、そのコードリストからハードウェアに実装可能なＨＤＬ言語のコード１９を生成する処理を実施する。
Ｃ言語などで記述されたコードリストからＨＤＬ言語のコード１９を生成する処理自体は、公知の技術であるため詳細な説明は省略する。
【００４２】
以上で明らかなように、この実施の形態１によれば、アルゴリズムが記述されているコードリスト１を解析し、そのコードリスト１の中でループ処理を実施している記述部分を識別するループ識別部１１と、そのループ識別部１１により識別された記述部分のパイプライン化を実現するコード変換処理を実施するコード変換部１３とを設け、そのコード変換部１３によるコード変換処理後のコードリストからハードウェアに実装可能なＨＤＣ言語のコード１９を生成するように構成したので、ループ処理に対するユーザの習熟度を問わず、実行性能が高いコード変換を速やかに実現することができる効果を奏する。
【００４３】
また、この実施の形態１によれば、データ入出力の依存関係がない複数のループ処理の記述部分を融合するように構成したので、更なる処理の高速化を図ることができる効果を奏する。
また、この実施の形態１によれば、第１の変換処理部１４からコード変換処理後のコードリストが出力され、第２の変換処理部１５からコード変換処理後のコードリストが出力されると、ハードウェアの要求仕様３に応じて最適のコードリストを選択するように構成したので、実行性能の最適化を図ることができる効果を奏する。
【００４４】
さらに、この実施の形態１によれば、ハードウェアの要求仕様が回路面積の制約を示している場合、回路面積が最小になるコードリストを選択するように構成したので、回路面積を重視したコード変換を実現することができる効果を奏する。
また、この実施の形態１によれば、ハードウェアの要求仕様が処理時間の制約を示している場合、処理時間が最小になるコードリストを選択するように構成したので、処理時間を重視したコード変換を実現することができる効果を奏する。
【図面の簡単な説明】
【００４５】
【図１】この発明の実施の形態１によるコード生成装置を示す構成図である。
【図２】Ｃ言語のようなプログラミング言語でアルゴリズムが記述されているコードリストの一例を示す説明図である。
【図３】ループ処理のパイプライン化を説明するためのＣ言語記述のコードリストの一例を示す説明図である。
【図４】パイプライン化されたループ処理の実行動作を示す説明図である。
【図５】ループ処理の融合を説明するためのコードリストの一例を示す説明図である。
【図６】ループ処理の融合を説明するためのコードリストの一例を示す説明図である。
【符号の説明】
【００４６】
１  コードリスト、２  入出力仕様、３  要求仕様、１１  ループ識別部（ループ処理識別手段）、１２  ループ選択部、１３  コード変換部（コード変換手段）、１４  第１の変換処理部、１４ａ  ループ・パイプライン部、１４ｂ  ループ間バッファ生成・接続部、１５  第２の変換処理部、１５ａ  ループ融合部、１５ｂ  ループ・パイプライン部、１５ｃ  ループ間バッファ生成・接続部、１６  コードリスト選択部（コードリスト選択手段）、１７  ループ処理確定部、１８  コード生成部（コード生成手段）。
【図１】
2007041796.tif 000003
【図２】
2007041796.tif 000004
【図３】
2007041796.tif 000005
【図４】
2007041796.tif 000006
【図５】
2007041796.tif 000007
【図６】
2007041796.tif 000008