(57)【特許請求の範囲】
【請求項１】
回路設計のためのハードウェアの一連の処理の流れである動作記述を記述した論理回路生成対象の最上位関数を含むプログラムを入力に取り、論理回路記述を生成する、論理回路生成装置であって、
ループ処理部及び関数呼出し命令を含まない前記最上位関数から、制御フローグラフを生成する、制御フローグラフ生成部と、
変数に対する代入命令を各変数につき１つだけ含む前記制御フローグラフから、すべての条件分岐命令を除去することによって、制御フローが縮退されたプログラムである制御フロー縮退プログラムを生成する、制御フロー縮退変換部と、
前記制御フロー縮退プログラムから、前記制御フロー縮退プログラムの各命令をノードとし、各変数への代入命令からその変数を参照する命令への有向枝を付加することによって、データフローグラフを生成する、データフローグラフ生成部と、
前記データフローグラフの前記有向枝が論理回路の配線に対応し、前記データフローグラフの前記ノードが論理回路の演算器に対応する順序回路を表す論理回路記述を生成する、論理回路記述出力部と、
を備え、
前記順序回路の状態を表す状態変数は、前記プログラムにおいて、前記最上位関数を呼出す上位階層関数のローカル変数又はスタティック変数として表現され、
前記状態変数への代入命令が実行される前の前記状態変数の値が前記順序回路の現状態を表し、前記状態変数への代入命令が実行された後の前記状態変数の値が前記順序回路の次状態を表す
ことを特徴とする、論理回路生成装置。
【請求項２】
請求項１に記載の論理回路生成装置において、
前記最上位関数が、変数に対する代入命令を各変数につき１つだけ含む静的単一代入形式でない場合に、前記制御フローグラフを、前記制御フロー縮退変換部に入力される前に、静的単一代入形式に変換する、静的単一代入形式変換部をさらに備え、
前記静的単一代入形式変換部は、
前記制御フローグラフにおいて同一変数に対する値の定義が複数個合流する箇所に、その箇所に合流する全ての変数定義の中から実際に実行された経路上の変数定義を選択するφ関数命令を挿入する、φ関数命令挿入部と、
前記制御フローグラフに含まれる各変数の名前を、変数に対する代入命令ごとに別の名前となるように変換することによって、前記制御フローグラフが名前変換後の各変数につき代入命令を１つだけ含む静的単一代入形式に変換する、変数名変換部と、
名前変換後の前記状態変数について、前記制御フローグラフの始点ブロックにおける変数名と終点ブロックに到達する変数名とを一致させるように、変数名を再度変換する、状態変数名再変換部と、
を含み、
前記制御フロー縮退変換部は、前記φ関数命令を具体的な演算命令に変換する、φ関数命令実体化部を含む、
ことを特徴とする論理回路生成装置。
【請求項３】
請求項１又は請求項２に記載の論理回路生成装置において、
前記最上位関数が配列変数に対する書込み処理命令である配列代入命令を含む場合に、
各配列変数について、前記制御フローグラフに書込みデータ変数及び書込みアドレス変数を付加し、
各配列代入命令を、配列要素への代入値を前記書込みデータ変数へ代入する命令と、配列インデックス値を前記書込みアドレス変数へ代入する命令と、前記書込みアドレス変数を配列インデックスとすることによって定まる配列要素に前記書込みデータ変数の値を代入する命令とに分解する、
配列代入命令分解部と、
前記最上位関数が配列変数に対する読出し処理命令である配列参照命令を含む場合に、
各配列変数について、前記制御フローグラフに読出しアドレス変数を付加し、
各配列参照命令を、配列インデックス値を前記読出しアドレス変数へ代入する命令と、前記読出しアドレス変数を配列インデックスとすることによって定まる配列要素を参照する命令とに分解する、
配列参照命令分解部と、
を含むレジスタ／メモリ配列アクセス命令分解部をさらに備え、
論理回路において各配列要素データを保持するためのメモリは、
前記書込みデータ変数が前記メモリの書込みデータポートに対応し、
前記書込みアドレス変数が前記メモリの書込みアドレスポートに対応し、
前記読出しアドレス変数が前記メモリの読出しアドレスポートに対応した
ものであり、
前記制御フローグラフ生成部によって生成された前記制御フローグラフは、前記レジスタ／メモリ配列アクセス命令分解部によって処理された後に、前記制御フロー縮退変換部によって処理される
ことを特徴とする論理回路生成装置。
【請求項４】
請求項３に記載の論理回路生成装置において、
前記レジスタ／メモリ配列アクセス命令分解部は、
前記制御フローグラフにおける各配列変数に対する各配列代入命令について、始点ブロックから該配列代入命令までの間に実行される該配列変数への配列代入命令の実行回数の最大値を書込みポート番号として該配列代入命令に割当てる、書込みポート番号割当部と、
前記制御フローグラフにおける各配列変数に対する各配列参照命令について、始点ブロックから該配列参照命令までの間に実行される該配列変数への配列参照命令の実行回数の最大値を読出しポート番号として該配列参照命令に割当てる、読出しポート番号割当部と、
をさらに含み、
前記配列代入命令分解部は、各配列変数について、前記書込みポート番号ごとに、前記書込みデータ変数及び前記書込みアドレス変数を前記制御フローグラフに付加し、かつ、前記読出しポート番号ごとに、前記読出しアドレス変数を前記制御フローグラフに付加し、
各配列要素データを保持するための前記メモリは、該配列変数の代入命令に割り当てられた前記書込みポート番号の数と同数の書込みポートと、該配列変数の参照命令に割り当てられた前記読出しポート番号の数と同数の読出しポートとを持つ
ことを特徴とする論理回路生成装置。
【請求項５】
請求項４に記載の論理回路生成装置において、
前記書込みポート番号割当部が割当てた前記書込みポート番号の数が、予め定められた書込みメモリポート数閾値以下であるか否かを判定し、前記読出しポート番号割当部が割当てた前記読出しポート番号の数が、予め定められた読出しメモリポート数閾値以下であるか否かを判定する、メモリポート数判定部、
をさらに備え、
前記書込みポート番号の数が、予め定められた書込みメモリポート数閾値以下である場合、又は前記読出しポート番号の数が、予め定められた読出しメモリポート数閾値以下である場合には、論理回路記述を生成する処理を停止すること
を特徴とする論理回路生成装置。
【請求項６】
請求項１〜５のいずれかに記載の論理回路生成装置において、
入力される前記プログラムは、各変数に属性を付与するための属性記述を含み、前記属性は、
変数のデータのビット幅を指定する、ビット幅属性と、
変数の値をレジスタに保持することを指定する、レジスタ属性と、
配列変数の配列要素の値をメモリに保持することを指定する、メモリ属性と、
を含み、
前記レジスタ属性又は前記メモリ属性が付与された変数を前記状態変数とすることによって状態が表現される順序回路を含む論理回路記述を生成する
ことを特徴とする論理回路生成装置。
【請求項７】
請求項６に記載の論理回路生成装置において、
前記データフローグラフに含まれる変数に対して、該変数に対する代入命令において参照される変数及び／又は定数のビット幅と該代入命令において実行される演算の種類とから該変数のビット幅を算出する、ビット幅判定部と、
前記データフローグラフに含まれる変数に対して算出されたビット幅に基づいて、演算器の信号伝搬遅延時間を算出する、演算器回路遅延評価部と、
パイプライン制約抽出部及びパイプライン段数決定部を含むパイプライン境界配置部と、
をさらに備え、
前記パイプライン制約抽出部は、前記データフローグラフにおける前記状態変数に対する代入命令を実行する演算器と該状態変数に対する参照命令を実行する演算器との間の有向枝にパイプライン境界属性を付加し、
前記パイプライン段数決定部は、クロック同期型パイプライン回路の回路記述を生成するために用いられるパイプライン段数を、前記パイプライン境界属性に基づく制約によって定まる必要最小限のパイプライン段数であるパイプライン段数下限値と、指定されたクロック周期から算出したパイプライン段数又は予め指定されたパイプライン段数とに従って決定する
ことを特徴とする論理回路生成装置。
【請求項８】
請求項１〜７のいずれかに記載の論理回路生成装置において、
前記最上位関数の引数及びグローバル変数から、前記回路記述によって記述されることになる回路の入力信号を抽出する、論理回路入力信号抽出部と、
前記最上位関数の引数及び戻り値並びにグローバル変数から、前記回路記述によって記述されることになる回路の出力信号を抽出する、論理回路出力信号抽出部と、
をさらに備えることを特徴とする論理回路生成装置。
【請求項９】
請求項１〜８のいずれかに記載の論理回路生成装置において、
前記最上位関数が関数呼出し命令を含む場合に、それぞれの関数呼出し命令をインライン展開することによって、前記最上位関数を、関数呼出し命令を含まない最下層関数に変換する、完全インライン展開部と、
前記完全インライン展開部によって変換された前記最下層関数が固定繰返し回数のループ処理部を含む場合に、それぞれの固定繰返し回数のループ処理部をループ展開することによって、前記最下層関数を、ループ処理部を含まない非循環型最下層関数に変換する、完全ループ展開部と、
を含む非循環・非階層変換部をさらに備え、
前記論理回路生成装置に入力されたプログラムは、前記非循環・非階層変換部によって非循環型最下層関数に変換された後に、前記制御フローグラフ生成部に入力される
ことを特徴とする論理回路生成装置。
【請求項１０】
請求項９に記載の論理回路生成装置において、
前記完全インライン展開部は、入力された関数に対してインライン展開を所定の回数繰返しても関数呼出し命令が完全に展開されない場合には、該関数を最下層関数に変換不可能であると判断して処理を中止するように構成され、
完全ループ展開部は、入力された関数に繰返し回数が定数ではないループ処理部が含まれる場合には、該関数を非循環型最下層関数に変換不可能であると判断して処理を中止するように構成され、
前記完全インライン展開可能性判定部が処理を中止した場合、又は前記完全ループ展開可能性判定部が処理を中止した場合には、論理回路記述を生成する処理を停止する
ことを特徴とする論理回路生成装置。
【請求項１１】
請求項１〜１０のいずれかに記載の論理回路生成装置において、
前記制御フローグラフにおいて、同一の前記状態変数に対して代入命令・参照命令・代入命令がこの順序で連続して実行される場合がないか否を判定する、状態変数命令依存性判定部をさらに備え、
前記状態変数命令依存性判定部が「否」と判定した場合には、論理回路記述を生成する処理を停止する
ことを特徴とする論理回路生成装置。
【請求項１２】
回路設計のためのハードウェアの一連の処理の流れである動作記述を記述した論理回路生成対象の最上位関数を含むプログラムを入力に取り、論理回路記述を生成する、論理回路生成装置によって行われる、論理回路生成方法であって、
前記論理回路生成装置は、
ループ処理部及び関数呼出し命令を含まない前記最上位関数から、制御フローグラフを生成する、制御フローグラフ生成ステップと、
変数に対する代入命令を各変数につき１つだけ含む前記制御フローグラフから、すべての条件分岐命令を除去することによって、制御フローが縮退されたプログラムである制御フロー縮退プログラムを生成する、制御フロー縮退変換ステップと、
前記制御フロー縮退プログラムから、前記制御フロー縮退プログラムの各命令をノードとし、各変数への代入命令からその変数を参照する命令への有向枝を付加することによって、データフローグラフを生成する、データフローグラフ生成ステップと、
前記データフローグラフの前記有向枝が論理回路の配線に対応し、前記データフローグラフの前記ノードが論理回路の演算器に対応する順序回路を表す論理回路記述を生成する、論理回路記述生成ステップと、
を行い、
前記順序回路の状態を表す状態変数は、前記プログラムにおいて、前記最上位関数を呼出す上位階層関数のローカル変数又はスタティック変数として表現され、
前記状態変数への代入命令が実行される前の前記状態変数の値が前記順序回路の現状態を表し、前記状態変数への代入命令が実行された後の前記状態変数の値が前記順序回路の次状態を表す
ことを特徴とする、論理回路生成方法。
【請求項１３】
請求項１２に記載の論理回路生成方法において、
前記論理回路生成装置は、前記最上位関数が、変数に対する代入命令を各変数につき１つだけ含む静的単一代入形式でない場合に、前記制御フロー縮退変換ステップの前に、前記制御フローグラフを静的単一代入形式に変換する、静的単一代入形式変換ステップをさらに行い、
前記静的単一代入形式変換ステップは、
前記制御フローグラフにおいて同一変数に対する値の定義が複数個合流する箇所に、その箇所に合流する全ての変数定義の中から実際に実行された経路上の変数定義を選択するφ関数命令を挿入する、φ関数命令挿入ステップと、
前記制御フローグラフに含まれる各変数の名前を、変数に対する代入命令ごとに別の名前となるように変換することによって、前記制御フローグラフが名前変換後の各変数につき代入命令を１つだけ含む静的単一代入形式に変換する、変数名変換ステップと、
名前変換後の前記状態変数について、前記制御フローグラフの始点ブロックにおける変数名と終点ブロックに到達する変数名とを一致させるように、変数名を再度変換する、状態変数名再変換ステップと、
を含み、
前記制御フロー縮退変換ステップは、前記φ関数命令を具体的な演算命令に変換する、φ関数命令実体化ステップをさらに含む、
ことを特徴とする論理回路生成方法。
【請求項１４】
請求項１２又は請求項１３に記載の論理回路生成方法において、
前記論理回路生成装置は、前記最上位関数が、配列変数に対する書込み処理命令である配列代入命令を含む場合、及び／又は、配列変数に対する読出し処理命令である配列参照命令を含む場合に、前記制御フロー縮退変換ステップの前に、前記制御フローグラフの配列代入命令及び／又は配列参照命令を分解するレジスタ／メモリ配列アクセス命令分解ステップをさらに行い、
前記レジスタ／メモリ配列アクセス命令分解ステップは、
各配列変数について、前記制御フローグラフに書込みデータ変数及び書込みアドレス変数を付加し、
各配列代入命令を、配列要素への代入値を前記書込みデータ変数へ代入する命令と、配列インデックス値を前記書込みアドレス変数へ代入する命令と、前記書込みアドレス変数を配列インデックスとすることによって定まる配列要素に前記書込みデータ変数の値を代入する命令とに分解する、
配列代入命令分解ステップと、
各配列変数について、前記制御フローグラフに読出しアドレス変数を付加し、
各配列参照命令を、配列インデックス値を前記読出しアドレス変数へ代入する命令と、前記読出しアドレス変数を配列インデックスとすることによって定まる配列要素を参照する命令とに分解する、
配列参照命令分解ステップと、
を含み、
論理回路において各配列要素データを保持するためのメモリは、
前記書込みデータ変数が前記メモリの書込みデータポートに対応し、
前記書込みアドレス変数が前記メモリの書込みアドレスポートに対応し、
前記読出しアドレス変数が前記メモリの読出しアドレスポートに対応した
ものである、
ことを特徴とする論理回路生成方法。
【請求項１５】
請求項１４に記載の論理回路生成方法において、
レジスタ／メモリ配列アクセス命令分解ステップは、
前記制御フローグラフにおける各配列変数に対する各配列代入命令について、始点ブロックから該配列代入命令までの間に実行される該配列変数への配列代入命令の実行回数の最大値を書込みポート番号として該配列代入命令に割当てる、書込みポート番号割当ステップと、
前記制御フローグラフにおける各配列変数に対する各配列参照命令について、始点ブロックから該配列参照命令までの間に実行される該配列変数への配列参照命令の実行回数の最大値を読出しポート番号として該配列参照命令に割当てる、読出しポート番号割当ステップと、
をさらに含み、
前記配列代入命令分解ステップは、各配列変数について、前記書込みポート番号ごとに、前記書込みデータ変数及び前記書込みアドレス変数を前記制御フローグラフに付加し、かつ、前記読出しポート番号ごとに、前記読出しアドレス変数を前記制御フローグラフに付加するステップを含み、
前記配列変数の代入命令に割り当てられた前記書込みポート番号の数と同数の書込みポートと、前記配列変数の参照命令に割り当てられた前記読出しポート番号の数と同数の読出しポートとを持つ、各配列要素データを保持するための前記メモリの記述が生成される、
ことを特徴とする論理回路生成方法。
【請求項１６】
請求項１５に記載の論理回路生成方法において、
前記論理回路生成装置は、メモリポート数判定ステップをさらに行い、
前記メモリポート数判定ステップは、
前記書込みポート番号割当ステップにおいて割当てられた前記書込みポート番号の数が、予め定められた閾値以下であるかどうかを判定するステップと、
前記読出しポート番号割当ステップにおいて割当てられた前記読出しポート番号の数が、予め定められた閾値以下であるかどうかを判定するステップと、
をさらに含み、
前記書込みポート番号の数又は前記読出しメモリポートの数が閾値を超えている場合には、前記論理回路生成装置は、論理回路記述を生成する処理を停止すること
を特徴とする論理回路生成方法。
【請求項１７】
請求項１２〜１６のいずれかに記載の論理回路生成方法において、
入力される前記プログラムは、各変数に属性を付与するための属性記述を含み、前記属性は、
変数のデータのビット幅を指定する、ビット幅属性と、
変数の値をレジスタに保持することを指定する、レジスタ属性と、
配列変数の配列要素の値をメモリに保持することを指定する、メモリ属性と、
を含み、
前記論理回路生成装置は、前記レジスタ属性又は前記メモリ属性が付与された変数を前記状態変数とすることによって状態が表現される順序回路を含む回路記述を生成する、
ことを特徴とする論理回路生成方法。
【請求項１８】
請求項１７に記載の論理回路生成方法において、
前記論理回路生成装置は、
前記データフローグラフに含まれる変数に対して、該変数に対する代入命令において参照される変数及び／又は定数のビット幅と該代入命令において実行される演算の種類とから該変数のビット幅を算出する、ビット幅判定ステップと、
前記データフローグラフに含まれる変数に対して算出されたビット幅に基づいて、演算器の信号伝搬遅延時間を算出する、演算器回路遅延評価ステップと、
パイプライン制約抽出ステップ及びパイプライン段数決定ステップを含むパイプライン境界配置ステップと、
をさらに行い、
前記パイプライン制約抽出ステップは、前記データフローグラフにおける前記状態変数に対する代入命令を実行する演算器と該状態変数に対する参照命令を実行する演算器との間の有向枝にパイプライン境界属性を付加し、
前記パイプライン段数決定ステップは、クロック同期型パイプライン回路の回路記述を生成するために用いられるパイプライン段数を、前記パイプライン境界属性に基づく制約によって定まる必要最小限のパイプライン段数であるパイプライン段数下限値と、指定されたクロック周期から算出したパイプライン段数又は予め指定されたパイプライン段数とに従って決定する
ことを特徴とする論理回路生成方法。
【請求項１９】
請求項１２〜１８のいずれかに記載の論理回路生成方法において、
前記論理回路生成装置は、前記制御フローグラフ生成ステップの前に、
前記最上位関数の引数及びグローバル変数から、前記回路記述によって記述されることになる回路の入力信号を抽出する、論理回路入力信号抽出ステップと、
前記最上位関数の引数及び戻り値並びにグローバル変数から、前記回路記述によって記述されることになる回路の出力信号を抽出する、論理回路出力信号抽出ステップと、
をさらに行うことを特徴とする論理回路生成方法。
【請求項２０】
請求項１３〜１９のいずれかに記載の論理回路生成方法において、
前記論理回路生成装置は、前記最上位関数が関数呼出し命令を含む場合、及び／又は、前記最上位関数が固定繰返し回数のループ処理部を含む場合に、前記制御フローグラフ生成ステップの前に非循環・非階層変換ステップをさらに行い、
前記非循環・非階層変換ステップは、
それぞれの関数呼出し命令をインライン展開することによって、前記最上位関数を、関数呼出し命令を含まない最下層関数に変換する、完全インライン展開ステップと、
それぞれの固定繰返し回数のループ処理部をループ展開することによって、前記最下層関数を、ループ処理部を含まない非循環型最下層関数に変換する、完全ループ展開ステップと、
を含むことを特徴とする論理回路生成方法。
【請求項２１】
請求項２０に記載の論理回路生成方法において、
前記完全インライン展開ステップは、入力された関数に対するインライン展開を所定の回数繰返しても関数呼出し命令が完全に展開されない場合には、該関数を最下層関数に変換不可能であると判断して処理を中止し、
前記完全ループ展開ステップは、入力された関数に繰返し回数が定数ではないループ構造が含まれる場合には、該関数を非循環最下層関数に変換不可能であると判断して処理を中止し、
前記完全インライン展開ステップにいて処理が中止された場合、又は前記完全ループ展開ステップにおいて処理が中止された場合には、前記論理回路生成装置は、論理回路記述を生成する処理を停止する、
ことを特徴とする論理回路生成方法。
【請求項２２】
請求項１３〜２１のいずれかに記載の論理回路生成方法において、
前記論理回路生成装置は、
前記制御フローグラフにおいて、同一の前記状態変数に対して代入命令・参照命令・代入命令がこの順序で連続して実行される場合がないか否を判定する、状態変数命令依存性判定ステップをさらに行い、
前記状態変数命令依存性判定ステップにおいて、「否」と判定された場合には、論理回路記述を生成する処理を停止する
ことを特徴とする論理回路生成方法。
【請求項２３】
前記請求項１２〜２２のいずれか一項に記載の論理回路生成方法の各ステップをコンピュータに実行させるための論理回路生成コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、半導体集積回路の合成方法に関し、より具体的には、プログラミング言語を用いて記述された論理回路記述から論理回路を合成するための装置及び方法に関する。
【背景技術】
【０００２】
従来、ＬＳＩ（大規模集積回路）の論理回路の設計においては、ＲＴＬ（Register Transfer Level：レジスタ転送レベル）記述で設計が行われるとともに、状態遷移図を用いてデータフロー制御が行なわれていた。ＲＴＬは、論理回路の設計の抽象度を表すものであり、ＲＴＬ記述は、ハードウェアの構造や動作を記述する抽象度の低いハードウェア記述言語（ＨＤＬ、Hardware Description Language）による記述方式の一種である。ＲＴＬでは、レジスタ単位でデータの流れが記述される。ＲＴＬで記述されたＨＤＬのソースコードは、論理合成ツールと呼ばれるソフトウェアを用いて、論理ゲート水準の回路記述に変換される。
【０００３】
状態遷移図を用いて論理回路の設計を行う場合には、状態遷移図の作成後に人手により状態遷移の流れを検証する必要がある。したがって、例えば画像処理用途などといった高性能ＬＳＩのように複雑なデータフロー制御を必要とする論理回路を設計する場合には、状態遷移の流れを検証する際の検証漏れや、バグの混入等による設計品質の低下が発生し易いなどという問題がある。
そこで、近年では、以下に示す高位合成技術が導入されている。
【０００４】
論理回路を短期間で設計するための技術として、非特許文献１に示されるような高位合成技術が知られている。高位合成技術は、Ｃ言語などの手続き型ソフトウェアプログラミング言語を用いて表現された論理回路の動作記述（以下、「ソフトウェア記述」という）を、ＨＤＬによるＲＴＬ記述に自動的に変換する設計自動化技術である。こうした高位合成技術を用いてソフトウェア記述からＲＴＬ記述を自動的に合成する工程は、以下のとおりである。
（１）アロケーション工程：合成する論理回路に搭載する演算器及びメモリ等の種類及び個数を決定する。
（２）スケジューリング工程：ソフトウェア記述内の各演算の実行時刻を決定する。この工程は、複数の演算装置による並列演算が可能なＶＬＩＷ（Very Long Instruction Word）プロセッサ用の並列化コンパイラ技術に用いられる「並列性解析」機能に基づいている。
（３）バインディング工程：各演算の演算器への割付け、中間処理データのレジスタへの割付け、等を決定する。
（４）ＦＳＭＤ生成工程：ソフトウェア記述と等価な処理動作を論理回路で実行するための制御部をＦＳＭ（Finite State Machine：有限状態機械）で実現し、この制御部によって演算器、レジスタ、メモリ、及びバスなどで構成される演算処理回路（Datapath）を駆動するＦＳＭＤ（Finite State Machine + Datapath）を生成する。最終的に生成されたＦＳＭＤが、出力されるＲＴＬ記述となる。
これらの工程のうち、「スケジューリング」によってソフトウェア内部の各演算処理を時間方向に多重化する工程と、「バインディング」によって各演算処理を空間方向に多重化する（演算器への割付け）工程とからなる「演算スケジューリング・バインディング工程」が、高位合成技術の核となる重要な工程である。
高位合成技術及びその工程についての詳細は、例えば、特許文献１（特開２００３−０７６７２８号公報）、特許文献２（特開２００６−０１１８７８号公報）及び非特許文献１に記載されている。
【０００５】
論理回路を短期間で設計するための別の技術として、非特許文献２に示されるような、ＳｙｓｔｅｍＣを用いる方法も知られている。ＳｙｓｔｅｍＣは、ハードウェアシステムのイベント駆動型シミュレーション用インターフェースを提供するＣ＋＋言語のクラス定義及びマクロ定義として提供される、ＨＤＬの一種である。ＳｙｓｔｅｍＣでは、ハードウェア記述で必要となる「階層記述」、「並列動作プロセス記述・プロセス起動条件（sensitivity list）」及び「信号結線」を記述することが可能であるため、ＳｙｓｔｅｍＣを用いて論理回路をＲＴＬで記述することが可能である。加えて、ＴＬＭ（Transaction Level Modeling）と呼ばれる通信記述と演算処理記述とを分離したＳｙｓｔｅｍＣ上の記述方式によってシステムの機能をＣ＋＋言語によるソフトウェア記述で抽象的に表現でき、大規模なシステム・レベル・シミューレーションを実行することが可能である。
ＳｙｓｔｅｍＣについての詳細は、例えば、非特許文献２に記載されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００３−０７６７２８号公報
【特許文献２】特開２００６−０１１８７８号公報
【非特許文献】
【０００７】
【非特許文献１】若林一敏、「ソフトウェアプログラムからハードウェア記述を合成する高位合成技術」、IEICE Fundamental Review、2012年、Vol.6、No.1、p.37-50
【非特許文献２】Thorsten Groetker  著、柿本勝、河原林政道、長谷川隆  監訳、「ＳｙｓｔｅｍＣによるシステム設計」、丸善、2003年、ISBN 4-621-07144-0 C3055
【発明の概要】
【発明が解決しようとする課題】
【０００８】
高位合成技術には、次に挙げるような課題がある。
まず、高位合成技術は、高性能・高効率回路を合成するための技術構築・ツール実装が非常に複雑化・大規模化するという課題を有する。高位合成技術が入力対象とするプログラム・コードは、逐次処理手続きを表現しているという点において、ＣＰＵで実行されるソフトウェア・プログラム・コードと根本的に同じ構造を有しており、記述上の自由度が非常に高い。こうした自由度の高いソフトウェア記述から、いかに多くの演算並列性を抽出できるかによって、合成される回路の処理性能が決定するため、非常に複雑な並列性解析技術（データ依存解析、制御依存解析、ループ解析、配列参照依存性解析、等）を駆使する必要がある。その結果、前述の「演算スケジューリング・バインディング工程」が非常に複雑化する。
【０００９】
また、高位合成技術は、入力対象とするソフトウェア記述の内容の変更によって、ＲＴＬ記述の内容、すなわち論理回路の状態がどのように変化するか、予測が極めて難しいという課題を有する。上述のとおり「演算スケジューリング・バインディング工程」が複雑であるため、入力されるソフトウェア記述から、出力される回路特性（回路規模、処理時間）を予測することが極めて困難である。そのため、例えば、生成される合成回路の特性がいずれも性能要件を満たさなかった場合には、ソフトウェア記述を変更することで、演算の並列性の増加やメモリ転送量の抑制の効果によって性能要件を充足させる方策（処理時間短縮、回路規模削減）が必要となるが、ソフトウェア記述に加える変更が、合成される回路の特性にどのような影響を与えるかを予測することが困難であるため、ソフトウェア記述の改変作業自体が困難を極める可能性がある。
【００１０】
さらに、高位合成技術は、論理回路の構造（アーキテクチャ）が「演算スケジューリング・バインディング工程」に大きく依存するため、設計者のアーキテクチャ上の意図及びノウハウを反映したソフトウェア記述が難しいという課題を有する。このため、高い並列性が要求される処理機能ブロックの設計においては、高位合成技術に頼らない手動設計（ハードウェア記述言語で直接論理構造を記述する設計手法）が今なお主流である。
【００１１】
一方、ＳｙｓｔｅｍＣによる方法には、次のような課題がある。その１つは、ＳｙｓｔｅｍＣを用いて論理回路をＲＴＬで記述するためには、ＳｙｓｔｅｍＣで定義されたＲＴＬ記述用クラスを用いる必要があり、その記述量はハードウェア記述言語と同程度又はそれ以上であるため、ＲＴＬ記述による設計生産性向上は非常に限られるということである。また、前述の高位合成技術を用いてＴＬＭ記述を自動的にＲＴＬ記述に変換するツールは存在するが、このツールを用いる場合には、高位合成技術の課題がそのまま当てはまる。
【００１２】
本発明は、このような従来技術の課題を解決するためになされたものであり、回路実装を前提とした特定の情報処理機能をプログラミング言語によって記述して、この記述から論理合成可能なＲＴＬ記述を自動的に生成するための装置、方法及びコンピュータ・プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１３】
本発明の第１の態様は、回路設計のためのハードウェアの一連の処理の流れである動作記述を記述した論理回路生成対象の最上位関数を含むプログラムを入力に取り、論理回路記述を生成する、論理回路生成装置である。論理回路生成装置は、制御フローグラフ生成部と、制御フロー縮退変換部と、データフローグラフ生成部と、論理回路記述出力部とを備える。
【００１４】
制御フローグラフ生成部は、ループ処理部及び関数呼出し命令を含まない最上位関数から、制御フローグラフを生成する。制御フロー縮退変換部は、変数に対する代入命令を各変数につき１つだけ含む前記制御フローグラフから、すべての条件分岐命令を除去することによって、制御フローが縮退されたプログラムである制御フロー縮退プログラムを生成する。データフローグラフ生成部は、制御フロー縮退プログラムから、制御フロー縮退プログラムの各命令をノードとし、各変数への代入命令からその変数を参照する命令への有向枝を付加することによって、データフローグラフを生成する。論理回路記述出力部は、データフローグラフの有向枝が論理回路の配線に対応し、データフローグラフのノードが論理回路の演算器に対応する順序回路を表す論理回路記述を生成する。
【００１５】
順序回路の状態を表す状態変数は、プログラムにおいて、最上位関数を呼出す上位階層関数のローカル変数又はスタティック変数として表現され、前記状態変数への代入命令が実行される前の前記状態変数の値が前記順序回路の現状態を表し、前記状態変数への代入命令が実行された後の前記状態変数の値が前記順序回路の次状態を表す。
【００１６】
一実施形態において、好ましくは、論理回路生成装置は、静的単一代入形式変換部をさらに備える。静的単一代入形式変換部は、前記最上位関数が、変数に対する代入命令を各変数につき１つだけ含む静的単一代入形式でない場合に、制御フローグラフを、制御フロー縮退変換部に入力される前に、静的単一代入形式に変換する。静的単一代入形式変換部は、φ関数命令挿入部と、変数名変換部と、状態変数名再変換部とを含む。φ関数命令挿入部は、制御フローグラフにおいて同一変数に対する値の定義が複数個合流する箇所に、その箇所に合流する全ての変数定義の中から実際に実行された経路上の変数定義を選択するφ関数命令を挿入する。変数名変換部は、制御フローグラフに含まれる各変数の名前を、変数に対する代入命令ごとに別の名前となるように変換することによって、前記制御フローグラフが名前変換後の各変数につき代入命令を１つだけ含む静的単一代入形式に変換する。状態変数名再変換部は、名前変換後の前記状態変数について、前記制御フローグラフの始点ブロックにおける変数名と終点ブロックに到達する変数名とを一致させるように、変数名を再度変換する。好ましくは、制御フロー縮退変換部は、φ関数命令実体化部を含む。φ関数命令実体化部は、φ関数命令を具体的な演算命令に変換する、
【００１７】
一実施形態において、好ましくは、論理回路生成装置は、レジスタ／メモリ配列アクセス命令分解部をさらに備える。レジスタ／メモリ配列アクセス命令分解部は、配列代入命令分解部と、配列参照命令分解部とを含む。配列代入命令分解部は、プログラムに含まれる最上位関数が配列変数に対する書込み処理命令である配列代入命令を含む場合に、各配列変数について、制御フローグラフに書込みデータ変数及び書込みアドレス変数を付加し、各配列代入命令を、配列要素への代入値を前記書込みデータ変数へ代入する命令と、配列インデックス値を前記書込みアドレス変数へ代入する命令と、前記書込みアドレス変数を配列インデックスとすることによって定まる配列要素に前記書込みデータ変数の値を代入する命令とに分解する。配列参照命令分解部は、前記プログラムに含まれる前記最上位関数が配列変数に対する読出し処理命令である配列参照命令を含む場合に、各配列変数について、前記制御フローグラフに読出しアドレス変数を付加し、各配列参照命令を、配列インデックス値を前記読出しアドレス変数へ代入する命令と、前記読出しアドレス変数を配列インデックスとすることによって定まる配列要素を参照する命令とに分解する。好ましくは、論理回路において各配列要素データを保持するためのメモリは、書込みデータ変数がメモリの書込みデータポートに対応し、書込みアドレス変数がメモリの書込みアドレスポートに対応し、読出しアドレス変数がメモリの読出しアドレスポートに対応したものである。制御フローグラフ生成部によって生成された制御フローグラフは、レジスタ／メモリ配列アクセス命令分解部によって処理された後に、制御フロー縮退変換部によって処理される。
【００１８】
一実施形態において、さらに好ましくは、前記レジスタ／メモリ配列アクセス命令分解部は、書込みポート番号割当部と、読出しポート番号割当部とをさらに含む。書込みポート番号割当部は、制御フローグラフにおける各配列変数に対する各配列代入命令について、始点ブロックから該配列代入命令までの間に実行される該配列変数への配列代入命令の実行回数の最大値を書込みポート番号として該配列代入命令に割当てる。読出しポート番号割当部は、制御フローグラフにおける各配列変数に対する各配列参照命令について、始点ブロックから該配列参照命令までの間に実行される該配列変数への配列参照命令の実行回数の最大値を読出しポート番号として該配列参照命令に割当てる。好ましくは、前記配列代入命令分解部は、各配列変数について、前記書込みポート番号ごとに、前記書込みデータ変数及び前記書込みアドレス変数を前記制御フローグラフに付加し、かつ、前記読出しポート番号ごとに、前記読出しアドレス変数を前記制御フローグラフに付加する。好ましくは、各配列要素データを保持するためのメモリは、該配列変数の代入命令に割り当てられた書込みポート番号の数と同数の前記書込みポートと、該配列変数の参照命令に割り当てられた読出しポート番号の数と同数の前記読出しポートとを持つ。
【００１９】
一実施形態において、さらに好ましくは、論理回路生成装置は、書込みメモリポート数判定部と、読出しメモリポート数判定部とをさらに備える。書込みメモリポート数判定部は、書込みポート番号割当部が割当てた書込みポート番号の数が、予め定められた書込みメモリポート数閾値以下であるか否かを判定する。読出しメモリポート数判定部は、読出しポート番号割当部が割当てた読出しポート番号の数が、予め定められた読出しメモリポート数閾値以下であるか否かを判定する。好ましくは、論理回路生成装置は、書込みメモリポート数判定部が「否」と判定した場合、又は読出しメモリポート数判定部が「否」と判定した場合には、論理回路記述を生成する処理を停止する。
【００２０】
一実施形態において、好ましくは、論理回路生成装置に入力されるプログラムは、各変数に属性を付与するための属性記述を含む。属性は、変数のデータのビット幅を指定するビット幅属性と、変数の値をレジスタに保持することを指定するレジスタ属性と、配列変数の配列要素の値をメモリに保持することを指定するメモリ属性とを含む。好ましくは、論理回路生成装置は、レジスタ属性又は前記メモリ属性が付与された変数を状態変数とすることによって状態が表現される順序回路を含む論理回路記述を生成する。
【００２１】
一実施形態において、さらに好ましくは、論理回路生成装置は、ビット幅判定部と、演算器回路遅延評価部と、パイプライン境界配置部とをさらに備える。ビット幅判定部は、データフローグラフに含まれる変数に対して、該変数に対する代入命令において参照される変数及び／又は定数のビット幅と該代入命令において実行される演算の種類とから該変数のビット幅を算出する。演算器回路遅延評価部は、データフローグラフに含まれる変数に対して算出されたビット幅に基づいて、演算器の信号伝搬遅延時間を算出する。パイプライン境界配置部は、パイプライン制約抽出部及びパイプライン段数決定部を含む。パイプライン制約抽出部は、データフローグラフにおける状態変数に対する代入命令を実行する演算器と該状態変数に対する参照命令を実行する演算器との間の有向枝にパイプライン境界属性を付加する。パイプライン段数決定部は、クロック同期型パイプライン回路の回路記述を生成するために用いられるパイプライン段数を、パイプライン境界属性に基づく制約によって定まる必要最小のパイプ段数であるパイプライン段数下限値と、指定されたクロック周期から算出したパイプライン段数又は予め指定されたパイプライン段数とに従って決定する。
【００２２】
一実施形態において、好ましくは、論理回路生成装置は、論理回路入力信号抽出部と、論理回路出力信号抽出部とをさらに備える。論理回路入力信号抽出部は、最上位関数の引数及びグローバル変数から、回路記述によって記述されることになる回路の入力信号を抽出する。論理回路出力信号抽出部は、最上位関数の引数及び戻り値並びにグローバル変数から、回路記述によって記述されることになる回路の出力信号を抽出する。
【００２３】
一実施形態において、好ましくは、論理回路生成装置は、非循環・非階層変換部をさらに備える。完全インライン展開部は、最上位関数が関数呼出し命令を含む場合に、それぞれの関数呼出し命令をインライン展開することによって、最上位関数を、関数呼出し命令を含まない最下層関数に変換する。完全ループ展開部は、完全インライン展開部によって変換された最下層関数が固定繰返し回数のループ処理部を含む場合に、それぞれの固定繰返し回数のループ処理部をループ展開することによって、最下層関数を、ループ処理部を含まない非循環型最下層関数に変換する。好ましくは、論理回路生成装置に入力されたプログラムは、非循環・非階層変換部によって非循環型最下層関数に変換された後に、制御フローグラフ生成部に入力される。
【００２４】
一実施形態において、さらに好ましくは、完全インライン展開部は、入力された関数に対してインライン展開を所定の回数繰返しても関数呼出し命令が完全に展開されない場合には、該関数を最下層関数に変換不可能であると判断して処理を中止するように構成され、完全ループ展開部は、入力された関数に繰返し回数が定数ではないループ処理部が含まれる場合には、該関数を非循環型最下層関数に変換不可能であると判断して処理を中止するように構成される。好ましくは、論理回路生成装置は、完全インライン展開可能性判定部が処理を中止した場合、又は完全ループ展開可能性判定部が処理を中止した場合には、論理回路記述を生成する処理を停止する。
【００２５】
一実施形態において、好ましくは、論理回路生成装置は、状態変数命令依存性判定部をさらに備える。状態変数命令依存性判定部は、制御フローグラフにおいて、同一の前記状態変数に対して代入命令・参照命令・代入命令がこの順序で連続して実行される場合がないか否を判定する。好ましくは、論理回路生成装置は、状態変数命令依存性判定部が「否」と判定した場合には、論理回路記述を生成する処理を停止する。
【００２６】
本発明の第２の態様は、回路設計のためのハードウェアの一連の処理の流れである動作記述を記述した論理回路生成対象の最上位関数を含むプログラムを入力に取り、論理回路記述を生成する、論理回路生成装置によって行われる、論理回路生成方法である。
【００２７】
本発明の第３の態様は、本発明の第２の態様は、回路設計のためのハードウェアの一連の処理の流れである動作記述を記述した論理回路生成対象の最上位関数を含むプログラムを入力に取り、論理回路記述を生成する、論理回路生成装置によって行われる、論理回路生成方法の各ステップをコンピュータに実行させるための論理回路生成コンピュータ・プログラムである。
【発明の効果】
【００２８】
本発明の装置、方法及びコンピュータ・プログラムによれば、記述の自由度が高いソフトウェア記述から論理合成可能なＲＴＬ記述を自動的に生成することができるため、高品質、高効率な大規模集積回路を、短期間、低コストで設計、開発及び検証することができる。
【図面の簡単な説明】
【００２９】
【図１】本発明の一実施形態に係る論理回路生成装置１の機能を示す例示的な機能ブロック図である。
【図２】本発明の一実施形態に係る論理回路生成装置１の例示的なハードウェア構成を示す図である。
【図３】本発明のソフトウェア記述における、データ型の別名定義の記述例を示す図である。
【図４】本発明のソフトウェア記述における、データ型に対して変数属性を付加する記述例を示す図である。
【図５】本発明のソフトウェア記述における、同じ関数を異なる変数属性を持つ引数で呼出すプログラムの記述例、及びそのプログラムに対応するパイプライン回路図を示す図である。
【図６】本発明のソフトウェア記述における、スタティック変数を用いた順序回路の状態遷移の記述例、及びその順序回路の状態遷移図を示す図である。
【図７】本発明のソフトウェア記述における、メモリ属性変数を用いた画像処理用ラインバッファ及びシフトレジスタ回路の記述例、及び対応するパイプライン回路図を示す図である。
【図８】図７のラインバッファ更新の動作を記述した、本発明のソフトウェア記述によるソフトウェア記述及び従来技術におけるＲＴＬ記述を示す図である。
【図９】再帰的関数呼出しの記述例を示す図である。
【図１０】本発明の論理回路生成装置及び方法における、図９に示される関数をインライン展開した結果を示す図である。
【図１１】本発明の論理回路生成装置及び方法における、図１０に示される関数に定数伝播による最適化を適用した結果を示す図である。
【図１２】本発明の回路生成方法における工程における、図９に示される関数を完全インライン関数展開した結果を示す図である。
【図１３】本発明の論理回路生成装置及び方法における、完全ループ展開の具体例を示す図である。（ａ１）は、定数回繰返しのループ処理部を含む関数の例を表す。（ａ２）は、（ａ１）の関数に対応する制御フローグラフを表す。（ｂ１）は、（ａ１）の関数を完全ループ展開した結果を表す。
【図１４】本発明の論理回路生成装置及び方法における、メモリ配列アクセス命令の分解の具体例を示す図である。（ａ）は、メモリ配列アクセス命令を含む関数の例を表す。（ｂ）は、（ａ）に含まれるメモリ配列アクセス命令を、ポート変数を用いて分解した結果のソフトウェア記述を表す。
【図１５】本発明の論理回路生成装置及び方法における、ＳＳＡ変換手順の具体例を示す図である。（ａ）はソフトウェア記述の例、（ｂ）は（ａ）のソフトウェア記述に対応する制御フローグラフ、（ｃ）はφ関数命令を挿入した結果の制御フローグラフ、（ｄ）は代入される変数の変数名を変換した結果の制御フローグラフ、（ｅ）は参照される変数の変数名を変換した結果の制御フローグラフ、（ｆ）は状態変数の変数名を再変換した結果の制御フローグラフを表す。
【図１６】本発明の論理回路生成装置及び方法における、メモリ配列アクセス命令を含むプログラムの制御フローグラフの具体例を示す図である。（ａ）は、図１４（ｂ）のソフトウェア記述に対応する制御フローグラフを表す。（ｂ）は、（ａ）の制御フローグラフをＳＳＡ変換した後の制御フローグラフを表す。
【図１７】図１５（ｆ）の制御フローグラフに対して、本発明の論理回路生成装置及び方法における、φ関数命令の実体化による制御フロー縮退化変換処理を施した結果を示す図である。
【図１８】本発明の論理回路生成装置及び方法における、レジスタ／メモリ配列アクセス命令を含んだ制御フロー縮退化変換処理の具体例を示す図である。（ａ）は、ＳＳＡ変換後の制御フローグラフである図１６（ｂ）の制御フローグラフに対応するソフトウェア記述を表す。（ｂ）は、（ａ）のソフトウェア記述に制御フロー縮退後処理を施した結果のソフトウェア記述を表す。
【図１９】図１７の制御フロー縮退プログラムから生成されるデータフローグラフを示す図である。
【図２０】図１８（ｂ）の制御フロー縮退プログラムから生成されるデータフローグラフを示す図である。
【図２１】定数乗算を伴うプログラムのソフトウェア記述の具体例を示す図である。
【図２２】本発明の論理回路生成装置及び方法における、除算の分解の具体例及び結果を示す図である。
【図２３】図２４のデータフローグラフに対応するソフトウェア記述を示す図である。
【図２４】本発明の論理回路生成装置及び方法における、定数乗算分解、定数伝播及び共通部分式除去の処理の具体例を示す図である。
【図２５】論理回路の最大信号伝播時間と、論理回路に含まれる演算器の入出力信号との関係を模式的に示す図である。
【図２６】本発明の論理回路生成装置及び方法の演算器回路遅延モデルを模式的に示す図である。
【図２７】本発明の論理回路生成装置及び方法の演算器回路遅延モデルにおける、演算器の各入力信号の伝播時間と、演算器の伝播遅延と、出力信号の伝播時間との関係を模式的に示す図である。
【図２８】２入力１出力マルチプレクサの入力信号と出力信号との関係を示す図である。
【図２９】本発明の論理回路生成装置及び方法の一実施形態において想定される、Booth recoder 器の回路図、入力信号の決定方法、及び、入力信号と出力信号との関係を示す図である。
【図３０】本発明の論理回路生成装置及び方法の一実施形態において想定される、同値比較否定器を示す回路図である。
【図３１】本発明の論理回路生成装置及び方法の一実施形態において想定される、シフト演算器の回路図、及び、入力信号と出力信号との関係を示す図である。
【図３２】レジスタ変数の代入前参照命令及び代入後参照命令を含むプログラムのソフトウェア記述の具体例を示す図である。
【図３３】図３２のプログラムから生成されるパイプライン回路を表現するデータフローグラフを示す図である。
【図３４】図３３のデータフローグラフに対してレジスタ変数更新命令ノード群グループ化処理を行った結果のデータフローグラフを示す図である。
【図３５】本発明の論理回路生成装置及び方法における、パイプライン回路合成処理の流れを示すフロー図である。
【図３６】３つのパイプライン境界枝が１つの経路上に存在するデータフローグラフの例を模式的に示した図である。
【図３７】本発明の論理回路生成装置及び方法における、ＳＡ法を用いてパイプライン境界の局所変更処理の制御の流れを示すフロー図である。
【図３８】本発明の論理回路生成装置の１つの実施形態を示す図である。
【図３９】本発明の論理回路生成装置の１つの実施形態を示す図である。
【図４０】本発明の論理回路生成装置の１つの実施形態を示す図である。
【図４１】本発明の論理回路生成装置の１つの実施形態を示す図である。
【図４２】本発明の論理回路生成装置の１つの実施形態を示す図である。
【図４３】本発明の論理回路生成装置の１つの実施形態を示す図である。
【図４４】本発明の論理回路生成装置の１つの実施形態を示す図である。
【発明を実施するための形態】
【００３０】
以下に、図面（図１〜図３７）を用いて本発明の一実施形態を説明する。図１は、本発明の一実施形態に係る論理回路生成装置１の機能を示す例示的なブロック図を示す。図１に示されるように 、論理回路生成装置１は、論理回路生成対象の最上位関数Ｆｔｏｐを含むプログラムＰを入力として用い、論理回路を表現する論理回路記述Ｄを出力することができる。論理回路生成装置１は、
・非循環・非階層変換部２１
・論理回路入出力信号抽出部２２
・制御フローグラフ生成部２３
・状態変数命令依存性判定部２４
・レジスタ／メモリ配列アクセス命令分解部２５
・メモリポート数判定部２６
・静的単一代入形式変換部２７
・制御フロー縮退変換部２８
・データフローグラフ生成部２９
・データフローグラフ最適化部３０
・演算器の回路遅延・回路規模評価部３１
・パイプライン境界配置部３２
・ＲＴＬ記述出力部３３
を含むものとすることができる。以下に、これらの概要を説明するが、各部において行われる詳細な処理の内容については、図８〜図３７を参照して後述される。
【００３１】
非循環・非階層変換部２１は、論理回路生成装置１に入力されたプログラムＰに含まれる論理回路生成対象の最上位関数Ｆｔｏｐを、ループ処理部及び関数呼出し命令を含まない形式の非循環型最下層関数Ｆｅｘｐに変換する。
【００３２】
論理回路入出力信号抽出部２２は、非循環型最下層関数Ｆｅｘｐの引数及びプログラムＰのグローバル変数から、論理回路生成装置１が生成する論理回路の入力信号及び出力信号を抽出する。
【００３３】
制御フローグラフ生成部２３は、非循環型最下層関数Ｆｅｘｐから、制御フローグラフＦｃｆｇを生成する。
【００３４】
状態変数命令依存性判定部２４は、制御フローグラフＦｃｆｇにおいて、同一の状態変数（state variable）に対して、代入命令、参照命令、代入命令がこの順序で連続して実行される場合がないか否かを判定する。状態変数命令依存性判定部２４が「否」と判定した場合には、論理回路生成装置１は、論理回路記述を生成する処理を停止するようにすることができる。
【００３５】
レジスタ／メモリ配列アクセス命令分解部２５は、制御フローグラフＦｃｆｇに含まれる配列代入命令に書込みポート番号を割当て、データ入力ポート及びアドレス入力ポートに対応した変数を制御フローグラフＦｃｆｇに追加することによって配列代入命令を細分化する。また、レジスタ／メモリ配列アクセス命令分解部２５は、配列参照命令に読出しポート番号を割当て、アドレス入力ポートに対応した変数をＦｃｆｇに追加することによって配列参照命令を細分化する。
【００３６】
メモリポート数判定部２６は、レジスタ／メモリ配列アクセス命令分解部２５において配列代入命令に割当てられた書込みポート番号の数及び配列参照命令に割当てられた読出しポート番号の数がそれぞれ予め定められた閾値以下であるか否かを判定する。メモリポート数判定部２６が「否」と判定した場合には、論理回路生成装置１は、論理回路記述を生成する処理を停止するようにすることができる。
【００３７】
静的単一代入形式変換部２７は、制御フローグラフＦｃｆｇを、そこに含まれる各変数につき代入命令を１つだけ含む形式である静的単一代入形式に変換する。
【００３８】
制御フロー縮退変換部２８は、静的単一代入形式の制御フローグラフＦｃｆｇから全ての条件分岐命令を除去することによって、制御フローが縮退されたプログラムである制御フロー縮退プログラムＦｄｅｇを生成する。
【００３９】
データフローグラフ生成部２９は、制御フロー縮退プログラムＦｄｅｇから、データフローグラフＦｄｆｇを生成する。
【００４０】
データフローグラフ最適化部３０は、データフローグラフＦｄｆｇを最適化する。
【００４１】
演算器の回路遅延・回路規模評価部３１は、データフローグラフＦｄｆｇに基づいて、論理回路生成装置１が生成する論理回路の回路遅延及び回路評価を見積る。
【００４２】
パイプライン境界配置部３２は、データフローグラフＦｄｆｇにパイプライン境界を配置することによって、パイプライン回路データＦｐｌｃを合成する。
【００４３】
ＲＴＬ記述出力部３３は、パイプライン回路データＦｐｌｃに基づいて論理回路記述Ｄを生成して出力する。この論理回路記述Ｄが、論理回路生成装置１の出力となる。
【００４４】
図２は、本発明の一実施形態に係る論理回路生成装置１の例示的なハードウェア構成を示す。論理回路生成装置１は、中央処理装置（ＣＰＵ）１１と、中央処理装置が実行する各種のプログラムやデータなどを格納するＲＡＭ１２、ＲＯＭ１３、ハードディスクドライブ（ＨＤＤ）１４などの記憶装置と、これらの装置を互いに接続するバス１０とを有する汎用コンピュータを用いて実現することができる。さらに、論理回路生成装置１には、必要に応じて、ＣＤ−ＲＯＭ又はＤＶＤ−ＲＯＭなどの外部記録媒体との間でデータの入出力を行うドライブ装置１５と、キーボード又はマウスなどの入力装置１６と、ＣＲＴ、液晶ディスプレイ又はプリンタなどの出力装置１７と、他のコンピュータ又はネットワークと通信するための通信インターフェース１８と、を接続するようにしてもよい。
【００４５】
本発明の一実施形態においては、論理回路生成装置１は、プログラムＰを、ドライブ装置１５、入力装置１６、又は通信インターフェース１８から入力することができる。論理回路生成装置１に入力されたプログラムＰは、ＲＡＭ１２に格納することができる。ＲＡＭ１２にはさらに、図１に示す論理回路生成装置１の各部の機能をＣＰＵ１１に実行させるための別のプログラム４（図示せず）を格納することができる。ＣＰＵ１１は、プログラム４に従ってＲＡＭ１２に格納されたプログラムＰを処理し、結果として論理回路記述Ｄを生成することができる。ＣＰＵがプログラムＰを処理する過程で生成する制御フローグラフＦｃｆｇ、制御フロー縮退プログラムＦｄｅｇ、データフローグラフＦｄｆｇ及びパイプライン回路データＦｌｃｄなどの各種中間データ、並びに最終的に生成する論理回路記述Ｄもまた、ＲＡＭ１２に格納することができる。ＲＡＭ１２に格納された論理回路記述Ｄは、ドライブ装置１５、出力装置１７、又は通信インターフェース１８から出力することができる。
【００４６】
ここで、図３〜図７を参照して、本発明による論理回路生成装置又は論理回路生成方法の入力として用いるプログラムＰについて、１つの実施形態として、Ｃ言語によって記述されたプログラムの例を用いて説明する。本明細書においては、回路設計のためのハードウェアの一連の処理の流れである動作記述を記述した、本発明による論理回路生成装置又は論理回路生成方法の入力として用いるプログラムＰの記述を、本発明のソフトウェア記述と称することとする。
【００４７】
［データ型の別名定義］
Ｃ言語では、 typedef 指定子を用いて、定義済みのデータ型に対する別名データ型を定義することができる。図３は、本発明のソフトウェア記述における、データ型の別名定義の記述例を示す図である。この記述例において、 INT10 型及び INT12 型は int 型に対する別名データ型であり、 S_INT12 型及び M_INT12 型は INT12 型に対する別名データ型である。また、 SA_T 型は、 a（char 型）、 b（INT10 型）及び c（INT12 型）をメンバー変数として持つ構造体に対する別名データ型である。
【００４８】
［データ型への変数属性の付加］
図４は、本発明のソフトウェア記述における、データ型に対して変数属性を付加する記述例を示す図である。この記述例においては、 #pragma 文を用いて変数属性をＣ言語のソースコード上で記述しているが、別の実施形態においては、例えば、型名と変数属性との対応関係を記述したファイルを読み込む方法、ユーザ・インターフェースによってこれらの情報を入力する方法など、他の方法を用いてもよい。
【００４９】
図４をより詳細に見ると、データ型に対して、変数属性であるビット幅属性、メモリ属性、及びレジスタ属性を付加する記述が示されている。具体的には、 INT10 型に１０ビット幅のビット幅属性、 INT12 型に１２ビット幅のビット幅属性、 M_INT12 型にメモリ属性、 S_INT12 型及び ST_A 型にレジスタ属性を、それぞれ付加している。
【００５０】
さらに、 S_INT12 型及び M_INT12 型は INT12 型の別名であるので、 S_INT12 型と M_INT12 型にも１２ビット幅のビット幅属性が暗示的に付加される。また、 ST_A 型は、 char 型の a 、 INT12 型の b 、及び INT10 型の c の３つのメンバー変数からなる構造体であるので、 ST_A 型に明示的に付加されているレジスタ属性が、これら３つのメンバー変数 a，b，c にも暗示的に付加される。このように、データ型の別名定義手段と各データ型に対する属性情報の記述手段とを組み合わせたことを特徴とする変数属性の記述方式によって、論理回路生成で必要となる様々な付加情報を、少ない記述量で効率的にソフトウェア記述に対応付けることが可能となる。
【００５１】
［データ型へのビット幅属性付加による設計再利用性向上］
図５は、本発明のソフトウェア記述における、同じ関数を異なる変数属性を持つ引数で呼出すコードの記述例、及びそのプログラムに対応するパイプライン回路図を示す図である。この記述例においては、関数 top0 が論理回路生成対象関数であり、１０ビット幅の引数 a，b と１２ビット幅の引数 c とが入力として供給され、 INT12 型の戻り値が出力となる。なお、入力及び出力の判別方法は後述する。また、 S_INT12 型のローカル変数 d には、１２ビット幅属性及びレジスタ属性が付加されている。関数 top0 の内部で２度呼び出される関数 func0 に与えられる引数は、１度目の呼び出しにおいては１０ビット幅であるが、２度目においては１２ビット幅であり、同じ関数記述で違うビット幅の回路を表現することができる。このようなビット幅の調整をハードウェア記述言語やＳｙｓｔｅｍＣで行う場合は明示的なビット幅指定記述が必要であるが、本発明による型への変数属性付加記述方式を用いることにより、ビット幅が暗示的に指定できるので、設計の再利用性が大幅に向上する。
【００５２】
［レジスタ属性付加によるタイミング情報の暗示的指定］
図５の記述例において、変数 d はレジスタ属性を持つ。一般に、レジスタ属性は、ソフトウェア記述の動作を何ら変更することはないが、この属性を持つ変数が論理回路においてレジスタとして実装されることを指定する。論理回路におけるレジスタの動作の特徴は、クロック信号の立上り（即ち、０から１への遷移）の瞬間のみに、レジスタ入力信号がレジスタ出力信号に伝播する点にあり、この特徴によって、レジスタが、順序回路の内部状態を状態変数として保持することが可能になる。そのため、レジスタ属性を持つ変数は、値を代入してからその値を読み出せるようになるまでに、１クロック以上の経過が必要である。従って、図５の記述において、１度目に呼び出される func0 の戻り値を d に代入してから、１クロック後に d が参照できるようになり、その値を用いて呼び出される２度目の func0 の結果は１クロック遅れて出力されることになる。このように、時間概念が無いソフトウェア記述にレジスタ属性を付加することによって、論理回路動作で重要なタイミング情報を暗示的に付加することができる。なお、変数 c は変数 a 及び b と同時刻に入力されるため、２番目の func0 の引数 d に引数 c を同期する必要があるが、そのためのレジスタの挿入は、後述するように、論理回路生成処理において自動的に行われる。このように、レジスタ属性を付加することにより、ソフトウェア記述を変更することなく論理回路動作のタイミングを自由自在に調整できるようになる。
【００５３】
［スタティック変数を用いた順序回路の記述］
図６は、本発明のソフトウェア記述における、スタティック変数を用いた順序回路の状態遷移の記述例、及びその順序回路の状態遷移図を示す図である。この記述例においては、スタティック変数 stt に２ビット幅属性とレジスタ属性とを付加し、順序回路の状態変数として用いている。順序回路の状態変数の動作をソフトウェア記述で表現するためには、関数 top1 の１回の実行の後もこの状態変数の値を保持し続ける必要があるために、状態変数はスタティック変数として宣言する必要がある。また、この状態変数にレジスタ属性を付加することによって、この順序回路の状態変数がレジスタで実装されることが指定される。 stt の宣言文における 0 への初期化はプログラム起動前に（論理回路においては、リセット動作時に）１度だけ行われ、関数 top1 が実行されるたびに入力 a の値によって変数 stt の値が更新されていく。また、変数 prev_stt へ代入する stt の値、及び switch 文の stt の値は、 stt が更新される前の値である。このようにして、論理回路における最も重要な構成要素の一つである順序回路の状態遷移を、ソフトウェア記述のスタティック変数によって非常に簡単に記述できる。
【００５４】
［メモリ属性変数を用いたメモリ回路を含む記述］
図７は、本発明のソフトウェア記述における、メモリ属性変数を用いた画像処理用ラインバッファ及びシフトレジスタ回路の記述例、及び対応するパイプライン回路図を示す図である。この記述例において、関数 top2 は、８ビット幅のデータ pin を入力し、３×３の配列データ pw[3][3] を出力する関数である。この関数は、ラスタースキャン方式の画像データに対する空間フィルタ処理などで必要となる周辺画素データを、ラインバッファ（垂直方向の「遅延回路」として、水平方向１ライン分の画素データを保存するバッファ）とシフトレジスタ（水平方向の「遅延回路」）とによって生成している。
【００５５】
より具体的には、ラインバッファは、２つのメモリ属性配列変数 lbuf1[1024] 及び lbuf2[1024] によって実現され、これらの配列への共通インデックスに１０ビット幅の状態変数 pos が用いられている。 lb1 = lbuf1[pos] などのメモリ属性配列の参照がメモリ読出しを表現し、 lbuf1[pos] = pin などのメモリ属性配列への代入がメモリ書込みを表現する。また、シフトレジスタは、 pw[0][2] = pw[0][1] など、状態変数配列 pw[3][3] をシフトする一連の命令によって実現される。一方、状態属性を持たない変数 lb1, lb2 などは、データを瞬時転送する信号を表現するために用いられている。
【００５６】
メモリにはクロック同期の有無によって同期型と非同期型との２種類が存在するが、現在では高速性を優先してほとんど同期型メモリが使われているため、ここでは同期型メモリを想定する。図８は、図７のラインバッファ更新を記述した、本発明のソフトウェア記述（上段）及び従来技術におけるＲＴＬ記述（下段）を示す図である。より具体的には、図８は、図７における２つのラインバッファの更新処理（同アドレスへの同時読出し・書込み）部分のソフトウェア記述と、同じ動作のＶｅｒｉｌｏｇハードウェア記述言語によるＲＴＬ記述を示す。同期型メモリの回路動作では、読出しデータは１クロック遅れて有効になるため、 lbuf1 の読出し（lb1 = lbuf1[pos]）の１クロック後に lbuf2 の書込み（lbuf2[pos] = lb1）が行われる必要がある。また、ラインバッファでは、同じアドレスに対する読出し及び書込みを同時に行う必要があるため、 lbuf2 の読出しも書込みのタイミングに合わせて１クロック遅らせる必要がある。 lbuf2 の読出しデータ（lb2 = lbuf2[pos]）は、 lbuf1 からさらに１クロック遅れて有効になる。こうしたタイミングのずれは、これらのデータを参照する後段回路の動作タイミングにも影響を及ぼすが、ＲＴＬ記述では上記のタイミングを正確に表現する必要がある。一方、本発明のソフトウェア記述では、このような詳細なタイミングを気にすることなく、データの流れだけを表現するだけで良い。即ち、本発明の技術であるプログラミング言語による論理回路記述方式は、詳細な回路動作タイミングを隠蔽した上で、データの流れだけを表現することを可能にした記述方式であり、このことによって、記述の可読性が格段に向上するだけでなく、設計不具合要因を格段に減らすことができるため、この点においてもＲＴＬ記述と比べて設計生産性が飛躍的に向上する。
【００５７】
［最上位関数の指定］
本発明のソフトウェア記述において論理回路生成の対象となる部分は、ソフトウェア記述全体とすることもできるが、論理回路生成の対象となる最上位関数を指定することによって定めることもできる。本実施形態においては、図示しないが、最上位関数を指定するための #pragma 文をソフトウェア記述内に記述することによって、論理回路生成の対象を定めている。別の実施形態においては、例えば、最上位関数の関数名を記述したファイルを読み込む方法、ユーザ・インターフェースによって論理回路生成の対象の範囲を指定する方法など、他の方法を用いてもよい。
【００５８】
以上、本発明による論理回路生成装置又は論理回路生成方法の入力として用いるプログラムＰの記述であるソフトウェア記述の特徴について、Ｃ言語によって記述された例を用いて説明したが、これらの特徴を表現できるものである限り、Ｃ言語以外の手続型言語、又は関数型言語若しくはオブジェクト指向言語など、種々のソフトウェア記述言語によっても、本発明による論理回路生成装置又は論理回路生成方法の入力として用いるプログラムＰを同様に記述することができることが、当業者にとっては容易に理解されるであろう。
【００５９】
次に、図９〜図３７を参照して、図１に示される本実施形態における論理回路生成装置１の各部を詳述する。
【００６０】
［非循環・非階層変換部２１］
論理回路生成装置１に入力されたプログラムＰは、最初に、非循環・非階層変換部２１に入力される。非循環・非階層変換部２１は、プログラムＰに含まれる論理回路生成対象の最上位関数Ｆｔｏｐに対して非循環・非階層変換を行って、ループ処理部及び関数呼出し命令を含まない関数である非循環型最下層関数Ｆｅｘｐを出力する。
【００６１】
より具体的には、非循環・非階層変換部２１は、次に説明する完全インライン展開部２１１と完全ループ展開部２１２とを含む。非循環・非階層変換部２１に入力された最上位関数Ｆｔｏｐは、まず、完全インライン展開部２１１に入力されて、関数呼出し命令を含まない形式の関数である最下層関数に変換される。最下層関数は、さらに、完全ループ展開部２１２に入力されて、非循環型最下層関数に変換される。
【００６２】
完全インライン展開部２１１は、入力された関数を、関数呼出し命令を含まない形式の関数である最下層関数に変換する。関数を最下層関数に変換する処理を、完全インライン展開と呼ぶ。完全インライン展開部２１１は、入力された関数に対して、関数呼出し命令のインライン展開を繰返す。これによって、再帰的でない関数を呼出す命令は、完全に展開される。さらに、完全インライン展開部２１１は、関数呼出しのインライン展開を繰返す過程において、必要に応じて、定数伝播による最適化を実行する。これによって、再帰的な関数であっても、再帰呼出し回数の上限が特定できるものであれば、それを呼出す命令は完全に展開される。
【００６３】
完全インライン展開部２１１は、インライン展開の繰返しを所定の回数行っても関数呼出し命令が完全に展開されない場合に、関数を最下層関数に変換不可能であると判断して、処理を中止するようにすることができる。この場合には、論理回路生成装置１は、例えば、出力装置１７に警告メッセージを出力し、論理回路生成処理を停止するようにすることができる。
【００６４】
図９〜図１２を参照して、関数を完全インライン展開する処理について、具体例を用いて説明する。図９は、再帰的関数呼出しの記述例を示す。この記述例において、関数 funcB は、関数 funcB 自身を呼出す命令を含んでいるため、再帰的関数である。関数 funcA は、再帰的関数である関数 funcB を呼出す命令を含む関数である。この例における関数 funcA を完全インライン展開する処理を考える。図１０は、 funcA に含まれる関数呼出し funcB(4) をインライン展開した結果の関数 funcA を示す。ここで、変数 funcB_0 は、関数呼出し funcB(4) の戻り値を格納するために導入された変数である。図１１は、図１０の関数 funcA に定数伝播による最適化を適用した結果を示す。具体的には、図１０において、変数 a は、定数 4 が代入された後、そのまま２ヶ所で参照されているので、これら変数 a の参照を定数 4 で置き換える。これにより、
{ int a = 4; funcB_0 = (a == 1) ? 1 : funcB(a - 1) + 1;}
の部分は
{ funcB_0 = (4 == 1) ? 1 : funcB(4 - 1) + 1;}
に変換される。この代入文の右辺の条件演算式
(4 == 1) ? 1 : funcB(4 - 1) + 1
の条件式 (4 == 1) は偽と評価されるので、条件演算式は第３項、即ち
funcB(4 - 1) + 1
に簡単化され、さらに式 4 - 1 は定数式 3 に簡単化される。その結果、図１１の関数 funcA が得られる。得られた関数 funcA に対して、さらに、関数 funcB を呼出す命令のインライン展開、及び定数伝播による最適化を、再帰呼出しが発生しない a == 1 の条件が成立するまで繰返し適用する。その結果、図１２に示されるように、関数呼出し命令を含まない形式の関数、即ち最下層関数が得られる。
【００６５】
以上に説明されたように、完全インライン展開部２１１は、入力された関数を、関数呼出し命令を含まない形式の関数である最下層関数に変換する。入力された関数が関数呼出し命令を含まないものである場合には、完全インライン展開部２１１は、その入力された関数をそのまま出力する。
【００６６】
完全ループ展開部２１２は、入力された最下層関数を、ループ処理部を含まない非循環型最下層関数に変換する。これは、関数に含まれる全てのループ処理部を展開することによって行われ、この処理を完全ループ展開と呼ぶ。
【００６７】
図１３を参照して、最下層関数を非循環型最下層関数に変換する処理について、具体例を用いて説明する。図１３（ａ）の関数 funcD は、ループ処理部を含む関数である。このループ処理部におけるループ繰返し回数は３回である。繰返しの１回目においては、変数 i の値は定数値 0 である。即ち、このループ処理部の繰返しの１回目は
i = 0; a += a * i + 1;
と展開され、これに定数伝播の最適化を適用することによって
a += a * 0 + 1;
が得られる。繰返しの２回目及び３回目においてもそれぞれ同様に
a += a * 1 + 1;
a += a * 2 + 1;
が得られる。その結果、図１３（ｂ）に示されるように、ループ処理部を含まない形式の関数 funcD が得られる。
【００６８】
以上に説明されたように、完全ループ展開部２１２は、入力された最下層関数を、ループ処理部を含まない非循環型最下層関数に変換する。入力された最下層関数がループ処理部を含まないものである場合には、完全ループ展開部２１２は、その入力された最下層関数をそのまま出力する。
【００６９】
なお、本発明の別の実施形態においては、論理回路生成装置１は、非循環・非階層変換部２１を含まないものとすることができる。この場合の論理回路生成装置１は、最上位関数Ｆｔｏｐが非循環型最下層関数であるプログラムＰを入力に取る。
【００７０】
［論理回路入出力信号抽出部２２］
非循環・非階層変換部２１によって非循環型最下層関数Ｆｅｘｐに変換された最上位関数Ｆｔｏｐを含むプログラムＰは、次いで、論理回路入出力信号抽出部２２に入力される。論理回路入出力信号抽出部２２は、入力された非循環型最下層関数Ｆｅｘｐの引数及び戻り値並びにプログラムＰに含まれるグローバル変数から、論理回路生成装置１が出力する論理回路記述Ｄによって表現される論理回路の入力信号及び出力信号を抽出する。
【００７１】
より具体的には、論理回路入出力信号抽出部２２は、次に説明する論理回路入力信号抽出部２２１と論理回路出力信号抽出部２２２とを含む。論理回路入力信号抽出部２２１は、非循環型最下層関数Ｆｅｘｐの引数及びプログラムＰに含まれるグローバル変数から入力信号を抽出し、論理回路出力信号抽出部２２２は、入力された非循環型最下層関数Ｆｅｘｐの引数及び戻り値並びにプログラムＰに含まれるグローバル変数から出力信号を抽出する。
【００７２】
論理回路入力信号抽出部２２１は、非循環型最下層関数Ｆｅｘｐの引数及びプログラムＰに含まれるグローバル変数から入力信号を抽出する。論理回路入力信号抽出部２２１は、具体的には、次の（１）〜（３）に挙げるものを入力信号と判別して抽出する。なお、ここで「引数」とは非循環型最下層関数Ｆｅｘｐの引数のことであり、「関数」とは非循環型最下層関数Ｆｅｘｐのことである。
（１）非ポインタ型の引数。
（２）関数内部でポインタ参照を介した値参照があり、かつ、ポインタ参照を介した値代入がないポインタ型の引数が参照する実体変数。
（３）関数内部で値参照があり、かつ、値代入がないグローバル変数。
【００７３】
論理回路出力信号抽出部２２２は、入力された非循環型最下層関数Ｆｅｘｐの引数及び戻り値並びにプログラムＰに含まれるグローバル変数から出力信号を抽出する。具体的には、論理回路出力信号抽出部２２２は、次の（１）〜（３）に挙げるものを出力信号と判別して抽出する。なお、ここで「引数」とは非循環型最下層関数Ｆｅｘｐの引数のことであり、「関数」とは非循環型最下層関数Ｆｅｘｐのことである。
（１）関数の戻り値。
（２）関数内部でポインタ参照を介した値代入があるポインタ型の引数が参照する実体変数。
（３）関数内部で値代入があるグローバル変数。
【００７４】
図５〜図７を参照して、論理回路入力信号抽出部２２１及び論理回路出力信号抽出部２２２が入力信号及び出力信号をそれぞれ抽出する処理について、具体例を用いて説明する。
図５の関数 top0 においては、非ポインタ型である引数 a, b, c が入力信号と判別され、戻り値の計算式が出力信号と判別される。この例においては戻り値は変数 e であるが、一般には、関数の戻り値は変数単独でない一般式となり得る。
図６の関数 top1 においては、非ポインタ型である引数 a が入力信号と判別され、戻り値の計算式である prev_stt が出力信号と判別される。なお、関数内スタティック変数 stt は、関数外部からは参照できないので、論理回路内部の信号と判別され、入出力信号とはならない。
図７の関数 top2 のおいては、非ポインタ型である引数 pin が入力信号と判別される。引数 pw は、ポインタ型であり、また関数内部にポインタ参照を介した値代入（pw[0][0] = pin 等）が存在するので、９つの配列要素すべてが出力信号と判別される。このポインタ型引数 pw が参照する配列の実体を含む変数は、関数 top2 を呼出す関数（図示せず）によって指定されるが、これはスタティック変数（グローバル変数を含む。）であってもよく、又は関数 top2 を直接的若しくは間接的に呼出す上位階層関数のローカル変数であってもよい。
【００７５】
［制御フローグラフ生成部２３］
制御フローグラフ生成部２３は、非循環・非階層変換部２１によって得られた非循環型最下層関数Ｆｅｘｐから、その制御フローグラフＦｃｆｇを生成する。
一般に、関数の制御フローグラフとは、その関数を実行したときの経路を有向グラフで表現したものである。制御フローグラフのノード（節点）には、基本ブロック、始点ブロック及び終点ブロックがある。基本ブロックは、先頭命令以外に分岐先がなく、終端命令以外に分岐命令がない、逐次命令列である。始点ブロックは、関数入口に対応するノードであり、関数の実行はここから開始される。終点ブロックは、関数出口に対応するノードであり、関数の実行はここに到達すると終了する。制御フローグラフのエッジ（枝）は、関数の実行についてノード間の直接の遷移を表す有向枝である。
関数からその制御フローグラフを生成する処理は公知の技術であるため、ここではその具体的方法についての説明を省略する。制御フローグラフ生成部２３によって非循環型最下層関数Ｆｅｘｐから生成される制御フローグラフＦｃｆｇは、ループ構造を含まない（即ち、１つのノードを複数回通過する経路がグラフ内に存在しない）ものとなるが、最上位関数Ｆｔｏｐに条件分岐命令が含まれる場合には、制御フローグラフＦｃｆｇは経路の条件分岐（及びそれに伴う合流）を含むことになる。
【００７６】
［状態変数命令依存性判定部２４］
状態変数命令依存性判定部２４は、制御フローグラフ生成部２３で生成された制御フローグラフＦｃｆｇについて、以下に説明する論理回路生成可能判定規則１及び２によって論理回路生成の可能性を判定する。これらの規則のいずれかによって論理回路生成が可能でないと状態変数命令依存性判定部２４が判定した場合には、論理回路生成装置１は、例えば、出力装置１７に警告メッセージを出力し、論理回路生成処理を停止するようにすることができる。
【００７７】
論理回路生成可能性判定規則１は、各配列変数への代入命令について、配列インデックスが定数でない変数であり、かつ、その配列変数がレジスタ属性またはメモリ属性を持たない場合に、論理回路生成が可能でないと判定する規則である。そうした変数が制御フローグラフＦｃｆｇに含まれる場合には、変数命令依存性判定部２４は、論理回路生成が可能でないと判定する。
【００７８】
論理回路生成可能性判定規則２は、レジスタ／メモリ配列変数（レジスタ属性又はメモリ属性を持つ配列変数をいう。）である各変数Ｘについて、命令Ａから命令Ｂに対する変数Ｘの read-after-write 依存性があり、かつ、命令Ｂから命令Ｃに対する変数Ｘの write-after-read 依存性があるような関係にある命令Ａ、Ｂ、Ｃが存在する場合に、論理回路生成が可能でないと判定する規則である。この場合においては、命令ＡによるＸへの代入、命令ＢによるＸの参照、及び命令ＣによるＸへの代入が連続して実行されることになるが、このようなソフトウェア記述は１クロックの回路動作として実現できないため、論理回路生成が可能でないと判断するのである。こうした関係にある命令が制御フローグラフＦｃｆｇに含まれる場合には、変数命令依存性判定部２４は、論理回路生成が可能でないと判定する。
【００７９】
なお、本発明の別の実施形態においては、論理回路生成装置１は、状態変数命令依存性判定部２４を含まないものとすることができる。いずれの場合にも、論理回路生成装置１が入力に取るプログラムＰは、上記の論理回路生成可能性判定規則１及び２を満たす制御フローグラフに変換される最上位関数Ｆｔｏｐを含むものに限られる。
【００８０】
［レジスタ／メモリ配列アクセス命令分解部２５］
レジスタ／メモリ配列変数（レジスタ属性又はメモリ属性を持つ配列変数をいう。）に対する複数の読出し命令及び複数の書込み命令をそれぞれ１クロックで実行するためには、レジスタ配列変数（レジスタ属性を持つ配列変数をいう。）はマルチポートレジスタファイルを用いて、又はメモリ配列変数（メモリ属性を持つ配列変数をいう。）はマルチポートメモリを用いて、それぞれ回路を実現する必要がある。レジスタ／メモリ配列アクセス命令分解部２５は、配列代入命令及び配列参照命令にポート番号を割当てることによって、複数の書込みポートとソフトウェア記述上の配列代入命令との対応付け、及び、複数の読出しポートとソフトウェア記述上の配列参照命令との対応付けを行う。さらに、レジスタ／メモリ配列アクセス命令分解部２５は、レジスタ／メモリ配列変数に対応して生成されるレジスタファイル回路又はメモリ回路の入力ポートに対応する変数を追加することによって、配列代入命令及び配列参照命令を細分化する。
より具体的には、本実施形態におけるレジスタ／メモリ配列アクセス命令分解部２５は、次に説明する、書込みポート番号割当部２５１と、読出しポート番号割当部２５２と、配列代入命令分解部２５３と、配列参照命令分解部２５４とを含む。
【００８１】
書込みポート番号割当部２５１は、制御フローグラフＦｃｆｇに含まれるレジスタ／メモリ配列変数への配列代入命令のそれぞれに書込みポート番号を割当て、レジスタ／メモリ配列変数の書込みポート数を決定する。より具体的には、書込みポート番号割当部２５１は、制御フローグラフＦｃｆｇに含まれるレジスタ／メモリ配列変数Ｘへの配列代入命令Ａのそれぞれについて、制御フローグラフＦｃｆｇにおける始点ブロックから命令Ａまでの各径路上に存在する命令Ａ以外の配列変数Ｘへの配列代入命令の個数をそれぞれ数え上げ、その個数の最大値を、書込みポート番号として命令Ａに割当てる。
【００８２】
こうしてレジスタ／メモリ配列変数Ｘの配列代入命令に割当てられた書込みポート番号の数を、レジスタ／メモリ配列変数Ｘの書込みポート数と呼ぶことにする。即ち、ある整数Ｎｗを用いて書込みポート番号が０からＮｗ−１までのＮｗ個の番号で表されるときに、書込みポート数はＮｗとなる。レジスタ配列変数の書込みポート数をレジスタファイル書込みポート数と呼び、メモリ配列変数の書込みポート数をメモリ書込みポート数と呼ぶことにする。
【００８３】
読出しポート番号割当部２５２は、制御フローグラフＦｃｆｇに含まれるレジスタ／メモリ配列変数への配列参照命令のそれぞれに読出しポート番号を割当て、レジスタ／メモリ配列変数の読出しポート数を決定する。より具体的には、読出しポート番号割当部２５２は、制御フローグラフＦｃｆｇに含まれるレジスタ／メモリ配列変数Ｘへの配列参照命令Ｂのそれぞれについて、制御フローグラフＦｃｆｇにおける始点ブロックから命令Ｂまでの各経路上に存在する命令Ｂ以外の配列変数Ｘへの配列参照命令の個数をそれぞれ数え上げ、その個数の最大値を、読出しポート番号として命令Ｂに割当てる。
【００８４】
こうしてレジスタ／メモリ配列変数Ｘの配列参照命令に割当てられた読出しポート番号の数を、レジスタ／メモリ配列変数Ｘの読出しポート数と呼ぶことにする。即ち、ある整数Ｎｒを用いて読出しポート番号が０からＮｒ−１までのＮｒ個の番号で表されるときに、読出しポート数はＮｒとなる。レジスタ配列変数の読出しポート数をレジスタファイル読出しポート数と呼び、メモリ配列変数の読出しポート数をメモリ読出しポート数と呼ぶことにする。
【００８５】
レジスタ／メモリ配列変数を実現するレジスタファイル回路又はメモリ回路は、いずれも、レジスタ／メモリ配列変数に値を書込むために用いられる書込みポートと、レジスタ／メモリ配列変数から値を読出すために用いられる読出しポートとを含む。書込みポートは、データ入力ポートとアドレス入力ポートとを含む。配列代入命令分解部２５３は、これら２つの入力ポートに対応した変数を制御フローグラフＦｃｆｇに追加して、制御フローグラフＦｃｆｇに含まれる配列代入命令を細分化する。読出しポートは、アドレス入力ポートを含む。配列参照命令分解部２５４は、この入力ポートに対応した変数を制御フローグラフＦｃｆｇに追加して、制御フローグラフＦｃｆｇに含まれる配列参照命令を細分化する。これらのポートに対応して追加された変数を「レジスタ／メモリ配列ポート変数」又は単に「ポート変数」と呼ぶことにする。
【００８６】
図１４を参照して、上述したレジスタ／メモリ配列アクセス命令分解部２５の処理を、具体例を用いて説明する。（ａ１）は、メモリ配列変数 A に対する配列代入命令及び配列参照命令を含む関数 top3 を含むプログラムのソフトウェア記述であり、（ａ２）は、関数 top3 の制御フローグラフである。
【００８７】
関数 top3 は、（ａ１）の８行目及び１２行目に示されるように、２つの配列参照命令 v = A[a] 及び u = A[b] を含む。これらは、（ａ２）の制御フローグラフにおいても、それぞれそのまま表れている。（ａ２）において、始点ブロック top3:start から配列参照命令 v = A[a] の命令までの間には、配列変数 A に対する配列参照命令は存在しない（即ち、０個の配列参照命令が存在する）ので、読出しポート番号割当部２５２は、配列参照命令 v = A[a] に読出しポート番号０を割当てる。また、始点ブロック top3:start から配列参照命令 u = A[b] までの間には、配列参照命令 v = A[a] を通過する経路と、通過しない経路とが存在する。従って、始点ブロック top3:start から配列参照命令 u = A[b] までの経路上には０個又は１個の配列参照命令が存在し、その個数の最大値は１であるので、読出しポート番号割当部２５２は、配列参照命令 u = A[b] に読出しポート番号１を割当てる。以上より、配列変数 A に対する配列参照命令に割当てられた読出しポート番号は０及び１の２つであるため、読出しポート番号割当部２５２は、配列変数 A の読出しポート数を２と決定する。
【００８８】
また、関数 top3 は、（ａ１）の９行目、１３行目及び１６行目に示されるように、３つの配列代入命令 A[a] = V + 1 、 A[b] = u + 1 及び A[0] = v + u を含む。このうち、配列代入命令 A[a] = V + 1 及び A[b] = u + 1 対する処理は、上記の１つ目及び２つ目の配列参照命令に対する処理とそれぞれ同様である。即ち、書込みポート番号割当部２５１は、配列代入命令 A[a] = V + 1 に書込みポート番号０を割当て、配列代入命令 A[b] = u + 1 に書込みポート番号１を割当てる。始点ブロック top3:start から配列代入命令 A[0] = v + u までの間には、配列代入命令 A[a] = V + 1 を通過する経路と、通過しない経路とが存在するが、いずれの経路も、配列代入命令 A[b] = u + 1 を通過することはない。従って、始点ブロック top3:start から配列代入命令 A[0] = v + u に到達する経路上には、０個又は１個の配列代入命令が存在し、その個数の最大値は１であるので、書込みポート番号割当部２５１は、３つ目の配列代入命令に書込みポート番号１を割当てる。以上より、配列変数 A に対する配列代入命令に割当てられた読出しポート番号は０及び１の２つであるため、書込みポート番号割当部２５１は、配列変数 A の書込みポート数を２と決定する。
【００８９】
以上のように、配列変数 A の配列代入命令に書込みポート０及び１が割当てられ、配列参照命令に読出しポート０及び１が割当てられた。そこで、配列代入命令分解部２５３及び配列参照命令分解部２５４は、次に示すように、これらの各ポートに対応するポート変数を、制御フローグラフＦｃｆｇに追加する。
読出しアドレス変数：  A0r（ポート０），  A1r（ポート１）
書込みアドレス変数：  A0w（ポート０），  A1w（ポート１）
書込みデータ変数  ：  A0d（ポート０），  A1d（ポート１）
ここで、読出しアドレス変数は読出しポートにおけるアドレス入力ポートに対応する変数であり、書込みアドレス変数は書込みポートにおけるアドレス入力ポートに対応する変数であり、書込みデータ変数は書込みポートにおけるデータ入力ポートに対応する変数である。
【００９０】
さらに、配列代入命令分解部２５３及び配列参照命令分解部２５４は、書込みアドレス変数及び読出しアドレス変数に配列インデックスの式を代入する命令を生成し、書込みデータ変数に代入値を計算する式を代入する命令を生成する。これにより、配列代入命令分解部２５３及び配列参照命令分解部２５４は、図１６（ａ）に示されるように、制御フローグラフＦｃｆｇに含まれる配列代入命令及び配列参照命令を、細分化した命令に変換する。図１４（ｂ１）は、理解を助けるために、図１６（ａ）の制御フローグラフをソフトウェア記述に表現しなおしたものである。
【００９１】
なお、本発明の別の実施形態においては、レジスタ／メモリ配列アクセス命令分解部２５は、書込みポート番号割当部２５１及び読込みポート番号割当部２５２を含まないものとすることができる。この場合には、配列代入命令分解部２５３及び配列参照命令分解部２５４は、制御フローグラフＦｃｆｇに含まれる各配列変数に対して１組のポート変数を追加するようにすればよい。また、本発明の別の実施形態においては、論理回路生成装置１は、レジスタ／メモリ配列アクセス命令分解部２５を含まないものとすることができる。この場合には、論理回路生成装置１は、レジスタ／メモリ配列変数を含まないプログラムＰを入力に取る。
【００９２】
［メモリポート数判定部２６］
メモリポート数判定部２６は、レジスタ／メモリ配列アクセス命令分解部２５において算出されたレジスタファイル書込みポート数、レジスタファイル読出しポート数、メモリ書込みポート数及びメモリ読出しポート数が、それぞれ予め定められた閾値を超えていないかどうかを判定する。ポート数の閾値は、回路特性（例えば、回路規模、回路動作速度、消費電力）や半導体製造プロセス等の技術的要因によって、予め４種類のポートについて個別に定めることができる。これらのポート数のいずれかが予め定められた閾値を超えている場合には、メモリポート数判定部２６は、回路合成が可能でないと判定する。論理回路生成が可能でないとメモリポート数判定部２６が判定した場合には、論理回路生成装置１は、例えば、出力装置１７に警告メッセージを出力し、論理回路生成処理を停止するようにすることができる。
【００９３】
なお、本発明の別の実施形態においては、論理回路生成装置１は、メモリポート数判定部２６を含まないものとすることができる。この場合には、論理回路生成装置１は、ポート数にかかわらず論理回路生成の処理をする。
【００９４】
［静的単一代入形式変換部２７］
メモリポート数判定部２６によって、制御フローグラフＦｃｆｇが論理回路生成可能であると判定された場合には、次いで、制御フローグラフＦｃｆｇは、静的単一代入形式変換部２７に入力される。静的単一代入形式変換部２７は、制御フローグラフＦｃｆｇを静的単一代入形式の制御フローグラフに変換する。
【００９５】
一般に、静的単一代入形式とは、ソフトウェア・コンパイラの中間表現形式の一つであり、各変数の値の定義が１つだけ存在する（即ち、各変数への値の代入が１箇所で行われる）ような形式をいう。静的単一代入形式は、変数の名前変更（リネーミング）を行い、さらに、同一変数に対する値の定義が複数個合流する制御フロー箇所にφ関数命令と呼ばれる命令を追加することによって得られる。
【００９６】
静的単一代入形式変換部２７は、より具体的には、次に説明する、φ関数命令挿入部２７１と、変数名変換部２７２と、状態変数名再変換部２７３とを含む。
【００９７】
φ関数命令挿入部２７１は、制御フローグラフ内の、同一変数に対する値の定義が複数個合流する箇所に、φ関数命令を挿入する。φ関数命令は、その箇所に合流する全ての変数定義（変数に対する値の定義をいう。）の中から、実際に実行された経路上の変数定義を選択する命令である。φ関数命令によって選択された変数定義による値は、その同じ変数に代入される。なお、φ関数命令の実体化（φ関数命令を具体的な演算命令に変換することをいう。）は、後述する制御フロー縮退変換部２８によって行われる。
【００９８】
変数名変換部２７２は、制御フローグラフ内の各変数代入命令及び各φ関数命令による変数の値の定義について、変数ごとの固有の添字付き変数名に置き換える。変数名変換部２７２は、さらに、制御フローグラフ内の変数を参照する各命令について、参照される各変数の変数名を、その命令に到達する各変数代入命令又は各φ関数命令による変数の値の定義に対応する添字付き変数名に置き換える。この処理によって、制御フローグラフは、静的単一代入形式に変換される。
【００９９】
状態変数名再変換部２７３は、静的単一代入形式に変換された制御フローグラフに対する追加の処理として、各スタティック変数（グローバル変数を含む。）に対して、関数の出口に対応する終点ブロックに到達する値の定義に割当てられた添字付き変数名を、関数の入口に対応する始点ブロックにおける添字付き変数名に置き換える。これを行うのは、関数出口におけるスタティック変数及びグローバル変数の値を、次回の関数実行における関数入口箇所で参照可能にするためである。
【０１００】
図１５を参照して、静的単一代入形式変換部２７が、複数の変数定義の合流を伴う制御フローグラフＦｃｆｇを静的単一代入形式に変換する場合の処理について、具体例を用いて説明する。図１５（ｂ）は、図１５（ａ）に示されるプログラムに含まれる最上位関数 top4 の制御フローを表現した制御フローグラフである。まず、φ関数命令挿入部２７１は、図１５（ｃ）に示されるように、変数 a, b, c それぞれの変数定義が合流する基本ブロックの先頭箇所にφ関数命令を挿入する。具体的に、関数引数変数 a について見ると、関数引数の値として与えられる関数入口における値の定義と、 a = b + 1 の代入命令による値の定義とが、φ関数命令が挿入された箇所で合流する。グローバル変数 b について見ると、グローバル変数の値として与えられる関数入口における値の定義と、 b = b + 1 の代入命令による値の定義と、 b = a の代入命令による値の定義との３つが、φ関数命令が挿入された箇所で合流する。ローカル変数 c について見ると、 c = b - 1 の代入命令による値の定義と、 c = c + 1 の代入命令による値の定義と、 c = 0 の代入命令による値の定義との３つが、φ関数命令が挿入された箇所で合流する。
【０１０１】
次に、変数名変換部２７２は、図１５（ｄ）に示されるように、各変数代入命令及び各φ関数命令による変数の値の定義について、変数ごとの固有の添字付き変数名に置き換える。例えば変数名 c1 は変数 c に対する１つの代入命令による値の定義について割当てられた添字付き変数名であり、変数名 c2 は同じ変数 c に対する別の代入命令による値の定義について割当てられた添字付き変数名である。また、代入変数名前変換部２７２は、図示されないが、関数引数変数及びスタティック変数（グローバル変数を含む。）の値は、関数 top4 の入り口に対応する制御フローグラフの始点ブロック top4:start において定義されているものとみなして、これらの変数にも添字付きの変数名を割当てる。具体的には、関数引数の値として与えられた変数 a の値の定義に対して、添字付き変数名 a1 を割当てる。また、グローバル変数 b については、関数入口の時点における値をそのまま定義とみなし、その値の定義に対して添字付き変数名 b1 を割当てる。
【０１０２】
変数名変換部２７２は、さらに、図１５（ｅ）に示されるように、変数を参照する各命令について、参照される各変数の変数名を、その命令に到達する各変数代入命令又は各φ関数命令による変数の値の定義に対応する添字付き変数名に置き換える。具体的には、図１５（ｄ）において式 c1 = b - 1 で表される命令においてはグローバル変数 b が参照されるが、上述のように、この命令に到達する変数 b の値の定義には添字付き変数名 b1 が割当てられているため、図１５（ｅ）に示されるように、この命令における変数 b の変数名を b1 に置き換える。変数を参照する他の命令についても同様である。
【０１０３】
以上の処理によって、制御フローグラフは静的単一代入形式に変換されるが、状態変数名再変換部２７３は、こうして作られた静的単一代入形式の制御フローグラフに対して、追加の処理を行う。即ち、図１５（ｆ）に示されるように、各スタティック変数（グローバル変数を含む。）に対して、関数 top4 の出口に対応する終点ブロック top4:end に到達する値の定義に割当てられた添字付き変数名を、関数 top4 の入口に対応する始点ブロック top4:start における添字付き変数名に置き換える。
【０１０４】
図１６には、制御フローグラフＦｃｆｇを静的単一代入形式に変換する処理が、別の具体例を用いて示される。図１６（ａ）は、図１４（ｂ）に示されるソフトウェア記述によって記述された関数 top3 の制御フローグラフである。図１６（ｂ）は、静的単一代入形式変換部２７が図１６（ａ）の制御フローグラフを静的単一代入形式に変換した結果である。変換の具体的な方法は、図１５を参照して上述した通りである。この例における関数 top3 はレジスタ／メモリ配列アクセス命令を含むものであり、制御フローグラフＦｃｆｇに含まれるレジスタ／メモリ配列アクセス命令は、上述したレジスタ／メモリ配列アクセス命令分解部２５によって、レジスタ／メモリ配列ポート変数を用いて細分化されている。静的単一代入形式変換部２７は、レジスタ／メモリ配列ポート変数についても、他の変数と同様に変数名を置き換える。但し、レジスタ／メモリ配列変数自体については、変数名の置き換えを行わない。
【０１０５】
本発明の別の実施形態においては、論理回路生成装置１は、静的単一代入形式変換部２７を含まないものとすることができる。この場合は、論理回路生成装置１は、静的単一代入形式のソフトウェア記述で記述された最上位関数Ｆｔｏｐを含むプログラムＰを入力に取る。
【０１０６】
［制御フロー縮退変換部２８］
静的単一代入形式変換部２７によって静的単一代入形式に変換された制御フローグラフＦｃｆｇは、次いで、制御フロー縮退変換部２８に入力される。前述したように、制御フローグラフＦｃｆｇは、ループ構造を含まないが、経路の条件分岐（及びそれに伴う合流）を含むことがあるため、そのまま論理回路を表現するデータとして用いるのには適さない。しかし、制御フロー縮退変換部２８に入力される制御フローグラフＦｃｆｇは、各変数への代入を１つだけ含む静的単一代入形式に変換されたものであるため、制御フローグラフＦｃｆｇに追加されたφ関数命令を実体化すれば、条件分岐を無視して制御フローグラフの全てのノードの命令を実行しても正常な動作をする。このことは、ソフトウェア記述から論理回路を生成する手法において、大変重要な事実である。
【０１０７】
そこで、制御フロー縮退変換部２８は、入力された制御フローグラフＦｃｆｇに含まれるφ関数命令を実体化し、制御フローグラフＦｃｆｇから条件分岐を全て除去することによって、制御フローが縮退されたプログラムである制御フロー縮退プログラムＦｄｅｇを生成する。制御フロー縮退プログラムＦｄｅｇは、条件分岐を含む制御フローグラフＦｃｆｇと比較すると、論理回路の構造をより直接的に表現するものとなる。
【０１０８】
本実施形態における制御フロー縮退変換部２８は、より具体的には、次に説明する、φ関数命令実体化部２８１と、基本ブロック単一化部２８２と、レジスタ／メモリ配列アクセス命令融合部２８３とを含む。
【０１０９】
φ関数命令実体化部２８１は、入力された制御フローグラフＦｃｆｇに含まれるφ関数命令を実体化する（即ち、φ関数命令を具体的な演算命令に変換する）。静的単一代入形式変換部２７の説明において述べたように、φ関数命令は、複数の変数定義が合流する制御フローグラフ内の箇所に挿入されたものであり、その箇所に合流する全ての変数定義の中から実際に実行された経路上の変数定義を選択する命令である。変数定義の選択は、経路の条件分岐における条件値に基づいて行われる。例えば、条件 p の真偽値によって条件分岐する２つの経路があり、条件 p が真である場合に実行される経路上に変数定義 a1 が存在し、条件 p が偽である場合に実行される経路上に変数定義 a2 が存在し、２つの経路の合流後の部分にこれらの変数定義から１つを選択するφ関数命令 φ(a1, a2) が存在するとする。このとき、φ関数命令 φ(a1, a2) は、条件 p が真である場合に a1 を選択し、そうでない（即ち、条件 p が偽である）場合に a2 を選択するように実体化される。より具体的には、 φ(a1, a2) は p ? a1 : a2 という式に実体化される。
【０１１０】
基本ブロック単一化部２８２は、φ関数命令実体化部２８１によってφ関数命令が実体化された制御フローグラフＦｃｆｇから条件分岐を全て除去することによって、制御フローが縮退されたプログラムである制御フロー縮退プログラムＦｄｅｇを生成する。
【０１１１】
一般に、条件分岐を含まない制御フローグラフにおいては、経路は１つに定まり、全ての命令が一連に逐次実行されることになるため、全ての基本ブロックに含まれる（分岐命令以外の）命令を１つの命令列に結合することによって、全ての基本ブロックを１つの基本ブロックに結合することが可能である。このように基本ブロックが１つにまとめられた制御フローグラフによって表されるプログラムを、制御フローが縮退されたプログラムと呼ぶ。
【０１１２】
ところで、基本ブロック単一化部２８２に入力される、φ関数命令が実体化された制御フローグラフＦｃｆｇは、上述の通り、条件分岐を無視して全てのノードの命令を実行しても正常な動作をする。そこで、基本ブロック単一化部２８２は、入力された制御フローグラフＦｃｆｇの全ての基本ブロックに含まれる（分岐命令以外の）命令を１つの命令列に結合することによって、全ての基本ブロックを単一の基本ブロックに結合し、制御フローが縮退されたプログラムを生成する。このとき、結合された基本ブロックの命令列における命令の順序は、元の基本ブロックの実行順序に基づく。例えば、入力された制御フローグラフＦｃｆｇにおいて基本ブロックＢ１から基本ブロックＢ２及びＢ３に経路が分岐し、その後これらの経路が基本ブロックＢ４において合流する場合を考える。このとき、Ｂ１及びＢ２を通過する経路においてＢ１はＢ２より先に実行されるので、結合された基本ブロックにおいて、Ｂ１に含まれていた命令はＢ２に含まれていた命令よりも前に配置するようにする。Ｂ１とＢ３との関係、Ｂ２とＢ４との関係、及びＢ３とＢ４との関係も同様である。しかし、Ｂ２及びＢ３を共に通過する経路は存在しないので、Ｂ２に含まれていた命令はＢ３に含まれていた命令より前に配置しても後に配置しても構わない。その結果、結合された基本ブロックにおけるこの部分の命令の順序は、Ｂ１→Ｂ２→Ｂ３→Ｂ４、又はＢ１→Ｂ３→Ｂ２→Ｂ４となる。いずれにしても、Ｂ２に含まれていた命令及びＢ３に含まれていた命令は、入力された制御フローグラフＦｃｆｇにおいては排他的にのみ実行されるものであったが、結合された基本ブロックにおいてはどちらも実行されることになる。
【０１１３】
レジスタ／メモリ配列アクセス命令融合部２８３は、φ関数命令が実体化された制御フロー縮退プログラムＦｄｅｇに対して、排他的に実行されるレジスタ／メモリ配列アクセス命令を融合する処理と、条件的に実行されるレジスタ／メモリ配列アクセス命令に実行条件式を付加する処理とを行う。
【０１１４】
図１５（ｆ）及び図１７を参照して、制御フロー縮退変換部２８が行う処理について、具体例を用いて説明する。まず、φ関数命令実体化部２８１が、制御フローグラフＦｃｆｇに含まれるφ関数命令を実体化する。図１５（ｆ）の制御フローグラフに含まれるそれぞれのφ関数命令の動作は、経路の条件分岐における条件値に基づき、具体的には次の通りである。ここでは、条件値を、 P1 = (a1==0) , P2 = (a1<0) と置いている。
φ(a1,a2) は、 P1 が真である場合には a2 を選択し、 P1 が偽である場合には a1 を選択する。
φ(b1,b2,b3) は、 P1 が真である場合には b2 を選択し、 P1 が偽でありかつ P2 が真である場合には b3 を選択し、 P1 が偽でありかつ P2 が偽である場合には b1 を選択する。
φ(c1,c2,c3) は、 P1 が真である場合には c2 を選択し、 P1 が偽でありかつ P2 が真である場合には c3 を選択し、 P1 が偽でありかつ P2 が偽である場合には c1 を選択する。
これらを具体的な式で表現することによって、各φ関数命令は次の通り実体化される。
φ(a1,a2) = (P1) ? a1 : a2;
S_b3_b1 = (P2) ? b3 : b1;
φ(b1,b2,b3) = (P1) ? b2 : S_b3_b1;
S_c3_c1 = (P2) ? c3 : c1;
φ(c1,c2,c3) = (P1) ? c2 : S_c3_c1;
【０１１５】
次いで、基本ブロック単一化部２８２が、φ関数命令が実体化された制御フローグラフＦｃｆｇに含まれる全ての基本ブロックの（分岐命令以外の）命令を１つの命令列に結合する。その結果、条件分岐が全て除去され、図１７に示される、制御フロー縮退プログラムＦｄｅｇが生成される。
【０１１６】
別の具体例として図１６（ｂ）及び図１８を参照して、制御フロー縮退変換部２８が行う処理を説明する。図１８（ａ）は、レジスタ／メモリ配列アクセス命令を含む図１６（ｂ）の制御フローグラフＦｃｆｇから変換された制御フロー縮退プログラムＦｄｅｇを示す。この変換の具体的な処理方法は、図１５（ｆ）及び図１７を参照して説明された通りである。レジスタ／メモリ配列アクセス命令融合部２８３は、この制御フロー縮退プログラムＦｄｅｇに対して、排他的に実行されるレジスタ／メモリ配列アクセス命令を融合する処理を行う。具体的には、図１８（ａ）の１７行目に示される配列代入命令 A[A1w1] = A1d1 と、２０行目に示される配列代入命令 A[A1w2] = A1d2 とを、φ関数命令 A1w3 = φ(A1w1,A1w2) 及び A1d3 = φ(A1d1,A1d2) の実体化の結果を用いて、図１８（ｂ）の２６行目に示される１つの配列代入命令 A[A1w3] = A1d3 に融合する。さらに、レジスタ／メモリ配列アクセス命令融合部２８３は、条件的に実行されるレジスタ／メモリ配列アクセス命令に実行条件式を付加する処理を行う。具体的には、図１８（ａ）の５行目に示される配列参照命令 v2 = A[A1r1] の読出しアドレスポート変数の代入命令 A1r1 = a1 は、 P1 が真のときに実行されるので、この配列参照命令を、図１８（ｂ）の５行目に示されるように、 if(P1) v2 = A[A1r1] に変換する。同様に、図１８（ａ）の８行目に示される配列代入命令 A[A1w1] = A1d1 の書込みアドレスポート変数の代入命令 A1w1 = a1 及び書込みデータポート変数の代入命令 A1d1 = u2+1 はともに、 P1 が真のときに実行されるので、この配列代入命令を、図１８（ｂ）の５行目に示されるように、 if(P1) v2 = A[A1r1] に変換する。また、配列代入命令 A[A1w3] = A1d3 の書込みアドレスポート変数と書込みデータポート変数はφ関数命令が出力しており、これらφ関数命令は必ず実行される制御フロー経路上にあるので、実行条件は付加しない。
【０１１７】
以上に説明されたように、制御フロー縮退変換部２８は、入力された制御フローグラフＦｃｆｇから、制御フローが縮退されたプログラムである制御フロー縮退プログラムＦｄｅｇを生成する。なお、別の実施形態において、論理回路生成装置１がφ関数命令挿入部２７１を含まない場合には、制御フローグラフＦｃｆｇがφ関数命令を含むことはないため、制御フロー縮退変換部２８は、φ関数命令実体化部２８１を含まないものとすることができる。また、さらに別の実施形態において、論理回路生成装置１がレジスタ／メモリ配列アクセス命令分解２５を含まない場合には、制御フロー縮退変換部２８は、レジスタ／メモリ配列アクセス命令融合部２８３を含まないものとすることができる。
【０１１８】
［データフローグラフ生成部２９］
制御フロー縮退変換部２８によって生成された制御フロー縮退プログラムＦｄｅｇは、次いで、データフローグラフ生成部２９に入力される。データフローグラフ生成部２９は、入力された制御フロー縮退プログラムＦｄｅｇに含まれる制御フローの分岐及び合流のない逐次命令列から、そのデータフローグラフＦｄｆｇを生成する。一般に、データフローグラフとは、逐次命令列において、各命令をノードとし、変数の値を定義する命令とその定義を参照する命令との間に有向枝を結んだ有向グラフである。制御フローの分岐及び合流のない逐次命令列からそのデータフローグラフを生成する処理は、公知の技術を用いて容易に実装可能であるため、ここではその具体的方法についての説明を省略する。具体例として、図１９は、図１７の制御フロー縮退プログラムから生成されるデータフローグラフを示す。別の具体例として、図２０は、図１８（ｂ）の制御フロー縮退プログラムから生成されるデータフローグラフを示す。
【０１１９】
［データフローグラフ最適化部３０］
データフローグラフ生成部２９によって生成されたデータフローグラフＦｄｆｇは、次いで、データフローグラフ最適化部３０に入力される。データフローグラフ最適化部３０は、入力されたデータフローグラフＦｄｆｇを最適化する。より具体的には、データフローグラフ最適化部３０は、次に説明する、ビット幅判定部３０１、冗長比較演算削除部３０２、演算分解部３０３、及び冗長演算削除部３０４を含む。
【０１２０】
ＲＴＬ記述においては、演算回路の各データのビット幅を明示する必要があるが、各データのビット幅を明示的に指定することは、非常に煩雑である。そこで、ビット幅判定部３０１は、論理回路の入力データ及びレジスタ変数に対するビット幅指定の情報から、演算回路の中間データ及び出力データのビット幅を自動的に判定する。本実施形態においては、これらのデータが取り得る値の区間を求め、その区間内の任意の値を表現することが可能な最小のビット幅をそのデータのビット幅として定めるようにする。以下に、ビット幅判定部３０１が行う処理について、詳細に説明する。以下の説明においては、データとして整数値のみを考慮するが、他の型の値（例えば、浮動小数点数）も同様に考慮することができることは明らかである。また、本実施形態においては、負の値は２の補数表記によって表現される。
【０１２１】
以下の説明において、データ x が取り得る最小値及び最大値を、それぞれ x.L 及び x.H で表すことにする。また、これらを両端点として定められる区間 [x.L, x.H] を、データ x のデータ区間と呼ぶことにする。取り得る値が定数値 c であるデータのデータ区間は、 [c, c] となる。
【０１２２】
定数 c のビット表現のうち符号ビットを除いた部分を表現することが可能な最小のビット幅を、 c の最小ビット幅と呼び、 min_bit(c) で表すことにする。 c が非負値である場合、即ち c >= 0 の場合には、 min_bits(c) の値は 2n - 1 >= c を満たす最小の整数 n であり、 c が負値である場合、即ち c < 0 の場合には、 min_bits(c) の値は 2n >= - c を満たす最小の整数 n である。
【０１２３】
この min_bits(c) を用いて、データ区間 [x.L, x.H] を持つデータ x を表現するための最小ビット幅 bit_width([x.L, x.H]) を、次のように表す。
データ x が非負値のみを取り得る場合、即ち x.L >= 0 の場合には、データ x は符号無しデータとして扱われ、符号無し２進数表記によってビット表現される。この場合には、 x が取り得る最大値を表現することが可能なビット幅によって、 x が取り得る任意の値を表現することが可能であるため、データ x を表現するための最小ビット幅は
bit_width([x.L, x.H]) = min_bits(x.H);
と表される。
一方、データ x が負値を取り得る場合、即ち x.L < 0 の場合には、データ x は符号付きデータとして扱われ、符号付きの２進数（負値については、２の補数）表記によってビット表現される。この場合には、データ x を表現するための最小ビット幅は
bit_width([x.L, x.H]) = max(min_bits(x.L), min_bits(x.H)) + 1;
と表される。
【０１２４】
まず、ビット幅判定部３０１は、論理回路の入力データ及び状態変数に対して、ビット幅情報とデータ型とから、それぞれのデータが取り得る値の範囲を算出し、それを初期データ区間として設定する。
n ビット符号無しデータ x の初期データ区間は、
[x.L, x.H] = [0, 2n - 1];
と設定される。
n ビット符号付きデータ x の初期データ区間は、
[x.L, x.H] = [ - 2n - 1, 2n - 1 - 1];
と設定される。
【０１２５】
次に、ビット幅判定部３０１は、各演算の種類及び演算対象のデータ区間に基づいて、演算結果のデータ区間を決定する。以下に、演算の種類ごとに、演算結果のデータ区間を決定する処理について説明する。
【０１２６】
（１）２項演算のデータ区間
z = x op yの形式の２項演算における演算結果のデータ区間を
[z.L, z.H] = Range(op, [x.L, x.H], [y.L, y.H]);
と表記する。ここでは、演算子 op がＣ言語の２項演算子のうち { +, -, *, /, %, <<, >>, &, |, ^, ==, !=, <, >, <=, >= } のいずれかである２項演算に対する処理について説明するが、例えばべき乗など他の２項演算に対しても同様の処理が可能であることは明らかである。２項演算における演算結果のデータ区間は、演算子 op と演算対象データ x 及び y のデータ区間 [x.L, x.H] 及び [y.L, y.H] とから決定される。以下に、２項演算の種類ごとに、演算結果のデータ区間を決定する具体的な処理について説明する。
【０１２７】
（１．１）単調２項演算のデータ区間
２項演算 x op y の演算子 op が { +, -, *, <<, >> } のいずれかである場合のその２項演算を、ここでは単調２項演算と呼ぶことにする。この場合における x op y の演算結果のデータ区間は、それぞれの最小値 x.L, y.L 及び最大値 x.H, y.H を用いて求められる。より具体的には、
MRange(op, [x.L, x.H], [y.L, y.H]) = [min(z0, z1, z2, z3), max(z0, z1, z2, z3)];
（但し上式において
z0 = x.L op y.L;
z1 = x.L op y.H;
z2 = x.H op y.L;
z3 = x.H op y.H;
）と定義すると、これが単調２項演算における演算結果のデータ区間であるので、
Range(op, [x.L, x.H], [y.L, y.H]) = MRange(op, [x.L, x.H], [y.L, y.H]);
と決定される。
【０１２８】
（１．２）除算のデータ区間
２項演算 x op y が除算である場合、即ち op が / である場合には、次に説明するように、除数 y のデータ区間 [y.L, y.H] によってさらに場合分けをする。なお、ここでは y == 0 の場合は考慮しないものとする。
y が非負値のみ、又は y が非正値のみ、即ち y.L >= 0 || y.H <= 0 の場合には、有効な除数のデータ区間、即ち y のデータ区間から y == 0 を取り除いたデータ区間を [y'.L, y'.H] とすると、その両端点は
y'.L = (y.L == 0) ? 1 : y.L;
y'.H = (y.H == 0) ? - 1 : y.H;
と表される。これを用いて、この場合の演算データ区間は
Range(/, [x.L, x.H], [y.L, y.H]) = MRange(/, [x.L, x.H], [y'.L, y'.H]);
と決定される。
それ以外の場合、即ち y が正負値をとる y.L < 0 && y.H > 0 の場合には、除数 y の区間を負の範囲との正の範囲とに分け、除数をそれぞれの範囲に限定したときの演算結果のデータ区間を求め、それらを統合することによって、最終的な演算結果のデータ区間を決定する。具体的には、除数を負の範囲に限定したときの演算結果のデータ区間を [L0, H0] とし、除数を正の範囲に限定したときの演算結果のデータ区間を [L1, H1] とすると、
[L0, H0] = MRange(/, [x.L, x.H], [y.L, - 1]);
[L1, H1] = MRange(/, [x.L, x.H], [1, y.H]);
と表される。従って、この場合の最終的な演算結果のデータ区間は、これらを統合して
Range(/, [x.L, x.H], [y.L, y.H]) = [min(L0, L1), max(H0, H1)]
と決定される。
【０１２９】
（１．３）剰余演算のデータ区間
２項演算 x op y が剰余演算である場合、即ち op が % である場合には、次の通りである。
一般に、 y != 0 の場合において、 x が負値のときには、 x % y の最小値は - (abs(y) - 1) 、最大値は 0 である。 x が非負値のときには、 x % y の最小値は 0 、最大値は abs(y) - 1である。そこで、
y_abs_max = max(abs(y.L), abs(y.H));
z4 = (x.L < 0) ? - (y_abs_max - 1) : 0;
z5 = (x.H >= 0) ? y_abs_max - 1 : 0;
と定めることにより、剰余演算における演算結果のデータ区間は
Range(%, [x.L, x.H], [y.L, y.H]) = [min(z4, 0), max(z5, 0)];
と決定される。
【０１３０】
（１．４）論理演算のデータ区間
２項演算 x op y がビットごとの論理演算である場合、即ち演算子 op が { &, |, ^ } のいずれかである場合における演算結果のデータ区間を決定する処理について、以下に説明する。なお、説明において、単に「論理演算」というときは、ビットごとの論理演算を意味するものとする。
【０１３１】
論理演算のデータ区間を算出する場合においては、算術演算の場合と異なり、２の補数の概念が適用されない。即ち、 -1 及び 0 は２進数表現でそれぞれ 111…1 及び 000…0 であるので、-1 及び 0 を共に含む区間は、２進数表現において不連続である。このように、負値と非負値とを両方含む、２進数表現において不連続となる区間を、２進不連続区間と呼ぶ。逆に、負値だけを取る区間、及び非負値だけを取る区間は、２進連続区間と呼ぶ。
【０１３２】
２つの整数 x 及び y について、それぞれを２の補数表記によって表現し、それらを符号無し整数として再解釈して比較した場合の最大値を unsigned_max(x, y) 、最小値を unsigned_min(x, y) で表す。これらを式によって具体的に定義すると、
unsigned_max(x, y) = ((unsigned) x > (unsigned) y) ? x : y;
unsigned_min(x, y) = ((unsigned) x < (unsigned) y) ? x : y;
となる。
別の表現をすると、以下の通りである。 x 及び y の符号が等しい場合、即ち ((x < 0) == (y < 0)) の場合には、通常の大小比較によって
unsigned_max(x, y) = (x > y) ? x : y;
unsigned_min(x, y) = (x < y) ? x : y;
と表される。一方、 x 及び y の符号が異なる場合、即ち ((x < 0) != (y < 0)) の場合には、これらを符号無し整数として再解釈して比較すると、負値を再解釈した値の方が非負値を再解釈した値より大きくなるため、
unsigned_max(x, y) = (x < 0) ? x : y;
unsigned_min(x, y) = (x >= 0) ? x : y;
と表される。
【０１３３】
ここでまず、論理演算において演算対象のデータ区間がいずれも２進連続区間である場合について説明する。即ち、 z = x op y の形式の論理演算において、 [x.L, x.H] 及び [y.L, y.H] が共に２進連続区間である場合である。この場合の演算結果のデータ区間 [z.L, z.H] を
[z.L, z.H] = C_Range(op, [x.L, x.H], [y.L, y.H]);
と表記する。これは、具体的に次の計算式によって求められる。
b = max(min_bits(x.L), min_bits(x.H), min_bits(y.L), min_bits(y.H));
x_sign = (x.L < 0); （２進連続区間なので、(x.L < 0) == (x.H < 0)）
y_sign = (y.L < 0); （２進連続区間なので、(y.L < 0) == (y.H < 0)）
min_range = (x_sign op y_sign) ? - 2b : 0;
max_range = (x_sign op y_sign) ? - 1 : 2b - 1;
C_Range(&, [x.L, x.H], [y.L, y.H]) = [min_range, unsigned_min(x.H, y.H)];
C_Range(|, [x.L, x.H], [y.L, y.H]) = [unsigned_max(x.L, y.L), max_range];
C_Range(^, [x.L, x.H], [y.L, y.H]) = [min_range, max_range];
【０１３４】
なお、上式において、区間の端点を定めるために min_range 及び max_range が用いられているが、演算対象のデータ区間の与え方によっては、実際の演算結果の範囲が min_range 又は max_range の値を必ずしも含まない場合がある。本発明の別の実施形態においては、演算対象のデータ区間から各ビットの取り得る値を分析することによって、演算結果のデータ区間をより厳密に求めるようにしてもよい。又は、それとは逆に、さらに別の実施形態においては、例えばビット幅のみを考慮するなど、本実施形態よりさらに簡単なものとしてもよい。
【０１３５】
次に、論理演算における一般の場合について説明する。演算 x op y において演算子 op が { &, |, ^ } のいずれかである場合における演算対象のデータ区間 [x.L, x.H] 及び [y.L, y.H] のそれぞれについて、その区間が２進不連続区間である場合には、その区間を２つの２進連続区間に分割した上で、それぞれの２進連続区間における演算結果のデータ区間を計算し、それらの結果を統合して最終的な演算結果のデータ区間を決定する。  具体的な式を用いて表すと、次のようになる。まず、データ区間 [x.L, x.H] 及び [y.L, y.H] のそれぞれが２進不連続区間であるか否かを判定する。
x_neg_pos = (x.L < 0 && x.H >= 0); （[x.L, x.H] が２進不連続区間である）
y_neg_pos = (y.L < 0 && y.H >= 0); （[y.L, y.H] が２進不連続区間である）
x_neg_pos == 0 && y_neg_pos == 0 の場合、即ち両区間とも２進連続区間である場合には、前述の通り
Range(op, [x.L, x.H], [y.L, y.H]) = C_Range(op, [x.L, x.H], [y.L, y.H]);
と求められる。
x_neg_pos == 0 && y_neg_pos == 1 の場合には、２進不連続区間であるデータ区間 [y.L, y.H] を分割することによって
[L0, H0] = C_Range(op, [x.L, x.H], [y.L, - 1]);
[L1, H1] = C_Range(op, [x.L, x.H], [0, y.H]);
Range(op, [x.L, x.H], [y.L, y.H]) = [min(L0, L1), max(H0, H1)];
と求められる。
x_neg_pos == 1 && y_neg_pos == 0 の場合には、２進不連続区間であるデータ区間 [x.L, x.H] を分割することによって
[L2, H2] = C_Range(op, [x.L, - 1], [y.L, y,H]);
[L3, H3] = C_Range(op, [0, x.H], [y.L, y.H]);
Range(op, [x.L, x.H], [y.L, y.H]) = [min(L2, L3), max(H2, H3)];
と求められる。
x_neg_pos == 1 && y_neg_pos == 1 の場合には、データ区間 [x.L, x.H] 及び [y.L, y.H] を共に分割することによって
[L4, H4] = C_Range(op, [x.L, - 1], [y.L, - 1]);
[L5, H5] = C_Range(op, [x.L, - 1], [0, y.H]);
[L6, H6] = C_Range(op, [0, x.H], [y.L, - 1]);
[L7, H7] = C_Range(op, [0, x.H], [0, y.H]);
Range(op, [x.L, x.H], [y.L, y.H]) = [min(L4, L5, L6, L7), max(H4, H5, H6, H7)];
と求められる。
以上により、全ての場合について、論理演算における演算結果のデータ区間が決定される。
【０１３６】
（１．５）比較演算のデータ区間
２項演算 x op y が比較演算である場合、即ち演算子 op が { ==, !=, <, >, <=, >= } のいずれかである場合における演算結果のデータ区間は、 [0, 0], [1, 1], [0, 1] のいずれかとなる。比較演算の結果は、一般的な定数伝播によって定数 0 又は 1 になる場合がある。また、後述するように、データ区間判定によって定数に評価される場合がある。
比較演算の結果が定数でない場合には、演算結果のデータ区間は [0, 1] となる。即ち、
Range(op, [x.L, x.H], [y.L, y.H]) = [0, 1];
と決定される。
【０１３７】
以上、（１．１）〜（１．５）により、２項演算における演算結果のデータ区間が決定される。
【０１３８】
（２）単項演算のデータ区間
次に、単項演算における演算結果のデータ区間を決定する処理について説明する。
u = op x の形式の単項演算における演算結果のデータ区間を
[u.L, u.H] = Range(op, [x.L, x.H])
と表記する。ここでは、演算子 op がＣ言語の単項演算子のうち { !, ~, -, + } のいずれかである単項演算に対する処理について説明する。
単項演算における演算結果のデータ区間は、演算子 op と演算対象データ x のデータ区間 [x.L, x.H] とから、次のように決定される。
Range(!, [x.L, x.H]) = [0, 1];（論理否定）
Range(~, [x.L, x.H]) = [~x.H, ~x.L];（ビット反転）
Range(-, [x.L, x.H]) = [-x.H, -x.L];（マイナス演算）
Range(+, [x.L, x.H]) = [x.L, x.H];（プラス演算）
【０１３９】
（３）選択演算のデータ区間
最後に、 s = t ? x : y の形式の選択演算（３項演算）における演算結果のデータ区間を決定する処理について説明する。選択演算における演算結果のデータ区間は、条件式 t と被選択項 x 及び y との関係によって決定される。なお、条件式 t が定数値である場合には、後述するように、選択演算は冗長比較演算削除部３０２によって単純な代入式に簡単化さるため、ここで演算結果のデータ区間を考慮する必要はない。よって、以下では、条件式 t が定数値になることが明らかでない場合について説明する。
【０１４０】
（３．１）条件式 t が変数 w と定数の大小比較演算（ <, >, <=, >= ）である場合
w のデータ区間 [w.L, w.H] を条件式 t が偽となる区間と真となる区間とに分割し、それぞれの分割された区間について、被選択項 x 及び y に含まれる w のデータ区間がその分割された区間であるものとして被選択項 x 及び y のデータ区間を評価した上で、両者のデータ区間を統合することによって、最終的な演算結果のデータ区間を決定する。このとき、条件式 t の形式によって、次の（ア）〜（エ）のいずれかの処理を選択して、被選択項 x 及び y のデータ区間の評価を行う。なお、これらにおいて c は定数値を表すものとする。
（ア）条件式 t が w < c の形式の場合には、 w のデータ区間が [w.L, c - 1] であるものとして第２項 x のデータ区間を評価し、また、 w のデータ区間が [c, w.H] であるものとして第３項 y のデータ区間を評価する。
（イ）条件式 t が w >= c の形式の場合には、条件式 t は !(w < c) と表されるので、上記（ア）の場合とは逆に、 w のデータ区間が [c, w.H] であるものとして第２項 x のデータ区間を評価し、また、 w のデータ区間が [w.L, c - 1] であるものとして第３項 y のデータ区間を再評価する。
（ウ）条件式 t が w <= c の形式の場合には、 c' = c + 1 とおくと、条件式 t は w < c' と表されるので、この w < c' の形式に基づいて上記（ア）に従って x 及び y それぞれのデータ区間を評価する。
（エ）条件式 t が w > c の形式の場合には、 c' = c + 1 とおくと、条件式 t は w >= c' と表されるので、この w >= c' の形式に基づいて上記（イ）に従って x 及び y それぞれのデータ区間を評価する。
選択演算における演算結果のデータ区間は、上記（ア）〜（エ）によって評価された x 及び y のデータ区間を統合することによって決定される。即ち、上記（ア）〜（エ）によって評価された x のデータ区間を [x'.L, x'.H] 、及び y のデータ区間を [y'.L, y'.H] としたとき、最終的な演算結果のデータ区間は
[s.L, s.H] = [min(x'.L, y'.L), max(x'.H, y'.H)];
と決定される。
【０１４１】
条件式 t が変数 w と定数との大小比較演算である場合における選択演算データ区間の決定について、以下に具体例を用いて説明する。第１の例として、
s1 = (w > 127) ? 127 : w;
という式における演算結果のデータ区間 [s1.L, s1.H] を考える。この式においては、 w > 127 のときに第２項 127 が選択され、 w <= 127 のときに第３項 w が選択される。また、条件式 w > 127 が定数値でないことを仮定しているので、 w.L <= 127 && w.H > 127 が成立する。条件式 w > 127 は、定数値 c を用いて w > c の形式に表されるため、上記（エ）に該当する。従って、 w のデータ区間 [w.L, w.H] を [w.L, 127] と [128, w.H] とに分割し、前者を第３項 w に、後者を第２項 127 に、それぞれ適用する。その結果、第２項 127 のデータ区間は [127, 127] となり、第３項 w のデータ区間は [w.L, 127] となる。従って、演算結果のデータ区間は、これらの区間を統合することによって
[s1.L, s1.H] = [min(w.L, 127), 127] = [w.L, 127];
と決定される。
【０１４２】
第２の例として、
s2 = (w < 0) ? - w : w
という式における演算結果のデータ区間 [s2.L, s2.H] を考える。この式においては、 w < 0 のときに第２項 - w が選択され、 w >= 0 のときに第３項 w が選択される。また、条件式 w < 0 が定数値でないことを仮定しているので、 w.L < 0 && w.H >= 0 が成立する。条件式 w < 0 は、定数値 c を用いて w < c の形式に表されるため、上記（ア）に該当する。従って、 w のデータ区間 [w.L, w.H] を [w.L, - 1] と [0, w.H] とに分割し、前者を第２項 - w に、後者を第３項 w に、それぞれ適用する。その結果、第２項 - w のデータ区間は Range(-, [w.L,-1]) = [1, - w.L] となり、第３項 w のデータ区間は [0, w.H] となる。従って、演算結果のデータ区間は、これらの区間を統合することによって
[s2.L, s2.H] = [0, max(- w.L, w.H)]
と決定される。
【０１４３】
（３．２）条件式 t が変数 w と定数との大小比較演算でない場合
被選択項 x 及び y それぞれのデータ区間を単純に統合することによって、選択演算データ区間を決定する。即ち、
[s.L, s.H] = [min(x.L, y.L), max(x.H, y.H)];
とする。
【０１４４】
以上、（３．１）及び（３．２）により、選択演算における演算結果のデータ区間が決定される。なお、本実施形態においては、条件式 t が変数 w と定数との大小比較演算でない場合には一律に、被選択項のデータ区間を単純に統合するようにしたが、本発明の別の実施形態においては、条件式と被選択項との関係をさらに分析することによって、演算結果のデータ区間をより厳密に求めるようにしてもよい。又は、それとは逆に、さらに別の実施形態においては、例えば条件式を考慮せずに常に被選択項のデータ区間を単純に統合するなど、本実施形態よりさらに簡単なものとしてもよい。
【０１４５】
以上、（１）〜（３）に説明した処理によって、ビット幅判定部３０１は、演算回路の中間データ及び出力データのデータ区間を決定する。データのビット幅は、そのデータ区間内の任意の値を表現することが可能な最小のビット幅として定められる。
【０１４６】
なお、本発明の別の実施形態においては、データフロー最適化部３０がビット幅判定部３０１を含まないようにすることができる。この場合には、論理回路生成装置１は、演算回路の中間データ及び出力データのビット幅を、そのデータの型に即して定め、又は、論理回路生成装置１に入力されるプログラムＰのソフトウェア記述においてデータのビット幅が指定されているときには、その指定されたビット幅をそのまま用いるようにすることができる。
【０１４７】
各データのデータ区間が決定されることによって、比較演算の結果が定数値に評価されることが明らかになる場合がある。結果が定数値になる比較演算を、冗長比較演算と呼ぶ。冗長比較演算削除部３０２は、ビット幅判定部３０１が判定した各データのデータ区間に基づいて、冗長比較演算を判定して定数値に置き換え、定数伝播による最適化をさらに行う。
例えば、データ x の区間が [x.L, x.H] = [0, 63] であり、データ y の区間が [y.L, y.H] = [64, 200] である場合においては、式 x < y は必ず 1 に評価されるので、この場合には式 x < y を定数値 1 に置き換える。
別の例として、データ x の区間が [x.L, x.H] = [0, 63] である場合においては、式 x < 0 は必ず 0 に評価されるので、この場合には式 x < 0 を定数値 0 に置き換える。
【０１４８】
図２１を参照して、ビット幅判定部３０１によるデータ区間判定の処理、及び冗長比較演算削除部３０２の処理について、具体例を用いて説明する。なお、図示及び説明の便宜上、この例におけるプログラムはＣ言語によるソフトウェア記述として表現されているが、ビット判定部３０１及び冗長比較演算削除部３０２が処理する対象は、データフローグラフである。説明においては、ソフトウェア記述に対応するデータフローグラフが実際の処理の対象であるものとして理解されたい。
【０１４９】
この例において、関数 funcF は、変数 cc 及び dd に対するクリップ処理（具体的には、負値の場合に 0 にクリップする処理）と、変数 r に対するクリップ処理（具体的には、値が 255 を超える場合に 255 にクリップする処理）とを含む。関数 top6 は、配列 c[3] 及び d[3] の具体値を定義する。
【０１５０】
まず、ビット幅判定部３０１は、初期データ区間として、関数 top6 の入り口における配列 x[3] の各要素（ここでは便宜的に xi と表記する）のデータ区間を、その型に基づいて
[xi,L, xi.H] = [0, 255]
と設定する。
【０１５１】
関数 funcF の最初の式、即ち
c = x[0] * c[0] + x[1] * c[1] + x[2] * c[2];
は、複数の演算を含み、細分化すると
tmp0 = x[0] * c[0];
tmp1 = x[1] * c[1];
tmp2 = x[2] * c[2];
tmp3 = tmp0 + tmp1;
cc = tmp3 + tmp2;
と表現される。ビット幅判定部３０１は、これらの式に対して、配列 c[3] = {-1, 2, -1} の各要素を定数伝播させたときの各データのデータ区間を、上述した処理に従って、
[tmp0.L, tmp0.H] = [-255, 0]
[tmp1.L, tmp1.H] = [0, 510]
[tmp2.L, tmp2.H] = [-255, 0]
[tmp3.L, tmp3.H] = [-255, 510]
[cc.L, cc.H] = [-510, 510]
と判定する。
【０１５２】
同様に、関数 funcF の２つ目の式、即ち
dd = x[0] * d[0] + x[1] * d[1] + x[2] * d[2];
についても、細分化すると
tmp4 = x[0] * d[0];
tmp5 = x[1] * d[1];
tmp6 = x[2] * d[2];
tmp7 = tmp4 + tmp5;
dd = tmp7 + tmp6;
と表現される。ビット幅判定部３０１は、配列 d[3] = {1, 2, 1} の各要素を定数伝播させたときの各データのデータ区間を
[tmp4.L, tmp4.H] = [0, 255]
[tmp5.L, tmp5.H] = [0, 510]
[tmp6.L, tmp6.H] = [0, 255]
[tmp7.L, tmp7.H] = [0, 765]
[dd.L, dd.H] = [0, 1020]
と判定する。
【０１５３】
変数 cc のデータ区間は、上記の通り [cc.L, cc.H] = [-510, 510] であるため、関数 funcF の３つ目の式、即ち
cc_clip = (cc < 0) ? 0 : cc;
の選択演算における条件式 cc < 0 は、冗長比較演算ではない。そこで、ビット幅判定部３０１は、選択演算における演算結果のデータ区間を、上述のビット幅判定部３０１の処理（３．１）（ア）に従って、
[cc_clip.L, cc_clip.H] = [0, 510] 
と判定する。
【０１５４】
一方、変数 dd のデータ区間は、上記の通り [dd.L, dd.H] = [0, 1020] であるため、関数 funcF の４つ目の式、即ち
dd_clip = (dd < 0) ? 0 : dd;
の選択演算における条件式 dd < 0 は、必ず 0 に評価される冗長比較演算である。従って、冗長比較演算削除部３０２は、この式を
dd_clip = dd;
と簡単化する。その結果、ビット幅判定部３０１は、演算結果のデータ区間を
[dd_clip.L, dd_clip.H] = [dd.L, dd.H] = [0, 1020]
と判定する。
【０１５５】
以下同様に、ビット幅判定部３０１は、
r = (cc_clip + dd_clip) >> 2;
のデータ区間を
[r.L, r.H] = [0, 382]
と判定し、
r_clip = (r > 255) ? 255 : r;
のデータ区間を
[r_clip.L, r_clip.H] = [0, 255]
と判定する。以上により、関数 funcF の全ての中間データ及び出力データのデータ区間が判定され、従って、ビット幅が定められる。
【０１５６】
以上に説明されたように、冗長比較演算削除部３０２は、冗長比較演算を除去することによってデータフローグラフを最適化する。なお、本発明の別の実施形態においては、データフローグラフ最適化部３０は、冗長比較演算削除部３０２を含まないようにすることができる。その場合には、データフローグラフＦｄｆｇにおける比較演算が最適化されないことになるため、論理回路生成装置１が最終的に出力する論理回路が本実施例と比べて冗長なものとなることがあるが、本発明の目的が達成されることに変わりはない。
【０１５７】
演算分解部３０３は、データフローグラフＦｄｆｇを最適化するための追加の処理として、複雑な算術演算を論理合成し易い単純な算術演算に変換する処理を行う。具体的には、次に説明するように、（１）定数乗算の加算・シフト分解、及び（２）除算のシフト・試行減算分解を行う。
【０１５８】
（１）定数乗算分解
データフローグラフＦｄｆｇに含まれる演算のうち、一方の演算対象（即ち、被乗数又は乗数）が定数である乗算について、演算分解部３０３は、その乗算を、定数のビット列において 1 であるそれぞれのビット位置にもう一方の演算対象をシフトしてそれらを積算する一連の演算に置き換える。この処理を定数乗算分解という。例えば、式 x * 5 は、定数である乗数 5 をビット表現すると 101 であるので、 x を 2 ビット左シフトした値と x との和に置き換えられる。これを式で表現すれば、 (x << 2) + x となる。
【０１５９】
（２）除算分解
演算分解部３０３は、除算を、いわゆる筆算方式によって、シフトと試行減算とに分解する。この処理を除算分解という。２進数における筆算は、１０進数における一般的な筆算と同様であるが、減算の各回において求められる商のビットの値は 0 又は 1 であり、それに対応して、減数の値は 0 又は除数の値である。そこで、減算の各回において、被減数が除数以上である場合には、商のビットの値を 1 、減数の値を除数の値とし、そうでない場合には、商のビットを 0 、減数の値を 0 とする。この比較と減算とからなる処理は、試行減算として知られる。被減数が除数以上であるか否かは、実際に除数による減算を行った結果の符号によって判定してもよい。
【０１６０】
図２２を参照して、８ビット符号無しデータ a, b, c, d における a = c / d 及び b = c % d の演算の分解を説明する。図の上段は、具体例として 254 を 21 で除したときの商 12 及び余り 2 を求める筆算を、２進数及び１０進数でそれぞれ表現したものである。２進数の筆算の図において、例えば、 n3 の値 000001111 は除数 00010101 以上でないため、これに対応する商のビット g3 の値は 0 となり、減数も 0 となる。一方、 n4 の値 000011111 は除数以上であるため、これに対応する商のビット g4 の値は 1 となり、減数は 00010101 となる。図の下段は、筆算の工程をＣ言語による一連の式として表現したものである。即ち、一般に、８ビット符号無しデータ a, b, c, d における a = c / d 及び b = c % d の演算は、この一連の式に分解される。より一般には、試行減算の回数はデータ c のビット幅に依存するが、上述のビット幅判定部３０１によって判定されたデータ c のビット幅がここで用いられる。
【０１６１】
なお、本発明の別の実施形態においては、演算分解部３０３は、上記（１）及び（２）以外にも、ソフトウェア又は処理装の分野において一般に知られる、演算に対する他の最適化処理を行うようにすることができる。また、本発明のさらに別の実施形態においては、データフローグラフ最適化部３０は、演算分解部３０３を含まないようにすることができる。その場合には、データフローグラフＦｄｆｇに含まれる演算について上記の最適化がされないことになるため、論理回路生成装置１が最終的に出力する論理回路が本実施例と比べて冗長なものとなることがあるが、本発明の目的が達成されることに変わりはない。
【０１６２】
冗長演算削除部３０４は、データフローグラフＦｄｆｇを最適化するための追加の処理として、定数伝播、共通部分式削除、及びデッドコード削除の処理を行う。定数伝播とは、演算結果が定数値になる式をその定数値に置き換える（即ち、定数を伝播させる）処理である。また、単純に１つの変数で表される式をその変数に置き換える処理も併せて行う。共通部分式削除とは、同じ値に評価されることが明らかである複数の式を一つの式にまとめる処理である。デッドコード削除（dead code elimination）とは、参照されない変数を削除する処理である。
【０１６３】
図２３及び図２４を参照して、演算分解部３０３による定数乗算分解、並びに冗長演算削除部３０４による定数伝播及び共通部分式除去について、具体例を用いて説明する。図２３において、（ａ）は、最上位関数として関数 top5 を含むプログラムＰのソフトウェア記述であり、（ｂ）は非循環・非階層変換部２１によってインライン展開されて非循環型最下層関数となった関数 top5 である。図２４において、（ａ）は、インライン展開された関数 top5 のデータフローグラフである。
【０１６４】
図２４において、（ｂ）は、（ａ）に定数伝播が適用された結果のデータフローグラフである。具体的には、変数 b0 が定数値 3 に、変数 b1 が定数値 7 に、それぞれ置き換えられる。また、単純に変数 c で表される変数 a0 及び a1 が変数 c に置き換えられる。（ｃ）は（ｂ）に定数乗算分解が適用された結果のデータフローグラフである。具体的には、式 c * 3 は式 (c << 1) + c に分解され、式 c * 7 は式 (c << 2) + (c << 1) + c に分解される。これらの分解結果の式について、部分式（例えば、 c << 1 ）に対応する中間変数（例えば、 tmp0 ）を導入し、部分式をノードとして表現することによって、（ｃ）のデータフローグラフが得られる。（ｄ）は、（ｃ）に共通部分式削除が適用された結果のデータフローグラフである。具体的には、変数 tmp0 及び tmp1 は共に式 c << 1 の演算結果であるため、 tmp1 への参照を tmp0 への参照に置き換えることによって、共通の式 c << 1 を１つにまとめる。（ｅ）は、（ｄ）に共通部分式削除がさらに適用された結果のデータフローグラフである。（ｆ）は、（ｅ）にデッドコード削除が適用された結果のデータフローグラフである。具体的には、他のノードから参照されない tmp1 及び tmp3 のノードがデータフローグラフから削除される。
【０１６５】
以上に説明されたように、冗長演算削除部３０４は、データフローグラフＦｄｆｇを最適化するための追加の処理として、定数伝播、共通部分式削除、及びデッドコード削除の処理を行う。なお、本発明の別の実施形態においては、データフローグラフ最適化部３０は、冗長演算削除部３０４を含まないように構成することができる。
【０１６６】
［演算器の回路遅延・回路面積評価部３１］
データフローグラフ最適化部３０によって最適化されたデータフローグラフＦｄｆｇは、次いで、演算器の回路遅延・回路面積評価部３１に入力される。演算器の回路遅延・回路面積評価部３１は、上述のビット幅判定部３０１によって定められた各演算命令の入出力ビット幅と、各演算の種類とから、対応する演算器の回路遅延（即ち、信号伝播遅延時間）及び回路面積を見積る。演算器の回路遅延を見積ることによって、論理回路生成装置１によって最終的に生成される論理回路の動作速度（即ち、最大動作クロック周波数）を見積ることが可能となる。また、演算器の回路面積をある程度の精度で予測することによって、より省面積の論理回路を得るため、或いはより高速動作の論理回路を得るために、論理回路生成装置１に入力されるプログラムＰのソフトウェア記述に対するチューニング作業を高効率化することが可能となる。本実施形態においては、後述するように、ここで評価された演算器の回路遅延は、パイプライン回路としての論理回路の動作クロック周波数を最大化させるための処理においても用いられる。
【０１６７】
演算器の回路遅延の算出方法については、様々なアプローチが可能である。回路遅延を高精度に算出するためには、ＲＴＬ記述から特定の半導体プロセス用の回路ライブラリを用いた回路合成を行うツールである論理合成ツールを各演算器に直接適用する方法や、予め幾つかのビット幅で論理合成した結果を保存しておき、実際のビット幅での回路遅延を幾つかの論理合成結果から予測する方法などがある。本実施形態においては、演算器の回路遅延・回路面積評価部３１は、以下に説明する簡潔な演算器の遅延モデル及び面積モデルに基づいて、演算器の回路遅延及び回路面積を見積る。これらのモデルによれば、論理合成ツールなどの外部ツールの支援なしに、ある程度の精度で回路遅延及び回路面積を見積ることが可能である。
【０１６８】
図２５に示されるように、同期型の論理回路において、論理回路の最大動作クロック周波数は、論理回路の出力信号の最大信号伝播時間によって決定される。論理回路全体の入力信号及びクロックの立上り（即ち、０から１への遷移）の瞬間に変化する各レジスタ出力信号を信号伝播の発生源としたときに、最大信号伝播時間は、これらの発生源の信号からその他の信号までの信号伝播に要する時間のうち最大のものである。
【０１６９】
信号伝播の遅延要因は、論理回路を構成する各論理ゲートにおける入力信号が変化してから出力信号が変化するまでの回路遅延にある。本実施形態においては、これら回路遅延が演算器単位でモデル化される。同様に、回路面積も演算器単位でモデル化される。複雑な演算器は、より簡単な演算器を用いて階層的に表現されるが、これに対応して、演算器の遅延モデル及び面積モデルも階層的に表現される。これにより、ソフトウェア記述上表現可能な全ての演算器に遅延モデル及び面積モデルを対応させることが可能であるため、外部の論理合成ツールに依存する必要がない。
【０１７０】
演算器の回路遅延モデルにおいては、各信号の伝播時間は、信号のＭＳＢ（最上位ビット）及びＬＳＢ（最下位ビット）の２点のみで表現される。これにより、信号の各ビットで個別に伝播時間を計算するよりも遥かに高速に計算される。また、ＭＳＢとＬＳＢとの間の信号伝播の時間差が表現されるため、算術演算器（加算・減算・乗算等）に含まれるキャリー伝播構造に対応し、高精度に回路遅延が計算される。
【０１７１】
以下の説明において、信号 S のＬＳＢ伝播時間を S.TL 、ＭＳＢ伝播時間を S.TM とそれぞれ表記する。信号伝播の発生源となる信号（即ち、論理回路全体の入力信号及びレジスタ出力信号） SI の伝播時間は、 SI.TL = SI.TM = 0 となる。また、図２６に示されるように、演算器のポート i の入力信号を S(i) と表記し、入力ポート i を経由した出力信号を SO'(i) と表記する。従って、例えば、入力ポート i のＬＳＢ伝播時間は S(i).TL と表記される。ここで、図２６にさらに示されるように、演算器の各入力ポートと出力ポートとの間の信号伝播遅延を表現するために、次の４つの表記を導入する。
【０１７２】
L(i)（単純伝播遅延）は、入力ポート i のＬＳＢから出力ポートのＬＳＢへの伝播遅延（ＬＳＢ伝播遅延）、又は入力ポート i のＭＳＢから出力ポートのＭＳＢへの伝播遅延（ＭＳＢ伝播遅延）を示す。ここで、ＬＳＢ伝播遅延とＭＳＢ伝播遅延とは同じであるという単純なモデルを想定している。
【０１７３】
C(i)（キャリー伝播遅延）は、入力ポート i のＬＳＢから出力ポートのＭＳＢへの信号伝播遅延時間を示す。これは、主に、加算器のキャリー遅延を表現するために用いられる。キャリー伝播遅延が考慮される（即ち C(i) が 0 でない）演算器としては、加算器、減算器（単項マイナス演算を含む）、乗算器、及び大小比較器が挙げられる。
【０１７４】
F(i)（入力遅延同期フラグ）は、入力のＬＳＢ及びＭＳＢそれぞれの信号伝播時間が同期される（即ち、伝播時間が遅い方に揃えられる）か否かを示し、信号が同期されない場合を F(i) = 0 、信号が同期される場合を F(i) = 1 で表すものとする。具体的には、同値比較器及び論理否定器は、入力の全ビットが到着してから出力が確定するため、全ての入力ポート i について F(i) = 1 とする。また、シフト演算器は、シフト量を指定する第２入力ポートの入力の全ビットが到着してから出力が確定するため、 F(2) = 1 とする。なお、このモデルにおいては、後述するように、１つの信号のＬＳＢ伝播時間がＭＳＢ伝播時間よりも遅くなることはないため、信号が同期される場合には、ＬＳＢ伝播時間がＭＳＢ伝播時間に揃えられることとなる。
【０１７５】
TL(i) は、図示されないが、 F(i) によって選択的に行われる信号の同期を考慮した結果の入力信号のＬＳＢ伝播時間を表す。即ち、 F(i) == 0 のときには、信号の同期が行われないため、 TL(i) は S(i).TL である。一方、 F(i) == 1 のときには、信号の同期が行われ、ＬＳＢ伝播時間はＭＳＢ伝播時間に揃えられるため、 TL(i) は S(i).TM である。これを式によって表現すると
TL(i) = (F(i) == 1) ? S(i).TM : S(i).TL
となる。
【０１７６】
図２６にさらに示されるように、出力信号のＬＳＢ伝播時間 SO'(i).TL は、信号の同期を考慮した入力信号のＬＳＢ伝播時間 TL(i) に演算器の単純伝播遅延 L(i) を加えたものとする。これを式によって表現すると
SO'(i).TL = TL(i) + L(i)
となる。
【０１７７】
また、出力信号のＭＳＢ伝播時間 SO'(i).TM は、入力信号のＬＳＢ伝播時間 TL(i) に演算器のキャリー伝搬遅延 C(i) を加えたものと、入力信号のＭＳＢ伝播時間 TM(i) に演算器の単純伝播遅延 L(i) を加えたものとのうち、いずれか大きいほうとする。これを式によって表現すると
SO'(i).TM = max(S(i).TM + L(i), TL(i) + C(i))
となる。
【０１７８】
これらの式から、各演算器の各ポートの入力信号のＬＳＢ伝播時間がＭＳＢ伝播時間より遅くなることがなければ、出力信号のＬＳＢ伝播時間がＭＳＢ伝播時間より遅くなることがないことがわかる。よって、論理回路全体において、１つの信号のＬＳＢ伝播時間がＭＳＢ伝播時間より遅くなることはない。
【０１７９】
図２７に示されるように、最終的な演算器の出力信号 SO のＭＳＢ伝播時間 SO.TM は、演算器の全ての入力ポート i について、入力ポート i を経由した出力信号のＭＳＢ伝播時間 SO'(i).TM のうち最も遅いものとして求められる。ＬＳＢ伝播時間 SO.TLも同様に、演算器の全ての入力ポート i について、入力ポート i を経由した出力信号のＬＳＢ伝播時間 SO'(i).TL のうち最も遅いものとして求められる。但し、演算器の出力信号の幅が１ビットの場合には、ＬＳＢとＭＳＢとは同一のビットであるため、ＭＳＢ伝播時間 SO.TM として求めた値を、ＬＳＢ伝播時間 SO.TL としても採用する。
【０１８０】
ここで、 B（出力遅延同期フラグ）は、演算器の出力信号の幅が１ビットであるか否かを表すものとし、１ビット出力の場合に B = 1 、その他の場合に B = 0 とする。これを用いて、最終的な演算器の出力信号 SO のＭＳＢ伝播時間 SO.TM 及びＬＳＢ伝播時間 SO.TL を式によって表現すると
SO.TM = max{ SO'(i).TM | i ∈ I }
SO.TL = (B == 1) ? SO.TM : max{ SO'(i).TL | i ∈ I }
となる。これらの式において、 I は、演算器の全ての入力ポート i の集合を表す。
【０１８１】
以上に説明した演算器の回路遅延モデル及び面積モデルについて、以下では、演算器の種類ごとに、より具体的に説明する。そのために、まず、基本論理ゲートの回路遅延及び回路面積を、想定する実装技術（半導体プロセス、ＦＰＧＡ：Field Programmable Gate Array）に対応して適切にモデル化する。ここでモデル化の対象とされる基本ゲートは、論理積（AND）、論理和（OR）、論理否定（NOT）、排他的論理和（XOR）及び２入力１出力マルチプレクサ（MUX）である。２入力１出力マルチプレクサの回路図及び動作を図２８に示す。これら以外にも、例えば NAND 又は NOR など、他の基本ゲートを追加しても良い。これらの各基本論理ゲート G の回路遅延モデルを G.delay と表記し、回路面積モデルを G.area と表記することにする（例えば、論理積ゲートの回路遅延は AND.delay と表記される）。
【０１８２】
次に、基本論理ゲートを組合せた複合ゲートのモデルについて説明する。代表的な複合ゲートとして、１ビット全加算器（FA）、１ビット半加算器（HA）、及び Booth recoder 器（BR）を考える。なお、説明においては、それぞれ回路構造を想定して回路遅延及び回路面積を計算しているが、使用する回路ライブラリから厳密に計算してもよい。
【０１８３】
１ビット全加算器（FA）は、 a, b, c の３ビットを入力し、 sum 及び carry の各ビットを出力する。入力と出力との関係は、
sum = a ^ b ^ c;
carry = (a & b) | (b & c) | (a & c);
と表現される。これらの式の演算を直接実現した回路構造を想定すると、 sum の出力遅延 FA.s_delay 、 carry の出力遅延 FA.c_delay 、及び回路面積 FA.area は、次のように表現される。
FA.s_delay = 2 * XOR.delay;
FA.c_delay = AND.delay + OR.delay;（キャリー伝播遅延）
FA.c_area = 3 * AND.area + 2 * OR.area;（キャリー出力回路面積）
FA.area = 2 * XOR.area + FA.c_area;
【０１８４】
１ビット半加算器（HA）は、 a, b の２ビットを入力し、 sum 及び carry の各ビットを出力する。入力と出力との関係は、
sum = a ^ b;
carry = a & b;
と表現される。これらの式の演算を直接実現した回路構造を想定すると、 sum の出力遅延を HA.s_delay 、carry の出力遅延 HA.c_delay 、及び回路面積 HA.area は、次のように表現される。
HA.s_delay = XOR.delay;
HA.c_delay = AND.delay;（キャリー伝播遅延）
HA.c_area = AND.area;（キャリー出力回路面積）
HA.area = XOR.area + HA.c_area;
【０１８５】
Booth recoder器（BR）は、乗算器で使用され、入力ポート 1 の連続する３ビットをデコードして、入力ポート 0 のデータの 2 倍、 1 倍、 0 倍、 -1 倍、 -2 倍を出力する回路である。図２９に示されるように、入力ポート 0 の 1 倍及び 2 倍から成る２ビットの入力（x0, x1）に対して２つの XOR ゲートで -1 倍及び -2 倍を作り、これらを２入力１出力マルチプレクサで選択し、 0 倍を作る AND ゲートで実現することによって出力の各ビットを得る回路構造を想定する。図における sel 、 neg 及び nz の各信号は、それぞれ
sel = yi ^ yi-1;
neg = yi+1;
nz = ~ ( yi+1 & yi & yi-1 ) & (yi+1 | yi | yi-1 );
と表現される。これらの式に直接従って、これらの信号を出力するデコーダ回路の回路構造を想定する。出力遅延 BR.delay 及び回路面積 BR.area は、次のように表現される。ここで、 bw_0 は、入力ポート 0 のビット幅を表す。
BR.delay = XOR.delay + MUX.delay + AND.delay;
BR.dec_area = XOR.area + AND.area * 3 + OR.area * 2 + NOT.area; （デコーダ回路の面積）
BR.area(bw_0) = (XOR.area * 2 + MUX.area + AND.area) * bw_0 + BR.dec_area;
【０１８６】
以上説明した基本論理ゲート及び複合ゲートのモデルを利用して、各演算器の回路遅延モデル及び回路面積モデルを見積る処理について、以下に説明する。なお、説明においては、それぞれ回路構造を想定して回路遅延及び回路面積を見積っているが、別の回路構造を想定した場合には結果が異なることがある。
【０１８７】
説明において、演算器 X の回路面積を X.AREA と表記する。
また、入出力信号に関するパラメータを、次のように表記する。
bw_in(i) は、入力ポート i の入力信号のビット幅を表す。
bw は、出力信号のビット幅を表す。
bw_max は、全ての入力ポートについての入力信号のビット幅の最大値を表す。
bw_min は、全ての入力ポートについての入力信号のビット幅の最小値を表す。
bw_dif は、入力信号のビット幅の最大値と最小値との差を表す。
これらの関係を式で表現すると、
bw_max = max{bw_in(i) | i ∈ I }
bw_min = min{bw_in(i) | i ∈ I }
bw_dif = bw_max - bw_min
となる。これらの式において、 I は、演算器の全ての入力ポート i の集合を表す。
【０１８８】
加算器（ADD）は、出力のうち bw_min ビットを全加算器（FA）で実現し、残りの bw_dif ビットを半加算器（HA）で実現する回路構造を想定する。この回路構造における加算器の回路遅延及び回路面積は次の通りとなる。式において、入力ポートを表す i は 0 又は 1 である。
ADD.L(i) = FA.s_delay （FA の sum 出力遅延１個分）
ADD.C(i) = FA.c_delay * bw_min + HA.c_delay * bw_dif （FA の carry 出力遅延 bw_min 個分と HA のキャリー出力遅延 bw_dif 個分）
ADD.F(i) = 0
ADD.AREA = FA.area * bw_min + HA.area * bw_dif
【０１８９】
減算器（SUB）は、加算器において入力ポート 1 の前に NOT ゲートを付加する回路構造を想定する。この回路構造における減算器の回路遅延及び回路面積は次の通りとなる。式において、入力ポートを表す i は 0 又は 1 である。
SUB.L(i) = FA.s_delay + NOT.delay
SUB.C(i) = FA.c_delay * bw_min + HA.c_delay * bw_dif + NOT.delay
SUB.F(i) = 0
SUB.AREA = FA.area * bw_min + HA.area * bw_dif + NOT.area * bw_in(1)
【０１９０】
乗算器（MUL）は、ここでは Booth recoder 器の ceil(bw_1 / 2) 個の出力を加算する回路構造を想定する。この回路構造における乗算器の回路遅延及び回路面積は次の通りとなる。式において、入力ポートを表す i は 0 又は 1 である。
booth_count = ceil(bw_in(1) / 2)  （Booth recoder 器の個数）
MUL.L(i) = BR.delay + booth_count * FA.s_delay  （Booth recoder 器の出力遅延１個分と FA の sum 出力遅延 booth_count 個分）
MUL.C(i) = MUL.L(i) + bw_in(0) * FA.c_delay  （乗算器の出力遅延と bw_in(0) ビット分の FA キャリー伝播遅延）
MUL.F(i) = 0
MUL.AREA = booth_count * BR.area(bw_in(0)) + booth_count * (bw_in(0) + 1) * FA.area  （ビット幅 bw_in(0) の Booth recoder 器と出力加算用全加算器の回路面積の合計）
【０１９１】
選択演算器（SEL）は、１ビットの選択入力に基づいて、２つの被選択入力のうち１つを出力する。ここでは、出力信号のビット幅の数のマルチプレクサを用いた回路構造を想定する。この回路構造における選択演算器の回路遅延及び回路面積は次の通りとなる。式において、入力ポートを表す i は 0 又は 1 である。
SEL.L(i) = MUX.delay
SEL.C(i) = 0
SEL.F(i) = 0
SEL.AREA = MUX.area * bw
なお、２つの入力ポートのビット幅が異なる場合には、 bw_min 及び bw_dif を用いてさらに厳密に算出することもできる。
【０１９２】
大小比較器（CMP）は、２つの入力ポートの減算を行い、演算結果の符号ビットから計算された結果を出力する回路を想定する。減算結果の出力は必要ないので、その分、減算器の回路面積よりも小さくなる。また、出力ビット幅が１なので、出力遅延同期フラグ（B）が 1 となる。この回路構造における大小比較器の回路遅延及び回路面積は次の通りとなる。式において、入力ポートを表す i は 0 又は 1 である。
CMP.L(i) = FA.c_delay
CMP.C(i) = FA.c_delay * bw_min + HA.c_delay * bw_dif + NOT.delay
CMP.F(i) = 0
CMP.AREA = FA.c_area * bw_min + HA.c_area * bw_dif + NOT.area * bw_in(1)
【０１９３】
同値比較否定器（NEQ）は、２つの入力ポートの各ビットがすべて同値である場合に 0 を出力し、そうでない場合に 1 を出力する。回路構造としては、図３０に示されるように、２入力のビット毎の XOR 演算出力を、２分木構造を用いて OR で結合したものを想定する。また、出力のビット幅が１なので、出力遅延同期フラグ（B）が 1 となるが、入力ポート側で遅延同期しているため、出力ポート信号のＬＳＢ伝播時間とＭＳＢ伝播時間とは自動的に同一になる。この回路構成における同値比較否定器の回路遅延及び回路面積は次の通りとなる。式において、入力ポートを表す i は 0 又は 1 である。
NEQ.L(i) = XOR.delay + ceil(log2(bw)) * OR.delay
NEQ.C(i) = 0
NEQ.F(i) = 1  （入力遅延同期）
NEQ.AREA = bw * XOR.area + (bw - 1) * OR.area
【０１９４】
シフト演算器（SHF）は、ポート 1 で指定された値をシフト量として、ポート 0 のデータの右シフト又は左シフトを出力する。回路構造としては、バレルシフタを想定する。バレルシフタは、ポート 1 のシフト量の２進表現において２のべき乗ビットのシフトを行う回路を直列接続して構成される。例えば、Z = X >> Y （X, Y, Z：符号なし32ビット）は、図３１に示されるような回路構造になる。ここでは、 Y の下位５ビットだけがシフト量を示すものとする。この回路構成におけるシフト演算器の回路遅延及び回路面積は次の通りとなる。式において、入力ポートを表す i は 0 又は 1 である。
bw_1' = min(bw_in(1), ceil(log2(bw_in(0)))  （ポート 1 のビット幅を最大 log2(bw_in(0)) ビットとして算出する）
SHF.L(i) = bw_1' * MUX.delay
SHF.C(i) = 0
SHF.F(0) = 0, SHF.F(1) = 1  （入力ポート 1 を遅延同期する）
SHF.AREA = bw_in(0) * bw_1' * MUX.area
【０１９５】
論理回路生成装置１は、演算器の回路遅延・回路規模評価部３１が算出した回路遅延及び回路規模の見積を、例えば、出力装置１７に出力することができる。また、別の実施形態においては、論理回路生成装置１は、演算器の回路遅延・回路規模評価部３１を含まないようにすることができる。この場合には、論理回路生成装置１は、回路遅延及び回路規模の見積を算出しないが、かかる見積は生成される論理回路を直接構成する情報ではないため、本発明の目的が達成されることに変わりはない。
【０１９６】
［パイプライン境界配置部３２］
演算器の回路遅延・回路規模評価部３１によって演算器の回路遅延及び回路規模が評価されたデータフローグラフＦｄｆｇは、次いで、パイプライン境界配置部３２に入力される。パイプライン境界配置部３２は、データフローグラフＦｄｆｇから、パイプライン回路を合成し、パイプライン回路データＦｐｌｃを出力する。パイプライン回路は、繰り返し実行される演算処理がパイプラインステージという処理単位に分割され、これら処理単位を実行する回路ブロックを直列接続させた構造を持つ。本明細書において、パイプラインステージのことを「パイプ段」とも呼ぶこととする。
【０１９７】
データフローグラフに変換されたプログラムは、そのまま論理回路の回路構造と対応している。即ち、データフローグラフの演算命令が回路上の演算器と対応し、データフローグラフの有向枝が回路上の配線（又は信号）と対応する。従って、パイプライン回路を合成することは、データフローグラフをパイプ段に分割すること、即ち、データフローグラフの各命令ノードへパイプ段割当を行うことと等価である。隣接する２つのパイプ段の間のパイプライン境界を交差するデータフロー有向枝にレジスタを挿入することにより、レジスタに入力された値は、１クロックの遅延時間の後にレジスタ出力で参照可能となる。
【０１９８】
そこで、パイプライン境界配置部３２は、まず、データフローグラフＦｄｆｇをパイプライン構造に分割する際の制約を抽出する処理を行い、次いで、データフローグラフＦｄｆｇの各命令ノードへパイプ段を割当てる処理を行う。より具体的には、パイプライン境界配置部３２は、パイプライン制約抽出部３２１と、パイプライン段数決定部３２２と、パイプライン回路合成部３２３とを含む。
【０１９９】
パイプライン制約抽出部３２１は、後述のパイプライン回路合成部３２３における処理の準備として、データフローグラフＦｄｆｇをパイプ段に分割する際の制約を抽出する処理を行う。
【０２００】
レジスタ属性は、変数への代入（書込み）と変数の参照（読出し）との間に１クロックの遅延時間が発生するレジスタに、変数の値を保存することを指定する。メモリ属性を持つ配列変数の読出しタイミングも、通常使われる同期型メモリの場合には、同様に１クロックの遅延時間が発生する。パイプライン回路構造を合成する際には、各変数の参照可能タイミングを正確に評価する必要がある。順序回路の状態変数を表現する変数は、クロックの前後にわたって値を保持する必要があるため、レジスタ属性を持つことが必要である。本実施形態においては、論理回路生成装置１に入力されるプログラムＰにおいて、順序回路の状態変数を表現する変数に対してレジスタ属性が明示されることを必須とし、レジスタ属性記述が省略された場合には回路合成不可とする。別の実施形態においては、順序回路の状態変数を表現する変数に対してレジスタ属性記述が省略された場合でも、自動的にレジスタ属性を付加するようにすることができる。いずれの実施形態においても、この処理の以降の段階では、順序回路の状態変数にはレジスタ属性が付加されている。
【０２０１】
１クロック遅延を伴うレジスタ変数への参照命令は、次の２つに分類される。１つは、代入後参照命令である。これは、代入命令が実行された以降の同変数への参照命令である。もう１つは、代入前参照命令である。これは、代入命令が実行される以前の同変数への参照命令である。
【０２０２】
パイプライン制約抽出部３２１は、まず、これらの参照命令をパイプ段に割当てる。このとき、代入後参照命令は、代入命令が含まれるパイプ段より１つ後方のパイプ段に割当てる。即ち、代入命令と代入後参照命令との間にパイプライン境界を挟む。これによって、代入後参照命令におけるレジスタ変数の参照タイミングは、代入タイミングより１クロック遅れることになり、代入命令によって変数に代入されたデータを読出すことになる。一方、代入前参照命令は、代入命令と同じパイプ段に割当てる。これによって、代入前参照命令は、代入命令実行前のデータを読出すことになる。
【０２０３】
図３２及び図３３を参照して、参照命令をパイプ段に割当てる処理について、具体例を用いて説明する。図３２は、レジスタ変数の代入前参照命令及び代入後参照命令を含むプログラムの例を示す。図３３は、図３２のプログラムから生成されるパイプライン回路におけるパイプライン配置を示す。この例において、パイプライン制約抽出部３２１は、変数 stt に対する代入前参照命令（○１）、代入命令（○３）、及びデータフローグラフＦｄｆｇの（○１）→（○３）の経路上にある命令（○２）を、同じパイプ段に割当てる。
【０２０４】
次いで、パイプライン制約抽出部３２１は、レジスタ変数更新命令ノード群グループ化処理を行う。前述の通り、レジスタ変数の代入前参照命令は、代入命令と同じパイプ段に割当てることによって、代入命令実行前のデータ即ち１クロック前のデータを読出すようになるが、これよりも前方のパイプ段に割当てることは出来ない。なぜならば、代入命令のパイプ段よりも前方のパイプ段に割当てた場合には、読出される参照データは２クロック以上前の代入データになり、プログラムが意図する動作（即ち、１クロック前の代入データを参照する動作）の回路が実現しないからである。また、各代入前参照命令から代入命令までのデータフローグラフ経路上にあるすべての命令（図３３において、（○１）→（○２）→（○３）の経路がこれに当たる。）についても、同じパイプ段に割当てる必要がある。そこで、パイプライン制約抽出部３２１は、次に説明する処理によって、データフローグラフＦｄｆｇを、これらの命令が同一のパイプ段に割当たることが保証される構造に変換する。
【０２０５】
レジスタ変数への代入前参照命令ノードから同変数への代入命令ノードまでのデータフローグラフ経路上のすべての命令ノード群を、レジスタ変数更新命令ノード群と呼ぶ。ただし、代入命令ノードへのデータフローグラフ経路が存在しない代入前参照命令ノードについては、この代入前参照命令ノードだけをレジスタ変数更新命令ノード群に含める。パイプライン制約抽出部３２１は、レジスタ変数更新命令ノード群を、一つの命令ノードに縮退したレジスタ変数更新縮退命令ノードに置き換えるデータフローグラフ変換処理を行う。より具体的には、レジスタ変数更新命令ノード群に含まれる命令ノード同士を結ぶ全ての有向枝を取り除く。そして、レジスタ変数更新命令ノード群に含まれる命令ノードと外部の命令ノードとを結ぶ有向枝を、レジスタ変数更新縮退命令ノードに繋ぎ直す。なお、このデータフローグラフ変換処理によって、代入命令と代入前参照命令とを結ぶ逆方向のデータフローグラフ有向枝（即ち、ループを形成する有向枝）は全て取り除かれることになる。
【０２０６】
図３４は、図３３のデータフローグラフＦｄｆｇに対してレジスタ変数更新命令ノード群グループ化処理を行った結果のデータフローグラフＦｄｆｇを示す。図３３において、レジスタ変数 stt への代入前参照命令ノード（○１）から同変数への代入命令ノード（○３）までのデータフローグラフ経路上のすべての命令ノード群（○１）、（○２）及び（○３）が、１つのレジスタ変数更新命令ノード群である。パイプライン制約抽出部３２１は、このレジスタ変数更新命令ノード群を、図３４において（○１）（○２）（○３）として示されるレジスタ変数更新縮退命令ノードに置き換える。
【０２０７】
次いで、パイプライン制約抽出部３２１は、データフローグラフ有向枝に対してパイプライン境界属性を付加する処理を行う。レジスタ変数への代入命令と同変数への代入後参照命令との間には、１クロックのレジスタ出力遅延時間を実現するために、パイプライン境界が存在する必要がある。そこで、パイプライン制約抽出部３２１は、これらの命令を結ぶデータフローグラフ有向枝にパイプライン境界属性を付加し、この有向枝がパイプライン境界を交差するようなパイプ段割当を行う。
【０２０８】
また、メモリ配列変数の参照命令は、前述のレジスタ／メモリ配列アクセス命令分解部２５において、読出しアドレス変数への代入命令と、読出しアドレス変数を配列インデックスとした配列参照命令とに細分化されている。ここで、前述のように、同期型メモリにおける１クロックのデータ読出し遅延時間を実現するために、これらの２つの命令の間にもパイプライン境界が存在する必要がある。そこで、パイプライン制約抽出部３２１は、これらの命令を結ぶ、読出しアドレス変数に対応するデータフローグラフ有向枝にパイプライン境界属性を付加し、この有向枝がパイプライン境界を交差するようなパイプ段割当を行う。
【０２０９】
前述の通り、パイプライン回路を合成することは、データフローグラフ上の各命令ノードのパイプ段割当を行うことと等価である。パイプライン回路合成部３２３は、次に説明するパイプ段割当制約を満たしたパイプ段初期割当を行い、その後、データフローグラフＦｄｆｇの各命令ノードのパイプ段割当を変更しながら各パイプ段の信号伝播時間（以降、「パイプライン遅延」とも呼ぶ。）を均等化するパイプライン遅延均等化処理と、パイプライン境界に配置されるレジスタ数を最小化するパイプラインレジスタ数最小化処理とを行うことによって、データフローグラフＦｄｆｇからクロック同期型パイプライン回路Ｆｐｌｃを合成する。パイプライン回路合成部３２３におけるこれらの処理の流れを、図３５に示す。以下に、これらの処理について、より具体的に説明する。なお、以降の説明では、データフローグラフ有向枝の始点ノードのパイプ段を有向枝の「始点パイプ段」と呼び、同終点ノードのパイプ段を有向枝の「終点パイプ段」と呼ぶことにする。
【０２１０】
データフローグラフＦｄｆｇの各命令ノード対するパイプ段割当制約には、次に説明する、データ依存制約及びパイプライン境界制約がある。
【０２１１】
データフローグラフ有向枝は、その始点ノード（変数への代入命令ノード）と終点ノード（変数への参照命令ノード）とのデータ依存性を表している。ここで、有向枝の始点パイプ段と終点パイプ段は、同一であるか、もしくは、始点パイプ段が終点パイプ段よりも前方のパイプ段となるように割当てる必要がある。この制約を、データ依存制約という。
【０２１２】
パイプライン境界属性を付加されたデータフローグラフ有向枝を、パイプライン境界枝と呼ぶことにする。パイプライン境界枝については、始点パイプ段が終点パイプ段よりも前方のパイプ段となるように割当てる必要があり、同一のパイプ段に割当てることはできない。これを、パイプライン境界制約という。
【０２１３】
また、パイプライン境界枝のうち、始点パイプ段と終点パイプ段とが隣接している（即ち、始点パイプ段の１つ後方のパイプ段が終点パイプ段である）ときに、この有向枝を、クリティカルパイプライン境界枝と呼ぶことにする。これは、パイプ段割当制約そのものではないが、パイプ段割当を変更する際に、パイプライン境界制約が満たされるかどうかを判別するための属性である。
【０２１４】
パイプライン境界枝が存在する場合には、そのパイプライン境界を挟んで少なくとも２つのパイプ段が必要となる。１つのデータフローグラフ経路上に複数のパイプライン境界枝が存在する場合には、それらのデータフローグラフ経路上のパイプライン境界枝はすべて異なるパイプライン境界を交差する必要がある。このようにパイプライン境界制約によって定まる必要最小のパイプ段数を、パイプライン段数下限値と呼ぶ。例えば、図３６に示されるように、３つのパイプライン境界枝が１つのデータフローグラフ経路上に存在する場合には、パイプライン段数下限値は 4 となる。パイプライン段数決定部３２２は、算出したパイプライン段数下限値と、次に説明する回路設計者の指定に基づくパイプライン段数と、のうち最大のものを、最終的なパイプライン段数として決定する。
【０２１５】
本実施形態の論理回路生成装置１を使用する回路設計者は、生成される論理回路のクロック周期を指定することができ、又は、生成される論理回路のパイプライン段数を指定することができる。回路設計者がクロック周期を指定した場合には、クロック周期から算出されたパイプライン段数を、回路設計者の指定に基づくパイプライン段数とする。回路設計者がパイプライン段数を指定した場合には、そのパイプライン段数を、回路設計者の指定に基づくパイプライン段数とする。
【０２１６】
より具体的には、回路設計者がクロック周期指定した場合には、それぞれのパイプ段の最大信号伝播時間が指定されたクロック周期以下になるようなパイプライン段数を算出する。パイプライン分割される前のデータフローグラフＦｄｆｇ全体の最大信号伝播時間を Dtotal とし、指定されたクロック周期が Dspec とすると、パイプライン段数の算出値 PSspec は、
PSspec = ceil(Dtotal / Dspec)
と算出される。また、回路設計者がパイプライン段数を指定した場合には、その指定値を PSspec とする。いずれの場合にも、パイプライン段数下限値を PSmin とすると、最終的なパイプライン段数 PS は、
PS = max(PSspec, PSmin)
と算出される。
【０２１７】
パイプライン回路合成部３２３は、まず、パイプ段割当制約を満たすように各命令へパイプ段を割当てる、パイプ段初期割当処理を行う。この処理における命令へのパイプ段の割当をパイプ段初期割当という。この処理は、データフローグラフ経路上の各命令を順方向（即ち、入力側から出力側の方向）に辿りながら、前方のパイプ段から順次割当てて行く単純な処理によって実現される。
【０２１８】
次いで、パイプライン回路合成部３２３は、パイプライン遅延均等化処理及びパイプラインレジスタ最小化処理を行う。これらの処理においては、パイプ段割当から定まるパイプライン境界を局所的に変更する（即ち、１つの命令ノードのパイプ段割当を変更する）処理が繰返される。パイプ段割当制約を満たしながらパイプ段割当の変更が可能な命令ノードは、次に説明するパイプ段出力辺境ノード及びパイプ段入力辺境ノードに限られる。
【０２１９】
パイプ段出力辺境ノードとは、ある命令ノードにおいて、
（１）その命令ノードを始点とするすべてのデータフローグラフ有向枝の終点パイプ段が、その命令ノードのパイプ段（即ち、有向枝の始点パイプ段）よりも後方に位置し、かつ、
（２）その命令ノードを始点とするクリティカルパイプライン境界枝が存在しない
ような命令ノードをいう。パイプ段出力辺境ノードは、後方のパイプ段に移動することが可能である。
【０２２０】
パイプ段入力辺境ノードとは、ある命令ノードにおいて、
（１）その命令ノードを終点とするすべてのデータフローグラフ有向枝の始点パイプ段が、その命令ノードのパイプ段（即ち、有向枝の終点パイプ段）よりも前方に位置し、かつ、
（２）その命令ノードを終点とするクリティカルパイプライン境界枝が存在しない
ような命令ノードをいう。パイプ段入力辺境ノードは、前方のパイプ段に移動することが可能である。
【０２２１】
パイプライン境界の局所変更処理において、個々の局所変更が「有益」であるか否かを判定するための目的関数について説明する。この目的関数は、パイプライン境界の局所変更処理の目的に依存して、以下のように定義する。
【０２２２】
パイプライン遅延均等化処理においては、各パイプ段の信号伝播時間を均等化することによって、回路全体の動作クロック周波数を最大化することを目的とする。ここで、 n 番目のパイプ段の最大信号伝播時間を D(n) としたとき、パイプライン遅延均等化処理の目的関数 E1 は、次式によって定義される。
E1 = Σn D(n)2
即ち、個々のパイプ段の最大信号伝播時間の２乗和をここでの目的関数とする。パイプライン回路合成部３２３は、この目的関数を最小化するようにパイプライン境界を調整することによって、各々のパイプ段の最大信号伝播時間を均等化する。本実施形態においては、パイプ段の最大信号伝播時間 D(n) は、演算器の回路遅延・回路規模評価部３１によって評価された演算器の回路遅延に基づいて算出される。
【０２２３】
また、パイプラインレジスタ数最小化処理においては、各パイプライン境界を交差するデータフローグラフ有向枝上に挿入されるレジスタ数を最小化することによって、回路面積を最小化することを目的とする。ここで、データフローグラフ有向枝に対応する変数のビット幅を、その有向枝の重みと呼ぶことにする。 n 番目のパイプ段の出力側のパイプライン境界を交差するデータフローグラフ有向枝の重みの総数を R(n) としたとき、その目的関数 E2 は以下の数式で定義する。
E2 = Σn R(n)
即ち、パイプライン境界を交差するデータフローグラフ有向枝の重みの総和をここでの目的関数とする。パイプライン回路合成部３２３は、この目的関数を最小化するようにパイプライン境界を調整することによって、パイプラインレジスタ数を最小化する。
【０２２４】
さらに、パイプライン遅延均等化処理及びパイプラインレジスタ数最小化処理におけるそれぞれの目的関数 E1 及び E2 の他に、パイプライン回路全体の動作クロック周波数を最終的に決定する次式の評価関数を定義する。
Dmax = max{ D(n) | n ∈ すべてのパイプ段 }
この Dmax を増大させるパイプライン境界の局所変更は、禁止される。
【０２２５】
本実施形態においては、パイプライン境界の局所変更処理を制御する方法として、焼き鈍し法（Simulated Annealing 法、本明細書において「ＳＡ法」とも呼ぶ。）を用いる。図３７を参照して、パイプライン回路合成部３２３が行うＳＡ法について、より具体的に説明する。
【０２２６】
まず、ＳＡ法のパラメータである温度 T に、適切な初期値を設定する。温度 T の意味については後述する。
【０２２７】
次に、パイプ段出力辺境ノード及びパイプ段入力辺境ノードのうち、１つの命令ノードをランダムに選択し、移動可能な方向にパイプ段の割当の変更を行う。ここで、パイプ段割当変更前の最大パイプライン遅延 Dmax （前述）と、パイプ段割当変更後の最大パイプライン遅延 D'max とについて、 Dmax < D'max の場合には、パイプ段割当変更を却下し、変更前のパイプ段割当に戻す。 Dmax >= D'max の場合には、以下の処理に進む。
【０２２８】
次に、前述で定義された目的関数（ E1 または E2 ）を用いて、パイプ段割当変更前の目的関数値 E と変更後の目的関数値 E' との差分であるパイプ段割当変更コスト ΔC を計算する。即ち、
ΔC = E - E'
とする。
【０２２９】
次に、パイプ段割当変更コスト ΔC から、パイプ段割当変更を採用するか否かを確率的に判定するための採用閾値を、次式で定義する。
P = exp(ΔC / T)
この式において、 T は、割当変更の採用確率を制御するためのＳＡ法の「温度」と呼ばれる、正の実数値をとるパラメータである。
【０２３０】
次に、パイプ段割当変更を採用するか否かを最終的に判定するために、 0 以上 1 未満の乱数 R を生成し、 P と R との関係に従って次のいずれかを実行する。
（１） R < P の場合には、パイプ段割当変更を採用する。また、これまでのパイプ段割当の目的関数の最小評価値 Emin と E' とを比較し、 Emin > E' の場合には、 Emin = E' とし、パイプ段割当の最適解を更新する。
（２） R >= P の場合には、パイプ段割当変更を却下し、パイプ段割当変更前の状態に戻す。
なお、目的関数値が減少するパイプ段割当変更の場合、即ち ΔC = E = E' < 0 の場合には、採用閾値 P は 1 より大きくなるので、必ず上記（１）が実行され、パイプ段割当変更は採用される。
【０２３１】
次に、温度 T を更新する。温度 T は、初期段階では比較的大きい（即ち「熱い」）値に設定し、目的関数値が増加するようなパイプ段割当変更を採用する確率を大きくすることで、パイプ段配置の局所最適解から脱出し易いようにする。割当変更処理が進むに連れて温度 T を徐々に減少させて行く（即ち「冷やす」）ことで、パイプ段配置の大局的最適解に近づけるように制御する。
【０２３２】
ノードの選択から温度 T の更新までの上記処理を、温度 T が所定値を下回るまで繰り返す。温度 T が所定値を下回ったときの上述の最適解が、ＳＡ法によるパイプライン遅延均等化処理及びパイプラインレジスタ最小化処理の結果となる。
【０２３３】
［ＲＴＬ記述出力部３３］
パイプライン境界配置部３２によって出力されたパイプライン回路データＦｐｌｃは、次いで、ＲＴＬ記述出力部３３に入力される。本実施形態における論理回路生成装置１は、生成した論理回路を、ＲＴＬ記述の形式で出力する。そこで、ＲＴＬ記述出力部３３は、入力されたパイプライン回路データＦｐｌｃを、ＲＴＬ記述に変換する。ＲＴＬ記述による論理回路の表現は公知の技術であるため、ここでは具体的な説明は省略するが、パイプライン回路データＦｐｌｃはデータフローグラフであり、前述の通り、データフローグラフは論理回路の回路構造と対応しているため、これをそのままＲＴＬ記述によって表現することが可能である。なお、本発明の目的を達成するためには、論理回路生成装置１の出力形式は、ＲＴＬ記述の形式に限らず、論理回路を記述する任意の適切な形式で構わない。即ち、本発明の論理回路生成装置１は、一般には、論理回路記述出力部を備え、本実施形態における論理回路記述出力部は、ＲＴＬ記述を出力するＲＴＬ記述出力部３３である。
【０２３４】
ＲＴＬ記述出力部３３によって変換されたＲＴＬ記述は、論理回路記述Ｄとして、論理回路生成装置１から出力される。以上が、本実施形態における論理回路生成装置１の各部の説明である。
【０２３５】
次に、図３８〜図４４を参照して、本発明の論理回路生成装置１の実施形態のいくつかの例について説明する。各図において、淡色で示される部分は、その図が示す実施形態における論理回路生成装置１には含まれない構成要素を、他の実施形態と対照させるために示すものである。
【０２３６】
図３８に示される実施形態の論理回路生成装置１は、制御フローグラフ生成部２３と、制御フロー縮退変換部２８と、データフローグラフ生成部２９と、ＲＴＬ記述出力部（論理回路記述出力部）３３とを備える。制御フロー縮退変換部２８は、基本ブロック単一化部２８２を含む。この実施形態の論理回路生成装置１は、関数呼出し命令もループ制御部も含まず、変数をインデックスとする配列アクセス命令も含まない、静的単一代入形式で記述されたプログラムＰを入力に取り、論理回路記述Ｄを出力する。論理回路の入力信号及び出力信号は、プログラムＰにおいて明示的に指定することができる。
【０２３７】
図３９に示される実施形態の論理回路生成装置１は、図３８の実施形態に加えて、静的単一代入形式変換部２７をさらに備える。また、制御フロー縮退変換部２８は、φ関数命令実体化部２８１をさらに含む。本実施形態の論理回路生成装置１は、入力されたプログラムＰを内部で静的単一代入形式に変換するため、論理回路生成装置１が入力に取るプログラムＰは、必ずしも静的単一代入形式で記述されたものである必要はない。
【０２３８】
図４０に示される実施形態の論理回路生成装置１は、図３８の実施形態に加えて、レジスタ／メモリ配列アクセス命令分解部２５と、メモリポート数判定部２６とをさらに備える。また、制御フロー縮退変換部２８は、レジスタ／メモリ配列命令融合部２８３をさらに含む。本実施形態の論理回路生成装置１は、変数をインデックスとする配列アクセス命令を含むプログラムＰを入力に取ることができ、マルチポートレジスタファイル及びマルチポートメモリを含む論理回路を表現する論理回路記述Ｄを生成することができる。
【０２３９】
図４１に示される実施形態の論理回路生成装置１は、図３８の実施形態に加えて、データフローグラフ最適化部３０、演算器の回路遅延・回路規模評価部３１、及びパイプライン境界配置部３２をさらに備える。本実施形態の論理回路生成装置１は、最適化されたパイプライン回路記述を出力することができる。また、本実施形態の論理回路生成装置１は、生成する論理回路の回路遅延及び回路規模の見積を算出することができる。
【０２４０】
図４２に示される実施形態の論理回路生成装置１は、図３８の実施形態に加えて、論理回路入出力信号抽出部２２をさらに備える。本実施形態の論理回路生成装置１は、生成することになる論理回路の入力信号及び出力信号を抽出するため、これらの信号が論理回路生成装置１の外部から明示的に指定される必要はない。
【０２４１】
図４３に示される実施形態の論理回路生成装置１は、図３８の実施形態に加えて、非循環・非階層変換部２１をさらに備える。本実施形態の論理回路生成装置１は、入力されたプログラムＰに含まれる最上位関数Ｆｔｏｐを内部で非循環型最下層関数Ｆｅｘｐに変換するため、入力されるプログラムＰに含まれる最上位関数Ｆｔｏｐは、必ずしも非循環型最下層関数である必要はない。
【０２４２】
図４４に示される実施形態の論理回路生成装置１は、図３８の実施形態に加えて、状態変数命令依存性判定部２４さらに備える。本実施形態の論理回路生成装置１は、同一の状態変数に対して代入命令・参照命令・代入命令がこの順序で連続して実行されるようなプログラムＰが入力されたときには、論理回路記述を生成する処理を停止する。
【図１】
0005842255.tif 000002
【図２】
0005842255.tif 000003
【図３】
0005842255.tif 000004
【図４】
0005842255.tif 000005
【図５】
0005842255.tif 000006
【図６】
0005842255.tif 000007
【図７】
0005842255.tif 000008
【図８】
0005842255.tif 000009
【図９】
0005842255.tif 000010
【図１０】
0005842255.tif 000011
【図１１】
0005842255.tif 000012
【図１２】
0005842255.tif 000013
【図１３】
0005842255.tif 000014
【図１４】
0005842255.tif 000015
【図１５】
0005842255.tif 000016
【図１６】
0005842255.tif 000017
【図１７】
0005842255.tif 000018
【図１８】
0005842255.tif 000019
【図１９】
0005842255.tif 000020
【図２０】
0005842255.tif 000021
【図２１】
0005842255.tif 000022
【図２２】
0005842255.tif 000023
【図２３】
0005842255.tif 000024
【図２４】
0005842255.tif 000025
【図２５】
0005842255.tif 000026
【図２６】
0005842255.tif 000027
【図２７】
0005842255.tif 000028
【図２８】
0005842255.tif 000029
【図２９】
0005842255.tif 000030
【図３０】
0005842255.tif 000031
【図３１】
0005842255.tif 000032
【図３２】
0005842255.tif 000033
【図３３】
0005842255.tif 000034
【図３４】
0005842255.tif 000035
【図３５】
0005842255.tif 000036
【図３６】
0005842255.tif 000037
【図３７】
0005842255.tif 000038
【図３８】
0005842255.tif 000039
【図３９】
0005842255.tif 000040
【図４０】
0005842255.tif 000041
【図４１】
0005842255.tif 000042
【図４２】
0005842255.tif 000043
【図４３】
0005842255.tif 000044
【図４４】
0005842255.tif 000045