(57)【特許請求の範囲】
【請求項１】
プログラミング言語を用いて集積回路を動作レベルで記述したソースコードに基づいて、前記ソースコードに規定されたデータのビット幅と、前記ソースコードに規定された命令間の処理の依存関係と、前記命令間のデータの依存関係とを特定し、
特定した前記ビット幅と、前記命令間の処理の依存関係と、前記命令間のデータの依存関係とに基づいて、配線混雑要因となる前記ソースコード内のループ箇所を検出する、
制御部を有することを特徴とする設計支援装置。
【請求項２】
前記制御部は、特定した前記命令間の処理の依存関係と、前記命令間のデータの依存関係とに基づいて、前記ソースコード内のループ箇所を特定し、
特定した前記ビット幅に基づいて、特定した前記ループ箇所における変数の演算に用いるモジュールに接続される配線の数を算出し、
算出した前記配線の数が閾値より大きければ、特定した前記ループ箇所を、前記配線混雑要因となる前記ソースコード内のループ箇所として検出する、ことを特徴とする請求項１に記載の設計支援装置。
【請求項３】
前記制御部は、前記ソースコードに規定された各命令をノードとして有向グラフ化してプログラム依存グラフを作成することにより、前記ビット幅と、前記命令間の処理の依存関係と、前記命令間のデータの依存関係とを特定し、
前記プログラム依存グラフ内の分岐命令を表すノードを含む閉路部分に対応する前記ソースコード内のループ箇所を特定する、ことを特徴とする請求項１または２に記載の設計支援装置。
【請求項４】
前記制御部は、検出した前記ループ箇所を展開したソースコードを生成する、ことを特徴とする請求項１〜３のいずれか一つに記載の設計支援装置。
【請求項５】
コンピュータが、
プログラミング言語を用いて集積回路を動作レベルで記述したソースコードに基づいて、前記ソースコードに規定されたデータのビット幅と、前記ソースコードに規定された命令間の処理の依存関係と、前記命令間のデータの依存関係とを特定し、
特定した前記ビット幅と、前記命令間の処理の依存関係と、前記命令間のデータの依存関係とに基づいて、配線混雑要因となる前記ソースコード内のループ箇所を検出する、
処理を実行することを特徴とする設計支援方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、設計支援装置、および設計支援方法に関する。
【背景技術】
【０００２】
従来、集積回路の設計工程では、アルゴリズム設計の工程と、高位合成の工程と、論理合成の工程と、レイアウト設計の工程とが順番に行われる。アルゴリズム設計の工程は、プログラミング言語を用いて集積回路を動作レベル（ＢＬ：Ｂｅｈａｖｉｏｒ  Ｌｅｖｅｌ）で記述したソースコードを作成する工程である。
【０００３】
関連する技術としては、例えば、集積回路の論理設計の段階で、モジュール間の配線長とモジュールにおける配線混雑を正確に見積もり、その上で集積回路の論理設計結果を集積回路の実装設計に反映させるものがある。また、例えば、高位合成方法は、入力ファイルと制約ファイルとに基づいてＣＤＦＧ（Ｃｏｎｔｒｏｌ  Ｄａｔａ  Ｆｌｏｗ  Ｇｒａｐｈ）を生成し、ＣＤＦＧとデジタル回路の制約条件とに基づいてＦＳＭを生成し、ＣＤＦＧの各ノードをＦＳＭの各状態に割り当ててスケジューリングする技術がある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００９−１９９４６７号公報
【特許文献２】特開２００４−１６４６２７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、上述した従来技術では、アルゴリズム設計の工程においてソースコード内のどこが配線混雑要因となるかを判断することが難しい。例えば、アルゴリズム設計よりも下流の工程に進んでから配線混雑が発生することが判明すると、手戻りが発生して、集積回路の設計工程にかかる時間が増大してしまう場合がある。
【０００６】
１つの側面では、本発明は、配線混雑要因となるソースコード内のループ箇所を検出することができる設計支援装置、および設計支援方法を提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一側面によれば、プログラミング言語を用いて集積回路を動作レベルで記述したソースコードに基づいて、前記ソースコードに規定されたデータのビット幅と、前記ソースコードに規定された命令間の処理の依存関係と、前記命令間のデータの依存関係とを特定し、特定した前記ビット幅と、前記命令間の処理の依存関係と、前記命令間のデータの依存関係とに基づいて、配線混雑要因となる前記ソースコード内のループ箇所を検出する設計支援装置、および設計支援方法が提案される。
【発明の効果】
【０００８】
本発明の一態様によれば、ソースコード内の配線混雑要因となるループ箇所を検出することができるという効果を奏する。
【図面の簡単な説明】
【０００９】
【図１】図１は、本実施の形態にかかる設計支援方法の一実施例を示す説明図である。
【図２】図２は、設計支援装置１００のハードウェアの一例を示すブロック図である。
【図３】図３は、設計支援装置１００の機能的構成例を示すブロック図である。
【図４】図４は、ＰＤＧ４０２を作成する一例を示す説明図である。
【図５】図５は、集積回路が有するレイヤの一例を示す説明図である。
【図６】図６は、モジュールに用いる配線の一例を示す説明図である。
【図７】図７は、配線混雑が発生する一例を示す説明図である。
【図８】図８は、モジュールの一例を示す説明図である。
【図９】図９は、モジュールの他の例を示す説明図である。
【図１０】図１０は、配線混雑要因の検出対象となるソースコード１００１の一例を示す説明図である。
【図１１】図１１は、ソースコード１００１に基づいてＰＤＧ１１００を作成する一例を示す説明図である。
【図１２】図１２は、変数の組み合わせを特定する一例を示す説明図である。
【図１３】図１３は、変数についての演算回数のパターンを特定する一例を示す説明図である。
【図１４】図１４は、変数についての演算に要する配線の数を特定する一例を示す説明図である。
【図１５】図１５は、検出処理手順の一例を示すフローチャートである。
【図１６】図１６は、分離フェーズの一例を示す説明図である。
【図１７】図１７は、組み合わせ抽出フェーズの一例を示す説明図である。
【図１８】図１８は、共通コード抽出フェーズの一例を示す説明図である。
【図１９】図１９は、共通コードを抽出する一例を示す説明図である。
【図２０】図２０は、生成フェーズの一例を示す説明図である。
【図２１】図２１は、生成処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下に、図面を参照して、本発明にかかる設計支援装置、および設計支援方法の実施の形態を詳細に説明する。
【００１１】
（本実施の形態にかかる設計支援方法の一実施例）
まず、図１を用いて、本実施の形態にかかる設計支援方法の一実施例について説明する。図１は、本実施の形態にかかる設計支援方法の一実施例を示す説明図である。図１において、設計支援装置１００は、集積回路の設計工程１１０における手戻りの発生を抑制するコンピュータである。手戻りとは、既に行った工程に戻って、当該工程をやり直すことである。
【００１２】
集積回路の設計工程１１０では、アルゴリズム設計の工程と、高位合成の工程と、論理合成の工程と、レイアウト設計の工程とが順番に行われる。アルゴリズム設計の工程は、例えば、Ｃ言語を用いて集積回路を動作レベルで記述したソースコードを作成し、ＳｙｓｔｅｍＣ（登録商標）を用いてソースコードを変換し、変換したソースコードを得る工程である。
【００１３】
また、高位合成の工程は、ソースコードを、集積回路をレジスタ転送レベル（ＲＴＬ：Ｒｅｇｉｓｔｅｒ  Ｔｒａｎｓｆｅｒ  Ｌｅｖｅｌ）で記述したＲＴＬコードに変換する工程である。また、論理合成の工程は、ＲＴＬコードを、集積回路を論理ゲートレベル（ＧＬ：Ｇａｔｅ  Ｌｅｖｅｌ）で記述したネットリストに変換する工程である。また、レイアウト設計の工程は、ネットリストに基づいて、集積回路のレイアウトを決定する工程である。
【００１４】
以下の説明では、アルゴリズム設計の工程から論理合成の工程までを含む、集積回路の論理設計を行う段階を「フロントエンド」と表記する場合がある。また、以下の説明では、レイアウト設計の工程を含む、集積回路の物理設計を行う段階を「バックエンド」と表記する場合がある。フロントエンドとバックエンドとは分業されることがある。換言すれば、フロントエンドとバックエンドとは、それぞれ異なる人間や部署などによって管轄されることがある。
【００１５】
ところで、バックエンドのレイアウト設計の工程において、集積回路のレイアウトを試作して検証し、集積回路のレイアウト上で配線混雑が発生するか否かを判定する場合が考えられる。配線混雑とは、ある領域に配置可能な配線の数よりも、当該領域に要する配線の数が多くなってしまうことである。配線混雑が発生すると集積回路を製造することができなくなる。この場合、レイアウト設計の工程まで進んでから配線混雑が発生することが判明することになり、アルゴリズム設計の工程まで戻ってソースコードを修正し、高位合成、論理合成、レイアウト設計の工程をやり直すことになってしまう。
【００１６】
このため、集積回路の設計工程１１０に手戻りが発生し、集積回路の設計工程１１０にかかるコストや時間の増大を招いてしまう。特に、この場合、バックエンドまで進んだ後に、バックエンドとは管轄する人間や部署などが異なるフロントエンドまで戻って、高位合成や論理合成などの工程をやり直すことになるため、集積回路の設計工程１１０にかかるコストや時間などが増大しやすい。
【００１７】
また、フロントエンドの論理合成の工程において、物理論理合成ツールを用いて、集積回路のレイアウト上で配線混雑が発生するか否かを判定する場合が考えられる。この場合、論理合成の工程まで進んでから配線混雑が発生することが判明することになり、アルゴリズム設計の工程まで戻ってソースコードを修正し、高位合成や論理合成の工程をやり直すことになってしまう。このため、集積回路の設計工程１１０に手戻りが発生し、集積回路の設計工程１１０にかかるコストや時間の増大を招いてしまう。
【００１８】
このように、集積回路の設計工程１１０のうち、より下流の工程において、集積回路のレイアウト上で配線混雑が発生するか否かを判定するようにするほど、集積回路の設計工程１１０にかかる時間やコストが増大しやすくなる。換言すれば、集積回路の設計工程１１０のうち、より上流の工程において、集積回路のレイアウト上で配線混雑が発生するか否かを判定することが望ましい。
【００１９】
そこで、本実施の形態では、アルゴリズム設計の工程において、集積回路のレイアウト上で配線混雑が発生するか否かを判定し、配線混雑要因となるソースコード内のループ箇所を検出することができる設計支援方法について説明する。これによれば、高位合成や論理合成の工程を行わなくても、集積回路のレイアウト上で配線混雑が発生するか否かを判定することができる。
【００２０】
（１）設計支援装置１００は、高位合成の工程が行われる前に、ＳｙｓｔｅｍＣを用いて記述されたソースコード１０１を取得する。ＳｙｓｔｅｍＣは、ハードウェア記述言語の一つである。
【００２１】
（２）設計支援装置１００は、取得したソースコード１０１に基づいて、ソースコード１０１に規定されたデータのビット幅、ソースコード１０１内の命令間の処理の依存関係、および命令間のデータの依存関係を特定する。設計支援装置１００が、ソースコードに規定されたデータのビット幅、ソースコード内の命令間の処理の依存関係、および命令間のデータの依存関係を特定する具体例については、図１１を用いて後述する。
【００２２】
処理の依存関係は、ある条件を定義する命令と、当該条件に基づいて行われる他の命令との間にある依存関係である。以下の説明では、処理の依存関係を「ＣＤ（Ｃｏｎｔｒｏｌ  Ｄｅｐｅｎｄｅｎｃｅ）」と表記する場合がある。データの依存関係は、ある変数を定義する命令と、当該変数を参照する命令との間にある依存関係である。以下の説明では、データの依存関係を「ＤＤ（Ｄａｔａ  Ｄｅｐｅｎｄｅｎｃｅ）」と表記する場合がある。
【００２３】
（３）設計支援装置１００は、特定したソースコード１０１に規定されたデータのビット幅と、ソースコード１０１内の命令間のＣＤおよびＤＤとに基づいて、配線混雑要因となるソースコード１０１内のループ箇所１０２を検出する。設計支援装置１００が、配線混雑要因となるソースコード１０１内のループ箇所１０２を検出する具体例については、図１１〜図１４を用いて後述する。
【００２４】
設計支援装置１００は、例えば、命令間のＣＤおよびＤＤに基づいて、循環する構造になる依存関係がある複数の命令を特定することにより、当該複数の命令に対応するソースコード１０１内のループ箇所１０２を特定する。次に、設計支援装置１００は、データのビット幅に基づいて、検出したループ箇所１０２に記述された変数の読み出し演算または書き込み演算に要するモジュールに用いる配線の数を算出する。
【００２５】
変数の読み出し演算または書き込み演算に要するモジュールとは、セレクタである。モジュールは、例えば、マルチプレクサまたはデマルチプレクサである。図１の例では、数値０（３２ビット）が入力され、入力された数値０が制御信号Ｓ（４ビット）に基づいて配列の各要素Ａ［ｉ］（３２ビット）のいずれかに出力されるデマルチプレクサが用いられる。
【００２６】
以下の例では、配線とは、信号の伝送路として用いられる経路である。配線は、例えば、集積回路のレイヤ上の配線路である。配線は、配線上にモジュールが配置されるとモジュールの前後に分断され、異なる伝送路として用いられる。このため、配線は、モジュールに入出力される２つの信号を伝送することができる。
【００２７】
そして、設計支援装置１００は、算出した配線の数に基づいて、当該モジュールを配置する領域において、当該モジュールに用いる配線を配置することができるか否かを判定する。ここで、設計支援装置１００は、モジュールに用いる配線を配置することができないと判定した場合、特定したループ箇所１０２を、ソースコード１０１内の配線混雑要因となるループ箇所として検出する。設計支援装置１００は、具体的には、配線の数が、モジュールが配置される領域において配置可能な配線の数よりも大きい場合に、モジュールに用いる配線を配置することができないと判定し、配線混雑要因を検出する。
【００２８】
これにより、設計支援装置１００は、高位合成や論理合成の工程が行われる前に、集積回路のレイアウト上で配線混雑が発生するか否かを判定し、配線混雑要因となるソースコード１０１内のループ箇所１０２を検出することができる。そして、設計支援装置１００は、判定結果を、ユーザに通知することができる。結果として、ユーザは、高位合成や論理合成の工程が行われる前に、ソースコード１０１を修正することができる。このように、設計支援装置１００は、集積回路の設計工程１１０に発生する手戻りを小さくして、集積回路の設計工程１１０にかかる時間の増大を抑制することができる。
【００２９】
また、設計支援装置１００は、配線混雑が発生すると判定した場合、配線混雑要因となるソースコード１０１内のループ箇所１０２を検出してもよい。そして、設計支援装置１００は、ソースコード１０１を、検出したループ箇所１０２を展開したソースコード１０１に変換する。結果として、設計支援装置１００は、集積回路のレイアウト上での配線混雑の発生を防止することができる。ユーザは、人手でソースコード１０１を変換しなくてもよいため、集積回路の設計工程１１０における作業負担を低減することができる。このように、設計支援装置１００は、集積回路の設計工程１１０に発生する手戻りを小さくして、集積回路の設計工程１１０にかかる時間の増大を抑制することができる。
【００３０】
（設計支援装置１００のハードウェア）
次に、図２を用いて、図１に示した設計支援装置１００のハードウェアの一例について説明する。
【００３１】
図２は、設計支援装置１００のハードウェアの一例を示すブロック図である。図２において、設計支援装置１００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）２０１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０３と、を有する。
【００３２】
また、設計支援装置１００は、さらに、ディスクドライブ２０４と、ディスク２０５と、インターフェース（Ｉ／Ｆ：Ｉｎｔｅｒｆａｃｅ）２０６と、入力装置２０７と、出力装置２０８とを有する。また、各構成部はバス２００によってそれぞれ接続されている。設計支援装置１００は、例えば、サーバ、ノート型パソコン、デスクトップ型パソコンなどである。
【００３３】
ここで、ＣＰＵ２０１は、設計支援装置１００の全体の制御を司る。ＲＯＭ２０２は、ブートプログラムなどの各種プログラムを記憶する。ＲＡＭ２０３は、ＣＰＵ２０１のワークエリアとして使用される。また、ＲＡＭ２０３は、各種プログラムの実行により得られたデータなどの各種データを記憶する。
【００３４】
ディスクドライブ２０４は、ＣＰＵ２０１の制御に従ってディスク２０５に対するデータのリード／ライトを制御する。ディスク２０５は、ディスクドライブ２０４の制御で書き込まれたデータを記憶する。ディスク２０５は、例えば、磁気ディスク、または光ディスクなどである。
【００３５】
Ｉ／Ｆ２０６は、通信回線を通じてネットワーク２１０に接続され、ネットワーク２１０を介して他の装置に接続される。ネットワーク２１０は、例えば、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどである。そして、Ｉ／Ｆ２０６は、ネットワーク２１０と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２０６には、例えば、モデムやＬＡＮアダプタなどを採用することができる。
【００３６】
入力装置２０７は、キーボード、タッチパネルなどユーザの操作により、各種データの入力を行うインターフェースである。入力装置２０７は、マウス、スキャナなどであってもよい。出力装置２０８は、ＣＰＵ２０１の指示により、データを出力するインターフェースである。出力装置２０８は、例えば、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示するディスプレイである。出力装置２０８は、プリンタであってもよい。
【００３７】
（設計支援装置１００の機能的構成例）
次に、図３を用いて、設計支援装置１００の機能的構成例について説明する。
【００３８】
図３は、設計支援装置１００の機能的構成例を示すブロック図である。設計支援装置１００は、制御部となる機能として、取得部３０１と、特定部３０２と、検出部３０３と、生成部３０４と、出力部３０５とを含む。
【００３９】
取得部３０１は、ソースコードを取得する。ソースコードは、プログラミング言語を用いて集積回路を動作レベルで記述したコードである。動作レベルは、ビヘイビアレベルとも呼ばれる。取得部３０１は、例えば、ＳｙｓｔｅｍＣを用いて集積回路を動作レベルで記述したソースコードを取得する。
【００４０】
取得部３０１は、具体的には、ＲＡＭ２０３、ディスク２０５などの記憶領域に記憶されたソースコードを読み出すことにより、ソースコードを取得する。また、取得部３０１は、Ｉ／Ｆ２０６により、他の装置からソースコードを受信することにより、ソースコードを取得してもよい。これにより、取得部３０１は、集積回路のレイアウト上で配線混雑が発生するか否かを判定する対象になるソースコードを取得して、特定部３０２に出力することができる。
【００４１】
取得部３０１が取得したソースコードは、例えば、ＲＡＭ２０３、ディスク２０５などの記憶領域に記憶される。取得部３０１は、例えば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、ディスク２０５などの記憶装置に記憶されたプログラムをＣＰＵ２０１に実行させることにより、または、Ｉ／Ｆ２０６により、その機能を実現する。
【００４２】
特定部３０２は、取得部３０１が取得したソースコードに基づいて、ソースコードに規定されたデータのビット幅と、ソースコードに規定された命令間の処理の依存関係と、命令間のデータの依存関係とを特定する。特定部３０２は、例えば、プログラム依存グラフを作成することにより、ソースコードに規定されたデータのビット幅と、ソースコードに規定された命令間の処理の依存関係と、命令間のデータの依存関係とを特定する。
【００４３】
プログラム依存グラフは、ソースコード内の命令間の依存関係を示すグラフである。プログラム依存グラフは、ソースコード内の複数の命令のそれぞれに対応するノードを含む。２つの命令間に依存関係がある場合には、２つの命令のそれぞれに対応するノードは、エッジで結ばれる。これにより、特定部３０２は、検出部３０３が配線混雑要因を検出するために用いるデータのビット幅と命令間の処理の依存関係と命令間のデータの依存関係とを特定し、検出部３０３に出力することができる。
【００４４】
ここで、図４を用いて、特定部３０２がプログラム依存グラフを作成する一例について説明する。以下の説明では、プログラム依存グラフを「ＰＤＧ：Ｐｒｏｇｒａｍ  Ｄｅｐｅｎｄｅｎｃｅ  Ｇｒａｐｈ」と表記する場合がある。
【００４５】
＜ＰＤＧ４０２を作成する一例＞
図４は、ＰＤＧ４０２を作成する一例を示す説明図である。特定部３０２は、ある関数にかかるソースコード４０１に対応するＰＤＧ４０２として、図４に示した有向グラフを作成する。有向グラフとは、ノード間を接続するエッジに向きが設定されるグラフである。
【００４６】
図４の例では、特定部３０２は、ある関数を、根ノードｎ０の属性に設定する。また、特定部３０２は、命令１「ａ＝ｒｅａｄ（Ａ）」を、ノードｎ１の属性に設定する。また、特定部３０２は、命令２「ｂ＝ｒｅａｄ（Ｂ）」を、ノードｎ２の属性に設定する。また、特定部３０２は、命令３「ｗｈｉｌｅ（ａ＞ｂ）」を、ノードｎ３の属性に設定する。また、特定部３０２は、命令４「ａ＝ａ＊ｂ」を、ノードｎ４の属性に設定する。また、特定部３０２は、命令５「ｂ＝ｂ＋１」を、ノードｎ５の属性に設定する。また、特定部３０２は、命令７「ｗｒｉｔｅ（ａ）」を、ノードｎ７の属性に設定する。
【００４７】
ここで、命令１において定義された変数ａは、命令３および命令４において参照される。すなわち、命令３、および命令４は、命令１に対してＤＤがある。このため、特定部３０２は、命令３に対応するノードｎ３、および命令４に対応するノードｎ４を、命令１に対応するノードｎ１を始点とする、ノード間にＤＤがあることを示すエッジによって、ノードｎ１と接続する。以下の説明では、ノード間にＤＤがあることを示すエッジを「ＤＤエッジ」と表記する場合がある。
【００４８】
同様に、命令３、命令４、および命令５は、命令２に対してＤＤがある。このため、特定部３０２は、命令３に対応するノードｎ３、命令４に対応するノードｎ４、および命令５に対応するノードｎ５を、命令２に対応するノードｎ２を始点とするＤＤエッジによって、ノードｎ２と接続する。また、命令３、および命令７は、命令４に対してＤＤがある。このため、特定部３０２は、命令３に対応するノードｎ３、および命令７に対応するノードｎ７を、命令４に対応するノードｎ４を始点とするＤＤエッジによってノードｎ４と接続する。また、命令３は、命令５に対してＤＤがある。このため、特定部３０２は、命令３に対応するノードｎ３を、命令５に対応するノードｎ５を始点とするＤＤエッジによってノードｎ５と接続する。
【００４９】
ここで、ある関数において命令１、命令２、命令３、および命令７が行われる。すなわち、命令１、命令２、命令３、および命令７は、ある関数に対してＣＤがある。このため、特定部３０２は、命令１に対応するノードｎ１を、ある関数に対応する根ノードｎ０を始点とするノード間にＣＤがあることを示すエッジによって、根ノードｎ０と接続する。以下の説明では、ノード間にＣＤがあることを示すエッジを「ＣＤエッジ」と表記する場合がある。特定部３０２は、命令２に対応するノードｎ２、命令３に対応するノードｎ３、および命令７に対応するノードｎ７を、ある関数に対応する根ノードｎ０を始点とするＣＤエッジによって、根ノードｎ０と接続する。
【００５０】
また、命令３の条件を満たす場合、命令４および命令５が行われる。一方で、命令３の条件を満たさない場合、命令７が行われる。すなわち、命令４、命令５、および命令７は、命令３に対してＣＤがある。このため、特定部３０２は、命令４に対応するノードｎ４、命令５に対応するノードｎ５、および命令７に対応するノードｎ７を、命令３に対応するノードｎ３を始点とするＣＤエッジによって、ノードｎ３と接続する。
【００５１】
このように、特定部３０２は、ソースコード４０１内の命令を、ＰＤＧ４０２のノードの属性として設定する。また、特定部３０２は、ソースコード４０１内の命令間の依存関係を、ＰＤＧ４０２のエッジとして表現する。特定部３０２は、具体的には、属性を設定するフィールドを有し、エッジを表すポインタを有するデータ構造によって、ＰＤＧ４０２を記憶する。
【００５２】
結果として、特定部３０２は、ソースコード４０１に基づいてＰＤＧ４０２を作成することにより、ソースコード４０１に規定されたデータのビット幅、ソースコード４０１内の命令間の処理の依存関係、および命令間のデータの依存関係を特定することができる。
【００５３】
図３の説明に戻り、特定部３０２が特定したビット幅、処理の依存関係、およびデータの依存関係は、例えば、ＰＤＧとして、ＲＡＭ２０３、ディスク２０５などの記憶領域に記憶される。特定部３０２は、例えば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、ディスク２０５などの記憶装置に記憶されたプログラムをＣＰＵ２０１に実行させることにより、その機能を実現する。
【００５４】
検出部３０３は、特定部３０２が特定したビット幅と、命令間の処理の依存関係と、命令間のデータの依存関係とに基づいて、配線混雑要因となるソースコード内のループ箇所を検出する。配線混雑要因とは、ソースコードに基づいて集積回路のレイアウトを決定したときに集積回路のレイアウト上で発生する配線混雑の要因である。ループ箇所とは、１つの命令が複数回行われる箇所である。
【００５５】
検出部３０３は、例えば、特定部３０２が特定した命令間の依存関係と、命令間のデータの依存関係とに基づいて、ソースコード内のループ箇所を検出する。次に、検出部３０３は、特定部３０２が特定したデータのビット幅に基づいて、検出部３０３が検出したループ箇所における変数の演算に要するモジュールに用いる配線の数を算出する。そして、検出部３０３は、検出部３０３が算出した配線の数が閾値より多ければ、検出部３０３が検出したループ箇所を、配線混雑要因となるループ箇所として検出する。閾値は、例えば、モジュールを配置する領域において使用可能な配線の最大数である。
【００５６】
検出部３０３は、具体的には、特定部３０２が作成したＰＤＧのうち、ＤＤエッジとＣＤエッジとによって循環するようにノードが結ばれた閉路部分を検出する。次に、検出部３０３は、検出部３０３が検出したループ箇所に記述された変数の読み出し演算または書き込み演算に要するモジュールに用いる配線の数を算出する。そして、検出部３０３は、検出部３０３が算出した配線の数が、モジュールを配置する領域において使用可能な配線の最大数より多ければ、モジュールに用いる配線を配置することができないと判定する。
【００５７】
ここで、検出部３０３は、モジュールに用いる配線を配置することができないと判定した場合、検出部３０３が検出したループ箇所を、ソースコード内の配線混雑要因となるループ箇所として検出する。一方で、検出部３０３は、モジュールに用いる配線を配置することができると判定した場合、検出部３０３が検出したループ箇所を、ソースコード内の配線混雑要因となるループ箇所として検出しない。これにより、検出部３０３は、高位合成や論理合成の工程が行われる前であっても、集積回路のレイアウト上で配線混雑が発生するか否かを判定し、配線混雑要因となるソースコード内のループ箇所を検出することができる。
【００５８】
ここでは、検出部３０３は、特定部３０２が作成したＰＤＧのうち、ＤＤエッジとＣＤエッジとによって循環するようにノードが結ばれた閉路部分を検出する場合について説明したが、これに限らない。例えば、検出部３０３は、特定部３０２が作成したＰＤＧのうち、ビット幅が１ビットであるデータについてのＤＤエッジを除外した上で、ＤＤエッジとＣＤエッジとによって循環するようにノードが結ばれた閉路部分を検出してもよい。これにより、検出部３０３は、配線混雑要因とならないソースコード内の箇所に対応するＤＤエッジを除外し、検出部３０３の処理量を低減し、検出部３０３の処理を効率化することができる。
【００５９】
ここで、図５〜図９を用いて、検出部３０３が、モジュールに用いる配線を配置することができるか否かを判定する一例について説明する。
【００６０】
＜配線を配置することができるか否かを判定する一例＞
図５は、集積回路が有するレイヤの一例を示す説明図である。レイヤとは、配線を配置可能な階層である。レイヤは、例えば、基盤、または配線層である。ここで、集積回路は、Ｌ個のレイヤを有する。また、１つのレイヤは、配線ｍ［０］、・・・、ｍ［ｎ］を配置可能であるとする。ｎは、配置可能な配線の数である。次に、図６の説明に移行する。
【００６１】
図６は、モジュールに用いる配線の一例を示す説明図である。ここで、１つのレイヤの単位面積当たりに配置可能な配線の数をａとする。このとき、ａ＝Σｍ［ｉ］となる。ｉは、配線の番号である。また、Ｌ個のレイヤの単位面積当たりに配置可能な配線の数をＷｕとする。このとき、Ｗｕ＝ａ×Ｌとなる。また、面積Ｓ当たりに配置可能な配線の数をＷｔｏｔａｌとする。このとき、Ｗｔｏｔａｌ＝Ｗｕ×Ｓとなる。
【００６２】
また、単位面積当たりのモジュールＭＵＸの面積をＳｍｕｘとし、面積Ｓｍｕｘに配置可能な配線の数をＷＳｍｕｘとする。このとき、ＷＳｍｕｘ＝Ｓｍｕｘ×ａとなる。また、モジュールＭＵＸに用いる配線の数をＷｍｕｘとする。このとき、Ｗｍｕｘ＞ＷＳｍｕｘの場合に、モジュールＭＵＸの面積に配置可能な配線の他にも、モジュールＭＵＸに配線を要することになる。
【００６３】
また、モジュールは、実際には、配線をモジュールの上下で分断し、１つの配線で２つの信号を扱うことができる。このため、モジュールに接続される配線の数は、モジュールに入出力される信号の数の半分以上あればよい。次に、図７の説明に移行する。
【００６４】
図７は、配線混雑が発生する一例を示す説明図である。ここで、モジュールＭＵＸ以外が使用する配線の数をＱｅｔｃとし、使用されずに残った配線の数をＷｅｍｐｔｙとする。このとき、Ｗｅｍｐｔｙ＝ΣＷｔｏｔａｌ［ｌ］−ΣＷｍｕｘ［ｌ］−ΣＱｅｔｃ［ｌ］となる。ｌは、レイヤの番号である。ｌ＝１〜Ｌとする。ｌ＝１〜Ｌは、配線層の番号である。
【００６５】
Ｗｅｍｐｔｙは、負の値になった場合に、配線を配置する領域が不足することを意味し、配線混雑が発生することを意味する。ここで、モジュールに対して配置する必要がある配線の数を、ＷＲｍｕｘとする。Ｗｅｍｐｔｙが負の値になる場合は、例えば、ＷＲｍｕｘがＷｍｕｘ（＝ΣＷｍｕｘ［ｌ］）より大きく、ＷＲｍｕｘ＋Ｑｅｔｃ［ｌ］がＷｔｏｔａｌ（＝ΣＷｔｏｔａｌ［ｌ］）より大きい場合である。
【００６６】
ここで、説明の簡略化のため、モジュールが配置されていない領域が、配線が配置可能な領域である場合を例に挙げて、配線を配置することができるか否かを判定する一例について説明する。換言すれば、ΣＱｅｔｃ［ｌ］を考慮しない場合について説明する。また、説明の簡略化のため、電源配線を考慮しないものとする。
【００６７】
この場合、Ｗｅｍｐｔｙ＝Ｗｔｏｔａｌ−Ｗｍｕｘとなる。このため、Ｗｍｕｘ＞Ｗｔｏｔａｌのとき、配線混雑が発生することになる。Ｗｍｕｘは、モジュールの種類によって値が変化する。ここで、図８の説明に移行する。
【００６８】
図８は、モジュールの一例を示す説明図である。図８は、具体的には、モジュールが、２信号セレクタ８００である場合の一例である。図８に示すように、２信号セレクタ８００は、入力信号として、選択対象の２つの信号ＩＮ０，ＩＮ１、および、選択対象のいずれを選択するかを制御する１つの制御信号Ｓ０を受け付ける。また、２信号セレクタ８００は、出力信号として、選択された１つの信号ＯＵＴを出力する。したがって、２信号セレクタ８００は、４つの信号が入出力されることになる。
【００６９】
上述したように、モジュールは、実際には、配線をモジュールの上下で分断し、１つの配線で２つの信号を扱うことができる。このため、モジュールに接続される配線の数は、モジュールに入出力される信号の数の半分以上あればよい。図８の例では、２信号セレクタ８００は、２つの配線が接続されれば、必要な信号を入出力することができることになる。次に、図９の説明に移行する。
【００７０】
図９は、モジュールの他の例を示す説明図である。図９は、具体的には、モジュールが、４信号セレクタ９００である場合の一例である。図９に示すように、４信号セレクタ９００は、入力信号として、選択対象の４つの信号ＩＮ０，ＩＮ１，ＩＮ２，ＩＮ３、および、選択対象のいずれを選択するかを制御する２つの制御信号Ｓ０，Ｓ１を受け付ける。また、４信号セレクタ９００は、出力信号として、選択された１つの信号ＯＵＴを出力する。したがって、４信号セレクタ９００は、７つの信号が入出力されることになる。
【００７１】
このため、図９の例では、４信号セレクタ９００は、４つの配線が接続されれば、必要な信号を入出力することができることになる。このように、モジュールに入出力される信号の数をＮとし、選択対象の信号の数をＸとすれば、Ｎ＝２＾Ｘとなる。このため、Ｗｍｕｘ＝Ｎ／２＝２＾Ｘ／２となる。
【００７２】
これらのことから、検出部３０３は、Ｓ＝１×１、Ｌ＝８、ａ＝８とすれば、Ｘ＝６以上の場合に、Ｗｍｕｘ＞Ｗｔｏｔａｌが成り立つため、配線混雑が発生すると判定することになる。これにより、検出部３０３は、配線混雑が発生するか否かを判定し、配線混雑要因となるソースコード内のループ箇所を検出することができる。
【００７３】
図３の説明に戻り、検出部３０３が検出した箇所は、例えば、ＲＡＭ２０３、ディスク２０５などの記憶領域に記憶される。検出部３０３は、例えば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、ディスク２０５などの記憶装置に記憶されたプログラムをＣＰＵ２０１に実行させることにより、その機能を実現する。
【００７４】
生成部３０４は、検出部３０３が検出したループ箇所を展開したソースコードを生成する。生成部３０４は、例えば、検出部３０３が検出したＰＤＧの閉路部分を、セレクタを要さない形式のグラフに変更し、当該グラフをソースコードに変換することにより、ソースコードを生成する。これにより、生成部３０４は、配線混雑要因となる箇所がないソースコードを生成することができる。
【００７５】
変換されたデータは、例えば、ＲＡＭ２０３、ディスク２０５などの記憶領域に記憶される。生成部３０４は、例えば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、ディスク２０５などの記憶装置に記憶されたプログラムをＣＰＵ２０１に実行させることにより、その機能を実現する。
【００７６】
出力部３０５は、検出部３０３が検出したループ箇所、または生成部３０４が生成したソースコードを出力する。出力部３０５は、例えば、検出部３０３が検出したループ箇所を識別する情報を、ディスプレイに表示し、プリンタに印刷出力し、Ｉ／Ｆ２０６により外部装置に送信し、または、ＲＡＭ２０３、ディスク２０５などの記憶領域に記憶する。これにより、出力部３０５は、配線混雑要因となるソースコード内のループ箇所をユーザに通知することができる。ユーザは、通知された配線混雑要因となるソースコード内のループ箇所を修正することができる。
【００７７】
また、出力部３０５は、例えば、生成部３０４が変換したソースコードを、ディスプレイに表示し、プリンタに印刷出力し、Ｉ／Ｆ２０６により外部装置に送信し、または、ＲＡＭ２０３、ディスク２０５などの記憶領域に記憶する。これにより、出力部３０５は、生成部３０４が変換したソースコードをユーザに通知することができる。出力部３０５は、例えば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、ディスク２０５などの記憶装置に記憶されたプログラムをＣＰＵ２０１に実行させることにより、その機能を実現する。
【００７８】
（配線混雑要因となるソースコード１００１内のループ箇所を検出する具体例）
次に、図１０〜図１４を用いて、配線混雑要因となるソースコード１００１内のループ箇所を検出する具体例について説明する。
【００７９】
＜配線混雑要因の検出対象となるソースコード１００１の一例＞
図１０は、配線混雑要因の検出対象となるソースコード１００１の一例を示す説明図である。図１０において、設計支援装置１００は、ソースコード１００１を取得する。
【００８０】
ソースコード１００１は、変数ｉｄｘの値に応じて、変数ｓｔａｒｔと変数ｅｎｄとに数値を代入する、ｓｗｉｔｃｈ文を含む。また、ソースコード１００１は、変数ｉをｓｔａｒｔからｅｎｄまで１ずつ変化させ、配列ＳＴＲ．Ａ［ｉ］、ＳＴＲ．Ｂ［ｉ］、ＳＴＲ．Ｃ［ｉ］、ＳＴＲ．Ｄ［ｉ］に０を代入する、ｄｏ  ｗｈｉｌｅ文を含む。以下の説明では、ＳＴＲ．Ａ［ｉ］、ＳＴＲ．Ｂ［ｉ］、ＳＴＲ．Ｃ［ｉ］、ＳＴＲ．Ｄ［ｉ］をそれぞれ「Ａ［ｉ］、Ｂ［ｉ］、Ｃ［ｉ］、Ｄ［ｉ］」と表記する場合がある。
【００８１】
ソースコード１００１ではｓｔａｒｔとｅｎｄとの組み合わせによって配列の異なる要素にアクセスするため、ソースコード１００１に基づいて集積回路のレイアウトを決定すると、デマルチプレクサを含むように集積回路のレイアウトが決定される。このため、デマルチプレクサにより、集積回路のレイアウト上で配線混雑が発生する可能性がある。図１０の例では、数値０（３２ビット）が入力され、入力された数値０が制御信号Ｓ（４ビット）に基づいて配列の各要素Ａ［ｉ］（３２ビット）のいずれかに出力されるデマルチプレクサが用いられる。換言すれば、ソースコード１００１のｄｏ  ｗｈｉｌｅ文の箇所１００３は、配線混雑要因となる可能性がある箇所である。
【００８２】
ここで、ソースコード１００１のｄｏ  ｗｈｉｌｅ文が展開されれば、配線混雑要因となる箇所がなくなり、集積回路のレイアウト上で配線混雑が発生しないようになる。換言すれば、ソースコード１００１をソースコード１００２に変換すれば、配線混雑が発生しないようになる。図１０の例では、ソースコード１００２に基づいて集積回路のレイアウトを決定すると、上述したデマルチプレクサを用いない集積回路のレイアウトが決定される。ここで、図１１の説明に移行し、設計支援装置１００が、図１０のソースコード１００１に基づいてＰＤＧを作成する一例について説明する。
【００８３】
＜ソースコード１００１に基づいてＰＤＧ１１００を作成する一例＞
図１１は、ソースコード１００１に基づいてＰＤＧ１１００を作成する一例を示す説明図である。図１１において、設計支援装置１００は、ＰＤＧ１１００に含まれるノードとして、ソースコード１００１内の複数の命令のそれぞれに対応するノードを作成する。
【００８４】
次に、設計支援装置１００は、複数の命令のそれぞれに対応するノードを結ぶエッジを作成する。設計支援装置１００は、例えば、２つの命令間にＤＤがあれば、当該２つの命令のそれぞれに対応するノードを結ぶようにＤＤエッジを作成する。設計支援装置１００は、ＤＤエッジに、始点となるノードの番号と、依存関係があるデータの名称と、終点となるノードの番号とを、属性として設定する。
【００８５】
以下の説明では、属性を設定されたＤＤエッジを「ＤＤエッジ（始点となるノードの番号、依存関係があるデータの名称、終点となるノードの番号）」と表記する場合がある。設計支援装置１００は、具体的には、命令「ｓｔａｒｔ＝０」に対応するノードｎ１１と、命令「ｉ＝ｓｔａｒｔ」に対応するノードｎ１２とを結ぶように、ＤＤエッジ（ｎ１１，ｓｔａｒｔ，ｎ１２）を作成する。
【００８６】
また、設計支援装置１００は、例えば、２つの命令間にＣＤがあれば、当該２つの命令のそれぞれに対応するノードを結ぶようにＣＤエッジを作成する。設計支援装置１００は、ＣＤエッジに、始点となるノードの番号と、終点となるノードの番号と、始点から終点へと移行する条件とを、属性として設定する。
【００８７】
以下の説明では、属性が設定されたＣＤエッジを「ＣＤエッジ（始点となるノードの番号、終点となるノードの番号、始点から終点へと移行する条件）」と表記する場合がある。設計支援装置１００は、具体的には、命令「ｄｏ」に対応するノードｎ１３と、命令「ｉ＋＋」に対応するノードｎ１５とを結ぶように、ＣＤエッジ（ｎ１３，ｎ１５，なし）を作成する。
【００８８】
このように、設計支援装置１００は、ＰＤＧ１１００を作成することにより、ソースコード１００１内のデータのビット幅、命令間のデータの依存関係、命令間の処理の依存関係を特定することができる。ここで、設計支援装置１００が、作成したＰＤＧ１１００のうちの閉路部分を検出する一例について説明する。
【００８９】
＜閉路部分を検出する一例＞
設計支援装置１００は、ＰＤＧ１１００の一部分である閉路部分を検出する。閉路部分とは、あるノードからエッジを辿ったときに当該ノードに戻ることができるグラフである。閉路部分は、ソースコード１００１内のループ箇所に対応する。
【００９０】
設計支援装置１００は、例えば、ＰＤＧ１１００のうち、分岐命令に対応するノードｎ１６を検出する。次に、設計支援装置１００は、分岐命令の内容に基づいて、分岐命令によってループ文を繰り返す際に戻ることになるノードｎ１３を特定する。そして、設計支援装置１００は、ノードｎ１６からノードｎ１３へのエッジを辿ってノードｎ１６に戻るまでの経路を特定する。設計支援装置１００は、具体的には、深さ優先探索などのアルゴリズムを用いて、ノードｎ１６を始点として、探索した経路を記憶しながらＰＤＧの探索を行い、ノードｎ１６に戻るまでの経路を特定する。そして、設計支援装置１００は、ノードｎ１６から出発し、ノードｎ１３へのエッジを辿って、ノードｎ１６に戻るまでの経路を、閉路部分として検出する。
【００９１】
このように、設計支援装置１００は、ＰＤＧ１１００から閉路部分を検出することにより、配線混雑要因となる可能性がある、当該閉路部分に対応するソースコード１００１内のループ箇所を特定することができる。ここで、図１２の説明に移行し、設計支援装置１００が、閉路部分に関する変数の組み合わせを特定する一例について説明する。
【００９２】
＜変数の組み合わせを特定する一例＞
図１２は、変数の組み合わせを特定する一例を示す説明図である。図１２において、設計支援装置１００は、特定した閉路部分の繰り返し回数に関する変数、特定した閉路部分で演算が行われる変数を特定し、変数の組み合わせを示す表１２００を作成する。
【００９３】
設計支援装置１００は、例えば、ＰＤＧ１１００において、特定した閉路部分に連結される、符号ＤＤ１やＤＤ２を付けた複数のＤＤエッジを特定する。次に、設計支援装置１００は、特定した複数のＤＤエッジに基づいて、特定した閉路部分の繰り返し回数に関する変数として、ｉｄｘと、ｉの範囲を決定するｓｔａｒｔおよびｅｎｄとを特定する。ここで、ｉｄｘ＝０のとき、ｓｔａｒｔ＝０、ｅｎｄ＝７が設定される。
【００９４】
また、設計支援装置１００は、例えば、ＰＤＧ１１００において、特定した閉路部分に含まれる、符号ＣＤ１を付けた複数のＣＤエッジに基づいて、閉路部分が繰り返されるとき、Ａ［ｉ］、Ｂ［ｉ］、Ｃ［ｉ］、Ｄ［ｉ］について演算が行われることを特定する。このため、設計支援装置１００は、ｉｄｘ＝０のとき、閉路部分で演算が行われる変数として、Ａ［ｉ］、Ｂ［ｉ］、Ｃ［ｉ］、Ｄ［ｉ］を特定する。
【００９５】
同様に、設計支援装置１００は、ｉｄｘ＝１〜３のときについても、変数の組み合わせを特定する。そして、設計支援装置１００は、図１２に示すように、ｉｄｘ＝０、ｓｔａｒｔ＝０、ｅｎｄ＝７、Ａ［ｉ］、Ｂ［ｉ］、Ｃ［ｉ］、Ｄ［ｉ］の変数の組み合わせなどを示す、表１２００を作成する。ここで、図１３の説明に移行し、設計支援装置１００が、図１２の表１２００に基づいて、変数についての演算回数のパターンを特定する一例について説明する。
【００９６】
＜変数についての演算回数のパターンを特定する一例＞
図１３は、変数についての演算回数のパターンを特定する一例を示す説明図である。図１３において、設計支援装置１００は、図１２の表１２００に基づいて、変数についての演算回数のパターンを特定し、変数についての演算回数のパターンを示す表１３００を作成する。
【００９７】
ここで、例えば、ｉｄｘ＝０のとき、ｉ＝ｓｔａｒｔ〜ｅｎｄ＝０〜７のそれぞれについて、Ａ［ｉ］、Ｂ［ｉ］、Ｃ［ｉ］、Ｄ［ｉ］について演算が行われる。このため、設計支援装置１００は、ｉｄｘ＝０のとき、Ａ［ｉ］のうち、Ａ［０］〜Ａ［７］のそれぞれについて１回ずつ演算が行われることを特定する。同様に、設計支援装置１００は、ｉｄｘ＝０のとき、Ｂ［ｉ］、Ｃ［ｉ］、Ｄ［ｉ］について演算が行われる回数を特定する。
【００９８】
同様に、設計支援装置１００は、ｉｄｘ＝１〜３のときも、変数についての演算のパターンを特定する。そして、設計支援装置１００は、ｉｄｘ＝０のとき、Ａ［０］〜Ａ［７］、Ｂ［０］〜Ｂ［７］、Ｃ［０］〜Ｃ［７］、Ｄ［０］〜Ｄ［７］の演算回数が「１」であることなどを示す、表１３００を作成する。ここで、図１４の説明に移行し、設計支援装置１００が、図１３の表１３００に基づいて、変数についての演算に要する配線の数を特定する一例について説明する。
【００９９】
＜変数についての演算に要する配線の数を特定する一例＞
図１４は、変数についての演算に要する配線の数を特定する一例を示す説明図である。図１４において、まず、設計支援装置１００は、閉路部分の繰り返しにおける変数についての演算回数の和を算出し、演算回数の和を示す表１４０１を作成する。演算回数の和は、変数についての演算にかかる信号の数に対応する。
【０１００】
設計支援装置１００は、例えば、ｉｄｘ＝０〜３のときの配列Ａ［ｉ］のそれぞれの要素の演算回数の和を算出する。設計支援装置１００は、具体的には、ｉｄｘ＝０〜３のときのＡ［０］〜Ａ［９］のそれぞれの演算にかかる信号の数として、それぞれの演算回数の和「１、２、３、３、３、４、３、３、２、１」を算出する。
【０１０１】
同様に、設計支援装置１００は、ｉｄｘ＝０〜３のときのＢ［０］〜Ｂ［９］、Ｃ［０］〜Ｃ［９］、Ｄ［０］〜Ｄ［９］のそれぞれの演算にかかる信号の数として、それぞれの演算回数の和を算出する。そして、設計支援装置１００は、Ａ［０］〜Ａ［９］、Ｂ［０］〜Ｂ［９］、Ｃ［０］〜Ｃ［９］、Ｄ［０］〜Ｄ［９］のそれぞれの演算にかかる信号の数を示す、表１４０１を作成する。
【０１０２】
次に、設計支援装置１００は、変数についての演算にかかる信号の数と、変数のビット幅とに基づいて、変数についての演算に要する配線の数を特定し、変数についての演算に要する配線の数を示す表１４０２を作成する。ここで、変数の演算に要する配線の数は、変数の演算にかかる信号の数Ｘとし、変数のビット幅Ｍとすれば、｛（２＾Ｘ）／２｝×Ｍである。
【０１０３】
設計支援装置１００は、例えば、Ａ［０］の演算に要する配線の数として、Ａ［０］の演算にかかる信号の数「１」を用いて整数「２」を冪乗した値「２＾１」を２で割った値に、Ａ［０］のビット幅「３２」を乗算した値「３２」を算出する。同様に、設計支援装置１００は、Ａ［１］〜Ａ［９］の演算に要する配線の数を算出する。
【０１０４】
同様に、設計支援装置１００は、Ｂ［０］〜Ｂ［９］、Ｃ［０］〜Ｃ［９］、Ｄ［０］〜Ｄ［９］の演算に要する配線の数を算出する。そして、設計支援装置１００は、Ａ［０］〜Ａ［９］、Ｂ［０］〜Ｂ［９］、Ｃ［０］〜Ｃ［９］、Ｄ［０］〜Ｄ［９］の演算に要する配線の数を示す、表１４０２を作成する。ここで、設計支援装置１００が、図１４の表１４０２に基づいて、配線混雑要因となるか否かを判定する一例について説明する。
【０１０５】
＜配線混雑が発生するか否かを判定する一例＞
設計支援装置１００は、配列の演算に要する配線の数が閾値より大きいか否かを判定して、配線混雑が発生するか否かを判定する。
【０１０６】
例えば、配置可能な配線の数をＷｔｏｔａｌとし、Ａ［ｉ］の演算に要する配線の数をＷｍｕｘとし、他の要素Ａ［ｊ］の演算に要する配線の数をＱｅｔｃとする。このとき、設計支援装置１００は、Ｗｍｕｘ＋Ｑｅｔｃ＞Ｗｔｏｔａｌが成り立つか否かを判定して、配線混雑が発生するか否かを判定する。
【０１０７】
例えば、設計支援装置１００が、Ａ［５］の演算に要する配線の数に基づいて、配線混雑が発生するか否かを判定する場合を例に挙げる。ここで、レイヤの数Ｌを「７」とする。また、Ａ［５］に要するモジュールの面積当たりの配置可能な配線の数Ｗｍｕｘを「５０」とする。
【０１０８】
この場合、設計支援装置１００は、図１４の表１４０２に基づいて、Ａ［５］のＷｍｕｘ＿Ａ［５］＝２５６を取得する。次に、設計支援装置１００は、図１４の表１４０２に基づいて、他の要素Ａ［０］〜Ａ［４］、Ａ［６］〜Ａ［９］のＷｍｕｘを取得する。そして、設計支援装置１００は、Ａ［５］の演算に要する配線以外の配線の数Ｑｅｔｃとして、Ａ［０］〜Ａ［４］、Ａ［６］〜Ａ［９］のＷｍｕｘの和「８３２」を算出する。
【０１０９】
次に、設計支援装置１００は、Ａ［５］の演算に要するモジュールの周囲に配置可能な配線の数Ｗｔｏｔａｌ＝ＷＲｍｕｘ×Ｌ＝５０×７＝３５０を算出する。そして、設計支援装置１００は、Ｗｅｍｐｔｙ＝Ｗｔｏｔａｌ−Ｗｍｕｘ＿Ａ［５］−Ｑｅｔｃ＜０が成り立つか否かを判定する。
【０１１０】
ここで、設計支援装置１００は、Ｗｔｏｔａｌ−Ｗｍｕｘ＿Ａ［５］−Ｑｅｔｃ＝３５０−２５６−８３２＜０が成り立つため、配線混雑が発生すると判定する。そして、設計支援装置１００は、配線混雑が発生すると判定したため、閉路部分に対応するソースコード１００１内のループ箇所を、配線混雑要因となるソースコード１００１内のループ箇所として検出する。
【０１１１】
ここでは、Ａ［５］の演算に要する配線以外の配線の数Ｑｅｔｃとして、Ａ［０］〜Ａ［４］、Ａ［６］〜Ａ［９］のＷｍｕｘの和を用いる場合について説明したが、これに限らない。例えば、設計支援装置１００は、Ａ［５］に隣接する要素Ａ［４］とＡ［６］とに要する配線の数の和を、Ｑｅｔｃとしてもよい。
【０１１２】
この場合、設計支援装置１００は、Ｑｅｔｃ＝Ｗｍｕｘ＿Ａ［４］＋Ｗｍｕｘ＿Ａ［６］＝２５６を算出する。そして、設計支援装置１００は、Ｗｅｍｐｔｙ＝Ｗｔｏｔａｌ−Ｗｍｕｘ＿Ａ［５］−Ｑｅｔｃ＝３５０−２５６−２５６＜０が成り立つため、配線混雑が発生すると判定する。
【０１１３】
これにより、設計支援装置１００は、高位合成や論理合成の工程が行われる前に、集積回路のレイアウト上で配線混雑が発生するか否かを判定し、配線混雑要因となるソースコード１００１内のループ箇所を検出することができる。そして、設計支援装置１００は、検出結果を、ユーザに通知することができる。
【０１１４】
結果として、ユーザは、高位合成や論理合成の工程が行われる前に、配線混雑が発生することを把握して、ソースコード１００１を修正することができる。このように、設計支援装置１００は、集積回路の設計工程１１０に発生する手戻りを小さくして、集積回路の設計工程１１０にかかる時間の増大を抑制することができる。
【０１１５】
ここでは、ユーザがソースコード１００１を修正する場合について説明したが、これに限らない。例えば、設計支援装置１００は、検出したループ箇所を展開したソースコード１００１を生成してもよい。設計支援装置１００が、検出したループ箇所を展開したソースコード１００１を生成する具体例については、図１６〜図２０を用いて後述する。
【０１１６】
（検出処理手順の一例）
次に、図１５を用いて、設計支援装置１００が行う、ソースコードにおける配線混雑要因となる箇所を検出する検出処理手順の一例について説明する。
【０１１７】
図１５は、検出処理手順の一例を示すフローチャートである。図１５において、設計支援装置１００は、ＳｙｓｔｅｍＣを用いて集積回路を動作レベルで記述したソースコードを取得する（ステップＳ１５０１）。
【０１１８】
次に、設計支援装置１００は、取得したソースコードに基づいて、ソースコードに規定された命令間の依存関係を示すＰＤＧを作成する（ステップＳ１５０２）。そして、設計支援装置１００は、作成したＰＤＧにおけるＤＤエッジとＣＤエッジとを特定する（ステップＳ１５０３）。
【０１１９】
次に、設計支援装置１００は、ＤＤエッジに対応するデータのデータタイプを特定する（ステップＳ１５０４）。そして、設計支援装置１００は、データタイプがｂｏｏｌｅａｎ型ではないデータに対応するＤＤエッジがあるか否かを判定する（ステップＳ１５０５）。ここで、ＤＤエッジがない場合（ステップＳ１５０５：Ｎｏ）、設計支援装置１００は、検出処理を終了する。
【０１２０】
一方で、ＤＤエッジがある場合（ステップＳ１５０５：Ｙｅｓ）、設計支援装置１００は、ＤＤエッジに対応するデータのビット幅を特定する（ステップＳ１５０６）。次に、設計支援装置１００は、特定したＤＤエッジとＣＤエッジとに基づいて、ＣＤエッジによって結ばれた閉路部分、またはＤＤエッジとＣＤエッジとによって結ばれた閉路部分を検出する（ステップＳ１５０７）。そして、設計支援装置１００は、検出した閉路部分が、配線混雑要因となる閉路部分であるか否かを判定する（ステップＳ１５０８）。ここで、配線混雑要因となる閉路部分ではない場合（ステップＳ１５０８：Ｎｏ）、設計支援装置１００は、検出処理を終了する。
【０１２１】
一方で、配線混雑要因となる閉路部分である場合（ステップＳ１５０８：Ｙｅｓ）、設計支援装置１００は、検出した閉路部分に対応するソースコード内のループ箇所を展開したソースコードを生成する（ステップＳ１５０９）。そして、設計支援装置１００は、検出処理を終了する。
【０１２２】
これにより、設計支援装置１００は、配線混雑要因となるソースコード内のループ箇所を検出することができ、配線混雑要因となるソースコード内のループ箇所をなくしたソースコードを生成することができる。
【０１２３】
（ソースコードを生成する具体例）
次に、図１６〜図２０を用いて、配線混雑要因となるソースコード内のループ箇所を展開したソースコードを生成する具体例について説明する。設計支援装置は、例えば、下記に示す、分離フェーズ、組み合わせ抽出フェーズ、共通コード抽出フェーズ、生成フェーズを行って、ソースコードを生成する。
【０１２４】
＜分離フェーズの一例＞
図１６は、分離フェーズの一例を示す説明図である。図１６において、設計支援装置１００は、ＰＤＧ１１００から、閉路部分１６０１の繰り返し回数にかかわる変数の組み合わせごとに、グラフを分離する。
【０１２５】
設計支援装置１００は、例えば、閉路部分１６０１の繰り返し回数にかかわる変数ｓｔａｒｔとｅｎｄとを特定する。次に、設計支援装置１００は、特定した変数についての命令「ｉ＝ｓｔａｒｔ」と「ｉ＜ｅｎｄ」とに対応するノードに連結される、符号ＤＤ１やＤＤ２を付けたＤＤエッジを特定する。
【０１２６】
そして、設計支援装置１００は、ＤＤ１とＤＤ２との始点になる各ノードに対応する命令を参照して、閉路部分１６０１の繰り返し回数にかかわる変数ｓｔａｒｔとｅｎｄとの組み合わせを特定する。図１６の例では、設計支援装置１００は、ｉｄｘ＝０〜３に対応するｓｔａｒｔとｅｎｄとの組み合わせとして、Ｇ０「０，１」、Ｇ１「１，５」、Ｇ２「２，５」、Ｇ３「３，７」を特定したとする。
【０１２７】
最後に、設計支援装置１００は、ＰＤＧ１１００の閉路部分１６０１を、Ｇ０についてのグラフと、Ｇ１についてのグラフと、Ｇ２についてのグラフと、Ｇ３についてのグラフとなどの各種グラフ１６０２に分離する。次に、図１７の説明に移行する。
【０１２８】
＜組み合わせ抽出フェーズの一例＞
図１７は、組み合わせ抽出フェーズの一例を示す説明図である。図１７において、設計支援装置１００は、分離したグラフ１６０２ごとに、ｓｔａｒｔとｅｎｄとの組み合わせを展開して、グラフ１６０２をさらに分離する。
【０１２９】
設計支援装置１００は、例えば、ｉｄｘ＝０に対応するＧ０における変数ｉのパターン「０」を特定し、分離したＧ０についてのグラフ１６０２から、ｉ＝０についてのグラフ１７０１を分離する。同様に、設計支援装置１００は、例えば、ｉｄｘ＝１に対応するＧ１における変数ｉのパターン「１，２，３，４」を特定し、分離したＧ１についてのグラフ１６０２を、ｉ＝１，２，３，４のそれぞれについてのグラフ１７０１に分類する。
【０１３０】
これにより、設計支援装置１００は、点線部分のグラフについて、ｓｔａｒｔとｅｎｄとの組み合わせによる共有化をなくし、モジュールの数が低減されたソースコードに対応するグラフ１７０１を作成することができる。このため、設計支援装置１００は、グラフ１７０１をソースコードに変換すれば、配線混雑を回避可能なソースコードを生成することができる。次に、図１８の説明に移行する。
【０１３１】
＜共通コード抽出フェーズの一例＞
図１８は、共通コード抽出フェーズの一例を示す説明図である。図１８において、設計支援装置１００は、ｓｔａｒｔとｅｎｄとの組み合わせを展開したグラフ１７０１に基づいて、共通するコードを抽出し、共通するコードをマージしたグラフ１８０１を作成する。ここで、図１９を用いて、設計支援装置１００が、共通するコードを抽出する一例について説明する。以下の説明では、共通するコードを「共通コード」と表記する場合がある。
【０１３２】
図１９は、共通コードを抽出する一例を示す説明図である。図１９において、設計支援装置１００は、ｓｔａｒｔとｅｎｄとの組み合わせを展開したグラフ１７０１に基づいて、変数の演算のパターンを特定する。図１９の例では、Ａ［ｉ］について共通コードを抽出する一例を示す。他の変数Ｂ［ｉ］などについて共通コードを抽出する場合は、Ａ［ｉ］と同様であるため、説明を省略する。
【０１３３】
設計支援装置１００は、例えば、組み合わせＧ０において行われるＡ［０］＝０の演算を特定する。また、設計支援装置１００は、組み合わせＧ１において行われるＡ［１］＝０、Ａ［２］＝０、Ａ［３］＝０、Ａ［４］＝０の演算を特定する。また、設計支援装置１００は、組み合わせＧ２において行われるＡ［２］＝０、Ａ［３］＝０、Ａ［４］＝０の演算を特定する。また、設計支援装置１００は、組み合わせＧ３において行われるＡ［３］＝０、Ａ［４］＝０、Ａ［５］＝０、Ａ［６］＝０の演算を特定する。
【０１３４】
ここで、設計支援装置１００は、組み合わせＧ０〜Ｇ３において共通するコードを抽出する。設計支援装置１００は、例えば、組み合わせＧ１、Ｇ２において共通するコード「Ａ［２］＝０」を抽出する。また、設計支援装置１００は、組み合わせＧ１〜Ｇ３において共通するコード「Ａ［３］＝０」と「Ａ［４］＝０」とを抽出する。
【０１３５】
＜生成フェーズの一例＞
図２０は、生成フェーズの一例を示す説明図である。図２０において、設計支援装置１００は、共通するコードが共通して１回行われ、共通しないコードは当該コードが行われる条件が満たされた場合に１回行われるように、ソースコードを生成する。
【０１３６】
図２０の例では、ソースコードにおけるＡ［ｉ］の演算についての命令部分を生成する場合について説明する。他の変数Ｂ［ｉ］などの演算についての命令部分を生成する場合は、Ａ［ｉ］の演算についての命令部分を生成する場合と同様であるため、説明を省略する。
【０１３７】
設計支援装置１００は、例えば、代入文を利用して、Ａ［ｉ］の値を、変数ｔｍｐ＿ｉに一旦代入するようにする。設計支援装置１００は、ｃａｓｅ文を利用して、Ｇ１〜Ｇ３に対応するｃａｓｅ１〜３において、共通するコード「Ａ［３］＝０」と「Ａ［４］＝０」とに対応する演算「ｔｍｐ＿３＝０」と「ｔｍｐ＿４＝０」とが行われるようにする。また、設計支援装置１００は、ｃａｓｅ文内でｉｆ文を利用して、共通しないコードに対応する演算が行われるようにする。そして、設計支援装置１００は、代入文を利用して、変数ｔｍｐ＿ｉの値を、Ａ［ｉ］に代入するようにする。結果として、設計支援装置１００は、ソースコード２００１を生成する。
【０１３８】
これにより、設計支援装置１００は、組み合わせＧ０、Ｇ１、Ｇ２、Ｇ３に依存したソースコードから、ｉｄｘに依存したソースコードを生成することができる。換言すれば、設計支援装置１００は、集積回路に要するセレクタの数を低減し、集積回路の配線混雑の発生を抑制することができるソースコードを生成することができる。
【０１３９】
（生成処理手順の一例）
次に、図２１を用いて、生成処理手順の一例について説明する。
【０１４０】
図２１は、生成処理手順の一例を示すフローチャートである。図２１において、設計支援装置１００は、ＰＤＧを取得する（ステップＳ２１０１）。次に、設計支援装置１００は、変数の組み合わせごとに、閉路部分を分離する（ステップＳ２１０２）。そして、設計支援装置１００は、開始と終了との組み合わせごとにグラフをさらに分離する（ステップＳ２１０３）。
【０１４１】
次に、設計支援装置１００は、分離したグラフにおいて共通するコードを抽出する（ステップＳ２１０４）。そして、設計支援装置１００は、共通するコードをマージしたソースコードを生成して（ステップＳ２１０５）、生成処理を終了する。
【０１４２】
これにより、設計支援装置１００は、高位合成の工程を行うのに先立って、配線混雑が発生する可能性があるソースコードから、配線混雑を回避可能なソースコードを生成することができる。このため、ユーザは、集積回路の設計工程１１０の手戻りを防止し、配線混雑を回避可能なソースコードを生成する作業にかかる作業量を削減することができる。
【０１４３】
以上説明したように、設計支援装置１００によれば、集積回路を動作レベルで記述したソースコードに規定されたデータのビット幅と、ソースコードに規定された命令間の処理の依存関係と、命令間のデータの依存関係とを特定することができる。そして、設計支援装置１００によれば、ビット幅と、命令間の処理の依存関係と、命令間のデータの依存関係とに基づいて、配線混雑要因となるソースコード内のループ箇所を検出することができる。
【０１４４】
これにより、設計支援装置１００は、ソースコードを、ＲＴＬコードやネットリストに変換したり、物理論理合成を行わなくても、配線混雑要因を検出することができる。このため、設計支援装置１００は、高位合成や論理合成の工程が行われる前に、集積回路のレイアウト上で配線混雑が発生するか否かを判定し、配線混雑要因となるソースコード内のループ箇所を検出することができる。結果として、設計支援装置１００は、集積回路の設計工程１１０に発生する手戻りを小さくして、集積回路の設計工程１１０にかかる時間の増大を抑制することができる。
【０１４５】
また、設計支援装置１００によれば、命令間の処理の依存関係と、命令間のデータの依存関係とに基づいて、ソースコード内のループ箇所を特定することができる。次に、設計支援装置１００によれば、データのビット幅に基づいて、特定したループ箇所における変数の演算に用いるモジュールに接続される配線の数を算出することができる。そして、設計支援装置１００によれば、配線の数が閾値より大きければ、特定したループ箇所を、配線混雑要因となるソースコード内のループ箇所として検出することができる。
【０１４６】
これにより、設計支援装置１００は、実際にモジュールに接続される配線の数を算出し、モジュールの配置される領域において配置可能な配線の数よりも大きくなるか否かを判定することができる。そして、設計支援装置１００は、配線混雑要因を検出することができる。
【０１４７】
また、設計支援装置１００によれば、ソースコードに規定された各命令をノードとして有向グラフ化してプログラム依存グラフを作成することにより、ビット幅と、命令間の処理の依存関係と、命令間のデータの依存関係とを特定することができる。そして、設計支援装置１００によれば、プログラム依存グラフ内の分岐命令を表すノードを含む閉路部分に対応するソースコード内のループ箇所を特定することができる。これにより、設計支援装置１００は、プログラム依存グラフを用いて効率よく閉路部分を検出し、配線混雑要因となる可能性があるソースコード内のループ箇所を特定することができる。
【０１４８】
また、設計支援装置１００によれば、ビット幅が２ビット以上のデータについての命令間のデータの依存関係を特定することができ、１ビットのデータについての命令間のデータの依存関係を特定しないようにすることができる。これにより、設計支援装置１００は、配線混雑要因とならない箇所に対応するデータの依存関係についての閉路部分を検出する処理を省略して、効率よく閉路部分を検出することができる。
【０１４９】
また、設計支援装置１００によれば、配線混雑要因となるループ箇所を展開したソースコードを生成することができる。これにより、設計支援装置１００は、配線混雑を回避可能なソースコードを自動で生成することができる。結果として、ユーザは、ソースコードを修正しなくてもよくなり、作業量を低減することができる。
【０１５０】
なお、本実施の形態で説明した設計支援方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。設計支援方法を実行する設計支援プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、設計支援方法を実行する設計支援プログラムは、インターネット等のネットワークを介して配布してもよい。
【０１５１】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１５２】
（付記１）プログラミング言語を用いて集積回路を動作レベルで記述したソースコードに基づいて、前記ソースコードに規定されたデータのビット幅と、前記ソースコードに規定された命令間の処理の依存関係と、前記命令間のデータの依存関係とを特定し、
特定した前記ビット幅と、前記命令間の処理の依存関係と、前記命令間のデータの依存関係とに基づいて、配線混雑要因となる前記ソースコード内のループ箇所を検出する、
制御部を有することを特徴とする設計支援装置。
【０１５３】
（付記２）前記制御部は、特定した前記命令間の処理の依存関係と、前記命令間のデータの依存関係とに基づいて、前記ソースコード内のループ箇所を特定し、
特定した前記ビット幅に基づいて、特定した前記ループ箇所における変数の演算に用いるモジュールに接続される配線の数を算出し、
算出した前記配線の数が閾値より大きければ、特定した前記ループ箇所を、前記配線混雑要因となる前記ソースコード内のループ箇所として検出する、ことを特徴とする付記１に記載の設計支援装置。
【０１５４】
（付記３）前記制御部は、前記ソースコードに規定された各命令をノードとして有向グラフ化してプログラム依存グラフを作成することにより、前記ビット幅と、前記命令間の処理の依存関係と、前記命令間のデータの依存関係とを特定し、
前記プログラム依存グラフ内の分岐命令を表すノードを含む閉路部分に対応する前記ソースコード内のループ箇所を特定する、ことを特徴とする付記１または２に記載の設計支援装置。
【０１５５】
（付記４）前記データは、２ビット以上のデータである、ことを特徴とする付記１〜３のいずれか一つに記載の設計支援装置。
【０１５６】
（付記５）前記制御部は、検出した前記ループ箇所を展開したソースコードを生成する、ことを特徴とする付記１〜４のいずれか一つに記載の設計支援装置。
【０１５７】
（付記６）コンピュータが、
プログラミング言語を用いて集積回路を動作レベルで記述したソースコードに基づいて、前記ソースコードに規定されたデータのビット幅と、前記ソースコードに規定された命令間の処理の依存関係と、前記命令間のデータの依存関係とを特定し、
特定した前記ビット幅と、前記命令間の処理の依存関係と、前記命令間のデータの依存関係とに基づいて、配線混雑要因となる前記ソースコード内のループ箇所を検出する、
処理を実行することを特徴とする設計支援方法。
【０１５８】
（付記７）コンピュータに、
プログラミング言語を用いて集積回路を動作レベルで記述したソースコードに基づいて、前記ソースコードに規定されたデータのビット幅と、前記ソースコードに規定された命令間の処理の依存関係と、前記命令間のデータの依存関係とを特定し、
特定した前記ビット幅と、前記命令間の処理の依存関係と、前記命令間のデータの依存関係とに基づいて、配線混雑要因となる前記ソースコード内のループ箇所を検出する、
処理を実行させることを特徴とする設計支援プログラム。
【符号の説明】
【０１５９】
１００  設計支援装置
３０１  取得部
３０２  特定部
３０３  検出部
３０４  生成部
３０５  出力部
【図１】
0006398729.tif 000002
【図２】
0006398729.tif 000003
【図３】
0006398729.tif 000004
【図４】
0006398729.tif 000005
【図５】
0006398729.tif 000006
【図６】
0006398729.tif 000007
【図７】
0006398729.tif 000008
【図８】
0006398729.tif 000009
【図９】
0006398729.tif 000010
【図１０】
0006398729.tif 000011
【図１１】
0006398729.tif 000012
【図１２】
0006398729.tif 000013
【図１３】
0006398729.tif 000014
【図１４】
0006398729.tif 000015
【図１５】
0006398729.tif 000016
【図１６】
0006398729.tif 000017
【図１７】
0006398729.tif 000018
【図１８】
0006398729.tif 000019
【図１９】
0006398729.tif 000020
【図２０】
0006398729.tif 000021
【図２１】
0006398729.tif 000022