(57)【要約】  解析部（１２０）は、階層化されたプログラムコードを既定の分割条件に従って複数のプログラム要素に分割し、複数のプログラム要素の各プログラム要素を解析し、各プログラム要素の属性と、複数のプログラム要素における階層とを抽出する。機能モジュール抽出部（１３０）は、解析部（１２０）により抽出された各プログラム要素の属性と複数のプログラム要素における階層とに基づいて機械学習を行って、複数のプログラム要素を複数のグループにグルーピングする。
2018066074.tif 000002
【特許請求の範囲】
【請求項１】
階層化されたプログラムコードを既定の分割条件に従って複数のプログラム要素に分割し、前記複数のプログラム要素の各プログラム要素を解析し、各プログラム要素の属性と、前記複数のプログラム要素における階層とを抽出する解析部と、
前記解析部により抽出された各プログラム要素の属性と前記複数のプログラム要素における階層とに基づいて機械学習を行って、前記複数のプログラム要素を複数のグループにグルーピングするグルーピング部とを有する情報処理装置。
【請求項２】
前記解析部は、
各プログラム要素の属性として、プログラム要素ごとに、当該プログラム要素で参照される配列の型と、当該配列への当該プログラム要素でのアクセス数と、当該プログラム要素で当該配列が参照される際のアクセスインデックスと当該プログラム要素よりも前に実行されるプログラム要素で当該配列に値が代入される際のアクセスインデックスとの差とを抽出する請求項１に記載の情報処理装置。
【請求項３】
前記解析部は、
各プログラム要素の属性として、プログラム要素ごとに、当該プログラム要素で値が代入される配列の型と、当該配列への当該プログラム要素でのアクセス数と、当該プログラム要素で当該配列に値が代入される際のアクセスインデックスと当該プログラム要素よりも後に実行されるプログラム要素で当該配列が参照される際のアクセスインデックスとの差とを抽出する請求項１に記載の情報処理装置。
【請求項４】
前記解析部は、
各プログラム要素の属性として、各プログラム要素に含まれる演算子の数、分岐の数、ループの数、変数の数及びデータの入出力数の少なくともいずれかを抽出する請求項１に記載の情報処理装置。
【請求項５】
前記解析部は、
各プログラム要素に含まれる演算子の数を抽出する場合に、
積和演算に含まれる積演算子と和演算子とを個別に計数せずに、積和演算子として計数し、
定数乗算に含まれる乗算演算子と変数乗算に含まれる乗算演算子とを区別して計数し、
定数除算に含まれる除算演算子と変数除算に含まれる除算演算子とを区別して計数する請求項４に記載の情報処理装置。
【請求項６】
前記情報処理装置は、更に、
前記グルーピング部によるグルーピング結果に基づき前記プログラムコードを実現するコンピュータアーキテクチャの候補として生成された複数のアーキテクチャ候補のうち２以上のデバイスがバス接続されているアーキテクチャ候補に対して、複数のバスレイヤーの中から制約条件を満たすバスレイヤーを選択するバスレイヤー選択部を有する請求項１に記載の情報処理装置。
【請求項７】
コンピュータが、階層化されたプログラムコードを既定の条件に従って複数のプログラム要素に分割し、前記複数のプログラム要素の各プログラム要素を解析し、各プログラム要素の属性と、前記複数のプログラム要素における階層とを抽出し、
前記コンピュータが、抽出された各プログラム要素の属性と前記複数のプログラム要素における階層とに基づいて機械学習を行って、前記複数のプログラム要素を複数のグループにグルーピングする情報処理方法。
【請求項８】
階層化されたプログラムコードを既定の条件に従って複数のプログラム要素に分割し、前記複数のプログラム要素の各プログラム要素を解析し、各プログラム要素の属性と、前記複数のプログラム要素における階層とを抽出する解析処理と、
前記解析処理により抽出された各プログラム要素の属性と前記複数のプログラム要素における階層とに基づいて機械学習を行って、前記複数のプログラム要素を複数のグループにグルーピングするグルーピング処理とをコンピュータに実行させる情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例えば組込みシステムにおけるアーキテクチャ設計を支援する技術に関する。
【背景技術】
【０００２】
家電製品や事務機器などで広く利用されているシステムは、一般に、ハードウェアとソフトウェアとから構成されている組込みシステムである。組込みシステムは、ＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）（またはＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ））、プロセッサ、メモリ等から構成される。【０００３】
組込みシステムの設計では、組込みシステム全体の処理機能を記述した仕様を、ＡＳＩＣなどによりハードウェア化する部分、プロセッサで実行されるプログラムとしてソフトウェア化する部分に分割する必要がある。これをソフトウェア／ハードウェア機能分割という。
また、分割された複数の機能を、組込みシステム上にどのように実装すれば所望の性能を出せるかということを検討し設計する必要がある。これをアーキテクチャ設計と呼ぶ。【０００４】
従来、組込みシステムのアーキテクチャ設計は機能モデルと非機能要件から、演算量や処理の並列性、回路規模などを考慮し、人手で機能を分割し、ソフトウェアとハードウェアデバイスへの分割を行っていた。しかしながら、アーキテクチャ設計を行った時点では、非機能要件を満たす最適なアーキテクチャとなっているか否かを判断することは困難である。このため、実装工程や実機評価工程において非機能要件を満たさないことが発覚する事態が発生し、工程の大幅な手戻りが懸念される。【０００５】
特許文献１には、ソフトウェア／ハードウェア機能分割を行う技術が開示されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１３−１２５４１９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
アーキテクチャ設計では、通常、組込みシステムの機能モデルが記述されているプログラムコードを複数のプログラム要素に分割する。そして、各プログラム要素の属性から、ソフトウェアまたはハードウェアブロックに割り当てる。現状は、各プログラム要素の属性として、プログラム要素に含まれる演算子の数、分岐の数、ループの数、変数の数、データの入出力数などが抽出される。これら属性に基づいて機械学習等の技術を用いることでソフトウェア、ハードウェアブロックへの割当てを実施することもできる。機械学習を用いる場合、現状では、各プログラム要素の属性として、プログラム要素に含まれる演算子の数、分岐の数、ループの数、変数の数、データの入出力数が抽出されるのみであるため、効果的に機械学習の精度を高めることができないという課題がある。【０００８】
本発明は、このような課題を解決することを主な目的とする。すなわち、本発明は、プログラム要素をより高精細に解析して、機械学習の精度を高めることを主な目的とする。
【課題を解決するための手段】
【０００９】
本発明に係る情報処理装置は、
階層化されたプログラムコードを既定の分割条件に従って複数のプログラム要素に分割し、前記複数のプログラム要素の各プログラム要素を解析し、各プログラム要素の属性と、前記複数のプログラム要素における階層とを抽出する解析部と、
前記解析部により抽出された各プログラム要素の属性と前記複数のプログラム要素における階層とに基づいて機械学習を行って、前記複数のプログラム要素を複数のグループにグルーピングするグルーピング部とを有する。
【発明の効果】
【００１０】
本発明では、プログラム要素の解析により、各プログラム要素の属性と複数のプログラム要素における階層を抽出し、抽出したプログラム要素の属性と複数のプログラム要素における階層とに基づいて機械学習を行う。このため、本発明によれば、機械学習の精度を高めることができる。
【図面の簡単な説明】
【００１１】
【図１】実施の形態１に係るアーキテクチャ生成装置の機能構成例を示す図。
【図２】実施の形態１に係る記憶部で記憶されている情報の例を示す図。
【図３】実施の形態１に係るアーキテクチャ生成装置のハードウェア構成例を示す図。
【図４】実施の形態１に係るアーキテクチャ生成装置の動作例を示すフローチャート図。
【図５】実施の形態１に係るアーキテクチャ生成装置の動作例を示すフローチャート図。
【図６】実施の形態１に係る機能モデルソースコードの例を示す図。
【図７】実施の形態１に係る非機能要件情報の例を示す図。
【図８】実施の形態１に係る非機能要件ベクトルの例を示す図。
【図９】実施の形態１に係る機能モジュール情報の例を示す図。
【図１０】実施の形態１に係るデータ入出力関係情報の例を示す図。
【図１１】実施の形態１に係るブロック候補の例を示す図。
【図１２】実施の形態１に係るアーキテクチャ候補の例を示す図。
【図１３】実施の形態１に係る既存アーキテクチャを用いた機械学習の手順を示すフローチャート図。
【図１４】実施の形態１に係る機能モデルベクトルの例を示す図。
【図１５】実施の形態１に係る非機能要件ベクトルの例を示す図。
【図１６】実施の形態１に係る機械学習で用いられる既存アーキテクチャの例を示す図。
【図１７】実施の形態１に係る既存アーキテクチャを用いた機械学習で得られるグルーピング結果の例を示す図。
【図１８】実施の形態１に係る既存アーキテクチャを用いた機械学習で得られるグルーピング結果の例を示す図。
【図１９】実施の形態１に係るネスト数情報の例を示す図。
【図２０】実施の形態１に係るネスト構造情報の例を示す図。
【図２１】実施の形態１に係る更新後の非機能要件ベクトルの例を示す図。
【発明を実施するための形態】
【００１２】
実施の形態１．
以下、本発明の実施の形態について、図を用いて説明する。以下の実施の形態の説明及び図面において、同一の符号を付したものは、同一の部分または相当する部分を示す。
【００１３】
＊＊＊構成の説明＊＊＊
図１は、実施の形態１に係るアーキテクチャ生成装置１００の機能構成例を示す。アーキテクチャ生成装置１００は、高位合成装置２００及びソフトウェアコンパイラ３００に接続されている。
アーキテクチャ生成装置１００は、情報処理装置の例である。また、アーキテクチャ生成装置１００で行われる動作は情報処理方法の例である。
図２は、アーキテクチャ生成装置１００内の記憶部１７０で記憶されている情報を示す。
図３は、アーキテクチャ生成装置１００のハードウェア構成例を示す。
【００１４】
先ず、図３を参照して、アーキテクチャ生成装置１００のハードウェア構成例を説明する。
【００１５】
アーキテクチャ生成装置１００は、ハードウェアとして、プロセッサ９０１、補助記憶装置９０２、メモリ９０３、通信装置９０４、入力装置９０５及びディスプレイ９０６を備えるコンピュータである。
補助記憶装置９０２には、図１に示すソースコード取得部１１０、解析部１２０、機能モジュール抽出部１３０、ブロック候補抽出部１４０、アーキテクチャ候補抽出部１５０、性能評価部１６０、既存アーキテクチャ情報取得部１９０及びバスレイヤー選択部１９１の機能を実現するプログラムが記憶されている。
そして、これらプログラムがメモリ９０３にロードされて、プロセッサ９０１がこれらプログラムを実行する。当該プログラムを実行することで、プロセッサ９０１が、後述するソースコード取得部１１０、解析部１２０、機能モジュール抽出部１３０、ブロック候補抽出部１４０、アーキテクチャ候補抽出部１５０、性能評価部１６０、既存アーキテクチャ情報取得部１９０及びバスレイヤー選択部１９１の動作を行う。
図１では、プロセッサ９０１がソースコード取得部１１０、解析部１２０、機能モジュール抽出部１３０、ブロック候補抽出部１４０、アーキテクチャ候補抽出部１５０、性能評価部１６０、既存アーキテクチャ情報取得部１９０及びバスレイヤー選択部１９１の機能を実現するプログラムを実行している状態を模式的に表している。
なお、解析部１２０、機能モジュール抽出部１３０の機能を実現するプログラムは、情報処理プログラムの例である。
また、補助記憶装置９０２は、図１に示す記憶部１７０として機能する。すなわち、補助記憶装置９０２は、図２に示す情報を記憶している。また、メモリ９０３が、図１に示す記憶部１７０として機能してもよい。すなわち、メモリ９０３が、図２に示す情報を記憶するようにしてもよい。
通信装置９０４は、アーキテクチャ生成装置１００が外部装置と通信する際に用いられる。通信装置９０４は、データを受信するレシーバー及びデータを送信するトランスミッターを含む。
入力装置９０５は、アーキテクチャ生成装置１００のユーザが各種情報をアーキテクチャ生成装置１００に入力するために用いられる
ディスプレイ９０６は、アーキテクチャ生成装置１００のユーザに各種情報を提示するために用いられる。
【００１６】
次に、図１を参照して、アーキテクチャ生成装置１００の機能構成例を説明する。
【００１７】
ソースコード取得部１１０は、機能モデルソースコード１７１及び非機能要件情報１７２を入力装置９０５を介してユーザから取得する。
機能モデルソースコード１７１及び非機能要件情報１７２はアーキテクチャ生成装置１００のユーザが生成する。
また、ソースコード取得部１１０は、取得した機能モデルソースコード１７１と非機能要件情報１７２とを、記憶部１７０に格納する。図２は、ソースコード取得部１１０により機能モデルソースコード１７１と非機能要件情報１７２とが格納された状態を示す。
機能モデルソースコード１７１は、アーキテクチャ設計の対象となる組込みシステムの複数の機能が記述されているプログラムコードである。
ソースコード取得部１１０は、例えば図６に示す機能モデルソースコード１７１を取得する。なお、図６に示す機能モデルソースコード１７１の詳細は後述する。
非機能要件情報１７２には、機能モデルソースコード１７１に記述されている機能に要求される要件である非機能要件が記述される。非機能要件情報１７２には、例えば、処理性能に関する要件、回路規模に関する要件及び消費電力に関する要件が記述される。
ソースコード取得部１１０は、例えば図７に示す非機能要件情報１７２を取得する。なお、図７に示す非機能要件情報１７２の詳細は後述する。
【００１８】
解析部１２０は、機能モデルソースコード１７１を関数などの最小構成単位で分割する。分割された最小構成単位を以降、プログラム要素という。プログラム要素は、例えば、機能モデルソースコード１７１内のｆｏｒループブロックで実現される動作である。つまり、１つのｆｏｒループブロックに記述されている内容を１つのプログラム要素として捉えることができる。但し、どのような範囲を１つのプログラム要素と定義するかはアーキテクチャ生成装置１００のユーザに委ねられている。ユーザは、プログラム要素の条件を、予め設定しておく。ユーザは、例えば、１つの関数を１つのプログラム要素として定義してもよい。
解析部１２０は、また、各プログラム要素を解析して、プログラム要素の属性を抽出する。例えば、解析部１２０は、プログラム要素の属性として、演算子の数、分岐の数等を抽出し、抽出結果を示す機能モデルベクトル１７３を生成する。
解析部１２０は、例えば、図１４に示す機能モデルベクトル１７３を生成する。なお、図１４に示す機能モデルベクトル１７３の詳細は後述する。
機能モデルソースコード１７１は階層化されている。つまり、機能モデルソースコード１７１はネスト構造になっている。解析部１２０は、各プログラム要素を解析し、機能モデルソースコード１７１のネスト構造をパラメータ化する。すなわち、解析部１２０は、機能モデルソースコード１７１のネスト構造を解析して、複数のプログラム要素における階層を抽出する。そして、解析部１２０は、ネスト構造の解析結果を示すネスト数情報１８５及びネスト構造情報１８６を生成する。解析部１２０は、例えば、図１９に示すネスト数情報１８５及び図２０に示すネスト構造情報１８６を生成する。図１９に示すネスト数情報１８５及び図２０に示すネスト構造情報１８６の詳細は後述する。
また、解析部１２０は、非機能要件情報１７２を関数などの最小構成単位で分割し、非機能要件ベクトル１７４を生成する。
解析部１２０は、例えば、図８に示す非機能要件ベクトル１７４を生成する。なお、図８に示す非機能要件ベクトル１７４の詳細は後述する。
また、解析部１２０は、生成した機能モデルベクトル１７３とネスト数情報１８５とネスト構造情報１８６と非機能要件ベクトル１７４とを記憶部１７０に格納する。図２は、解析部１２０により機能モデルベクトル１７３とネスト数情報１８５とネスト構造情報１８６と非機能要件ベクトル１７４が記憶部１７０に格納されている状態を示す。
なお、解析部１２０により行われる動作は、解析処理に相当する。
【００１９】
機能モジュール抽出部１３０は、機能モデルベクトル１７３とネスト数情報１８５とネスト構造情報１８６と非機能要件ベクトル１７４と抽出ルール１７５とを記憶部１７０から読み出す。
抽出ルール１７５は、機能モデルソースコード１７１から機能モジュールを抽出するためのルールである。抽出ルール１７５は、機械学習により得られたルールである。
機能モジュールとは、機能モデルソースコード１７１を構成するプログラム要素の集合である。機能モジュールには、機能モデルソースコード１７１で実現される複数のプログラム要素のうちの少なくとも１つのプログラム要素が含まれる。
本実施の形態では、機能モジュール抽出部１３０は、抽出ルール１７５に基づいて、機能モデルベクトル１７３とネスト数情報１８５とネスト構造情報１８６を用いて、機能モデルソースコード１７１のプログラム要素をグルーピングすることで機能モジュールを抽出する。
また、機能モジュール抽出部１３０は、機能モジュールの抽出結果を示す機能モジュール情報１７６を生成する。
例えば、機能モジュール抽出部１３０は、図９に示す機能モジュール情報１７６を生成する。図９に示す機能モジュール情報１７６の詳細は後述する。
また、機能モジュール抽出部１３０は、機能モデルベクトル１７３に基づき、機能モジュール情報１７６に示される機能モジュール間のデータの入出力関係を解析し、解析結果が示されるデータ入出力関係情報１７７を生成する。
例えば、機能モジュール抽出部１３０は、図１０に示すデータ入出力関係情報１７７を生成する。図１０に示すデータ入出力関係情報１７７の詳細は後述する。
機能モジュール抽出部１３０は、グルーピング部に相当する。また、機能モジュール抽出部１３０により行われる動作は、グルーピング処理に相当する。
【００２０】
ブロック候補抽出部１４０は、機能モジュールごとにブロック候補を抽出する。
より具体的には、ブロック候補抽出部１４０は、機能モジュール抽出部１３０により得られた複数の機能モジュールの各々に、ブロックテンプレート１７８に基づき、各機能モジュールを実現するデバイスとして、プロセッサ及びプロセッサ以外のハードウェアデバイスのうちのいずれかを指定する。なお、ブロック候補抽出部１４０が各機能モジュールに割り当てるデバイスをブロック候補という。また、ブロック候補抽出部１４０は、各ブロック候補の性能及び回路規模を見積り、非機能要件情報１７２の非機能要件に合致しないブロック候補を除外する。つまり、ブロック候補抽出部１４０は、機能モジュールごとに、非機能要件に合致するプロセッサ又はハードウェアデバイスをブロック候補として指定する。
そして、ブロック候補抽出部１４０は、機能モジュールごとのブロック候補の抽出結果が示されるブロック候補抽出結果１７９を生成する。
【００２１】
アーキテクチャ候補抽出部１５０は、ブロック候補抽出結果１７９及びデータ入出力関係情報１７７に基づき、アーキテクチャ候補を抽出する。
つまり、アーキテクチャ候補抽出部１５０は、機能モデルソースコード１７１に含まれる複数の機能を実現するコンピュータアーキテクチャの候補、すなわち、組込みシステムのアーキテクチャの候補をアーキテクチャ候補として複数生成する。なお、各アーキテクチャ候補では、ブロック候補の組み合わせが異なる。
そして、ブロック候補抽出部１４０は、抽出したアーキテクチャ候補が示されるアーキテクチャ候補抽出結果１８０を生成する。
【００２２】
バスレイヤー選択部１９１は、アーキテクチャ候補抽出結果１８０に格納されている複数のアーキテクチャ候補のうち２以上のブロック（デバイス）がバス接続されているアーキテクチャ候補に対して、複数のバスレイヤーの中から非機能要件を満たすバスレイヤーを選択する。より具体的には、バスレイヤー選択部１９１は、バスレイヤーテンプレート１８３から、非機能要件を満たすバスレイヤーを選択する。そして、バスレイヤー選択部１９１は、選択したバスレイヤーが示されるバスレイヤー選択結果情報１８４を生成する。
【００２３】
性能評価部１６０は、アーキテクチャ候補抽出結果１８０に示される各アーキテクチャ候補の性能評価を行う。なお、性能評価部１６０は、バスレイヤーについては、バスレイヤー選択結果情報１８４に示されるバスレイヤーを評価する。
性能評価部１６０は、アーキテクチャ候補抽出部１５０により抽出された複数のアーキテクチャ候補の中から、組込みシステムのアーキテクチャに要求される非機能要件を満たすアーキテクチャ候補を選択する。
そして、性能評価部１６０は、選択したアーキテクチャ候補が示されるアーキテクチャ候補選択結果１８１を生成する。
また、性能評価部１６０は、非機能要件を満たすアーキテクチャ候補が存在しない場合は、非機能要件を満たさないが、ブロック候補抽出部１４０が生成した複数のアーキテクチャ候補の中で最も非機能要件に近い属性を持つアーキテクチャ候補を近似アーキテクチャ候補として選択する。
そして、性能評価部１６０は、選択した近似アーキテクチャ候補の属性と非機能要件との差分をブロック候補抽出部１４０に通知する。
【００２４】
既存アーキテクチャ情報取得部１９０は、設計済みのアーキテクチャの情報である既存アーキテクチャ情報１８２を入力装置９０５を介してユーザから取得する。そして、既存アーキテクチャ情報取得部１９０は、既存アーキテクチャ情報１８２を記憶部１７０に格納する。
既存アーキテクチャ情報１８２は、抽出ルール１７５を生成するために使用する。
【００２５】
また、アーキテクチャ生成装置１００は、高位合成装置２００と連携して動作する。
高位合成装置２００は、ＲＴＬ（Ｒｅｇｉｓｔｅｒ  Ｔｒａｎｓｆｅｒ  Ｌｅｖｅｌ）よりも抽象度が高いＣ言語、Ｃ＋＋言語、ＳｙｓｔｅｍＣ言語などの高級言語を用いて、自動的にＲＴＬを生成する。
高位合成装置２００は、具体的には市販されている高位合成ツールにより実現可能である。
【００２６】
アーキテクチャ生成装置１００は、ソフトウェアコンパイラ３００と連携して動作する。
ソフトウェアコンパイラ３００は、Ｃ言語等で書かれたソースコードからターゲットの組込みシステムのプロセッサで実行可能なバイナリファイルを出力する。
ソフトウェアコンパイラ３００は、具体的には市販されているコンパイラにより実現可能である。
【００２７】
＊＊＊動作の説明＊＊＊
次に、図４及び図５を参照して、本実施の形態に係るアーキテクチャ生成装置１００の動作例を説明する。
【００２８】
先ず、ステップＳ１１０において、ソースコード取得部１１０が、機能モデルソースコード１７１と非機能要件情報１７２をユーザから取得する。そして、ソースコード取得部１１０は、取得した機能モデルソースコード１７１と非機能要件情報１７２を記憶部１７０に格納する。
機能モデルソースコード１７１は、組込みシステムの処理機能／システム構成をプログラム言語（Ｃ言語など）で記述したプログラムコードである。
図６は、機能モデルソースコード１７１の例を示す。
機能モデルソースコード１７１は、図６に示すように一般的なプログラムと同一だが、システムの外部入力／出力に対応する変数は／＊ｅｘｔｅｒｎａｌ＿ｉｎｐｕｔ＊／，／＊ｅｘｔｅｒｎａｌ＿ｏｕｔｐｕｔ＊／と指定されている。
なお、図６において、ＥＬＥＭ０〜ＥＬＥＭ６は、それぞれプログラム要素を表す。以下、プログラム要素ＥＬＥＭ０〜ＥＬＥＭ６を区別する必要がない場合は、プログラム要素ＥＬＥＭ０〜ＥＬＥＭ６のそれぞれをプログラム要素ＥＬＥＭｘという。
【００２９】
図７に示されるように、非機能要件情報１７２には、非機能要件として、処理性能制約、回路規模制約及び消費電力制約が記述される。
処理性能制約は、特定の処理から別の特定の処理までが制限時間Ｔｔｈ［ｓ］以内に完了するという制約である。
また、回路規模制約は、回路規模がＡｔｈ［Ｇａｔｅ］以内という制約である。
また、消費電力制約は、機能モデルソースコード１７１により実現される組込みシステムの全体の消費電力がＰｔｈ［Ｗ］以内という制約である。
なお、非機能要件情報１７２には、処理性能制約、回路規模制約及び消費電力制約以外の非機能要件が記述されていてもよい。例えば、非機能要件情報１７２に、外部入出力のインタフェースに関する制約又は外部メモリのハードウェアリソースに関する制約が記述されていてもよい。
【００３０】
図４のステップＳ１２０において、解析部１２０は、機能モデルソースコード１７１から機能モデルベクトル１７３を生成する。
より具体的には、解析部１２０は、機能モデルソースコード１７１を最小分割単位で分割する。本実施の形態では、解析部１２０は、以下の分割条件に基づき、機能モデルソースコード１７１を最小分割単位で分割して複数のプログラム要素を得る。
（１）プログラム要素の単位はベーシックブロック（Ｃ言語の場合は｛  ｝）でくくられた範囲とする（なお、関数は全てインライン展開されるものとする）。
（２）機能モデルソースコード１７１がネスト構造である場合は、ネストの上位／下位をそれぞれのプログラム要素とする。
（３）ベーシックブロック内の演算数が閾値を超える場合は、ベーシックブロックの出力に用いられる変数が参照しているすべての式を１つのプログラム要素として、分割する。
次に、解析部１２０は、機能モデルソースコード１７１に含まれる演算子の数、分岐の数、ループの数、変数の数及びデータの入出力数の少なくともいずれかの数値パラメータをプログラム要素ＥＬＥＭｘごとに解析して、機能モデルベクトル１７３を生成する。
ここでは、解析部１２０は、機能モデルソースコード１７１に含まれる演算子の数、分岐の数、ループの数、中間変数の数及びデータの入出力数をプログラム要素ＥＬＥＭｘごとに解析して、機能モデルベクトル１７３を生成することとする。
解析部１２０は、例えば、以下の手法で、各パラメータを抽出する。
（１）演算子数
解析部１２０は、プログラム要素ごとに、プログラム要素内に含まれる“＋”、“−”、“＊”、“−”、“＜＜”の個数を求める。
なお、解析部１２０は、積和演算に含まれる積演算子と和演算子とを個別に計数せずに、積和演算子として計数する。例えば、解析部１２０は、積和演算“ｙ＝ａ＋ｂ＊ｃ”に対して、“＋”、“＊”を別々に計数せずに、１つの積和演算子として計数する
また、解析部１２０は、定数乗算に含まれる乗算演算子と変数乗算に含まれる乗算演算子とを区別して計数する。例えば、解析部１２０は、定数乗算（例えば、ｙ＝ａ＊３）の乗算演算子と変数乗算（例えば、ｙ＝ａ＊ｂ）の乗算演算子は区別して計数する。
解析部１２０は、同様に、定数除算に含まれる除算演算子と変数除算に含まれる除算演算子とを区別して計数する。
（２）分岐数
解析部１２０は、機能モデルソースコード１７１に含まれるｉｆ／ｅｌｓｅの個数を求める。また、解析部１２０は、機能モデルソースコード１７１にｓｗｉｔｃｈがある場合はｃａｓｅの個数の合計値を求める。
（３）ループ数
解析部１２０は、最外ループのループ数を計数する。なお、ループ数可変の場合は、解析部１２０は、最大値を計数する。
（４）中間変数個数
解析部１２０は、プログラム要素ごとに、当該プログラム要素内に含まれる中間変数の個数を求める。より具体的には、解析部１２０は、他のプログラム要素で使用されておらず、当該プログラム要素で参照された後に値が代入されている変数の個数を求める。
解析部１２０は、例えば、以下のｔｍｐのような変数を計数する。
ｉｎｔ  ｔｍｐ；
ｆｏｒ（ｉｎｔ  ｉ＝０；ｉ＜Ｎ；ｉ＋＋）｛
ｏｕｔ［ｉ］＝ｔｍｐ；
ｔｍｐ＝ｆｕｎｃ（ｉｎ［ｉ］）；
｝
（５）組込みシステム外部からの入力数
解析部１２０は、プログラム要素ごとに、当該プログラム要素内で／＊ｅｘｔｅｒｎａｌ＿ｉｎｐｕｔ＊／で指定された変数が参照される回数の合計値を求める。
（６）組込みシステム外部への出力数
解析部１２０は、プログラム要素ごとに、当該プログラム要素内で／＊ｅｘｔｅｒｎａｌ＿ｏｕｔｐｕｔ＊／で指定された変数に代入される回数の合計値を求める。
（７）他の機能からの入力数
解析部１２０は、プログラム要素ごとに、他のプログラム要素で代入された後に、当該プログラム要素内で参照されている、配列ではない変数の個数を計数する。
解析部１２０は、例えば、以下のｖａｌのような変数を計数する。
／／他のプログラム要素
｛
ｖａｌ＝ｆｕｎｃ１（）；
｝
／／当該プログラム要素
｛
ｆｕｎｃ２（ｖａｌ＋ｂ）；
｝
（８）他の機能への出力数
解析部１２０は、プログラム要素ごとに、当該プログラム要素内で代入された後、他のプログラム要素内で参照されている、配列ではない変数の個数を計数する。すなわち、解析部１２０は、上記（７）の逆のパタンとなる変数の個数を計数する。
（９）配列入力数
解析部１２０は、プログラム要素ごとに、（ａ）当該プログラム要素で参照される配列の型と、（ｂ）当該配列への当該プログラム要素でのアクセス数と、（ｃ）当該プログラム要素で当該配列が参照される際のアクセスインデックスと当該プログラム要素よりも前に実行されるプログラム要素で当該配列に値が代入される際のアクセスインデックスとの差とを抽出する。なお、アクセスインデックスの差が閾値以上にならない場合は、解析部１２０は、アクセスインデックスの差として、既定の最大値を用いる。
解析部１２０は、例えば以下の場合に、（ｂ）アクセス数としてＮを抽出し、（ｃ）アクセスインデックスの差として、（ｉ＋３）−ｉ＝３を抽出する。
／／他のプログラム要素
ｆｏｒ（ｉｎｔ  ｉ＝０；ｉ＜Ｎ；ｉ＋＋）｛
ａｒｒａｙ［ｉ］＝ｉ＊ｉ；
｝
／／当該プログラム要素
ｆｏｒ（ｉｎｔ  ｉ＝０；ｉ＜Ｎ；ｉ＋＋）｛
ｏｕｔ［ｉ］＝ａｒｒａｙ［ｉ＋３］；
｝
（１０）配列出力数
解析部１２０は、プログラム要素ごとに、（ａ）当該プログラム要素で値が代入される配列の型と、（ｂ）当該配列への当該プログラム要素でのアクセス数と、（ｃ）当該プログラム要素で当該配列に値が代入される際のアクセスインデックスと当該プログラム要素よりも後に実行されるプログラム要素で当該配列が参照される際のアクセスインデックスとの差とを抽出する。すなわち、解析部１２０は、上記（９）の逆のパタンとなる変数の個数を計数する。
（１１）ネスト数
機能モデルソースコード１７１が階層化されている場合、すなわち、機能モデルソースコード１７１がネスト構造である場合は、解析部１２０は、各プログラム要素のネストの段数を判定する。ネストの段数を、以下ネスト数という。
図１９は、解析部１２０が抽出した各プログラム要素のネスト数が示されるネスト数情報１８５の例を示す。図１９は、図６の機能モデルソースコード１７１に対して生成されたネスト数情報１８５の例である。最上位のプログラム要素であるＥＬＥＭ０はネスト数０となり、その下位のプログラム要素であるＥＬＥＭ１、ＥＬＥＭ２、ＥＬＥＭ４はネスト数１となる。また、ＥＬＥＭ５、ＥＬＥＭ６は機能モデルソースコード１７１上ではネスト構造になっていないが、ベーシックブロック内の演算数が閾値を超えるとして、ＥＬＥＭ４から分割されている。このため、ＥＬＥＭ５及びＥＬＥＭ６は、ＥＬＥＭ４の下位階層として扱われ、ネスト数は２となる。
（１２）下位プログラム要素
解析部１２０は、プログラム要素ごとに、当該プログラム要素に下位のプログラム要素が存在するか否かを解析する。
図２０は、解析部１２０の解析結果が示されるネスト構造情報１８６の例を示す。図２０のネスト構造情報１８６では、プログラム要素に下位のプログラム要素が存在する場合は、“１”が設定される。但し、図２０のネスト構造情報１８６では、直下のプログラム要素に対してのみ“１”が設定される。例えば、ＥＬＥＭ０は、直下のプログラム要素としてＥＬＥＭ１、ＥＬＥＭ２、ＥＬＥＭ４が存在するため、ＥＬＥＭ０の行において、ＥＬＥＭ１、ＥＬＥＭ２、ＥＬＥＭ４の行に“１”が設定されている。ＥＬＥＭ３、ＥＬＥＭ５、ＥＬＥＭ６はＥＬＥＭ０の直下のプログラム要素ではないため、“０”が設定されている。このようにして、解析部１２０は、機能モデルソースコード１７１でのネスト構造をパラメータ化している。
【００３１】
図１４は、解析部１２０により生成された機能モデルベクトル１７３の例を示す。
図１４の機能モデルベクトル１７３では、作図上の理由から、ＥＬＥＭ０〜ＥＬＥＭ３についてのみ図示しているが、プログラム要素ＥＬＥＭ０〜ＥＬＥＭ６の各々に対して、演算子（加算、減算、定数乗算、変数乗算、定数除算、変数除算、代入、積和）の数、分岐の数、ループの数、中間変数の数及びデータの入出力数が示される。
なお、入力の欄では、列に入力元のプログラム要素が記述され、行に入力先のプログラム要素が記述される。また、出力の欄では、列に出力先のプログラム要素が記述され、行に出力元のプログラム要素が記述される。図１４の例では、外部からプログラム要素ＥＬＥＭ０にデータが渡される。また、プログラム要素ＥＬＥＭ０からプログラム要素ＥＬＥＭ１及びプログラム要素ＥＬＥＭ２にデータが渡される。また、プログラム要素ＥＬＥＭ１及びプログラム要素ＥＬＥＭ２からプログラム要素ＥＬＥＭ３にデータが渡される。
【００３２】
次に、図４のステップＳ１２１において、解析部１２０が、非機能要件情報１７２から非機能要件ベクトル１７４を生成する。
より具体的には、解析部１２０は、非機能要件情報１７２から制約値を抽出し、抽出した制約値を用いて非機能要件ベクトル１７４を生成する。
図７に示す非機能要件情報１７２が与えられた場合は、解析部１２０は、図８に示すような非機能要件ベクトル１７４を生成する。
【００３３】
次に、ステップＳ１３０において、機能モジュール抽出部１３０は、プログラム要素ＥＬＥＭｘをグルーピングし、機能モジュール情報１７６を生成する。
より具体的には、機能モジュール抽出部１３０は、機能モデルベクトル１７３とネスト数情報１８５とネスト構造情報１８６と非機能要件ベクトル１７４に抽出ルール１７５を適用して、機能モデルソースコード１７１に含まれる複数のプログラム要素ＥＬＥＭｘを複数の機能モジュールにグルーピングする。そして、機能モジュール抽出部１３０は、グルーピング結果を示す機能モジュール情報１７６を生成する。
図９に機能モジュール抽出部１３０によって生成される機能モジュール情報１７６の例を示す。
図９の例では、プログラム要素ＥＬＥＭ０、ＥＬＥＭ４、ＥＬＥＭ５及びＥＬＥＭ６は機能モジュール０に分類されている。また、プログラム要素ＥＬＥＭ１は機能モジュール１に分類されている。また、プログラム要素ＥＬＥＭ２及びＥＬＥＭ３は、機能モジュール２に分類されている。
【００３４】
次に、ステップＳ１３１において、機能モジュール抽出部１３０は、機能モジュール間のデータの入出力関係を解析し、解析結果が示されるデータ入出力関係情報１７７を生成する。
より具体的には、機能モデルベクトル１７３に示されるプログラム要素ごとのデータの入力状況及び出力状況を解析して、機能モジュール情報１７６に示される機能モジュール間のデータの入出力関係を解析する。
図１０の（ａ）に、データ入出力関係情報の例を示す。また、図１０（ｂ）は、図１０の（ａ）のデータ入出力関係情報に示される内容を図式化したものである。
【００３５】
次に、ステップＳ１４０において、ブロック候補抽出部１４０が、機能モジュールに対応するブロック候補を抽出する。
より具体的には、ブロック候補抽出部１４０は、機能モジュールごとに、ブロックテンプレート１７８に含まれる複数のブロックのうち、機能モジュールに対応するブロックをブロック候補として抽出する。
ブロックテンプレート１７８には、ソフトウェアを実行するプロセッサ、ＡＳＩＣ、ＦＰＧＡ等の専用ハードウェアデバイスがブロックとして含まれている。
ブロックテンプレート１７８には以下の情報が含まれる。なお、以下において、Ｓ／Ｗはソフトウェアを意味し、Ｈ／Ｗはハードウェアを意味する。
（１）処理タイプ：Ｓ／Ｗ、Ｈ／Ｗ（パイプライン）、Ｈ／Ｗ（並列）、Ｈ／Ｗ（逐次実行）
（２）通信タイプ：バス、直接接続
（３）メモリタイプ：内部メモリ、外部メモリ（揮発）、外部メモリ（不揮発）
上記の（１）処理タイプは、機能モジュールを実現するデバイスを、ソフトウェアを実行するプロセッサとするか、専用Ｈ／Ｗとするかを決定するためのパラメータである。また、（１）処理タイプには、専用Ｈ／Ｗの種類として、例えば、パイプライン処理が行われるＨ／Ｗ、並列処理が行われるＨ／Ｗ、逐次処理が行われるＨ／Ｗが定義される。
ブロック候補抽出部１４０は、データ入出力関係情報１７７に示される機能モジュールごとの入出力関係を解析して、各機能モジュールに対応する全てのブロックをブロック候補として抽出する。
例えば、図１０では、機能モジュール０は、外部（ＡＸＩスレーブ）からデータが入力されるが、ブロック候補抽出部１４０は、機能モジュール０に対して、ＡＸＩスレーブとのインタフェースを有するデバイスを全てをブロック候補として抽出する。
図１１は、機能モジュール０に対してブロック候補抽出部１４０により抽出されたブロック候補の例を示す。
図１１では、ブロック候補０−０、ブロック候補０−１、ブロック候補０−２が抽出されている。
【００３６】
次に、ステップＳ１４１において、ブロック候補抽出部１４０は、ステップＳ１４０で抽出した複数のブロック候補から、非機能要件情報１７２に示される非機能要件を満たすブロック候補を選択する。そして、ブロック候補抽出部１４０は、選択したブロック候補が示されるブロック候補抽出結果１７９を生成する。
より具体的には、ブロック候補抽出部１４０は、ステップＳ１４０で抽出した複数のブロック候補のうち、処理タイプがＨ／Ｗであるブロック候補は、高位合成装置２００によって高位合成を行う。ブロック候補抽出部１４０は、高位合成装置２００の高位合成により処理性能や回路規模などのブロック候補の性能を得る。そして、ブロック候補抽出部１４０は、高位合成により得られた性能が非機能要件情報１７２の非機能要件を満たすか否かをブロック候補ごとに判定する。ブロック候補抽出部１４０は、性能が非機能要件を満たすブロック候補を選択し、選択したブロック候補が示されるブロック候補抽出結果１７９を生成する。
また、ブロック候補抽出部１４０は、ステップＳ１４０で抽出した複数のブロック候補のうち、処理タイプがＳ／Ｗであるブロック候補は、ソフトウェアコンパイラ３００によって高位合成を行う。ブロック候補抽出部１４０は、ソフトウェアコンパイラ３００の高位合成により、命令実行数とクロック数を得る。そして、ブロック候補抽出部１４０は、実行命令数×クロック数から処理性能を算出する。ブロック候補抽出部１４０は、算出した処理性能の非機能要件を満たすか否かをブロック候補ごとに判定する。ブロック候補抽出部１４０は、性能が非機能要件を満たすブロック候補を選択し、選択したブロック候補が示されるブロック候補抽出結果１７９を生成する。
【００３７】
次に、ステップＳ１５０において、アーキテクチャ候補抽出部１５０が、ステップＳ１４１で選択されたブロック候補を接続してアーキテクチャ候補を抽出する。
より具体的には、アーキテクチャ候補抽出部１５０は、データ入出力関係情報１７７に示される入出力関係に従って、ブロック候補抽出結果１７９に示されるブロック候補を接続する。この際、アーキテクチャ候補抽出部１５０は、各ブロック候補の通信タイプに矛盾がないようにブロック候補を接続する。アーキテクチャ候補抽出部１５０は、例えば、通信タイプがバスタイプのブロック候補はバスに接続する。
図１２にアーキテクチャ候補の例を示す。
図１２の例では、機能モジュール０に対して、ブロック候補０−０、ブロック候補０−１、ブロック候補０−２が選択されている。また、機能モジュール１に対して、ブロック候補１−０、ブロック候補１−１、ブロック候補１−２が選択されている。また、機能モジュール２に対して、ブロック候補２−０、ブロック候補２−１、ブロック候補２−２が選択されている。また、機能モジュール３に対して、ブロック候補３−０、ブロック候補３−１、ブロック候補３−２が選択されている。なお、図１２では、作図上の理由から、「ブロック候補」は単に「ブロック」と表記している。
また、図１２では、作図上の理由から、アーキテクチャ候補は２つしか図示していないが、アーキテクチャ候補抽出部１５０は、通信タイプに矛盾が生じないブロック候補の組み合わせの全てに対応するアーキテクチャ候補を抽出する。
このように、アーキテクチャ候補抽出部１５０は、それぞれのブロック候補の組み合わせが異なる複数のアーキテクチャ候補を抽出する。
【００３８】
次に、図５のステップＳ１５１において、アーキテクチャ候補抽出部１５０は、ステップＳ１５０で抽出されたアーキテクチャ候補から、非機能要件を満たさないアーキテクチャ候補を除外する。
より具体的には、アーキテクチャ候補抽出部１５０は、図７に示すように、非機能要件情報１７２に処理性能制約Ｔｔｈ、回路規模制約Ａｔｈ、消費電力制約Ｐｔｈが含まれている場合は、以下の条件に該当するアーキテクチャ候補を除外する。
（１）Ｔｔｈに関係するブロックのレイテンシ総和＞Ｔｔｈ
（２）ブロックの回路規模の総和＞Ａｔｈ
（３）ブロックの消費電力の総和＞Ｐｔｈ
そして、アーキテクチャ候補抽出部１５０は、ステップＳ１５０の後も残されているアーキテクチャ候補が示されるアーキテクチャ候補抽出結果１８０を生成する。
【００３９】
次に、ステップＳ１９１において、バスレイヤー選択部１９１が、バスレイヤーを選択する。
より具体的には、アーキテクチャ候補抽出結果１８０に、２以上のブロック（デバイス）がバス接続されているアーキテクチャ候補が含まれている場合に、当該アーキテクチャ候補に対して、非機能要件情報１７２の処理性能制約Ｔｔｈを満たし、回路規模の最も小さくなるバスレイヤーをバスレイヤーテンプレート１８３から選択する。そして、バスレイヤー選択部１９１は、選択したバスレイヤーが示されるバスレイヤー選択結果情報１８４を生成する。
バスレイヤーテンプレート１８３には、クロスバー、リングバス等のバス接続パタン情報と対応するバス規格が格納されている。
バスレイヤー選択部１９１によるバスレイヤー選択手法の一例を示す。
２以上のブロックを接続するバスがＡＸＩバスの場合は、バスレイヤー選択部１９１は、初期値として最も高速となるように全マスタ−スレーブ間をクロスバーで接続する。次に、バスレイヤー選択部１９１は、この接続にて、ソフトウェア／ハードウェア協調シミュレーションにより、非機能要件情報１７２の処理性能制約Ｔｔｈの対象となっているアーキテクチャ候補中の箇所の処理時間を測定する。測定した処理時間が処理性能制約Ｔｔｈを満たしている場合は、アーキテクチャ候補中で最もデータ転送の少ないパスを共有バスに変更し、再度ソフトウェア／ハードウェア協調シミュレーションにより処理時間を計測する。以上の手順を繰り返し、処理性能制約Ｔｔｈを満たし、最も回路規模の小さいバスレイヤーを探索する。
【００４０】
次に、ステップＳ１６０において、性能評価部１６０が、各アーキテクチャ候補の性能を評価する。
より具体的には、性能評価部１６０は、アーキテクチャ候補抽出結果１８０の各アーキテクチャ候補においてソフトウェア／ハードウェア協調シミュレーションを実行して、各アーキテクチャ候補の性能（例えば、処理性能及び回路規模）を得る。なお、このとき、バス接続は、ステップＳ１９１で生成されたバスレイヤー選択結果情報１８４に示されるバスレイヤー（ステップＳ１９１で選択されたバスレイヤー）が用いられる。
【００４１】
そして、ステップＳ１６１において、性能評価部１６０は、ソフトウェア／ハードウェア協調シミュレーションにより得られた性能が非機能要件情報１７２の非機能要件を満たすか否かをアーキテクチャ候補ごとに判定する。
【００４２】
非機能要件を満たす性能をもつアーキテクチャ候補がある場合（ステップＳ１６１でＹＥＳ）は、性能評価部１６０は、ステップＳ１６２において、非機能要件を満たす性能をもつアーキテクチャ候補をアーキテクチャ候補抽出結果１８０から選択する。そして、性能評価部１６０は、選択したアーキテクチャ候補が示されるアーキテクチャ候補選択結果１８１を生成する。
【００４３】
次に、ステップＳ１６３において、性能評価部１６０は、ステップＳ１６２で生成したアーキテクチャ候補選択結果１８１を例えばディスプレイ９０６に出力する。
そして、アーキテクチャ生成装置１００は、処理を終了する。
【００４４】
一方、非機能要件を満たす性能をもつアーキテクチャ候補が存在しない場合（ステップＳ１６１でＮＯ）は、性能評価部１６０は、ステップＳ１６４において、性能と非機能要件との差が最小のアーキテクチャ候補である近似アーキテクチャ候補を選択する。
より具体的には、性能評価部１６０は、ステップＳ１６０で得られた性能と非機能要件情報１７２の制約値との差の絶対値をアーキテクチャ候補ごとに算出し、算出した絶対値の合計値が最小となるアーキテクチャ候補を近似アーキテクチャ候補として選択する。
ここでは、非機能要件として処理性能制約Ｔｔｈと回路規模制約Ａｔｈが与えられている場合を想定する。また、アーキテクチャ候補抽出結果１８０に記述されているアーキテクチャ候補がＮ個（Ｎ≧２）あり、アーキテクチャ候補ｘ（ｘは１からＮ）の処理性能を処理性能Ｔｘとし、アーキテクチャ候補ｘの回路規模を回路規模Ａｘとする。性能評価部１６０は、｜Ｔｔｈ−Ｔｘ｜＋｜Ａｔｈ−Ａｘ｜の値が最小となるアーキテクチャ候補ｘを近似アーキテクチャ候補として選択する。
【００４５】
次に、ステップＳ１６５において、性能評価部１６０は、ステップＳ１６４で選択した近似アーキテクチャ候補の性能と制約値との差分を機能モジュール抽出部１３０に通知する。
つまり、性能評価部１６０は、ステップＳ１６４で選択したアーキテクチャ候補ｘの前述の｜Ｔｔｈ−Ｔｘ｜と｜Ａｔｈ−Ａｘ｜とを機能モジュール抽出部１３０に通知する。
【００４６】
次に、機能モジュール抽出部１３０がステップＳ１３０において、ステップＳ１６５で性能評価部１６０から通知された差分（例えば、｜Ｔｔｈ−Ｔｘ｜と｜Ａｔｈ−Ａｘ｜）に基づき非機能要件ベクトル１７４を更新する。
図２１は、更新された非機能要件ベクトル１７４の例を示す。
そして、機能モジュール抽出部１３０は、更新後の非機能要件フィードバック情報を用いて、例えば、教師つき学習のアルゴリズムまたは回帰分析のアルゴリズムに基づく機械学習を行い、抽出ルール１７５を変更する。そして、機能モジュール抽出部１３０は、変更後の抽出ルール１７５を用いて機能モデルソースコード１７１に含まれるプログラム要素ＥＬＥＭ０〜ＥＬＥＭ６をグルーピングして新たな機能モジュールを得る。
以降は、新たな機能モジュールに対してステップＳ１３１以降の処理が行われる。
【００４７】
ここで、図１３を参照して、機能モジュール抽出部１３０が機械学習によって抽出ルール１７５を生成する手順を説明する。
なお、以下では、機能モジュール抽出部１３０が、設計済みの既存アーキテクチャが示される既存アーキテクチャ情報１８２を用いて機械学習（Ｄｅｅｐ  Ｌｅａｒｎｉｎｇ等）を行って抽出ルール１７５を生成する手順を示す。
なお、既存アーキテクチャは、例えば設計者が手作業により設計したアーキテクチャである。
ここでは、図１６に示すアーキテクチャを既存アーキテクチャとする。
また、既存アーキテクチャが設計されている組込みシステムを既存組込みシステムという。
図１６に示すように、既存組込みシステムには、プログラム要素ＥＬＥＭ０−ＥＬＥＭ３が含まれているものとする。
図１６の既存アーキテクチャでは、プログラム要素ＥＬＥＭ０が機能モジュール０に分類されている。また、プログラム要素ＥＬＥＭ１が機能モジュール１に分類されている。また、プログラム要素ＥＬＥＭ２とプログラム要素ＥＬＥＭ３とが機能モジュール２に分類されている。また、機能モジュール０がプロセッサにより実現され、機能モジュール１が専用ハードウェア１で実現され、機能モジュール２が専用ハードウェア２により実現される。また、プロセッサ、専用ハードウェア１、専用ハードウェア２はそれぞれＡＸＩバスに接続している。
以下では、プログラム要素ＥＬＥＭ０−ＥＬＥＭ３を区別する必要がない場合は、プログラム要素ＥＬＥＭ０−ＥＬＥＭ３のそれぞれをプログラム要素ＥＬＥＭｘという。
【００４８】
図１３のステップＳ１１１において、ソースコード取得部１１０が機能モデルソースコード１７１と非機能要件情報１７２を取得する。ステップＳ１１１で取得する機能モデルソースコード１７１と非機能要件情報１７２は、既存組込みシステムの機能モデルソースコード１７１と非機能要件情報１７２である。
なお、ステップＳ１１１における取得手順は図４のステップＳ１１０で説明したものと同じであるため、ステップＳ１１１における取得手順についての説明は省略する。
【００４９】
次に、ステップＳ１９０において、既存アーキテクチャ情報取得部１９０が既存組込みシステムの既存アーキテクチャ情報１８２を取得し、記憶部１７０に既存アーキテクチャ情報１８２を格納する。
既存アーキテクチャ情報１８２には、図１６に示すように、以下の情報が含まれる。
（１）既存組込みシステムの機能モデルソースコード１７１に含まれるプログラム要素のグルーピング結果を示す情報（機能モジュール情報１７６に相当する情報）
（２）既存アーキテクチャにおけるブロック構成とブロック間の接続に関する情報（アーキテクチャ候補抽出結果１８０に相当する情報）
【００５０】
次に、ステップＳ１２２において、解析部１２０が、ステップＳ１１１で取得された既存組込みシステムの機能モデルソースコード１７１から機能モデルベクトル１７３を生成する。
なお、ステップＳ１２２における機能モデルベクトル１７３の生成手順は、図４のステップＳ１２０で説明したものと同じであるため、説明を省略する。
【００５１】
次に、ステップＳ１２３において、解析部１２０は、ステップＳ１１１で取得された既存組込みシステムの非機能要件情報１７２から非機能要件ベクトル１７４を生成する。
なお、ステップＳ１２３における非機能要件ベクトル１７４の生成手順は、図４のステップＳ１２１で説明したものと同じであるため、説明を省略する。
なお、図１５は、ステップＳ１２３で生成された非機能要件ベクトル１７４の例を示す。図１５において、Ｔｔｈ０、Ｔｔｈ１、Ｔｔｈ２は図１６に示す既存アーキテクチャとプロセッサ（ＥＬＥＭ０）、専用ハードウェア１（ＥＬＥＭ１）、専用ハードウェア２（ＥＬＥＭ２、ＥＬＥＭ３）のそれぞれの処理性能制約値を示す。また、Ａｔｈ０、Ａｔｈ１、Ａｔｈ２は図１６に示す既存アーキテクチャとプロセッサ（ＥＬＥＭ０）、専用ハードウェア１（ＥＬＥＭ１）、専用ハードウェア２（ＥＬＥＭ２、ＥＬＥＭ３）のそれぞれの回路規模制約値を示す。ＥＬＥＭ２、ＥＬＥＭ３は１つの機能モジュール（機能モジュール２）分類されるため制約値Ｔｔｈ２、Ａｔｈ２をそれぞれＥＬＥＭ２、ＥＬＥＭ３で分ける（この例では２で割る）。
【００５２】
次に、ステップＳ１３２において、機能モジュール抽出部１３０が、抽出ルール１７５に基づき、既存組込みシステムのプログラム要素ＥＬＥＭｘをグルーピングし、機能モジュール情報１７６を生成する。なお、ステップＳ１３２における機能モジュール情報１７６の生成手順は、図４のステップＳ１３０で説明したものと同じであるため、説明を省略する。
【００５３】
次に、Ｓ１３３において、機能モジュール抽出部１３０は、ステップＳ１３２で得られたグルーピング結果と既存アーキテクチャ情報１８２に含まれるグルーピング結果とが等しいか否かを判定する。
そして、グルーピング結果が等しい場合（ステップＳ１３３でＹＥＳ）は、機能モジュール抽出部１３０は処理を終了する。
例えば、ステップＳ１３２において図１８に示すグルーピング結果が得られている場合は、図１６に示すグルーピング結果と等しいため、機能モジュール抽出部１３０は処理を終了する。
【００５４】
一方、グルーピング結果が一致しない場合（ステップＳ１３３でＮＯ）は、ステップＳ１３４において、機能モジュール抽出部１３０は、既存アーキテクチャ情報１８２に格納された既存アーキテクチャのグルーピング結果（ベクトル）を正解とし、ステップＳ１３２で生成した機能モジュール情報１７６のグルーピング結果（ベクトル）との誤差を計算する。
例えば、図１７に示すグルーピング結果が得られている場合は、図１６に示すグルーピング結果と等しくないため、機能モジュール抽出部１３０は、誤差を計算する。
そして、機能モジュール抽出部１３０は、一般的な教師つき学習のアルゴリズムまたは回帰分析のアルゴリズムに基づき、計算した誤差を用いて、抽出ルール１７５を更新する。
【００５５】
ステップＳ１３４の後、機能モジュール抽出部１３０は、ステップＳ１３２において、更新後の抽出ルール１７５を用いてプログラム要素ＥＬＥＭｘをグルーピングして、新たな機能モジュール情報１７６を生成する。以降は、グルーピング結果が一致するまでステップＳ１３３、ステップＳ１３４及びステップＳ１３２が繰り返される。
【００５６】
例えば、ステップＳ１３２で生成した機能モジュール情報１７６のグルーピング結果が図１７に示すものであれば、機能モジュール抽出部１３０は、機械学習により、図１８に示すグルーピング結果が得られるように抽出ルール１７５を変更する。
機能モジュール抽出部１３０は、このように、機能モデルベクトル１７３に記述されるパラメータから読み取れる関係性を解析する。そして、機能モジュール抽出部１３０は、解析結果から、抽出ルール１７５により得られるグルーピング結果と正解のグルーピング結果との誤差が小さくなるように機械学習パラメータを制御する。このようにすることで、機能モジュール抽出部１３０は、設計者が手作業により生成するアーキテクチャと同じアーキテクチャを獲得可能な抽出ルール１７５を生成することができる。
【００５７】
また、機能モジュール抽出部１３０が複数の既存アーキテクチャを学習することで、抽出ルール１７５は汎化され、既存アーキテクチャのない機能モデルと非機能要件を与えた際にも適切なグルーピングが可能になる。
【００５８】
＊＊＊実施の形態の効果の説明＊＊＊
以上、本実施の形態では、機能モジュールの解析により、各機能モジュールの属性と複数の機能モジュールにおける階層を抽出し、抽出した機能モジュールの属性と複数の機能モジュールにおける階層とに基づいて機械学習を行う。このため、本実施の形態によれば、機械学習の精度を高めることができる。
【００５９】
なお、本発明は、本実施の形態に限定されるものではなく、必要に応じて種々の変更が可能である。
例えば、アーキテクチャ生成装置１００の機能構成は図１と異なる機能構成であっても構わない。
また、アーキテクチャ生成装置１００の動作手順は図４及び図５に示したものと異なっていてもよい。
【００６０】
＊＊＊ハードウェア構成の説明＊＊＊
最後に、アーキテクチャ生成装置１００のハードウェア構成の補足説明を行う。
図３に示すプロセッサ９０１は、プロセッシングを行うＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）である。
プロセッサ９０１は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）等である。
補助記憶装置９０２は、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、フラッシュメモリ、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）等である。
メモリ９０３は、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。
通信装置９０４は、例えば、通信チップ又はＮＩＣ（Ｎｅｔｗｏｒｋ  Ｉｎｔｅｒｆａｃｅ  Ｃａｒｄ）である。
【００６１】
また、補助記憶装置９０２には、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）も記憶されている。
そして、ＯＳの少なくとも一部がメモリ９０３にロードされ、プロセッサ９０１により実行される。
プロセッサ９０１はＯＳの少なくとも一部を実行しながら、ソースコード取得部１１０、解析部１２０、機能モジュール抽出部１３０、ブロック候補抽出部１４０、アーキテクチャ候補抽出部１５０、性能評価部１６０、既存アーキテクチャ情報取得部１９０及びバスレイヤー選択部１９１の機能を実現するプログラムを実行する。
プロセッサ９０１がＯＳを実行することで、タスク管理、メモリ管理、ファイル管理、通信制御等が行われる。
また、ソースコード取得部１１０、解析部１２０、機能モジュール抽出部１３０、ブロック候補抽出部１４０、アーキテクチャ候補抽出部１５０、性能評価部１６０、既存アーキテクチャ情報取得部１９０及びバスレイヤー選択部１９１の処理の結果を示す情報やデータや信号値や変数値が、補助記憶装置９０２、メモリ９０３、プロセッサ９０１内のレジスタ及びキャッシュメモリの少なくともいずれかに記憶される。
また、ソースコード取得部１１０、解析部１２０、機能モジュール抽出部１３０、ブロック候補抽出部１４０、アーキテクチャ候補抽出部１５０、性能評価部１６０、既存アーキテクチャ情報取得部１９０及びバスレイヤー選択部１９１の機能を実現するプログラムは、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ブルーレイ（登録商標）ディスク、ＤＶＤ等の可搬記憶媒体に記憶されてもよい。
【００６２】
また、ソースコード取得部１１０、解析部１２０、機能モジュール抽出部１３０、ブロック候補抽出部１４０、アーキテクチャ候補抽出部１５０、性能評価部１６０、既存アーキテクチャ情報取得部１９０及びバスレイヤー選択部１９１の「部」を、「回路」又は「工程」又は「手順」又は「処理」に読み替えてもよい。
また、アーキテクチャ生成装置１００は、ロジックＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）、ＧＡ（Ｇａｔｅ  Ａｒｒａｙ）、ＡＳＩＣ、ＦＰＧＡといった電子回路により実現されてもよい。
この場合は、ソースコード取得部１１０、解析部１２０、機能モジュール抽出部１３０、ブロック候補抽出部１４０、アーキテクチャ候補抽出部１５０、性能評価部１６０、既存アーキテクチャ情報取得部１９０及びバスレイヤー選択部１９１は、それぞれ電子回路の一部として実現される。
なお、プロセッサ及び上記の電子回路を総称してプロセッシングサーキットリーともいう。
【符号の説明】
【００６３】
１００  アーキテクチャ生成装置、１１０  ソースコード取得部、１２０  解析部、１３０  機能モジュール抽出部、１４０  ブロック候補抽出部、１５０  アーキテクチャ候補抽出部、１６０  性能評価部、１７０  記憶部、１７１  機能モデルソースコード、１７２  非機能要件情報、１７３  機能モデルベクトル、１７４  非機能要件ベクトル、１７５  抽出ルール、１７６  機能モジュール情報、１７７  データ入出力関係情報、１７８  ブロックテンプレート、１７９  ブロック候補抽出結果、１８０  アーキテクチャ候補抽出結果、１８１  アーキテクチャ候補選択結果、１８２  既存アーキテクチャ情報、１８３  バスレイヤーテンプレート、１８４  バスレイヤー選択結果情報、１８５  ネスト数情報、１８６  ネスト構造情報、１９０  既存アーキテクチャ情報取得部、１９１  バスレイヤー選択部、２００  高位合成装置、３００  ソフトウェアコンパイラ、９０１  プロセッサ、９０２  補助記憶装置、９０３  メモリ、９０４  通信装置、９０５  入力装置、９０６  ディスプレイ。
【図１】
2018066074.tif 000003
【図２】
2018066074.tif 000004
【図３】
2018066074.tif 000005
【図４】
2018066074.tif 000006
【図５】
2018066074.tif 000007
【図６】
2018066074.tif 000008
【図７】
2018066074.tif 000009
【図８】
2018066074.tif 000010
【図９】
2018066074.tif 000011
【図１０】
2018066074.tif 000012
【図１１】
2018066074.tif 000013
【図１２】
2018066074.tif 000014
【図１３】
2018066074.tif 000015
【図１４】
2018066074.tif 000016
【図１５】
2018066074.tif 000017
【図１６】
2018066074.tif 000018
【図１７】
2018066074.tif 000019
【図１８】
2018066074.tif 000020
【図１９】
2018066074.tif 000021
【図２０】
2018066074.tif 000022
【図２１】
2018066074.tif 000023
【手続補正書】
【提出日】平成29年3月27日(2017.3.27)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
階層化されたプログラムコードを既定の分割条件に従って二以上のプログラム要素に分割し、前記二以上のプログラム要素のいずれかのプログラム要素内の演算数が閾値を超える場合に、当該プログラム要素を更に二以上のプログラム要素に再分割し、分割及び再分割により得られた複数のプログラム要素の各プログラム要素を解析し、各プログラム要素の属性と、前記複数のプログラム要素における階層とを抽出する解析部と、
前記解析部により抽出された各プログラム要素の属性と前記複数のプログラム要素における階層とに基づいて機械学習を行って、前記複数のプログラム要素を複数のグループにグルーピングするグルーピング部とを有する情報処理装置。
【請求項２】
前記解析部は、
各プログラム要素の属性として、プログラム要素ごとに、当該プログラム要素で参照される配列の型と、当該配列への当該プログラム要素でのアクセス数と、当該プログラム要素で当該配列が参照される際のアクセスインデックスと当該プログラム要素よりも前に実行されるプログラム要素で当該配列に値が代入される際のアクセスインデックスとの差とを抽出する請求項１に記載の情報処理装置。
【請求項３】
前記解析部は、
各プログラム要素の属性として、プログラム要素ごとに、当該プログラム要素で値が代入される配列の型と、当該配列への当該プログラム要素でのアクセス数と、当該プログラム要素で当該配列に値が代入される際のアクセスインデックスと当該プログラム要素よりも後に実行されるプログラム要素で当該配列が参照される際のアクセスインデックスとの差とを抽出する請求項１に記載の情報処理装置。
【請求項４】
前記解析部は、
各プログラム要素の属性として、各プログラム要素に含まれる演算子の数、分岐の数、ループの数、変数の数及びデータの入出力数の少なくともいずれかを抽出する請求項１に記載の情報処理装置。
【請求項５】
前記解析部は、
各プログラム要素に含まれる演算子の数を抽出する場合に、
積和演算に含まれる積演算子と和演算子とを個別に計数せずに、積和演算子として計数し、
定数乗算に含まれる乗算演算子と変数乗算に含まれる乗算演算子とを区別して計数し、
定数除算に含まれる除算演算子と変数除算に含まれる除算演算子とを区別して計数する請求項４に記載の情報処理装置。
【請求項６】
前記情報処理装置は、更に、
前記グルーピング部によるグルーピング結果に基づき前記プログラムコードを実現するコンピュータアーキテクチャの候補として生成された複数のアーキテクチャ候補のうち２以上のデバイスがバス接続されているアーキテクチャ候補に対して、複数のバスレイヤーの中から制約条件を満たすバスレイヤーを選択するバスレイヤー選択部を有する請求項１に記載の情報処理装置。
【請求項７】
コンピュータが、階層化されたプログラムコードを既定の分割条件に従って二以上のプログラム要素に分割し、前記二以上のプログラム要素のいずれかのプログラム要素内の演算数が閾値を超える場合に、当該プログラム要素を更に二以上のプログラム要素に再分割し、分割及び再分割により得られた複数のプログラム要素の各プログラム要素を解析し、各プログラム要素の属性と、前記複数のプログラム要素における階層とを抽出し、
前記コンピュータが、抽出された各プログラム要素の属性と前記複数のプログラム要素における階層とに基づいて機械学習を行って、前記複数のプログラム要素を複数のグループにグルーピングする情報処理方法。
【請求項８】
階層化されたプログラムコードを既定の分割条件に従って二以上のプログラム要素に分割し、前記二以上のプログラム要素のいずれかのプログラム要素内の演算数が閾値を超える場合に、当該プログラム要素を更に二以上のプログラム要素に再分割し、分割及び再分割により得られた複数のプログラム要素の各プログラム要素を解析し、各プログラム要素の属性と、前記複数のプログラム要素における階層とを抽出する解析処理と、
前記解析処理により抽出された各プログラム要素の属性と前記複数のプログラム要素における階層とに基づいて機械学習を行って、前記複数のプログラム要素を複数のグループにグルーピングするグルーピング処理とをコンピュータに実行させる情報処理プログラム。
【手続補正書】
【提出日】平成29年6月8日(2017.6.8)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
階層化されたプログラムコードを既定の分割条件に従って二以上のプログラム要素に分割し、前記二以上のプログラム要素のいずれかのプログラム要素内の演算数が閾値を超える場合に、当該プログラム要素の出力に用いられる変数のうち共通する変数を用いているすべての式を１つのプログラム要素として、当該プログラム要素を更に二以上のプログラム要素に再分割し、分割及び再分割により得られた複数のプログラム要素の各プログラム要素を解析し、各プログラム要素の属性と、前記複数のプログラム要素における階層とを抽出する解析部と、
前記解析部により抽出された各プログラム要素の属性と前記複数のプログラム要素における階層とに基づいて機械学習を行って、前記複数のプログラム要素を複数のグループにグルーピングするグルーピング部とを有する情報処理装置。
【請求項２】
前記解析部は、
各プログラム要素の属性として、プログラム要素ごとに、当該プログラム要素で参照される配列の型と、当該配列への当該プログラム要素でのアクセス数と、当該プログラム要素で当該配列が参照される際のアクセスインデックスと当該プログラム要素よりも前に実行されるプログラム要素で当該配列に値が代入される際のアクセスインデックスとの差とを抽出する請求項１に記載の情報処理装置。
【請求項３】
前記解析部は、
各プログラム要素の属性として、プログラム要素ごとに、当該プログラム要素で値が代入される配列の型と、当該配列への当該プログラム要素でのアクセス数と、当該プログラム要素で当該配列に値が代入される際のアクセスインデックスと当該プログラム要素よりも後に実行されるプログラム要素で当該配列が参照される際のアクセスインデックスとの差とを抽出する請求項１に記載の情報処理装置。
【請求項４】
前記解析部は、
各プログラム要素の属性として、各プログラム要素に含まれる演算子の数、分岐の数、ループの数、変数の数及びデータの入出力数の少なくともいずれかを抽出する請求項１に記載の情報処理装置。
【請求項５】
前記解析部は、
各プログラム要素に含まれる演算子の数を抽出する場合に、
積和演算に含まれる積演算子と和演算子とを個別に計数せずに、積和演算子として計数し、
定数乗算に含まれる乗算演算子と変数乗算に含まれる乗算演算子とを区別して計数し、
定数除算に含まれる除算演算子と変数除算に含まれる除算演算子とを区別して計数する請求項４に記載の情報処理装置。
【請求項６】
前記情報処理装置は、更に、
前記グルーピング部によるグルーピング結果に基づき前記プログラムコードを実現するコンピュータアーキテクチャの候補として生成された複数のアーキテクチャ候補のうち２以上のデバイスがバス接続されているアーキテクチャ候補に対して、複数のバスレイヤーの中から制約条件を満たすバスレイヤーを選択するバスレイヤー選択部を有する請求項１に記載の情報処理装置。
【請求項７】
コンピュータが、階層化されたプログラムコードを既定の分割条件に従って二以上のプログラム要素に分割し、前記二以上のプログラム要素のいずれかのプログラム要素内の演算数が閾値を超える場合に、当該プログラム要素の出力に用いられる変数のうち共通する変数を用いているすべての式を１つのプログラム要素として、当該プログラム要素を更に二以上のプログラム要素に再分割し、分割及び再分割により得られた複数のプログラム要素の各プログラム要素を解析し、各プログラム要素の属性と、前記複数のプログラム要素における階層とを抽出し、
前記コンピュータが、抽出された各プログラム要素の属性と前記複数のプログラム要素における階層とに基づいて機械学習を行って、前記複数のプログラム要素を複数のグループにグルーピングする情報処理方法。
【請求項８】
階層化されたプログラムコードを既定の分割条件に従って二以上のプログラム要素に分割し、前記二以上のプログラム要素のいずれかのプログラム要素内の演算数が閾値を超える場合に、当該プログラム要素の出力に用いられる変数のうち共通する変数を用いているすべての式を１つのプログラム要素として、当該プログラム要素を更に二以上のプログラム要素に再分割し、分割及び再分割により得られた複数のプログラム要素の各プログラム要素を解析し、各プログラム要素の属性と、前記複数のプログラム要素における階層とを抽出する解析処理と、
前記解析処理により抽出された各プログラム要素の属性と前記複数のプログラム要素における階層とに基づいて機械学習を行って、前記複数のプログラム要素を複数のグループにグルーピングするグルーピング処理とをコンピュータに実行させる情報処理プログラム。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】００３０
【補正方法】変更
【補正の内容】
【００３０】
図４のステップＳ１２０において、解析部１２０は、機能モデルソースコード１７１から機能モデルベクトル１７３を生成する。
より具体的には、解析部１２０は、機能モデルソースコード１７１を最小分割単位で分割する。本実施の形態では、解析部１２０は、以下の分割条件に基づき、機能モデルソースコード１７１を最小分割単位で分割して複数のプログラム要素を得る。
（１）プログラム要素の単位はベーシックブロック（Ｃ言語の場合は｛  ｝）でくくられた範囲とする（なお、関数は全てインライン展開されるものとする）。
（２）機能モデルソースコード１７１がネスト構造である場合は、ネストの上位／下位をそれぞれのプログラム要素とする。
（３）ベーシックブロック内の演算数が閾値を超える場合は、ベーシックブロックの出力に用いられる変数のうち共通する変数を用いているすべての式を１つのプログラム要素として、分割する。
次に、解析部１２０は、機能モデルソースコード１７１に含まれる演算子の数、分岐の数、ループの数、変数の数及びデータの入出力数の少なくともいずれかの数値パラメータをプログラム要素ＥＬＥＭｘごとに解析して、機能モデルベクトル１７３を生成する。
ここでは、解析部１２０は、機能モデルソースコード１７１に含まれる演算子の数、分岐の数、ループの数、中間変数の数及びデータの入出力数をプログラム要素ＥＬＥＭｘごとに解析して、機能モデルベクトル１７３を生成することとする。
解析部１２０は、例えば、以下の手法で、各パラメータを抽出する。
（１）演算子数
解析部１２０は、プログラム要素ごとに、プログラム要素内に含まれる“＋”、“−”、“＊”、“−”、“＜＜”の個数を求める。
なお、解析部１２０は、積和演算に含まれる積演算子と和演算子とを個別に計数せずに、積和演算子として計数する。例えば、解析部１２０は、積和演算“ｙ＝ａ＋ｂ＊ｃ”に対して、“＋”、“＊”を別々に計数せずに、１つの積和演算子として計数する
また、解析部１２０は、定数乗算に含まれる乗算演算子と変数乗算に含まれる乗算演算子とを区別して計数する。例えば、解析部１２０は、定数乗算（例えば、ｙ＝ａ＊３）の乗算演算子と変数乗算（例えば、ｙ＝ａ＊ｂ）の乗算演算子は区別して計数する。
解析部１２０は、同様に、定数除算に含まれる除算演算子と変数除算に含まれる除算演算子とを区別して計数する。
（２）分岐数
解析部１２０は、機能モデルソースコード１７１に含まれるｉｆ／ｅｌｓｅの個数を求める。また、解析部１２０は、機能モデルソースコード１７１にｓｗｉｔｃｈがある場合はｃａｓｅの個数の合計値を求める。
（３）ループ数
解析部１２０は、最外ループのループ数を計数する。なお、ループ数可変の場合は、解析部１２０は、最大値を計数する。
（４）中間変数個数
解析部１２０は、プログラム要素ごとに、当該プログラム要素内に含まれる中間変数の個数を求める。より具体的には、解析部１２０は、他のプログラム要素で使用されておらず、当該プログラム要素で参照された後に値が代入されている変数の個数を求める。
解析部１２０は、例えば、以下のｔｍｐのような変数を計数する。
ｉｎｔ  ｔｍｐ；
ｆｏｒ（ｉｎｔ  ｉ＝０；ｉ＜Ｎ；ｉ＋＋）｛
ｏｕｔ［ｉ］＝ｔｍｐ；
ｔｍｐ＝ｆｕｎｃ（ｉｎ［ｉ］）；
｝
（５）組込みシステム外部からの入力数
解析部１２０は、プログラム要素ごとに、当該プログラム要素内で／＊ｅｘｔｅｒｎａｌ＿ｉｎｐｕｔ＊／で指定された変数が参照される回数の合計値を求める。
（６）組込みシステム外部への出力数
解析部１２０は、プログラム要素ごとに、当該プログラム要素内で／＊ｅｘｔｅｒｎａｌ＿ｏｕｔｐｕｔ＊／で指定された変数に代入される回数の合計値を求める。
（７）他の機能からの入力数
解析部１２０は、プログラム要素ごとに、他のプログラム要素で代入された後に、当該プログラム要素内で参照されている、配列ではない変数の個数を計数する。
解析部１２０は、例えば、以下のｖａｌのような変数を計数する。
／／他のプログラム要素
｛
ｖａｌ＝ｆｕｎｃ１（）；
｝
／／当該プログラム要素
｛
ｆｕｎｃ２（ｖａｌ＋ｂ）；
｝
（８）他の機能への出力数
解析部１２０は、プログラム要素ごとに、当該プログラム要素内で代入された後、他のプログラム要素内で参照されている、配列ではない変数の個数を計数する。すなわち、解析部１２０は、上記（７）の逆のパタンとなる変数の個数を計数する。
（９）配列入力数
解析部１２０は、プログラム要素ごとに、（ａ）当該プログラム要素で参照される配列の型と、（ｂ）当該配列への当該プログラム要素でのアクセス数と、（ｃ）当該プログラム要素で当該配列が参照される際のアクセスインデックスと当該プログラム要素よりも前に実行されるプログラム要素で当該配列に値が代入される際のアクセスインデックスとの差とを抽出する。なお、アクセスインデックスの差が閾値以上にならない場合は、解析部１２０は、アクセスインデックスの差として、既定の最大値を用いる。
解析部１２０は、例えば以下の場合に、（ｂ）アクセス数としてＮを抽出し、（ｃ）アクセスインデックスの差として、（ｉ＋３）−ｉ＝３を抽出する。
／／他のプログラム要素
ｆｏｒ（ｉｎｔ  ｉ＝０；ｉ＜Ｎ；ｉ＋＋）｛
ａｒｒａｙ［ｉ］＝ｉ＊ｉ；
｝
／／当該プログラム要素
ｆｏｒ（ｉｎｔ  ｉ＝０；ｉ＜Ｎ；ｉ＋＋）｛
ｏｕｔ［ｉ］＝ａｒｒａｙ［ｉ＋３］；
｝
（１０）配列出力数
解析部１２０は、プログラム要素ごとに、（ａ）当該プログラム要素で値が代入される配列の型と、（ｂ）当該配列への当該プログラム要素でのアクセス数と、（ｃ）当該プログラム要素で当該配列に値が代入される際のアクセスインデックスと当該プログラム要素よりも後に実行されるプログラム要素で当該配列が参照される際のアクセスインデックスとの差とを抽出する。すなわち、解析部１２０は、上記（９）の逆のパタンとなる変数の個数を計数する。
（１１）ネスト数
機能モデルソースコード１７１が階層化されている場合、すなわち、機能モデルソースコード１７１がネスト構造である場合は、解析部１２０は、各プログラム要素のネストの段数を判定する。ネストの段数を、以下ネスト数という。
図１９は、解析部１２０が抽出した各プログラム要素のネスト数が示されるネスト数情報１８５の例を示す。図１９は、図６の機能モデルソースコード１７１に対して生成されたネスト数情報１８５の例である。最上位のプログラム要素であるＥＬＥＭ０はネスト数０となり、その下位のプログラム要素であるＥＬＥＭ１、ＥＬＥＭ２、ＥＬＥＭ４はネスト数１となる。また、ＥＬＥＭ５、ＥＬＥＭ６は機能モデルソースコード１７１上ではネスト構造になっていないが、ベーシックブロック内の演算数が閾値を超えるとして、ＥＬＥＭ４から分割されている。このため、ＥＬＥＭ５及びＥＬＥＭ６は、ＥＬＥＭ４の下位階層として扱われ、ネスト数は２となる。
（１２）下位プログラム要素
解析部１２０は、プログラム要素ごとに、当該プログラム要素に下位のプログラム要素が存在するか否かを解析する。
図２０は、解析部１２０の解析結果が示されるネスト構造情報１８６の例を示す。図２０のネスト構造情報１８６では、プログラム要素に下位のプログラム要素が存在する場合は、“１”が設定される。但し、図２０のネスト構造情報１８６では、直下のプログラム要素に対してのみ“１”が設定される。例えば、ＥＬＥＭ０は、直下のプログラム要素としてＥＬＥＭ１、ＥＬＥＭ２、ＥＬＥＭ４が存在するため、ＥＬＥＭ０の行において、ＥＬＥＭ１、ＥＬＥＭ２、ＥＬＥＭ４の行に“１”が設定されている。ＥＬＥＭ３、ＥＬＥＭ５、ＥＬＥＭ６はＥＬＥＭ０の直下のプログラム要素ではないため、“０”が設定されている。このようにして、解析部１２０は、機能モデルソースコード１７１でのネスト構造をパラメータ化している。
【国際調査報告】
2018066074.tif 000024
2018066074.tif 000025
2018066074.tif 000026
2018066074.tif 000027