特許第5842255号(P5842255)IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 国立大学法人東京工業大学の特許一覧

特許5842255プログラミング言語による論理回路記述から論理回路を生成するための装置及び方法
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】5842255
(24)【登録日】2015年11月27日
(45)【発行日】2016年1月13日
(54)【発明の名称】プログラミング言語による論理回路記述から論理回路を生成するための装置及び方法
(51)【国際特許分類】
   G06F 17/50 20060101AFI20151217BHJP
【FI】
   G06F17/50 654M
【請求項の数】23
【全頁数】62
(21)【出願番号】特願2013-256881(P2013-256881)
(22)【出願日】2013年12月12日
(65)【公開番号】特開2015-114874(P2015-114874A)
(43)【公開日】2015年6月22日
【審査請求日】2015年4月3日
【早期審査対象出願】
(73)【特許権者】
【識別番号】304021417
【氏名又は名称】国立大学法人東京工業大学
(74)【代理人】
【識別番号】110000316
【氏名又は名称】特許業務法人ピー・エス・ディ
(72)【発明者】
【氏名】一色 剛
【審査官】 合田 幸裕
(56)【参考文献】
【文献】 特開2012−118835(JP,A)
【文献】 特開2009−211614(JP,A)
【文献】 特開2000−113026(JP,A)
【文献】 特開2011−134308(JP,A)
【文献】 特開2010−118081(JP,A)
【文献】 松葉 俊信, 冨山 宏之, 本田 晋也, 高田 広章,ハードウェア動作記述のSSA変換によるクロック周波数の向上,DAシンポジウム 2008,日本,社団法人情報処理学会,2008年 8月19日,p.103-108
【文献】 石守 祥之, 石浦 菜岐佐, 冨山 宏之, 神原 弘之,高位合成システムCCAPのAMPマルチコアシステム設計のための拡張,電子情報通信学会技術研究報告,日本,一般社団法人電子情報通信学会,2009年 1月22日,第108巻/第414号,第81-86頁
(58)【調査した分野】(Int.Cl.,DB名)
G06F 17/50
IEEE Xplore
CiNii
JSTPlus(JDreamIII)
(57)【特許請求の範囲】
【請求項1】
回路設計のためのハードウェアの一連の処理の流れである動作記述を記述した論理回路生成対象の最上位関数を含むプログラムを入力に取り、論理回路記述を生成する、論理回路生成装置であって、
ループ処理部及び関数呼出し命令を含まない前記最上位関数から、制御フローグラフを生成する、制御フローグラフ生成部と、
変数に対する代入命令を各変数につき1つだけ含む前記制御フローグラフから、すべての条件分岐命令を除去することによって、制御フローが縮退されたプログラムである制御フロー縮退プログラムを生成する、制御フロー縮退変換部と、
前記制御フロー縮退プログラムから、前記制御フロー縮退プログラムの各命令をノードとし、各変数への代入命令からその変数を参照する命令への有向枝を付加することによって、データフローグラフを生成する、データフローグラフ生成部と、
前記データフローグラフの前記有向枝が論理回路の配線に対応し、前記データフローグラフの前記ノードが論理回路の演算器に対応する順序回路を表す論理回路記述を生成する、論理回路記述出力部と、
を備え、
前記順序回路の状態を表す状態変数は、前記プログラムにおいて、前記最上位関数を呼出す上位階層関数のローカル変数又はスタティック変数として表現され、
前記状態変数への代入命令が実行される前の前記状態変数の値が前記順序回路の現状態を表し、前記状態変数への代入命令が実行された後の前記状態変数の値が前記順序回路の次状態を表す
ことを特徴とする、論理回路生成装置。
【請求項2】
請求項1に記載の論理回路生成装置において、
前記最上位関数が、変数に対する代入命令を各変数につき1つだけ含む静的単一代入形式でない場合に、前記制御フローグラフを、前記制御フロー縮退変換部に入力される前に、静的単一代入形式に変換する、静的単一代入形式変換部をさらに備え、
前記静的単一代入形式変換部は、
前記制御フローグラフにおいて同一変数に対する値の定義が複数個合流する箇所に、その箇所に合流する全ての変数定義の中から実際に実行された経路上の変数定義を選択するφ関数命令を挿入する、φ関数命令挿入部と、
前記制御フローグラフに含まれる各変数の名前を、変数に対する代入命令ごとに別の名前となるように変換することによって、前記制御フローグラフが名前変換後の各変数につき代入命令を1つだけ含む静的単一代入形式に変換する、変数名変換部と、
名前変換後の前記状態変数について、前記制御フローグラフの始点ブロックにおける変数名と終点ブロックに到達する変数名とを一致させるように、変数名を再度変換する、状態変数名再変換部と、
を含み、
前記制御フロー縮退変換部は、前記φ関数命令を具体的な演算命令に変換する、φ関数命令実体化部を含む、
ことを特徴とする論理回路生成装置。
【請求項3】
請求項1又は請求項2に記載の論理回路生成装置において、
前記最上位関数が配列変数に対する書込み処理命令である配列代入命令を含む場合に、
各配列変数について、前記制御フローグラフに書込みデータ変数及び書込みアドレス変数を付加し、
各配列代入命令を、配列要素への代入値を前記書込みデータ変数へ代入する命令と、配列インデックス値を前記書込みアドレス変数へ代入する命令と、前記書込みアドレス変数を配列インデックスとすることによって定まる配列要素に前記書込みデータ変数の値を代入する命令とに分解する、
配列代入命令分解部と、
前記最上位関数が配列変数に対する読出し処理命令である配列参照命令を含む場合に、
各配列変数について、前記制御フローグラフに読出しアドレス変数を付加し、
各配列参照命令を、配列インデックス値を前記読出しアドレス変数へ代入する命令と、前記読出しアドレス変数を配列インデックスとすることによって定まる配列要素を参照する命令とに分解する、
配列参照命令分解部と、
を含むレジスタ/メモリ配列アクセス命令分解部をさらに備え、
論理回路において各配列要素データを保持するためのメモリは、
前記書込みデータ変数が前記メモリの書込みデータポートに対応し、
前記書込みアドレス変数が前記メモリの書込みアドレスポートに対応し、
前記読出しアドレス変数が前記メモリの読出しアドレスポートに対応した
ものであり、
前記制御フローグラフ生成部によって生成された前記制御フローグラフは、前記レジスタ/メモリ配列アクセス命令分解部によって処理された後に、前記制御フロー縮退変換部によって処理される
ことを特徴とする論理回路生成装置。
【請求項4】
請求項3に記載の論理回路生成装置において、
前記レジスタ/メモリ配列アクセス命令分解部は、
前記制御フローグラフにおける各配列変数に対する各配列代入命令について、始点ブロックから該配列代入命令までの間に実行される該配列変数への配列代入命令の実行回数の最大値を書込みポート番号として該配列代入命令に割当てる、書込みポート番号割当部と、
前記制御フローグラフにおける各配列変数に対する各配列参照命令について、始点ブロックから該配列参照命令までの間に実行される該配列変数への配列参照命令の実行回数の最大値を読出しポート番号として該配列参照命令に割当てる、読出しポート番号割当部と、
をさらに含み、
前記配列代入命令分解部は、各配列変数について、前記書込みポート番号ごとに、前記書込みデータ変数及び前記書込みアドレス変数を前記制御フローグラフに付加し、かつ、前記読出しポート番号ごとに、前記読出しアドレス変数を前記制御フローグラフに付加し、
各配列要素データを保持するための前記メモリは、該配列変数の代入命令に割り当てられた前記書込みポート番号の数と同数の書込みポートと、該配列変数の参照命令に割り当てられた前記読出しポート番号の数と同数の読出しポートとを持つ
ことを特徴とする論理回路生成装置。
【請求項5】
請求項4に記載の論理回路生成装置において、
前記書込みポート番号割当部が割当てた前記書込みポート番号の数が、予め定められた書込みメモリポート数閾値以下であるか否かを判定し、前記読出しポート番号割当部が割当てた前記読出しポート番号の数が、予め定められた読出しメモリポート数閾値以下であるか否かを判定する、メモリポート数判定部、
をさらに備え、
前記書込みポート番号の数が、予め定められた書込みメモリポート数閾値以下である場合、又は前記読出しポート番号の数が、予め定められた読出しメモリポート数閾値以下である場合には、論理回路記述を生成する処理を停止すること
を特徴とする論理回路生成装置。
【請求項6】
請求項1〜5のいずれかに記載の論理回路生成装置において、
入力される前記プログラムは、各変数に属性を付与するための属性記述を含み、前記属性は、
変数のデータのビット幅を指定する、ビット幅属性と、
変数の値をレジスタに保持することを指定する、レジスタ属性と、
配列変数の配列要素の値をメモリに保持することを指定する、メモリ属性と、
を含み、
前記レジスタ属性又は前記メモリ属性が付与された変数を前記状態変数とすることによって状態が表現される順序回路を含む論理回路記述を生成する
ことを特徴とする論理回路生成装置。
【請求項7】
請求項6に記載の論理回路生成装置において、
前記データフローグラフに含まれる変数に対して、該変数に対する代入命令において参照される変数及び/又は定数のビット幅と該代入命令において実行される演算の種類とから該変数のビット幅を算出する、ビット幅判定部と、
前記データフローグラフに含まれる変数に対して算出されたビット幅に基づいて、演算器の信号伝搬遅延時間を算出する、演算器回路遅延評価部と、
パイプライン制約抽出部及びパイプライン段数決定部を含むパイプライン境界配置部と、
をさらに備え、
前記パイプライン制約抽出部は、前記データフローグラフにおける前記状態変数に対する代入命令を実行する演算器と該状態変数に対する参照命令を実行する演算器との間の有向枝にパイプライン境界属性を付加し、
前記パイプライン段数決定部は、クロック同期型パイプライン回路の回路記述を生成するために用いられるパイプライン段数を、前記パイプライン境界属性に基づく制約によって定まる必要最小限のパイプライン段数であるパイプライン段数下限値と、指定されたクロック周期から算出したパイプライン段数又は予め指定されたパイプライン段数とに従って決定する
ことを特徴とする論理回路生成装置。
【請求項8】
請求項1〜7のいずれかに記載の論理回路生成装置において、
前記最上位関数の引数及びグローバル変数から、前記回路記述によって記述されることになる回路の入力信号を抽出する、論理回路入力信号抽出部と、
前記最上位関数の引数及び戻り値並びにグローバル変数から、前記回路記述によって記述されることになる回路の出力信号を抽出する、論理回路出力信号抽出部と、
をさらに備えることを特徴とする論理回路生成装置。
【請求項9】
請求項1〜8のいずれかに記載の論理回路生成装置において、
前記最上位関数が関数呼出し命令を含む場合に、それぞれの関数呼出し命令をインライン展開することによって、前記最上位関数を、関数呼出し命令を含まない最下層関数に変換する、完全インライン展開部と、
前記完全インライン展開部によって変換された前記最下層関数が固定繰返し回数のループ処理部を含む場合に、それぞれの固定繰返し回数のループ処理部をループ展開することによって、前記最下層関数を、ループ処理部を含まない非循環型最下層関数に変換する、完全ループ展開部と、
を含む非循環・非階層変換部をさらに備え、
前記論理回路生成装置に入力されたプログラムは、前記非循環・非階層変換部によって非循環型最下層関数に変換された後に、前記制御フローグラフ生成部に入力される
ことを特徴とする論理回路生成装置。
【請求項10】
請求項9に記載の論理回路生成装置において、
前記完全インライン展開部は、入力された関数に対してインライン展開を所定の回数繰返しても関数呼出し命令が完全に展開されない場合には、該関数を最下層関数に変換不可能であると判断して処理を中止するように構成され、
完全ループ展開部は、入力された関数に繰返し回数が定数ではないループ処理部が含まれる場合には、該関数を非循環型最下層関数に変換不可能であると判断して処理を中止するように構成され、
前記完全インライン展開可能性判定部が処理を中止した場合、又は前記完全ループ展開可能性判定部が処理を中止した場合には、論理回路記述を生成する処理を停止する
ことを特徴とする論理回路生成装置。
【請求項11】
請求項1〜10のいずれかに記載の論理回路生成装置において、
前記制御フローグラフにおいて、同一の前記状態変数に対して代入命令・参照命令・代入命令がこの順序で連続して実行される場合がないか否を判定する、状態変数命令依存性判定部をさらに備え、
前記状態変数命令依存性判定部が「否」と判定した場合には、論理回路記述を生成する処理を停止する
ことを特徴とする論理回路生成装置。
【請求項12】
回路設計のためのハードウェアの一連の処理の流れである動作記述を記述した論理回路生成対象の最上位関数を含むプログラムを入力に取り、論理回路記述を生成する、論理回路生成装置によって行われる、論理回路生成方法であって、
前記論理回路生成装置は、
ループ処理部及び関数呼出し命令を含まない前記最上位関数から、制御フローグラフを生成する、制御フローグラフ生成ステップと、
変数に対する代入命令を各変数につき1つだけ含む前記制御フローグラフから、すべての条件分岐命令を除去することによって、制御フローが縮退されたプログラムである制御フロー縮退プログラムを生成する、制御フロー縮退変換ステップと、
前記制御フロー縮退プログラムから、前記制御フロー縮退プログラムの各命令をノードとし、各変数への代入命令からその変数を参照する命令への有向枝を付加することによって、データフローグラフを生成する、データフローグラフ生成ステップと、
前記データフローグラフの前記有向枝が論理回路の配線に対応し、前記データフローグラフの前記ノードが論理回路の演算器に対応する順序回路を表す論理回路記述を生成する、論理回路記述生成ステップと、
を行い、
前記順序回路の状態を表す状態変数は、前記プログラムにおいて、前記最上位関数を呼出す上位階層関数のローカル変数又はスタティック変数として表現され、
前記状態変数への代入命令が実行される前の前記状態変数の値が前記順序回路の現状態を表し、前記状態変数への代入命令が実行された後の前記状態変数の値が前記順序回路の次状態を表す
ことを特徴とする、論理回路生成方法。
【請求項13】
請求項12に記載の論理回路生成方法において、
前記論理回路生成装置は、前記最上位関数が、変数に対する代入命令を各変数につき1つだけ含む静的単一代入形式でない場合に、前記制御フロー縮退変換ステップの前に、前記制御フローグラフを静的単一代入形式に変換する、静的単一代入形式変換ステップをさらに行い、
前記静的単一代入形式変換ステップは、
前記制御フローグラフにおいて同一変数に対する値の定義が複数個合流する箇所に、その箇所に合流する全ての変数定義の中から実際に実行された経路上の変数定義を選択するφ関数命令を挿入する、φ関数命令挿入ステップと、
前記制御フローグラフに含まれる各変数の名前を、変数に対する代入命令ごとに別の名前となるように変換することによって、前記制御フローグラフが名前変換後の各変数につき代入命令を1つだけ含む静的単一代入形式に変換する、変数名変換ステップと、
名前変換後の前記状態変数について、前記制御フローグラフの始点ブロックにおける変数名と終点ブロックに到達する変数名とを一致させるように、変数名を再度変換する、状態変数名再変換ステップと、
を含み、
前記制御フロー縮退変換ステップは、前記φ関数命令を具体的な演算命令に変換する、φ関数命令実体化ステップをさらに含む、
ことを特徴とする論理回路生成方法。
【請求項14】
請求項12又は請求項13に記載の論理回路生成方法において、
前記論理回路生成装置は、前記最上位関数が、配列変数に対する書込み処理命令である配列代入命令を含む場合、及び/又は、配列変数に対する読出し処理命令である配列参照命令を含む場合に、前記制御フロー縮退変換ステップの前に、前記制御フローグラフの配列代入命令及び/又は配列参照命令を分解するレジスタ/メモリ配列アクセス命令分解ステップをさらに行い、
前記レジスタ/メモリ配列アクセス命令分解ステップは、
各配列変数について、前記制御フローグラフに書込みデータ変数及び書込みアドレス変数を付加し、
各配列代入命令を、配列要素への代入値を前記書込みデータ変数へ代入する命令と、配列インデックス値を前記書込みアドレス変数へ代入する命令と、前記書込みアドレス変数を配列インデックスとすることによって定まる配列要素に前記書込みデータ変数の値を代入する命令とに分解する、
配列代入命令分解ステップと、
各配列変数について、前記制御フローグラフに読出しアドレス変数を付加し、
各配列参照命令を、配列インデックス値を前記読出しアドレス変数へ代入する命令と、前記読出しアドレス変数を配列インデックスとすることによって定まる配列要素を参照する命令とに分解する、
配列参照命令分解ステップと、
を含み、
論理回路において各配列要素データを保持するためのメモリは、
前記書込みデータ変数が前記メモリの書込みデータポートに対応し、
前記書込みアドレス変数が前記メモリの書込みアドレスポートに対応し、
前記読出しアドレス変数が前記メモリの読出しアドレスポートに対応した
ものである、
ことを特徴とする論理回路生成方法。
【請求項15】
請求項14に記載の論理回路生成方法において、
レジスタ/メモリ配列アクセス命令分解ステップは、
前記制御フローグラフにおける各配列変数に対する各配列代入命令について、始点ブロックから該配列代入命令までの間に実行される該配列変数への配列代入命令の実行回数の最大値を書込みポート番号として該配列代入命令に割当てる、書込みポート番号割当ステップと、
前記制御フローグラフにおける各配列変数に対する各配列参照命令について、始点ブロックから該配列参照命令までの間に実行される該配列変数への配列参照命令の実行回数の最大値を読出しポート番号として該配列参照命令に割当てる、読出しポート番号割当ステップと、
をさらに含み、
前記配列代入命令分解ステップは、各配列変数について、前記書込みポート番号ごとに、前記書込みデータ変数及び前記書込みアドレス変数を前記制御フローグラフに付加し、かつ、前記読出しポート番号ごとに、前記読出しアドレス変数を前記制御フローグラフに付加するステップを含み、
前記配列変数の代入命令に割り当てられた前記書込みポート番号の数と同数の書込みポートと、前記配列変数の参照命令に割り当てられた前記読出しポート番号の数と同数の読出しポートとを持つ、各配列要素データを保持するための前記メモリの記述が生成される、
ことを特徴とする論理回路生成方法。
【請求項16】
請求項15に記載の論理回路生成方法において、
前記論理回路生成装置は、メモリポート数判定ステップをさらに行い、
前記メモリポート数判定ステップは、
前記書込みポート番号割当ステップにおいて割当てられた前記書込みポート番号の数が、予め定められた閾値以下であるかどうかを判定するステップと、
前記読出しポート番号割当ステップにおいて割当てられた前記読出しポート番号の数が、予め定められた閾値以下であるかどうかを判定するステップと、
をさらに含み、
前記書込みポート番号の数又は前記読出しメモリポートの数が閾値を超えている場合には、前記論理回路生成装置は、論理回路記述を生成する処理を停止すること
を特徴とする論理回路生成方法。
【請求項17】
請求項12〜16のいずれかに記載の論理回路生成方法において、
入力される前記プログラムは、各変数に属性を付与するための属性記述を含み、前記属性は、
変数のデータのビット幅を指定する、ビット幅属性と、
変数の値をレジスタに保持することを指定する、レジスタ属性と、
配列変数の配列要素の値をメモリに保持することを指定する、メモリ属性と、
を含み、
前記論理回路生成装置は、前記レジスタ属性又は前記メモリ属性が付与された変数を前記状態変数とすることによって状態が表現される順序回路を含む回路記述を生成する、
ことを特徴とする論理回路生成方法。
【請求項18】
請求項17に記載の論理回路生成方法において、
前記論理回路生成装置は、
前記データフローグラフに含まれる変数に対して、該変数に対する代入命令において参照される変数及び/又は定数のビット幅と該代入命令において実行される演算の種類とから該変数のビット幅を算出する、ビット幅判定ステップと、
前記データフローグラフに含まれる変数に対して算出されたビット幅に基づいて、演算器の信号伝搬遅延時間を算出する、演算器回路遅延評価ステップと、
パイプライン制約抽出ステップ及びパイプライン段数決定ステップを含むパイプライン境界配置ステップと、
をさらに行い、
前記パイプライン制約抽出ステップは、前記データフローグラフにおける前記状態変数に対する代入命令を実行する演算器と該状態変数に対する参照命令を実行する演算器との間の有向枝にパイプライン境界属性を付加し、
前記パイプライン段数決定ステップは、クロック同期型パイプライン回路の回路記述を生成するために用いられるパイプライン段数を、前記パイプライン境界属性に基づく制約によって定まる必要最小限のパイプライン段数であるパイプライン段数下限値と、指定されたクロック周期から算出したパイプライン段数又は予め指定されたパイプライン段数とに従って決定する
ことを特徴とする論理回路生成方法。
【請求項19】
請求項12〜18のいずれかに記載の論理回路生成方法において、
前記論理回路生成装置は、前記制御フローグラフ生成ステップの前に、
前記最上位関数の引数及びグローバル変数から、前記回路記述によって記述されることになる回路の入力信号を抽出する、論理回路入力信号抽出ステップと、
前記最上位関数の引数及び戻り値並びにグローバル変数から、前記回路記述によって記述されることになる回路の出力信号を抽出する、論理回路出力信号抽出ステップと、
をさらに行うことを特徴とする論理回路生成方法。
【請求項20】
請求項13〜19のいずれかに記載の論理回路生成方法において、
前記論理回路生成装置は、前記最上位関数が関数呼出し命令を含む場合、及び/又は、前記最上位関数が固定繰返し回数のループ処理部を含む場合に、前記制御フローグラフ生成ステップの前に非循環・非階層変換ステップをさらに行い、
前記非循環・非階層変換ステップは、
それぞれの関数呼出し命令をインライン展開することによって、前記最上位関数を、関数呼出し命令を含まない最下層関数に変換する、完全インライン展開ステップと、
それぞれの固定繰返し回数のループ処理部をループ展開することによって、前記最下層関数を、ループ処理部を含まない非循環型最下層関数に変換する、完全ループ展開ステップと、
を含むことを特徴とする論理回路生成方法。
【請求項21】
請求項20に記載の論理回路生成方法において、
前記完全インライン展開ステップは、入力された関数に対するインライン展開を所定の回数繰返しても関数呼出し命令が完全に展開されない場合には、該関数を最下層関数に変換不可能であると判断して処理を中止し、
前記完全ループ展開ステップは、入力された関数に繰返し回数が定数ではないループ構造が含まれる場合には、該関数を非循環最下層関数に変換不可能であると判断して処理を中止し、
前記完全インライン展開ステップにいて処理が中止された場合、又は前記完全ループ展開ステップにおいて処理が中止された場合には、前記論理回路生成装置は、論理回路記述を生成する処理を停止する、
ことを特徴とする論理回路生成方法。
【請求項22】
請求項13〜21のいずれかに記載の論理回路生成方法において、
前記論理回路生成装置は、
前記制御フローグラフにおいて、同一の前記状態変数に対して代入命令・参照命令・代入命令がこの順序で連続して実行される場合がないか否を判定する、状態変数命令依存性判定ステップをさらに行い、
前記状態変数命令依存性判定ステップにおいて、「否」と判定された場合には、論理回路記述を生成する処理を停止する
ことを特徴とする論理回路生成方法。
【請求項23】
前記請求項12〜22のいずれか一項に記載の論理回路生成方法の各ステップをコンピュータに実行させるための論理回路生成コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、半導体集積回路の合成方法に関し、より具体的には、プログラミング言語を用いて記述された論理回路記述から論理回路を合成するための装置及び方法に関する。
【背景技術】
【0002】
従来、LSI(大規模集積回路)の論理回路の設計においては、RTL(Register Transfer Level:レジスタ転送レベル)記述で設計が行われるとともに、状態遷移図を用いてデータフロー制御が行なわれていた。RTLは、論理回路の設計の抽象度を表すものであり、RTL記述は、ハードウェアの構造や動作を記述する抽象度の低いハードウェア記述言語(HDL、Hardware Description Language)による記述方式の一種である。RTLでは、レジスタ単位でデータの流れが記述される。RTLで記述されたHDLのソースコードは、論理合成ツールと呼ばれるソフトウェアを用いて、論理ゲート水準の回路記述に変換される。
【0003】
状態遷移図を用いて論理回路の設計を行う場合には、状態遷移図の作成後に人手により状態遷移の流れを検証する必要がある。したがって、例えば画像処理用途などといった高性能LSIのように複雑なデータフロー制御を必要とする論理回路を設計する場合には、状態遷移の流れを検証する際の検証漏れや、バグの混入等による設計品質の低下が発生し易いなどという問題がある。
そこで、近年では、以下に示す高位合成技術が導入されている。
【0004】
論理回路を短期間で設計するための技術として、非特許文献1に示されるような高位合成技術が知られている。高位合成技術は、C言語などの手続き型ソフトウェアプログラミング言語を用いて表現された論理回路の動作記述(以下、「ソフトウェア記述」という)を、HDLによるRTL記述に自動的に変換する設計自動化技術である。こうした高位合成技術を用いてソフトウェア記述からRTL記述を自動的に合成する工程は、以下のとおりである。
(1)アロケーション工程:合成する論理回路に搭載する演算器及びメモリ等の種類及び個数を決定する。
(2)スケジューリング工程:ソフトウェア記述内の各演算の実行時刻を決定する。この工程は、複数の演算装置による並列演算が可能なVLIW(Very Long Instruction Word)プロセッサ用の並列化コンパイラ技術に用いられる「並列性解析」機能に基づいている。
(3)バインディング工程:各演算の演算器への割付け、中間処理データのレジスタへの割付け、等を決定する。
(4)FSMD生成工程:ソフトウェア記述と等価な処理動作を論理回路で実行するための制御部をFSM(Finite State Machine:有限状態機械)で実現し、この制御部によって演算器、レジスタ、メモリ、及びバスなどで構成される演算処理回路(Datapath)を駆動するFSMD(Finite State Machine + Datapath)を生成する。最終的に生成されたFSMDが、出力されるRTL記述となる。
これらの工程のうち、「スケジューリング」によってソフトウェア内部の各演算処理を時間方向に多重化する工程と、「バインディング」によって各演算処理を空間方向に多重化する(演算器への割付け)工程とからなる「演算スケジューリング・バインディング工程」が、高位合成技術の核となる重要な工程である。
高位合成技術及びその工程についての詳細は、例えば、特許文献1(特開2003−076728号公報)、特許文献2(特開2006−011878号公報)及び非特許文献1に記載されている。
【0005】
論理回路を短期間で設計するための別の技術として、非特許文献2に示されるような、SystemCを用いる方法も知られている。SystemCは、ハードウェアシステムのイベント駆動型シミュレーション用インターフェースを提供するC++言語のクラス定義及びマクロ定義として提供される、HDLの一種である。SystemCでは、ハードウェア記述で必要となる「階層記述」、「並列動作プロセス記述・プロセス起動条件(sensitivity list)」及び「信号結線」を記述することが可能であるため、SystemCを用いて論理回路をRTLで記述することが可能である。加えて、TLM(Transaction Level Modeling)と呼ばれる通信記述と演算処理記述とを分離したSystemC上の記述方式によってシステムの機能をC++言語によるソフトウェア記述で抽象的に表現でき、大規模なシステム・レベル・シミューレーションを実行することが可能である。
SystemCについての詳細は、例えば、非特許文献2に記載されている。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2003−076728号公報
【特許文献2】特開2006−011878号公報
【非特許文献】
【0007】
【非特許文献1】若林一敏、「ソフトウェアプログラムからハードウェア記述を合成する高位合成技術」、IEICE Fundamental Review、2012年、Vol.6、No.1、p.37-50
【非特許文献2】Thorsten Groetker 著、柿本勝、河原林政道、長谷川隆 監訳、「SystemCによるシステム設計」、丸善、2003年、ISBN 4-621-07144-0 C3055
【発明の概要】
【発明が解決しようとする課題】
【0008】
高位合成技術には、次に挙げるような課題がある。
まず、高位合成技術は、高性能・高効率回路を合成するための技術構築・ツール実装が非常に複雑化・大規模化するという課題を有する。高位合成技術が入力対象とするプログラム・コードは、逐次処理手続きを表現しているという点において、CPUで実行されるソフトウェア・プログラム・コードと根本的に同じ構造を有しており、記述上の自由度が非常に高い。こうした自由度の高いソフトウェア記述から、いかに多くの演算並列性を抽出できるかによって、合成される回路の処理性能が決定するため、非常に複雑な並列性解析技術(データ依存解析、制御依存解析、ループ解析、配列参照依存性解析、等)を駆使する必要がある。その結果、前述の「演算スケジューリング・バインディング工程」が非常に複雑化する。
【0009】
また、高位合成技術は、入力対象とするソフトウェア記述の内容の変更によって、RTL記述の内容、すなわち論理回路の状態がどのように変化するか、予測が極めて難しいという課題を有する。上述のとおり「演算スケジューリング・バインディング工程」が複雑であるため、入力されるソフトウェア記述から、出力される回路特性(回路規模、処理時間)を予測することが極めて困難である。そのため、例えば、生成される合成回路の特性がいずれも性能要件を満たさなかった場合には、ソフトウェア記述を変更することで、演算の並列性の増加やメモリ転送量の抑制の効果によって性能要件を充足させる方策(処理時間短縮、回路規模削減)が必要となるが、ソフトウェア記述に加える変更が、合成される回路の特性にどのような影響を与えるかを予測することが困難であるため、ソフトウェア記述の改変作業自体が困難を極める可能性がある。
【0010】
さらに、高位合成技術は、論理回路の構造(アーキテクチャ)が「演算スケジューリング・バインディング工程」に大きく依存するため、設計者のアーキテクチャ上の意図及びノウハウを反映したソフトウェア記述が難しいという課題を有する。このため、高い並列性が要求される処理機能ブロックの設計においては、高位合成技術に頼らない手動設計(ハードウェア記述言語で直接論理構造を記述する設計手法)が今なお主流である。
【0011】
一方、SystemCによる方法には、次のような課題がある。その1つは、SystemCを用いて論理回路をRTLで記述するためには、SystemCで定義されたRTL記述用クラスを用いる必要があり、その記述量はハードウェア記述言語と同程度又はそれ以上であるため、RTL記述による設計生産性向上は非常に限られるということである。また、前述の高位合成技術を用いてTLM記述を自動的にRTL記述に変換するツールは存在するが、このツールを用いる場合には、高位合成技術の課題がそのまま当てはまる。
【0012】
本発明は、このような従来技術の課題を解決するためになされたものであり、回路実装を前提とした特定の情報処理機能をプログラミング言語によって記述して、この記述から論理合成可能なRTL記述を自動的に生成するための装置、方法及びコンピュータ・プログラムを提供することを目的とする。
【課題を解決するための手段】
【0013】
本発明の第1の態様は、回路設計のためのハードウェアの一連の処理の流れである動作記述を記述した論理回路生成対象の最上位関数を含むプログラムを入力に取り、論理回路記述を生成する、論理回路生成装置である。論理回路生成装置は、制御フローグラフ生成部と、制御フロー縮退変換部と、データフローグラフ生成部と、論理回路記述出力部とを備える。
【0014】
制御フローグラフ生成部は、ループ処理部及び関数呼出し命令を含まない最上位関数から、制御フローグラフを生成する。制御フロー縮退変換部は、変数に対する代入命令を各変数につき1つだけ含む前記制御フローグラフから、すべての条件分岐命令を除去することによって、制御フローが縮退されたプログラムである制御フロー縮退プログラムを生成する。データフローグラフ生成部は、制御フロー縮退プログラムから、制御フロー縮退プログラムの各命令をノードとし、各変数への代入命令からその変数を参照する命令への有向枝を付加することによって、データフローグラフを生成する。論理回路記述出力部は、データフローグラフの有向枝が論理回路の配線に対応し、データフローグラフのノードが論理回路の演算器に対応する順序回路を表す論理回路記述を生成する。
【0015】
順序回路の状態を表す状態変数は、プログラムにおいて、最上位関数を呼出す上位階層関数のローカル変数又はスタティック変数として表現され、前記状態変数への代入命令が実行される前の前記状態変数の値が前記順序回路の現状態を表し、前記状態変数への代入命令が実行された後の前記状態変数の値が前記順序回路の次状態を表す。
【0016】
一実施形態において、好ましくは、論理回路生成装置は、静的単一代入形式変換部をさらに備える。静的単一代入形式変換部は、前記最上位関数が、変数に対する代入命令を各変数につき1つだけ含む静的単一代入形式でない場合に、制御フローグラフを、制御フロー縮退変換部に入力される前に、静的単一代入形式に変換する。静的単一代入形式変換部は、φ関数命令挿入部と、変数名変換部と、状態変数名再変換部とを含む。φ関数命令挿入部は、制御フローグラフにおいて同一変数に対する値の定義が複数個合流する箇所に、その箇所に合流する全ての変数定義の中から実際に実行された経路上の変数定義を選択するφ関数命令を挿入する。変数名変換部は、制御フローグラフに含まれる各変数の名前を、変数に対する代入命令ごとに別の名前となるように変換することによって、前記制御フローグラフが名前変換後の各変数につき代入命令を1つだけ含む静的単一代入形式に変換する。状態変数名再変換部は、名前変換後の前記状態変数について、前記制御フローグラフの始点ブロックにおける変数名と終点ブロックに到達する変数名とを一致させるように、変数名を再度変換する。好ましくは、制御フロー縮退変換部は、φ関数命令実体化部を含む。φ関数命令実体化部は、φ関数命令を具体的な演算命令に変換する、
【0017】
一実施形態において、好ましくは、論理回路生成装置は、レジスタ/メモリ配列アクセス命令分解部をさらに備える。レジスタ/メモリ配列アクセス命令分解部は、配列代入命令分解部と、配列参照命令分解部とを含む。配列代入命令分解部は、プログラムに含まれる最上位関数が配列変数に対する書込み処理命令である配列代入命令を含む場合に、各配列変数について、制御フローグラフに書込みデータ変数及び書込みアドレス変数を付加し、各配列代入命令を、配列要素への代入値を前記書込みデータ変数へ代入する命令と、配列インデックス値を前記書込みアドレス変数へ代入する命令と、前記書込みアドレス変数を配列インデックスとすることによって定まる配列要素に前記書込みデータ変数の値を代入する命令とに分解する。配列参照命令分解部は、前記プログラムに含まれる前記最上位関数が配列変数に対する読出し処理命令である配列参照命令を含む場合に、各配列変数について、前記制御フローグラフに読出しアドレス変数を付加し、各配列参照命令を、配列インデックス値を前記読出しアドレス変数へ代入する命令と、前記読出しアドレス変数を配列インデックスとすることによって定まる配列要素を参照する命令とに分解する。好ましくは、論理回路において各配列要素データを保持するためのメモリは、書込みデータ変数がメモリの書込みデータポートに対応し、書込みアドレス変数がメモリの書込みアドレスポートに対応し、読出しアドレス変数がメモリの読出しアドレスポートに対応したものである。制御フローグラフ生成部によって生成された制御フローグラフは、レジスタ/メモリ配列アクセス命令分解部によって処理された後に、制御フロー縮退変換部によって処理される。
【0018】
一実施形態において、さらに好ましくは、前記レジスタ/メモリ配列アクセス命令分解部は、書込みポート番号割当部と、読出しポート番号割当部とをさらに含む。書込みポート番号割当部は、制御フローグラフにおける各配列変数に対する各配列代入命令について、始点ブロックから該配列代入命令までの間に実行される該配列変数への配列代入命令の実行回数の最大値を書込みポート番号として該配列代入命令に割当てる。読出しポート番号割当部は、制御フローグラフにおける各配列変数に対する各配列参照命令について、始点ブロックから該配列参照命令までの間に実行される該配列変数への配列参照命令の実行回数の最大値を読出しポート番号として該配列参照命令に割当てる。好ましくは、前記配列代入命令分解部は、各配列変数について、前記書込みポート番号ごとに、前記書込みデータ変数及び前記書込みアドレス変数を前記制御フローグラフに付加し、かつ、前記読出しポート番号ごとに、前記読出しアドレス変数を前記制御フローグラフに付加する。好ましくは、各配列要素データを保持するためのメモリは、該配列変数の代入命令に割り当てられた書込みポート番号の数と同数の前記書込みポートと、該配列変数の参照命令に割り当てられた読出しポート番号の数と同数の前記読出しポートとを持つ。
【0019】
一実施形態において、さらに好ましくは、論理回路生成装置は、書込みメモリポート数判定部と、読出しメモリポート数判定部とをさらに備える。書込みメモリポート数判定部は、書込みポート番号割当部が割当てた書込みポート番号の数が、予め定められた書込みメモリポート数閾値以下であるか否かを判定する。読出しメモリポート数判定部は、読出しポート番号割当部が割当てた読出しポート番号の数が、予め定められた読出しメモリポート数閾値以下であるか否かを判定する。好ましくは、論理回路生成装置は、書込みメモリポート数判定部が「否」と判定した場合、又は読出しメモリポート数判定部が「否」と判定した場合には、論理回路記述を生成する処理を停止する。
【0020】
一実施形態において、好ましくは、論理回路生成装置に入力されるプログラムは、各変数に属性を付与するための属性記述を含む。属性は、変数のデータのビット幅を指定するビット幅属性と、変数の値をレジスタに保持することを指定するレジスタ属性と、配列変数の配列要素の値をメモリに保持することを指定するメモリ属性とを含む。好ましくは、論理回路生成装置は、レジスタ属性又は前記メモリ属性が付与された変数を状態変数とすることによって状態が表現される順序回路を含む論理回路記述を生成する。
【0021】
一実施形態において、さらに好ましくは、論理回路生成装置は、ビット幅判定部と、演算器回路遅延評価部と、パイプライン境界配置部とをさらに備える。ビット幅判定部は、データフローグラフに含まれる変数に対して、該変数に対する代入命令において参照される変数及び/又は定数のビット幅と該代入命令において実行される演算の種類とから該変数のビット幅を算出する。演算器回路遅延評価部は、データフローグラフに含まれる変数に対して算出されたビット幅に基づいて、演算器の信号伝搬遅延時間を算出する。パイプライン境界配置部は、パイプライン制約抽出部及びパイプライン段数決定部を含む。パイプライン制約抽出部は、データフローグラフにおける状態変数に対する代入命令を実行する演算器と該状態変数に対する参照命令を実行する演算器との間の有向枝にパイプライン境界属性を付加する。パイプライン段数決定部は、クロック同期型パイプライン回路の回路記述を生成するために用いられるパイプライン段数を、パイプライン境界属性に基づく制約によって定まる必要最小のパイプ段数であるパイプライン段数下限値と、指定されたクロック周期から算出したパイプライン段数又は予め指定されたパイプライン段数とに従って決定する。
【0022】
一実施形態において、好ましくは、論理回路生成装置は、論理回路入力信号抽出部と、論理回路出力信号抽出部とをさらに備える。論理回路入力信号抽出部は、最上位関数の引数及びグローバル変数から、回路記述によって記述されることになる回路の入力信号を抽出する。論理回路出力信号抽出部は、最上位関数の引数及び戻り値並びにグローバル変数から、回路記述によって記述されることになる回路の出力信号を抽出する。
【0023】
一実施形態において、好ましくは、論理回路生成装置は、非循環・非階層変換部をさらに備える。完全インライン展開部は、最上位関数が関数呼出し命令を含む場合に、それぞれの関数呼出し命令をインライン展開することによって、最上位関数を、関数呼出し命令を含まない最下層関数に変換する。完全ループ展開部は、完全インライン展開部によって変換された最下層関数が固定繰返し回数のループ処理部を含む場合に、それぞれの固定繰返し回数のループ処理部をループ展開することによって、最下層関数を、ループ処理部を含まない非循環型最下層関数に変換する。好ましくは、論理回路生成装置に入力されたプログラムは、非循環・非階層変換部によって非循環型最下層関数に変換された後に、制御フローグラフ生成部に入力される。
【0024】
一実施形態において、さらに好ましくは、完全インライン展開部は、入力された関数に対してインライン展開を所定の回数繰返しても関数呼出し命令が完全に展開されない場合には、該関数を最下層関数に変換不可能であると判断して処理を中止するように構成され、完全ループ展開部は、入力された関数に繰返し回数が定数ではないループ処理部が含まれる場合には、該関数を非循環型最下層関数に変換不可能であると判断して処理を中止するように構成される。好ましくは、論理回路生成装置は、完全インライン展開可能性判定部が処理を中止した場合、又は完全ループ展開可能性判定部が処理を中止した場合には、論理回路記述を生成する処理を停止する。
【0025】
一実施形態において、好ましくは、論理回路生成装置は、状態変数命令依存性判定部をさらに備える。状態変数命令依存性判定部は、制御フローグラフにおいて、同一の前記状態変数に対して代入命令・参照命令・代入命令がこの順序で連続して実行される場合がないか否を判定する。好ましくは、論理回路生成装置は、状態変数命令依存性判定部が「否」と判定した場合には、論理回路記述を生成する処理を停止する。
【0026】
本発明の第2の態様は、回路設計のためのハードウェアの一連の処理の流れである動作記述を記述した論理回路生成対象の最上位関数を含むプログラムを入力に取り、論理回路記述を生成する、論理回路生成装置によって行われる、論理回路生成方法である。
【0027】
本発明の第3の態様は、本発明の第2の態様は、回路設計のためのハードウェアの一連の処理の流れである動作記述を記述した論理回路生成対象の最上位関数を含むプログラムを入力に取り、論理回路記述を生成する、論理回路生成装置によって行われる、論理回路生成方法の各ステップをコンピュータに実行させるための論理回路生成コンピュータ・プログラムである。
【発明の効果】
【0028】
本発明の装置、方法及びコンピュータ・プログラムによれば、記述の自由度が高いソフトウェア記述から論理合成可能なRTL記述を自動的に生成することができるため、高品質、高効率な大規模集積回路を、短期間、低コストで設計、開発及び検証することができる。
【図面の簡単な説明】
【0029】
図1】本発明の一実施形態に係る論理回路生成装置1の機能を示す例示的な機能ブロック図である。
図2】本発明の一実施形態に係る論理回路生成装置1の例示的なハードウェア構成を示す図である。
図3】本発明のソフトウェア記述における、データ型の別名定義の記述例を示す図である。
図4】本発明のソフトウェア記述における、データ型に対して変数属性を付加する記述例を示す図である。
図5】本発明のソフトウェア記述における、同じ関数を異なる変数属性を持つ引数で呼出すプログラムの記述例、及びそのプログラムに対応するパイプライン回路図を示す図である。
図6】本発明のソフトウェア記述における、スタティック変数を用いた順序回路の状態遷移の記述例、及びその順序回路の状態遷移図を示す図である。
図7】本発明のソフトウェア記述における、メモリ属性変数を用いた画像処理用ラインバッファ及びシフトレジスタ回路の記述例、及び対応するパイプライン回路図を示す図である。
図8図7のラインバッファ更新の動作を記述した、本発明のソフトウェア記述によるソフトウェア記述及び従来技術におけるRTL記述を示す図である。
図9】再帰的関数呼出しの記述例を示す図である。
図10】本発明の論理回路生成装置及び方法における、図9に示される関数をインライン展開した結果を示す図である。
図11】本発明の論理回路生成装置及び方法における、図10に示される関数に定数伝播による最適化を適用した結果を示す図である。
図12】本発明の回路生成方法における工程における、図9に示される関数を完全インライン関数展開した結果を示す図である。
図13】本発明の論理回路生成装置及び方法における、完全ループ展開の具体例を示す図である。(a1)は、定数回繰返しのループ処理部を含む関数の例を表す。(a2)は、(a1)の関数に対応する制御フローグラフを表す。(b1)は、(a1)の関数を完全ループ展開した結果を表す。
図14】本発明の論理回路生成装置及び方法における、メモリ配列アクセス命令の分解の具体例を示す図である。(a)は、メモリ配列アクセス命令を含む関数の例を表す。(b)は、(a)に含まれるメモリ配列アクセス命令を、ポート変数を用いて分解した結果のソフトウェア記述を表す。
図15】本発明の論理回路生成装置及び方法における、SSA変換手順の具体例を示す図である。(a)はソフトウェア記述の例、(b)は(a)のソフトウェア記述に対応する制御フローグラフ、(c)はφ関数命令を挿入した結果の制御フローグラフ、(d)は代入される変数の変数名を変換した結果の制御フローグラフ、(e)は参照される変数の変数名を変換した結果の制御フローグラフ、(f)は状態変数の変数名を再変換した結果の制御フローグラフを表す。
図16】本発明の論理回路生成装置及び方法における、メモリ配列アクセス命令を含むプログラムの制御フローグラフの具体例を示す図である。(a)は、図14(b)のソフトウェア記述に対応する制御フローグラフを表す。(b)は、(a)の制御フローグラフをSSA変換した後の制御フローグラフを表す。
図17図15(f)の制御フローグラフに対して、本発明の論理回路生成装置及び方法における、φ関数命令の実体化による制御フロー縮退化変換処理を施した結果を示す図である。
図18】本発明の論理回路生成装置及び方法における、レジスタ/メモリ配列アクセス命令を含んだ制御フロー縮退化変換処理の具体例を示す図である。(a)は、SSA変換後の制御フローグラフである図16(b)の制御フローグラフに対応するソフトウェア記述を表す。(b)は、(a)のソフトウェア記述に制御フロー縮退後処理を施した結果のソフトウェア記述を表す。
図19図17の制御フロー縮退プログラムから生成されるデータフローグラフを示す図である。
図20図18(b)の制御フロー縮退プログラムから生成されるデータフローグラフを示す図である。
図21】定数乗算を伴うプログラムのソフトウェア記述の具体例を示す図である。
図22】本発明の論理回路生成装置及び方法における、除算の分解の具体例及び結果を示す図である。
図23図24のデータフローグラフに対応するソフトウェア記述を示す図である。
図24】本発明の論理回路生成装置及び方法における、定数乗算分解、定数伝播及び共通部分式除去の処理の具体例を示す図である。
図25】論理回路の最大信号伝播時間と、論理回路に含まれる演算器の入出力信号との関係を模式的に示す図である。
図26】本発明の論理回路生成装置及び方法の演算器回路遅延モデルを模式的に示す図である。
図27】本発明の論理回路生成装置及び方法の演算器回路遅延モデルにおける、演算器の各入力信号の伝播時間と、演算器の伝播遅延と、出力信号の伝播時間との関係を模式的に示す図である。
図28】2入力1出力マルチプレクサの入力信号と出力信号との関係を示す図である。
図29】本発明の論理回路生成装置及び方法の一実施形態において想定される、Booth recoder 器の回路図、入力信号の決定方法、及び、入力信号と出力信号との関係を示す図である。
図30】本発明の論理回路生成装置及び方法の一実施形態において想定される、同値比較否定器を示す回路図である。
図31】本発明の論理回路生成装置及び方法の一実施形態において想定される、シフト演算器の回路図、及び、入力信号と出力信号との関係を示す図である。
図32】レジスタ変数の代入前参照命令及び代入後参照命令を含むプログラムのソフトウェア記述の具体例を示す図である。
図33図32のプログラムから生成されるパイプライン回路を表現するデータフローグラフを示す図である。
図34図33のデータフローグラフに対してレジスタ変数更新命令ノード群グループ化処理を行った結果のデータフローグラフを示す図である。
図35】本発明の論理回路生成装置及び方法における、パイプライン回路合成処理の流れを示すフロー図である。
図36】3つのパイプライン境界枝が1つの経路上に存在するデータフローグラフの例を模式的に示した図である。
図37】本発明の論理回路生成装置及び方法における、SA法を用いてパイプライン境界の局所変更処理の制御の流れを示すフロー図である。
図38】本発明の論理回路生成装置の1つの実施形態を示す図である。
図39】本発明の論理回路生成装置の1つの実施形態を示す図である。
図40】本発明の論理回路生成装置の1つの実施形態を示す図である。
図41】本発明の論理回路生成装置の1つの実施形態を示す図である。
図42】本発明の論理回路生成装置の1つの実施形態を示す図である。
図43】本発明の論理回路生成装置の1つの実施形態を示す図である。
図44】本発明の論理回路生成装置の1つの実施形態を示す図である。
【発明を実施するための形態】
【0030】
以下に、図面(図1図37)を用いて本発明の一実施形態を説明する。図1は、本発明の一実施形態に係る論理回路生成装置1の機能を示す例示的なブロック図を示す。図1に示されるように 、論理回路生成装置1は、論理回路生成対象の最上位関数Ftopを含むプログラムPを入力として用い、論理回路を表現する論理回路記述Dを出力することができる。論理回路生成装置1は、
・非循環・非階層変換部21
・論理回路入出力信号抽出部22
・制御フローグラフ生成部23
・状態変数命令依存性判定部24
・レジスタ/メモリ配列アクセス命令分解部25
・メモリポート数判定部26
・静的単一代入形式変換部27
・制御フロー縮退変換部28
・データフローグラフ生成部29
・データフローグラフ最適化部30
・演算器の回路遅延・回路規模評価部31
・パイプライン境界配置部32
・RTL記述出力部33
を含むものとすることができる。以下に、これらの概要を説明するが、各部において行われる詳細な処理の内容については、図8図37を参照して後述される。
【0031】
非循環・非階層変換部21は、論理回路生成装置1に入力されたプログラムPに含まれる論理回路生成対象の最上位関数Ftopを、ループ処理部及び関数呼出し命令を含まない形式の非循環型最下層関数Fexpに変換する。
【0032】
論理回路入出力信号抽出部22は、非循環型最下層関数Fexpの引数及びプログラムPのグローバル変数から、論理回路生成装置1が生成する論理回路の入力信号及び出力信号を抽出する。
【0033】
制御フローグラフ生成部23は、非循環型最下層関数Fexpから、制御フローグラフFcfgを生成する。
【0034】
状態変数命令依存性判定部24は、制御フローグラフFcfgにおいて、同一の状態変数(state variable)に対して、代入命令、参照命令、代入命令がこの順序で連続して実行される場合がないか否かを判定する。状態変数命令依存性判定部24が「否」と判定した場合には、論理回路生成装置1は、論理回路記述を生成する処理を停止するようにすることができる。
【0035】
レジスタ/メモリ配列アクセス命令分解部25は、制御フローグラフFcfgに含まれる配列代入命令に書込みポート番号を割当て、データ入力ポート及びアドレス入力ポートに対応した変数を制御フローグラフFcfgに追加することによって配列代入命令を細分化する。また、レジスタ/メモリ配列アクセス命令分解部25は、配列参照命令に読出しポート番号を割当て、アドレス入力ポートに対応した変数をFcfgに追加することによって配列参照命令を細分化する。
【0036】
メモリポート数判定部26は、レジスタ/メモリ配列アクセス命令分解部25において配列代入命令に割当てられた書込みポート番号の数及び配列参照命令に割当てられた読出しポート番号の数がそれぞれ予め定められた閾値以下であるか否かを判定する。メモリポート数判定部26が「否」と判定した場合には、論理回路生成装置1は、論理回路記述を生成する処理を停止するようにすることができる。
【0037】
静的単一代入形式変換部27は、制御フローグラフFcfgを、そこに含まれる各変数につき代入命令を1つだけ含む形式である静的単一代入形式に変換する。
【0038】
制御フロー縮退変換部28は、静的単一代入形式の制御フローグラフFcfgから全ての条件分岐命令を除去することによって、制御フローが縮退されたプログラムである制御フロー縮退プログラムFdegを生成する。
【0039】
データフローグラフ生成部29は、制御フロー縮退プログラムFdegから、データフローグラフFdfgを生成する。
【0040】
データフローグラフ最適化部30は、データフローグラフFdfgを最適化する。
【0041】
演算器の回路遅延・回路規模評価部31は、データフローグラフFdfgに基づいて、論理回路生成装置1が生成する論理回路の回路遅延及び回路評価を見積る。
【0042】
パイプライン境界配置部32は、データフローグラフFdfgにパイプライン境界を配置することによって、パイプライン回路データFplcを合成する。
【0043】
RTL記述出力部33は、パイプライン回路データFplcに基づいて論理回路記述Dを生成して出力する。この論理回路記述Dが、論理回路生成装置1の出力となる。
【0044】
図2は、本発明の一実施形態に係る論理回路生成装置1の例示的なハードウェア構成を示す。論理回路生成装置1は、中央処理装置(CPU)11と、中央処理装置が実行する各種のプログラムやデータなどを格納するRAM12、ROM13、ハードディスクドライブ(HDD)14などの記憶装置と、これらの装置を互いに接続するバス10とを有する汎用コンピュータを用いて実現することができる。さらに、論理回路生成装置1には、必要に応じて、CD−ROM又はDVD−ROMなどの外部記録媒体との間でデータの入出力を行うドライブ装置15と、キーボード又はマウスなどの入力装置16と、CRT、液晶ディスプレイ又はプリンタなどの出力装置17と、他のコンピュータ又はネットワークと通信するための通信インターフェース18と、を接続するようにしてもよい。
【0045】
本発明の一実施形態においては、論理回路生成装置1は、プログラムPを、ドライブ装置15、入力装置16、又は通信インターフェース18から入力することができる。論理回路生成装置1に入力されたプログラムPは、RAM12に格納することができる。RAM12にはさらに、図1に示す論理回路生成装置1の各部の機能をCPU11に実行させるための別のプログラム4(図示せず)を格納することができる。CPU11は、プログラム4に従ってRAM12に格納されたプログラムPを処理し、結果として論理回路記述Dを生成することができる。CPUがプログラムPを処理する過程で生成する制御フローグラフFcfg、制御フロー縮退プログラムFdeg、データフローグラフFdfg及びパイプライン回路データFlcdなどの各種中間データ、並びに最終的に生成する論理回路記述Dもまた、RAM12に格納することができる。RAM12に格納された論理回路記述Dは、ドライブ装置15、出力装置17、又は通信インターフェース18から出力することができる。
【0046】
ここで、図3図7を参照して、本発明による論理回路生成装置又は論理回路生成方法の入力として用いるプログラムPについて、1つの実施形態として、C言語によって記述されたプログラムの例を用いて説明する。本明細書においては、回路設計のためのハードウェアの一連の処理の流れである動作記述を記述した、本発明による論理回路生成装置又は論理回路生成方法の入力として用いるプログラムPの記述を、本発明のソフトウェア記述と称することとする。
【0047】
[データ型の別名定義]
C言語では、 typedef 指定子を用いて、定義済みのデータ型に対する別名データ型を定義することができる。図3は、本発明のソフトウェア記述における、データ型の別名定義の記述例を示す図である。この記述例において、 INT10 型及び INT12 型は int 型に対する別名データ型であり、 S_INT12 型及び M_INT12 型は INT12 型に対する別名データ型である。また、 SA_T 型は、 a(char 型)、 b(INT10 型)及び c(INT12 型)をメンバー変数として持つ構造体に対する別名データ型である。
【0048】
[データ型への変数属性の付加]
図4は、本発明のソフトウェア記述における、データ型に対して変数属性を付加する記述例を示す図である。この記述例においては、 #pragma 文を用いて変数属性をC言語のソースコード上で記述しているが、別の実施形態においては、例えば、型名と変数属性との対応関係を記述したファイルを読み込む方法、ユーザ・インターフェースによってこれらの情報を入力する方法など、他の方法を用いてもよい。
【0049】
図4をより詳細に見ると、データ型に対して、変数属性であるビット幅属性、メモリ属性、及びレジスタ属性を付加する記述が示されている。具体的には、 INT10 型に10ビット幅のビット幅属性、 INT12 型に12ビット幅のビット幅属性、 M_INT12 型にメモリ属性、 S_INT12 型及び ST_A 型にレジスタ属性を、それぞれ付加している。
【0050】
さらに、 S_INT12 型及び M_INT12 型は INT12 型の別名であるので、 S_INT12 型と M_INT12 型にも12ビット幅のビット幅属性が暗示的に付加される。また、 ST_A 型は、 char 型の a 、 INT12 型の b 、及び INT10 型の c の3つのメンバー変数からなる構造体であるので、 ST_A 型に明示的に付加されているレジスタ属性が、これら3つのメンバー変数 a,b,c にも暗示的に付加される。このように、データ型の別名定義手段と各データ型に対する属性情報の記述手段とを組み合わせたことを特徴とする変数属性の記述方式によって、論理回路生成で必要となる様々な付加情報を、少ない記述量で効率的にソフトウェア記述に対応付けることが可能となる。
【0051】
[データ型へのビット幅属性付加による設計再利用性向上]
図5は、本発明のソフトウェア記述における、同じ関数を異なる変数属性を持つ引数で呼出すコードの記述例、及びそのプログラムに対応するパイプライン回路図を示す図である。この記述例においては、関数 top0 が論理回路生成対象関数であり、10ビット幅の引数 a,b と12ビット幅の引数 c とが入力として供給され、 INT12 型の戻り値が出力となる。なお、入力及び出力の判別方法は後述する。また、 S_INT12 型のローカル変数 d には、12ビット幅属性及びレジスタ属性が付加されている。関数 top0 の内部で2度呼び出される関数 func0 に与えられる引数は、1度目の呼び出しにおいては10ビット幅であるが、2度目においては12ビット幅であり、同じ関数記述で違うビット幅の回路を表現することができる。このようなビット幅の調整をハードウェア記述言語やSystemCで行う場合は明示的なビット幅指定記述が必要であるが、本発明による型への変数属性付加記述方式を用いることにより、ビット幅が暗示的に指定できるので、設計の再利用性が大幅に向上する。
【0052】
[レジスタ属性付加によるタイミング情報の暗示的指定]
図5の記述例において、変数 d はレジスタ属性を持つ。一般に、レジスタ属性は、ソフトウェア記述の動作を何ら変更することはないが、この属性を持つ変数が論理回路においてレジスタとして実装されることを指定する。論理回路におけるレジスタの動作の特徴は、クロック信号の立上り(即ち、0から1への遷移)の瞬間のみに、レジスタ入力信号がレジスタ出力信号に伝播する点にあり、この特徴によって、レジスタが、順序回路の内部状態を状態変数として保持することが可能になる。そのため、レジスタ属性を持つ変数は、値を代入してからその値を読み出せるようになるまでに、1クロック以上の経過が必要である。従って、図5の記述において、1度目に呼び出される func0 の戻り値を d に代入してから、1クロック後に d が参照できるようになり、その値を用いて呼び出される2度目の func0 の結果は1クロック遅れて出力されることになる。このように、時間概念が無いソフトウェア記述にレジスタ属性を付加することによって、論理回路動作で重要なタイミング情報を暗示的に付加することができる。なお、変数 c は変数 a 及び b と同時刻に入力されるため、2番目の func0 の引数 d に引数 c を同期する必要があるが、そのためのレジスタの挿入は、後述するように、論理回路生成処理において自動的に行われる。このように、レジスタ属性を付加することにより、ソフトウェア記述を変更することなく論理回路動作のタイミングを自由自在に調整できるようになる。
【0053】
[スタティック変数を用いた順序回路の記述]
図6は、本発明のソフトウェア記述における、スタティック変数を用いた順序回路の状態遷移の記述例、及びその順序回路の状態遷移図を示す図である。この記述例においては、スタティック変数 stt に2ビット幅属性とレジスタ属性とを付加し、順序回路の状態変数として用いている。順序回路の状態変数の動作をソフトウェア記述で表現するためには、関数 top1 の1回の実行の後もこの状態変数の値を保持し続ける必要があるために、状態変数はスタティック変数として宣言する必要がある。また、この状態変数にレジスタ属性を付加することによって、この順序回路の状態変数がレジスタで実装されることが指定される。 stt の宣言文における 0 への初期化はプログラム起動前に(論理回路においては、リセット動作時に)1度だけ行われ、関数 top1 が実行されるたびに入力 a の値によって変数 stt の値が更新されていく。また、変数 prev_stt へ代入する stt の値、及び switch 文の stt の値は、 stt が更新される前の値である。このようにして、論理回路における最も重要な構成要素の一つである順序回路の状態遷移を、ソフトウェア記述のスタティック変数によって非常に簡単に記述できる。
【0054】
[メモリ属性変数を用いたメモリ回路を含む記述]
図7は、本発明のソフトウェア記述における、メモリ属性変数を用いた画像処理用ラインバッファ及びシフトレジスタ回路の記述例、及び対応するパイプライン回路図を示す図である。この記述例において、関数 top2 は、8ビット幅のデータ pin を入力し、3×3の配列データ pw[3][3] を出力する関数である。この関数は、ラスタースキャン方式の画像データに対する空間フィルタ処理などで必要となる周辺画素データを、ラインバッファ(垂直方向の「遅延回路」として、水平方向1ライン分の画素データを保存するバッファ)とシフトレジスタ(水平方向の「遅延回路」)とによって生成している。
【0055】
より具体的には、ラインバッファは、2つのメモリ属性配列変数 lbuf1[1024] 及び lbuf2[1024] によって実現され、これらの配列への共通インデックスに10ビット幅の状態変数 pos が用いられている。 lb1 = lbuf1[pos] などのメモリ属性配列の参照がメモリ読出しを表現し、 lbuf1[pos] = pin などのメモリ属性配列への代入がメモリ書込みを表現する。また、シフトレジスタは、 pw[0][2] = pw[0][1] など、状態変数配列 pw[3][3] をシフトする一連の命令によって実現される。一方、状態属性を持たない変数 lb1, lb2 などは、データを瞬時転送する信号を表現するために用いられている。
【0056】
メモリにはクロック同期の有無によって同期型と非同期型との2種類が存在するが、現在では高速性を優先してほとんど同期型メモリが使われているため、ここでは同期型メモリを想定する。図8は、図7のラインバッファ更新を記述した、本発明のソフトウェア記述(上段)及び従来技術におけるRTL記述(下段)を示す図である。より具体的には、図8は、図7における2つのラインバッファの更新処理(同アドレスへの同時読出し・書込み)部分のソフトウェア記述と、同じ動作のVerilogハードウェア記述言語によるRTL記述を示す。同期型メモリの回路動作では、読出しデータは1クロック遅れて有効になるため、 lbuf1 の読出し(lb1 = lbuf1[pos])の1クロック後に lbuf2 の書込み(lbuf2[pos] = lb1)が行われる必要がある。また、ラインバッファでは、同じアドレスに対する読出し及び書込みを同時に行う必要があるため、 lbuf2 の読出しも書込みのタイミングに合わせて1クロック遅らせる必要がある。 lbuf2 の読出しデータ(lb2 = lbuf2[pos])は、 lbuf1 からさらに1クロック遅れて有効になる。こうしたタイミングのずれは、これらのデータを参照する後段回路の動作タイミングにも影響を及ぼすが、RTL記述では上記のタイミングを正確に表現する必要がある。一方、本発明のソフトウェア記述では、このような詳細なタイミングを気にすることなく、データの流れだけを表現するだけで良い。即ち、本発明の技術であるプログラミング言語による論理回路記述方式は、詳細な回路動作タイミングを隠蔽した上で、データの流れだけを表現することを可能にした記述方式であり、このことによって、記述の可読性が格段に向上するだけでなく、設計不具合要因を格段に減らすことができるため、この点においてもRTL記述と比べて設計生産性が飛躍的に向上する。
【0057】
[最上位関数の指定]
本発明のソフトウェア記述において論理回路生成の対象となる部分は、ソフトウェア記述全体とすることもできるが、論理回路生成の対象となる最上位関数を指定することによって定めることもできる。本実施形態においては、図示しないが、最上位関数を指定するための #pragma 文をソフトウェア記述内に記述することによって、論理回路生成の対象を定めている。別の実施形態においては、例えば、最上位関数の関数名を記述したファイルを読み込む方法、ユーザ・インターフェースによって論理回路生成の対象の範囲を指定する方法など、他の方法を用いてもよい。
【0058】
以上、本発明による論理回路生成装置又は論理回路生成方法の入力として用いるプログラムPの記述であるソフトウェア記述の特徴について、C言語によって記述された例を用いて説明したが、これらの特徴を表現できるものである限り、C言語以外の手続型言語、又は関数型言語若しくはオブジェクト指向言語など、種々のソフトウェア記述言語によっても、本発明による論理回路生成装置又は論理回路生成方法の入力として用いるプログラムPを同様に記述することができることが、当業者にとっては容易に理解されるであろう。
【0059】
次に、図9図37を参照して、図1に示される本実施形態における論理回路生成装置1の各部を詳述する。
【0060】
[非循環・非階層変換部21]
論理回路生成装置1に入力されたプログラムPは、最初に、非循環・非階層変換部21に入力される。非循環・非階層変換部21は、プログラムPに含まれる論理回路生成対象の最上位関数Ftopに対して非循環・非階層変換を行って、ループ処理部及び関数呼出し命令を含まない関数である非循環型最下層関数Fexpを出力する。
【0061】
より具体的には、非循環・非階層変換部21は、次に説明する完全インライン展開部211と完全ループ展開部212とを含む。非循環・非階層変換部21に入力された最上位関数Ftopは、まず、完全インライン展開部211に入力されて、関数呼出し命令を含まない形式の関数である最下層関数に変換される。最下層関数は、さらに、完全ループ展開部212に入力されて、非循環型最下層関数に変換される。
【0062】
完全インライン展開部211は、入力された関数を、関数呼出し命令を含まない形式の関数である最下層関数に変換する。関数を最下層関数に変換する処理を、完全インライン展開と呼ぶ。完全インライン展開部211は、入力された関数に対して、関数呼出し命令のインライン展開を繰返す。これによって、再帰的でない関数を呼出す命令は、完全に展開される。さらに、完全インライン展開部211は、関数呼出しのインライン展開を繰返す過程において、必要に応じて、定数伝播による最適化を実行する。これによって、再帰的な関数であっても、再帰呼出し回数の上限が特定できるものであれば、それを呼出す命令は完全に展開される。
【0063】
完全インライン展開部211は、インライン展開の繰返しを所定の回数行っても関数呼出し命令が完全に展開されない場合に、関数を最下層関数に変換不可能であると判断して、処理を中止するようにすることができる。この場合には、論理回路生成装置1は、例えば、出力装置17に警告メッセージを出力し、論理回路生成処理を停止するようにすることができる。
【0064】
図9図12を参照して、関数を完全インライン展開する処理について、具体例を用いて説明する。図9は、再帰的関数呼出しの記述例を示す。この記述例において、関数 funcB は、関数 funcB 自身を呼出す命令を含んでいるため、再帰的関数である。関数 funcA は、再帰的関数である関数 funcB を呼出す命令を含む関数である。この例における関数 funcA を完全インライン展開する処理を考える。図10は、 funcA に含まれる関数呼出し funcB(4) をインライン展開した結果の関数 funcA を示す。ここで、変数 funcB_0 は、関数呼出し funcB(4) の戻り値を格納するために導入された変数である。図11は、図10の関数 funcA に定数伝播による最適化を適用した結果を示す。具体的には、図10において、変数 a は、定数 4 が代入された後、そのまま2ヶ所で参照されているので、これら変数 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) は偽と評価されるので、条件演算式は第3項、即ち
funcB(4 - 1) + 1
に簡単化され、さらに式 4 - 1 は定数式 3 に簡単化される。その結果、図11の関数 funcA が得られる。得られた関数 funcA に対して、さらに、関数 funcB を呼出す命令のインライン展開、及び定数伝播による最適化を、再帰呼出しが発生しない a == 1 の条件が成立するまで繰返し適用する。その結果、図12に示されるように、関数呼出し命令を含まない形式の関数、即ち最下層関数が得られる。
【0065】
以上に説明されたように、完全インライン展開部211は、入力された関数を、関数呼出し命令を含まない形式の関数である最下層関数に変換する。入力された関数が関数呼出し命令を含まないものである場合には、完全インライン展開部211は、その入力された関数をそのまま出力する。
【0066】
完全ループ展開部212は、入力された最下層関数を、ループ処理部を含まない非循環型最下層関数に変換する。これは、関数に含まれる全てのループ処理部を展開することによって行われ、この処理を完全ループ展開と呼ぶ。
【0067】
図13を参照して、最下層関数を非循環型最下層関数に変換する処理について、具体例を用いて説明する。図13(a)の関数 funcD は、ループ処理部を含む関数である。このループ処理部におけるループ繰返し回数は3回である。繰返しの1回目においては、変数 i の値は定数値 0 である。即ち、このループ処理部の繰返しの1回目は
i = 0; a += a * i + 1;
と展開され、これに定数伝播の最適化を適用することによって
a += a * 0 + 1;
が得られる。繰返しの2回目及び3回目においてもそれぞれ同様に
a += a * 1 + 1;
a += a * 2 + 1;
が得られる。その結果、図13(b)に示されるように、ループ処理部を含まない形式の関数 funcD が得られる。
【0068】
以上に説明されたように、完全ループ展開部212は、入力された最下層関数を、ループ処理部を含まない非循環型最下層関数に変換する。入力された最下層関数がループ処理部を含まないものである場合には、完全ループ展開部212は、その入力された最下層関数をそのまま出力する。
【0069】
なお、本発明の別の実施形態においては、論理回路生成装置1は、非循環・非階層変換部21を含まないものとすることができる。この場合の論理回路生成装置1は、最上位関数Ftopが非循環型最下層関数であるプログラムPを入力に取る。
【0070】
[論理回路入出力信号抽出部22]
非循環・非階層変換部21によって非循環型最下層関数Fexpに変換された最上位関数Ftopを含むプログラムPは、次いで、論理回路入出力信号抽出部22に入力される。論理回路入出力信号抽出部22は、入力された非循環型最下層関数Fexpの引数及び戻り値並びにプログラムPに含まれるグローバル変数から、論理回路生成装置1が出力する論理回路記述Dによって表現される論理回路の入力信号及び出力信号を抽出する。
【0071】
より具体的には、論理回路入出力信号抽出部22は、次に説明する論理回路入力信号抽出部221と論理回路出力信号抽出部222とを含む。論理回路入力信号抽出部221は、非循環型最下層関数Fexpの引数及びプログラムPに含まれるグローバル変数から入力信号を抽出し、論理回路出力信号抽出部222は、入力された非循環型最下層関数Fexpの引数及び戻り値並びにプログラムPに含まれるグローバル変数から出力信号を抽出する。
【0072】
論理回路入力信号抽出部221は、非循環型最下層関数Fexpの引数及びプログラムPに含まれるグローバル変数から入力信号を抽出する。論理回路入力信号抽出部221は、具体的には、次の(1)〜(3)に挙げるものを入力信号と判別して抽出する。なお、ここで「引数」とは非循環型最下層関数Fexpの引数のことであり、「関数」とは非循環型最下層関数Fexpのことである。
(1)非ポインタ型の引数。
(2)関数内部でポインタ参照を介した値参照があり、かつ、ポインタ参照を介した値代入がないポインタ型の引数が参照する実体変数。
(3)関数内部で値参照があり、かつ、値代入がないグローバル変数。
【0073】
論理回路出力信号抽出部222は、入力された非循環型最下層関数Fexpの引数及び戻り値並びにプログラムPに含まれるグローバル変数から出力信号を抽出する。具体的には、論理回路出力信号抽出部222は、次の(1)〜(3)に挙げるものを出力信号と判別して抽出する。なお、ここで「引数」とは非循環型最下層関数Fexpの引数のことであり、「関数」とは非循環型最下層関数Fexpのことである。
(1)関数の戻り値。
(2)関数内部でポインタ参照を介した値代入があるポインタ型の引数が参照する実体変数。
(3)関数内部で値代入があるグローバル変数。
【0074】
図5図7を参照して、論理回路入力信号抽出部221及び論理回路出力信号抽出部222が入力信号及び出力信号をそれぞれ抽出する処理について、具体例を用いて説明する。
図5の関数 top0 においては、非ポインタ型である引数 a, b, c が入力信号と判別され、戻り値の計算式が出力信号と判別される。この例においては戻り値は変数 e であるが、一般には、関数の戻り値は変数単独でない一般式となり得る。
図6の関数 top1 においては、非ポインタ型である引数 a が入力信号と判別され、戻り値の計算式である prev_stt が出力信号と判別される。なお、関数内スタティック変数 stt は、関数外部からは参照できないので、論理回路内部の信号と判別され、入出力信号とはならない。
図7の関数 top2 のおいては、非ポインタ型である引数 pin が入力信号と判別される。引数 pw は、ポインタ型であり、また関数内部にポインタ参照を介した値代入(pw[0][0] = pin 等)が存在するので、9つの配列要素すべてが出力信号と判別される。このポインタ型引数 pw が参照する配列の実体を含む変数は、関数 top2 を呼出す関数(図示せず)によって指定されるが、これはスタティック変数(グローバル変数を含む。)であってもよく、又は関数 top2 を直接的若しくは間接的に呼出す上位階層関数のローカル変数であってもよい。
【0075】
[制御フローグラフ生成部23]
制御フローグラフ生成部23は、非循環・非階層変換部21によって得られた非循環型最下層関数Fexpから、その制御フローグラフFcfgを生成する。
一般に、関数の制御フローグラフとは、その関数を実行したときの経路を有向グラフで表現したものである。制御フローグラフのノード(節点)には、基本ブロック、始点ブロック及び終点ブロックがある。基本ブロックは、先頭命令以外に分岐先がなく、終端命令以外に分岐命令がない、逐次命令列である。始点ブロックは、関数入口に対応するノードであり、関数の実行はここから開始される。終点ブロックは、関数出口に対応するノードであり、関数の実行はここに到達すると終了する。制御フローグラフのエッジ(枝)は、関数の実行についてノード間の直接の遷移を表す有向枝である。
関数からその制御フローグラフを生成する処理は公知の技術であるため、ここではその具体的方法についての説明を省略する。制御フローグラフ生成部23によって非循環型最下層関数Fexpから生成される制御フローグラフFcfgは、ループ構造を含まない(即ち、1つのノードを複数回通過する経路がグラフ内に存在しない)ものとなるが、最上位関数Ftopに条件分岐命令が含まれる場合には、制御フローグラフFcfgは経路の条件分岐(及びそれに伴う合流)を含むことになる。
【0076】
[状態変数命令依存性判定部24]
状態変数命令依存性判定部24は、制御フローグラフ生成部23で生成された制御フローグラフFcfgについて、以下に説明する論理回路生成可能判定規則1及び2によって論理回路生成の可能性を判定する。これらの規則のいずれかによって論理回路生成が可能でないと状態変数命令依存性判定部24が判定した場合には、論理回路生成装置1は、例えば、出力装置17に警告メッセージを出力し、論理回路生成処理を停止するようにすることができる。
【0077】
論理回路生成可能性判定規則1は、各配列変数への代入命令について、配列インデックスが定数でない変数であり、かつ、その配列変数がレジスタ属性またはメモリ属性を持たない場合に、論理回路生成が可能でないと判定する規則である。そうした変数が制御フローグラフFcfgに含まれる場合には、変数命令依存性判定部24は、論理回路生成が可能でないと判定する。
【0078】
論理回路生成可能性判定規則2は、レジスタ/メモリ配列変数(レジスタ属性又はメモリ属性を持つ配列変数をいう。)である各変数Xについて、命令Aから命令Bに対する変数Xの read-after-write 依存性があり、かつ、命令Bから命令Cに対する変数Xの write-after-read 依存性があるような関係にある命令A、B、Cが存在する場合に、論理回路生成が可能でないと判定する規則である。この場合においては、命令AによるXへの代入、命令BによるXの参照、及び命令CによるXへの代入が連続して実行されることになるが、このようなソフトウェア記述は1クロックの回路動作として実現できないため、論理回路生成が可能でないと判断するのである。こうした関係にある命令が制御フローグラフFcfgに含まれる場合には、変数命令依存性判定部24は、論理回路生成が可能でないと判定する。
【0079】
なお、本発明の別の実施形態においては、論理回路生成装置1は、状態変数命令依存性判定部24を含まないものとすることができる。いずれの場合にも、論理回路生成装置1が入力に取るプログラムPは、上記の論理回路生成可能性判定規則1及び2を満たす制御フローグラフに変換される最上位関数Ftopを含むものに限られる。
【0080】
[レジスタ/メモリ配列アクセス命令分解部25]
レジスタ/メモリ配列変数(レジスタ属性又はメモリ属性を持つ配列変数をいう。)に対する複数の読出し命令及び複数の書込み命令をそれぞれ1クロックで実行するためには、レジスタ配列変数(レジスタ属性を持つ配列変数をいう。)はマルチポートレジスタファイルを用いて、又はメモリ配列変数(メモリ属性を持つ配列変数をいう。)はマルチポートメモリを用いて、それぞれ回路を実現する必要がある。レジスタ/メモリ配列アクセス命令分解部25は、配列代入命令及び配列参照命令にポート番号を割当てることによって、複数の書込みポートとソフトウェア記述上の配列代入命令との対応付け、及び、複数の読出しポートとソフトウェア記述上の配列参照命令との対応付けを行う。さらに、レジスタ/メモリ配列アクセス命令分解部25は、レジスタ/メモリ配列変数に対応して生成されるレジスタファイル回路又はメモリ回路の入力ポートに対応する変数を追加することによって、配列代入命令及び配列参照命令を細分化する。
より具体的には、本実施形態におけるレジスタ/メモリ配列アクセス命令分解部25は、次に説明する、書込みポート番号割当部251と、読出しポート番号割当部252と、配列代入命令分解部253と、配列参照命令分解部254とを含む。
【0081】
書込みポート番号割当部251は、制御フローグラフFcfgに含まれるレジスタ/メモリ配列変数への配列代入命令のそれぞれに書込みポート番号を割当て、レジスタ/メモリ配列変数の書込みポート数を決定する。より具体的には、書込みポート番号割当部251は、制御フローグラフFcfgに含まれるレジスタ/メモリ配列変数Xへの配列代入命令Aのそれぞれについて、制御フローグラフFcfgにおける始点ブロックから命令Aまでの各径路上に存在する命令A以外の配列変数Xへの配列代入命令の個数をそれぞれ数え上げ、その個数の最大値を、書込みポート番号として命令Aに割当てる。
【0082】
こうしてレジスタ/メモリ配列変数Xの配列代入命令に割当てられた書込みポート番号の数を、レジスタ/メモリ配列変数Xの書込みポート数と呼ぶことにする。即ち、ある整数Nwを用いて書込みポート番号が0からNw−1までのNw個の番号で表されるときに、書込みポート数はNwとなる。レジスタ配列変数の書込みポート数をレジスタファイル書込みポート数と呼び、メモリ配列変数の書込みポート数をメモリ書込みポート数と呼ぶことにする。
【0083】
読出しポート番号割当部252は、制御フローグラフFcfgに含まれるレジスタ/メモリ配列変数への配列参照命令のそれぞれに読出しポート番号を割当て、レジスタ/メモリ配列変数の読出しポート数を決定する。より具体的には、読出しポート番号割当部252は、制御フローグラフFcfgに含まれるレジスタ/メモリ配列変数Xへの配列参照命令Bのそれぞれについて、制御フローグラフFcfgにおける始点ブロックから命令Bまでの各経路上に存在する命令B以外の配列変数Xへの配列参照命令の個数をそれぞれ数え上げ、その個数の最大値を、読出しポート番号として命令Bに割当てる。
【0084】
こうしてレジスタ/メモリ配列変数Xの配列参照命令に割当てられた読出しポート番号の数を、レジスタ/メモリ配列変数Xの読出しポート数と呼ぶことにする。即ち、ある整数Nrを用いて読出しポート番号が0からNr−1までのNr個の番号で表されるときに、読出しポート数はNrとなる。レジスタ配列変数の読出しポート数をレジスタファイル読出しポート数と呼び、メモリ配列変数の読出しポート数をメモリ読出しポート数と呼ぶことにする。
【0085】
レジスタ/メモリ配列変数を実現するレジスタファイル回路又はメモリ回路は、いずれも、レジスタ/メモリ配列変数に値を書込むために用いられる書込みポートと、レジスタ/メモリ配列変数から値を読出すために用いられる読出しポートとを含む。書込みポートは、データ入力ポートとアドレス入力ポートとを含む。配列代入命令分解部253は、これら2つの入力ポートに対応した変数を制御フローグラフFcfgに追加して、制御フローグラフFcfgに含まれる配列代入命令を細分化する。読出しポートは、アドレス入力ポートを含む。配列参照命令分解部254は、この入力ポートに対応した変数を制御フローグラフFcfgに追加して、制御フローグラフFcfgに含まれる配列参照命令を細分化する。これらのポートに対応して追加された変数を「レジスタ/メモリ配列ポート変数」又は単に「ポート変数」と呼ぶことにする。
【0086】
図14を参照して、上述したレジスタ/メモリ配列アクセス命令分解部25の処理を、具体例を用いて説明する。(a1)は、メモリ配列変数 A に対する配列代入命令及び配列参照命令を含む関数 top3 を含むプログラムのソフトウェア記述であり、(a2)は、関数 top3 の制御フローグラフである。
【0087】
関数 top3 は、(a1)の8行目及び12行目に示されるように、2つの配列参照命令 v = A[a] 及び u = A[b] を含む。これらは、(a2)の制御フローグラフにおいても、それぞれそのまま表れている。(a2)において、始点ブロック top3:start から配列参照命令 v = A[a] の命令までの間には、配列変数 A に対する配列参照命令は存在しない(即ち、0個の配列参照命令が存在する)ので、読出しポート番号割当部252は、配列参照命令 v = A[a] に読出しポート番号0を割当てる。また、始点ブロック top3:start から配列参照命令 u = A[b] までの間には、配列参照命令 v = A[a] を通過する経路と、通過しない経路とが存在する。従って、始点ブロック top3:start から配列参照命令 u = A[b] までの経路上には0個又は1個の配列参照命令が存在し、その個数の最大値は1であるので、読出しポート番号割当部252は、配列参照命令 u = A[b] に読出しポート番号1を割当てる。以上より、配列変数 A に対する配列参照命令に割当てられた読出しポート番号は0及び1の2つであるため、読出しポート番号割当部252は、配列変数 A の読出しポート数を2と決定する。
【0088】
また、関数 top3 は、(a1)の9行目、13行目及び16行目に示されるように、3つの配列代入命令 A[a] = V + 1 、 A[b] = u + 1 及び A[0] = v + u を含む。このうち、配列代入命令 A[a] = V + 1 及び A[b] = u + 1 対する処理は、上記の1つ目及び2つ目の配列参照命令に対する処理とそれぞれ同様である。即ち、書込みポート番号割当部251は、配列代入命令 A[a] = V + 1 に書込みポート番号0を割当て、配列代入命令 A[b] = u + 1 に書込みポート番号1を割当てる。始点ブロック top3:start から配列代入命令 A[0] = v + u までの間には、配列代入命令 A[a] = V + 1 を通過する経路と、通過しない経路とが存在するが、いずれの経路も、配列代入命令 A[b] = u + 1 を通過することはない。従って、始点ブロック top3:start から配列代入命令 A[0] = v + u に到達する経路上には、0個又は1個の配列代入命令が存在し、その個数の最大値は1であるので、書込みポート番号割当部251は、3つ目の配列代入命令に書込みポート番号1を割当てる。以上より、配列変数 A に対する配列代入命令に割当てられた読出しポート番号は0及び1の2つであるため、書込みポート番号割当部251は、配列変数 A の書込みポート数を2と決定する。
【0089】
以上のように、配列変数 A の配列代入命令に書込みポート0及び1が割当てられ、配列参照命令に読出しポート0及び1が割当てられた。そこで、配列代入命令分解部253及び配列参照命令分解部254は、次に示すように、これらの各ポートに対応するポート変数を、制御フローグラフFcfgに追加する。
読出しアドレス変数: A0r(ポート0), A1r(ポート1)
書込みアドレス変数: A0w(ポート0), A1w(ポート1)
書込みデータ変数 : A0d(ポート0), A1d(ポート1)
ここで、読出しアドレス変数は読出しポートにおけるアドレス入力ポートに対応する変数であり、書込みアドレス変数は書込みポートにおけるアドレス入力ポートに対応する変数であり、書込みデータ変数は書込みポートにおけるデータ入力ポートに対応する変数である。
【0090】
さらに、配列代入命令分解部253及び配列参照命令分解部254は、書込みアドレス変数及び読出しアドレス変数に配列インデックスの式を代入する命令を生成し、書込みデータ変数に代入値を計算する式を代入する命令を生成する。これにより、配列代入命令分解部253及び配列参照命令分解部254は、図16(a)に示されるように、制御フローグラフFcfgに含まれる配列代入命令及び配列参照命令を、細分化した命令に変換する。図14(b1)は、理解を助けるために、図16(a)の制御フローグラフをソフトウェア記述に表現しなおしたものである。
【0091】
なお、本発明の別の実施形態においては、レジスタ/メモリ配列アクセス命令分解部25は、書込みポート番号割当部251及び読込みポート番号割当部252を含まないものとすることができる。この場合には、配列代入命令分解部253及び配列参照命令分解部254は、制御フローグラフFcfgに含まれる各配列変数に対して1組のポート変数を追加するようにすればよい。また、本発明の別の実施形態においては、論理回路生成装置1は、レジスタ/メモリ配列アクセス命令分解部25を含まないものとすることができる。この場合には、論理回路生成装置1は、レジスタ/メモリ配列変数を含まないプログラムPを入力に取る。
【0092】
[メモリポート数判定部26]
メモリポート数判定部26は、レジスタ/メモリ配列アクセス命令分解部25において算出されたレジスタファイル書込みポート数、レジスタファイル読出しポート数、メモリ書込みポート数及びメモリ読出しポート数が、それぞれ予め定められた閾値を超えていないかどうかを判定する。ポート数の閾値は、回路特性(例えば、回路規模、回路動作速度、消費電力)や半導体製造プロセス等の技術的要因によって、予め4種類のポートについて個別に定めることができる。これらのポート数のいずれかが予め定められた閾値を超えている場合には、メモリポート数判定部26は、回路合成が可能でないと判定する。論理回路生成が可能でないとメモリポート数判定部26が判定した場合には、論理回路生成装置1は、例えば、出力装置17に警告メッセージを出力し、論理回路生成処理を停止するようにすることができる。
【0093】
なお、本発明の別の実施形態においては、論理回路生成装置1は、メモリポート数判定部26を含まないものとすることができる。この場合には、論理回路生成装置1は、ポート数にかかわらず論理回路生成の処理をする。
【0094】
[静的単一代入形式変換部27]
メモリポート数判定部26によって、制御フローグラフFcfgが論理回路生成可能であると判定された場合には、次いで、制御フローグラフFcfgは、静的単一代入形式変換部27に入力される。静的単一代入形式変換部27は、制御フローグラフFcfgを静的単一代入形式の制御フローグラフに変換する。
【0095】
一般に、静的単一代入形式とは、ソフトウェア・コンパイラの中間表現形式の一つであり、各変数の値の定義が1つだけ存在する(即ち、各変数への値の代入が1箇所で行われる)ような形式をいう。静的単一代入形式は、変数の名前変更(リネーミング)を行い、さらに、同一変数に対する値の定義が複数個合流する制御フロー箇所にφ関数命令と呼ばれる命令を追加することによって得られる。
【0096】
静的単一代入形式変換部27は、より具体的には、次に説明する、φ関数命令挿入部271と、変数名変換部272と、状態変数名再変換部273とを含む。
【0097】
φ関数命令挿入部271は、制御フローグラフ内の、同一変数に対する値の定義が複数個合流する箇所に、φ関数命令を挿入する。φ関数命令は、その箇所に合流する全ての変数定義(変数に対する値の定義をいう。)の中から、実際に実行された経路上の変数定義を選択する命令である。φ関数命令によって選択された変数定義による値は、その同じ変数に代入される。なお、φ関数命令の実体化(φ関数命令を具体的な演算命令に変換することをいう。)は、後述する制御フロー縮退変換部28によって行われる。
【0098】
変数名変換部272は、制御フローグラフ内の各変数代入命令及び各φ関数命令による変数の値の定義について、変数ごとの固有の添字付き変数名に置き換える。変数名変換部272は、さらに、制御フローグラフ内の変数を参照する各命令について、参照される各変数の変数名を、その命令に到達する各変数代入命令又は各φ関数命令による変数の値の定義に対応する添字付き変数名に置き換える。この処理によって、制御フローグラフは、静的単一代入形式に変換される。
【0099】
状態変数名再変換部273は、静的単一代入形式に変換された制御フローグラフに対する追加の処理として、各スタティック変数(グローバル変数を含む。)に対して、関数の出口に対応する終点ブロックに到達する値の定義に割当てられた添字付き変数名を、関数の入口に対応する始点ブロックにおける添字付き変数名に置き換える。これを行うのは、関数出口におけるスタティック変数及びグローバル変数の値を、次回の関数実行における関数入口箇所で参照可能にするためである。
【0100】
図15を参照して、静的単一代入形式変換部27が、複数の変数定義の合流を伴う制御フローグラフFcfgを静的単一代入形式に変換する場合の処理について、具体例を用いて説明する。図15(b)は、図15(a)に示されるプログラムに含まれる最上位関数 top4 の制御フローを表現した制御フローグラフである。まず、φ関数命令挿入部271は、図15(c)に示されるように、変数 a, b, c それぞれの変数定義が合流する基本ブロックの先頭箇所にφ関数命令を挿入する。具体的に、関数引数変数 a について見ると、関数引数の値として与えられる関数入口における値の定義と、 a = b + 1 の代入命令による値の定義とが、φ関数命令が挿入された箇所で合流する。グローバル変数 b について見ると、グローバル変数の値として与えられる関数入口における値の定義と、 b = b + 1 の代入命令による値の定義と、 b = a の代入命令による値の定義との3つが、φ関数命令が挿入された箇所で合流する。ローカル変数 c について見ると、 c = b - 1 の代入命令による値の定義と、 c = c + 1 の代入命令による値の定義と、 c = 0 の代入命令による値の定義との3つが、φ関数命令が挿入された箇所で合流する。
【0101】
次に、変数名変換部272は、図15(d)に示されるように、各変数代入命令及び各φ関数命令による変数の値の定義について、変数ごとの固有の添字付き変数名に置き換える。例えば変数名 c1 は変数 c に対する1つの代入命令による値の定義について割当てられた添字付き変数名であり、変数名 c2 は同じ変数 c に対する別の代入命令による値の定義について割当てられた添字付き変数名である。また、代入変数名前変換部272は、図示されないが、関数引数変数及びスタティック変数(グローバル変数を含む。)の値は、関数 top4 の入り口に対応する制御フローグラフの始点ブロック top4:start において定義されているものとみなして、これらの変数にも添字付きの変数名を割当てる。具体的には、関数引数の値として与えられた変数 a の値の定義に対して、添字付き変数名 a1 を割当てる。また、グローバル変数 b については、関数入口の時点における値をそのまま定義とみなし、その値の定義に対して添字付き変数名 b1 を割当てる。
【0102】
変数名変換部272は、さらに、図15(e)に示されるように、変数を参照する各命令について、参照される各変数の変数名を、その命令に到達する各変数代入命令又は各φ関数命令による変数の値の定義に対応する添字付き変数名に置き換える。具体的には、図15(d)において式 c1 = b - 1 で表される命令においてはグローバル変数 b が参照されるが、上述のように、この命令に到達する変数 b の値の定義には添字付き変数名 b1 が割当てられているため、図15(e)に示されるように、この命令における変数 b の変数名を b1 に置き換える。変数を参照する他の命令についても同様である。
【0103】
以上の処理によって、制御フローグラフは静的単一代入形式に変換されるが、状態変数名再変換部273は、こうして作られた静的単一代入形式の制御フローグラフに対して、追加の処理を行う。即ち、図15(f)に示されるように、各スタティック変数(グローバル変数を含む。)に対して、関数 top4 の出口に対応する終点ブロック top4:end に到達する値の定義に割当てられた添字付き変数名を、関数 top4 の入口に対応する始点ブロック top4:start における添字付き変数名に置き換える。
【0104】
図16には、制御フローグラフFcfgを静的単一代入形式に変換する処理が、別の具体例を用いて示される。図16(a)は、図14(b)に示されるソフトウェア記述によって記述された関数 top3 の制御フローグラフである。図16(b)は、静的単一代入形式変換部27が図16(a)の制御フローグラフを静的単一代入形式に変換した結果である。変換の具体的な方法は、図15を参照して上述した通りである。この例における関数 top3 はレジスタ/メモリ配列アクセス命令を含むものであり、制御フローグラフFcfgに含まれるレジスタ/メモリ配列アクセス命令は、上述したレジスタ/メモリ配列アクセス命令分解部25によって、レジスタ/メモリ配列ポート変数を用いて細分化されている。静的単一代入形式変換部27は、レジスタ/メモリ配列ポート変数についても、他の変数と同様に変数名を置き換える。但し、レジスタ/メモリ配列変数自体については、変数名の置き換えを行わない。
【0105】
本発明の別の実施形態においては、論理回路生成装置1は、静的単一代入形式変換部27を含まないものとすることができる。この場合は、論理回路生成装置1は、静的単一代入形式のソフトウェア記述で記述された最上位関数Ftopを含むプログラムPを入力に取る。
【0106】
[制御フロー縮退変換部28]
静的単一代入形式変換部27によって静的単一代入形式に変換された制御フローグラフFcfgは、次いで、制御フロー縮退変換部28に入力される。前述したように、制御フローグラフFcfgは、ループ構造を含まないが、経路の条件分岐(及びそれに伴う合流)を含むことがあるため、そのまま論理回路を表現するデータとして用いるのには適さない。しかし、制御フロー縮退変換部28に入力される制御フローグラフFcfgは、各変数への代入を1つだけ含む静的単一代入形式に変換されたものであるため、制御フローグラフFcfgに追加されたφ関数命令を実体化すれば、条件分岐を無視して制御フローグラフの全てのノードの命令を実行しても正常な動作をする。このことは、ソフトウェア記述から論理回路を生成する手法において、大変重要な事実である。
【0107】
そこで、制御フロー縮退変換部28は、入力された制御フローグラフFcfgに含まれるφ関数命令を実体化し、制御フローグラフFcfgから条件分岐を全て除去することによって、制御フローが縮退されたプログラムである制御フロー縮退プログラムFdegを生成する。制御フロー縮退プログラムFdegは、条件分岐を含む制御フローグラフFcfgと比較すると、論理回路の構造をより直接的に表現するものとなる。
【0108】
本実施形態における制御フロー縮退変換部28は、より具体的には、次に説明する、φ関数命令実体化部281と、基本ブロック単一化部282と、レジスタ/メモリ配列アクセス命令融合部283とを含む。
【0109】
φ関数命令実体化部281は、入力された制御フローグラフFcfgに含まれるφ関数命令を実体化する(即ち、φ関数命令を具体的な演算命令に変換する)。静的単一代入形式変換部27の説明において述べたように、φ関数命令は、複数の変数定義が合流する制御フローグラフ内の箇所に挿入されたものであり、その箇所に合流する全ての変数定義の中から実際に実行された経路上の変数定義を選択する命令である。変数定義の選択は、経路の条件分岐における条件値に基づいて行われる。例えば、条件 p の真偽値によって条件分岐する2つの経路があり、条件 p が真である場合に実行される経路上に変数定義 a1 が存在し、条件 p が偽である場合に実行される経路上に変数定義 a2 が存在し、2つの経路の合流後の部分にこれらの変数定義から1つを選択するφ関数命令 φ(a1, a2) が存在するとする。このとき、φ関数命令 φ(a1, a2) は、条件 p が真である場合に a1 を選択し、そうでない(即ち、条件 p が偽である)場合に a2 を選択するように実体化される。より具体的には、 φ(a1, a2) は p ? a1 : a2 という式に実体化される。
【0110】
基本ブロック単一化部282は、φ関数命令実体化部281によってφ関数命令が実体化された制御フローグラフFcfgから条件分岐を全て除去することによって、制御フローが縮退されたプログラムである制御フロー縮退プログラムFdegを生成する。
【0111】
一般に、条件分岐を含まない制御フローグラフにおいては、経路は1つに定まり、全ての命令が一連に逐次実行されることになるため、全ての基本ブロックに含まれる(分岐命令以外の)命令を1つの命令列に結合することによって、全ての基本ブロックを1つの基本ブロックに結合することが可能である。このように基本ブロックが1つにまとめられた制御フローグラフによって表されるプログラムを、制御フローが縮退されたプログラムと呼ぶ。
【0112】
ところで、基本ブロック単一化部282に入力される、φ関数命令が実体化された制御フローグラフFcfgは、上述の通り、条件分岐を無視して全てのノードの命令を実行しても正常な動作をする。そこで、基本ブロック単一化部282は、入力された制御フローグラフFcfgの全ての基本ブロックに含まれる(分岐命令以外の)命令を1つの命令列に結合することによって、全ての基本ブロックを単一の基本ブロックに結合し、制御フローが縮退されたプログラムを生成する。このとき、結合された基本ブロックの命令列における命令の順序は、元の基本ブロックの実行順序に基づく。例えば、入力された制御フローグラフFcfgにおいて基本ブロックB1から基本ブロックB2及びB3に経路が分岐し、その後これらの経路が基本ブロックB4において合流する場合を考える。このとき、B1及びB2を通過する経路においてB1はB2より先に実行されるので、結合された基本ブロックにおいて、B1に含まれていた命令はB2に含まれていた命令よりも前に配置するようにする。B1とB3との関係、B2とB4との関係、及びB3とB4との関係も同様である。しかし、B2及びB3を共に通過する経路は存在しないので、B2に含まれていた命令はB3に含まれていた命令より前に配置しても後に配置しても構わない。その結果、結合された基本ブロックにおけるこの部分の命令の順序は、B1→B2→B3→B4、又はB1→B3→B2→B4となる。いずれにしても、B2に含まれていた命令及びB3に含まれていた命令は、入力された制御フローグラフFcfgにおいては排他的にのみ実行されるものであったが、結合された基本ブロックにおいてはどちらも実行されることになる。
【0113】
レジスタ/メモリ配列アクセス命令融合部283は、φ関数命令が実体化された制御フロー縮退プログラムFdegに対して、排他的に実行されるレジスタ/メモリ配列アクセス命令を融合する処理と、条件的に実行されるレジスタ/メモリ配列アクセス命令に実行条件式を付加する処理とを行う。
【0114】
図15(f)及び図17を参照して、制御フロー縮退変換部28が行う処理について、具体例を用いて説明する。まず、φ関数命令実体化部281が、制御フローグラフFcfgに含まれるφ関数命令を実体化する。図15(f)の制御フローグラフに含まれるそれぞれのφ関数命令の動作は、経路の条件分岐における条件値に基づき、具体的には次の通りである。ここでは、条件値を、 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;
【0115】
次いで、基本ブロック単一化部282が、φ関数命令が実体化された制御フローグラフFcfgに含まれる全ての基本ブロックの(分岐命令以外の)命令を1つの命令列に結合する。その結果、条件分岐が全て除去され、図17に示される、制御フロー縮退プログラムFdegが生成される。
【0116】
別の具体例として図16(b)及び図18を参照して、制御フロー縮退変換部28が行う処理を説明する。図18(a)は、レジスタ/メモリ配列アクセス命令を含む図16(b)の制御フローグラフFcfgから変換された制御フロー縮退プログラムFdegを示す。この変換の具体的な処理方法は、図15(f)及び図17を参照して説明された通りである。レジスタ/メモリ配列アクセス命令融合部283は、この制御フロー縮退プログラムFdegに対して、排他的に実行されるレジスタ/メモリ配列アクセス命令を融合する処理を行う。具体的には、図18(a)の17行目に示される配列代入命令 A[A1w1] = A1d1 と、20行目に示される配列代入命令 A[A1w2] = A1d2 とを、φ関数命令 A1w3 = φ(A1w1,A1w2) 及び A1d3 = φ(A1d1,A1d2) の実体化の結果を用いて、図18(b)の26行目に示される1つの配列代入命令 A[A1w3] = A1d3 に融合する。さらに、レジスタ/メモリ配列アクセス命令融合部283は、条件的に実行されるレジスタ/メモリ配列アクセス命令に実行条件式を付加する処理を行う。具体的には、図18(a)の5行目に示される配列参照命令 v2 = A[A1r1] の読出しアドレスポート変数の代入命令 A1r1 = a1 は、 P1 が真のときに実行されるので、この配列参照命令を、図18(b)の5行目に示されるように、 if(P1) v2 = A[A1r1] に変換する。同様に、図18(a)の8行目に示される配列代入命令 A[A1w1] = A1d1 の書込みアドレスポート変数の代入命令 A1w1 = a1 及び書込みデータポート変数の代入命令 A1d1 = u2+1 はともに、 P1 が真のときに実行されるので、この配列代入命令を、図18(b)の5行目に示されるように、 if(P1) v2 = A[A1r1] に変換する。また、配列代入命令 A[A1w3] = A1d3 の書込みアドレスポート変数と書込みデータポート変数はφ関数命令が出力しており、これらφ関数命令は必ず実行される制御フロー経路上にあるので、実行条件は付加しない。
【0117】
以上に説明されたように、制御フロー縮退変換部28は、入力された制御フローグラフFcfgから、制御フローが縮退されたプログラムである制御フロー縮退プログラムFdegを生成する。なお、別の実施形態において、論理回路生成装置1がφ関数命令挿入部271を含まない場合には、制御フローグラフFcfgがφ関数命令を含むことはないため、制御フロー縮退変換部28は、φ関数命令実体化部281を含まないものとすることができる。また、さらに別の実施形態において、論理回路生成装置1がレジスタ/メモリ配列アクセス命令分解25を含まない場合には、制御フロー縮退変換部28は、レジスタ/メモリ配列アクセス命令融合部283を含まないものとすることができる。
【0118】
[データフローグラフ生成部29]
制御フロー縮退変換部28によって生成された制御フロー縮退プログラムFdegは、次いで、データフローグラフ生成部29に入力される。データフローグラフ生成部29は、入力された制御フロー縮退プログラムFdegに含まれる制御フローの分岐及び合流のない逐次命令列から、そのデータフローグラフFdfgを生成する。一般に、データフローグラフとは、逐次命令列において、各命令をノードとし、変数の値を定義する命令とその定義を参照する命令との間に有向枝を結んだ有向グラフである。制御フローの分岐及び合流のない逐次命令列からそのデータフローグラフを生成する処理は、公知の技術を用いて容易に実装可能であるため、ここではその具体的方法についての説明を省略する。具体例として、図19は、図17の制御フロー縮退プログラムから生成されるデータフローグラフを示す。別の具体例として、図20は、図18(b)の制御フロー縮退プログラムから生成されるデータフローグラフを示す。
【0119】
[データフローグラフ最適化部30]
データフローグラフ生成部29によって生成されたデータフローグラフFdfgは、次いで、データフローグラフ最適化部30に入力される。データフローグラフ最適化部30は、入力されたデータフローグラフFdfgを最適化する。より具体的には、データフローグラフ最適化部30は、次に説明する、ビット幅判定部301、冗長比較演算削除部302、演算分解部303、及び冗長演算削除部304を含む。
【0120】
RTL記述においては、演算回路の各データのビット幅を明示する必要があるが、各データのビット幅を明示的に指定することは、非常に煩雑である。そこで、ビット幅判定部301は、論理回路の入力データ及びレジスタ変数に対するビット幅指定の情報から、演算回路の中間データ及び出力データのビット幅を自動的に判定する。本実施形態においては、これらのデータが取り得る値の区間を求め、その区間内の任意の値を表現することが可能な最小のビット幅をそのデータのビット幅として定めるようにする。以下に、ビット幅判定部301が行う処理について、詳細に説明する。以下の説明においては、データとして整数値のみを考慮するが、他の型の値(例えば、浮動小数点数)も同様に考慮することができることは明らかである。また、本実施形態においては、負の値は2の補数表記によって表現される。
【0121】
以下の説明において、データ x が取り得る最小値及び最大値を、それぞれ x.L 及び x.H で表すことにする。また、これらを両端点として定められる区間 [x.L, x.H] を、データ x のデータ区間と呼ぶことにする。取り得る値が定数値 c であるデータのデータ区間は、 [c, c] となる。
【0122】
定数 c のビット表現のうち符号ビットを除いた部分を表現することが可能な最小のビット幅を、 c の最小ビット幅と呼び、 min_bit(c) で表すことにする。 c が非負値である場合、即ち c >= 0 の場合には、 min_bits(c) の値は 2n - 1 >= c を満たす最小の整数 n であり、 c が負値である場合、即ち c < 0 の場合には、 min_bits(c) の値は 2n >= - c を満たす最小の整数 n である。
【0123】
この min_bits(c) を用いて、データ区間 [x.L, x.H] を持つデータ x を表現するための最小ビット幅 bit_width([x.L, x.H]) を、次のように表す。
データ x が非負値のみを取り得る場合、即ち x.L >= 0 の場合には、データ x は符号無しデータとして扱われ、符号無し2進数表記によってビット表現される。この場合には、 x が取り得る最大値を表現することが可能なビット幅によって、 x が取り得る任意の値を表現することが可能であるため、データ x を表現するための最小ビット幅は
bit_width([x.L, x.H]) = min_bits(x.H);
と表される。
一方、データ x が負値を取り得る場合、即ち x.L < 0 の場合には、データ x は符号付きデータとして扱われ、符号付きの2進数(負値については、2の補数)表記によってビット表現される。この場合には、データ x を表現するための最小ビット幅は
bit_width([x.L, x.H]) = max(min_bits(x.L), min_bits(x.H)) + 1;
と表される。
【0124】
まず、ビット幅判定部301は、論理回路の入力データ及び状態変数に対して、ビット幅情報とデータ型とから、それぞれのデータが取り得る値の範囲を算出し、それを初期データ区間として設定する。
n ビット符号無しデータ x の初期データ区間は、
[x.L, x.H] = [0, 2n - 1];
と設定される。
n ビット符号付きデータ x の初期データ区間は、
[x.L, x.H] = [ - 2n - 1, 2n - 1 - 1];
と設定される。
【0125】
次に、ビット幅判定部301は、各演算の種類及び演算対象のデータ区間に基づいて、演算結果のデータ区間を決定する。以下に、演算の種類ごとに、演算結果のデータ区間を決定する処理について説明する。
【0126】
(1)2項演算のデータ区間
z = x op yの形式の2項演算における演算結果のデータ区間を
[z.L, z.H] = Range(op, [x.L, x.H], [y.L, y.H]);
と表記する。ここでは、演算子 op がC言語の2項演算子のうち { +, -, *, /, %, <<, >>, &, |, ^, ==, !=, <, >, <=, >= } のいずれかである2項演算に対する処理について説明するが、例えばべき乗など他の2項演算に対しても同様の処理が可能であることは明らかである。2項演算における演算結果のデータ区間は、演算子 op と演算対象データ x 及び y のデータ区間 [x.L, x.H] 及び [y.L, y.H] とから決定される。以下に、2項演算の種類ごとに、演算結果のデータ区間を決定する具体的な処理について説明する。
【0127】
(1.1)単調2項演算のデータ区間
2項演算 x op y の演算子 op が { +, -, *, <<, >> } のいずれかである場合のその2項演算を、ここでは単調2項演算と呼ぶことにする。この場合における 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;
)と定義すると、これが単調2項演算における演算結果のデータ区間であるので、
Range(op, [x.L, x.H], [y.L, y.H]) = MRange(op, [x.L, x.H], [y.L, y.H]);
と決定される。
【0128】
(1.2)除算のデータ区間
2項演算 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)]
と決定される。
【0129】
(1.3)剰余演算のデータ区間
2項演算 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)];
と決定される。
【0130】
(1.4)論理演算のデータ区間
2項演算 x op y がビットごとの論理演算である場合、即ち演算子 op が { &, |, ^ } のいずれかである場合における演算結果のデータ区間を決定する処理について、以下に説明する。なお、説明において、単に「論理演算」というときは、ビットごとの論理演算を意味するものとする。
【0131】
論理演算のデータ区間を算出する場合においては、算術演算の場合と異なり、2の補数の概念が適用されない。即ち、 -1 及び 0 は2進数表現でそれぞれ 111…1 及び 000…0 であるので、-1 及び 0 を共に含む区間は、2進数表現において不連続である。このように、負値と非負値とを両方含む、2進数表現において不連続となる区間を、2進不連続区間と呼ぶ。逆に、負値だけを取る区間、及び非負値だけを取る区間は、2進連続区間と呼ぶ。
【0132】
2つの整数 x 及び y について、それぞれを2の補数表記によって表現し、それらを符号無し整数として再解釈して比較した場合の最大値を 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;
と表される。
【0133】
ここでまず、論理演算において演算対象のデータ区間がいずれも2進連続区間である場合について説明する。即ち、 z = x op y の形式の論理演算において、 [x.L, x.H] 及び [y.L, y.H] が共に2進連続区間である場合である。この場合の演算結果のデータ区間 [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); (2進連続区間なので、(x.L < 0) == (x.H < 0))
y_sign = (y.L < 0); (2進連続区間なので、(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];
【0134】
なお、上式において、区間の端点を定めるために min_range 及び max_range が用いられているが、演算対象のデータ区間の与え方によっては、実際の演算結果の範囲が min_range 又は max_range の値を必ずしも含まない場合がある。本発明の別の実施形態においては、演算対象のデータ区間から各ビットの取り得る値を分析することによって、演算結果のデータ区間をより厳密に求めるようにしてもよい。又は、それとは逆に、さらに別の実施形態においては、例えばビット幅のみを考慮するなど、本実施形態よりさらに簡単なものとしてもよい。
【0135】
次に、論理演算における一般の場合について説明する。演算 x op y において演算子 op が { &, |, ^ } のいずれかである場合における演算対象のデータ区間 [x.L, x.H] 及び [y.L, y.H] のそれぞれについて、その区間が2進不連続区間である場合には、その区間を2つの2進連続区間に分割した上で、それぞれの2進連続区間における演算結果のデータ区間を計算し、それらの結果を統合して最終的な演算結果のデータ区間を決定する。 具体的な式を用いて表すと、次のようになる。まず、データ区間 [x.L, x.H] 及び [y.L, y.H] のそれぞれが2進不連続区間であるか否かを判定する。
x_neg_pos = (x.L < 0 && x.H >= 0); ([x.L, x.H] が2進不連続区間である)
y_neg_pos = (y.L < 0 && y.H >= 0); ([y.L, y.H] が2進不連続区間である)
x_neg_pos == 0 && y_neg_pos == 0 の場合、即ち両区間とも2進連続区間である場合には、前述の通り
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 の場合には、2進不連続区間であるデータ区間 [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 の場合には、2進不連続区間であるデータ区間 [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)];
と求められる。
以上により、全ての場合について、論理演算における演算結果のデータ区間が決定される。
【0136】
(1.5)比較演算のデータ区間
2項演算 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];
と決定される。
【0137】
以上、(1.1)〜(1.5)により、2項演算における演算結果のデータ区間が決定される。
【0138】
(2)単項演算のデータ区間
次に、単項演算における演算結果のデータ区間を決定する処理について説明する。
u = op x の形式の単項演算における演算結果のデータ区間を
[u.L, u.H] = Range(op, [x.L, x.H])
と表記する。ここでは、演算子 op がC言語の単項演算子のうち { !, ~, -, + } のいずれかである単項演算に対する処理について説明する。
単項演算における演算結果のデータ区間は、演算子 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];(プラス演算)
【0139】
(3)選択演算のデータ区間
最後に、 s = t ? x : y の形式の選択演算(3項演算)における演算結果のデータ区間を決定する処理について説明する。選択演算における演算結果のデータ区間は、条件式 t と被選択項 x 及び y との関係によって決定される。なお、条件式 t が定数値である場合には、後述するように、選択演算は冗長比較演算削除部302によって単純な代入式に簡単化さるため、ここで演算結果のデータ区間を考慮する必要はない。よって、以下では、条件式 t が定数値になることが明らかでない場合について説明する。
【0140】
(3.1)条件式 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] であるものとして第2項 x のデータ区間を評価し、また、 w のデータ区間が [c, w.H] であるものとして第3項 y のデータ区間を評価する。
(イ)条件式 t が w >= c の形式の場合には、条件式 t は !(w < c) と表されるので、上記(ア)の場合とは逆に、 w のデータ区間が [c, w.H] であるものとして第2項 x のデータ区間を評価し、また、 w のデータ区間が [w.L, c - 1] であるものとして第3項 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)];
と決定される。
【0141】
条件式 t が変数 w と定数との大小比較演算である場合における選択演算データ区間の決定について、以下に具体例を用いて説明する。第1の例として、
s1 = (w > 127) ? 127 : w;
という式における演算結果のデータ区間 [s1.L, s1.H] を考える。この式においては、 w > 127 のときに第2項 127 が選択され、 w <= 127 のときに第3項 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] とに分割し、前者を第3項 w に、後者を第2項 127 に、それぞれ適用する。その結果、第2項 127 のデータ区間は [127, 127] となり、第3項 w のデータ区間は [w.L, 127] となる。従って、演算結果のデータ区間は、これらの区間を統合することによって
[s1.L, s1.H] = [min(w.L, 127), 127] = [w.L, 127];
と決定される。
【0142】
第2の例として、
s2 = (w < 0) ? - w : w
という式における演算結果のデータ区間 [s2.L, s2.H] を考える。この式においては、 w < 0 のときに第2項 - w が選択され、 w >= 0 のときに第3項 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] とに分割し、前者を第2項 - w に、後者を第3項 w に、それぞれ適用する。その結果、第2項 - w のデータ区間は Range(-, [w.L,-1]) = [1, - w.L] となり、第3項 w のデータ区間は [0, w.H] となる。従って、演算結果のデータ区間は、これらの区間を統合することによって
[s2.L, s2.H] = [0, max(- w.L, w.H)]
と決定される。
【0143】
(3.2)条件式 t が変数 w と定数との大小比較演算でない場合
被選択項 x 及び y それぞれのデータ区間を単純に統合することによって、選択演算データ区間を決定する。即ち、
[s.L, s.H] = [min(x.L, y.L), max(x.H, y.H)];
とする。
【0144】
以上、(3.1)及び(3.2)により、選択演算における演算結果のデータ区間が決定される。なお、本実施形態においては、条件式 t が変数 w と定数との大小比較演算でない場合には一律に、被選択項のデータ区間を単純に統合するようにしたが、本発明の別の実施形態においては、条件式と被選択項との関係をさらに分析することによって、演算結果のデータ区間をより厳密に求めるようにしてもよい。又は、それとは逆に、さらに別の実施形態においては、例えば条件式を考慮せずに常に被選択項のデータ区間を単純に統合するなど、本実施形態よりさらに簡単なものとしてもよい。
【0145】
以上、(1)〜(3)に説明した処理によって、ビット幅判定部301は、演算回路の中間データ及び出力データのデータ区間を決定する。データのビット幅は、そのデータ区間内の任意の値を表現することが可能な最小のビット幅として定められる。
【0146】
なお、本発明の別の実施形態においては、データフロー最適化部30がビット幅判定部301を含まないようにすることができる。この場合には、論理回路生成装置1は、演算回路の中間データ及び出力データのビット幅を、そのデータの型に即して定め、又は、論理回路生成装置1に入力されるプログラムPのソフトウェア記述においてデータのビット幅が指定されているときには、その指定されたビット幅をそのまま用いるようにすることができる。
【0147】
各データのデータ区間が決定されることによって、比較演算の結果が定数値に評価されることが明らかになる場合がある。結果が定数値になる比較演算を、冗長比較演算と呼ぶ。冗長比較演算削除部302は、ビット幅判定部301が判定した各データのデータ区間に基づいて、冗長比較演算を判定して定数値に置き換え、定数伝播による最適化をさらに行う。
例えば、データ 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 に置き換える。
【0148】
図21を参照して、ビット幅判定部301によるデータ区間判定の処理、及び冗長比較演算削除部302の処理について、具体例を用いて説明する。なお、図示及び説明の便宜上、この例におけるプログラムはC言語によるソフトウェア記述として表現されているが、ビット判定部301及び冗長比較演算削除部302が処理する対象は、データフローグラフである。説明においては、ソフトウェア記述に対応するデータフローグラフが実際の処理の対象であるものとして理解されたい。
【0149】
この例において、関数 funcF は、変数 cc 及び dd に対するクリップ処理(具体的には、負値の場合に 0 にクリップする処理)と、変数 r に対するクリップ処理(具体的には、値が 255 を超える場合に 255 にクリップする処理)とを含む。関数 top6 は、配列 c[3] 及び d[3] の具体値を定義する。
【0150】
まず、ビット幅判定部301は、初期データ区間として、関数 top6 の入り口における配列 x[3] の各要素(ここでは便宜的に xi と表記する)のデータ区間を、その型に基づいて
[xi,L, xi.H] = [0, 255]
と設定する。
【0151】
関数 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;
と表現される。ビット幅判定部301は、これらの式に対して、配列 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]
と判定する。
【0152】
同様に、関数 funcF の2つ目の式、即ち
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;
と表現される。ビット幅判定部301は、配列 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]
と判定する。
【0153】
変数 cc のデータ区間は、上記の通り [cc.L, cc.H] = [-510, 510] であるため、関数 funcF の3つ目の式、即ち
cc_clip = (cc < 0) ? 0 : cc;
の選択演算における条件式 cc < 0 は、冗長比較演算ではない。そこで、ビット幅判定部301は、選択演算における演算結果のデータ区間を、上述のビット幅判定部301の処理(3.1)(ア)に従って、
[cc_clip.L, cc_clip.H] = [0, 510]
と判定する。
【0154】
一方、変数 dd のデータ区間は、上記の通り [dd.L, dd.H] = [0, 1020] であるため、関数 funcF の4つ目の式、即ち
dd_clip = (dd < 0) ? 0 : dd;
の選択演算における条件式 dd < 0 は、必ず 0 に評価される冗長比較演算である。従って、冗長比較演算削除部302は、この式を
dd_clip = dd;
と簡単化する。その結果、ビット幅判定部301は、演算結果のデータ区間を
[dd_clip.L, dd_clip.H] = [dd.L, dd.H] = [0, 1020]
と判定する。
【0155】
以下同様に、ビット幅判定部301は、
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 の全ての中間データ及び出力データのデータ区間が判定され、従って、ビット幅が定められる。
【0156】
以上に説明されたように、冗長比較演算削除部302は、冗長比較演算を除去することによってデータフローグラフを最適化する。なお、本発明の別の実施形態においては、データフローグラフ最適化部30は、冗長比較演算削除部302を含まないようにすることができる。その場合には、データフローグラフFdfgにおける比較演算が最適化されないことになるため、論理回路生成装置1が最終的に出力する論理回路が本実施例と比べて冗長なものとなることがあるが、本発明の目的が達成されることに変わりはない。
【0157】
演算分解部303は、データフローグラフFdfgを最適化するための追加の処理として、複雑な算術演算を論理合成し易い単純な算術演算に変換する処理を行う。具体的には、次に説明するように、(1)定数乗算の加算・シフト分解、及び(2)除算のシフト・試行減算分解を行う。
【0158】
(1)定数乗算分解
データフローグラフFdfgに含まれる演算のうち、一方の演算対象(即ち、被乗数又は乗数)が定数である乗算について、演算分解部303は、その乗算を、定数のビット列において 1 であるそれぞれのビット位置にもう一方の演算対象をシフトしてそれらを積算する一連の演算に置き換える。この処理を定数乗算分解という。例えば、式 x * 5 は、定数である乗数 5 をビット表現すると 101 であるので、 x を 2 ビット左シフトした値と x との和に置き換えられる。これを式で表現すれば、 (x << 2) + x となる。
【0159】
(2)除算分解
演算分解部303は、除算を、いわゆる筆算方式によって、シフトと試行減算とに分解する。この処理を除算分解という。2進数における筆算は、10進数における一般的な筆算と同様であるが、減算の各回において求められる商のビットの値は 0 又は 1 であり、それに対応して、減数の値は 0 又は除数の値である。そこで、減算の各回において、被減数が除数以上である場合には、商のビットの値を 1 、減数の値を除数の値とし、そうでない場合には、商のビットを 0 、減数の値を 0 とする。この比較と減算とからなる処理は、試行減算として知られる。被減数が除数以上であるか否かは、実際に除数による減算を行った結果の符号によって判定してもよい。
【0160】
図22を参照して、8ビット符号無しデータ a, b, c, d における a = c / d 及び b = c % d の演算の分解を説明する。図の上段は、具体例として 254 を 21 で除したときの商 12 及び余り 2 を求める筆算を、2進数及び10進数でそれぞれ表現したものである。2進数の筆算の図において、例えば、 n3 の値 000001111 は除数 00010101 以上でないため、これに対応する商のビット g3 の値は 0 となり、減数も 0 となる。一方、 n4 の値 000011111 は除数以上であるため、これに対応する商のビット g4 の値は 1 となり、減数は 00010101 となる。図の下段は、筆算の工程をC言語による一連の式として表現したものである。即ち、一般に、8ビット符号無しデータ a, b, c, d における a = c / d 及び b = c % d の演算は、この一連の式に分解される。より一般には、試行減算の回数はデータ c のビット幅に依存するが、上述のビット幅判定部301によって判定されたデータ c のビット幅がここで用いられる。
【0161】
なお、本発明の別の実施形態においては、演算分解部303は、上記(1)及び(2)以外にも、ソフトウェア又は処理装の分野において一般に知られる、演算に対する他の最適化処理を行うようにすることができる。また、本発明のさらに別の実施形態においては、データフローグラフ最適化部30は、演算分解部303を含まないようにすることができる。その場合には、データフローグラフFdfgに含まれる演算について上記の最適化がされないことになるため、論理回路生成装置1が最終的に出力する論理回路が本実施例と比べて冗長なものとなることがあるが、本発明の目的が達成されることに変わりはない。
【0162】
冗長演算削除部304は、データフローグラフFdfgを最適化するための追加の処理として、定数伝播、共通部分式削除、及びデッドコード削除の処理を行う。定数伝播とは、演算結果が定数値になる式をその定数値に置き換える(即ち、定数を伝播させる)処理である。また、単純に1つの変数で表される式をその変数に置き換える処理も併せて行う。共通部分式削除とは、同じ値に評価されることが明らかである複数の式を一つの式にまとめる処理である。デッドコード削除(dead code elimination)とは、参照されない変数を削除する処理である。
【0163】
図23及び図24を参照して、演算分解部303による定数乗算分解、並びに冗長演算削除部304による定数伝播及び共通部分式除去について、具体例を用いて説明する。図23において、(a)は、最上位関数として関数 top5 を含むプログラムPのソフトウェア記述であり、(b)は非循環・非階層変換部21によってインライン展開されて非循環型最下層関数となった関数 top5 である。図24において、(a)は、インライン展開された関数 top5 のデータフローグラフである。
【0164】
図24において、(b)は、(a)に定数伝播が適用された結果のデータフローグラフである。具体的には、変数 b0 が定数値 3 に、変数 b1 が定数値 7 に、それぞれ置き換えられる。また、単純に変数 c で表される変数 a0 及び a1 が変数 c に置き換えられる。(c)は(b)に定数乗算分解が適用された結果のデータフローグラフである。具体的には、式 c * 3 は式 (c << 1) + c に分解され、式 c * 7 は式 (c << 2) + (c << 1) + c に分解される。これらの分解結果の式について、部分式(例えば、 c << 1 )に対応する中間変数(例えば、 tmp0 )を導入し、部分式をノードとして表現することによって、(c)のデータフローグラフが得られる。(d)は、(c)に共通部分式削除が適用された結果のデータフローグラフである。具体的には、変数 tmp0 及び tmp1 は共に式 c << 1 の演算結果であるため、 tmp1 への参照を tmp0 への参照に置き換えることによって、共通の式 c << 1 を1つにまとめる。(e)は、(d)に共通部分式削除がさらに適用された結果のデータフローグラフである。(f)は、(e)にデッドコード削除が適用された結果のデータフローグラフである。具体的には、他のノードから参照されない tmp1 及び tmp3 のノードがデータフローグラフから削除される。
【0165】
以上に説明されたように、冗長演算削除部304は、データフローグラフFdfgを最適化するための追加の処理として、定数伝播、共通部分式削除、及びデッドコード削除の処理を行う。なお、本発明の別の実施形態においては、データフローグラフ最適化部30は、冗長演算削除部304を含まないように構成することができる。
【0166】
[演算器の回路遅延・回路面積評価部31]
データフローグラフ最適化部30によって最適化されたデータフローグラフFdfgは、次いで、演算器の回路遅延・回路面積評価部31に入力される。演算器の回路遅延・回路面積評価部31は、上述のビット幅判定部301によって定められた各演算命令の入出力ビット幅と、各演算の種類とから、対応する演算器の回路遅延(即ち、信号伝播遅延時間)及び回路面積を見積る。演算器の回路遅延を見積ることによって、論理回路生成装置1によって最終的に生成される論理回路の動作速度(即ち、最大動作クロック周波数)を見積ることが可能となる。また、演算器の回路面積をある程度の精度で予測することによって、より省面積の論理回路を得るため、或いはより高速動作の論理回路を得るために、論理回路生成装置1に入力されるプログラムPのソフトウェア記述に対するチューニング作業を高効率化することが可能となる。本実施形態においては、後述するように、ここで評価された演算器の回路遅延は、パイプライン回路としての論理回路の動作クロック周波数を最大化させるための処理においても用いられる。
【0167】
演算器の回路遅延の算出方法については、様々なアプローチが可能である。回路遅延を高精度に算出するためには、RTL記述から特定の半導体プロセス用の回路ライブラリを用いた回路合成を行うツールである論理合成ツールを各演算器に直接適用する方法や、予め幾つかのビット幅で論理合成した結果を保存しておき、実際のビット幅での回路遅延を幾つかの論理合成結果から予測する方法などがある。本実施形態においては、演算器の回路遅延・回路面積評価部31は、以下に説明する簡潔な演算器の遅延モデル及び面積モデルに基づいて、演算器の回路遅延及び回路面積を見積る。これらのモデルによれば、論理合成ツールなどの外部ツールの支援なしに、ある程度の精度で回路遅延及び回路面積を見積ることが可能である。
【0168】
図25に示されるように、同期型の論理回路において、論理回路の最大動作クロック周波数は、論理回路の出力信号の最大信号伝播時間によって決定される。論理回路全体の入力信号及びクロックの立上り(即ち、0から1への遷移)の瞬間に変化する各レジスタ出力信号を信号伝播の発生源としたときに、最大信号伝播時間は、これらの発生源の信号からその他の信号までの信号伝播に要する時間のうち最大のものである。
【0169】
信号伝播の遅延要因は、論理回路を構成する各論理ゲートにおける入力信号が変化してから出力信号が変化するまでの回路遅延にある。本実施形態においては、これら回路遅延が演算器単位でモデル化される。同様に、回路面積も演算器単位でモデル化される。複雑な演算器は、より簡単な演算器を用いて階層的に表現されるが、これに対応して、演算器の遅延モデル及び面積モデルも階層的に表現される。これにより、ソフトウェア記述上表現可能な全ての演算器に遅延モデル及び面積モデルを対応させることが可能であるため、外部の論理合成ツールに依存する必要がない。
【0170】
演算器の回路遅延モデルにおいては、各信号の伝播時間は、信号のMSB(最上位ビット)及びLSB(最下位ビット)の2点のみで表現される。これにより、信号の各ビットで個別に伝播時間を計算するよりも遥かに高速に計算される。また、MSBとLSBとの間の信号伝播の時間差が表現されるため、算術演算器(加算・減算・乗算等)に含まれるキャリー伝播構造に対応し、高精度に回路遅延が計算される。
【0171】
以下の説明において、信号 S のLSB伝播時間を S.TL 、MSB伝播時間を S.TM とそれぞれ表記する。信号伝播の発生源となる信号(即ち、論理回路全体の入力信号及びレジスタ出力信号) SI の伝播時間は、 SI.TL = SI.TM = 0 となる。また、図26に示されるように、演算器のポート i の入力信号を S(i) と表記し、入力ポート i を経由した出力信号を SO'(i) と表記する。従って、例えば、入力ポート i のLSB伝播時間は S(i).TL と表記される。ここで、図26にさらに示されるように、演算器の各入力ポートと出力ポートとの間の信号伝播遅延を表現するために、次の4つの表記を導入する。
【0172】
L(i)(単純伝播遅延)は、入力ポート i のLSBから出力ポートのLSBへの伝播遅延(LSB伝播遅延)、又は入力ポート i のMSBから出力ポートのMSBへの伝播遅延(MSB伝播遅延)を示す。ここで、LSB伝播遅延とMSB伝播遅延とは同じであるという単純なモデルを想定している。
【0173】
C(i)(キャリー伝播遅延)は、入力ポート i のLSBから出力ポートのMSBへの信号伝播遅延時間を示す。これは、主に、加算器のキャリー遅延を表現するために用いられる。キャリー伝播遅延が考慮される(即ち C(i) が 0 でない)演算器としては、加算器、減算器(単項マイナス演算を含む)、乗算器、及び大小比較器が挙げられる。
【0174】
F(i)(入力遅延同期フラグ)は、入力のLSB及びMSBそれぞれの信号伝播時間が同期される(即ち、伝播時間が遅い方に揃えられる)か否かを示し、信号が同期されない場合を F(i) = 0 、信号が同期される場合を F(i) = 1 で表すものとする。具体的には、同値比較器及び論理否定器は、入力の全ビットが到着してから出力が確定するため、全ての入力ポート i について F(i) = 1 とする。また、シフト演算器は、シフト量を指定する第2入力ポートの入力の全ビットが到着してから出力が確定するため、 F(2) = 1 とする。なお、このモデルにおいては、後述するように、1つの信号のLSB伝播時間がMSB伝播時間よりも遅くなることはないため、信号が同期される場合には、LSB伝播時間がMSB伝播時間に揃えられることとなる。
【0175】
TL(i) は、図示されないが、 F(i) によって選択的に行われる信号の同期を考慮した結果の入力信号のLSB伝播時間を表す。即ち、 F(i) == 0 のときには、信号の同期が行われないため、 TL(i) は S(i).TL である。一方、 F(i) == 1 のときには、信号の同期が行われ、LSB伝播時間はMSB伝播時間に揃えられるため、 TL(i) は S(i).TM である。これを式によって表現すると
TL(i) = (F(i) == 1) ? S(i).TM : S(i).TL
となる。
【0176】
図26にさらに示されるように、出力信号のLSB伝播時間 SO'(i).TL は、信号の同期を考慮した入力信号のLSB伝播時間 TL(i) に演算器の単純伝播遅延 L(i) を加えたものとする。これを式によって表現すると
SO'(i).TL = TL(i) + L(i)
となる。
【0177】
また、出力信号のMSB伝播時間 SO'(i).TM は、入力信号のLSB伝播時間 TL(i) に演算器のキャリー伝搬遅延 C(i) を加えたものと、入力信号のMSB伝播時間 TM(i) に演算器の単純伝播遅延 L(i) を加えたものとのうち、いずれか大きいほうとする。これを式によって表現すると
SO'(i).TM = max(S(i).TM + L(i), TL(i) + C(i))
となる。
【0178】
これらの式から、各演算器の各ポートの入力信号のLSB伝播時間がMSB伝播時間より遅くなることがなければ、出力信号のLSB伝播時間がMSB伝播時間より遅くなることがないことがわかる。よって、論理回路全体において、1つの信号のLSB伝播時間がMSB伝播時間より遅くなることはない。
【0179】
図27に示されるように、最終的な演算器の出力信号 SO のMSB伝播時間 SO.TM は、演算器の全ての入力ポート i について、入力ポート i を経由した出力信号のMSB伝播時間 SO'(i).TM のうち最も遅いものとして求められる。LSB伝播時間 SO.TLも同様に、演算器の全ての入力ポート i について、入力ポート i を経由した出力信号のLSB伝播時間 SO'(i).TL のうち最も遅いものとして求められる。但し、演算器の出力信号の幅が1ビットの場合には、LSBとMSBとは同一のビットであるため、MSB伝播時間 SO.TM として求めた値を、LSB伝播時間 SO.TL としても採用する。
【0180】
ここで、 B(出力遅延同期フラグ)は、演算器の出力信号の幅が1ビットであるか否かを表すものとし、1ビット出力の場合に B = 1 、その他の場合に B = 0 とする。これを用いて、最終的な演算器の出力信号 SO のMSB伝播時間 SO.TM 及びLSB伝播時間 SO.TL を式によって表現すると
SO.TM = max{ SO'(i).TM | i ∈ I }
SO.TL = (B == 1) ? SO.TM : max{ SO'(i).TL | i ∈ I }
となる。これらの式において、 I は、演算器の全ての入力ポート i の集合を表す。
【0181】
以上に説明した演算器の回路遅延モデル及び面積モデルについて、以下では、演算器の種類ごとに、より具体的に説明する。そのために、まず、基本論理ゲートの回路遅延及び回路面積を、想定する実装技術(半導体プロセス、FPGA:Field Programmable Gate Array)に対応して適切にモデル化する。ここでモデル化の対象とされる基本ゲートは、論理積(AND)、論理和(OR)、論理否定(NOT)、排他的論理和(XOR)及び2入力1出力マルチプレクサ(MUX)である。2入力1出力マルチプレクサの回路図及び動作を図28に示す。これら以外にも、例えば NAND 又は NOR など、他の基本ゲートを追加しても良い。これらの各基本論理ゲート G の回路遅延モデルを G.delay と表記し、回路面積モデルを G.area と表記することにする(例えば、論理積ゲートの回路遅延は AND.delay と表記される)。
【0182】
次に、基本論理ゲートを組合せた複合ゲートのモデルについて説明する。代表的な複合ゲートとして、1ビット全加算器(FA)、1ビット半加算器(HA)、及び Booth recoder 器(BR)を考える。なお、説明においては、それぞれ回路構造を想定して回路遅延及び回路面積を計算しているが、使用する回路ライブラリから厳密に計算してもよい。
【0183】
1ビット全加算器(FA)は、 a, b, c の3ビットを入力し、 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;
【0184】
1ビット半加算器(HA)は、 a, b の2ビットを入力し、 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;
【0185】
Booth recoder器(BR)は、乗算器で使用され、入力ポート 1 の連続する3ビットをデコードして、入力ポート 0 のデータの 2 倍、 1 倍、 0 倍、 -1 倍、 -2 倍を出力する回路である。図29に示されるように、入力ポート 0 の 1 倍及び 2 倍から成る2ビットの入力(x0, x1)に対して2つの XOR ゲートで -1 倍及び -2 倍を作り、これらを2入力1出力マルチプレクサで選択し、 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;
【0186】
以上説明した基本論理ゲート及び複合ゲートのモデルを利用して、各演算器の回路遅延モデル及び回路面積モデルを見積る処理について、以下に説明する。なお、説明においては、それぞれ回路構造を想定して回路遅延及び回路面積を見積っているが、別の回路構造を想定した場合には結果が異なることがある。
【0187】
説明において、演算器 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 の集合を表す。
【0188】
加算器(ADD)は、出力のうち bw_min ビットを全加算器(FA)で実現し、残りの bw_dif ビットを半加算器(HA)で実現する回路構造を想定する。この回路構造における加算器の回路遅延及び回路面積は次の通りとなる。式において、入力ポートを表す i は 0 又は 1 である。
ADD.L(i) = FA.s_delay (FA の sum 出力遅延1個分)
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
【0189】
減算器(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)
【0190】
乗算器(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 器の出力遅延1個分と 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 器と出力加算用全加算器の回路面積の合計)
【0191】
選択演算器(SEL)は、1ビットの選択入力に基づいて、2つの被選択入力のうち1つを出力する。ここでは、出力信号のビット幅の数のマルチプレクサを用いた回路構造を想定する。この回路構造における選択演算器の回路遅延及び回路面積は次の通りとなる。式において、入力ポートを表す i は 0 又は 1 である。
SEL.L(i) = MUX.delay
SEL.C(i) = 0
SEL.F(i) = 0
SEL.AREA = MUX.area * bw
なお、2つの入力ポートのビット幅が異なる場合には、 bw_min 及び bw_dif を用いてさらに厳密に算出することもできる。
【0192】
大小比較器(CMP)は、2つの入力ポートの減算を行い、演算結果の符号ビットから計算された結果を出力する回路を想定する。減算結果の出力は必要ないので、その分、減算器の回路面積よりも小さくなる。また、出力ビット幅が1なので、出力遅延同期フラグ(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)
【0193】
同値比較否定器(NEQ)は、2つの入力ポートの各ビットがすべて同値である場合に 0 を出力し、そうでない場合に 1 を出力する。回路構造としては、図30に示されるように、2入力のビット毎の XOR 演算出力を、2分木構造を用いて OR で結合したものを想定する。また、出力のビット幅が1なので、出力遅延同期フラグ(B)が 1 となるが、入力ポート側で遅延同期しているため、出力ポート信号のLSB伝播時間とMSB伝播時間とは自動的に同一になる。この回路構成における同値比較否定器の回路遅延及び回路面積は次の通りとなる。式において、入力ポートを表す 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
【0194】
シフト演算器(SHF)は、ポート 1 で指定された値をシフト量として、ポート 0 のデータの右シフト又は左シフトを出力する。回路構造としては、バレルシフタを想定する。バレルシフタは、ポート 1 のシフト量の2進表現において2のべき乗ビットのシフトを行う回路を直列接続して構成される。例えば、Z = X >> Y (X, Y, Z:符号なし32ビット)は、図31に示されるような回路構造になる。ここでは、 Y の下位5ビットだけがシフト量を示すものとする。この回路構成におけるシフト演算器の回路遅延及び回路面積は次の通りとなる。式において、入力ポートを表す 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
【0195】
論理回路生成装置1は、演算器の回路遅延・回路規模評価部31が算出した回路遅延及び回路規模の見積を、例えば、出力装置17に出力することができる。また、別の実施形態においては、論理回路生成装置1は、演算器の回路遅延・回路規模評価部31を含まないようにすることができる。この場合には、論理回路生成装置1は、回路遅延及び回路規模の見積を算出しないが、かかる見積は生成される論理回路を直接構成する情報ではないため、本発明の目的が達成されることに変わりはない。
【0196】
[パイプライン境界配置部32]
演算器の回路遅延・回路規模評価部31によって演算器の回路遅延及び回路規模が評価されたデータフローグラフFdfgは、次いで、パイプライン境界配置部32に入力される。パイプライン境界配置部32は、データフローグラフFdfgから、パイプライン回路を合成し、パイプライン回路データFplcを出力する。パイプライン回路は、繰り返し実行される演算処理がパイプラインステージという処理単位に分割され、これら処理単位を実行する回路ブロックを直列接続させた構造を持つ。本明細書において、パイプラインステージのことを「パイプ段」とも呼ぶこととする。
【0197】
データフローグラフに変換されたプログラムは、そのまま論理回路の回路構造と対応している。即ち、データフローグラフの演算命令が回路上の演算器と対応し、データフローグラフの有向枝が回路上の配線(又は信号)と対応する。従って、パイプライン回路を合成することは、データフローグラフをパイプ段に分割すること、即ち、データフローグラフの各命令ノードへパイプ段割当を行うことと等価である。隣接する2つのパイプ段の間のパイプライン境界を交差するデータフロー有向枝にレジスタを挿入することにより、レジスタに入力された値は、1クロックの遅延時間の後にレジスタ出力で参照可能となる。
【0198】
そこで、パイプライン境界配置部32は、まず、データフローグラフFdfgをパイプライン構造に分割する際の制約を抽出する処理を行い、次いで、データフローグラフFdfgの各命令ノードへパイプ段を割当てる処理を行う。より具体的には、パイプライン境界配置部32は、パイプライン制約抽出部321と、パイプライン段数決定部322と、パイプライン回路合成部323とを含む。
【0199】
パイプライン制約抽出部321は、後述のパイプライン回路合成部323における処理の準備として、データフローグラフFdfgをパイプ段に分割する際の制約を抽出する処理を行う。
【0200】
レジスタ属性は、変数への代入(書込み)と変数の参照(読出し)との間に1クロックの遅延時間が発生するレジスタに、変数の値を保存することを指定する。メモリ属性を持つ配列変数の読出しタイミングも、通常使われる同期型メモリの場合には、同様に1クロックの遅延時間が発生する。パイプライン回路構造を合成する際には、各変数の参照可能タイミングを正確に評価する必要がある。順序回路の状態変数を表現する変数は、クロックの前後にわたって値を保持する必要があるため、レジスタ属性を持つことが必要である。本実施形態においては、論理回路生成装置1に入力されるプログラムPにおいて、順序回路の状態変数を表現する変数に対してレジスタ属性が明示されることを必須とし、レジスタ属性記述が省略された場合には回路合成不可とする。別の実施形態においては、順序回路の状態変数を表現する変数に対してレジスタ属性記述が省略された場合でも、自動的にレジスタ属性を付加するようにすることができる。いずれの実施形態においても、この処理の以降の段階では、順序回路の状態変数にはレジスタ属性が付加されている。
【0201】
1クロック遅延を伴うレジスタ変数への参照命令は、次の2つに分類される。1つは、代入後参照命令である。これは、代入命令が実行された以降の同変数への参照命令である。もう1つは、代入前参照命令である。これは、代入命令が実行される以前の同変数への参照命令である。
【0202】
パイプライン制約抽出部321は、まず、これらの参照命令をパイプ段に割当てる。このとき、代入後参照命令は、代入命令が含まれるパイプ段より1つ後方のパイプ段に割当てる。即ち、代入命令と代入後参照命令との間にパイプライン境界を挟む。これによって、代入後参照命令におけるレジスタ変数の参照タイミングは、代入タイミングより1クロック遅れることになり、代入命令によって変数に代入されたデータを読出すことになる。一方、代入前参照命令は、代入命令と同じパイプ段に割当てる。これによって、代入前参照命令は、代入命令実行前のデータを読出すことになる。
【0203】
図32及び図33を参照して、参照命令をパイプ段に割当てる処理について、具体例を用いて説明する。図32は、レジスタ変数の代入前参照命令及び代入後参照命令を含むプログラムの例を示す。図33は、図32のプログラムから生成されるパイプライン回路におけるパイプライン配置を示す。この例において、パイプライン制約抽出部321は、変数 stt に対する代入前参照命令(○1)、代入命令(○3)、及びデータフローグラフFdfgの(○1)→(○3)の経路上にある命令(○2)を、同じパイプ段に割当てる。
【0204】
次いで、パイプライン制約抽出部321は、レジスタ変数更新命令ノード群グループ化処理を行う。前述の通り、レジスタ変数の代入前参照命令は、代入命令と同じパイプ段に割当てることによって、代入命令実行前のデータ即ち1クロック前のデータを読出すようになるが、これよりも前方のパイプ段に割当てることは出来ない。なぜならば、代入命令のパイプ段よりも前方のパイプ段に割当てた場合には、読出される参照データは2クロック以上前の代入データになり、プログラムが意図する動作(即ち、1クロック前の代入データを参照する動作)の回路が実現しないからである。また、各代入前参照命令から代入命令までのデータフローグラフ経路上にあるすべての命令(図33において、(○1)→(○2)→(○3)の経路がこれに当たる。)についても、同じパイプ段に割当てる必要がある。そこで、パイプライン制約抽出部321は、次に説明する処理によって、データフローグラフFdfgを、これらの命令が同一のパイプ段に割当たることが保証される構造に変換する。
【0205】
レジスタ変数への代入前参照命令ノードから同変数への代入命令ノードまでのデータフローグラフ経路上のすべての命令ノード群を、レジスタ変数更新命令ノード群と呼ぶ。ただし、代入命令ノードへのデータフローグラフ経路が存在しない代入前参照命令ノードについては、この代入前参照命令ノードだけをレジスタ変数更新命令ノード群に含める。パイプライン制約抽出部321は、レジスタ変数更新命令ノード群を、一つの命令ノードに縮退したレジスタ変数更新縮退命令ノードに置き換えるデータフローグラフ変換処理を行う。より具体的には、レジスタ変数更新命令ノード群に含まれる命令ノード同士を結ぶ全ての有向枝を取り除く。そして、レジスタ変数更新命令ノード群に含まれる命令ノードと外部の命令ノードとを結ぶ有向枝を、レジスタ変数更新縮退命令ノードに繋ぎ直す。なお、このデータフローグラフ変換処理によって、代入命令と代入前参照命令とを結ぶ逆方向のデータフローグラフ有向枝(即ち、ループを形成する有向枝)は全て取り除かれることになる。
【0206】
図34は、図33のデータフローグラフFdfgに対してレジスタ変数更新命令ノード群グループ化処理を行った結果のデータフローグラフFdfgを示す。図33において、レジスタ変数 stt への代入前参照命令ノード(○1)から同変数への代入命令ノード(○3)までのデータフローグラフ経路上のすべての命令ノード群(○1)、(○2)及び(○3)が、1つのレジスタ変数更新命令ノード群である。パイプライン制約抽出部321は、このレジスタ変数更新命令ノード群を、図34において(○1)(○2)(○3)として示されるレジスタ変数更新縮退命令ノードに置き換える。
【0207】
次いで、パイプライン制約抽出部321は、データフローグラフ有向枝に対してパイプライン境界属性を付加する処理を行う。レジスタ変数への代入命令と同変数への代入後参照命令との間には、1クロックのレジスタ出力遅延時間を実現するために、パイプライン境界が存在する必要がある。そこで、パイプライン制約抽出部321は、これらの命令を結ぶデータフローグラフ有向枝にパイプライン境界属性を付加し、この有向枝がパイプライン境界を交差するようなパイプ段割当を行う。
【0208】
また、メモリ配列変数の参照命令は、前述のレジスタ/メモリ配列アクセス命令分解部25において、読出しアドレス変数への代入命令と、読出しアドレス変数を配列インデックスとした配列参照命令とに細分化されている。ここで、前述のように、同期型メモリにおける1クロックのデータ読出し遅延時間を実現するために、これらの2つの命令の間にもパイプライン境界が存在する必要がある。そこで、パイプライン制約抽出部321は、これらの命令を結ぶ、読出しアドレス変数に対応するデータフローグラフ有向枝にパイプライン境界属性を付加し、この有向枝がパイプライン境界を交差するようなパイプ段割当を行う。
【0209】
前述の通り、パイプライン回路を合成することは、データフローグラフ上の各命令ノードのパイプ段割当を行うことと等価である。パイプライン回路合成部323は、次に説明するパイプ段割当制約を満たしたパイプ段初期割当を行い、その後、データフローグラフFdfgの各命令ノードのパイプ段割当を変更しながら各パイプ段の信号伝播時間(以降、「パイプライン遅延」とも呼ぶ。)を均等化するパイプライン遅延均等化処理と、パイプライン境界に配置されるレジスタ数を最小化するパイプラインレジスタ数最小化処理とを行うことによって、データフローグラフFdfgからクロック同期型パイプライン回路Fplcを合成する。パイプライン回路合成部323におけるこれらの処理の流れを、図35に示す。以下に、これらの処理について、より具体的に説明する。なお、以降の説明では、データフローグラフ有向枝の始点ノードのパイプ段を有向枝の「始点パイプ段」と呼び、同終点ノードのパイプ段を有向枝の「終点パイプ段」と呼ぶことにする。
【0210】
データフローグラフFdfgの各命令ノード対するパイプ段割当制約には、次に説明する、データ依存制約及びパイプライン境界制約がある。
【0211】
データフローグラフ有向枝は、その始点ノード(変数への代入命令ノード)と終点ノード(変数への参照命令ノード)とのデータ依存性を表している。ここで、有向枝の始点パイプ段と終点パイプ段は、同一であるか、もしくは、始点パイプ段が終点パイプ段よりも前方のパイプ段となるように割当てる必要がある。この制約を、データ依存制約という。
【0212】
パイプライン境界属性を付加されたデータフローグラフ有向枝を、パイプライン境界枝と呼ぶことにする。パイプライン境界枝については、始点パイプ段が終点パイプ段よりも前方のパイプ段となるように割当てる必要があり、同一のパイプ段に割当てることはできない。これを、パイプライン境界制約という。
【0213】
また、パイプライン境界枝のうち、始点パイプ段と終点パイプ段とが隣接している(即ち、始点パイプ段の1つ後方のパイプ段が終点パイプ段である)ときに、この有向枝を、クリティカルパイプライン境界枝と呼ぶことにする。これは、パイプ段割当制約そのものではないが、パイプ段割当を変更する際に、パイプライン境界制約が満たされるかどうかを判別するための属性である。
【0214】
パイプライン境界枝が存在する場合には、そのパイプライン境界を挟んで少なくとも2つのパイプ段が必要となる。1つのデータフローグラフ経路上に複数のパイプライン境界枝が存在する場合には、それらのデータフローグラフ経路上のパイプライン境界枝はすべて異なるパイプライン境界を交差する必要がある。このようにパイプライン境界制約によって定まる必要最小のパイプ段数を、パイプライン段数下限値と呼ぶ。例えば、図36に示されるように、3つのパイプライン境界枝が1つのデータフローグラフ経路上に存在する場合には、パイプライン段数下限値は 4 となる。パイプライン段数決定部322は、算出したパイプライン段数下限値と、次に説明する回路設計者の指定に基づくパイプライン段数と、のうち最大のものを、最終的なパイプライン段数として決定する。
【0215】
本実施形態の論理回路生成装置1を使用する回路設計者は、生成される論理回路のクロック周期を指定することができ、又は、生成される論理回路のパイプライン段数を指定することができる。回路設計者がクロック周期を指定した場合には、クロック周期から算出されたパイプライン段数を、回路設計者の指定に基づくパイプライン段数とする。回路設計者がパイプライン段数を指定した場合には、そのパイプライン段数を、回路設計者の指定に基づくパイプライン段数とする。
【0216】
より具体的には、回路設計者がクロック周期指定した場合には、それぞれのパイプ段の最大信号伝播時間が指定されたクロック周期以下になるようなパイプライン段数を算出する。パイプライン分割される前のデータフローグラフFdfg全体の最大信号伝播時間を Dtotal とし、指定されたクロック周期が Dspec とすると、パイプライン段数の算出値 PSspec は、
PSspec = ceil(Dtotal / Dspec)
と算出される。また、回路設計者がパイプライン段数を指定した場合には、その指定値を PSspec とする。いずれの場合にも、パイプライン段数下限値を PSmin とすると、最終的なパイプライン段数 PS は、
PS = max(PSspec, PSmin)
と算出される。
【0217】
パイプライン回路合成部323は、まず、パイプ段割当制約を満たすように各命令へパイプ段を割当てる、パイプ段初期割当処理を行う。この処理における命令へのパイプ段の割当をパイプ段初期割当という。この処理は、データフローグラフ経路上の各命令を順方向(即ち、入力側から出力側の方向)に辿りながら、前方のパイプ段から順次割当てて行く単純な処理によって実現される。
【0218】
次いで、パイプライン回路合成部323は、パイプライン遅延均等化処理及びパイプラインレジスタ最小化処理を行う。これらの処理においては、パイプ段割当から定まるパイプライン境界を局所的に変更する(即ち、1つの命令ノードのパイプ段割当を変更する)処理が繰返される。パイプ段割当制約を満たしながらパイプ段割当の変更が可能な命令ノードは、次に説明するパイプ段出力辺境ノード及びパイプ段入力辺境ノードに限られる。
【0219】
パイプ段出力辺境ノードとは、ある命令ノードにおいて、
(1)その命令ノードを始点とするすべてのデータフローグラフ有向枝の終点パイプ段が、その命令ノードのパイプ段(即ち、有向枝の始点パイプ段)よりも後方に位置し、かつ、
(2)その命令ノードを始点とするクリティカルパイプライン境界枝が存在しない
ような命令ノードをいう。パイプ段出力辺境ノードは、後方のパイプ段に移動することが可能である。
【0220】
パイプ段入力辺境ノードとは、ある命令ノードにおいて、
(1)その命令ノードを終点とするすべてのデータフローグラフ有向枝の始点パイプ段が、その命令ノードのパイプ段(即ち、有向枝の終点パイプ段)よりも前方に位置し、かつ、
(2)その命令ノードを終点とするクリティカルパイプライン境界枝が存在しない
ような命令ノードをいう。パイプ段入力辺境ノードは、前方のパイプ段に移動することが可能である。
【0221】
パイプライン境界の局所変更処理において、個々の局所変更が「有益」であるか否かを判定するための目的関数について説明する。この目的関数は、パイプライン境界の局所変更処理の目的に依存して、以下のように定義する。
【0222】
パイプライン遅延均等化処理においては、各パイプ段の信号伝播時間を均等化することによって、回路全体の動作クロック周波数を最大化することを目的とする。ここで、 n 番目のパイプ段の最大信号伝播時間を D(n) としたとき、パイプライン遅延均等化処理の目的関数 E1 は、次式によって定義される。
E1 = Σn D(n)2
即ち、個々のパイプ段の最大信号伝播時間の2乗和をここでの目的関数とする。パイプライン回路合成部323は、この目的関数を最小化するようにパイプライン境界を調整することによって、各々のパイプ段の最大信号伝播時間を均等化する。本実施形態においては、パイプ段の最大信号伝播時間 D(n) は、演算器の回路遅延・回路規模評価部31によって評価された演算器の回路遅延に基づいて算出される。
【0223】
また、パイプラインレジスタ数最小化処理においては、各パイプライン境界を交差するデータフローグラフ有向枝上に挿入されるレジスタ数を最小化することによって、回路面積を最小化することを目的とする。ここで、データフローグラフ有向枝に対応する変数のビット幅を、その有向枝の重みと呼ぶことにする。 n 番目のパイプ段の出力側のパイプライン境界を交差するデータフローグラフ有向枝の重みの総数を R(n) としたとき、その目的関数 E2 は以下の数式で定義する。
E2 = Σn R(n)
即ち、パイプライン境界を交差するデータフローグラフ有向枝の重みの総和をここでの目的関数とする。パイプライン回路合成部323は、この目的関数を最小化するようにパイプライン境界を調整することによって、パイプラインレジスタ数を最小化する。
【0224】
さらに、パイプライン遅延均等化処理及びパイプラインレジスタ数最小化処理におけるそれぞれの目的関数 E1 及び E2 の他に、パイプライン回路全体の動作クロック周波数を最終的に決定する次式の評価関数を定義する。
Dmax = max{ D(n) | n ∈ すべてのパイプ段 }
この Dmax を増大させるパイプライン境界の局所変更は、禁止される。
【0225】
本実施形態においては、パイプライン境界の局所変更処理を制御する方法として、焼き鈍し法(Simulated Annealing 法、本明細書において「SA法」とも呼ぶ。)を用いる。図37を参照して、パイプライン回路合成部323が行うSA法について、より具体的に説明する。
【0226】
まず、SA法のパラメータである温度 T に、適切な初期値を設定する。温度 T の意味については後述する。
【0227】
次に、パイプ段出力辺境ノード及びパイプ段入力辺境ノードのうち、1つの命令ノードをランダムに選択し、移動可能な方向にパイプ段の割当の変更を行う。ここで、パイプ段割当変更前の最大パイプライン遅延 Dmax (前述)と、パイプ段割当変更後の最大パイプライン遅延 D'max とについて、 Dmax < D'max の場合には、パイプ段割当変更を却下し、変更前のパイプ段割当に戻す。 Dmax >= D'max の場合には、以下の処理に進む。
【0228】
次に、前述で定義された目的関数( E1 または E2 )を用いて、パイプ段割当変更前の目的関数値 E と変更後の目的関数値 E' との差分であるパイプ段割当変更コスト ΔC を計算する。即ち、
ΔC = E - E'
とする。
【0229】
次に、パイプ段割当変更コスト ΔC から、パイプ段割当変更を採用するか否かを確率的に判定するための採用閾値を、次式で定義する。
P = exp(ΔC / T)
この式において、 T は、割当変更の採用確率を制御するためのSA法の「温度」と呼ばれる、正の実数値をとるパラメータである。
【0230】
次に、パイプ段割当変更を採用するか否かを最終的に判定するために、 0 以上 1 未満の乱数 R を生成し、 P と R との関係に従って次のいずれかを実行する。
(1) R < P の場合には、パイプ段割当変更を採用する。また、これまでのパイプ段割当の目的関数の最小評価値 Emin と E' とを比較し、 Emin > E' の場合には、 Emin = E' とし、パイプ段割当の最適解を更新する。
(2) R >= P の場合には、パイプ段割当変更を却下し、パイプ段割当変更前の状態に戻す。
なお、目的関数値が減少するパイプ段割当変更の場合、即ち ΔC = E = E' < 0 の場合には、採用閾値 P は 1 より大きくなるので、必ず上記(1)が実行され、パイプ段割当変更は採用される。
【0231】
次に、温度 T を更新する。温度 T は、初期段階では比較的大きい(即ち「熱い」)値に設定し、目的関数値が増加するようなパイプ段割当変更を採用する確率を大きくすることで、パイプ段配置の局所最適解から脱出し易いようにする。割当変更処理が進むに連れて温度 T を徐々に減少させて行く(即ち「冷やす」)ことで、パイプ段配置の大局的最適解に近づけるように制御する。
【0232】
ノードの選択から温度 T の更新までの上記処理を、温度 T が所定値を下回るまで繰り返す。温度 T が所定値を下回ったときの上述の最適解が、SA法によるパイプライン遅延均等化処理及びパイプラインレジスタ最小化処理の結果となる。
【0233】
[RTL記述出力部33]
パイプライン境界配置部32によって出力されたパイプライン回路データFplcは、次いで、RTL記述出力部33に入力される。本実施形態における論理回路生成装置1は、生成した論理回路を、RTL記述の形式で出力する。そこで、RTL記述出力部33は、入力されたパイプライン回路データFplcを、RTL記述に変換する。RTL記述による論理回路の表現は公知の技術であるため、ここでは具体的な説明は省略するが、パイプライン回路データFplcはデータフローグラフであり、前述の通り、データフローグラフは論理回路の回路構造と対応しているため、これをそのままRTL記述によって表現することが可能である。なお、本発明の目的を達成するためには、論理回路生成装置1の出力形式は、RTL記述の形式に限らず、論理回路を記述する任意の適切な形式で構わない。即ち、本発明の論理回路生成装置1は、一般には、論理回路記述出力部を備え、本実施形態における論理回路記述出力部は、RTL記述を出力するRTL記述出力部33である。
【0234】
RTL記述出力部33によって変換されたRTL記述は、論理回路記述Dとして、論理回路生成装置1から出力される。以上が、本実施形態における論理回路生成装置1の各部の説明である。
【0235】
次に、図38図44を参照して、本発明の論理回路生成装置1の実施形態のいくつかの例について説明する。各図において、淡色で示される部分は、その図が示す実施形態における論理回路生成装置1には含まれない構成要素を、他の実施形態と対照させるために示すものである。
【0236】
図38に示される実施形態の論理回路生成装置1は、制御フローグラフ生成部23と、制御フロー縮退変換部28と、データフローグラフ生成部29と、RTL記述出力部(論理回路記述出力部)33とを備える。制御フロー縮退変換部28は、基本ブロック単一化部282を含む。この実施形態の論理回路生成装置1は、関数呼出し命令もループ制御部も含まず、変数をインデックスとする配列アクセス命令も含まない、静的単一代入形式で記述されたプログラムPを入力に取り、論理回路記述Dを出力する。論理回路の入力信号及び出力信号は、プログラムPにおいて明示的に指定することができる。
【0237】
図39に示される実施形態の論理回路生成装置1は、図38の実施形態に加えて、静的単一代入形式変換部27をさらに備える。また、制御フロー縮退変換部28は、φ関数命令実体化部281をさらに含む。本実施形態の論理回路生成装置1は、入力されたプログラムPを内部で静的単一代入形式に変換するため、論理回路生成装置1が入力に取るプログラムPは、必ずしも静的単一代入形式で記述されたものである必要はない。
【0238】
図40に示される実施形態の論理回路生成装置1は、図38の実施形態に加えて、レジスタ/メモリ配列アクセス命令分解部25と、メモリポート数判定部26とをさらに備える。また、制御フロー縮退変換部28は、レジスタ/メモリ配列命令融合部283をさらに含む。本実施形態の論理回路生成装置1は、変数をインデックスとする配列アクセス命令を含むプログラムPを入力に取ることができ、マルチポートレジスタファイル及びマルチポートメモリを含む論理回路を表現する論理回路記述Dを生成することができる。
【0239】
図41に示される実施形態の論理回路生成装置1は、図38の実施形態に加えて、データフローグラフ最適化部30、演算器の回路遅延・回路規模評価部31、及びパイプライン境界配置部32をさらに備える。本実施形態の論理回路生成装置1は、最適化されたパイプライン回路記述を出力することができる。また、本実施形態の論理回路生成装置1は、生成する論理回路の回路遅延及び回路規模の見積を算出することができる。
【0240】
図42に示される実施形態の論理回路生成装置1は、図38の実施形態に加えて、論理回路入出力信号抽出部22をさらに備える。本実施形態の論理回路生成装置1は、生成することになる論理回路の入力信号及び出力信号を抽出するため、これらの信号が論理回路生成装置1の外部から明示的に指定される必要はない。
【0241】
図43に示される実施形態の論理回路生成装置1は、図38の実施形態に加えて、非循環・非階層変換部21をさらに備える。本実施形態の論理回路生成装置1は、入力されたプログラムPに含まれる最上位関数Ftopを内部で非循環型最下層関数Fexpに変換するため、入力されるプログラムPに含まれる最上位関数Ftopは、必ずしも非循環型最下層関数である必要はない。
【0242】
図44に示される実施形態の論理回路生成装置1は、図38の実施形態に加えて、状態変数命令依存性判定部24さらに備える。本実施形態の論理回路生成装置1は、同一の状態変数に対して代入命令・参照命令・代入命令がこの順序で連続して実行されるようなプログラムPが入力されたときには、論理回路記述を生成する処理を停止する。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17
図18
図19
図20
図21
図22
図23
図24
図25
図26
図27
図28
図29
図30
図31
図32
図33
図34
図35
図36
図37
図38
図39
図40
図41
図42
図43
図44