(57)【要約】【課題】システムの性能を評価するシミュレーションの効率化を図る。【解決手段】シミュレーション装置１００は、ＥＳＬなどのＲＴＬよりも抽象度が高いレベルでのシステムの性能を評価するシミュレーションを実行する。シミュレーション装置１００は、リファレンスソースＲＳとアーキテクチャモデルＡＭとを別々のスレッドで実行することにより、リファレンスソースＲＳのアルゴリズムに依存したブロックの振る舞いを模擬するシミュレーションを実行して、シミュレーション結果ＳＲを出力する。【選択図】図１
2014142725.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
システムの機能をプログラム言語で記述したリファレンスソースを取得し、
前記システムの動作を模擬する複数のブロックと、前記複数のブロックを制御する制御部と、を含むアーキテクチャモデルを取得し、
前記リファレンスソースに基づいて、処理対象となるデータ列から順次選ばれるデータに基づく条件分岐により処理内容が変わる処理を含む一連の処理のループ処理を実行し、
前記一連の処理に含まれる処理の実行が完了する度に、前記処理の処理内容に応じて設定されたパラメータ値を、前記複数のブロックのうちの前記処理を実現するブロックがアクセスするバッファに書き込み、
前記制御部により、前記一連の処理の実行が完了した場合に、前記一連の処理のうちの最初に実行される処理を実現するブロックを起動させ、
前記ブロックにより、前記ブロックがアクセスするバッファからパラメータ値を読み出させることにより、前記パラメータ値に基づく計算処理を実行させる、
処理を実行させることを特徴とするシミュレーションプログラム。
【請求項２】
前記コンピュータに、
前記一連の処理の実行が完了する度に、前記一連の処理の実行が完了したことを示す情報を前記制御部がアクセスするバッファに書き込み、
前記制御部により、前記制御部がアクセスするバッファに記憶されている情報に基づいて、前記一連の処理の実行が完了したか否かを判定し、
前記制御部により、前記一連の処理の実行が完了したと判定した場合に、前記ブロックを起動させる、
処理を実行させることを特徴とする請求項１に記載のシミュレーションプログラム。
【請求項３】
前記制御部がアクセスするバッファは、ＦＩＦＯ（Ｆｉｒｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）構造のバッファであり、
前記コンピュータに、
前記制御部により、前記制御部がアクセスするバッファに前記情報が記憶されている場合に、前記ブロックを起動させる、
処理を実行させることを特徴とする請求項２に記載のシミュレーションプログラム。
【請求項４】
コンピュータが、
システムの機能をプログラム言語で記述したリファレンスソースを取得し、
前記システムの動作を模擬する複数のブロックと、前記複数のブロックを制御する制御部と、を含むアーキテクチャモデルを取得し、
前記リファレンスソースに基づいて、処理対象となるデータ列から順次選ばれるデータに基づく条件分岐により処理内容が変わる処理を含む一連の処理のループ処理を実行し、
前記一連の処理に含まれる処理の実行が完了する度に、前記処理の処理内容に応じて設定されたパラメータ値を、前記複数のブロックのうちの前記処理を実現するブロックがアクセスするバッファに書き込み、
前記制御部により、前記一連の処理の実行が完了した場合に、前記一連の処理のうちの最初に実行される処理を実現するブロックを起動させ、
前記ブロックにより、前記ブロックがアクセスするバッファからパラメータ値を読み出させることにより、前記パラメータ値に基づく計算処理を実行させる、
処理を実行することを特徴とするシミュレーション方法。
【請求項５】
システムの機能をプログラム言語で記述したリファレンスソース、および前記システムの動作を模擬する複数のブロックと前記複数のブロックを制御する制御部とを含むアーキテクチャモデルを取得する取得部と、
前記リファレンスソースに基づいて、処理対象となるデータ列から順次選ばれるデータに基づく条件分岐により処理内容が変わる処理を含む一連の処理のループ処理を実行し、前記一連の処理に含まれる処理の実行が完了する度に、前記処理の処理内容に応じて設定されたパラメータ値を、前記複数のブロックのうちの前記処理を実現するブロックがアクセスするバッファに書き込む第１の実行部と、
前記制御部により、前記一連の処理の実行が完了した場合に、前記一連の処理のうちの最初に実行される処理を実現するブロックを起動させ、前記ブロックにより、前記ブロックがアクセスするバッファからパラメータ値を読み出させることにより、前記パラメータ値に基づく計算処理を実行させる第２の実行部と、
を有することを特徴とするシミュレーション装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、シミュレーションプログラム、シミュレーション方法およびシミュレーション装置に関する。
【背景技術】
【０００２】
従来、ＥＳＬ（Ｅｌｅｃｔｒｏｎｉｃ  Ｓｙｓｔｅｍ  Ｌｅｖｅｌ）などのＲＴＬ（Ｒｅｇｉｓｔｅｒ  Ｔｒａｎｓｆｅｒ  Ｌｅｖｅｌ）よりも抽象度が高いレベルでシミュレーションモデルを作成してシステムの性能評価が行われる場合がある。また、表計算ソフトなどを用いたユーザの手計算により、システムの性能を見積もる場合がある。
【０００３】
関連する先行技術としては、例えば、ソースコード記述を読み取って、メモリ中に記憶される合成中間形式を生成し、メモリ中の合成中間形式を探索してプロセスごとにアレイを見出して、ＧＵＩ（Ｇｒａｐｈｉｃａｌ  Ｕｓｅｒ  Ｉｎｔｅｒｆａｃｅ）中にリストアップする技術がある。また、抽象度の高いシミュレーションを対象とし、設計の上流工程においてシステムアーキテクチャを探求する際に最適なアーキテクチャ構成を求めるための技術がある。また、バスアーキテクチャの設計から論理合成までの条件を統合的に適用してシステム設計を支援する技術がある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００９−０９３６８２号公報
【特許文献２】特開２０１０−０３９６７７号公報
【特許文献３】特開２００６−２１５８５２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来技術によれば、システムの性能を評価するためのシミュレーションモデルの作成に時間や手間がかかるという問題がある。例えば、ＥＳＬであってもシミュレーションモデルの作成に数ヶ月単位の期間を要することがあり、顧客との商談時などの設計段階よりも前の段階にシステムの性能を評価することが難しい。
【０００６】
また、近年では、様々なハードウェアブロックを組み合わせてＳｏＣ（Ｓｙｓｔｅｍ  ｏｎ  ａ  Ｃｈｉｐ）を設計する場合が多く、様々な機能が含まれるようになってきている。このため、表計算ソフトなどを用いた手計算でシステムの性能を見積もるには、多数の専門家が経験と勘を駆使して机上検討を行うことになり作業時間やコストが増大する。
【０００７】
１つの側面では、本発明は、システムの性能を評価するシミュレーションの効率化を図るシミュレーションプログラム、シミュレーション方法およびシミュレーション装置を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明の一側面によれば、システムの機能をプログラム言語で記述したリファレンスソースを取得し、前記システムの動作を模擬する複数のブロックと、前記複数のブロックを制御する制御部と、を含むアーキテクチャモデルを取得し、前記リファレンスソースに基づいて、処理対象となるデータ列から順次選ばれるデータに基づく条件分岐により処理内容が変わる処理を含む一連の処理のループ処理を実行し、前記一連の処理に含まれる処理の実行が完了する度に、前記処理の処理内容に応じて設定されたパラメータ値を、前記複数のブロックのうちの前記処理を実現するブロックがアクセスするバッファに書き込み、前記制御部により、前記一連の処理の実行が完了した場合に、前記一連の処理のうちの最初に実行される処理を実現するブロックを起動させ、前記ブロックにより、前記ブロックがアクセスするバッファからパラメータ値を読み出させることにより、前記パラメータ値に基づく計算処理を実行させるシミュレーションプログラム、シミュレーション方法およびシミュレーション装置が提案される。
【発明の効果】
【０００９】
本発明の一態様によれば、システムの性能を評価するシミュレーションの効率化を図ることができるという効果を奏する。
【図面の簡単な説明】
【００１０】
【図１】図１は、実施の形態にかかるシミュレーション方法の一実施例を示す説明図である。
【図２】図２は、リファレンスソースＲＳを擬似コードで記述した記述例を示す説明図である。
【図３】図３は、アーキテクチャモデルＡＭの具体例を示す説明図（その１）である。
【図４】図４は、アーキテクチャモデルＡＭの動作シーケンスの一例を示す説明図である。
【図５】図５は、制御部の記述例を示す説明図である。
【図６】図６は、ブロックの記述例を示す説明図である。
【図７】図７は、シミュレーションモデルのメイン記述例を示す説明図である。
【図８】図８は、シミュレーション装置１００のハードウェア構成例を示すブロック図である。
【図９】図９は、シミュレーション装置１００の機能的構成例を示すブロック図である。
【図１０Ａ】図１０Ａは、リファレンスソースＲＳの記述例を示す説明図（その１）である。
【図１０Ｂ】図１０Ｂは、リファレンスソースＲＳの記述例を示す説明図（その２）である。
【図１１】図１１は、入力ファイルの具体例を示す説明図である。
【図１２】図１２は、出力ファイルの具体例を示す説明図である。
【図１３】図１３は、先行アクセス記述の挿入例を示す説明図である。
【図１４Ａ】図１４Ａは、リファレンスソースＲＳとアーキテクチャモデルＡＭとの接続部分の記述例を示す説明図（その１）である。
【図１４Ｂ】図１４Ｂは、リファレンスソースＲＳとアーキテクチャモデルＡＭとの接続部分の記述例を示す説明図（その２）である。
【図１５】図１５は、アーキテクチャモデルＡＭの具体例を示す説明図（その２）である。
【図１６】図１６は、プローバ関数の挿入例を示す説明図である。
【図１７Ａ】図１７Ａは、部品の記述例を示す説明図（その１）である。
【図１７Ｂ】図１７Ｂは、部品の記述例を示す説明図（その２）である。
【図１７Ｃ】図１７Ｃは、部品の記述例を示す説明図（その３）である。
【図１７Ｄ】図１７Ｄは、部品の記述例を示す説明図（その４）である。
【図１８】図１８は、部品間の結線関係の記述例を示す説明図である。
【図１９】図１９は、リファレンスソースＲＳを起動するための記述例を示す説明図である。
【図２０】図２０は、リファレンスソースＲＳ・アーキテクチャモデルＡＭ間のソフトウェア構造を示す説明図である。
【図２１】図２１は、シミュレーション結果ＳＲの具体例を示す説明図である。
【図２２】図２２は、シミュレーション装置１００のシミュレーション処理手順の一例を示すフローチャートである。
【図２３】図２３は、リファレンスソースＲＳの処理手順の一例を示すフローチャートである。
【図２４】図２４は、制御部ＣＴの処理手順の一例を示すフローチャートである。
【図２５】図２５は、ブロックＢｉの処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１１】
以下に図面を参照して、本発明にかかるシミュレーションプログラム、シミュレーション方法およびシミュレーション装置の実施の形態を詳細に説明する。
【００１２】
（シミュレーション方法の一実施例）
図１は、実施の形態にかかるシミュレーション方法の一実施例を示す説明図である。図１において、シミュレーション装置１００は、ＥＳＬなどのＲＴＬよりも抽象度が高いレベルでのシステムの性能を評価するシミュレーションを実行するコンピュータである。評価対象となるシステムは、例えば、複数のハードウェアブロックがバスを介して接続されるシステムである。シミュレーションは、例えば、各ハードウェアブロックがバスにトランザクションを投げた際のバスの混み具合から、システムの性能が破綻しないかどうかを評価するためのものである。
【００１３】
ハードウェアブロックは、例えば、バスを介してメモリにアクセスして計算処理を行うモデルである。具体的には、例えば、ハードウェアブロックは、指定サイズ分のデータのリード／ライトを行い、指定サイクル分の遅延時間を発生させて計算時間を再現するモデルである。以下の説明では、システム内のハードウェアブロックを単に「ブロック」と表記する場合がある。
【００１４】
シミュレーション装置１００は、リファレンスソースＲＳとアーキテクチャモデルＡＭとに基づいて、リファレンスソースＲＳのアルゴリズムに依存したブロックの振る舞いを模擬するシミュレーションを実行して、シミュレーション結果ＳＲを出力する。リファレンスソースＲＳは、例えば、アルゴリズムの評価・開発を目的に作成され、実現したいシステムの機能をＣ言語などのプログラミング言語で記述したものである。また、アーキテクチャモデルＡＭは、システム内のブロックとバスとの構成を示すものである。
【００１５】
ここで、アーキテクチャモデルＡＭ内のブロックに入力されるパラメータ値は、システムの機能に依存する。ブロックに入力されるパラメータ値としては、例えば、１回当たりのデータサイズ、アクセスの間隔、アクセス回数などがある。このため、リファレンスソースＲＳから、アーキテクチャモデルＡＭ内のモデルに入力するパラメータ値の変化を観測または予測することが可能である。
【００１６】
そこで、本実施の形態では、シミュレーション装置１００は、リファレンスソースＲＳとアーキテクチャモデルＡＭとを用いて、リファレンスソースＲＳの振る舞いに合わせたアーキテクチャモデルＡＭの振る舞いを再現する。リファレンスソースＲＳを使ってシミュレーションしたい典型例として動画像処理がある。動画像処理は、ある処理を繰り返し行うという特徴を有しており、リファレンスソースＲＳも繰り返し文で記述される。
【００１７】
図２は、リファレンスソースＲＳを擬似コードで記述した記述例を示す説明図である。図２の擬似コード２００で示すように、リファレンスソースＲＳは、例えば、（１）処理対象となるファイルをオープンし、（２）ファイルをパーズして１処理分のデータを取り出して、（３）取り出した１処理分のデータに対して所望の処理を繰り返すといった記述となる。一方、アーキテクチャモデルＡＭの主目的は、データ転送機能のモデル化である。ここで、アーキテクチャモデルＡＭの具体例について説明する。
【００１８】
図３は、アーキテクチャモデルＡＭの具体例を示す説明図（その１）である。図３において、アーキテクチャモデル３００は、制御部３０１と、ブロック３０２と、ブロック３０３と、ブロック３０４と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）３０５と、データ転送部３０６と、を含む構成である。
【００１９】
アーキテクチャモデル３００では、制御部３０１の指示に従ってブロック３０２〜３０４が動作し、制御部３０１、ブロック３０２〜３０４およびＲＡＭ３０５がデータ転送部３０６を共有しながら動作する。具体的には、例えば、データ転送部３０６へのアクセス関数をａｃｃｅｓｓ（ｉｎｔ  ｂｙｔｅ＿ｎｕｍ）とし、データ転送部３０６に指定されたバス幅をｎ［ｂｙｔｅ］とする時、ｂｙｔｅ＿ｎｕｍ／ｎ＋αサイクルの時間をかけて、アクセス関数を呼んだブロックからＲＡＭ３０５へ書き込みが行われる。
【００２０】
図４は、アーキテクチャモデルＡＭの動作シーケンスの一例を示す説明図である。図４において、アーキテクチャモデル３００（図３参照）の動作シーケンスが示されている。具体的には、制御部３０１が各ブロック３０２〜３０４を起動し、各ブロック３０２〜３０４が適宜ＲＡＭ３０５にアクセスする。そして、各ブロック３０２〜３０４は、所望のアクセスをすべて終えたら、ｄｏｎｅを制御部３０１に返す。ここで、制御部３０１の記述例について説明する。
【００２１】
図５は、制御部の記述例を示す説明図である。図５において、記述例５００は、図４に示すような処理を１０回繰り返す場合の制御部３０１の記述例である。記述例５００において、ｔｏ＿ｔａｒ［ｉ］はｂｌｏｃｋ  ｉ（ブロック３０２〜３０４）との通信路であり、ｔｏ＿ｔａｒ［ｉ］−＞ｓｔａｒｔ（）で起動信号を送っている。
【００２２】
ｔｏ＿ｔａｒ［ｉ］−＞ｇｅｔ＿ｄｏｎｅ＿ｅｖｅｎｔ（）はｄｏｎｅイベントを取り出す関数であり、記述例５００では取り出したイベントが発生するのを待っている。また、ｔｏ＿ｔａｒ［ｉ］−＞ｇｅｔ＿ｄｏｎｅ（）はｄｏｎｅ状態かどうかを示すフラグを取り出す関数であり、ｗｈｉｌｅ（・・・）の（）内部の式が真になった時、ｄｏ｛・・・｝ｗｈｉｌｅ（）を抜けてイベント待ちの状態から抜ける。このようにして、制御部３０１は、各ブロック３０２〜３０４と同期する。
【００２３】
つぎに、ブロック（ブロック３０２〜３０４）の記述例について説明する。ただし、ここでは、ブロックに与えるパラメータ値を、ブロック記述の中に記述する手法について説明する。なお、ＲＡＭ３０５、データ転送部３０６については、例えば、既存のメモリモデルやバスモデルを利用することができる。
【００２４】
図６は、ブロックの記述例を示す説明図である。図６に示す記述例６００において、ｂｌｏｃｋ０は、制御部３０１との通信用ポートｆｒｏｍ＿ｉｎｉと、データ転送部３０６との通信用ポートｔｒａｎｓａｃｔｉｏｎを持つ。ｔｈ０がデータ転送の機能を実現する部分である。ここで、ｔｈ０の中の記述について説明する。
【００２５】
（０）は、制御部３０１からの起動信号を待つ記述である。（１）は、１起動当たり１０００回の処理を行うことを定義する記述である。（２）は、この処理にかかる処理時間分の遅延を生成する記述である。ここでは一律４０［ｎｓ］の処理時間がかかるようになっている。（３）は、データ転送部３０６へのアクセスを表現する記述である。ここでは、データ１００バイト分のアクセスが表現されている。
【００２６】
（１）〜（３）の処理を１０００回行うとｆｏｒ文を抜けて（４）に移る。（４）は、制御部３０１に終了信号を送る記述である。終了信号は、ｆｒｏｍ＿ｉｎｉのｄｏｎｅ（）をコールすることにより実現する。このようにして、制御部３０１と協調しながらデータ転送部３０６にデータアクセスを発生させるモデルが実現できている。
【００２７】
しかしながら、記述例６００では、ｂｌｏｃｋ０に与えるパラメータ値を、記述例６００の中にユーザが記述する必要がある。図６の例では、例えば、小処理の回数（上記（１）の１０００という値）、小処理の処理時間（上記（２）の４０［ｎｓ］という値）および小処理で発生するアクセス量（上記（３）１００バイトという値）を、記述例６００の中にユーザが記述する必要がある。この手法は、ユーザの予想に基づくシミュレーションができ、簡便で使い勝手がよい反面、重要なパラメータ値をユーザが指定することになるという問題がある。
【００２８】
そこで、本実施の形態では、シミュレーション装置１００は、ブロック（例えば、図３に示したブロック３０２〜３０４）に与えるパラメータ値をリファレンスソースＲＳの実行により決定する。具体的には、シミュレーション装置１００は、リファレンスソースＲＳとアーキテクチャモデルＡＭを別々のスレッドで実行する。
【００２９】
図７は、シミュレーションモデルのメイン記述例を示す説明図である。図７において、メイン記述７００に示すように、シミュレーション装置１００は、リファレンスソースＲＳを実行するスレッド０とアーキテクチャモデルＡＭを実行するスレッド１とを同時に実行する。
【００３０】
シミュレーションにおいて、リファレンスソースＲＳとアーキテクチャモデルＡＭは、共有メモリＭＭを用いて通信を行う。データは、リファレンスソースＲＳからアーキテクチャモデルＡＭに送られる。具体的には、リファレンスソースＲＳに埋め込まれたプローブ関数がコールされると、シミュレーション装置１００は、対応する引数の値を共有メモリＭＭ上のＦＩＦＯ（Ｆｉｒｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）バッファに書き込む。これにより、プローブした値がＦＩＦＯバッファに溜まっていく。
【００３１】
一方、アーキテクチャモデルＡＭ側では、各ブロックが、各々参照すべき値をＦＩＦＯバッファから適時取り出して、取り出した値をパラメータ値としてアーキテクチャシミュレーションを実行する。これにより、リファレンスソースＲＳで生成したパラメータ値をアーキテクチャシミュレーションで利用でき、かつ、１つの実行形式の中で実行することができる。ただし、リファレンスソースＲＳよりもアーキテクチャモデルＡＭのほうが先行して動作するとシミュレーションが破綻してしまう。
【００３２】
そこで、本実施の形態では、アーキテクチャモデルＡＭに対してリファレンスソースＲＳが先行している先行量を表す変数領域を共有メモリＭＭ上に用意する。以下、この変数を「先行度変数」と表記する場合がある。
【００３３】
リファレンスソースＲＳ側は、一連の処理が終わった時に先行度変数を１加算する。図２の例では、（３）が終わった段階で先行度変数を１加算する。一方、アーキテクチャモデルＡＭ側は、例えば、図３に示した制御部３０１で先行度変数を参照する。図５の例では、（１）の前に先行度変数が１以上の時に先に進み、０の時は１になるまで待つ処理を入れる。つぎに、先行度変数を１減算する。ここまでの例は変数のみを利用した例になっているが、後述の例では、ＦＩＦＯを利用した実現例となっている。この場合、リファレンスソースＲＳ側は適当な値（例えば、ループ実行回数）をＦＩＦＯに送出する。アーキテクチャモデルＡＭ側はＦＩＦＯが空でなければ値を取り出して、ＦＩＦＯが空だったら、空ではなくなるのを待って、値を取り出す。このようにすると、先の先行度をＦＩＦＯのサイズで表現することができる。
【００３４】
これにより、共有メモリＭＭ上のＦＩＦＯバッファの中に一連の処理の計算に必要な全パラメータが格納された後、アーキテクチャモデルＡＭ側が動作する制御が可能になる。なお、ＦＩＦＯバッファのメモリ量を制限する場合は、例えば、先行量の上限Ｎを決めておき、先行量が上限Ｎを超えている時には、先行量が上限Ｎ以下になるまでリファレンスソースＲＳ側の実行を遅延させる制御を入れることにしてもよい。
【００３５】
このように、本実施の形態では、アーキテクチャモデルＡＭ内の各ブロックが処理するのに必要なパラメータ値を共有メモリＭＭに渡す関数（プローブ関数）をリファレンスソースＲＳに埋め込む。また、アーキテクチャモデルＡＭ内の各ブロックが共有メモリＭＭから必要なデータを取り出す関数をアーキテクチャモデルＡＭに埋め込む。これにより、リファレンスソースＲＳに基づくアーキテクチャシミュレーションが可能になり、ソースを分割してブロックごとに機能が入っているような複雑なモデルを作ることなく性能の評価が可能になる。
【００３６】
（シミュレーション装置１００のハードウェア構成例）
図８は、シミュレーション装置１００のハードウェア構成例を示すブロック図である。図８において、シミュレーション装置１００は、ＣＰＵ８０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）８０２と、ＲＡＭ８０３と、磁気ディスクドライブ８０４と、磁気ディスク８０５と、光ディスクドライブ８０６と、光ディスク８０７と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）８０８と、ディスプレイ８０９と、キーボード８１０と、マウス８１１と、を有する。また、各構成部はバス８１２によってそれぞれ接続されている。
【００３７】
ここで、ＣＰＵ８０１は、シミュレーション装置１００の全体の制御を司る。ＲＯＭ８０２は、ブートプログラムなどのプログラムを記憶する。ＲＡＭ８０３は、ＣＰＵ８０１のワークエリアとして使用される。磁気ディスクドライブ８０４は、ＣＰＵ８０１の制御に従って磁気ディスク８０５に対するデータのリード／ライトを制御する。磁気ディスク８０５は、磁気ディスクドライブ８０４の制御で書き込まれたデータを記憶する。
【００３８】
光ディスクドライブ８０６は、ＣＰＵ８０１の制御にしたがって光ディスク８０７に対するデータのリード／ライトを制御する。光ディスク８０７は、光ディスクドライブ８０６の制御で書き込まれたデータを記憶したり、光ディスク８０７に記憶されたデータをコンピュータに読み取らせたりする。
【００３９】
Ｉ／Ｆ８０８は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク８２０に接続され、ネットワーク８２０を介して他のコンピュータに接続される。そして、Ｉ／Ｆ８０８は、ネットワーク８２０と内部のインターフェースを司り、他のコンピュータからのデータの入出力を制御する。Ｉ／Ｆ８０８には、例えば、モデムやＬＡＮアダプタなどを採用することができる。
【００４０】
ディスプレイ８０９は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ８０９は、例えば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００４１】
キーボード８１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力を行う。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス８１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などを行う。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００４２】
なお、シミュレーション装置１００は、上述した構成のうち、例えば、光ディスクドライブ８０６や光ディスク８０７を有さないことにしてもよい。また、シミュレーション装置１００は、上述した構成部のほかに、例えば、スキャナやプリンタを有することにしてもよい。
【００４３】
（シミュレーション装置１００の機能的構成例）
図９は、シミュレーション装置１００の機能的構成例を示すブロック図である。図９において、シミュレーション装置１００は、取得部９０１と、第１の実行部９０２と、第２の実行部９０３と、出力部９０４と、を含む構成である。各機能部は、具体的には、例えば、図８に示したＲＯＭ８０２、ＲＡＭ８０３、磁気ディスク８０５、光ディスク８０７などの記憶装置に記憶されたプログラムをＣＰＵ８０１に実行させることにより、または、Ｉ／Ｆ８０８により、その機能を実現する。また、各機能部の処理結果は、例えば、ＲＡＭ８０３、磁気ディスク８０５、光ディスク８０７などの記憶装置に記憶される。
【００４４】
取得部９０１は、リファレンスソースＲＳを取得する機能を有する。ここで、リファレンスソースＲＳは、評価対象となるシステムの機能をプログラム言語で記述したソースコードである。リファレンスソースＲＳは、例えば、ｉｆ文等の条件分岐を含み、入力ファイルに記述された処理対象となるデータ列からデータを順次選択して、実装したアルゴリズムで一連の処理を行い、処理結果を出力ファイルに書き出すものである。
【００４５】
具体的には、例えば、取得部９０１は、図８に示したキーボード８１０やマウス８１１を用いたユーザの操作入力により、リファレンスソースＲＳを取得する。また、取得部９０１は、外部のコンピュータからリファレンスソースＲＳを受信することにしてもよい。リファレンスソースＲＳの具体例については、図１０Ａ、図１０Ｂ、図１３および図１６を用いて後述する。
【００４６】
また、リファレンスソースＲＳにおいて処理対象となるデータ列が記述された入力ファイルは、例えば、キーボード８１０やマウス８１１を用いたユーザの操作入力により取得される。入力ファイルの具体例については、図１１を用いて後述する。
【００４７】
また、取得部９０１は、アーキテクチャモデルＡＭを取得する機能を有する。ここで、アーキテクチャモデルＡＭは、評価対象となるシステム内のブロックとバスとの構成を示すものであり、例えば、複数のブロックと、複数のブロックを制御する制御部とを含む。ブロックは、システムの動作を模擬するモデルであり、バスを介してメモリにアクセスして計算処理を行う計算ブロックである。
【００４８】
なお、以下の説明では、アーキテクチャモデルＡＭに含まれる複数のブロックを「ブロックＢ１〜Ｂｎ」と表記し、ブロックＢ１〜Ｂｎのうちの任意のブロックを「ブロックＢｉ」と表記する場合がある。また、ブロックＢ１〜Ｂｎを制御する制御部を「制御部ＣＴ」と表記する場合がある。
【００４９】
具体的には、例えば、取得部９０１は、キーボード８１０やマウス８１１を用いたユーザの操作入力により、アーキテクチャモデルＡＭを取得する。また、取得部９０１は、外部のコンピュータからアーキテクチャモデルＡＭを受信することにしてもよい。なお、アーキテクチャモデルＡＭは、例えば、キーボード８１０やマウス８１１を用いたユーザの操作入力により、新規作成、または、データベースに登録されているブロックモデルやインターフェースモデル等を再利用または組み合わせることにより作成されることにしてもよい。
【００５０】
第１の実行部９０２は、リファレンスソースＲＳを実行する機能を有する。具体的には、例えば、第１の実行部９０２は、リファレンスソースＲＳに実装されたアルゴリズムで一連の処理のループ処理を実行する。ここで、一連の処理は、引数の値を変えながら繰り返し実行されるものであり、例えば、動画像を圧縮する動画像処理などである。
【００５１】
より具体的には、例えば、第１の実行部９０２は、入力ファイルに記述されたデータ列からデータを順次選択して、選択したデータに基づく条件分岐により処理内容が変わる処理を含む一連の処理を実行する。なお、一連の処理は、例えば、後述する関数ｃａｌｃ，関数ｃａｌｃ２に相当する。
【００５２】
また、第１の実行部９０２は、一連の処理に含まれる処理の実行が完了する度に、該処理の処理内容に応じて設定されたパラメータ値を、ブロックＢ１〜Ｂｎのうちの該処理を実現するブロックＢｉがアクセスするバッファに書き込む機能を有する。ここで、パラメータ値は、ブロックＢｉの計算処理に用いられるパラメータの値である。
【００５３】
パラメータ値は、一連の処理に含まれる各々の処理の処理内容と対応付けてリファレンスソースＲＳに記述される。パラメータ値の具体例としては、例えば、計算処理にかかるサイクル数、リードデータ量、ライトデータ量やブロックＢｉの動作周波数などである。また、ブロックＢｉがアクセスするバッファとは、例えば、共有メモリＭＭ上にブロックＢｉごとに設けられたＦＩＦＯ構造のバッファである。
【００５４】
また、第１の実行部９０２は、一連の処理の実行が完了する度に、一連の処理の実行が完了したことを示す情報を制御部ＣＴがアクセスするバッファに書き込む機能を有する。ここで、一連の処理の実行が完了したことを示す情報とは、例えば、アーキテクチャモデルＡＭに対してリファレンスソースＲＳが先行している先行量を表す先行度変数である。
【００５５】
また、制御部ＣＴがアクセスするバッファとは、例えば、共有メモリＭＭ上に設けられたＦＩＦＯ構造のバッファである。具体的には、例えば、第１の実行部９０２は、一連の処理の実行が完了する度に、先行度変数をインクリメントして制御部ＣＴがアクセスするＦＩＦＯ構造のバッファに書き込む。
【００５６】
また、第１の実行部９０２は、制御部ＣＴがアクセスするＦＩＦＯ構造のバッファに所定数Ｎ以上の先行度変数が記憶されている場合には、当該バッファに記憶されている先行度変数が所定数Ｎ未満となるまでループ処理の実行を停止することにしてもよい。これにより、アーテクチャモデルＡＭに対するリファレンスソースＲＳの先行量が上限Ｎ以上となった時にＦＩＦＯ構造のバッファに先行度変数が蓄積されていくのを防いで、バッファのメモリ量を制限することができる。
【００５７】
第２の実行部９０３は、アーキテクチャモデルＡＭのアーキテクチャシミュレーションを実行する機能を有する。具体的には、例えば、第２の実行部９０３は、第１の実行部９０２による一連の処理の実行が完了した場合に、制御部ＣＴにより、一連の処理のうちの最初に実行される処理を実現するブロックＢｉを起動させる。
【００５８】
より具体的には、例えば、第２の実行部９０３は、制御部ＣＴにより、制御部ＣＴがアクセスするＦＩＦＯ構造のバッファに先行度変数が記憶されている場合に、一連の処理のうちの最初に実行される処理を実現するブロックＢｉに起動命令を出力する。すなわち、ＦＩＦＯ構造のバッファに未読み出しの先行度変数がある場合は、アーキテクチャモデルＡＭに対してリファレンスソースＲＳが先行していることが保証される。
【００５９】
また、第２の実行部９０３は、ブロックＢｉにより、ブロックＢｉがアクセスするバッファからパラメータ値を読み出させることにより、該パラメータ値に基づく計算処理を実行させる。具体的には、例えば、第２の実行部９０３は、制御部ＣＴからの起動命令を受け付けたブロックＢｉにより、ブロックＢｉがアクセスするバッファに記憶されているパラメータ値に基づく計算処理を実行させる。
【００６０】
また、第２の実行部９０３は、ブロックＢｉにより、パラメータ値に基づく計算処理の実行が完了した場合、一連の処理のうちのつぎの処理を実現するブロックＢｊに起動命令を出力する（ｊ≠ｉ）。そして、第２の実行部９０３は、ブロックＢｉからの起動命令を受け付けたブロックＢｊにより、ブロックＢｊがアクセスするバッファに記憶されているパラメータ値に基づく計算処理を実行させる。また、第２の実行部９０３は、ブロックＢｊが一連の処理のうちの最後の処理を実現するブロックの場合、ブロックＢｊにより、一連の処理の実行が完了したことを示す完了通知を制御部ＣＴに出力させる。
【００６１】
出力部９０４は、第１の実行部９０２によって実行された実行結果を出力する機能を有する。具体的には、例えば、出力部９０４は、後述の図１２に示すような出力ファイル１２００を出力することにしてもよい。また、出力部９０４は、第２の実行部９０３によって実行された実行結果を出力する機能を有する。具体的には、例えば、出力部９０４は、後述の図２１に示すようなシミュレーション結果ＳＲを出力することにしてもよい。
【００６２】
なお、出力部９０４の出力形式としては、例えば、ＲＡＭ８０３、磁気ディスク８０５、光ディスク８０７などの記憶装置への記憶、ディスプレイ８０９への表示、プリンタ（不図示）への印刷出力、Ｉ／Ｆ８０８による外部のコンピュータへの送信などがある。
【００６３】
（リファレンスソースＲＳの記述例）
図１０Ａおよび図１０Ｂは、リファレンスソースＲＳの記述例を示す説明図である。図１０Ａおよび図１０Ｂにおいて、リファレンスソースＲＳは、関数ｃａｌｃと、関数ｃａｌｃ２と、デバッグ用の関数ｐｒｉｎｔ＿ｒｅｓｕｌｔと、を含む。ｍａｉｎは、入力ファイルと出力ファイルをオープンして、入力ファイルを解析してデータを抽出し、関数ｃａｌｃ、関数ｃａｌｃ２に渡すメソッドである。
【００６４】
また、関数ｃａｌｃ、関数ｃａｌｃ２が実行されると、バッファｒｅｓｕｌｔに結果が格納され、バッファｒｅｓｕｌｔに格納された結果が関数ｐｒｉｎｔ＿ｒｅｓｕｌｔに渡されて、結果が出力される。このように、リファレンスソースＲＳは、入力ファイルに記述されたデータを読み、実装したアルゴリズムで処理を行い、処理結果を出力ファイルに書き出す。
【００６５】
ここで、図１１および図１２を用いて、リファレンスソースＲＳの処理対象となる入力ファイルおよび出力ファイルについて説明する。
【００６６】
図１１は、入力ファイルの具体例を示す説明図である。図１１において、入力ファイル１１００は、リファレンスソースＲＳの処理対象となるデータが記述されたものである。入力ファイル１１００において、要素数が１個の行は「処理すべきデータ数」を表し、要素数が３個の行は「データ」を表す。また、データは、演算種別、数値０、数値１を表す。
【００６７】
リファレンスソースＲＳでは、処理すべきデータ数が示されている単位（例えば、符号１１０１）を一塊として処理する。具体的には、リファレンスソースＲＳでは、２次元配列ｄａｔａにデータを格納し、ｔｉｍｅｓにデータ数を格納する。その後、ｔｉｍｅｓ、ｄａｔａ、ｒｅｓｕｌｔ(計算結果格納用)を、関数ｃａｌｃ、関数ｃａｌｃ２に渡して計算を行い、その結果を関数ｐｒｉｎｔ＿ｒｅｓｕｌｔに渡して出力ファイルを出力する。
【００６８】
関数ｃａｌｃは、演算種別に依存した計算を行う。具体的には、関数ｃａｌｃは、演算種別が０の場合は数値０と数値１の和を計算し、演算種別が１の場合は数値０と数値１の積を計算し、その結果を配列ｒｅｓｕｌｔの所定場所に書き込む。また、関数ｃａｌｃ２は、関数ｃａｌｃの後続の処理である。具体的には、関数ｃａｌｃ２は、ｒｅｓｕｌｔの値を１ビット左シフトして、その結果をｒｅｓｕｌｔに書き戻す。
【００６９】
図１２は、出力ファイルの具体例を示す説明図である。図１２において、出力ファイル１２００は、リファレンスソースＲＳに実装されたアルゴリズムで入力ファイル１１００（図１１参照）に記述されたデータが順次処理された処理結果を示す出力データである。
【００７０】
（先行アクセス記述の記述例）
つぎに、リファレンスソースＲＳに挿入される先行アクセス記述について説明する。先行アクセス記述は、アーキテクチャモデルＡＭよりもリファレンスソースＲＳのほうが先行して動作するように制御するためのものであり、上述した先行度変数を用いた制御に相当する。
【００７１】
図１３は、先行アクセス記述の挿入例を示す説明図である。図１３において、リファレンスソースＲＳに挿入された先行アクセス記述１３００が示されている。先行アクセス記述１３００は、アーキテクチャモデルＡＭに対してリファレンスソースＲＳがいくらでも先行してもよいとした記述例である。すなわち、１つでも、リファレンスソースＲＳがアーキテクチャモデルＡＭよりも先行していればよいとする記述例である。
【００７２】
リファレンスソースＲＳに先行アクセス記述１３００を挿入する場合、例えば、ユーザは、名前がバッティングしないようにするためにｎａｍｅｓｐａｃｅを利用して、図１０Ａおよび図１０Ｂに示したリファレンスソースＲＳの記述例をネームスペースの内部にコピーする。つぎに、ユーザは、リファレンスソースＲＳに先行アクセス記述１３００（以下、「セパレータ」と表記する場合がある）を挿入する。
【００７３】
ハードウェア化したいアプリケーションの場合、図１０Ａおよび図１０Ｂに示したリファレンスソースＲＳの記述例のようにループ文で繰り返し実行するようなアルゴリズムの場合が多い。そこで、このループに「切れ目」（セパレータ）を入れる。セパレータ（先行アクセス記述１３００）は、セパレータまでの処理が完了していれば、アーキテクチャモデルＡＭ側のシミュレーションが破綻しないことを保証するものである。ｐｉｐｅ＿ｔは、リファレンスソースＲＳとアーキテクチャモデルＡＭとを繋ぐ部品である。
【００７４】
（リファレンスソースＲＳとアーキテクチャモデルＡＭとの接続部分の記述例）
図１４Ａおよび図１４Ｂは、リファレンスソースＲＳとアーキテクチャモデルＡＭとの接続部分の記述例を示す説明図である。図１４Ａおよび図１４Ｂにおいて、記述例１４００は、リファレンスソースＲＳ向けのクラス関数と、アーキテクチャモデルＡＭ向けのクラス関数とを含む。具体的には、ｐｉｐｅ＿ｔクラスは、リファレンスソースＲＳ部分とアーキテクチャモデルＡＭ部分の通信部分をまとめたものである。
【００７５】
また、クラス変数ｍ＿ｓｅｐａｒａｔｏｒが、リファレンスソースＲＳ部分からアーキテクチャモデルＡＭ部分にセパレータへの到達を通知するためのバッファである。メンバー変数のうち静的なメンバー変数を、静的メンバ変数、または、クラス変数という。ここでは、ＳＴＬ（Ｓｔａｎｄａｒｄ  Ｔｅｍｐｌａｔｅ  Ｌｏｇｉｃ）のｄｅｑｕｅを用いて実装している。さらに、ｍ＿ｓｅｐａｒａｔｏｒ＿ｉｄで発行済みＩＤの最大値を保存する。
【００７６】
また、このクラスの中でクラス関数ｓｅｐａｒａｔｏｒ（）が定義されている。これが、図１３に示したリファレンスソースＲＳの中で呼ばれる関数（先行アクセス記述１３００）である。この関数も、記述例１４００の中で定義されている。最初の１回は読み飛ばして、２回目以降は現在のｍ＿ｓｅｐａｒａｔｏｒ＿ｉｄをｍ＿ｓｅｐａｒａｔｏｒにプッシュし、ｍ＿ｓｅｐａｒａｔｏｒ＿ｉｄをインクリメントする。
【００７７】
さらに、ａｄｄ＿ｅｎｄ＿ｍａｒｋｅｒ（）の中で、後述する任意のバッファの最後に−１を追加する。−１は「終わり」を示す。最後に、リファレンスソースＲＳがセパレータに到達することを待っているソースを起こすために、ｐｔｈｒｅａｄ＿ｃｏｎｄ＿ｂｒｏａｄｃａｓｔを行う。
【００７８】
なお、共有メモリＭＭなどのクリティカルセクションの変数は、記述例１４００のクラス変数が該当する。ｐｉｐｅ＿ｔで公開されているｐｕｂｌｉｃな関数は、いずれも排他制御（ｌｏｃｋ（），ｕｎｌｏｃｋ（））で囲われているので、クリティカルセクションの制御ができている。
【００７９】
クラス変数の中のｍ＿ｓｅｐａｒａｔｏｒは、セパレータをリファレンスソースＲＳからアーキテクチャモデルＡＭに伝達するために利用される共有メモリである。また、ｍ＿ｂｕｆｆｅｒは、ＩＤごとのｄｅｑｕｅを用意しており、ｄｅｑｕｅにはリファレンスソースＲＳで計算されたパラメータ値が格納される。
【００８０】
図１５は、アーキテクチャモデルＡＭの具体例を示す説明図（その２）である。図１５において、アーキテクチャモデルＡＭは、制御部ＣＴと、ブロックＢ１と、ブロックＢ２と、を含む構成である。なお、図１５では、アーキテクチャモデルＡＭの一部を抜粋して示す（例えば、図３に示したＲＡＭ３０５やデータ転送部３０６に相当する部分は省略する。）。
【００８１】
ここでは、ブロックＢ１により関数ｃａｌｃの処理を実現し、ブロックＢ２により関数ｃａｌｃ２の処理を実現する場合を想定する。この場合、ブロックＢ１およびブロックＢ２の計算処理で用いるパラメータ値をアーキテクチャモデルＡＭに渡せるようにするため、ユーザはリファレンスソースＲＳにプローバ関数を挿入する。
【００８２】
図１６は、プローバ関数の挿入例を示す説明図である。図１６において、リファレンスソースＲＳに挿入されたプローバ関数１６０１〜１６０３が示されている。なお、図１６では、リファレンスソースＲＳの一部を抜粋して示す。
【００８３】
ここで、プローバ関数１６０１〜１６０３は、ブロックＢｉの計算処理に用いられるパラメータ値をブロックＢｉに対応するＦＩＦＯバッファに書き込むための関数である。図１６に示すリファレンスソースＲＳでは、リファレンスソースＲＳからアーキテクチャモデルＡＭへのデータ転送に複数の転送経路が用意されており、各々にＩＤ番号が振られている。図１６の例では、ブロックＢ１用にＩＤ＝０が割り振られ、ブロックＢ２用にＩＤ＝１が割り振られている。また、ここでは計算サイクル数を渡す例を示している。
【００８４】
ユーザは、ソースを主観的に解析して、おおむねのサイクル数を見積もる。図１６の例では、加算に１０サイクル、掛け算に１００サイクル、シフト演算に５０サイクルかかるとしている。また、各々の計算が終わった後で、ｐｉｐｅ＿ｔ：：ｓｅｎｄ＿ｐａｒａｍを呼ぶことになっている。なお、ここでは、第１引数がＩＤ番号であり、第２引数がサイクル数である。このようにして、パラメータ値をリファレンスソースＲＳから送出することができる。
【００８５】
（アーキテクチャモデルＡＭの記述例）
つぎに、図１５に示したアーキテクチャモデルＡＭの記述例について説明する。アーキテクチャモデルＡＭは、例えば、図１７Ａ、図１７Ｂ、図１７Ｃおよび図１７Ｄに示す記述例１７００と、図１８に示す記述例１８００とを含む。
【００８６】
図１７Ａ、図１７Ｂ、図１７Ｃおよび図１７Ｄは、部品の記述例を示す説明図である。図１７Ａ、図１７Ｂ、図１７Ｃおよび図１７Ｄにおいて、記述例１７００は、図１５に示したアーキテクチャモデルＡＭに含まれる部品の記述例である。記述例１７００中のＭＯＤＵＬＥ（ＣＯＮＴ）は、制御部ＣＴに対応する記述である。この記述は、ループで回っていて、ｐｉｐｅ＿ｔ：：ｗａｉｔ＿ｓｅｐａｒａｔｏｒ（）で、リファレンスソースＲＳ側の状態をチェックする。
【００８７】
リファレンスソースＲＳ側の状態がＯＫの場合は、つぎに実施するアーキテクチャシミュレーションに必要なパラメータ値がｐｉｐｅ＿ｔ内部のメモリに格納されていることを示しており、アーキテクチャシミュレーションを実施しても破綻しないことを示す。なお、リファレンスソースＲＳ側の状態は、例えば、ｍ＿ｓｅｐａｒａｔｏｒに値が記憶されていればＯＫとなり、ｍ＿ｓｅｐａｒａｔｏｒに値が記憶されていなければＮＧとなる。
【００８８】
ｐｉｐｅ＿ｔ：：ｗａｉｔ＿ｓｅｐａｒａｔｏｒ（）では、リファレンスソースＲＳ側の状態が、ＯＫであれば処理を進め、ＮＧであれば、ＯＫになるまで、リファレンスソースＲＳ側の処理が進むのを待つ。その後、ブロックＢ１を起動してブロックＢ２からの完了を待つ記述がなされている。
【００８９】
記述例１７００中のＭＯＤＵＬＥ（Ａ）は、ブロックＢ１に対応する記述である。この記述では、制御部ＣＴから送られてきたスタート（起動命令）をもとに実行を開始し、リファレンスソースＲＳから送られてきたパラメータ値をすべて利用しきると、つぎの起動命令を待つ（ｒｕｎ（））。
【００９０】
ｒｕｎ（）からｌｏｏｐ関数が呼ばれているが、主処理はｌｏｏｐ（）の中に定義されている。ｌｏｏｐは、リファレンスソースＲＳから送られてきたパラメータ値に対応した処理を行う。最初にｐｉｐｅ＿ｔ：：ｇｅｔ＿ｐａｒａｍ（０）でＩＤ＝０のデータを１個取り出す。ここで、取り出したデータが正であれば、処理すべき値のため処理する。
【００９１】
ここでは、１サイクル１０［ｎｓ］とする。このため、ブロックＢ１の処理時間は、取り出した値ｄａｔａ＊１０［ｎｓ］となる。この処理時間を、ｗａｉｔ文を使って実現する。この処理が終わったらブロックＢ２とのハンドシェイクをチェックする。ブロックＢ２が、つぎの処理に入れる状態、すなわち、ｒｅｑ＝ｔｒｕｅかをチェックする。このようにして、もらったパラメータ値に即した計算時間を表現する。
【００９２】
記述例１７００中のＭＯＤＵＬＥ（Ｂ）は、ブロックＢ２に対応する記述である。この記述では、ブロックＢ２は、ブロックＢ１からＴＲＩＧＧＥＲかＦＩＮＩＳＨが送られるまで待つ。ブロックＢ２は、ＴＲＩＧＧＥＲかＦＩＮＩＳＨが送られてくると、ｒｅｑを下げて、自分がタスク処理を始めたことをブロックＢ１に通知する。
【００９３】
その後、ブロックＢ１と同様にｐｉｐｅ＿ｔ：：ｇｅｔ＿ｐａｒａｍ（１）でデータを取り出す。取り出したデータが正であれば、有効なパラメータなので、それに該当する処理をする。ここでは、データはサイクル数のため、ブロックＢ１と同様に、ブロックＢ２はｄａｔａ＊１０［ｎｓ］待つ処理をする。
【００９４】
ブロックＢ２は、この処理が終わると、ｒｅｑをｔｒｕｅ、すなわち、つぎの仕事ができることを通知して、最初に戻って、つぎのａｃｋを待つ。一方、データが負の場合、リファレンスソースＲＳ上の処理の終端を表すため、ブロックＢ２は一連の処理が終了したことを検出して、制御部ＣＴに終了を通知する。
【００９５】
図１８は、部品間の結線関係の記述例を示す説明図である。図１８において、記述例１８００は、図１５に示したアーキテクチャモデルＡＭに含まれる部品間の結線関係を表す記述例である。記述例１８００によれば、ＭＯＤＵＬＥ（ＣＯＮＴ）、ＭＯＤＵＬＥ（Ａ）およびＭＯＤＵＬＥ（Ｂ）を用いて、図１５に示したアーキテクチャモデルＡＭを実現することができる。また、記述例１８００において、符号１８０１の部分は、図１８に示すｎａｍｅｓｐａｃｅの関数を呼び出す記述である。
【００９６】
図１９は、リファレンスソースＲＳを起動するための記述例を示す説明図である。図１９において、ｖｏｉｄ  ｒｕｎ（）は、スレッドを走らせるための処理である。また、ｒｕｎ＿ｂａｓｅ（）は、スレッドとなる関数である。ａｒｇｃ，ａｒｇｖは、ｓｃ＿ｍａｉｎ（）の引数でもらったａｒｇｃ，ａｒｇｖをｒｅｆ：：ｍａｉｎに渡すための変数である。このようにして、アーキテクチャモデルＡＭから、リファレンスソースＲＳを実行するスレッドを起動することができる。
【００９７】
（リファレンスソースＲＳ・アーキテクチャモデルＡＭ間のソフトウェア構造）
図２０は、リファレンスソースＲＳ・アーキテクチャモデルＡＭ間のソフトウェア構造を示す説明図である。図２０において、リファレンスソースＲＳは、セパレータＳＰと、プローバＰＢ１と、プローバＰＢ２と、を含む。共有メモリＭＭは、セパレータ用ＦＩＦＯ（ｍ＿ｓｅｐａｒａｔｏｒ）と、パラメータ用ＦＩＦＯｓ（ｍ＿ｂｕｆｆｅｒ）と、を含む。パラメータ用ＦＩＦＯｓ（ｍ＿ｂｕｆｆｅｒ）には、第０ＦＩＦＯと、第１ＦＩＦＯと、が含まれている。アーキテクチャモデルＡＭは、制御部ＣＴと、ブロックＢ１と、ブロックＢ２とを含む。
【００９８】
ここで、セパレータＳＰは、関数ｃａｌｃ，関数ｃａｌｃ２の実行が完了した場合に、ｍ＿ｓｅｐａｒａｔｏｒ＿ｉｄをｍ＿ｓｅｐａｒａｔｏｒに書き込んで、ｍ＿ｓｅｐａｒａｔｏｒ＿ｉｄをインクリメントする。プローバＰＢ１は、関数ｃａｌｃが実行された場合に、ブロックＢ１の計算処理に用いられるパラメータ値を第０ＦＩＦＯに書き込む。
【００９９】
具体的には、関数ｃａｌｃの処理内容が「加算」の場合は、第０ＦＩＦＯに計算サイクル数「１０」が書き込まれる。関数ｃａｌｃの処理内容が「積」の場合は、第０ＦＩＦＯに計算サイクル数「１００」が書き込まれる。プローバＰＢ２は、関数ｃａｌｃ２が実行された場合に、ブロックＢ２の計算処理に用いられるパラメータ値（計算サイクル数「５０」）を第１ＦＩＦＯに書き込む。
【０１００】
制御部ＣＴは、ｍ＿ｓｅｐａｒａｔｏｒから値（ｍ＿ｓｅｐａｒａｔｏｒ＿ｉｄ）を読み出した場合に、ブロックＢ１に起動命令を出力する。ブロックＢ１は、制御部ＣＴからの起動命令を受け付けた場合、第０ＦＩＦＯからパラメータ値を読み出して、そのパラメータ値に基づく計算処理を行う。
【０１０１】
また、ブロックＢ１は、計算処理の実行が完了した場合、ブロックＢ２に起動命令（例えば、ＴＲＩＧＧＥＲ）を出力する。ブロックＢ２は、ブロックＢ１から起動命令を受け付けた場合、第１ＦＩＦＯからパラメータ値を読み出して、そのパラメータ値に基づく計算処理を行う。そして、ブロックＢ２は、計算処理の実行が完了した場合、制御部ＣＴに完了通知を出力する。
【０１０２】
（シミュレーション結果ＳＲの具体例）
図２１は、シミュレーション結果ＳＲの具体例を示す説明図である。図２１において、シミュレーション結果ＳＲは、リファレンスソースＲＳとアーキテクチャモデルＡＭとに基づいて、リファレンスソースＲＳのアルゴリズムに依存したブロックの振る舞いを模擬したシミュレーション結果である。具体的には、シミュレーション結果ＳＲは、図１５に示したアーキテクチャモデルＡＭ内の制御部ＣＴ、ブロックＢ１およびブロックＢ２の各々のモジュールのｉｓ＿ｒｕｎを出力した結果である。
【０１０３】
（シミュレーション装置１００のシミュレーション処理手順）
つぎに、シミュレーション装置１００のシミュレーション処理手順について説明する。
【０１０４】
図２２は、シミュレーション装置１００のシミュレーション処理手順の一例を示すフローチャートである。図２２のフローチャートにおいて、シミュレーション装置１００は、リファレンスソースＲＳおよびアーキテクチャモデルＡＭの入力を受け付けたか否かを判断する（ステップＳ２２０１）。
【０１０５】
ここで、シミュレーション装置１００は、リファレンスソースＲＳおよびアーキテクチャモデルＡＭの入力を受け付けるのを待つ（ステップＳ２２０１：Ｎｏ）。そして、シミュレーション装置１００は、リファレンスソースＲＳおよびアーキテクチャモデルＡＭの入力を受け付けた場合（ステップＳ２２０１：Ｙｅｓ）、リファレンスソースＲＳに先行アクセス記述を挿入する（ステップＳ２２０２）。
【０１０６】
つぎに、シミュレーション装置１００は、リファレンスソースＲＳにプローバ関数を挿入する（ステップＳ２２０３）。そして、シミュレーション装置１００は、リファレンスソースＲＳをスレッド実行するためのスレッド記述を生成する（ステップＳ２２０４）。つぎに、シミュレーション装置１００は、アーキテクチャモデルＡＭをスレッド実行するためのスレッド記述を生成する（ステップＳ２２０５）。
【０１０７】
そして、シミュレーション装置１００は、メイン記述を生成する（ステップＳ２２０６）。つぎに、シミュレーション装置１００は、リファレンスソースＲＳのスレッド記述とアーキテクチャモデルＡＭのスレッド記述とメイン記述とをコンパイルして実行形式を生成する（ステップＳ２２０７）。
【０１０８】
そして、シミュレーション装置１００は、シミュレーションを実行し（ステップＳ２２０８）、シミュレーション結果ＳＲを出力して（ステップＳ２２０９）、本フローチャートによる一連の処理を終了する。
【０１０９】
このように、リファレンスソースＲＳとアーキテクチャモデルＡＭとの関連付けを行うことにより、評価対象となるシステムの性能評価シミュレーションを行うことができる。この際、ユーザはリファレンスソースＲＳに先行アクセス記述やプローバ関数を挿入すればよく、リファレンスソースＲＳを解析してモジュール分割し、各々がハードウェアモデルとして動作するように書き直してシミュレーションする手法に比べて作業工数を削減することができる。
【０１１０】
また、各ブロックＢｉに対して処理内容に応じたパラメータ値を与えることができるため、各ブロックＢｉのブロック記述にパラメータ値を埋め込んだりする必要がない。この結果、各ブロックＢｉのブロック記述にパラメータ値を埋め込む手法と同程度の精度を維持しつつシミュレーションにかかる作業工数を削減することができる。
【０１１１】
なお、上述した説明では、アーキテクチャモデルＡＭの入力を受け付ける場合を例に挙げて説明したが、キーボード８１０やマウス８１１を用いたユーザの操作入力により、アーキテクチャモデルＡＭを作成することにしてもよい。
【０１１２】
また、上述した説明では、先行アクセス記述およびプローバ関数が未挿入のリファレンスソースＲＳの入力を受け付ける場合を例に挙げて説明したが、先行アクセス記述およびプローバ関数が挿入済みのリファレンスソースＲＳ（例えば、図１６参照）の入力を受け付けることにしてもよい。
【０１１３】
（リファレンスソースＲＳの処理手順）
つぎに、図２２に示したステップＳ２２０８のシミュレーションにおいて実行されるリファレンスソースＲＳの処理手順について説明する。ここでは、入力ファイル（例えば、入力ファイル１１００）に記述されているデータ列から選択されたデータごとに実行されるリファレンスソースＲＳの処理手順について説明する。
【０１１４】
図２３は、リファレンスソースＲＳの処理手順の一例を示すフローチャートである。図２３のフローチャートにおいて、シミュレーション装置１００は、入力ファイルに記述されているデータ列から選択されたデータから特定される演算種別が０か否かを判断する（ステップＳ２３０１）。
【０１１５】
ここで、演算種別が０の場合（ステップＳ２３０１：Ｙｅｓ）、シミュレーション装置１００は、入力ファイルに記述されているデータ列から選択されたデータから特定される数値０と数値１の和を計算する（ステップＳ２３０２）。そして、シミュレーション装置１００は、「ＩＤ＝０」のＦＩＦＯバッファに計算サイクル数「１０」を送出する（ステップＳ２３０３）。
【０１１６】
一方、演算種別が０ではない場合（ステップＳ２３０１：Ｎｏ）、シミュレーション装置１００は、入力ファイルに記述されているデータ列から選択されたデータから特定される数値０と数値１の積を計算する（ステップＳ２３０４）。そして、シミュレーション装置１００は、「ＩＤ＝０」のＦＩＦＯバッファに計算サイクル数「１００」を送出する（ステップＳ２３０５）。
【０１１７】
つぎに、シミュレーション装置１００は、計算結果をシフト演算して（ステップＳ２３０６）、「ＩＤ＝１」のＦＩＦＯバッファに計算サイクル数「５０」を送出する（ステップＳ２３０７）。そして、シミュレーション装置１００は、ｍ＿ｓｅｐａｒａｔｏｒ＿ｉｄをｍ＿ｓｅｐａｒａｔｏｒに送出し（ステップＳ２３０８）、ｍ＿ｓｅｐａｒａｔｏｒ＿ｉｄをインクリメントして（ステップＳ２３０９）、本フローチャートによる一連の処理を終了する。
【０１１８】
これにより、入力ファイルに記述されているデータ列から選択されたデータに基づく条件分岐により処理内容が変わる処理を含む一連の処理を実行することができる。また、一連の処理に含まれる処理の処理内容に応じて設定されているパラメータ値を、該処理を実現するブロックＢｉのＦＩＦＯバッファに送出することができる。
【０１１９】
（アーキテクチャモデルＡＭ内の制御部ＣＴの処理手順）
つぎに、図２２に示したステップＳ２２０８のシミュレーションにおいて実行されるアーキテクチャモデルＡＭ内の制御部ＣＴの処理手順について説明する。ここでは、ループ処理される一連の処理（関数ｃａｌｃ、関数ｃａｌｃ２）の一回分の実行に対応する制御部ＣＴの処理手順について説明する。
【０１２０】
図２４は、制御部ＣＴの処理手順の一例を示すフローチャートである。図２４において、制御部ＣＴは、ｍ＿ｓｅｐａｒａｔｏｒに値があるか否かを判断する（ステップＳ２４０１）。ここで、ｍ＿ｓｅｐａｒａｔｏｒに値がない場合（ステップＳ２４０１：Ｎｏ）、制御部ＣＴは、ｍ＿ｓｅｐａｒａｔｏｒに値が書き込まれるのを待つ。
【０１２１】
一方、ｍ＿ｓｅｐａｒａｔｏｒに値がある場合（ステップＳ２４０１：Ｙｅｓ）、制御部ＣＴは、ブロックＢ１に起動命令を出力する（ステップＳ２４０２）。つぎに、制御部ＣＴは、ブロックＢ２から完了通知を受け付けたか否かを判断する（ステップＳ２４０３）。
【０１２２】
ここで、制御部ＣＴは、ブロックＢ２から完了通知を受け付けるのを待って（ステップＳ２４０３：Ｎｏ）、ブロックＢ２から完了通知を受け付けた場合（ステップＳ２４０３：Ｙｅｓ）、本フローチャートによる一連の処理を終了する。これにより、リファレンスソースＲＳよりもアーキテクチャモデルＡＭのほうが先行して動作することを防いで、シミュレーションが破綻するのを回避することができる。
【０１２３】
（アーキテクチャモデルＡＭ内のブロックＢｉの処理手順）
つぎに、図２２に示したステップＳ２２０８のシミュレーションにおいて実行されるアーキテクチャモデルＡＭ内のブロックＢｉの処理手順について説明する。ここでは、ループ処理されるｃａｌｃ，ｃａｌｃ２の一回分の処理に対応するブロックＢｉ（ブロックＢ１、ブロックＢ２）の処理手順について説明する。
【０１２４】
図２５は、ブロックＢｉの処理手順の一例を示すフローチャートである。図２５において、ブロックＢｉは、ブロックＢｉに対応するＦＩＦＯバッファからパラメータ値を読み出す（ステップＳ２５０１）。そして、ブロックＢｉは、読み出したパラメータ値を用いて計算処理を行って（ステップＳ２５０２）、本フローチャートによる一連の処理を終了する。これにより、リファレンスソースＲＳの実行により決定されるパラメータ値を用いて計算処理を行うことができる。
【０１２５】
以上説明したように、実施の形態にかかるシミュレーション装置１００によれば、リファレンスソースＲＳに基づいて、入力ファイルから順次選ばれるデータに基づく条件分岐により処理内容が変わる処理（例えば、関数ｃａｌｃ）を含む一連の処理（例えば、関数ｃａｌｃ、関数ｃａｌｃ２）のループ処理を実行することができる。また、シミュレーション装置１００によれば、一連の処理に含まれる各処理の実行が完了する度に、該処理の処理内容に応じて設定されたパラメータ値を、該処理を実現するブロックＢｉのＦＩＦＯバッファ（例えば、第０ＦＩＦＯと、第１ＦＩＦＯ）に書き込むことができる。
【０１２６】
また、シミュレーション装置１００によれば、一連の処理の実行が完了した場合に、アーキテクチャモデルＡＭ内の制御部ＣＴにより、一連の処理のうちの最初に実行される処理を実現するブロックＢｉを起動させることができる。また、シミュレーション装置１００によれば、ブロックＢｉにより、ブロックＢｉ用に設けられたＦＩＦＯバッファからパラメータ値を読み出させて計算処理を実行させることができる。
【０１２７】
これにより、リファレンスソースＲＳの実行により決定されるパラメータ値を用いてブロックＢｉに計算処理を行わせることができ、リファレンスソースＲＳのアルゴリズムに依存したブロックＢｉの振る舞いを再現することができる。
【０１２８】
また、シミュレーション装置１００によれば、一連の処理の実行が完了する度に、一連の処理の実行が完了したことを示す先行度変数（例えば、ｍ＿ｓｅｐａｒａｔｏｒ＿ｉｄ）を制御部ＣＴがアクセスするＦＩＦＯバッファ（例えば、ｍ＿ｓｅｐａｒａｔｏｒ）に書き込むことができる。また、シミュレーション装置１００によれば、制御部ＣＴにより、ＦＩＦＯバッファ（例えば、ｍ＿ｓｅｐａｒａｔｏｒ）に記憶されている先行度変数に基づいて、一連の処理の実行が完了したか否かを判定し、一連の処理の実行が完了したと判定した場合に、ブロックＢｉを起動させることができる。
【０１２９】
これにより、リファレンスソースＲＳよりもアーキテクチャモデルＡＭのほうが先行して動作することを防いで、シミュレーションが破綻するのを回避することができる。
【０１３０】
また、シミュレーション装置１００によれば、制御部ＣＴがアクセスするＦＩＦＯ構造のバッファに所定数Ｎ以上の先行度変数が記憶されている場合に、当該バッファに記憶されている先行度変数が所定数Ｎ未満となるまでループ処理の実行を停止することができる。これにより、アーテクチャモデルＡＭに対するリファレンスソースＲＳの先行量が上限Ｎ以上となった時にＦＩＦＯ構造のバッファに先行度変数が蓄積されていくのを防いで、バッファのメモリ量を制限することができる。
【０１３１】
このように、実施の形態にかかるシミュレーションプログラム、シミュレーション方法およびシミュレーション装置によれば、リファレンスソースＲＳのアルゴリズムに応じたアーキテクチャモデルＡＭの振る舞いを再現してアーキテクチャシミュレーションを行うことができる。また、リファレンスソースＲＳを分割してブロックごとに機能が入っているような複雑なモデルを作ることなくシステムの性能の評価が可能になるため、シミュレーションモデルの作成工数を削減してシミュレーション期間を短縮させることができる。
【０１３２】
なお、本実施の形態で説明したシミュレーション方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本シミュレーションプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本シミュレーションプログラムは、インターネット等のネットワークを介して配布してもよい。
【０１３３】
また、本実施の形態で説明したシミュレーション装置１００は、スタンダードセルやストラクチャードＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）などの特定用途向けＩＣ（以下、単に「ＡＳＩＣ」と称す。）やＦＰＧＡなどのＰＬＤ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｄｅｖｉｃｅ）によっても実現することができる。具体的には、例えば、シミュレーション装置１００の機能（取得部９０１〜出力部９０４）をＨＤＬ記述によって機能定義し、そのＨＤＬ記述を論理合成してＡＳＩＣやＰＬＤに与えることにより、シミュレーション装置１００を製造することができる。
【０１３４】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１３５】
（付記１）コンピュータに、
システムの機能をプログラム言語で記述したリファレンスソースを取得し、
前記システムの動作を模擬する複数のブロックと、前記複数のブロックを制御する制御部と、を含むアーキテクチャモデルを取得し、
前記リファレンスソースに基づいて、処理対象となるデータ列から順次選ばれるデータに基づく条件分岐により処理内容が変わる処理を含む一連の処理のループ処理を実行し、
前記一連の処理に含まれる処理の実行が完了する度に、前記処理の処理内容に応じて設定されたパラメータ値を、前記複数のブロックのうちの前記処理を実現するブロックがアクセスするバッファに書き込み、
前記制御部により、前記一連の処理の実行が完了した場合に、前記一連の処理のうちの最初に実行される処理を実現するブロックを起動させ、
前記ブロックにより、前記ブロックがアクセスするバッファからパラメータ値を読み出させることにより、前記パラメータ値に基づく計算処理を実行させる、
処理を実行させることを特徴とするシミュレーションプログラム。
【０１３６】
（付記２）前記コンピュータに、
前記一連の処理の実行が完了する度に、前記一連の処理の実行が完了したことを示す情報を前記制御部がアクセスするバッファに書き込み、
前記制御部により、前記制御部がアクセスするバッファに記憶されている情報に基づいて、前記一連の処理の実行が完了したか否かを判定し、
前記制御部により、前記一連の処理の実行が完了したと判定した場合に、前記ブロックを起動させる、
処理を実行させることを特徴とする付記１に記載のシミュレーションプログラム。
【０１３７】
（付記３）前記制御部がアクセスするバッファは、ＦＩＦＯ（Ｆｉｒｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）構造のバッファであり、
前記コンピュータに、
前記制御部により、前記制御部がアクセスするバッファに前記情報が記憶されている場合に、前記ブロックを起動させる、
処理を実行させることを特徴とする付記２に記載のシミュレーションプログラム。
【０１３８】
（付記４）前記コンピュータに、
前記制御部がアクセスするバッファに所定数以上の前記情報が記憶されている場合、当該バッファに記憶されている前記情報が所定数未満となるまで前記ループ処理の実行を停止する処理を実行させることを特徴とする付記３に記載のシミュレーションプログラム。
【０１３９】
（付記５）コンピュータが、
システムの機能をプログラム言語で記述したリファレンスソースを取得し、
前記システムの動作を模擬する複数のブロックと、前記複数のブロックを制御する制御部と、を含むアーキテクチャモデルを取得し、
前記リファレンスソースに基づいて、処理対象となるデータ列から順次選ばれるデータに基づく条件分岐により処理内容が変わる処理を含む一連の処理のループ処理を実行し、
前記一連の処理に含まれる処理の実行が完了する度に、前記処理の処理内容に応じて設定されたパラメータ値を、前記複数のブロックのうちの前記処理を実現するブロックがアクセスするバッファに書き込み、
前記制御部により、前記一連の処理の実行が完了した場合に、前記一連の処理のうちの最初に実行される処理を実現するブロックを起動させ、
前記ブロックにより、前記ブロックがアクセスするバッファからパラメータ値を読み出させることにより、前記パラメータ値に基づく計算処理を実行させる、
処理を実行することを特徴とするシミュレーション方法。
【０１４０】
（付記６）システムの機能をプログラム言語で記述したリファレンスソース、および前記システムの動作を模擬する複数のブロックと前記複数のブロックを制御する制御部とを含むアーキテクチャモデルを取得する取得部と、
前記リファレンスソースに基づいて、処理対象となるデータ列から順次選ばれるデータに基づく条件分岐により処理内容が変わる処理を含む一連の処理のループ処理を実行し、前記一連の処理に含まれる処理の実行が完了する度に、前記処理の処理内容に応じて設定されたパラメータ値を、前記複数のブロックのうちの前記処理を実現するブロックがアクセスするバッファに書き込む第１の実行部と、
前記制御部により、前記一連の処理の実行が完了した場合に、前記一連の処理のうちの最初に実行される処理を実現するブロックを起動させ、前記ブロックにより、前記ブロックがアクセスするバッファからパラメータ値を読み出させることにより、前記パラメータ値に基づく計算処理を実行させる第２の実行部と、
を有することを特徴とするシミュレーション装置。
【０１４１】
（付記７）コンピュータに、
システムの機能をプログラム言語で記述したリファレンスソースを取得し、
前記システムの動作を模擬する複数のブロックと、前記複数のブロックを制御する制御部と、を含むアーキテクチャモデルを取得し、
前記リファレンスソースに基づいて、処理対象となるデータ列から順次選ばれるデータに基づく条件分岐により処理内容が変わる処理を含む一連の処理のループ処理を実行し、
前記一連の処理に含まれる処理の実行が完了する度に、前記処理の処理内容に応じて設定されたパラメータ値を、前記複数のブロックのうちの前記処理を実現するブロックがアクセスするバッファに書き込み、
前記制御部により、前記一連の処理の実行が完了した場合に、前記一連の処理のうちの最初に実行される処理を実現するブロックを起動させ、
前記ブロックにより、前記ブロックがアクセスするバッファからパラメータ値を読み出させることにより、前記パラメータ値に基づく計算処理を実行させる、
処理を実行させるシミュレーションプログラムを記録したことを特徴とする前記コンピュータに読み取り可能な記録媒体。
【符号の説明】
【０１４２】
１００  シミュレーション装置
９０１  取得部
９０２  第１の実行部
９０３  第２の実行部
９０４  出力部
ＲＳ  リファレンスソース
ＡＭ  アーキテクチャモデル
【図１】
2014142725.tif 000003
【図２】
2014142725.tif 000004
【図３】
2014142725.tif 000005
【図４】
2014142725.tif 000006
【図５】
2014142725.tif 000007
【図６】
2014142725.tif 000008
【図７】
2014142725.tif 000009
【図８】
2014142725.tif 000010
【図９】
2014142725.tif 000011
【図１０Ａ】
2014142725.tif 000012
【図１０Ｂ】
2014142725.tif 000013
【図１１】
2014142725.tif 000014
【図１２】
2014142725.tif 000015
【図１３】
2014142725.tif 000016
【図１４Ａ】
2014142725.tif 000017
【図１４Ｂ】
2014142725.tif 000018
【図１５】
2014142725.tif 000019
【図１６】
2014142725.tif 000020
【図１７Ａ】
2014142725.tif 000021
【図１７Ｂ】
2014142725.tif 000022
【図１７Ｃ】
2014142725.tif 000023
【図１７Ｄ】
2014142725.tif 000024
【図１８】
2014142725.tif 000025
【図１９】
2014142725.tif 000026
【図２０】
2014142725.tif 000027
【図２１】
2014142725.tif 000028
【図２２】
2014142725.tif 000029
【図２３】
2014142725.tif 000030
【図２４】
2014142725.tif 000031
【図２５】
2014142725.tif 000032