以下に、図面を参照して、本発明にかかる設計支援装置、および設計支援方法の実施の形態を詳細に説明する。
(本実施の形態にかかる設計支援方法の一実施例)
まず、図1を用いて、本実施の形態にかかる設計支援方法の一実施例について説明する。図1は、本実施の形態にかかる設計支援方法の一実施例を示す説明図である。図1において、設計支援装置100は、集積回路の設計工程110における手戻りの発生を抑制するコンピュータである。手戻りとは、既に行った工程に戻って、当該工程をやり直すことである。
集積回路の設計工程110では、アルゴリズム設計の工程と、高位合成の工程と、論理合成の工程と、レイアウト設計の工程とが順番に行われる。アルゴリズム設計の工程は、例えば、C言語を用いて集積回路を動作レベルで記述したソースコードを作成し、SystemC(登録商標)を用いてソースコードを変換し、変換したソースコードを得る工程である。
また、高位合成の工程は、ソースコードを、集積回路をレジスタ転送レベル(RTL:Register Transfer Level)で記述したRTLコードに変換する工程である。また、論理合成の工程は、RTLコードを、集積回路を論理ゲートレベル(GL:Gate Level)で記述したネットリストに変換する工程である。また、レイアウト設計の工程は、ネットリストに基づいて、集積回路のレイアウトを決定する工程である。
以下の説明では、アルゴリズム設計の工程から論理合成の工程までを含む、集積回路の論理設計を行う段階を「フロントエンド」と表記する場合がある。また、以下の説明では、レイアウト設計の工程を含む、集積回路の物理設計を行う段階を「バックエンド」と表記する場合がある。フロントエンドとバックエンドとは分業されることがある。換言すれば、フロントエンドとバックエンドとは、それぞれ異なる人間や部署などによって管轄されることがある。
ところで、バックエンドのレイアウト設計の工程において、集積回路のレイアウトを試作して検証し、集積回路のレイアウト上で配線混雑が発生するか否かを判定する場合が考えられる。配線混雑とは、ある領域に配置可能な配線の数よりも、当該領域に要する配線の数が多くなってしまうことである。配線混雑が発生すると集積回路を製造することができなくなる。この場合、レイアウト設計の工程まで進んでから配線混雑が発生することが判明することになり、アルゴリズム設計の工程まで戻ってソースコードを修正し、高位合成、論理合成、レイアウト設計の工程をやり直すことになってしまう。
このため、集積回路の設計工程110に手戻りが発生し、集積回路の設計工程110にかかるコストや時間の増大を招いてしまう。特に、この場合、バックエンドまで進んだ後に、バックエンドとは管轄する人間や部署などが異なるフロントエンドまで戻って、高位合成や論理合成などの工程をやり直すことになるため、集積回路の設計工程110にかかるコストや時間などが増大しやすい。
また、フロントエンドの論理合成の工程において、物理論理合成ツールを用いて、集積回路のレイアウト上で配線混雑が発生するか否かを判定する場合が考えられる。この場合、論理合成の工程まで進んでから配線混雑が発生することが判明することになり、アルゴリズム設計の工程まで戻ってソースコードを修正し、高位合成や論理合成の工程をやり直すことになってしまう。このため、集積回路の設計工程110に手戻りが発生し、集積回路の設計工程110にかかるコストや時間の増大を招いてしまう。
このように、集積回路の設計工程110のうち、より下流の工程において、集積回路のレイアウト上で配線混雑が発生するか否かを判定するようにするほど、集積回路の設計工程110にかかる時間やコストが増大しやすくなる。換言すれば、集積回路の設計工程110のうち、より上流の工程において、集積回路のレイアウト上で配線混雑が発生するか否かを判定することが望ましい。
そこで、本実施の形態では、アルゴリズム設計の工程において、集積回路のレイアウト上で配線混雑が発生するか否かを判定し、配線混雑要因となるソースコード内のループ箇所を検出することができる設計支援方法について説明する。これによれば、高位合成や論理合成の工程を行わなくても、集積回路のレイアウト上で配線混雑が発生するか否かを判定することができる。
(1)設計支援装置100は、高位合成の工程が行われる前に、SystemCを用いて記述されたソースコード101を取得する。SystemCは、ハードウェア記述言語の一つである。
(2)設計支援装置100は、取得したソースコード101に基づいて、ソースコード101に規定されたデータのビット幅、ソースコード101内の命令間の処理の依存関係、および命令間のデータの依存関係を特定する。設計支援装置100が、ソースコードに規定されたデータのビット幅、ソースコード内の命令間の処理の依存関係、および命令間のデータの依存関係を特定する具体例については、図11を用いて後述する。
処理の依存関係は、ある条件を定義する命令と、当該条件に基づいて行われる他の命令との間にある依存関係である。以下の説明では、処理の依存関係を「CD(Control Dependence)」と表記する場合がある。データの依存関係は、ある変数を定義する命令と、当該変数を参照する命令との間にある依存関係である。以下の説明では、データの依存関係を「DD(Data Dependence)」と表記する場合がある。
(3)設計支援装置100は、特定したソースコード101に規定されたデータのビット幅と、ソースコード101内の命令間のCDおよびDDとに基づいて、配線混雑要因となるソースコード101内のループ箇所102を検出する。設計支援装置100が、配線混雑要因となるソースコード101内のループ箇所102を検出する具体例については、図11〜図14を用いて後述する。
設計支援装置100は、例えば、命令間のCDおよびDDに基づいて、循環する構造になる依存関係がある複数の命令を特定することにより、当該複数の命令に対応するソースコード101内のループ箇所102を特定する。次に、設計支援装置100は、データのビット幅に基づいて、検出したループ箇所102に記述された変数の読み出し演算または書き込み演算に要するモジュールに用いる配線の数を算出する。
変数の読み出し演算または書き込み演算に要するモジュールとは、セレクタである。モジュールは、例えば、マルチプレクサまたはデマルチプレクサである。図1の例では、数値0(32ビット)が入力され、入力された数値0が制御信号S(4ビット)に基づいて配列の各要素A[i](32ビット)のいずれかに出力されるデマルチプレクサが用いられる。
以下の例では、配線とは、信号の伝送路として用いられる経路である。配線は、例えば、集積回路のレイヤ上の配線路である。配線は、配線上にモジュールが配置されるとモジュールの前後に分断され、異なる伝送路として用いられる。このため、配線は、モジュールに入出力される2つの信号を伝送することができる。
そして、設計支援装置100は、算出した配線の数に基づいて、当該モジュールを配置する領域において、当該モジュールに用いる配線を配置することができるか否かを判定する。ここで、設計支援装置100は、モジュールに用いる配線を配置することができないと判定した場合、特定したループ箇所102を、ソースコード101内の配線混雑要因となるループ箇所として検出する。設計支援装置100は、具体的には、配線の数が、モジュールが配置される領域において配置可能な配線の数よりも大きい場合に、モジュールに用いる配線を配置することができないと判定し、配線混雑要因を検出する。
これにより、設計支援装置100は、高位合成や論理合成の工程が行われる前に、集積回路のレイアウト上で配線混雑が発生するか否かを判定し、配線混雑要因となるソースコード101内のループ箇所102を検出することができる。そして、設計支援装置100は、判定結果を、ユーザに通知することができる。結果として、ユーザは、高位合成や論理合成の工程が行われる前に、ソースコード101を修正することができる。このように、設計支援装置100は、集積回路の設計工程110に発生する手戻りを小さくして、集積回路の設計工程110にかかる時間の増大を抑制することができる。
また、設計支援装置100は、配線混雑が発生すると判定した場合、配線混雑要因となるソースコード101内のループ箇所102を検出してもよい。そして、設計支援装置100は、ソースコード101を、検出したループ箇所102を展開したソースコード101に変換する。結果として、設計支援装置100は、集積回路のレイアウト上での配線混雑の発生を防止することができる。ユーザは、人手でソースコード101を変換しなくてもよいため、集積回路の設計工程110における作業負担を低減することができる。このように、設計支援装置100は、集積回路の設計工程110に発生する手戻りを小さくして、集積回路の設計工程110にかかる時間の増大を抑制することができる。
(設計支援装置100のハードウェア)
次に、図2を用いて、図1に示した設計支援装置100のハードウェアの一例について説明する。
図2は、設計支援装置100のハードウェアの一例を示すブロック図である。図2において、設計支援装置100は、CPU(Central Processing Unit)201と、ROM(Read Only Memory)202と、RAM(Random Access Memory)203と、を有する。
また、設計支援装置100は、さらに、ディスクドライブ204と、ディスク205と、インターフェース(I/F:Interface)206と、入力装置207と、出力装置208とを有する。また、各構成部はバス200によってそれぞれ接続されている。設計支援装置100は、例えば、サーバ、ノート型パソコン、デスクトップ型パソコンなどである。
ここで、CPU201は、設計支援装置100の全体の制御を司る。ROM202は、ブートプログラムなどの各種プログラムを記憶する。RAM203は、CPU201のワークエリアとして使用される。また、RAM203は、各種プログラムの実行により得られたデータなどの各種データを記憶する。
ディスクドライブ204は、CPU201の制御に従ってディスク205に対するデータのリード/ライトを制御する。ディスク205は、ディスクドライブ204の制御で書き込まれたデータを記憶する。ディスク205は、例えば、磁気ディスク、または光ディスクなどである。
I/F206は、通信回線を通じてネットワーク210に接続され、ネットワーク210を介して他の装置に接続される。ネットワーク210は、例えば、LAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどである。そして、I/F206は、ネットワーク210と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F206には、例えば、モデムやLANアダプタなどを採用することができる。
入力装置207は、キーボード、タッチパネルなどユーザの操作により、各種データの入力を行うインターフェースである。入力装置207は、マウス、スキャナなどであってもよい。出力装置208は、CPU201の指示により、データを出力するインターフェースである。出力装置208は、例えば、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示するディスプレイである。出力装置208は、プリンタであってもよい。
(設計支援装置100の機能的構成例)
次に、図3を用いて、設計支援装置100の機能的構成例について説明する。
図3は、設計支援装置100の機能的構成例を示すブロック図である。設計支援装置100は、制御部となる機能として、取得部301と、特定部302と、検出部303と、生成部304と、出力部305とを含む。
取得部301は、ソースコードを取得する。ソースコードは、プログラミング言語を用いて集積回路を動作レベルで記述したコードである。動作レベルは、ビヘイビアレベルとも呼ばれる。取得部301は、例えば、SystemCを用いて集積回路を動作レベルで記述したソースコードを取得する。
取得部301は、具体的には、RAM203、ディスク205などの記憶領域に記憶されたソースコードを読み出すことにより、ソースコードを取得する。また、取得部301は、I/F206により、他の装置からソースコードを受信することにより、ソースコードを取得してもよい。これにより、取得部301は、集積回路のレイアウト上で配線混雑が発生するか否かを判定する対象になるソースコードを取得して、特定部302に出力することができる。
取得部301が取得したソースコードは、例えば、RAM203、ディスク205などの記憶領域に記憶される。取得部301は、例えば、図2に示したROM202、RAM203、ディスク205などの記憶装置に記憶されたプログラムをCPU201に実行させることにより、または、I/F206により、その機能を実現する。
特定部302は、取得部301が取得したソースコードに基づいて、ソースコードに規定されたデータのビット幅と、ソースコードに規定された命令間の処理の依存関係と、命令間のデータの依存関係とを特定する。特定部302は、例えば、プログラム依存グラフを作成することにより、ソースコードに規定されたデータのビット幅と、ソースコードに規定された命令間の処理の依存関係と、命令間のデータの依存関係とを特定する。
プログラム依存グラフは、ソースコード内の命令間の依存関係を示すグラフである。プログラム依存グラフは、ソースコード内の複数の命令のそれぞれに対応するノードを含む。2つの命令間に依存関係がある場合には、2つの命令のそれぞれに対応するノードは、エッジで結ばれる。これにより、特定部302は、検出部303が配線混雑要因を検出するために用いるデータのビット幅と命令間の処理の依存関係と命令間のデータの依存関係とを特定し、検出部303に出力することができる。
ここで、図4を用いて、特定部302がプログラム依存グラフを作成する一例について説明する。以下の説明では、プログラム依存グラフを「PDG:Program Dependence Graph」と表記する場合がある。
<PDG402を作成する一例>
図4は、PDG402を作成する一例を示す説明図である。特定部302は、ある関数にかかるソースコード401に対応するPDG402として、図4に示した有向グラフを作成する。有向グラフとは、ノード間を接続するエッジに向きが設定されるグラフである。
図4の例では、特定部302は、ある関数を、根ノードn0の属性に設定する。また、特定部302は、命令1「a=read(A)」を、ノードn1の属性に設定する。また、特定部302は、命令2「b=read(B)」を、ノードn2の属性に設定する。また、特定部302は、命令3「while(a>b)」を、ノードn3の属性に設定する。また、特定部302は、命令4「a=a*b」を、ノードn4の属性に設定する。また、特定部302は、命令5「b=b+1」を、ノードn5の属性に設定する。また、特定部302は、命令7「write(a)」を、ノードn7の属性に設定する。
ここで、命令1において定義された変数aは、命令3および命令4において参照される。すなわち、命令3、および命令4は、命令1に対してDDがある。このため、特定部302は、命令3に対応するノードn3、および命令4に対応するノードn4を、命令1に対応するノードn1を始点とする、ノード間にDDがあることを示すエッジによって、ノードn1と接続する。以下の説明では、ノード間にDDがあることを示すエッジを「DDエッジ」と表記する場合がある。
同様に、命令3、命令4、および命令5は、命令2に対してDDがある。このため、特定部302は、命令3に対応するノードn3、命令4に対応するノードn4、および命令5に対応するノードn5を、命令2に対応するノードn2を始点とするDDエッジによって、ノードn2と接続する。また、命令3、および命令7は、命令4に対してDDがある。このため、特定部302は、命令3に対応するノードn3、および命令7に対応するノードn7を、命令4に対応するノードn4を始点とするDDエッジによってノードn4と接続する。また、命令3は、命令5に対してDDがある。このため、特定部302は、命令3に対応するノードn3を、命令5に対応するノードn5を始点とするDDエッジによってノードn5と接続する。
ここで、ある関数において命令1、命令2、命令3、および命令7が行われる。すなわち、命令1、命令2、命令3、および命令7は、ある関数に対してCDがある。このため、特定部302は、命令1に対応するノードn1を、ある関数に対応する根ノードn0を始点とするノード間にCDがあることを示すエッジによって、根ノードn0と接続する。以下の説明では、ノード間にCDがあることを示すエッジを「CDエッジ」と表記する場合がある。特定部302は、命令2に対応するノードn2、命令3に対応するノードn3、および命令7に対応するノードn7を、ある関数に対応する根ノードn0を始点とするCDエッジによって、根ノードn0と接続する。
また、命令3の条件を満たす場合、命令4および命令5が行われる。一方で、命令3の条件を満たさない場合、命令7が行われる。すなわち、命令4、命令5、および命令7は、命令3に対してCDがある。このため、特定部302は、命令4に対応するノードn4、命令5に対応するノードn5、および命令7に対応するノードn7を、命令3に対応するノードn3を始点とするCDエッジによって、ノードn3と接続する。
このように、特定部302は、ソースコード401内の命令を、PDG402のノードの属性として設定する。また、特定部302は、ソースコード401内の命令間の依存関係を、PDG402のエッジとして表現する。特定部302は、具体的には、属性を設定するフィールドを有し、エッジを表すポインタを有するデータ構造によって、PDG402を記憶する。
結果として、特定部302は、ソースコード401に基づいてPDG402を作成することにより、ソースコード401に規定されたデータのビット幅、ソースコード401内の命令間の処理の依存関係、および命令間のデータの依存関係を特定することができる。
図3の説明に戻り、特定部302が特定したビット幅、処理の依存関係、およびデータの依存関係は、例えば、PDGとして、RAM203、ディスク205などの記憶領域に記憶される。特定部302は、例えば、図2に示したROM202、RAM203、ディスク205などの記憶装置に記憶されたプログラムをCPU201に実行させることにより、その機能を実現する。
検出部303は、特定部302が特定したビット幅と、命令間の処理の依存関係と、命令間のデータの依存関係とに基づいて、配線混雑要因となるソースコード内のループ箇所を検出する。配線混雑要因とは、ソースコードに基づいて集積回路のレイアウトを決定したときに集積回路のレイアウト上で発生する配線混雑の要因である。ループ箇所とは、1つの命令が複数回行われる箇所である。
検出部303は、例えば、特定部302が特定した命令間の依存関係と、命令間のデータの依存関係とに基づいて、ソースコード内のループ箇所を検出する。次に、検出部303は、特定部302が特定したデータのビット幅に基づいて、検出部303が検出したループ箇所における変数の演算に要するモジュールに用いる配線の数を算出する。そして、検出部303は、検出部303が算出した配線の数が閾値より多ければ、検出部303が検出したループ箇所を、配線混雑要因となるループ箇所として検出する。閾値は、例えば、モジュールを配置する領域において使用可能な配線の最大数である。
検出部303は、具体的には、特定部302が作成したPDGのうち、DDエッジとCDエッジとによって循環するようにノードが結ばれた閉路部分を検出する。次に、検出部303は、検出部303が検出したループ箇所に記述された変数の読み出し演算または書き込み演算に要するモジュールに用いる配線の数を算出する。そして、検出部303は、検出部303が算出した配線の数が、モジュールを配置する領域において使用可能な配線の最大数より多ければ、モジュールに用いる配線を配置することができないと判定する。
ここで、検出部303は、モジュールに用いる配線を配置することができないと判定した場合、検出部303が検出したループ箇所を、ソースコード内の配線混雑要因となるループ箇所として検出する。一方で、検出部303は、モジュールに用いる配線を配置することができると判定した場合、検出部303が検出したループ箇所を、ソースコード内の配線混雑要因となるループ箇所として検出しない。これにより、検出部303は、高位合成や論理合成の工程が行われる前であっても、集積回路のレイアウト上で配線混雑が発生するか否かを判定し、配線混雑要因となるソースコード内のループ箇所を検出することができる。
ここでは、検出部303は、特定部302が作成したPDGのうち、DDエッジとCDエッジとによって循環するようにノードが結ばれた閉路部分を検出する場合について説明したが、これに限らない。例えば、検出部303は、特定部302が作成したPDGのうち、ビット幅が1ビットであるデータについてのDDエッジを除外した上で、DDエッジとCDエッジとによって循環するようにノードが結ばれた閉路部分を検出してもよい。これにより、検出部303は、配線混雑要因とならないソースコード内の箇所に対応するDDエッジを除外し、検出部303の処理量を低減し、検出部303の処理を効率化することができる。
ここで、図5〜図9を用いて、検出部303が、モジュールに用いる配線を配置することができるか否かを判定する一例について説明する。
<配線を配置することができるか否かを判定する一例>
図5は、集積回路が有するレイヤの一例を示す説明図である。レイヤとは、配線を配置可能な階層である。レイヤは、例えば、基盤、または配線層である。ここで、集積回路は、L個のレイヤを有する。また、1つのレイヤは、配線m[0]、・・・、m[n]を配置可能であるとする。nは、配置可能な配線の数である。次に、図6の説明に移行する。
図6は、モジュールに用いる配線の一例を示す説明図である。ここで、1つのレイヤの単位面積当たりに配置可能な配線の数をaとする。このとき、a=Σm[i]となる。iは、配線の番号である。また、L個のレイヤの単位面積当たりに配置可能な配線の数をWuとする。このとき、Wu=a×Lとなる。また、面積S当たりに配置可能な配線の数をWtotalとする。このとき、Wtotal=Wu×Sとなる。
また、単位面積当たりのモジュールMUXの面積をSmuxとし、面積Smuxに配置可能な配線の数をWSmuxとする。このとき、WSmux=Smux×aとなる。また、モジュールMUXに用いる配線の数をWmuxとする。このとき、Wmux>WSmuxの場合に、モジュールMUXの面積に配置可能な配線の他にも、モジュールMUXに配線を要することになる。
また、モジュールは、実際には、配線をモジュールの上下で分断し、1つの配線で2つの信号を扱うことができる。このため、モジュールに接続される配線の数は、モジュールに入出力される信号の数の半分以上あればよい。次に、図7の説明に移行する。
図7は、配線混雑が発生する一例を示す説明図である。ここで、モジュールMUX以外が使用する配線の数をQetcとし、使用されずに残った配線の数をWemptyとする。このとき、Wempty=ΣWtotal[l]−ΣWmux[l]−ΣQetc[l]となる。lは、レイヤの番号である。l=1〜Lとする。l=1〜Lは、配線層の番号である。
Wemptyは、負の値になった場合に、配線を配置する領域が不足することを意味し、配線混雑が発生することを意味する。ここで、モジュールに対して配置する必要がある配線の数を、WRmuxとする。Wemptyが負の値になる場合は、例えば、WRmuxがWmux(=ΣWmux[l])より大きく、WRmux+Qetc[l]がWtotal(=ΣWtotal[l])より大きい場合である。
ここで、説明の簡略化のため、モジュールが配置されていない領域が、配線が配置可能な領域である場合を例に挙げて、配線を配置することができるか否かを判定する一例について説明する。換言すれば、ΣQetc[l]を考慮しない場合について説明する。また、説明の簡略化のため、電源配線を考慮しないものとする。
この場合、Wempty=Wtotal−Wmuxとなる。このため、Wmux>Wtotalのとき、配線混雑が発生することになる。Wmuxは、モジュールの種類によって値が変化する。ここで、図8の説明に移行する。
図8は、モジュールの一例を示す説明図である。図8は、具体的には、モジュールが、2信号セレクタ800である場合の一例である。図8に示すように、2信号セレクタ800は、入力信号として、選択対象の2つの信号IN0,IN1、および、選択対象のいずれを選択するかを制御する1つの制御信号S0を受け付ける。また、2信号セレクタ800は、出力信号として、選択された1つの信号OUTを出力する。したがって、2信号セレクタ800は、4つの信号が入出力されることになる。
上述したように、モジュールは、実際には、配線をモジュールの上下で分断し、1つの配線で2つの信号を扱うことができる。このため、モジュールに接続される配線の数は、モジュールに入出力される信号の数の半分以上あればよい。図8の例では、2信号セレクタ800は、2つの配線が接続されれば、必要な信号を入出力することができることになる。次に、図9の説明に移行する。
図9は、モジュールの他の例を示す説明図である。図9は、具体的には、モジュールが、4信号セレクタ900である場合の一例である。図9に示すように、4信号セレクタ900は、入力信号として、選択対象の4つの信号IN0,IN1,IN2,IN3、および、選択対象のいずれを選択するかを制御する2つの制御信号S0,S1を受け付ける。また、4信号セレクタ900は、出力信号として、選択された1つの信号OUTを出力する。したがって、4信号セレクタ900は、7つの信号が入出力されることになる。
このため、図9の例では、4信号セレクタ900は、4つの配線が接続されれば、必要な信号を入出力することができることになる。このように、モジュールに入出力される信号の数をNとし、選択対象の信号の数をXとすれば、N=2^Xとなる。このため、Wmux=N/2=2^X/2となる。
これらのことから、検出部303は、S=1×1、L=8、a=8とすれば、X=6以上の場合に、Wmux>Wtotalが成り立つため、配線混雑が発生すると判定することになる。これにより、検出部303は、配線混雑が発生するか否かを判定し、配線混雑要因となるソースコード内のループ箇所を検出することができる。
図3の説明に戻り、検出部303が検出した箇所は、例えば、RAM203、ディスク205などの記憶領域に記憶される。検出部303は、例えば、図2に示したROM202、RAM203、ディスク205などの記憶装置に記憶されたプログラムをCPU201に実行させることにより、その機能を実現する。
生成部304は、検出部303が検出したループ箇所を展開したソースコードを生成する。生成部304は、例えば、検出部303が検出したPDGの閉路部分を、セレクタを要さない形式のグラフに変更し、当該グラフをソースコードに変換することにより、ソースコードを生成する。これにより、生成部304は、配線混雑要因となる箇所がないソースコードを生成することができる。
変換されたデータは、例えば、RAM203、ディスク205などの記憶領域に記憶される。生成部304は、例えば、図2に示したROM202、RAM203、ディスク205などの記憶装置に記憶されたプログラムをCPU201に実行させることにより、その機能を実現する。
出力部305は、検出部303が検出したループ箇所、または生成部304が生成したソースコードを出力する。出力部305は、例えば、検出部303が検出したループ箇所を識別する情報を、ディスプレイに表示し、プリンタに印刷出力し、I/F206により外部装置に送信し、または、RAM203、ディスク205などの記憶領域に記憶する。これにより、出力部305は、配線混雑要因となるソースコード内のループ箇所をユーザに通知することができる。ユーザは、通知された配線混雑要因となるソースコード内のループ箇所を修正することができる。
また、出力部305は、例えば、生成部304が変換したソースコードを、ディスプレイに表示し、プリンタに印刷出力し、I/F206により外部装置に送信し、または、RAM203、ディスク205などの記憶領域に記憶する。これにより、出力部305は、生成部304が変換したソースコードをユーザに通知することができる。出力部305は、例えば、図2に示したROM202、RAM203、ディスク205などの記憶装置に記憶されたプログラムをCPU201に実行させることにより、その機能を実現する。
(配線混雑要因となるソースコード1001内のループ箇所を検出する具体例)
次に、図10〜図14を用いて、配線混雑要因となるソースコード1001内のループ箇所を検出する具体例について説明する。
<配線混雑要因の検出対象となるソースコード1001の一例>
図10は、配線混雑要因の検出対象となるソースコード1001の一例を示す説明図である。図10において、設計支援装置100は、ソースコード1001を取得する。
ソースコード1001は、変数idxの値に応じて、変数startと変数endとに数値を代入する、switch文を含む。また、ソースコード1001は、変数iをstartからendまで1ずつ変化させ、配列STR.A[i]、STR.B[i]、STR.C[i]、STR.D[i]に0を代入する、do while文を含む。以下の説明では、STR.A[i]、STR.B[i]、STR.C[i]、STR.D[i]をそれぞれ「A[i]、B[i]、C[i]、D[i]」と表記する場合がある。
ソースコード1001ではstartとendとの組み合わせによって配列の異なる要素にアクセスするため、ソースコード1001に基づいて集積回路のレイアウトを決定すると、デマルチプレクサを含むように集積回路のレイアウトが決定される。このため、デマルチプレクサにより、集積回路のレイアウト上で配線混雑が発生する可能性がある。図10の例では、数値0(32ビット)が入力され、入力された数値0が制御信号S(4ビット)に基づいて配列の各要素A[i](32ビット)のいずれかに出力されるデマルチプレクサが用いられる。換言すれば、ソースコード1001のdo while文の箇所1003は、配線混雑要因となる可能性がある箇所である。
ここで、ソースコード1001のdo while文が展開されれば、配線混雑要因となる箇所がなくなり、集積回路のレイアウト上で配線混雑が発生しないようになる。換言すれば、ソースコード1001をソースコード1002に変換すれば、配線混雑が発生しないようになる。図10の例では、ソースコード1002に基づいて集積回路のレイアウトを決定すると、上述したデマルチプレクサを用いない集積回路のレイアウトが決定される。ここで、図11の説明に移行し、設計支援装置100が、図10のソースコード1001に基づいてPDGを作成する一例について説明する。
<ソースコード1001に基づいてPDG1100を作成する一例>
図11は、ソースコード1001に基づいてPDG1100を作成する一例を示す説明図である。図11において、設計支援装置100は、PDG1100に含まれるノードとして、ソースコード1001内の複数の命令のそれぞれに対応するノードを作成する。
次に、設計支援装置100は、複数の命令のそれぞれに対応するノードを結ぶエッジを作成する。設計支援装置100は、例えば、2つの命令間にDDがあれば、当該2つの命令のそれぞれに対応するノードを結ぶようにDDエッジを作成する。設計支援装置100は、DDエッジに、始点となるノードの番号と、依存関係があるデータの名称と、終点となるノードの番号とを、属性として設定する。
以下の説明では、属性を設定されたDDエッジを「DDエッジ(始点となるノードの番号、依存関係があるデータの名称、終点となるノードの番号)」と表記する場合がある。設計支援装置100は、具体的には、命令「start=0」に対応するノードn11と、命令「i=start」に対応するノードn12とを結ぶように、DDエッジ(n11,start,n12)を作成する。
また、設計支援装置100は、例えば、2つの命令間にCDがあれば、当該2つの命令のそれぞれに対応するノードを結ぶようにCDエッジを作成する。設計支援装置100は、CDエッジに、始点となるノードの番号と、終点となるノードの番号と、始点から終点へと移行する条件とを、属性として設定する。
以下の説明では、属性が設定されたCDエッジを「CDエッジ(始点となるノードの番号、終点となるノードの番号、始点から終点へと移行する条件)」と表記する場合がある。設計支援装置100は、具体的には、命令「do」に対応するノードn13と、命令「i++」に対応するノードn15とを結ぶように、CDエッジ(n13,n15,なし)を作成する。
このように、設計支援装置100は、PDG1100を作成することにより、ソースコード1001内のデータのビット幅、命令間のデータの依存関係、命令間の処理の依存関係を特定することができる。ここで、設計支援装置100が、作成したPDG1100のうちの閉路部分を検出する一例について説明する。
<閉路部分を検出する一例>
設計支援装置100は、PDG1100の一部分である閉路部分を検出する。閉路部分とは、あるノードからエッジを辿ったときに当該ノードに戻ることができるグラフである。閉路部分は、ソースコード1001内のループ箇所に対応する。
設計支援装置100は、例えば、PDG1100のうち、分岐命令に対応するノードn16を検出する。次に、設計支援装置100は、分岐命令の内容に基づいて、分岐命令によってループ文を繰り返す際に戻ることになるノードn13を特定する。そして、設計支援装置100は、ノードn16からノードn13へのエッジを辿ってノードn16に戻るまでの経路を特定する。設計支援装置100は、具体的には、深さ優先探索などのアルゴリズムを用いて、ノードn16を始点として、探索した経路を記憶しながらPDGの探索を行い、ノードn16に戻るまでの経路を特定する。そして、設計支援装置100は、ノードn16から出発し、ノードn13へのエッジを辿って、ノードn16に戻るまでの経路を、閉路部分として検出する。
このように、設計支援装置100は、PDG1100から閉路部分を検出することにより、配線混雑要因となる可能性がある、当該閉路部分に対応するソースコード1001内のループ箇所を特定することができる。ここで、図12の説明に移行し、設計支援装置100が、閉路部分に関する変数の組み合わせを特定する一例について説明する。
<変数の組み合わせを特定する一例>
図12は、変数の組み合わせを特定する一例を示す説明図である。図12において、設計支援装置100は、特定した閉路部分の繰り返し回数に関する変数、特定した閉路部分で演算が行われる変数を特定し、変数の組み合わせを示す表1200を作成する。
設計支援装置100は、例えば、PDG1100において、特定した閉路部分に連結される、符号DD1やDD2を付けた複数のDDエッジを特定する。次に、設計支援装置100は、特定した複数のDDエッジに基づいて、特定した閉路部分の繰り返し回数に関する変数として、idxと、iの範囲を決定するstartおよびendとを特定する。ここで、idx=0のとき、start=0、end=7が設定される。
また、設計支援装置100は、例えば、PDG1100において、特定した閉路部分に含まれる、符号CD1を付けた複数のCDエッジに基づいて、閉路部分が繰り返されるとき、A[i]、B[i]、C[i]、D[i]について演算が行われることを特定する。このため、設計支援装置100は、idx=0のとき、閉路部分で演算が行われる変数として、A[i]、B[i]、C[i]、D[i]を特定する。
同様に、設計支援装置100は、idx=1〜3のときについても、変数の組み合わせを特定する。そして、設計支援装置100は、図12に示すように、idx=0、start=0、end=7、A[i]、B[i]、C[i]、D[i]の変数の組み合わせなどを示す、表1200を作成する。ここで、図13の説明に移行し、設計支援装置100が、図12の表1200に基づいて、変数についての演算回数のパターンを特定する一例について説明する。
<変数についての演算回数のパターンを特定する一例>
図13は、変数についての演算回数のパターンを特定する一例を示す説明図である。図13において、設計支援装置100は、図12の表1200に基づいて、変数についての演算回数のパターンを特定し、変数についての演算回数のパターンを示す表1300を作成する。
ここで、例えば、idx=0のとき、i=start〜end=0〜7のそれぞれについて、A[i]、B[i]、C[i]、D[i]について演算が行われる。このため、設計支援装置100は、idx=0のとき、A[i]のうち、A[0]〜A[7]のそれぞれについて1回ずつ演算が行われることを特定する。同様に、設計支援装置100は、idx=0のとき、B[i]、C[i]、D[i]について演算が行われる回数を特定する。
同様に、設計支援装置100は、idx=1〜3のときも、変数についての演算のパターンを特定する。そして、設計支援装置100は、idx=0のとき、A[0]〜A[7]、B[0]〜B[7]、C[0]〜C[7]、D[0]〜D[7]の演算回数が「1」であることなどを示す、表1300を作成する。ここで、図14の説明に移行し、設計支援装置100が、図13の表1300に基づいて、変数についての演算に要する配線の数を特定する一例について説明する。
<変数についての演算に要する配線の数を特定する一例>
図14は、変数についての演算に要する配線の数を特定する一例を示す説明図である。図14において、まず、設計支援装置100は、閉路部分の繰り返しにおける変数についての演算回数の和を算出し、演算回数の和を示す表1401を作成する。演算回数の和は、変数についての演算にかかる信号の数に対応する。
設計支援装置100は、例えば、idx=0〜3のときの配列A[i]のそれぞれの要素の演算回数の和を算出する。設計支援装置100は、具体的には、idx=0〜3のときのA[0]〜A[9]のそれぞれの演算にかかる信号の数として、それぞれの演算回数の和「1、2、3、3、3、4、3、3、2、1」を算出する。
同様に、設計支援装置100は、idx=0〜3のときのB[0]〜B[9]、C[0]〜C[9]、D[0]〜D[9]のそれぞれの演算にかかる信号の数として、それぞれの演算回数の和を算出する。そして、設計支援装置100は、A[0]〜A[9]、B[0]〜B[9]、C[0]〜C[9]、D[0]〜D[9]のそれぞれの演算にかかる信号の数を示す、表1401を作成する。
次に、設計支援装置100は、変数についての演算にかかる信号の数と、変数のビット幅とに基づいて、変数についての演算に要する配線の数を特定し、変数についての演算に要する配線の数を示す表1402を作成する。ここで、変数の演算に要する配線の数は、変数の演算にかかる信号の数Xとし、変数のビット幅Mとすれば、{(2^X)/2}×Mである。
設計支援装置100は、例えば、A[0]の演算に要する配線の数として、A[0]の演算にかかる信号の数「1」を用いて整数「2」を冪乗した値「2^1」を2で割った値に、A[0]のビット幅「32」を乗算した値「32」を算出する。同様に、設計支援装置100は、A[1]〜A[9]の演算に要する配線の数を算出する。
同様に、設計支援装置100は、B[0]〜B[9]、C[0]〜C[9]、D[0]〜D[9]の演算に要する配線の数を算出する。そして、設計支援装置100は、A[0]〜A[9]、B[0]〜B[9]、C[0]〜C[9]、D[0]〜D[9]の演算に要する配線の数を示す、表1402を作成する。ここで、設計支援装置100が、図14の表1402に基づいて、配線混雑要因となるか否かを判定する一例について説明する。
<配線混雑が発生するか否かを判定する一例>
設計支援装置100は、配列の演算に要する配線の数が閾値より大きいか否かを判定して、配線混雑が発生するか否かを判定する。
例えば、配置可能な配線の数をWtotalとし、A[i]の演算に要する配線の数をWmuxとし、他の要素A[j]の演算に要する配線の数をQetcとする。このとき、設計支援装置100は、Wmux+Qetc>Wtotalが成り立つか否かを判定して、配線混雑が発生するか否かを判定する。
例えば、設計支援装置100が、A[5]の演算に要する配線の数に基づいて、配線混雑が発生するか否かを判定する場合を例に挙げる。ここで、レイヤの数Lを「7」とする。また、A[5]に要するモジュールの面積当たりの配置可能な配線の数Wmuxを「50」とする。
この場合、設計支援装置100は、図14の表1402に基づいて、A[5]のWmux_A[5]=256を取得する。次に、設計支援装置100は、図14の表1402に基づいて、他の要素A[0]〜A[4]、A[6]〜A[9]のWmuxを取得する。そして、設計支援装置100は、A[5]の演算に要する配線以外の配線の数Qetcとして、A[0]〜A[4]、A[6]〜A[9]のWmuxの和「832」を算出する。
次に、設計支援装置100は、A[5]の演算に要するモジュールの周囲に配置可能な配線の数Wtotal=WRmux×L=50×7=350を算出する。そして、設計支援装置100は、Wempty=Wtotal−Wmux_A[5]−Qetc<0が成り立つか否かを判定する。
ここで、設計支援装置100は、Wtotal−Wmux_A[5]−Qetc=350−256−832<0が成り立つため、配線混雑が発生すると判定する。そして、設計支援装置100は、配線混雑が発生すると判定したため、閉路部分に対応するソースコード1001内のループ箇所を、配線混雑要因となるソースコード1001内のループ箇所として検出する。
ここでは、A[5]の演算に要する配線以外の配線の数Qetcとして、A[0]〜A[4]、A[6]〜A[9]のWmuxの和を用いる場合について説明したが、これに限らない。例えば、設計支援装置100は、A[5]に隣接する要素A[4]とA[6]とに要する配線の数の和を、Qetcとしてもよい。
この場合、設計支援装置100は、Qetc=Wmux_A[4]+Wmux_A[6]=256を算出する。そして、設計支援装置100は、Wempty=Wtotal−Wmux_A[5]−Qetc=350−256−256<0が成り立つため、配線混雑が発生すると判定する。
これにより、設計支援装置100は、高位合成や論理合成の工程が行われる前に、集積回路のレイアウト上で配線混雑が発生するか否かを判定し、配線混雑要因となるソースコード1001内のループ箇所を検出することができる。そして、設計支援装置100は、検出結果を、ユーザに通知することができる。
結果として、ユーザは、高位合成や論理合成の工程が行われる前に、配線混雑が発生することを把握して、ソースコード1001を修正することができる。このように、設計支援装置100は、集積回路の設計工程110に発生する手戻りを小さくして、集積回路の設計工程110にかかる時間の増大を抑制することができる。
ここでは、ユーザがソースコード1001を修正する場合について説明したが、これに限らない。例えば、設計支援装置100は、検出したループ箇所を展開したソースコード1001を生成してもよい。設計支援装置100が、検出したループ箇所を展開したソースコード1001を生成する具体例については、図16〜図20を用いて後述する。
(検出処理手順の一例)
次に、図15を用いて、設計支援装置100が行う、ソースコードにおける配線混雑要因となる箇所を検出する検出処理手順の一例について説明する。
図15は、検出処理手順の一例を示すフローチャートである。図15において、設計支援装置100は、SystemCを用いて集積回路を動作レベルで記述したソースコードを取得する(ステップS1501)。
次に、設計支援装置100は、取得したソースコードに基づいて、ソースコードに規定された命令間の依存関係を示すPDGを作成する(ステップS1502)。そして、設計支援装置100は、作成したPDGにおけるDDエッジとCDエッジとを特定する(ステップS1503)。
次に、設計支援装置100は、DDエッジに対応するデータのデータタイプを特定する(ステップS1504)。そして、設計支援装置100は、データタイプがboolean型ではないデータに対応するDDエッジがあるか否かを判定する(ステップS1505)。ここで、DDエッジがない場合(ステップS1505:No)、設計支援装置100は、検出処理を終了する。
一方で、DDエッジがある場合(ステップS1505:Yes)、設計支援装置100は、DDエッジに対応するデータのビット幅を特定する(ステップS1506)。次に、設計支援装置100は、特定したDDエッジとCDエッジとに基づいて、CDエッジによって結ばれた閉路部分、またはDDエッジとCDエッジとによって結ばれた閉路部分を検出する(ステップS1507)。そして、設計支援装置100は、検出した閉路部分が、配線混雑要因となる閉路部分であるか否かを判定する(ステップS1508)。ここで、配線混雑要因となる閉路部分ではない場合(ステップS1508:No)、設計支援装置100は、検出処理を終了する。
一方で、配線混雑要因となる閉路部分である場合(ステップS1508:Yes)、設計支援装置100は、検出した閉路部分に対応するソースコード内のループ箇所を展開したソースコードを生成する(ステップS1509)。そして、設計支援装置100は、検出処理を終了する。
これにより、設計支援装置100は、配線混雑要因となるソースコード内のループ箇所を検出することができ、配線混雑要因となるソースコード内のループ箇所をなくしたソースコードを生成することができる。
(ソースコードを生成する具体例)
次に、図16〜図20を用いて、配線混雑要因となるソースコード内のループ箇所を展開したソースコードを生成する具体例について説明する。設計支援装置は、例えば、下記に示す、分離フェーズ、組み合わせ抽出フェーズ、共通コード抽出フェーズ、生成フェーズを行って、ソースコードを生成する。
<分離フェーズの一例>
図16は、分離フェーズの一例を示す説明図である。図16において、設計支援装置100は、PDG1100から、閉路部分1601の繰り返し回数にかかわる変数の組み合わせごとに、グラフを分離する。
設計支援装置100は、例えば、閉路部分1601の繰り返し回数にかかわる変数startとendとを特定する。次に、設計支援装置100は、特定した変数についての命令「i=start」と「i<end」とに対応するノードに連結される、符号DD1やDD2を付けたDDエッジを特定する。
そして、設計支援装置100は、DD1とDD2との始点になる各ノードに対応する命令を参照して、閉路部分1601の繰り返し回数にかかわる変数startとendとの組み合わせを特定する。図16の例では、設計支援装置100は、idx=0〜3に対応するstartとendとの組み合わせとして、G0「0,1」、G1「1,5」、G2「2,5」、G3「3,7」を特定したとする。
最後に、設計支援装置100は、PDG1100の閉路部分1601を、G0についてのグラフと、G1についてのグラフと、G2についてのグラフと、G3についてのグラフとなどの各種グラフ1602に分離する。次に、図17の説明に移行する。
<組み合わせ抽出フェーズの一例>
図17は、組み合わせ抽出フェーズの一例を示す説明図である。図17において、設計支援装置100は、分離したグラフ1602ごとに、startとendとの組み合わせを展開して、グラフ1602をさらに分離する。
設計支援装置100は、例えば、idx=0に対応するG0における変数iのパターン「0」を特定し、分離したG0についてのグラフ1602から、i=0についてのグラフ1701を分離する。同様に、設計支援装置100は、例えば、idx=1に対応するG1における変数iのパターン「1,2,3,4」を特定し、分離したG1についてのグラフ1602を、i=1,2,3,4のそれぞれについてのグラフ1701に分類する。
これにより、設計支援装置100は、点線部分のグラフについて、startとendとの組み合わせによる共有化をなくし、モジュールの数が低減されたソースコードに対応するグラフ1701を作成することができる。このため、設計支援装置100は、グラフ1701をソースコードに変換すれば、配線混雑を回避可能なソースコードを生成することができる。次に、図18の説明に移行する。
<共通コード抽出フェーズの一例>
図18は、共通コード抽出フェーズの一例を示す説明図である。図18において、設計支援装置100は、startとendとの組み合わせを展開したグラフ1701に基づいて、共通するコードを抽出し、共通するコードをマージしたグラフ1801を作成する。ここで、図19を用いて、設計支援装置100が、共通するコードを抽出する一例について説明する。以下の説明では、共通するコードを「共通コード」と表記する場合がある。
図19は、共通コードを抽出する一例を示す説明図である。図19において、設計支援装置100は、startとendとの組み合わせを展開したグラフ1701に基づいて、変数の演算のパターンを特定する。図19の例では、A[i]について共通コードを抽出する一例を示す。他の変数B[i]などについて共通コードを抽出する場合は、A[i]と同様であるため、説明を省略する。
設計支援装置100は、例えば、組み合わせG0において行われるA[0]=0の演算を特定する。また、設計支援装置100は、組み合わせG1において行われるA[1]=0、A[2]=0、A[3]=0、A[4]=0の演算を特定する。また、設計支援装置100は、組み合わせG2において行われるA[2]=0、A[3]=0、A[4]=0の演算を特定する。また、設計支援装置100は、組み合わせG3において行われるA[3]=0、A[4]=0、A[5]=0、A[6]=0の演算を特定する。
ここで、設計支援装置100は、組み合わせG0〜G3において共通するコードを抽出する。設計支援装置100は、例えば、組み合わせG1、G2において共通するコード「A[2]=0」を抽出する。また、設計支援装置100は、組み合わせG1〜G3において共通するコード「A[3]=0」と「A[4]=0」とを抽出する。
<生成フェーズの一例>
図20は、生成フェーズの一例を示す説明図である。図20において、設計支援装置100は、共通するコードが共通して1回行われ、共通しないコードは当該コードが行われる条件が満たされた場合に1回行われるように、ソースコードを生成する。
図20の例では、ソースコードにおけるA[i]の演算についての命令部分を生成する場合について説明する。他の変数B[i]などの演算についての命令部分を生成する場合は、A[i]の演算についての命令部分を生成する場合と同様であるため、説明を省略する。
設計支援装置100は、例えば、代入文を利用して、A[i]の値を、変数tmp_iに一旦代入するようにする。設計支援装置100は、case文を利用して、G1〜G3に対応するcase1〜3において、共通するコード「A[3]=0」と「A[4]=0」とに対応する演算「tmp_3=0」と「tmp_4=0」とが行われるようにする。また、設計支援装置100は、case文内でif文を利用して、共通しないコードに対応する演算が行われるようにする。そして、設計支援装置100は、代入文を利用して、変数tmp_iの値を、A[i]に代入するようにする。結果として、設計支援装置100は、ソースコード2001を生成する。
これにより、設計支援装置100は、組み合わせG0、G1、G2、G3に依存したソースコードから、idxに依存したソースコードを生成することができる。換言すれば、設計支援装置100は、集積回路に要するセレクタの数を低減し、集積回路の配線混雑の発生を抑制することができるソースコードを生成することができる。
(生成処理手順の一例)
次に、図21を用いて、生成処理手順の一例について説明する。
図21は、生成処理手順の一例を示すフローチャートである。図21において、設計支援装置100は、PDGを取得する(ステップS2101)。次に、設計支援装置100は、変数の組み合わせごとに、閉路部分を分離する(ステップS2102)。そして、設計支援装置100は、開始と終了との組み合わせごとにグラフをさらに分離する(ステップS2103)。
次に、設計支援装置100は、分離したグラフにおいて共通するコードを抽出する(ステップS2104)。そして、設計支援装置100は、共通するコードをマージしたソースコードを生成して(ステップS2105)、生成処理を終了する。
これにより、設計支援装置100は、高位合成の工程を行うのに先立って、配線混雑が発生する可能性があるソースコードから、配線混雑を回避可能なソースコードを生成することができる。このため、ユーザは、集積回路の設計工程110の手戻りを防止し、配線混雑を回避可能なソースコードを生成する作業にかかる作業量を削減することができる。
以上説明したように、設計支援装置100によれば、集積回路を動作レベルで記述したソースコードに規定されたデータのビット幅と、ソースコードに規定された命令間の処理の依存関係と、命令間のデータの依存関係とを特定することができる。そして、設計支援装置100によれば、ビット幅と、命令間の処理の依存関係と、命令間のデータの依存関係とに基づいて、配線混雑要因となるソースコード内のループ箇所を検出することができる。
これにより、設計支援装置100は、ソースコードを、RTLコードやネットリストに変換したり、物理論理合成を行わなくても、配線混雑要因を検出することができる。このため、設計支援装置100は、高位合成や論理合成の工程が行われる前に、集積回路のレイアウト上で配線混雑が発生するか否かを判定し、配線混雑要因となるソースコード内のループ箇所を検出することができる。結果として、設計支援装置100は、集積回路の設計工程110に発生する手戻りを小さくして、集積回路の設計工程110にかかる時間の増大を抑制することができる。
また、設計支援装置100によれば、命令間の処理の依存関係と、命令間のデータの依存関係とに基づいて、ソースコード内のループ箇所を特定することができる。次に、設計支援装置100によれば、データのビット幅に基づいて、特定したループ箇所における変数の演算に用いるモジュールに接続される配線の数を算出することができる。そして、設計支援装置100によれば、配線の数が閾値より大きければ、特定したループ箇所を、配線混雑要因となるソースコード内のループ箇所として検出することができる。
これにより、設計支援装置100は、実際にモジュールに接続される配線の数を算出し、モジュールの配置される領域において配置可能な配線の数よりも大きくなるか否かを判定することができる。そして、設計支援装置100は、配線混雑要因を検出することができる。
また、設計支援装置100によれば、ソースコードに規定された各命令をノードとして有向グラフ化してプログラム依存グラフを作成することにより、ビット幅と、命令間の処理の依存関係と、命令間のデータの依存関係とを特定することができる。そして、設計支援装置100によれば、プログラム依存グラフ内の分岐命令を表すノードを含む閉路部分に対応するソースコード内のループ箇所を特定することができる。これにより、設計支援装置100は、プログラム依存グラフを用いて効率よく閉路部分を検出し、配線混雑要因となる可能性があるソースコード内のループ箇所を特定することができる。
また、設計支援装置100によれば、ビット幅が2ビット以上のデータについての命令間のデータの依存関係を特定することができ、1ビットのデータについての命令間のデータの依存関係を特定しないようにすることができる。これにより、設計支援装置100は、配線混雑要因とならない箇所に対応するデータの依存関係についての閉路部分を検出する処理を省略して、効率よく閉路部分を検出することができる。
また、設計支援装置100によれば、配線混雑要因となるループ箇所を展開したソースコードを生成することができる。これにより、設計支援装置100は、配線混雑を回避可能なソースコードを自動で生成することができる。結果として、ユーザは、ソースコードを修正しなくてもよくなり、作業量を低減することができる。
なお、本実施の形態で説明した設計支援方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。設計支援方法を実行する設計支援プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、設計支援方法を実行する設計支援プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)プログラミング言語を用いて集積回路を動作レベルで記述したソースコードに基づいて、前記ソースコードに規定されたデータのビット幅と、前記ソースコードに規定された命令間の処理の依存関係と、前記命令間のデータの依存関係とを特定し、
特定した前記ビット幅と、前記命令間の処理の依存関係と、前記命令間のデータの依存関係とに基づいて、配線混雑要因となる前記ソースコード内のループ箇所を検出する、
制御部を有することを特徴とする設計支援装置。
(付記2)前記制御部は、特定した前記命令間の処理の依存関係と、前記命令間のデータの依存関係とに基づいて、前記ソースコード内のループ箇所を特定し、
特定した前記ビット幅に基づいて、特定した前記ループ箇所における変数の演算に用いるモジュールに接続される配線の数を算出し、
算出した前記配線の数が閾値より大きければ、特定した前記ループ箇所を、前記配線混雑要因となる前記ソースコード内のループ箇所として検出する、ことを特徴とする付記1に記載の設計支援装置。
(付記3)前記制御部は、前記ソースコードに規定された各命令をノードとして有向グラフ化してプログラム依存グラフを作成することにより、前記ビット幅と、前記命令間の処理の依存関係と、前記命令間のデータの依存関係とを特定し、
前記プログラム依存グラフ内の分岐命令を表すノードを含む閉路部分に対応する前記ソースコード内のループ箇所を特定する、ことを特徴とする付記1または2に記載の設計支援装置。
(付記4)前記データは、2ビット以上のデータである、ことを特徴とする付記1〜3のいずれか一つに記載の設計支援装置。
(付記5)前記制御部は、検出した前記ループ箇所を展開したソースコードを生成する、ことを特徴とする付記1〜4のいずれか一つに記載の設計支援装置。
(付記6)コンピュータが、
プログラミング言語を用いて集積回路を動作レベルで記述したソースコードに基づいて、前記ソースコードに規定されたデータのビット幅と、前記ソースコードに規定された命令間の処理の依存関係と、前記命令間のデータの依存関係とを特定し、
特定した前記ビット幅と、前記命令間の処理の依存関係と、前記命令間のデータの依存関係とに基づいて、配線混雑要因となる前記ソースコード内のループ箇所を検出する、
処理を実行することを特徴とする設計支援方法。
(付記7)コンピュータに、
プログラミング言語を用いて集積回路を動作レベルで記述したソースコードに基づいて、前記ソースコードに規定されたデータのビット幅と、前記ソースコードに規定された命令間の処理の依存関係と、前記命令間のデータの依存関係とを特定し、
特定した前記ビット幅と、前記命令間の処理の依存関係と、前記命令間のデータの依存関係とに基づいて、配線混雑要因となる前記ソースコード内のループ箇所を検出する、
処理を実行させることを特徴とする設計支援プログラム。