(57)【要約】【課題】電圧変動時間を考慮したタイミングでメモリの電源電圧を変動させるプログラムコードを生成することが可能なコード生成装置を提供することである。【解決手段】上記課題は、複数の領域を有するメモリに書き込まれるプログラムコードに、電源電圧が安定した状態で前記領域を切り替えるように前記電源電圧を制御する制御コードを挿入する挿入位置を算出する挿入位置算出手段と、前記メモリの構造情報と前記挿入位置とに基づきメモリマップを作成するメモリマップ生成手段と、前記制御コードを前記挿入位置へ挿入してプログラムコードを生成するコード生成手段と、を有するコード生成装置により達成される。【選択図】図５
2011134288.tif 000002
【特許請求の範囲】
【請求項１】
複数の領域を有するメモリに書き込まれるプログラムコードに、電源電圧が安定した状態で前記領域を切り替えられるように前記電源電圧を制御する制御コードを挿入する挿入位置を算出する挿入位置算出手段と、
前記メモリの構造情報と前記挿入位置とに基づきメモリマップを作成するメモリマップ生成手段と、
前記制御コードを前記挿入位置へ挿入してプログラムコードを生成するコード生成手段と、を有するコード生成装置。
【請求項２】
前記挿入位置算出手段は、
一命令コードを一サイクルとして定められたサイクル数が実行される時間を前記電源電圧の変動にかかる時間として前記挿入位置を算出する請求項１記載のコード生成装置。
【請求項３】
前記プログラムコードをリンクして前記電源電圧を制御する制御コードが含まれるバイナリを出力するリンク手段を有する請求項１又は２記載のコード生成装置。
【請求項４】
前記挿入位置算出手段において算出された挿入位置で前記プログラムコードを分割する分割手段を有する請求項１乃至３の何れか一項に記載のコード生成装置。
【請求項５】
前記コード生成手段は、
関数の呼出関係に従って下層に配置された関数からメイン関数へ復帰するまでの間に、一度使用された前記使用時に電源電圧が供給される領域が再度使用されない場合に、
前記使用時に電源電圧が供給される領域に配置された関数を呼び出す関数のコードに、前記使用時に電源電圧が供給される領域の電圧を前記電源電圧よりも低い電圧とする制御コードを挿入する請求項１乃至４の何れか一項に記載のコード生成装置。
【請求項６】
前記コード生成手段は、
関数毎のアセンブリコードを取得するコード取得手段と、
前記コード取得手段にて取得した関数のコードが前記使用時に電源電圧が供給される領域と前記常に電源電圧が供給される領域とに配置されているかを判定する配置判定手段と、
前記配置判定手段の判定を受けて、前記前半部分の先頭へ前記後半部分が配置された領域へ電源電圧を供給させるための制御コードを挿入するスリープ解除コード挿入手段と、
前記関数の命令が関数呼出命令であり且つ前記関数呼出命令により呼び出される関数が配置されている領域が、前記関数呼出命令が配置された領域と同一の領域又は前記常に電源電圧が供給される領域でない場合に、前記関数呼出命令の直後に前記使用時に電源電圧が供給される領域の電圧を電源電圧より低い電圧とする制御コードを挿入するスリープコード挿入手段と、を有する請求項１乃至５の何れか一項に記載のコード生成装置。
【請求項７】
前記コード生成手段は、
関数毎のアセンブリコードを取得するコード取得手段と、
メイン関数から前記関数に至るまでに使用する全ての使用時一定電圧メモリの集合である第一の集合と、前記関数が呼び出す呼出先関数が使用する使用時一定電圧メモリの集合である第二の集合とに共通部分が存在するか否かを示す情報が、前記関数が呼び出す呼出先関数それぞれについて格納されたテーブルを作成するスリープコード挿入可能表作成手段と、
前記コード取得手段にて取得した関数のコードが前記使用時に電源電圧が供給される領域と前記常に電源電圧が供給される領域とに配置されているかを判定する配置判定手段と、
前記配置判定手段の判定を受けて、前記前半部分の先頭へ前記後半部分が配置された領域へ電源電圧を供給させるための制御コードを挿入するスリープ解除コード挿入手段と、
前記関数の命令が関数呼出命令であって、且つ前記テーブルにおいて前記第一の集合と前記第二の集合とが前記共通部分が存在しない場合に、前記関数呼出命令の直後に前記使用時に電源電圧が供給される領域の電圧を電源電圧より低い電圧とする制御コードを挿入するスリープコード挿入手段と、を有する請求項１乃至５の何れか一項に記載のコード生成装置。
【請求項８】
前記メモリマップ作成手段は、
呼出頻度情報に従って、親関数を一つ特定する親関数決定手段と、
常時一定電圧メモリへの関数割り当てを実行する常時一定電圧メモリ割当手段と、
使用時一定電圧メモリに割り当てる関数群の使用時一定電圧メモリのコード量の合計を求めるコード量計算手段と、
前記使用時一定電圧メモリに割り当てる関数群間の呼出頻度を算出したテーブルを作成する呼出頻度算出手段と、
前記コード量計算手段により計算された前記コード量の合計と、前記呼出頻度算出手段で作成したテーブルとを元に、関数群毎に使用時一定電圧メモリへ割り当てる使用時一定電圧メモリ割当手段と、
前記使用時一定電圧メモリ割当手段の結果を参照し、前記常時一定電圧メモリ割当手段による割り当てを修正し、各関数の一定電圧部、低電圧部の開始アドレスを計算する割当調整・アドレス計算手段と、を有する請求項１乃至７の何れか一項に記載のコード生成装置。
【請求項９】
複数の領域を有するメモリに書き込まれるプログラムコードに、電源電圧が安定した状態で前記領域を切り替えられるように前記電源電圧を制御する制御コードを挿入する挿入位置を算出する挿入位置算出手順と、
前記メモリの構造情報と前記挿入位置とに基づきメモリマップを作成するメモリマップ生成手順と、
前記制御コードを前記挿入位置へ挿入してプログラムコードを生成するコード生成手順と、を実行するコード生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
メモリに供給される電源電圧を制御するためのコードが挿入されたプログラムコードを用いてメモリマップを生成するコード生成装置及びコード生成方法に関する。
【背景技術】
【０００２】
近年のデジタル回路では、消費電力を削減するための様々な工夫が成されている。例えばデジタル回路の回路動作率の削減、デジタル回路へ供給されるクロックの停止（以下、クロックゲーティング）、クロック周波数の低減、デジタル回路へ供給される電源の遮断（以下、パワーゲーティング）、低電源電圧化等の方法が知られている。
【０００３】
またデジタル回路に含まれるメモリにおいても、消費電力を削減するために工夫がなされている。例えばメモリでは、メモリアクセスがない場合にクロックを停止させる方法、一定時間以上動作していない場合にメモリに供給される電源電圧を遮断する方法、メモリ供給される電源電圧を低下させる方法等が知られている。
【０００４】
メモリの電源電圧を低下させる方法としては、メモリが自律して電源電圧を低下させる方法と、外部のプロセッサ等から指示を受けて電源電圧を低下させる方法とが知られている。メモリの電源電圧を低下させる方法では、デジタル回路での処理の実行状態に合わせてきめ細やかに電源電圧の制御を行った方が電力の削減効果が期待できる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０００−２１５１００号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながらプログラムには多数の条件分岐が存在する場合が多く、どのタイミングでどのメモリの電源電圧を低下させれば良いか判定するのが困難である。
【０００７】
またメモリの電源電圧を低下させる場合、電源電圧を変動させるための電圧変動時間が発生する。このため例えば外部から指示によりメモリの電源電圧の制御を行う場合には、電圧変動時間を考慮して電源電圧の変動を指示する必要がある。電圧変動時間は、プロセッサのクロック数にして数十から数百サイクルに相当し、電圧変動時間を考慮して電源電圧を変動させるタイミングを予測するのは極めて困難である。
【０００８】
よって本発明の目的は、電圧変動時間を考慮したタイミングでメモリの電源電圧を変動させるプログラムコードを生成することが可能なコード生成装置及びコード生成方法を提供することである。
【課題を解決するための手段】
【０００９】
上記課題を解決するため、複数の領域を有するメモリに書き込まれるプログラムコードに、電源電圧が安定した状態で前記領域を切り替えられるように前記電源電圧を制御する制御コードを挿入する挿入位置を算出する挿入位置算出手段と、前記メモリの構造情報と前記挿入位置とに基づきメモリマップを作成するメモリマップ生成手段と、前記制御コードを前記挿入位置へ挿入してプログラムコードを生成するコード生成手段と、を有する。
【００１０】
上記手段を機能としてコンピュータに実行させるためのプログラム、そのプログラムを記憶したコンピュータ読み取り可能な記憶媒体とすることもできる。
【発明の効果】
【００１１】
電圧変動時間を考慮したタイミングでメモリの電源電圧を変動させるプログラムコードを生成することができる。
【図面の簡単な説明】
【００１２】
【図１】メモリの電源電圧の制御を行うシステムの一例を示す図である。
【図２】プログラムコードに含まれる関数の静的なコールグラフとメモリマップとの関係の一例を示す図である。
【図３】本実施形態において生成されたプログラムコードのメモリマップの一例を示す図である。
【図４】コード生成装置を説明するための図である。
【図５】コード生成装置の動作を説明するフローチャートである。
【図６】関数に分岐がない場合の分割位置の算出を説明するための図である。
【図７】関数に分岐がある場合の分割位置の算出を説明するための図である。
【図８】図５のステップＳ５１に示すアセンブリコード５５の分割位置の算出を説明するフローチャートである。
【図９】図５のステップＳ５２に示すメモリマップの決定を説明するフローチャートである。
【図１０】呼出回数情報の一例を示す図である。
【図１１】関数サイズ情報の一例を示す図である。
【図１２】メモリユニットの構造情報の一例を示す図である。
【図１３】ラベル付けの一例を示す図である。
【図１４】メモリ割当を説明する第一のフローチャートである。
【図１５】メモリ割当を説明する第二のフローチャートである。
【図１６】メモリ割当を説明する第三のフローチャートである。
【図１７】メモリ割当を説明する第四のフローチャートである。
【図１８】図５のステップＳ５３に示す制御コードの挿入を説明する第一のフローチャートである。
【図１９】図５のステップＳ５３に示す制御コードの挿入を説明する第二のフローチャートである。
【図２０】第一の実施形態のコード生成装置により生成された電源制御入りバイナリが実装された半導体集積回路の動作の一例を説明する図である。
【図２１】コード生成装置に入力されるアセンブリの一例を示す図である。
【図２２】アセンブリに定義されている関数のコールグラフの一例を示す図である。
【図２３】制御コードが挿入された後のアセンブリの一例を示す第一の図である。
【図２４】制御コードが挿入された後のアセンブリの一例を示す第二の図である。
【図２５】割り込み処理を考慮した場合の制御コードの挿入を説明する第一のフローチャートである。
【図２６】コールグラフの一例を示す図である。
【図２７】割り込み処理を考慮した場合の制御コードの挿入を説明する第二のフローチャートである。
【図２８】関数に割り当てるメモリが複数の場合を説明するための図である。
【図２９】関数に割り当てるメモリが複数である場合のメモリ割当を説明するフローチャートである。
【図３０】関数に複数のメモリを割り当てられた場合の制御コードの挿入を説明するフローチャートである。
【図３１】第四の実施形態のコード生成装置の動作を説明するフローチャートである。
【図３２】図３１のステップＳ３１０１に示す制御コードの挿入位置の算出を説明するフローチャートである。
【図３３】図３２のステップＳ３２０８に示す制御コードの挿入位置の算出を説明するフローチャートである。
【図３４】図３１のステップＳ３１０２に示すメモリマップの決定を説明するフローチャートである。
【図３５】図３１のステップＳ３１０３に示す制御コードの挿入を説明する第一のフローチャートである。
【図３６】図３１のステップＳ３１０３に示す制御コードの挿入を説明する第二のフローチャートである。
【図３７】第四の実施形態のコード生成装置により生成された電源制御入りバイナリが実装された半導体集積回路の動作の一例を説明する図である。
【図３８】第五の実施形態の前提を説明するための図である。
【図３９】第五の実施形態のコード生成装置の機能構成を説明する図である。
【図４０】第五の実施形態におけるメモリマップ情報の一例を示す図である。
【図４１】第五の実施形態のコード生成装置による制御コードの挿入を説明するフローチャートである。
【図４２】スリープ解除コード挿入処理部とスリープコード挿入処理部の処理を説明する図である。
【図４３】関数ｆｕｎｃＸがメイン関数ｆｕｎｃＭの場合を示す図である。
【図４４】関数ｆｕｎｃＸが関数ｆｕｎｃＢ１の場合を示す図である。
【図４５】関数ｆｕｎｃＸが関数ｆｕｎｃＤ２の場合を示す図である。
【図４６】関数ｆｕｎｃＸが関数ｆｕｎｃＣ３の場合を示す図である。
【図４７】第六の実施形態の前提を説明するための図である
【図４８】第六の実施形態のコード生成装置の機能構成を説明する図である。
【図４９】第六の実施形態のコード生成装置による制御コードの挿入を説明するフローチャートである。
【図５０】第六の実施形態のスリープ可能表作成部によるテーブルの作成を説明するフローチャートである。
【図５１】第七の実施形態のコード生成装置の動作を説明するフローチャートである。
【図５２】第七の実施形態におけるメモリマップの決定を説明する図である。
【図５３】関数間の呼出頻度情報の一例を示す図である。
【図５４】関数群のコード量の計算の一例を示す図である。
【図５５】第七の実施形態の呼出頻度算出部の処理を説明するフローチャートである。
【図５６】呼出頻度テーブルの一例を示す図である。
【図５７】第七の実施形態の使用時一定電圧メモリ割当部の処理を説明するフローチャートである。
【図５８】使用時一定電圧メモリのサイズ情報の一例を示す図である。
【図５９】使用時一定電圧メモリの割り当て結果の一例を示す図である。
【発明を実施するための形態】
【００１３】
以下、本発明の実施形態を図面に基づいて説明する。始めに図１乃至図３を参照して本実施形態の概念について説明する。
【００１４】
図１は、メモリの電源電圧の制御を行うシステムの一例を示す図である。図１に示すシステムは、メモリユニット１０と、プロセッサ２０と、レジスタ３０とを含む。メモリユニット１０とプロセッサ２０とレジスタ３０とは、それぞれがバス４０で接続されている。
【００１５】
メモリユニット１０は、例えばＳＲＡＭ（Static Random Access Memory）であり、電源電圧を低下させた状態で書き込まれた内容を保持することができる。メモリユニット１０は、複数の領域であるメモリＡ〜メモリＥを含む。メモリＡ〜メモリＥは、それぞれが別々のメモリであっても良いし、１つのメモリが複数の領域に分割されたメモリ領域であっても良い。メモリＡ〜メモリＥは、命令用メモリとデータ用メモリとに分けて使用することができ、それぞれに電源電圧を供給する電源線４１が電源電圧を変動させる電圧変換器４２を介して接続されている。プロセッサ２０は、メモリＡ〜Ｅ毎に電源電圧の切り替えをレジスタ３０へ設定し、電圧変換器４２はレジスタ３０の設定値に応じてメモリＡ〜メモリＥの電源電圧を変動させる。
【００１６】
本実施形態では、プログラムコードに含まれる関数単位でメモリＡ〜メモリＥの電源電圧の変動の制御を完結できるように、プログラムコードに電源電圧を制御するための制御コードを挿入する。
【００１７】
図２は、プログラムコードに含まれる関数の静的なコールグラフとメモリマップとの関係の一例を示す図である。
【００１８】
本実施形態では、メモリユニット１０において、一定の電源電圧が供給された状態である一定電圧状態とされるメモリ（以下、常時一定電圧メモリ）と、使用されないときは電源電圧が低電圧とされる低電圧状態とされるメモリ（以下、使用時一定電圧メモリ）とを設ける。尚低電圧は、一定電圧よりも低い電圧である。尚使用時一定電圧メモリは、低電圧状態であってもメモリに書き込まれた内容を保持できる。
【００１９】
本実施形態では、長時間実行されることが予測される関数は、常時一定電圧メモリへ配置される。長時間実行されることが予測される関数とは、関数の呼出階層が上位のメイン関数等である。またメイン関数等に呼び出される関数は、前半部分（以下、一定電圧部）と後半部分（以下、低電圧部）に分割される。関数の一定電圧部のコードは常時一定電圧メモリへ配置される。
【００２０】
図２の例では、メモリＡは常時一定電圧メモリであり、メイン関数ｆｕｎｃＭが配置されている。またメモリＡには、メイン関数ｆｕｎｃＭに呼び出される関数ｆｕｎｃ１と関数ｆｕｎｃ２の一定電圧部Ｚ１、Ｚ２が配置されている。またメモリＡには、関数ｆｕｎｃ１、関数ｆｕｎｃ２に呼び出されるその他の関数ｆｕｎｃ３が配置されている。メモリＢ、メモリＣは、使用時一定電圧メモリであり、関数ｆｕｎｃ１と関数ｆｕｎｃ２の低電圧部Ｋ１、Ｋ２が配置されている。
【００２１】
本実施形態では、関数ｆｕｎｃ１と関数ｆｕｎｃ２を分割する際に、関数ｆｕｎｃ１、関数ｆｕｎｃ２において電圧変動時間内に実行可能なコードまでを一定電圧部Ｚ１、Ｚ２としてメモリＡへ配置し、それ以降のコードを低電圧部Ｋ１、Ｋ２としてメモリＢ、メモリＣへ配置する。そして関数ｆｕｎｃ１、関数ｆｕｎｃ２の先頭部分へメモリＢ、メモリＣを一定電圧状態にするコードを挿入してプログラムコードを生成する。
【００２２】
本実施形態の電圧変動時間とは、電源電圧が一定電圧から低電圧になるまでにかかる時間、又は低電圧から一定電圧になるまでにかかる時間である。
【００２３】
本実施形態により生成されたプログラムコードは、例えばＬＳＩ（Large Scale Integration）等のメモリに書き込まれる。本実施形態により生成されたプログラムコードが書き込まれたＬＳＩでは、電圧変動時間を考慮したタイミングでメモリの電源電圧を変動させる制御を実現することができ、電圧変動時間を吸収することができる。尚関数の分割とコードの挿入の詳細は後述する。
【００２４】
本実施形態により生成されたプログラムコードでは、例えば関数ｆｕｎｃ１の一定電圧部Ｚ１の先頭に、使用時一定電圧メモリであるメモリＢを一定電圧状態とするための制御コードが挿入されている。よって関数ｆｕｎｃ１の一定電圧部Ｚ１の実行が終了して低電圧部Ｚ２を実行するためのメモリをメモリＡからメモリＢへ切り替えたとき、メモリＢは一定電圧状態となっている。よって本実施形態では、電源電圧がメモリへ安定して供給された状態でメモリの切り替えを行うことができる。
【００２５】
図３は、本実施形態において生成されたプログラムコードのメモリマップの一例を示す図である。
【００２６】
メモリユニット１０において、開始アドレスが０ｘ００００であり終了アドレスが０ｘ０ｆｆｆのメモリＡには、メイン関数ｆｕｎｃＭ、メモリＢを一定電圧状態とする電源制御コード、関数ｆｕｎｃ１の一定電圧部Ｚ１、メモリＣを一定電圧状態とする電源制御コード、関数ｆｕｎｃ２の一定電圧部Ｚ２、その他の関数ｆｕｎｃ３が配置される。開始アドレスが０ｘ１０００であり終了アドレスが０ｘ１ｆｆｆｆのメモリＢには、図２に示していない他の関数と、関数ｆｕｎｃ１の低電圧部Ｋ１が配置される。開始アドレスが０ｘ２０００であり終了アドレスが０ｘ２ｆｆｆｆのメモリＣには、図２に示していない他の関数と、関数ｆｕｎｃ２の低電圧部Ｋ２が配置される。
【００２７】
図３に示すメモリマップにしたがってプログラムコードを実装すれば、電圧変動時間を考慮したタイミングでメモリＢ、メモリＣの電源電圧を制御することができる。よってメモリＢ、メモリＣを適切なタイミングで低電圧状態から一定電圧状態へ移行させることができる。
【００２８】
（第一の実施形態）
以下に、図面を参照して本発明の第一の実施形態について説明する。始めに、プログラムコードを生成する第一の実施形態のコード生成装置について説明する。
【００２９】
図４は、コード生成装置を説明するための図である。本実施形態のコード生成装置１００は、プログラムコードであるアセンブリ５０と後述するパラメータ６０とが入力されると、アセンブリ５０にメモリユニット１０に供給される電源電圧を制御するための制御コードを挿入し、制御コードが挿入されたアセンブリ５０をアセンブル及びリンケージして、電源制御入りバイナリ７０を生成して出力する。
【００３０】
本実施形態のコード生成装置１００は、それぞれバスＢで相互に接続されている入力装置１０１、出力装置１０２、ドライブ装置１０３、補助記憶装置１０４、メモリ装置１０５、演算処理装置１０６及びインターフェース装置１０７で構成される。
【００３１】
入力装置１０１はキーボードやマウスなどで構成され、各種信号を入力するために用いられる。出力装置１０２はディスプレイ装置などで構成され、各種ウインドウやデータ等を表示するために用いられる。インターフェース装置１０７は、モデム、ＬＡＮカードなどで構成されており、ネットワークに接続する為に用いられる。
【００３２】
本実施形態のコード生成プログラムは、コード生成装置１００を制御する各種プログラムの少なくとも一部である。コード生成プログラムは例えば記録媒体１０８の配布やネットワークからのダウンロードなどによって提供される。コード生成プログラムを記録した記録媒体１０８は、ＣＤ−ＲＯＭ、フレキシブルディスク、光磁気ディスク等の様に情報を光学的、電気的或いは磁気的に記録する記録媒体、ＲＯＭ、フラッシュメモリ等の様に情報を電気的に記録する半導体メモリ等、様々なタイプの記録媒体を用いることができる。
【００３３】
また、コード生成プログラムを記録した記録媒体１０８がドライブ装置１０３にセットされると、コード生成プログラムは記録媒体１０８からドライブ装置１０３を介して補助記憶装置１０４にインストールされる。ネットワークからダウンロードされたコード生成プログラムは、インターフェース装置１０７を介して補助記憶装置１０４にインストールされる。
【００３４】
補助記憶装置１０４は、インストールされたコード生成プログラムを格納すると共に、必要なファイル、データ等を格納する。補助記憶装置１０４には、例えばアセンブリ５０とパラメータ６０とが格納されても良い。メモリ装置１０５は、コンピュータの起動時に補助記憶装置１０４からコード生成プログラムを読み出して格納する。そして、演算処理装置１０６はメモリ装置１０５に格納されたコード生成プログラムに従って、後述するような各種処理を実現している。
【００３５】
本実施形態のアセンブリ５０には、関数毎のアセンブリコード５５が含まれる。また本実施形態のパラメータ６０には、サイクル数Ｎ、メモリユニット１０の構造情報６２、制御コードパターン６３が含まれる。サイクル数Ｎは、アセンブリ５０に記述された一命令を一サイクルとして予め設定された値である。本実施形態のサイクル数Ｎは、サイクル数Ｎ分の命令を実行するのにかかる時間がメモリユニット１０への電源電圧の電圧変動時間に相当するように設定されている。
【００３６】
メモリユニット１０の構造情報６２は、メモリユニット１０の有するメモリＡ〜メモリＥにおけるそれぞれの開始アドレスと終了アドレスを示す。制御コードパターン６３とは、メモリＡ〜メモリＥへの電源電圧の制御を行うための制御コードのパターンである。制御コードパターン６３は、制御コードパターン６３に含まれる特定のパラメータを決定することで制御コードが決定される。制御コードパターン６３には、例えばメモリＡ〜メモリＥを一定電圧状態から低電圧状態へ又は低電圧状態から一定電圧状態へ変化させる電源制御コードパターン６４、分割位置から分割された先へジャンプさせるジャンプ制御コードパターン６５（図９参照）が含まれる。
【００３７】
以下に図５を参照して本実施形態のコード生成装置１００の動作を説明する。図５は、コード生成装置の動作を説明するフローチャートである。尚図５で説明する各ステップの処理の詳細は後述する。
【００３８】
本実施形態のコード生成装置１００において、アセンブリ５０とパラメータ６０に含まれるサイクル数Ｎとが入力されると、コード生成装置１００は、関数毎のアセンブリコード５５の分割位置を算出する（ステップＳ５１）。尚本実施形態では、ステップＳ５１で算出された分割位置が制御コードが挿入される挿入位置である。
【００３９】
ステップＳ５１においてアセンブリコード５５の分割位置が算出されると、コード生成装置１００は、分割位置とパラメータ６０に含まれるメモリユニット１０の構造情報６２とに基づき分割されたアセンブリコード５５を配置するためのメモリマップを決定する（ステップＳ５２）。
【００４０】
メモリマップが生成されると、コード生成装置１００はパラメータ６０に含まれる制御コードパターン６３に代入するパラメータを決定して制御コードを生成し、アセンブリコード５５の分割位置に制御コードを挿入する（ステップＳ５３）。制御コードが挿入されたアセンブリ５０をアセンブリ５０Ａとする。コード生成装置１００は、制御コードが挿入されたアセンブリコード５５を含むアセンブリ５０Ａをアセンブル及びリンケージして（ステップＳ５４）、制御コードが含まれる電源制御入りバイナリ７０を出力してコード生成を完了する。
【００４１】
本実施形態のコード生成装置１００から出力された電源制御入りバイナリ７０は、記録媒体１０８とは別の記録媒体に記録されても良い。
【００４２】
次に、図６乃至図８を参照して本実施形態における関数の分割位置の算出について説明する。
【００４３】
本実施形態のコード生成装置１００では、予め所定のサイクル数Ｎが設定されている。本実施形態では、一命令を実行するサイクルを一サイクルとしている。また本実施形態でのサイクル数Ｎは、Ｎサイクル分命令を実行するのにかかる時間が電圧変動時間に相当するように設定されている。
【００４４】
コード生成装置１００は、アセンブリ５０に含まれるアセンブリコード５５においてサイクル数Ｎで到達し得る最も遠いアドレスを分割位置として算出する。そしてコード生成装置１００は、アセンブリコード５５においてＮサイクル内に実行可能な命令までを一定電圧部とし、Ｎサイクル内では到達しない命令を低電圧部として、アセンブリコード５５を分割する。
【００４５】
尚本実施形態のコード生成装置１００では、メイン関数等のように長時間実行されることが予測される関数は、予め分割しないように設定されていても良い。
【００４６】
図６は、関数に分岐がない場合の分割位置の算出を説明するための図である。図６（Ａ）は命令のフローを示し、図６（Ｂ）は分割の例を示す図である。
【００４７】
アセンブリ５０に含まれる関数ｆｕｎｃ１を例として説明する。図６（Ａ）に示すように、関数ｆｕｎｃ１の処理フローに条件分岐がない場合、命令のフローは直鎖状のフローとなる。よってＮサイクルとは単純にＮ番目の命令のアドレスが、サイクル数Ｎで到達し得る最も遠いアドレス（以下、最遠アドレス）となる。
【００４８】
コード生成装置１００は、図６（Ｂ）の例１に示すように、関数ｆｕｎｃ１のアセンブリコード５５の開始アドレスから最遠アドレスまでを一定電圧部Ｚ１とし、最遠アドレスから関数ｆｕｎｃ１のアセンブリコード５５の終了アドレスまでを低電圧部Ｋ１とするように関数ｆｕｎｃ１のアセンブリコード５５を分割する。よって本実施形態では、最遠アドレスがコード生成装置１００により算出される分割位置となる。
【００４９】
また図６（Ｂ）の例２に示すように、開始アドレスから終了アドレスまでがＮサイクル内に実行可能な関数ｆｕｎｃ３の場合は、分割せずに関数ｆｕｎｃ３のアセンブリコード５５を常時一定電圧メモリへ配置する。
【００５０】
図７は、関数に分岐がある場合の分割位置の算出を説明するための図である。図７（Ａ）は命令のフローを示し、図７（Ｂ）は分割の例を示す図である。
【００５１】
関数に分岐がある場合にコード生成装置１００は、Ｎサイクル内の命令を辿った際に、分岐点を通過して到達し得る最も遠いアドレスを最遠アドレスとする。
【００５２】
関数ｆｕｎｃ１が図７（Ａ）に示す分岐を有する関数であった場合、分岐点１を通過した後の命令のフローは、経路１と経路２とに別れる。関数ｆｕｎｃ１が図７（Ｂ）に示すようなコードであった場合、分岐点１からｎ３サイクルへ進む経路２の方が、Ｎサイクル内に関数ｆｕｎｃ１のアセンブリコード５５の開始アドレスから離れたアドレスへ到達できる。よってコード生成装置１００は、経路２においてＮサイクル内に到達し得る最も遠いアドレスを最遠アドレス（分割位置）として算出する。そしてコード生成装置１００は、関数ｆｕｎｃ１のアセンブリコード５５の開始アドレスから最遠アドレスまでを一定電圧部Ｚ１とし、最遠アドレスから関数ｆｕｎｃ１のアセンブリコード５５の終了アドレスまでを低電圧部Ｋ１として分割する。
【００５３】
図８は、図５のステップＳ５１に示すアセンブリコード５５の分割位置の算出を説明するフローチャートである。尚、図８で説明する処理は、アセンブリ５０に含まれる関数毎のアセンブリコード５５に対して実行する。
【００５４】
本実施形態のコード生成装置１００は、アセンブリ５０とパラメータ６０に含まれるサイクル数Ｎが入力されると、関数の開始命令ノードと、サイクル数＝０とを積んだ状態で作業用キューを初期化する（ステップＳ８０１）。
【００５５】
次にコード生成装置１００は、キューから命令ノードとサイクル数とを取り出す（ステップＳ８０２）。そしてコード生成装置１００は、キューから取り出した命令ノードがリターン命令であるか、又はサイクル数がＮより大きくなったか否かを判断する（ステップＳ８０３）。ステップＳ８０３において、キューから取り出した命令ノードがリターン命令でなく、且つサイクル数がＮより大きくない場合、コード生成装置１００はステップＳ８０４へ進む。ステップＳ８０３において、キューから取り出した命令ノードがリターン命令である場合、又はサイクル数がＮより大きい場合、コード生成装置１００は後述するステップＳ８０７以降の処理を行う。
【００５６】
ステップＳ８０４において、コード生成装置１００は、キューから取り出された命令ノードが条件分岐命令であるか否かを判断する。ステップＳ８０４において条件分岐命令である場合、コード生成装置１００はステップＳ８０５へ進む。ステップＳ８０５において、コード生成装置１００は、分岐先の命令ノードを求めてキューへ積む。ステップＳ８０４において条件分岐命令でない場合、コード生成装置１００はステップＳ８０６へ進む。ステップＳ８０６においてコード生成装置１００は、条件分岐命令の次の命令ノードをキューへ積む。
【００５７】
続いてコード生成装置１００は、命令ノードの現アドレスが最遠アドレスよりもアセンブリコード５５の開始アドレスから遠いアドレスか否かを判断する（ステップＳ８０７）。尚ステップＳ８０７で現アドレスと比較される最遠アドレスには、予め初期値が設定された仮の最遠アドレスとした。また命令ノードの現アドレスとは、最後のキューに積まれた命令ノードのアドレスである。
【００５８】
ステップＳ８０７で現アドレスの方が、仮の最遠アドレスよりもアセンブリコード５５の開始アドレスから遠いアドレスであった場合ステップＳ８０８へ進む。ステップＳ８０８においてコード生成装置１００は、現アドレスを仮の最遠アドレスへ代入し、現アドレスを最遠アドレスに決定する。
【００５９】
ステップＳ８０７において現アドレスの方が、仮の最遠アドレスよりもアセンブリコード５５の開始アドレスから近いアドレスであった場合ステップＳ８０９へ進む。ステップＳ８０９においてコード生成装置１００は、キューが空か否かを判断し、キューが空でない場合にはステップＳ８０３以降の処理を繰り返す。
【００６０】
ステップＳ８０９においてキューが空であった場合、コード生成装置１００は、ステップＳ８１０へ進み、最遠アドレスをアセンブリコード５５の分割位置に決定し、アセンブリコード５５の開始アドレスから最遠アドレスまでのコード長を一定電圧部、最遠アドレスからアセンブリコード５５の終了アドレスまでのコード長を低電圧部として分割位置の算出を終了する。尚アセンブリコード５５の一定電圧部は常時一定電圧メモリへ配置されるコードであり、アセンブリコード５５の低電圧部は使用時一定電圧メモリへ配置されるコードである。
【００６１】
尚本実施形態では、一命令を実行するサイクルを一サイクルとしてサイクル数を取り出しているが、これに限定されない。例えばコード生成装置１００は、命令コードとサイクル数とが対応付けられたテーブルを保持しており、命令コード毎にテーブルを参照してサイクル数を取り出しても良い。
【００６２】
次に、図９を参照してコード生成装置１００におけるメモリマップの決定について説明する。図９は、図５のステップＳ５２に示すメモリマップの決定を説明するフローチャートである。
【００６３】
コード生成装置１００は、関数毎のアセンブリコード５５を参照して低電圧部を有する関数を呼び出している回数を呼出回数情報として抽出する（ステップＳ９０１）。図１０に、呼出回数情報の一例を示す。図１０に示す呼出回数情報５１では、低電圧部を有する関数を呼び出している関数として関数ｆｕｎｃ１、関数ｆｕｎｃ２が抽出されている。呼出回数情報５１は、関数名と、関数毎の一定電圧部において低電圧部を有する関数を呼び出している回数、低電圧部において低電圧部を有する関数を呼び出している回数とが対応付けられた情報である。
【００６４】
図９に戻って、コード生成装置１００は、制御コードパターン６３に含まれる電源制御コードパターン６４、ジャンプコードパターン６５から、電源制御コードのコードサイズｓ＿ｖとジャンプ制御コードのコードサイズｓ＿ｊとを抽出する。
【００６５】
次にコード生成装置１００は、アセンブリ５０のコードサイズの補正を行う（ステップＳ９０３）。コード生成装置１００は、ステップＳ９０１で抽出された呼出回数情報５１と、ステップＳ９０２で抽出されたコードサイズｓ＿ｖとコードサイズｓ＿ｊと、後述する関数サイズ情報５２とに基づきアセンブリ５０のコードサイズの補正を行う。
【００６６】
以下にコードサイズの補正の詳細を説明する。
【００６７】
コード生成装置１００では、アセンブリ５０に含まれるアセンブリコード５５の分割位置が算出されると、コード生成装置１０は関数名と関数毎のアセンブリコード５５のサイズに関する情報とを対応させた関数サイズ情報５２を生成する。図１１は、関数サイズ情報の一例を示す図である。関数サイズ情報５２は、分割位置が決定されたアセンブリコード５５の関数名と、関数毎の低電圧部のサイズ、一定電圧部のサイズとが対応付けられた情報である。図１１に示す関数サイズ情報５２では、低電圧部を有する関数の関数名である関数ｆｕｎｃ１、関数ｆｕｎｃ１の一定電圧部のサイズ、関数ｆｕｎｃ１の低電圧部のサイズとが対応付けられている。また関数ｆｕｎｃ２についても同様に、関数ｆｕｎｃ２の関数名、関数ｆｕｎｃ２の一定電圧部のサイズ、関数ｆｕｎｃ２の低電圧部のサイズとが対応付けられている。
【００６８】
コード生成装置１００では、アセンブリコード５５を一定電圧部と低電圧部とに分割した場合、一定電圧部のアセンブリコード５５を配置するメモリに、低電圧部が配置された使用時一定電圧メモリを特定するジャンプ制御コードと、使用時一定電圧メモリを一定電圧状態にさせる電源制御コードとを挿入する必要がある。
【００６９】
そこでコード生成装置１００は、低電圧部を有する関数の呼出回数情報５１と、低電圧部を有する関数の関数サイズ情報５２と、電源制御コードのコードサイズｓ＿ｖとジャンプ制御コードのコードサイズｓ＿ｊとに基づき、関数毎のアセンブリコード５５のサイズを補正する。より具体的には、低電圧部を有する関数について、（一定電圧部のサイズ）は（コードサイズｓ＿ｖ）×（一定電圧部において低電圧部を有する関数を呼び出している回数＋１）＋（コードサイズｓ＿ｊ）を加えることで、また（低電圧部のサイズ）は（電源制御コードのコードサイズｓ＿ｖ）×（低電圧部において低電圧部を有する関数を呼び出している回数）を加えることで補正する。一方、低電圧部を有さない関数について、（一定電圧部のサイズ）は（コードサイズｓ＿ｖ）×（一定電圧部において低電圧部を有する関数を呼び出している回数）を加えて補正する。そしてコード生成装置１００は、低電圧部を有する関数のアセンブリコード５５について補正を行った結果をアセンブリ５０のサイズに反映させることで、アセンブリ５０のコードサイズを補正する。
【００７０】
アセンブリ５０のコードサイズの補正が完了すると、コード生成装置１００は、常時一定電圧メモリと、使用時一定電圧メモリの両方においてメモリの割当を行う（ステップＳ９０４）。メモリの割当は、パラメータ６０に含まれるメモリユニット１０の構造情報６２に基づき行われる。図１２は、メモリユニットの構造情報の一例を示す図である。構造情報６２は、メモリユニット１０に含まれる複数のメモリのメモリ名と、開始アドレスと、終了アドレスとが対応付けられた情報である。メモリの割当の詳細は後述する。
【００７１】
図９に戻って、コード生成装置１００は、メモリの割当が終了すると、アセンブリコード５５の低電圧部のラベル付けを行い（ステップＳ９０５）、メモリマップ決定を完了する。コード生成装置１００は、分割位置が決定されたアセンブリコード５５の低電圧部の開始部分に、（関数名）＿Ｌというラベルを付ける。図１３は、ラベル付けの一例を示す図である。コード生成装置１００は、例えば使用時一定電圧メモリであるメモリＡに配置された関数ｆｕｎｃ１のアセンブリコード５５の低電圧部の開始アドレスに、関数ｆｕｎｃ１＿Ｌというラベルを付ける。関数ｆｕｎｃ２についても同様に、メモリＢに配置された関数ｆｕｎｃ２のアセンブリコード５５の低電圧部の開始アドレスに、関数ｆｕｎｃ２＿Ｌというラベルを付ける。
【００７２】
次に、図１４乃至図１７を参照して図９のステップＳ９０４におけるメモリの割当について説明する。本実施形態のコード生成装置１００は、図１４乃至図１７に示す何れかの方法により、常時一定電圧メモリに対するメモリ割当と使用時一定電圧メモリに対するメモリ割当とを行えば良い。
【００７３】
図１４は、メモリ割当を説明する第一のフローチャートである。コード生成装置１００は、アセンブリ５０のコードサイズの補正が完了すると、アセンブリ５０に含まれるアセンブリコード５５をメモリユニット１０の有する複数のメモリの先頭から割り当てる（ステップＳ１４０１）。次にコード生成装置１００は、アセンブリ５０において最初に登場するアセンブリコード５５を最初のメモリ（メモリＡ）に割り当て、アセンブリコード５５がメモリＡとメモリＢの境界を跨ぐか否かを判断する（ステップＳ１４０２）。
【００７４】
ステップＳ１４０２においてメモリの境界を跨ぐとき、コード生成装置１００は、アセンブリコード５５をメモリＢにのみ割り当てる（ステップＳ１４０３）。ステップＳ１４０２においてメモリの境界を跨がないとき、コード生成装置１００は、アセンブリコード５５をメモリＡへ割り当て、アセンブリ５０に含まれる全ての関数のアセンブリコード５５を割り当てたか否かを判断する（ステップＳ１４０４）。ステップＳ１４０４において全てのアセンブリコード５５の割り当てが完了すると、コード生成装置１００はメモリ割当を終了する。
【００７５】
図１５は、メモリ割当を説明する第二のフローチャートである。コード生成装置１００は、アセンブリ５０のコードサイズの補正が完了すると、アセンブリ５０に含まれる関数名をアルファベット順にソートする（ステップＳ１５０１）。次にコード生成装置１００は、図１４のステップＳ１４０１からステップＳ１４０４までの処理を実行する。
【００７６】
図１６は、メモリ割当を説明する第三のフローチャートである。コード生成装置１００は、アセンブリ５０のコードサイズの補正が完了すると、メモリユニット１０を走査してアセンブリ５０において最初に登場するアセンブリコード５５をメモリの境界を跨がずに割り当てられるメモリを求め、アセンブリコード５５を割り当てる（ステップＳ１６０１）。
【００７７】
コード生成装置１００は、ステップＳ１６０１の処理をアセンブリ５０に含まれる全てのアセンブリコード５５を割り当てたか否かを判断し（ステップＳ１６０２）、全てのアセンブリコード５５を割り当てた場合にメモリ割当を終了する。
【００７８】
図１７は、メモリ割当を説明する第四のフローチャートである。コード生成装置１００は、アセンブリ５０のコードサイズの補正が完了すると、アセンブリ５０に含まれるアセンブリコード５５をコードサイズの大きい順にソートする（ステップＳ１７０１）。そしてコード生成装置１００は、図１６のステップＳ１６０１、ステップＳ１６０２の処理を実行する（ステップＳ１７０２）。
【００７９】
次に、コード生成装置１００における制御コードの挿入について説明する。本実施形態のコード生成装置１００は、低電圧部を有する関数のアセンブリコード５５に、分割位置に低電圧部が割り当てられた使用時一定電圧メモリへのジャンプ制御コードを挿入する。またコード生成装置１００は、アセンブリコード５５の先頭部分に低電圧部が割り当てられた使用時一定電圧メモリを一定電圧状態とする電源制御コードを挿入する。さらにコード生成装置１００は、アセンブリコード５５の低電圧部が配置されている使用時一定電圧メモリを関数実行後に低電圧状態として良いか否かを判断し、低電圧状態として良い場合には使用時一定電圧メモリを低電圧状態とする電源制御コードを挿入する。
【００８０】
以下に図１８、図１９を参照して制御コードの挿入について説明する。図１８は、図５のステップＳ５３に示す制御コードの挿入を説明する第一のフローチャートである。
【００８１】
コード生成装置１００は、アセンブリ５０に含まれる関数から低電圧部を有する関数を抽出して低電圧部を有する関数のリストＬ１を生成する（ステップＳ１８０１）。尚このリストＬ１は、例えば図９で説明したコードサイズの補正において、関数サイズ情報５２を抽出する際に抽出されていても良い。
【００８２】
コード生成装置１００は、ステップＳ１８０１で作成されたリストＬ１から、一つの関数ｆｕｎｃを選択し、選択した関数のアセンブリコード５５を取り出してファイルｆとする（ステップＳ１８０２）。
【００８３】
次にコード生成装置１００は、ステップＳ５１で算出した分割位置、ステップＳ５２で決定したメモリマップに基づき電源制御コードパターン６４とジャンプ制御コードパターン６５とにパラメータを埋め込む（ステップＳ１８０３）。例えばファイルｆに取り出されたアセンブリコード５５の低電圧部のコードがメモリＢへ配置される場合、コード生成装置１００は、電源制御コードパターン６４に、一定電圧状態とするメモリを指定する「メモリＢ」をパラメータとして埋め込む。またコード生成装置１００は、ジャンプ制御コードパターン６５に、ジャンプ先のアドレスとして、ステップＳ５２で決定したメモリマップを参照し求めた関数ｆｕｎｃの低電圧部の開始アドレスを埋め込む。
【００８４】
パラメータを埋め込むと、コード生成装置１００は、パラメータを埋め込んだ電源制御コードとジャンプ制御コードとをファイルｆへ挿入する（ステップＳ１８０４）。次にコード生成装置１００は、ステップＳ１８０１で作成されたリストＬ１が空か否かを判断し（ステップＳ１８０５）、リストＬ１が空になるまでステップＳ１８０２〜ステップＳ１８０４を反復実行する。リストＬ１が空になると後述するステップＳ１９０１へ進む。
【００８５】
図１９は、図５のステップＳ５３に示す制御コードの挿入を説明する第二のフローチャートである。図１９では、リストＬ１が空になった後に実行される処理を示している。
【００８６】
コード生成装置１００は、アセンブリ５０に含まれる関数の静的コールグラフ（呼出関係図）を作成する（ステップＳ１９０１）。次にコード生成装置１００は、アセンブリ５０中の関数の呼出命令のアドレスと、呼び出された関数名とを対応付けたリストＬ２を作成する（ステップＳ１９０２）。
【００８７】
コード生成装置１００は、リストＬ２から、一つの呼出命令のアドレスをアドレスｘとして取り出し、アドレスｘにて呼び出される関数名を文字列変数ｆｕｎｃｘとして取り出す（ステップＳ１９０３）。コード生成装置１００は、文字列変数ｆｕｎｃｘにより指し示される関数が配置されるメモリをＭｘと置き、文字列変数ｆｕｎｃを文字列変数ｆｕｎｃｘで更新する（ステップＳ１９０４）。続いてコード生成装置１００は、文字列変数ｆｕｎｃを文字列変数ｆｕｎｃにより示される関数の呼出元関数名に置き換え、文字列変数ｆｕｎｃｘにより示される関数が配置されるメモリをＭと置く（ステップＳ１９０５）。
【００８８】
次にコード生成装置１００は、メモリＭとメモリＭｘとが同じメモリであるか否かを判断する（ステップＳ１９０６）。後述する反復実行を考慮すると、コード生成装置１００は、呼出先関数のアセンブリコード５５と、メイン関数から呼出元関数に至るまでに呼び出される関数のアセンブリコード５５のいずれか、とが同じメモリに配置されるか否かを判断している。
【００８９】
ステップＳ１９０６においてメモリＭとメモリＭｘとが同じメモリであった場合はステップＳ１９０７に進む。
【００９０】
ステップＳ１９０６においてメモリＭとメモリＭｘとが同じメモリでない場合、コード生成装置１００は、文字列変数ｆｕｎｃ（ここでは呼出元関数を指す）がメイン関数を指すものか否かを判断する（ステップＳ１９０８）。文字列変数ｆｕｎｃがメイン関数を指すものと判断された場合、コード生成装置１００は、電源制御コードパターン６４にパラメータを埋め込み電源制御コードを決定する（ステップＳ１９０９）。ここで埋め込まれるパラメータは、文字列変数ｆｕｎｃｘが示す呼出先関数が配置されたメモリＭｘを低電圧状態へするためのパラメータである。
【００９１】
電源制御コードパターン６４にパラメータが埋め込まれると、コード生成装置１００は電源制御コードをステップＳ１９０２で取り出したアドレスｘの直後に挿入し（ステップＳ１９１０）、ステップＳ１９０７へ進む。
【００９２】
ステップＳ１９０７において、コード生成装置１００はリストＬ２が空か否かを判断し、リストＬ２が空だったときは制御コードの挿入を終了する。リストＬ２が空でなければ、ステップＳ１９０３に戻り、ステップＳ１９０３〜ステップＳ１９０６及びステップＳ１９０８〜ステップＳ１９１０の処理を繰り返す。
【００９３】
尚図１９では呼出元関数が複数存在している場合について説明していないが、複数存在する場合はステップＳ２７０４、ステップＳ２７０５を全ての呼出元について実行する。
【００９４】
コード生成装置１００は、アセンブリ５０に制御コードが挿入されると、制御コード挿入後のアセンブリ５０Ａをアセンブル及びリンケージして電源制御入りバイナリ７０を出力する。
【００９５】
以下に図２０を参照して本実施形態のコード生成装置１００により出力された電源制御入りバイナリ７０が実装されたＬＳＩ等の動作を説明する。図２０は、第一の実施形態のコード生成装置により生成された電源制御入りバイナリが実装された半導体集積回路の動作の一例を説明する図である。
【００９６】
図２０では、メモリに配置された関数の実行状況と、メモリの電源電圧の状態とを対応させて示している。メモリＡは常時一定電圧メモリであり、メモリＢ、Ｃ、Ｄは使用時一定電圧メモリである。
【００９７】
メモリＡに配置されたメイン関数ｆｕｎｃＭにより関数ｆｕｎｃ１が呼び出されると、関数ｆｕｎｃ１が実行される。関数ｆｕｎｃ１の開始アドレスには、メモリＢを一定電圧状態とする電源制御コードが挿入されている。よって関数ｆｕｎｃ１の実行が開始されるとメモリＢは一定電圧状態への移行を開始する。関数ｆｕｎｃ１には、Ｎサイクル分の命令を実行するとメモリＢへジャンプするようにジャンプ制御コードが挿入されている。よって関数ｆｕｎｃ１はＮサイクル後にメモリＢへジャンプし、関数ｆｕｎｃ１の低電圧部のアセンブリコードの実行を開始する。ここでメモリＢの電圧変動時間は、Ｎサイクルの命令の実行に係る時間に相当する。よって関数ｆｕｎｃ１がメモリＢへジャンプしたときには、メモリＢは一定電圧状態となっている。関数ｆｕｎｃ２、関数ｆｕｎｃ３も関数ｆｕｎｃ１と同様である。
【００９８】
以下に図２１乃至図２４を参照して本実施形態のコード生成装置１００の動作例について説明する。
【００９９】
図２１は、コード生成装置に入力されるアセンブリの一例を示す図である。
【０１００】
コード生成装置１００では、図２１に示すアセンブリ５０が入力されると、アセンブリコード５０に制御コードを挿入する。尚アセンブリ５０には、図２１で定義されている関数以外の関数も含まれていても良い。
【０１０１】
図２２は、アセンブリに定義されている関数のコールグラフの一例を示す図である。関数ｆｕｎｃ１、関数ｆｕｎｃ２は、メイン関数ｆｕｎｃＭに呼び出される。関数ｆｕｎｃ３は、関数ｆｕｎｃ１と関数ｆｕｎｃ２により呼び出される。
【０１０２】
図２３は、制御コードが挿入された後のアセンブリの一例を示す第一の図であり、図２４は、制御コードが挿入された後のアセンブリの一例を示す第二の図である。図２３は、常時一定電圧メモリであるメモリＡに配置されるコードの例を示しており、図２４は、使用時一定電圧メモリであるメモリＢとメモリＣに配置されるコードの例を示している。
【０１０３】
図２３のコードＡ１、コードＡ２は、図１９で説明した制御コードの挿入により挿入されるコードである。コードＡ１は、メモリＢに低電圧部が配置された関数ｆｕｎｃ１の実行が終了すると、メモリＢを一定電圧状態から低電圧状態へ移行させる制御を行う電源制御コードである。コードＡ２は、メモリＣに低電圧部が配置された関数ｆｕｎｃ２の実行が終了すると、メモリＣを一定電圧状態から低電圧状態へ移行させる制御を行う電源制御コードである。
【０１０４】
図２３のコードＢ１、コードＢ２は、図１８で説明した制御コードの挿入により挿入されるコードである。コードＢ１は、関数ｆｕｎｃ１の一定電圧部の実行開始直後に、関数ｆｕｎｃ１の低電圧部が配置されたメモリＢを低電圧状態から一定電圧状態へ移行させるための電源制御コードである。コードＢ２は、関数ｆｕｎｃ１の低電圧部が配置されたメモリＢへジャンプさせるジャンプ制御コードである。コードＢ２は、関数ｆｕｎｃ１の一定電圧部の最後に挿入されている。
【０１０５】
コードＢ３は、関数ｆｕｎｃ２の一定電圧部の実行開始直後に、関数ｆｕｎｃ２の低電圧部が配置されたメモリＣを低電圧状態から一定電圧状態へ移行させるための電源制御コードである。コードＢ４は、関数ｆｕｎｃ２の低電圧部が配置されたメモリＣへジャンプさせるジャンプ制御コードである。コードＢ４は、関数ｆｕｎｃ２の一定電圧部の最後に挿入されている。
【０１０６】
図２４のコードＣは、図９のステップＳ９０５で説明した低電圧部のラベル付けにより付与されたラベルである。コードＣは、メモリＢに配置された関数ｆｕｎｃ１の低電圧部の開始アドレスに付与されている。同様に図２４のコードＤは、メモリＣに配置された関数ｆｕｎｃ２の低電圧部の開始アドレスに付与されている。
【０１０７】
以上に説明したように、本実施形態によれば、関数において、電圧変動時間と対応したＮサイクル以内に実行可能なコードを常時一定電圧メモリに配置し、Ｎサイクル以内に実行できないコードを使用時一定電圧メモリへ配置する。そして常時一定電圧メモリに配置されたコードの先頭に、使用時一定電圧メモリを一定電圧状態へさせる制御コードを挿入する。本実施形態では、上記構成により、電圧変動時間を考慮したタイミングでメモリの電源電圧を変動させるプログラムコードを生成することができる。
【０１０８】
（第二の実施形態）
以下に図面を参照して本発明の第二の実施形態について説明する。第二の実施形態では、割り込み処理を考慮した点が第一の実施形態と相違する。よって以下の第二の実施形態の説明では、第一の実施形態との相違点についてのみ説明し、第一の実施形態と同様の機能構成を有するものには第一の実施形態の説明で用いた符号と同様の符号を付与し、その説明を省略する。
【０１０９】
図２５は、割り込み処理を考慮した場合の制御コードの挿入を説明する第一のフローチャートである。
【０１１０】
図１８のステップＳ１８０５において、リストＬ１が空であった場合、コード生成装置１００は、アセンブリ５０に含まれる関数の静的コールグラフを作成する（ステップＳ２５０１）。コールグラフが作成されると、コード生成装置１００は、割込ハンドラＩＮＴ＿ＨＡＮＤＬＥＲから到達可能な関数の集合を抽出し、抽出した関数を以下の集合に分割する（ステップＳ２５０２）。コード生成装置１００は、抽出した関数をメイン関数ｆｕｎｃＭからのみ到達可能な関数、割込ハンドラＩＮＴ＿ＨＡＮＤＬＥＲからのみ到達可能な関数の集合、メイン関数ｆｕｎｃＭと割込ハンドラＩＮＴ＿ＨＡＮＤＬＥＲとの両方から到達可能な関数の集合に分割する。
【０１１１】
次のコード生成装置１００は、メイン関数ｆｕｎｃＭと割込ハンドラＩＮＴ＿ＨＡＮＤＬＥＲとの両方から到達可能な関数の複製を生成する（ステップＳ２５０３）。そしてコード生成装置１００は、メイン関数ｆｕｎｃＭからのみ到達可能な関数と、割込ハンドラＩＮＴ＿ＨＡＮＤＬＥＲからのみ到達可能な関数とから、割込ハンドラＩＮＴ＿ＨＡＮＤＬＥＲへアクセス可能とするための枝を作成し（ステップＳ２５０４）、図２７で説明する処理へ進む。
【０１１２】
以下に図２６を参照して図２５で生成されるコールグラフについて説明する。図２６は、コールグラフの一例を示す図である。図２６（Ａ）は、図２５のステップＳ２５０１で生成されたコールグラフの一例を示す。また、図２６（Ｂ）は、図２６（Ａ）で示されたコールグラフの、図２５のステップＳ２５０４完了時点でのコールグラフを示す。
【０１１３】
アセンブリ５０に含まれる関数の集合は、図５のステップＳ２５０２において、メイン関数ｆｕｎｃＭからのみ到達可能な関数の集合Ｆ１、割込ハンドラＩＮＴ＿ＨＡＮＤＬＥＲからのみ到達可能な関数の集合Ｆ２、メイン関数ｆｕｎｃＭと割込ハンドラＩＮＴ＿ＨＡＮＤＬＥＲとの両方から到達可能な関数の集合Ｆ３とに分割される。
【０１１４】
関数の集合が分割されると、図５のステップＳ２５０３において集合Ｆ３の複製である集合Ｆ３ａが生成し、集合Ｆ２から集合Ｆ３へ向かっていた枝の接続先を集合Ｆ３ａとする。次にコード生成装置１００は、図２５のステップＳ２５０４において集合Ｆ１に含まれる関数及び集合Ｆ３に含まれる関数と、割込ハンドラＩＮＴ＿ＨＡＮＤＬＥＲとを接続する枝を作成する。
【０１１５】
尚集合Ｆ３については、割り込み用と通常（割り込みがない場合）用とで関数が二種類ある扱いになっているため、スタートするノードが２つとなる。データ構造としては、ノードの管理テーブルを二種類用意する方法と、コールグラフの隣接枝のリストを四種類（出力、入力を二種類）保持する方法が考えられる。
【０１１６】
図２７は、割り込み処理を考慮した場合の制御コードの挿入を説明する第二のフローチャートである。図２７のステップＳ２７０１からステップＳ２７０９までの処理は、図１９のステップＳ１９０２からステップＳ１９１０までの処理と同様であるから説明を省略する。
【０１１７】
以上のように、本実施形態では、関数の実行中に割り込みが発生する場合を考慮して制御コードが挿入されたコードを生成することができる。
【０１１８】
（第三の実施形態）
以下に図面を参照して本発明の第三の実施形態について説明する。第三の実施形態では、関数に割り当てるメモリが複数の場合を考慮した点が第一の実施形態と相違する。よって以下の第三の実施形態の説明では、第一の実施形態との相違点についてのみ説明し、第一の実施形態と同様の機能構成を有するものには第一の実施形態の説明で用いた符号と同様の符号を付与し、その説明を省略する。
【０１１９】
第一の実施形態、第二の実施形態では、制御コードが挿入される前の関数に割り当てるメモリは１つであり、関数がメモリの境界を跨がないという前提があった。本実施形態では、制御コードを挿入する前の関数に割り当てるメモリを複数とした場合を考慮している。
【０１２０】
図２８は、関数に割り当てるメモリが複数の場合を説明するための図である。図２８では、メイン関数ｆｕｎｃＭにはメモリＡが割り当てられ、関数ｆｕｎｃ０にはメモリＢが割り当てられ、関数ｆｕｎｃ１にはメモリＣが割り当てられ、関数ｆｕｎｃ２にはメモリＡが割り当てられ、関数ｆｕｎｃ３にはメモリＢ、メモリＣが割り当てられている。
【０１２１】
図２８の例では、メモリＢには関数ｆｕｎｃ０が、メモリＣには関数ｆｕｎｃ１が配置されている。よってメイン関数ｆｕｎｃＭが関数ｆｕｎｃ０を呼び出し、関数ｆｕｎｃ０が関数ｆｕｎｃ１を呼び出し、関数ｆｕｎｃ１が関数ｆｕｎｃ３を呼び出した場合に、関数ｆｕｎｃ３の実行が完了して関数ｆｕｎｃ１に復帰するときには、関数ｆｕｎｃ１はメモリＢもメモリＣも低電圧状態とすることができない。
【０１２２】
これに対し、メイン関数ｆｕｎｃＭが関数ｆｕｎｃ０を呼び出し、関数ｆｕｎｃ０が関数ｆｕｎｃ２を呼び出し、関数ｆｕｎｃ２が関数ｆｕｎｃ３を呼び出した場合、関数ｆｕｎｃ３の実行が完了して関数ｆｕｎｃ２が復帰するときには、メモリＢには関数ｆｕｎｃ０が配置されているためメモリＢを低電圧状態とすることができ乃至かし、メモリＣにはメイン関数ｆｕｎｃＭ、関数ｆｕｎｃ０、関数ｆｕｎｃ２のいずれも配置されていないためメモリＣを低電圧状態とすることはできる。このように、関数に複数のメモリを割り当てた場合、メモリを低電圧状態にして良い条件は、メモリ毎に独立して決められる。
【０１２３】
図２９は、関数に割り当てるメモリが複数である場合のメモリ割当を説明するフローチャートである。
【０１２４】
図２９のステップＳ２９０１とステップＳ２９０２の処理は、図１４のステップＳ１４０１とステップＳ１４０２の処理と同様であるから説明を省略する。
【０１２５】
ステップＳ２９０２においてメモリの境界を跨ぐとき、コード生成装置１００は、関数を複数のメモリに割り当てる（ステップＳ２９０３）。例えばコード生成装置１００は、ステップＳ２９０１で割り当てられたメモリと、その次のメモリとに関数を割り当てても良い。ステップＳ２９０４の処理は図１４のステップＳ１４０４の処理と同様であるから説明を省略する。
【０１２６】
次に図３０を参照して本実施形態の制御コードの挿入について説明する。図３０は、関数に複数のメモリを割り当てられた場合の制御コードの挿入を説明するフローチャートである。
【０１２７】
図３０のステップＳ３００１からステップＳ３００３までの処理は、図１９のステップＳ１９０１からステップＳ１９０３までの処理と同様であるから説明を省略する。
【０１２８】
ステップＳ３００４において、コード生成装置１００は、文字列変数ｆｕｎｃｘにより指し示される関数が配置されるメモリの集合をＭｘと置き、文字列変数ｆｕｎｃを文字列変数ｆｕｎｃｘで更新する。
【０１２９】
ステップＳ３００５において、文字列変数ｆｕｎｃを、文字列変数ｆｕｎｃにより指し示される関数の呼出元の関数名で更新する。またメモリの集合を、文字列変数ｆｕｎｃにより指し示される関数が配置されたメモリの集合Ｍで更新する。よってステップＳ３００５のメモリＭとは、文字列変数ｆｕｎｃにより指し示される関数の呼出元関数が配置されたメモリの集合を示すこととなる。そしてＭｘ＼ＭをＭｘとする。尚Ｍ、Ｍｘは、メモリの集合を示し、＼は差集合を示す演算子である。
【０１３０】
ここでＭｘは、ステップＳ３００３でリストＬ２から取り出された文字列変数ｆｕｎｃが指し示す関数が配置されたメモリである。よってＭｘ＼Ｍは、ステップＳ３００２でリストＬ２から取り出された関数が配置されたメモリのうち、メイン関数からステップＳ３００２で取り出された関数の呼出元関数に至るまでに呼び出される関数が配置されたメモリに含まれないものとなる。
【０１３１】
次にコード生成装置１００は、Ｍｘが空集合であるか否かを判断する（ステップＳ３００６）。Ｍｘが空集合である場合、ステップＳ３００２で取り出された関数が配置されたメモリの全てが、メイン関数からステップＳ３００２で取り出された関数の呼出元関数に至るまでに呼び出される関数が配置されたメモリのいずれかに含まれることを示す。
【０１３２】
ステップＳ３００６においてＭｘが空集合と判断されると、コード生成装置１００は、リストＬ２が空か否かを判断する（ステップＳ３００７）。ステップＳ３００７においてリストＬ２が空でない場合、ステップＳ３００３以降の処理を繰り返す。ステップＳ３００７においてリストＬ２が空の場合、制御コードの挿入を終了する。
【０１３３】
ステップＳ３００６においてＭｘが空集合でないと判断されると、コード生成装置１００は、ステップＳ３００８に進む。ステップＳ３００８からステップＳ３０１０の処理は、図１９のステップＳ１９０８からステップＳ１９１０の処理と同様であるから説明を省略する。
【０１３４】
以上のように本実施形態では、制御コードが挿入される前の関数のアセンブリコード５５が複数のメモリに割り当てられた場合にも、第一の実施形態と同様の効果を奏することができる。
【０１３５】
（第四の実施形態）
以下に図面を参照して本発明の第四の実施形態について説明する。以下の第四の実施形態の説明では、第一の実施形態との相違点についてのみ説明し、第一の実施形態と同様の機能構成を有するものには第一の実施形態の説明で用いた符号と同様の符号を付与し、その説明を省略する。
【０１３６】
本実施形態のコード生成装置１００Ａでは、始めに全てのメモリを一定電圧状態としておき、分岐があった場合に分岐先のアセンブリコード５５が配置されたメモリ以外のメモリを全て低電圧状態とする制御を行う。
【０１３７】
図３１は、第四の実施形態のコード生成装置の動作を説明するフローチャートである。尚図３１に示す各ステップの処理の詳細は後述する。
【０１３８】
コード生成装置１００Ａは、アセンブリ５０に含まれるアセンブリコード５５と、サイクル数６１とに基づき制御コードの挿入位置を算出する（ステップＳ３１０１）。制御コードの挿入位置が算出されると、コード生成装置１００Ａは、メモリの構造情報６２と、制御コードパターン６３とに基づきメモリマップを決定する（ステップＳ３１０２）。
【０１３９】
次にコード生成装置１００Ａは、制御コードパターン６３に代入するパラメータを決定して制御コードをステップＳ３１０１で算出された位置へ挿入する（ステップＳ３１０２）。制御コードが挿入されると、コード生成装置１００Ａは、制御コード挿入後のアセンブリ５０Ａをアセンブル及びリンケージして電源制御入りバイナリ７０を出力する。
【０１４０】
以下に、本実施形態における制御コード挿入位置の算出について説明する。図３２は、図３１のステップＳ３１０１に示す制御コードの挿入位置の算出を説明するフローチャートである。尚図３２で説明する処理は、アセンブリ５０に含まれる関数のアセンブリコード５５毎に実行される。
【０１４１】
コード生成装置１００Ａは、アセンブリコード５５の開始アドレスｘからの命令の数をカウントするカウンタのカウンタ値を０とする（ステップＳ３２０１）。次にコード生成装置１００Ａは、アセンブリコード５５から命令を取得し、カウンタ値をステップＳ３２０１で設定したカウント値と取得した命令のサイクル数との和とする（ステップＳ３２０２）。ステップＳ３２０１においてカウンタ値は０であるから、ステップＳ３２０２ではカウンタ値は取得した命令のサイクル数の値となる。
【０１４２】
続いてコード生成装置１００Ａは、カウンタ値＜２Ｎサイクルであるか否かを判断する（ステップＳ３２０３）。カウンタ値が２Ｎサイクルより小さい場合、コード生成装置１００Ａは、取得した命令にリターン命令が含まれるか判断する（ステップＳ３２０４）。ステップＳ３２０４においてリターン命令が含まれていた場合、コード生成装置１００Ａは、電源Ｌｏｗ挿入位置リストから開始アドレスｘを除く（ステップＳ３２０５）。電源Ｌｏｗ挿入位置リストとは、メモリを一定電圧状態から低電圧状態へ移行させる電源制御コードの挿入位置を示したリストである。
【０１４３】
次にコード生成装置１００Ａは、アセンブリコード５５に含まれる全ての命令を走査したか否かを判断する（ステップＳ３２０６）。ステップＳ３２０６で全ての命令を走査したと判断されると、制御コード挿入位置の算出を終了する。ステップＳ３２０６で全ての命令を走査していないと判断されると、ステップＳ３２０２以降の処理を繰り返す。
【０１４４】
ステップＳ３２０３において、カウンタ値が２Ｎサイクルより大きい場合、コード生成装置１００Ａは、取得した命令にリターン命令が含まれるか否かを判断する（ステップＳ３２０７）。ステップＳ３２０７においてリターン命令が存在するとき、コード生成装置１００Ａは、電源Ｈｉｇｈ挿入位置を算出する（ステップＳ３２０８）。電源Ｈｉｇｈ挿入位置とは、メモリを低電圧状態から一定電圧状態へ移行させる電源制御コードを挿入する位置を示す。尚ステップＳ３２０７の処理の詳細は後述する。
【０１４５】
ステップＳ３２０８において電源Ｈｉｇｈ挿入位置が算出されると、コード生成装置１００Ａは、ステップＳ３２０６へ進む。
【０１４６】
ステップＳ３２０４においてリターン命令が存在しないと判断されると、コード生成装置１００Ａは、関数の呼出命令が存在するか否かを判断する（ステップＳ３２０９）。呼出命令が存在した場合、コード生成装置１００Ａは、カウンタ値を０にし（ステップＳ３２１０）、ステップＳ３２０５へ進む。呼出命令が存在しない場合、コード生成装置１００ＡはステップＳ３２０６へ進む。
【０１４７】
ステップＳ３２０７においてリターン命令が存在しない場合、コード生成装置１００Ａは、呼出命令が存在するか否かを判断する（ステップＳ３２１１）。ステップＳ３２１１で呼出命令が存在する場合、コード生成装置１００Ａは、カウンタ値を０にし、呼出命令の次のアドレスを開始アドレスｘとする。そして電源Ｌｏｗ挿入位置リストに開始アドレスｘを追加する（ステップＳ３２１２）。よって電源Ｌｏｗ挿入位置リストには、呼出命令の次のアドレスが追加される。コード生成装置１００Ａは、ステップＳ３２１２に続いてステップＳ３２０８へ進む。
【０１４８】
ステップＳ３２１１において呼出命令が存在しない場合、コード生成装置１００Ａは、ステップＳ３２０６へ進む。
【０１４９】
このように本実施形態では、関数の開始アドレス（呼出命令の分岐先）あるいは呼出命令の次の命令（リターン命令の分岐先）から２Ｎサイクル数以内に呼出命令又はリターン命令がない限りはり、自関数が使うメモリ以外のメモリを低電圧状態とするように、制御コードの挿入位置を算出する。
【０１５０】
図３３は、図３２のステップＳ３２０８に示す制御コードの挿入位置の算出を説明するフローチャートである。
【０１５１】
コード生成装置１００Ａは、ステップＳ３２０８において、呼出命令又はリターン命令のＮサイクル前に全メモリを一定電圧状態とするために、Ｎサイクル手前の位置を特定する。
【０１５２】
コード生成装置１００Ａは、アセンブリコード５５に含まれる該当する命令ノードと、サイクル数＝０と、をキューに積む。またコード生成装置１００Ａは、仮の最遠アドレスを該当する命令ノードのアドレスとする（ステップＳ３３０１）。次にコード生成装置１００Ａは、キューから命令ノードとサイクル数とを取り出す（ステップＳ３３０２）。
【０１５３】
コード生成装置１００Ａは、取り出した命令ノードが関数の先頭であるか、又はサイクル数がＮより大きいか否かを判断する（ステップＳ３３０３）。コード生成装置１００Ａは、ステップＳ３３０３において命令ノードが関数の先頭でないとき、又はサイクル数がＮより小さいと判断すると、ステップＳ３３０３で取り出した命令ノードよりも一つ前の命令ノードをキューに積む（ステップＳ３３０４）。
【０１５４】
コード生成装置１００Ａは、ステップＳ３３０３において命令ノードが関数の先頭である、又はサイクル数がＮより大きいと判断すると、ステップＳ３３０２で取り出した命令ノードのアドレスの方が仮の最遠アドレスよりも関数の先頭から遠いか否かを判断する（ステップＳ３３０５）。ステップＳ３３０５において、ステップＳ３３０２で取り出したアドレスの方が仮の最遠アドレスよりも遠いと判断された場合、コード生成装置１００Ａは、現在のアドレス（ステップＳ３３０２で取り出したアドレス）を最遠アドレスとする（ステップＳ３３０６）。
【０１５５】
次にコード生成装置１００Ａは、キューが空か否かを判断する（ステップＳ３３０７）。ステップＳ３３０７においてキューが空でない場合、ステップＳ３３０２以降の処理を繰り返す。ステップＳ３３０７においてキューが空である場合、コード生成装置１００Ａは、電源Ｈｉｇｈ挿入位置リストに最遠アドレスを追加し（ステップＳ３３０８）、処理を終了する。尚電源Ｈｉｇｈ挿入位置リストとは、メモリを低電圧状態から一定電圧状態へ移行させる電源制御コードの挿入位置を示したリストである。
【０１５６】
尚本実施形態のコード生成装置１００Ａは、図３２、図３３で説明した処理により、関数毎の電源Ｈｉｇｈ挿入位置リストをリストＬ１０、関数毎の電源Ｌｏｗ挿入位置リストをリストＬ２０として生成するものとした。
【０１５７】
次に図３４を参照して、本実施形態のメモリマップの決定について説明する。図３４は、図３１のステップＳ３１０２に示すメモリマップの決定を説明するフローチャートである。
【０１５８】
コード生成装置１００Ａは、関数毎のアセンブリコード５５を参照して低電圧部を有する関数の呼出回数を呼出回数情報として抽出する（ステップＳ３４０１）。次にコード生成装置１００Ａは、電源制御コードパターン６４から電源制御コードのコードサイズｓ＿ｖを抽出する（ステップＳ３４０２）。
【０１５９】
コード生成装置１００Ａは、ステップＳ３４０２で抽出されたコードサイズｓ＿ｖと関数サイズ情報５２とに基づきアセンブリ５０のコードサイズの補正を行う（ステップＳ３４０３）。本実施形態のコード生成装置１００Ａは、アセンブリ５０に含まれる関数のアセンブリコード５５毎に、関数の呼出回数に１を加算した値とコードサイズｓ＿ｖとの積をアセンブリコード５５のサイズに加算した結果を補正後のコードサイズとする。
【０１６０】
ステップＳ３４０４とステップＳ３４０５の処理は、図９で説明したステップＳ９０４とステップＳ９０５の処理と同様であるから説明を省略する。
【０１６１】
次に図３５、図３６を参照して本実施形態の制御コードの挿入について説明する。図３５は、図３１のステップＳ３１０３に示す制御コードの挿入を説明する第一のフローチャートである。
【０１６２】
コード生成装置１００Ａは、制御コードパターン６３に含まれる電源制御コードパターン６４に、全メモリを一定電圧状態とするパラメータを埋め込む（ステップＳ３５０１）。次にコード生成装置１００Ａは、関数毎の電源Ｈｉｇｈ挿入位置リストを含むリストＬ１０から、１つの関数の電源Ｈｉｇｈ挿入位置リストを取り出し、ｘとする（ステップＳ３５０２）。次にコード生成装置１００Ａは、ステップＳ３５０１でパラメータが埋め込まれた電源制御コードパターンをｘへ挿入する（ステップＳ３５０３）。コード生成装置１００Ａは、リストＬ１０が空か否かを判断する（ステップＳ３５０４）。
【０１６３】
ステップＳ３５０４においてリストＬ１０が空である場合、コード生成装置１００Ａは、図３６で説明する処理へ進む。ステップＳ３５０４においてリストＬ１０が空でない場合、ステップＳ３５０２以降の処理を繰り返す。
【０１６４】
図３５の処理により、アセンブリ５０にはメモリを一定電圧状態にするための電源制御コードが挿入される。
【０１６５】
図３６は、図３１のステップＳ３１０３に示す制御コードの挿入を説明する第二のフローチャートである。
【０１６６】
コード生成装置１００Ａは、関数毎の電源Ｌｏｗ挿入位置リストを含むリストＬ２０から、１つの関数の電源Ｌｏｗ挿入位置リストを取り出し、ｘとする（ステップＳ３６０１）。次にコード生成装置１００Ａは、ステップＳ３６０１で取り出されたｘと対応する関数が配置されたメモリＭＥＭ（ｘ）以外のメモリを低電圧状態とするパラメータを電源制御コードパターン６４へ埋め込む（ステップＳ３６０２）。
【０１６７】
コード生成装置１００Ａは、パラメータが挿入された電源制御コードをｘの直後へ挿入する（ステップＳ３６０３）。次にコード生成装置１００Ａは、リストＬ２０が空か否かを判断する（ステップＳ３６０４）。ステップＳ３６０４においてリストＬ２０が空の場合、コード生成装置１００Ａは制御コードの挿入を終了し、アセンブリ５０Ａを出力する。ステップＳ３６０４でリストＬ２０が空でない場合、ステップＳ３６０１以降の処理を繰り返す。
【０１６８】
図３６の処理により、アセンブリ５０には、不要なメモリを低電圧状態にするための電源制御コードが挿入される。
【０１６９】
以下に図３７を参照して本実施形態のコード生成装置１００Ａにより生成された電源制御入りバイナリ７０が実装されたＬＳＩ等の動作を説明する。図３７は、第四の実施形態のコード生成装置により生成された電源制御入りバイナリが実装された半導体集積回路の動作の一例を説明する図である。
【０１７０】
図３７では、メモリに配置された関数の実行状況と、メモリの電源電圧の状態とを対応させて示している。メモリＡは常時一定電圧メモリであり、メモリＢ、Ｃ、Ｄは使用時一定電圧メモリである。
【０１７１】
図３７の例では、メモリＡに配置されたメモリ関数ｆｕｎｃＭによりメモリＢに配置された関数ｆｕｎｃ１が呼び出されＮサイクル手前で、全てのメモリ（メモリＡ〜Ｄ）が一定電圧状態とされる。また図３７では、関数ｆｕｎｃ１が呼び出されると、関数ｆｕｎｃ１が配置されたメモリＢ以外のメモリは低電圧状態とされる。そして、関数ｆｕｎｃ１から関数ｆｕｎｃ３が呼び出されるＮサイクル手前で、再度全メモリが一定電圧状態とされる。
【０１７２】
関数ｆｕｎｃ３は、呼び出されてから２Ｎサイクル以内に関数ｆｕｎｃ１に復帰するため、関数ｆｕｎｃ３が呼び出された後も関数ｆｕｎｃ３が配置されたメモリＤ以外のメモリは一定電圧状態のままとなる。
【０１７３】
以上に説明したように、本実施形態によれば、電圧変動時間を考慮したタイミングでメモリの電源電圧を変動させるプログラムコードを生成することができる。
【０１７４】
（第五の実施形態）
以下に図面を参照して本発明の第五の実施形態について説明する。以下の第五の実施形態の説明では、第一の実施形態との相違点についてのみ説明し、第一の実施形態と同様の機能構成を有するものには第一の実施形態の説明で用いた符号と同様の符号を付与し、その説明を省略する。
【０１７５】
本発明の第五の実施形態では、メイン関数からある一定階層までは常時一定電圧メモリに配置され、常時一定電圧メモリに配置された関数の直下の関数が常時一定電圧メモリと使用時一定電圧メモリとに配置された場合について考える。
【０１７６】
本実施形態では、上記場合において、常時一定電圧メモリと使用時一定電圧メモリとに配置された関数より下の階層では、呼出元関数が配置されている使用時一定電圧メモリと同一のメモリを使用し、かつ、同一の使用時一定電圧メモリを使用する複数の呼出元関数が存在する場合（呼出元関数が一つである場合も含む）に常時一定電圧メモリを使用しない前提とする。
【０１７７】
以下に図３８を参照して上記前提について説明する。図３８は、第五の実施形態の前提を説明するための図である。
【０１７８】
図３８に示す配置では、メイン関数ｆｕｎｃＭと、メイン関数ｆｕｎｃＭの一層下の階層である関数ｆｕｎｃＢ１、関数ｆｕｎｃＢ２とが常時一定電圧メモリＡに配置されている。関数ｆｕｎｃＢ１の直下の関数は、関数ｆｕｎｃＣ１、関数ｆｕｎｃＣ２である。関数ｆｕｎｃＢ２の直下の関数は、関数ｆｕｎｃＣ３である。関数ｆｕｎｃＣ１は、常時一定電圧メモリであるメモリＡと使用時一定電圧メモリであるメモリＢとに、関数ｆｕｎｃＣ２は、常時一定電圧メモリであるメモリＡと使用時一定電圧メモリであるメモリＣとに、関数ｆｕｎｃＣ３は、常時一定電圧メモリであるメモリＡと使用時一定電圧メモリであるメモリＤとに、それぞれ配置されている。関数ｆｕｎｃＣ１、関数ｆｕｎｃＣ２、関数ｆｕｎｃＣ３においてメモリＡに配置されている部分は、それぞれの関数の一定電圧部である。
【０１７９】
図３８では関数ｆｕｎｃＣ３の一定電圧部をＣ３−１と図示した。関数ｆｕｎｃＣ１、関数ｆｕｎｃＣ２、関数ｆｕｎｃＣ３において、それぞれ、メモリＢ、メモリＣ、メモリＤに配置されている部分は、それぞれの関数の低電圧部である。図３８では関数ｆｕｎｃＣ３の低電圧部をＣ３−２と図示した。
【０１８０】
関数ｆｕｎｃＣ１の下層には、関数ｆｕｎｃＤ１、関数ｆｕｎｃＤ２が配置され、さらにその下層には関数ｆｕｎｃＥ１、関数ｆｕｎｃＥ２が配置されている。関数ｆｕｎｃＣ２の下層には、関数ｆｕｎｃＤ３が配置され、さらにその下層には関数ｆｕｎｃＥ３が配置されている。関数ｆｕｎｃＣ３の下層には、関数ｆｕｎｃＤ４が配置され、さらにその下層には関数ｆｕｎｃＥ４が配置されている。
【０１８１】
関数ｆｕｎｃＥ１の呼出元関数は、関数ｆｕｎｃＤ１と関数ｆｕｎｃＤ２である。よって関数ｆｕｎｃＥ１は、関数ｆｕｎｃＤ１と関数ｆｕｎｃＤ２と同一の使用時一定電圧メモリであるメモリＢのみに配置されている。関数ｆｕｎｃＥ２の呼出元関数は、関数ｆｕｎｃＤ２と関数ｆｕｎｃＤ３であり、これらの関数の配置されているメモリは、それぞれメモリＢ、メモリＣと異なる。したがって、どちらのメモリのみを使用している状態でも関数呼出が正常に行えるように、関数ｆｕｎｃＥ２は、常時一定電圧メモリであるメモリＡおよび、使用時一定電圧メモリであるメモリＢ又はメモリＣの何れかに配置される。
【０１８２】
図３８の例では関数ｆｕｎｃＥ２は、メモリＡと関数ｆｕｎｃＤ２と同一の使用時一定電圧メモリであるメモリＢとに配置されている。関数ｆｕｎｃＤ１、関数ｆｕｎｃＤ２は、それぞれの呼出元関数である関数ｆｕｎｃＣ１と同一の使用時一定電圧メモリであるメモリＢに配置されている。
【０１８３】
メモリＣにおいても、関数ｆｕｎｃＥ３、関数ｆｕｎｃＤ３は、どちらの関数も、メモリＣ以外に配置されている関数から関数呼出を行われる可能性がある。このため関数ｆｕｎｃＥ３、関数ｆｕｎｃＤ３は、常時一定電圧メモリＡおよび、それぞれの呼出元関数と同一のメモリＣに配置されている。メモリＤにおいても、関数ｆｕｎｃＥ４、関数ｆｕｎｃＤ４はそれぞれの呼出元関数と同位置のメモリＤに配置されている。
【０１８４】
図３８に示す配置において、例えば関数ｆｕｎｃＤ３からメイン関数ｆｕｎｃＭに復帰するまでの経路は、以下の２通りが考えられる。
（１）関数ｆｕｎｃＤ３（メモリＣ）→関数ｆｕｎｃＣ２（低電圧部）（メモリＣ）→関数ｆｕｎｃＣ２（一定電圧部）（メモリＡ）→関数ｆｕｎｃＢ１（メモリＡ）→メイン関数ｆｕｎｃＭ（メモリＡ）
（２）関数ｆｕｎｃＤ３（メモリＣ）→関数ｆｕｎｃＣ３（低電圧部Ｃ３−２）（メモリＤ）→関数ｆｕｎｃＣ３（一定電圧部Ｃ３−１）（メモリＡ）→関数ｆｕｎｃＢ２（メモリＡ）→メイン関数ｆｕｎｃＭ（メモリＡ）
【０１８５】
このうち、まず（１）の経路でメイン関数ｆｕｎｃＭまで復帰するように動作した場合について考える。
【０１８６】
関数ｆｕｎｃＣ２でメモリＣを使用する。よって第一の実施形態のコード生成装置１００は図５のステップＳ５３において、関数ｆｕｎｃＤ３から復帰後の位置にメモリＣを低電圧状態とするコードは挿入しない。しかし、関数ｆｕｎｃＣ２より後ではメモリＣを使用しないため、第一の実施形態のコード生成装置１００は、関数ｆｕｎｃＣ２から復帰後の位置にメモリＣを低電圧状態とするコードは挿入する。したがって、メモリＣが低電圧状態となってからメイン関数ｆｕｎｃＭまで戻ることになる。
【０１８７】
次に、（２）の経路でメイン関数ｆｕｎｃＭまで復帰するように動作した場合について考える。
【０１８８】
関数ｆｕｎｃＤ３から関数ｆｕｎｃＣ３の低電圧部Ｃ３−２に復帰した以降は、メモリＣは不使用である。しかしながら、関数ｆｕｎｃＤ３にはメモリＣを低電圧状態とするコードは挿入されていない。また関数ｆｕｎｃＣ３、関数ｆｕｎｃＢ２、メイン関数ｆｕｎｃＭにおいてメモリＣは関係せず制御の対象外である。このためメモリＣが一定電圧状態のままメイン関数ｆｕｎｃＭまで戻ることになる。
【０１８９】
そこで本実施形態では、関数の呼出関係に従って下層の関数からメイン関数へ復帰する際に、使用時一定電圧メモリに配置された関数の実行後その使用時一定電圧メモリが使用されないことが確認できる場合に限り、該当する使用時一定電圧メモリを低電圧状態とする。尚本実施形態において、下層の関数からメイン関数へ復帰する際に、一度使用された使用時一定電圧メモリが再度使用する場合は、再び該当する使用時一定電圧メモリを一定電圧状態とする電源制御コードを通る。このため本実施形態では、一度使用された使用時一定電圧メモリが再度使用されるか否かを判別できる。
【０１９０】
本実施形態では、このようにメイン関数に戻るまでの間に再び使用されることのない使用時一定電圧メモリを低電圧状態とすることで、消費電力の低減に貢献することができる。
【０１９１】
図３９は、第五の実施形態のコード生成装置の機能構成を説明する図である。本実施形態のコード生成装置１００Ｂは、コード取得部１１０、配置判定部１２０、スリープ解除コード挿入処理部１３０、スリープコード挿入処理部１４０を有する。
【０１９２】
コード取得部１１０は、本実施形態のコード生成装置１００Ｂに入力されるアセンブリ５０から関数のアセンブリコードを取得する。配置判定部１２０は、後述するメモリマップ情報５７に基づき、取得した関数のアセンブリコードが使用時一定電圧メモリと常時一定電圧メモリの両方に配置されているか否かを判定する。
【０１９３】
尚本実施形態のコード生成装置１００Ｂは、図４０に示すように、図３に示す物理領域をメモリマップ情報５７のテーブルとして有している。図４０は、第五の実施形態におけるメモリマップ情報の一例を示す図である。
【０１９４】
スリープ解除コード挿入処理部１３０は、配置判定部１２０による判定結果に基づき、使用時一定電圧メモリの低電圧状態が解除されるようにする。例えばスリープ解除コード挿入処理部１３０は、電源制御コードによりメモリが低電圧状態（以下、スリープ状態）から一定電圧状態となるように、スリープ解除コードを生成し、関数のコードへ挿入する。スリープ解除コード挿入処理部１３０の処理の詳細は後述する。
【０１９５】
スリープコード挿入処理部１４０は、メモリマップ情報５７と電源制御コードパターン６４とに基づき、関数のアセンブリコードに電源制御コードを挿入し、使用時一定電圧メモリが低電圧状態となるようにする。ここで挿入される電源制御コードは、メモリをスリープ状態とする電源制御コード（以下、スリープコード）である。スリープコード挿入処理部１４０の処理の詳細は後述する。
【０１９６】
本実施形態のコード生成装置１００Ｂにおいて、スリープ解除コードとスリープコードとが挿入された関数のアセンブリコードは、電源制御コード挿入後のアセンブリ５０Ａとして出力される。
【０１９７】
次に図４１を参照して本実施形態のコード生成装置１００Ｂによる制御コードの挿入について説明する。図４１は、第五の実施形態のコード生成装置による制御コードの挿入を説明するフローチャートである。
【０１９８】
図４１に示す処理は、図５のステップＳ５３において実行される処理である。尚本実施形態のコード生成装置１００Ｂは、図５のステップＳ５１、ステップＳ５２と同様の処理を実行した後に、図４１に示す処理を開始する。そして図４１に示す処理が完了すると、制御コードが挿入されたアセンブリ５０Ａが出力される。コード生成装置１００Ｂは、アセンブリ５０Ａが出力された後、図５のステップＳ５４と同様の処理を行い、電源制御入りバイナリ７０を出力する。本実施形態のコード生成装置１００Ｂは、図４１に示す処理を各関数毎に実行する。
【０１９９】
本実施形態のコード生成装置１００Ｂは、ステップＳ５１においてコード取得部１１０により、関数毎のアセンブリコード５５を取得し、分割位置を算出する。以下の説明では、関数ｆｕｎｃＸのアセンブリコードを取得したものとする。
【０２００】
コード生成装置１００Ｂは、ステップＳ５２において、分割位置とパラメータ６０に含まれるメモリユニット１０の構造情報６２とに基づき分割されたアセンブリコード５５を配置するためのメモリマップを決定し、メモリマップ情報５７を出力する。
【０２０１】
次にコード生成装置１００Ｂは、ステップＳ５３へ進む。尚図４１におけるステップＳ４１０１からステップＳ４１０６までの処理は、配置判定部１２０とスリープ解除コード挿入処理部１３０とにより実行される処理である。またステップＳ４１０７からステップＳ４１０９までの処理は、スリープコード挿入処理部１４０により実行される処理である。
【０２０２】
コード生成装置１００ＢがステップＳ５３の実行を開始すると、配置判定部１２０は、分割されたアセンブリコード５５と、メモリマップ情報５７とに基づき、関数ｆｕｎｃＸのアセンブリコード５５が使用時一定電圧メモリと常時一定電圧メモリとの両方を使用するか否かを判定する（ステップＳ４１０１）。
【０２０３】
ステップＳ４１０１において、関数ｆｕｎｃＸが使用時一定電圧メモリと常時一定電圧メモリのいずれかのみを使用する場合、後述するステップＳ４１０６へ進む。
【０２０４】
ステップＳ４１０１において、使用時一定電圧メモリと常時一定電圧メモリとの両方を使用する場合、コード生成装置１００Ｂは、ステップＳ５１で算出した分割位置に従って関数ｆｕｎｃＸのアセンブリコード５５を分割する（ステップＳ４１０２）。分割されたアセンブリコード５５の前半部分を一定電圧部Ｘａ、後半部分を低電圧部Ｘｂとする。
【０２０５】
続いて、コード生成装置１００Ｂは、ステップＳ５２で決定したメモリマップに基づき電源制御コードパターン６４とジャンプ制御コードパターン６５とにパラメータを埋め込む（ステップＳ４１０３〜４１０６）。
【０２０６】
スリープ解除コード挿入処理部１３０は、一定電圧部Ｘａの先頭の電源制御コードパターン６４に、一定電圧状態とするメモリを指定する「低電圧部Ｘｂが配置された使用時一定電圧メモリ」をパラメータとして埋め込む（ステップＳ４１０３）。本実施形態では、一定電圧状態とするパラメータが埋め込まれた電源制御コードパターンをスリープ解除コードとする。本実施形態のスリープ解除コードは、例えば低電圧部Ｘｂが配置されたメモリを一定電圧状態（使用できる状態）とする。
【０２０７】
次にコード生成装置１００Ｂは、関数ｆｕｎｃＸの低電圧部Ｘｂの開始アドレスを表すラベルｆｕｎｃＸ＿Ｌを挿入する（ステップＳ４１０４）。さらにコード生成装置１００Ｂは、ジャンプ制御コードパターン６５に、関数ｆｕｎｃＸの低電圧部の開始アドレスを示すラベルｆｕｎｃＸ＿Ｌを埋め込む（ステップＳ４１０５）。
【０２０８】
以上により、関数ｆｕｎｃＸのアセンブリコード５５に使用時一定電圧メモリを使用できるようにするためのスリープ解除コードが挿入される。
【０２０９】
次にコード生成装置１００Ｂは、関数ｆｕｎｃＸ内の関数呼出について、使用時一定電圧メモリを低電圧状態とするためのスリープコードを挿入する処理を実行する（ステップＳ４１０６）。尚ステップＳ４１０６の処理では、以下に説明するステップＳ４１０７〜４１０９の処理を行う。
【０２１０】
本実施形態のコード生成装置１００Ｂは、関数ｆｕｎｃＸ内の命令（コード）を一命令ごと走査し、ｃａｌｌ命令か否かを判定する（ステップＳ４１０７）。ステップＳ４１０７において命令がｃａｌｌ命令でない場合、ステップＳ４１０６の処理を終了する。
【０２１１】
ステップＳ４１０７において命令がｃａｌｌ命令の場合、スリープコード挿入処理部１４０は、呼出先関数が配置されているメモリ（以下、呼出先メモリ）が、関数ｆｕｎｃＸのｃａｌｌ命令が配置されたメモリと同一のメモリ又は常時一定電圧メモリであるか否かを判断する（ステップＳ４１０８）。ステップＳ４１０８において、呼出先関数が配置されているメモリがｃａｌｌ命令が配置されたメモリと同一のメモリ又は常時一定電圧メモリである場合、ステップＳ４１０６の処理を終了する。
【０２１２】
ステップＳ４１０８において、呼出先メモリがｃａｌｌ命令が配置されたメモリと同一のメモリ又は常時一定電圧メモリでない場合、スリープコード挿入処理部１４０は、関数ｆｕｎｃＸのｃａｌｌ命令の次に呼出先メモリの電源を低電圧とする電源制御コードを挿入し（ステップＳ４１０９）、ステップＳ４１０６の処理を終了する。
【０２１３】
例えば、関数ｆｕｎｃＸのアセンブリコード５５中の低電圧部ＸｂのコードがメモリＹへ配置されており、関数ｆｕｎｃＸのアセンブリコード５５中で、メモリＺに配置された関数ｆｕｎｃＹを呼び出す場合を考える。
【０２１４】
コード生成装置１００Ｂは、関数ｆｕｎｃＹの実行後に関数ｆｕｎｃＸに復帰する際に、メモリＺを低電圧状態とする。すなわちスリープコード挿入処理部１４０は、電源制御コードパターン６４に、低電圧状態とするメモリを指定する「メモリＺ」をパラメータとして埋め込んでスリープコードを生成する。そしてスリープコード挿入処理部１４０は、関数ｆｕｎｃＸのアセンブリコード５５中の関数ｆｕｎｃＹを呼び出す関数呼出命令の直後に生成したスリープコードを挿入する。
【０２１５】
以下に、図４２乃至図４６を参照して、図４１に示す処理についてさらに説明する。
【０２１６】
図４２は、スリープ解除コード挿入処理部とスリープコード挿入処理部の処理を説明する図である。
【０２１７】
図４１のステップＳ４１０１において、関数ｆｕｎｃＸが常時一定電圧メモリか使用時一定電圧メモリのいずれかのみを使用する場合、スリープ解除コード挿入処理部１３０はスリープ解除コードを挿入しない。また関数ｆｕｎｃＸが常時一定電圧メモリと使用時一定電圧メモリとを使用する場合、関数ｆｕｎｃＸは、一定電圧部Ｘａと低電圧部Ｘｂとに分割される。スリープ解除コード挿入処理部１３０は、一定電圧部Ｘａの先頭に、低電圧部Ｘｂが配置されたメモリを一定電圧状態とするスリープ解除コードを挿入する。尚図４２では、低電圧部Ｘｂが配置された使用時一定電圧メモリをメモリＸＢとした。
【０２１８】
スリープコード挿入処理部１４０は、関数ｆｕｎｃＸのアセンブリコード５５にｃａｌｌ命令が存在する場合、呼出先メモリがｃａｌｌ命令が配置されたメモリと同一のメモリ又は常時一定電圧メモリであるか否かを判断する。呼出先メモリがｃａｌｌ命令が配置されたメモリと同一のメモリ又は常時一定電圧メモリである場合、スリープコード挿入処理部１４０はスリープコードを挿入しない。
【０２１９】
呼出先メモリがｃａｌｌ命令が配置されたメモリと同一のメモリ又は常時一定電圧メモリでない場合、スリープコード挿入処理部１４０は関数ｆｕｎｃＸのｃａｌｌ命令の次に呼出先メモリを低電圧状態とするスリープコードを挿入する。
【０２２０】
図４２のように、関数ｆｕｎｃＸのｃａｌｌ命令がメモリＸに配置されており、呼出先メモリがメモリＹである場合、スリープコード挿入処理部１４０は関数ｆｕｎｃＸのｃａｌｌ命令の次にメモリＹを低電圧状態とするスリープコードを挿入する。
【０２２１】
このようにスリープコードを挿入することで、関数ｆｕｎｃＹから関数ｆｕｎｃＸに復帰する際にメモリＹを低電圧状態とすることができ、消費電力の低減に貢献することができる。
【０２２２】
以下にスリープ解除コード挿入処理部１３０とスリープコード挿入処理部１４０の処理について、図３８を例としてさらに説明する。
【０２２３】
図４３は、関数ｆｕｎｃＸがメイン関数ｆｕｎｃＭの場合を示す図である。
【０２２４】
メイン関数ｆｕｎｃＭは常時一定電圧メモリのみ使用するように配置されており、低電圧部が割り当てられる使用時一定電圧メモリへのジャンプ制御コードと、低電圧部が割り当てられた使用時一定電圧メモリを一定電圧状態とする電源制御コードの挿入は不要である。したがって、関数ｆｕｎｃＸがメイン関数ｆｕｎｃＭの場合、図４１では、ステップＳ４１０１からステップＳ４１０６へ進む。
【０２２５】
ステップＳ４１０７において、メイン関数ｆｕｎｃＭには、関数ｆｕｎｃＢ１を呼び出すｃａｌｌ命令が存在する。よってステップＳ４１０８へ進む。ステップＳ４１０８では、呼出先関数である関数ｆｕｎｃＢ１が配置されているメモリは、常時一定電圧メモリである。よって使用時一定電圧メモリを低電圧状態とする電源制御コードを挿入は不要となり、ステップＳ４１０６の処理を終了する。
【０２２６】
図４４は、関数ｆｕｎｃＸが関数ｆｕｎｃＢ１の場合を示す図である。
【０２２７】
関数ｆｕｎｃＢ１も、メイン関数ｆｕｎｃＭと同様に常時一定電圧メモリに配置されており、使用時一定電圧メモリへのジャンプ制御コードと低電圧部が割り当てられた使用時一定電圧メモリを一定電圧状態とする電源制御コードの挿入は不要である。
【０２２８】
したがって、関数ｆｕｎｃＸが関数ｆｕｎｃＢ１の場合、図４１では、ステップＳ４１０１からステップＳ４１０６へ進む。
【０２２９】
ステップＳ４１０７において、関数ｆｕｎｃＢ１には、関数ｆｕｎｃＣ１を呼び出すｃａｌｌ命令が存在する。よってステップＳ４１０８へ進む。ステップＳ４１０８において、関数ｆｕｎｃＣ１は使用時一定電圧メモリＢに配置されている。メモリＢは、関数ｆｕｎｃＢ１が配置されているメモリと同一ではなく、また常時一定電圧メモリではない。よってステップＳ４１０９へ進む。
【０２３０】
関数ｆｕｎｃＣ１が実行された後にメイン関数ｆｕｎｃＭに戻るまでにメモリＢは使用されない。よってステップＳ４１０９において、関数ｆｕｎｃＢ１のｃａｌｌ命令の次にメモリＢを低電圧状態とする電源制御コードが挿入される。
【０２３１】
図４５は、関数ｆｕｎｃＸが関数ｆｕｎｃＤ２の場合を示す図である。
【０２３２】
関数ｆｕｎｃＤ２は、使用時一定電圧メモリのみ使用するように配置されている。したがって、他の使用時一定電圧メモリを一定電圧状態とする電源制御コードの挿入は不要である。したがって、関数ｆｕｎｃＸが関数ｆｕｎｃＤ２の場合、図４１では、ステップＳ４１０１からステップＳ４１０６へ進む。
【０２３３】
ステップＳ４１０７において、関数ｆｕｎｃＤ２には、関数ｆｕｎｃＥ１、関数ｆｕｎｃＥ２と関数ｆｕｎｃＥ３を呼び出すｃａｌｌ命令が存在する。よってステップＳ４１０８へ進む。
【０２３４】
ステップＳ４１０８において、関数ｆｕｎｃＥ１、関数ｆｕｎｃＥ２は関数ｆｕｎｃＤ２と同一の使用時一定電圧メモリＢに配置されている。すなわち関数ｆｕｎｃＥ１、関数ｆｕｎｃＥ２が関数ｆｕｎｃＤ２に復帰した後もメモリＢを使用するため、関数ｆｕｎｃＤ２にメモリＢを低電圧状態とする電源制御コードを挿入せずにステップＳ４１０６の処理を終了する。
【０２３５】
一方、関数ｆｕｎｃＥ３は関数ｆｕｎｃＤ２と別の使用時一定電圧メモリＣに配置されている。よってステップＳ４１０９へ進む。関数ｆｕｎｃＥ３が関数ｆｕｎｃＤ２へ復帰した後はメモリＢを使用するため、ステップＳ４１０９では、関数ｆｕｎｃＤ２における関数ｆｕｎｃＥ３のｃａｌｌ命令の次にメモリＣを低電圧状態とする電源制御コードが挿入される。
【０２３６】
図４６は、関数ｆｕｎｃＸが関数ｆｕｎｃＣ３の場合を示す図である。
【０２３７】
関数ｆｕｎｃＣ３は、常時一定電圧メモリであるメモリＡと、使用時一定電圧メモリであるメモリＤとを使用するように配置されている。したがって、図４１のステップＳ４１０１からステップＳ４１０２以降の処理へ進む。
【０２３８】
関数ｆｕｎｃＣ３は、関数サイズ情報５２に基づき一定電圧部Ｃ３−１と低電圧部Ｃ３−２に分割される。一定電圧部Ｃ３−１はメモリＡへ、低電圧部Ｃ３−２はメモリＤへ割り当てられる。
【０２３９】
関数ｆｕｎｃＣ３が分割されると、スリープ解除コード挿入処理部１３０は、低電圧部Ｃ３−２が配置されるメモリＤを一定電圧状態とするためのスリープ解除コードを一定電圧部Ｃ３−１の先頭に挿入する。またスリープ解除コード挿入処理部１３０は、低電圧部Ｃ３−２の先頭にラベル付けを行い、一定電圧部Ｃ３−１の最後にメモリＤへのジャンプ制御コードを挿入する。
【０２４０】
関数ｆｕｎｃＣ３には、関数ｆｕｎｃＤ３と関数ｆｕｎｃＤ４を呼び出すｃａｌｌ命令が存在する。関数ｆｕｎｃＤ４は、関数ｆｕｎｃＣ３と同一の使用時一定電圧メモであるメモリＤに配置されており、関数ｆｕｎｃＤ４は復帰後メモリＤを使用する。よってスリープコード挿入処理部１４０は、関数ｆｕｎｃＣ３のアセンブリコード中に関数ｆｕｎｃＤ４のｃａｌｌ命令の次にメモリＤを低電圧状態とするスリープコードは挿入しない。
【０２４１】
一方、関数ｆｕｎｃＤ３は関数ｆｕｎｃＣ３と別の使用時一定電圧メモリであるメモリＣに配置されており、関数ｆｕｎｃＤ３から関数ｆｕｎｃＣ３に復帰した後はメモリＣを使用しない。よってスリープコード挿入処理部１４０は、関数ｆｕｎｃＣ３のアセンブリコード中において、関数ｆｕｎｃＤ３のｃａｌｌ命令の直後にメモリＣを低電圧状態とするスリープコードを挿入する。
【０２４２】
以上に説明したように、本実施形態では、呼出元関数が配置されたメモリと呼出先関数が配置された呼出先メモリとが異っており、呼出先関数から呼出元関数へ復帰した後に呼出先メモリが再度使用されない場合に、呼出元関数のアセンブリコード５５中のｃａｌｌ命令の直後に呼出先メモリを低電圧状態とするスリープコードを挿入する。本実施形態では、これにより呼出先関数が呼出元関数に復帰する際に呼出先メモリを低電圧状態とすることができ、消費電力の低減に貢献することができる。
【０２４３】
（第六の実施形態）
以下に図面を参照して本発明の第六の実施形態について説明する。以下の第六の実施形態の説明では、第五の実施形態との相違点についてのみ説明し、第五の実施形態と同様の機能構成を有するものには第五の実施形態の説明で用いた符号と同様の符号を付与し、その説明を省略する。
【０２４４】
本発明の第六の実施形態では、第五の実施形態同様、メイン関数からある一定階層までは常時一定電圧メモリに配置され、常時一定電圧メモリに配置された関数の直下の関数が常時一定電圧メモリと使用時一定電圧メモリとに配置された場合について考える。
【０２４５】
また、上記場合において、常時一定電圧メモリと使用時一定電圧メモリとに配置された関数より下の階層では、呼出元関数が配置されている使用時一定電圧メモリと同一のメモリを使用し、かつ、同一の使用時一定電圧メモリを使用する複数の呼出元関数が存在する場合（呼出元関数が一つである場合も含む）に常時一定電圧メモリを使用しない前提も、第五の実施形態同様である。
【０２４６】
図４７は、第六の実施形態の前提を説明するための図である。図４７（Ａ）は、本実施形態における関数の呼出関係を示している。図４７（Ｂ）は、図４７（Ａ）に示す呼出関係に基づきメモリマップを生成した結果を示している。図４７の状態において、第五の実施形態のコード生成装置１００Ｂにより制御コードの挿入を行うと、以下のようにメモリＢ、Ｃが低電圧状態となるようにスリープコードが挿入される。
【０２４７】
メモリＢが低電圧状態となるとき：
（１）関数ｆｕｎｃＡ２から関数ｆｕｎｃＭＡＩＮに復帰するとき
（２）関数ｆｕｎｃＡ５から関数ｆｕｎｃＭＡＩＮに復帰するとき
（３）関数ｆｕｎｃＢ１から関数ｆｕｎｃＡ１に復帰するとき
（４）関数ｆｕｎｃＢ２から関数ｆｕｎｃＡ３に復帰するとき
（５）関数ｆｕｎｃＤ１から関数ｆｕｎｃＣ１に復帰するとき
（６）関数ｆｕｎｃＣ２から関数ｆｕｎｃＢ３に復帰するとき
【０２４８】
メモリＣが低電圧状態となるとき：
（１）関数ｆｕｎｃＡ１から関数ｆｕｎｃＭＡＩＮに復帰するとき
（２）関数ｆｕｎｃＡ３から関数ｆｕｎｃＭＡＩＮに復帰するとき
（３）関数ｆｕｎｃＡ４から関数ｆｕｎｃＭＡＩＮに復帰するとき
（４）関数ｆｕｎｃＣ１から関数ｆｕｎｃＢ１に復帰するとき
（５）関数ｆｕｎｃＢ５から関数ｆｕｎｃＢ４に復帰するとき
【０２４９】
上記のタイミングでメモリＢ、メモリＣが低電圧状態となるように制御コードが挿入されたプログラムにおいて、関数ｆｕｎｃＭＡＩＮ、関数ｆｕｎｃＡ１、関数ｆｕｎｃＢ１、関数ｆｕｎｃＣ１、関数ｆｕｎｃＤ１の順に関数が呼び出される場合を考える。
【０２５０】
この場合、関数ｆｕｎｃＤ１から関数ｆｕｎｃＣ１に復帰するときにメモリＢは低電圧状態となる。続いて、関数ｆｕｎｃＣ１から関数ｆｕｎｃＢ１に復帰しようとするが、このときメモリＢは既に低電圧状態となっている。
【０２５１】
したがって、このプログラムを実行しているプロセッサが関数ｆｕｎｃＣ１から関数ｆｕｎｃＢ１へ復帰するという命令を実行しようした場合に、プロセッサはメモリＢへアクセスすることができない。このためプロセッサは命令を得ることができず、正しく動作しなくなる虞がある。
【０２５２】
本実施形態では、どのようなメモリマップが得られた場合でも、プロセッサが命令を得て正しく動作することができるように制御コードを生成する。
【０２５３】
図４８は、第六の実施形態のコード生成装置の機能構成を説明する図である。本実施形態のコード生成装置１００Ｃは、第五の実施形態のコード生成装置１００Ｂの有する各部に加え、スリープ可能表作成部１５０を有する。
【０２５４】
本実施形態のコード生成装置１００Ｃは、このスリープ可能表作成部１５０により作成されたテーブルに基づき制御コードを挿入する。
【０２５５】
本実施形態のスリープ可能表作成部１５０は、関数呼出関係情報５８、メモリマップ５７により、関数ｆに至るまでに使用しうる全ての使用時一定電圧メモリの集合を示すテーブルであるＵＰＦＭ（ｆ）を作成する。また本実施形態のスリープ可能表作成部１５０は、ＵＰＦＭ（ｆ）に基づき、関数ｇから関数ｆへ復帰するときに、関数ｇの配置されているメモリを低電圧状態にしてもよい否かを示すテーブルであるＰｏｗｅｒＯｆｆ（ｆ，ｇ）を作成する。作成された上記２つのテーブルは、本実施形態のコード生成装置１００Ｃの有する補助記憶装置１０４又はメモリ装置１０５の所定の領域へ記憶される。スリープ可能表作成部１５０による上記２つのテーブルの作成の詳細は後述する。
【０２５６】
尚本実施形態の関数呼出関係情報５８は、アセンブリ５０に含まれる各関数における呼出関係を示すものである。本実施形態の関数呼出関係情報５８は、予めコード生成装置１００Ｃに与えられるものであっても良いし、コード生成装置１００Ｃがアセンブリ５０から生成したものであっても良い。
【０２５７】
次に図４９を参照して本実施形態のコード生成装置１００Ｃによる制御コードの挿入について説明する。図４９は、第六の実施形態のコード生成装置による制御コードの挿入を説明するフローチャートである。
【０２５８】
図４９に示す処理は、図５のステップＳ５３において実行される処理である。尚本実施形態のコード生成装置１００Ｃは、図５のステップＳ５１、ステップＳ５２と同様の処理を実行した後に、図４９に示す処理を開始する。そして図４９に示す処理が完了すると、制御コードが挿入されたアセンブリ５０Ａが出力される。
【０２５９】
コード生成装置１００Ｃは、アセンブリ５０Ａが出力された後、図５のステップＳ５４と同様の処理を行い、電源制御入りバイナリ７０を出力する。本実施形態のコード生成装置１００Ｃは、図４９に示す処理を各関数毎に実行する。
【０２６０】
本実施形態のコード生成装置１００Ｃは、ステップＳ５１においてコード取得部１１０により、関数毎のアセンブリコード５５を取得し、分割位置を算出する。以下の説明では、関数ｆｕｎｃＸのアセンブリコードを取得したものとする。
【０２６１】
コード生成装置１００Ｃは、ステップＳ５２において、分割位置とパラメータ６０に含まれるメモリユニット１０の構造情報６２とに基づき分割されたアセンブリコード５５を配置するためのメモリマップを決定し、メモリマップ情報５７を出力する。
【０２６２】
次にコード生成装置１００Ｃは、ステップＳ５３へ進み、ステップＳ４９０１以降の処理を実行する。尚図４９におけるステップＳ４９０１からステップＳ４９０６までの処理は、配置判定部１２０、スリープ解除コード挿入処理部１３０、スリープ可能表作成部１５０により実行される処理である。またステップＳ４９０８からステップＳ４９１０までの処理は、スリープコード挿入処理部１４０により実行される処理である。
【０２６３】
コード生成装置１００ＣがステップＳ５３の実行を開始すると、スリープ可能表作成部１５０は、ステップＳ５０を実行してＰｏｗｅｒＯｆｆ（ｆ，ｇ）を作成する（ステップＳ４９０１）。尚ステップＳ５０の詳細は後述する。
【０２６４】
ステップＳ４９０２からステップＳ４９０７までの処理は、図４１のステップＳ４１０１からステップＳ４１０６までの処理と同様であるから説明を省略する。
【０２６５】
ステップＳ４９０７の処理では、スリープコード挿入処理部１４０が、以下に説明するステップＳ４９０８〜４９１０の処理を行う。
【０２６６】
本実施形態のコード生成装置１００Ｃは、関数ｆｕｎｃＸ内の命令（コード）を一命令ごと走査し、ｃａｌｌ命令か否かを判定する（ステップＳ４９０８）。ステップＳ４９０８において命令がｃａｌｌ命令でない場合、ステップＳ４９０７の処理を終了する。
【０２６７】
ステップＳ４９０８において命令がｃａｌｌ命令の場合、スリープコード挿入処理部１４０は、ＰｏｗｅｒＯｆｆ（ｆ，ｇ）を参照してスリープコードの挿入が可能か否かを判断する（ステップＳ４９０９）。ステップＳ４９０９において、スリープコードの挿入が不可能である場合、ステップＳ４９０７の処理を終了する。ステップＳ４９０９において、スリープコードの挿入が可能である場合、スリープコード挿入部１４０は、関数ｆｕｎｃＸのｃａｌｌ命令の次に呼出先メモリの電源を低電圧とする電源制御コードを挿入し（ステップＳ４９１０）、ステップＳ４９０７の処理を終了する。
【０２６８】
このように本実施形態では、ＵＰＦＭ（ｆ）に基づき生成されたＰｏｗｅｒＯｆｆ（ｆ，ｇ）から、スリープコードの挿入が可能と判断された場合にのみ、スリープコードを挿入する。
【０２６９】
ここで、スリープ可能表作成部１５０によるＵＰＦＭ（ｆ）と、ＰｏｗｅｒＯｆｆ（ｆ，ｇ）の作成について説明する。初めに、ＵＰＦＭ（ｆ）について説明する。
【０２７０】
本実施形態のＵＰＦＭ（ｆ）は、関数ｆに至るまでに使用しうる全ての使用時一定電圧メモリの集合を示すテーブルである。ＵＰＦＭ（ｆ）は以下の式（１）のように定義される。
【０２７１】
【数１】
2011134288.tif 000003
【０２７２】
ここで、Ｕｓｉｎｇ＿ＰＦＭ（ｆ）はメモリマップ情報５７において関数ｆが使用する使用時一定電圧メモリ名の集合である。
【０２７３】
例えば関数ｆが関数ｆｕｎｃＭＡＩＮであった場合、ＵＰＦＭ（ｆ）は以下のようになる。
【０２７４】
ＵＰＦＭ（ｆｕｎｃＭＡＩＮ）：＝φ
【０２７５】
すなわち、関数ｆｕｎｃＭＡＩＮに至るまでに使用しうる全ての使用時一定電圧メモリの集合ＵＰＦＭ（ｆｕｎｃＭＡＩＮ）は、空集合となる。
【０２７６】
また関数ｆが関数ｆｕｎｃＡ１であった場合、ＵＰＦＭ（ｆ）は以下のようになる。
【０２７７】
ＵＰＦＭ（ｆｕｎｃＡ１）：＝ＵＰＦＭ（ｆｕｎｃＭＡＩＮ）∪ Ｕｓｉｎｇ＿ＰＦＭ（ｆｕｎｃＡ１）＝{Ｃ}
【０２７８】
すなわち、関数ｆｕｎｃＡ１に至るまでに使用しうる全ての使用時一定電圧メモリの集合ＵＰＦＭ（ｆｕｎｃＡ１）は、メモリＣのみとなる。
【０２７９】
また関数ｆが関数ｆｕｎｃＢ１であった場合、ＵＰＦＭ（ｆ）は以下のようになる。
【０２８０】
ＵＰＦＭ（ｆｕｎｃＢ１）：＝ＵＰＦＭ（ｆｕｎｃＡ１）∪ＵＰＦＭ（ｆｕｎｃＡ２）∪ Ｕｓｉｎｇ＿ＰＦＭ（ｆｕｎｃＢ１）＝{Ｂ，Ｃ}
【０２８１】
すなわち、関数ｆｕｎｃＢ１に至るまでに使用しうる全ての使用時一定電圧メモリの集合ＵＰＦＭ（ｆｕｎｃＢ１）は、メモリＢ、メモリＣとなる。
【０２８２】
また関数ｆが関数ｆｕｎｃＣ１であった場合、ＵＰＦＭ（ｆ）は以下のようになる。
【０２８３】
ＵＰＦＭ（ｆｕｎｃＣ１）：＝ＵＰＦＭ（ｆｕｎｃＡ１）∪ＵＰＦＭ（ｆｕｎｃＢ１）∪ Ｕｓｉｎｇ＿ＰＦＭ（ｆｕｎｃＣ１）＝{Ｂ，Ｃ}
【０２８４】
すなわち、関数ｆｕｎｃＣ１に至るまでに使用しうる全ての使用時一定電圧メモリの集合ＵＰＦＭ（ｆｕｎｃＣ１）は、メモリＢ、メモリＣとなる。
【０２８５】
次にＰｏｗｅｒＯｆｆ（ｆ，ｇ）について説明する。本実施形態のＰｏｗｅｒＯｆｆ（ｆ，ｇ）は、関数ｇから関数ｆへ復帰するときに、関数ｇの配置されているメモリを低電力状態にしてよいか否かを示すテーブルであり、以下の式（２）のように定義される。
【０２８６】
【数２】
2011134288.tif 000004
【０２８７】
ＰｏｗｅｒＯｆｆ（ｆ，ｇ）において、例えば関数ｆが関数ｆｕｎｃＡ１、関数ｇが関数ｆｕｎｃＢ１の場合について考える。この場合、Ｕｓｉｎｇ＿ＰＦＭ（ｆｕｎｃＢ１）＝{Ｂ}、ＵＰＦＭ（ｆｕｎｃＡ１）＝{Ｃ}であり、関数ｆｕｎｃＢ１と関数ｆｕｎｃＡ１との間に共通の要素は存在しない。すなわち、
Ｕｓｉｎｇ＿ＰＦＭ（ｆｕｎｃＢ１）∩ＵＰＦＭ（ｆｕｎｃＡ１）＝φ
となり、
ＰｏｗｅｒＯｆｆ（ｆｕｎｃＡ１，ｆｕｎｃＢ１）：＝Ｔｒｕｅ
となる。よって関数ｆｕｎｃＢ１は、関数ｆｕｎｃＢ１が配置されたメモリＢを低電圧状態とするスリープコードを関数ｆｕｎｃＡ１のｃａｌｌ命令の直後に挿入することができる。
【０２８８】
次に、ＰｏｗｅｒＯｆｆ（ｆ，ｇ）において、例えば関数ｆが関数ｆｕｎｃＢ１、関数ｇが関数ｆｕｎｃＣ１の場合について考える。この場合、Ｕｓｉｎｇ＿ＰＦＭ（ｆｕｎｃＣ１）＝{Ｃ}、ＵＰＦＭ（ｆｕｎｃＢ１）＝{Ｂ，Ｃ}であり、関数ｆｕｎｃＣ１と関数ｆｕｎｃＢ１との間に共通の要素{Ｃ}が存在する。すなわち、
Ｕｓｉｎｇ＿ＰＦＭ（ｆｕｎｃＣ１）∩ＵＰＦＭ（ｆｕｎｃＢ１）≠φ
となり、
ＰｏｗｅｒＯｆｆ（ｆｕｎｃＢ１，ｆｕｎｃＣ１）：＝Ｆａｌｓｅ
となる。よって関数ｆｕｎｃＣ１は、関数ｆｕｎｃＣ１が配置されたメモリＣを低電圧状態とするスリープコードを関数ｆｕｎｃＣ１のｃａｌｌ命令の直後に挿入することができない。
【０２８９】
次に、図５０を参照して図４９のステップＳ５０におけるスリープ可能表作成部１５０のＵＰＦＭ（ｆ）とＰｏｗｅｒＯｆｆ（ｆ，ｇ）の作成について説明する。図５０は、第六の実施形態のスリープ可能表作成部によるテーブルの作成を説明するフローチャートである。本実施形態では、関数の呼出関係図を幅優先探索することにより、ＵＰＦＭ（ｆ）とＰｏｗｅｒＯｆｆ（ｆ，ｇ）とを作成する。尚幅優先探索とは、メイン関数を始点とし、メイン関数の一階層下の関数の全ての関数、続いてメイン関数の二階層下の関数の全ての関数、・・・という順序で呼出関係を順次辿っていく探索方法を指す。
【０２９０】
本実施形態のスリープ可能表作成部１５０は、まずキューＱの初期化を行う（ステップＳ５００１）。尚キューＱは、関数名を保存するための、先入れ先出しのデータ構造である。
【０２９１】
次にスリープ可能表作成部１５０は、初期データの設定として、キューＱにｆ＿ＭＡＩＮを投入した状態とし（ステップＳ５００２）、次にＵＰＦＭ（ｆ＿ＭＡＩＮ）を空集合φに初期化する（ステップＳ５００３）。尚ｆ=ｆ＿ＭＡＩＮ以外のＵＰＦＭ（ｆ）の初期値は空集合とは区別される未定義状態とする。
【０２９２】
続いてスリープ可能表作成部１５０は、キューＱが空であるかを判定する（ステップＳ５００４）。そしてスリープ可能表作成部１５０は、ステップＳ５００４において、キューＱが空でなければ、ステップＳ５００５へ進む。
【０２９３】
ステップＳ５００４においてキューＱが空でない場合、スリープ可能表作成部１５０はキューＱから関数を取り出し、取り出した関数を関数ｆとする（ステップＳ５００５）。続いてスリープ可能表作成部１５０は、関数呼出関係情報５８を参照し、関数ｆの呼出先関数（子関数）を得る（ステップＳ５００６）。尚ステップＳ５００６において、関数ｆの呼出先関数を関数ｆ１，ｆ２，・・・，ｆｎとする。
【０２９４】
スリープ可能表作成部１５０は、以下に説明するステップＳ５００７〜ステップＳ５０１５の処理により、ステップＳ５００６で得た呼出先関数ｇ＝ｆ１，ｆ２，・・・，ｆｎについてのＰｏｗｅｒＯｆｆ（ｆ，ｇ）とＵＰＦＭ（ｇ）を作成する。またスリープ可能表作成部１５０は、ステップＳ５００７〜ステップＳ５０１５に於いて、キューＱに関数ｆ１，ｆ２，・・・，ｆｎの呼出先関数（子関数）を積む。ここでキューＱに積んだ関数はステップＳ５００４を経由し、ステップＳ５００５にて取り出され、ステップＳ５００７〜ステップＳ５０１５に於いて、また関数ｆ１，ｆ２，・・・，ｆｎそれぞれの呼出先関数の呼出先関数（孫関数）を積む。本実施形態では、これを繰り返すことにより全ての関数fについてＵＰＦＭ（ｆ）を、また全ての関数ｆから関数ｇへの呼び出しについてＰｏｗｅｒＯｆｆ（ｆ，ｇ）を求めている。
【０２９５】
以下にステップＳ５００７からステップＳ５０１５までの各ステップについて説明する。
【０２９６】
本実施形態のスリープ可能表作成部１５０は、関数ｆ１，ｆ２，・・・，ｆｎを指し示すカウンタ変数ｉを１に初期化する（ステップＳ５００７）。以下では、関数ｇとして、ｉ番目の関数ｆｉが選択されているものとして説明する。次にスリープ可能表作成部１５０は、式（２）に基づき現時点でのＰｏｗｅｒＯｆｆ（ｆ，ｆｉ）を計算する（ステップＳ５００８）。
【０２９７】
ステップＳ５００８において、スリープ可能表作成部１５０は、ＵＰＦＭ（ｆ）とＵｓｉｎｇ＿ＰＦＭ（ｆｉ）とが共通部分（共通の要素）を持つか否かを判定する。ステップＳ５００８において、共通部分を持たない場合、ＰｏｗｅｒＯｆｆ（ｆ，ｆｉ）：＝Ｔｒｕｅと設定する（ステップＳ５００９）。ステップＳ５００８において、共通部分を持つ場合、ＰｏｗｅｒＯｆｆ（ｆ，ｆｉ）：＝Ｆａｌｓｅと設定する（ステップＳ５０１０）。
【０２９８】
続いてスリープ可能表作成部１５０は、ステップＳ５０１１〜ステップＳ５０１４にて、ＵＰＦＭ（ｆｉ）を更新する。ステップＳ５０１１からステップＳ５０１４の処理は、同一の階層の関数同士の間に呼出関係が存在する場合に実行される処理である。
【０２９９】
スリープ可能表作成部１５０は、ＵＰＦＭ（ｆｉ）の仮の値として、集合Ｔ：＝ＵＰＦＭ（ｆ）∪Ｕｓｉｎｇ＿ＰＦＭ（ｆｉ）を計算する（ステップＳ５０１１）。
【０３００】
次にスリープ可能表作成部１５０は、集合ＴをＵＰＦＭ（ｆ）と比較する（ステップＳ５０１２）。ステップＳ５０１２において、集合ＴとＵＰＦＭ（ｆ）とが等しければ、ＵＰＦＭ（ｆｉ）の更新の必要がないので、ステップＳ５０１５へ進む。
【０３０１】
ステップＳ５０１２において、集合ＴとＵＰＦＭ（ｆ）とが等しくなければ、ＵＰＦＭ（ｆ）を集合Ｔに置き換えて更新する（ステップＳ５０１３）。またスリープ可能表作成部１５０は、再計算の対象に入れるために、キューＱにｆｉを積む（ステップＳ５０１４）。これは、この更新がＰｏｗｅｒＯｆｆ（ｆ，ｇ）に影響するためである。
【０３０２】
尚、ｆ=ｆ＿ＭＡＩＮ以外のＵＰＦＭ（ｆ）の初期値は空集合とは区別される未定義状態であり、必ず一度はステップＳ５０１３、ステップＳ５０１４を通過してキューＱに挿入される。そのため、全ての関数ｆについてＵＰＦＭ（ｆ）を、また全ての関数ｆから関数ｇへの呼び出しについてＰｏｗｅｒＯｆｆ（ｆ，ｇ）を求めることができる。
【０３０３】
スリープ可能表作成部１５０は、ステップＳ５０１５においてカウンタ変数ｉがｎと等しくなれば、関数ｆ１，ｆ２，・・・，ｆｎについてステップＳ５００８〜ステップＳ５０１４の処理を実行したことになるので、ステップＳ５００４へ戻る。ステップＳ５０１５において、カウンタ変数ｉがｎと等しくない場合は、ｉをインクリメントした後（ステップＳ５０１６）にステップＳ５００８へ戻る。
【０３０４】
スリープ可能表作成部１５０は、ステップＳ５００４においてキューＱが空であると判定した場合に処理を終了する。
【０３０５】
本実施形態では、以上の構成により、プロセッサが命令を得て正しく動作することができるように制御コードを生成することができる。また本実施形態では、不要な制御コードを挿入しないため、制御コードの挿入回数を低減し、且つ効率的に各メモリの電源制御を行うことができる。
【０３０６】
（第七の実施形態）
以下に図面を参照して本発明の第七の実施形態について説明する。本実施形態のコード生成装置は、制御コードの挿入を低減させるようにメモリマップを決定する。尚本実施形態において、第一乃至第六の実施形態と同様の機能構成を有するものには、第一乃至第六の実施形態の説明で用いた符号と同様の符号を用いる。
【０３０７】
本発明の第七の実施形態では、第五及び第六の実施形態と同様に、メイン関数からある一定階層までが常時一定電圧メモリに配置され、常時一定電圧メモリに配置された関数の直下の関数が常時一定電圧メモリと使用時一定電圧メモリとに配置された場合について考える。
【０３０８】
また、上記場合において、常時一定電圧メモリと使用時一定電圧メモリとに配置された関数より下の階層では、呼出元関数が配置されている使用時一定電圧メモリと同一のメモリを使用し、かつ、同一の使用時一定電圧メモリを使用する複数の呼出元関数が存在する場合（呼出元関数が一つである場合も含む）に常時一定電圧メモリを使用しないという前提も、第五及び第六の実施形態同様である。
【０３０９】
本実施形態では、更に消費電力を削減することを目的としている。例えば第六の実施形態では、どのようなメモリマップでも第五の実施形態相等の電力を実現できる。しかし、関数呼出のパターン次第では、さらなる電力削減の余地が存在する。例えば、図４７（Ｂ）のメモリマップの場合について考える。
【０３１０】
図４７（Ｂ）のメモリマップにおいて、関数ｆｕｎｃＭＡＩＮ、関数ｆｕｎｃＡ２、関数ｆｕｎｃＢ１、関数ｆｕｎｃＤ１という経路で各関数呼び出された場合、メモリＢが一定電圧状態となるのみである。しかし、関数ｆｕｎｃＭＡＩＮ、関数ｆｕｎｃＡ１、関数ｆｕｎｃＢ１、関数ｆｕｎｃＣ１、関数ｆｕｎｃＤ１という経路で呼び出された場合、関数ｆｕｎｃＢ１の低電圧部の実行を開始するタイミングから関数ｆｕｎｃＣ１へ復帰するまでの間は、メモリＢ、Ｃ共に一定電圧状態となる。すなわちこのとき使用していないメモリＣも一定電圧状態となる。
【０３１１】
このように、常時一定電圧メモリと使用時一定電圧メモリとに配置された関数より下の階層では、呼出元関数が配置されている使用時一定電圧メモリと同一のメモリを使用するという制約だけでは、消費電力削減の余地のあるメモリマップが決定されることがある。
【０３１２】
そこで本実施形態のコード生成装置１００Ｄは、さらに消費電力の削減することができるメモリマップを決定する。
【０３１３】
図５１は、第七の実施形態のコード生成装置の動作を説明するフローチャートである。
【０３１４】
本実施形態のコード生成装置１００Ｄにおいて、アセンブリ５０とパラメータ６０に含まれるサイクル数Ｎとが入力されると、コード生成装置１００Ｄは、関数毎のアセンブリコード５５の分割位置を算出する（ステップＳ５１０１）。尚本実施形態では、ステップＳ５１０１で算出された分割位置が制御コードが挿入される挿入位置である。
【０３１５】
ステップＳ５１０１においてアセンブリコード５５の分割位置が算出されると、コード生成装置１００Ｄは、分割位置とパラメータ６０に含まれるメモリユニット１０の構造情報６２とに基づき分割されたアセンブリコード５５を配置するためのメモリマップを決定する（ステップＳ５１０２）。本実施形態におけるメモリマップの決定の詳細は後述する。
【０３１６】
メモリマップが生成されると、コード生成装置１００はパラメータ６０に含まれる制御コードパターン６３に代入するパラメータを決定して制御コードを生成し、アセンブリコード５５の分割位置に制御コードを挿入する（ステップＳ５１０３）。コード生成装置１００Ｄは、制御コードが挿入されたアセンブリコード５５を含むアセンブリ５０Ａをアセンブル及びリンケージして（ステップＳ５１０４）、制御コードが含まれる電源制御入りバイナリ７０を出力してコード生成を完了する。
【０３１７】
以下に、図５２を参照して本実施形態のメモリマップの決定について説明する。図５２は、第七の実施形態におけるメモリマップの決定を説明する図である。
【０３１８】
本実施形態のコード生成装置１００Ｄは、親関数選択部５２１、常時一定電圧メモリ割当部５２２、合計コードサイズ計算部５２３、呼出頻度算出部５２４、使用時一定電圧メモリ割当部５２５、割当調整・アドレス計算部５２６を有する。コード生成装置１００Ｄは、上記各部によりメモリマップを決定する。
【０３１９】
本実施形態の親関数選択部５２１は、各関数間の呼出頻度情報ρを作成し、この呼出頻度情報に従って親関数を１つ特定する。本実施形態の呼出頻度情報ρは、ソースコード上での呼出回数や実行履歴上での呼出回数、あるいはその重み付け和等に基づき作成される。
【０３２０】
図５３は、関数間の呼出頻度情報の一例を示す図である。図５３に示すように、呼出頻度情報ρでは、呼出元関数（親関数）と、呼出先関数（子関数）と、呼出元関数が呼出先関数を呼び出す回数（スコア）とが対応付けられている。本実施形態の親関数選択部５２１は、一つの子関数に対して複数の親関数が存在する場合には、最も関係の強い関数、すなわちスコアが最も大きい関数を親関数として選択する。
【０３２１】
常時一定電圧メモリ割当部５２２は、常時一定電圧メモリへの関数割当を行う。本実施形態の常時一定電圧メモリ割当部５２２は、常時一定電圧メモリに全体を割り当てる関数の階層数を決定する。次に常時一定電圧メモリ割当部５２２は、常時一定電圧メモリとするメモリを決定する。次に常時一定電圧メモリ割当部５２２は、常時一定電圧メモリに一定電圧部を割り当てる関数の候補を抽出する。そして常時一定電圧メモリ割当部５２２は、全体を常時一定電圧メモリに割り当てる関数に対するメモリの割当と、一定電圧部を常時一定電圧メモリに割り当てる関数に対するメモリの割当とを決定する。
【０３２２】
合計コードサイズ計算部５２３は、常時一定電圧メモリに全体が割り当てられる関数の直下の階層に存在する関数を代表とする関数群を作成し、関数サイズ情報５２に基づき関数群のコード量を計算する。
【０３２３】
図５４は、関数群のコード量の計算の一例を示す図である。合計コードサイズ計算部５２３による計算結果は、出力テーブル５４として出力される。出力テーブル５４では、常時一定電圧メモリに全体が配置される関数である関数ｆｕｎｃＭＡＩＮの直下の関数である関数ｆｕｎｃＡ１、関数ｆｕｎｃＡ２、関数ｆｕｎｃＡ３、関数ｆｕｎｃＡ４、関数ｆｕｎｃＡ５を代表とする関数群が作成されている。そして各関数群と、各関数群の合計コード量とが対応付けられている。尚本実施形態において、この関数群は、代表とする関数そのものとその子孫関数のみを含むものとなる。
【０３２４】
呼出頻度算出部５２４は、出力テーブル５４と呼出頻度情報ρとを参照し、使用時一定電圧メモリに割り当てる関数群の間の呼出頻度Ｑを算出した呼出頻度テーブルＴを作成する。本実施形態の呼出頻度算出部５２４の処理の詳細は後述する。
【０３２５】
使用時一定電圧メモリ割当部５２５は、関数サイズ情報５２、出力テーブル５４、呼出頻度Ｑを参照して、関数の集合毎に使用時一定電圧メモリに割り当てる。使用時一定電圧メモリ割当部５２５の処理の詳細は後述する。
【０３２６】
割当調整・アドレス計算部５２６は、使用時一定電圧メモリ割当部５２５による割当結果を参照して不要なものを削除する等の修正を行い、各関数の一定電圧部と低電圧部の開始アドレスを計算する。不要なものとは、例えば使用時一定電圧メモリ割当部５２５による割当の結果、全ての呼出元関数が同一メモリに配置されているもの等である。
【０３２７】
そして割当調整・アドレス計算部５２６は、各関数の低電圧部のサイズを更新する。そして割当調整・アドレス計算部５２６は、各関数の一定電圧部、低電圧部の開始アドレスを計算する。
【０３２８】
以下に図５５を参照して本実施形態の呼出頻度算出部５２４の処理について説明する。図５５は、第七の実施形態の呼出頻度算出部の処理を説明するフローチャートである。
【０３２９】
本実施形態では、関数ｆを代表とする関数群Ｆと関数ｇを代表とする関数群Ｇ間の呼出頻度Ｑ（ｆ，ｇ）は、以下の式（３）で与えるものとする。
【０３３０】
【数３】
2011134288.tif 000005
【０３３１】
ここで、ｐ（φ，ψ）は、関数ψから関数φへの呼出回数（スコア）であり、呼出頻度情報ρから取得される。本実施形態では、この呼出頻度Ｑ（ｆ，ｇ）を、常時一定電圧メモリに配置する階層の次の階層の各関数を代表とする関数群全てのペアについて計算する。また呼出頻度算出部５２４は、出力テーブル５４の関数フィールドの各値（常時一定電圧に配置する階層の次の階層の関数の名前）をｆ［１］，・・・，ｆ［Ｌ＿ＭＡＸ］として参照する。
【０３３２】
Ｌ＿ＭＡＸは、常時一定電圧メモリに配置され関数の次の階層の関数の数である。また出力テーブル５４は、Ｌ＿ＭＡＸ×Ｌ＿ＭＡＸ要素の２次元配列Ｑとして格納されることを前提としている。したがって、本実施形態では、前述の関数ｆと関数ｇは、ともにｆ［１］，・・・，ｆ［Ｌ＿ＭＡＸ］を名前とする関数を順次選択し、走査する（但し、ｆとｇで同じものは選択されない）。
【０３３３】
呼出頻度算出部５２４は、変数ｉを１に初期化する（ステップＳ５５０１）。続いて呼出頻度算出部５２４は、変数ｊをｉ＋１にセットする（ステップＳ５５０２）。続いて呼出頻度算出部５２４は、式（３）で与えられる呼出頻度Ｑ（ｆ［ｉ］，ｆ［ｊ］）を計算し（ステップＳ５５０３）、２次元配列Ｑ［ｉ，ｊ］に格納する（ステップＳ５５０４）。呼出頻度算出部５２４は、ｉとｊがそれぞれＬ＿ＭＡＸ以下である間、ステップＳ５５０３、ステップＳ５５０４の処理を反復する（ステップＳ５５０５〜ステップＳ５５０８）。本実施形態の呼出頻度算出部５２４は、以上のようにして呼出頻度Ｑを算出する。
【０３３４】
図５６は、算出された呼出頻度Ｑの一例を示す図である。図５６を参照してｆ［ｉ］を出力テーブル５４の関数群Ｆ＿Ａ３とし、ｆ［ｊ］を出力テーブル５４の関数群Ｆ＿Ａ４とした場合の呼出頻度Ｑ（Ｆ＿Ａ３，Ｆ＿Ａ４）について説明する。
【０３３５】
関数群Ｆ＿Ａ３＝｛ｆ＿Ａ３，ｆ＿Ｂ３｝であり、関数群Ｆ＿Ａ４＝｛ｆ＿Ａ４，ｆ＿Ｂ４｝である。尚ｆ＿Ａ３は関数ｆｕｎｃＡ３、ｆ＿Ａ４は関数ｆｕｎｃＡ４、ｆ＿Ｂ３は関数ｆｕｎｃＢ３、ｆ＿Ｂ４は関数ｆｕｎｃＢ４を示す。
【０３３６】
したがって呼出頻度Ｑは、呼出頻度情報ρに基づき、
Ｑ（Ｆ＿Ａ３，Ｆ＿Ａ４）＝｛ｐ（ｆ＿Ａ３，ｆ＿Ａ４）＋ｐ（ｆ＿Ａ４，ｆ＿Ａ３）｝＋｛ｐ（ｆ＿Ａ３，ｆ＿Ｂ４）＋ｐ（ｆ＿Ｂ４，ｆ＿Ａ３）｝＋｛ｐ（ｆ＿Ｂ３，ｆ＿Ａ４）＋ｐ（ｆ＿Ａ４，ｆ＿Ｂ３）｝＋｛ｐ（ｆ＿Ｂ３，ｆ＿Ｂ４）＋ｐ（ｆ＿Ｂ４，ｆ＿Ｂ３）｝＝（０＋０）＋（０＋０）＋（０＋０）＋（１３＋０）＝１３
と計算される。尚呼出頻度情報ρにないものは０として計算される。このようにして、出力テーブル５４の全ての関数群間の呼出頻度Ｑを算出し、呼出頻度テーブルＴを作成する。図５６は、呼出頻度テーブルの一例を示す図である。
【０３３７】
次に、本実施形態の使用時一定電圧メモリ割当部５２５の処理について説明する。本実施形態の使用時一定電圧メモリ割当部５２５は、関数サイズ情報５２、出力テーブル５４、呼出頻度テーブルＴを参照して、使用時一定電圧メモリに関数を割り当てる。
【０３３８】
図５７は、第七の実施形態の使用時一定電圧メモリ割当部の処理を説明するフローチャートである。
【０３３９】
使用時一定電圧メモリ割当部５２５は、配列Ｍ＿ｒｅｓｔ［ｍ］を使用時一定電圧メモリｍのサイズで初期化する（ステップＳ５７０１）。尚ｍは、使用時一定電圧メモリの名前を表す。
【０３４０】
続いて使用時一定電圧メモリ割当部５２５は、ステップＳ５７０２〜ステップＳ５７０４において、一つの関数群を割り当てるメモリを特定する。
【０３４１】
具体的には、使用時一定電圧メモリ割当部５２５は、出力テーブル５４を走査して合計コード量（関数群に含まれる全ての関数の低電圧部のサイズの合計）が最大である関数群を選ぶ。そしてその関数群の代表関数を関数ｆ＿Ｍとする（ステップＳ５７０２）。
【０３４２】
次に使用時一定電圧メモリ割当部５２５は、関数ｆ＿Ｍを代表関数とする関数群が配置できる使用時一定電圧メモリを見つける（ステップＳ５７０３）。ここで使用時一定電圧メモリ割当部５２５は、配列Ｍ＿ｒｅｓｔ［ｍ］が関数ｆ＿Ｍを代表関数とする関数群の合計コード量以上となるような使用時一定電圧メモリｍを見つける。ステップＳ５７０３で見つかったメモリｍは、関数群ｆ＿Ｍの各関数の低電圧部を配置するメモリとされる。
【０３４３】
尚本実施形態では、使用時一定電圧メモリのサイズは、図５８に示すように関数サイズ情報５２から取得されても良い。図５８は、使用時一定電圧メモリのサイズ情報の一例を示す図であり、使用時一定電圧メモリのサイズ情報Ｓ１が示されている。
【０３４４】
次に使用時一定電圧メモリ割当部５２５は、メモリｍについて、配列Ｍ＿ｒｅｓｔ［ｍ］を配列Ｍ＿ｒｅｓｔ［ｍ］から関数ｆ＿Ｍを代表関数とする関数群を構成する各関数の低電圧部のサイズを減じた値に更新する（ステップＳ５７０４）。
【０３４５】
次に使用時一定電圧メモリ割当部５２５は、ステップＳ５７０５〜ステップＳ５７１０にて、ステップＳ５７０２〜ステップＳ５７０４で割り当てたメモリｍに配置する関数群を特定する。
【０３４６】
使用時一定電圧メモリ割当部５２５は、まず関数群の代表関数の集合Ｆ＝｛ｆ｜Ｑ（ｆ＿Ｍ，ｆ）＞０｝を算出する（ステップＳ５７０５）。この集合Ｆは、関数ｆ＿Ｍを代表とする関数群に所属する関数から呼び出されるか、または関数ｆ＿Ｍを代表とする関数群に所属する関数を呼び出すような関数の集合である。
【０３４７】
使用時一定電圧メモリ割当部５２５は、集合Ｆが空集合か否かを判断する（ステップＳ５７０６）。ステップＳ５７０６において集合Ｆが空集合でない場合、関数ｆ＿Ｍを代表とする関数群に所属する関数から呼び出されるか、または関数ｆ＿Ｍを代表とする関数群に所属する関数を呼び出すような関数は存在する。
【０３４８】
集合Ｆが空集合でない場合、使用時一定電圧メモリ割当部５２５は、呼出頻度Ｑ（ｆ＿Ｍ，ｆ）が最大となる関数ｆを代表とする関数群を選択する（ステップＳ５７０７）。但し、呼出頻度Ｑ（ｆ＿Ｍ，ｆ）が最大のものが複数存在する場合は、関数ｆを代表とする関数群のサイズ合計ｓ（ｆ）（各関数の低電圧部のサイズの合計）が最大のものを選択する。
【０３４９】
次に使用時一定電圧メモリ割当部５２５は、その関数ｆを代表とする関数群のサイズ合計ｓ（ｆ）が配列Ｍ＿ｒｅｓｔ［ｍ］以下であるか否かを判断する（ステップＳ５７０８）。ステップＳ５７０８でサイズ合計ｓ（ｆ）が配列Ｍ＿ｒｅｓｔ［ｍ］以下であった場合、使用時一定電圧メモリ割当部５２５は、関数ｆを代表とする関数群の各関数の低電圧部を配置するメモリとしてメモリｍを使用し、配列Ｍ＿ｒｅｓｔ［ｍ］を配列Ｍ＿ｒｅｓｔ［ｍ］からサイズ合計ｓ（ｆ）を減じた値に更新する（ステップＳ５７０９）。
【０３５０】
そして使用時一定電圧メモリ割当部５２５は、関数ｆを代表とする関数群の低電圧部を配置するメモリが決定したか否かにかかわらず、集合Ｆから関数ｆを取り除く（ステップＳ５７１０）。ステップＳ５７０８でサイズ合計ｓ（ｆ）が配列Ｍ＿ｒｅｓｔ［ｍ］以下でない場合、ステップＳ５７１０へ進む。使用時一定電圧メモリ割当部５２５は、これを集合Ｆが空集合となるまでステップＳ５７０６以降の処理を繰り返す。
【０３５１】
ステップＳ５７０６において集合Ｆが空集合であった場合、関数ｆ＿Ｍを代表とする関数群に所属する関数から呼び出されるか、または関数ｆ＿Ｍを代表とする関数群に所属する関数を呼び出すような関数は存在しない。したがって使用時一定電圧メモリ割当部５２５は、未割り当ての関数群が存在するか否かを判断する（ステップＳ５７１１）。ステップＳ５７１１において、未割り当ての関数が存在する場合、使用時一定電圧メモリ割当部５２５はステップＳ５７０２へ戻り、その関数群のうち合計コード量の大きい物から割り当てを続ける。ステップＳ５７１１において未割り当ての関数群の存在しない場合、使用時一定電圧メモリ割当部５２５は、全ての関数群のメモリ割当が完了しているので、処理を終了する。
【０３５２】
以下に、具体例を挙げて使用時一定電圧メモリ割当部５２５の処理を説明する。
【０３５３】
使用時一定電圧メモリ割当部５２５は、まず出力テーブル５４から関数群の合計コード量が最大である、関数群Ｆ＿Ａ２（合計コード量４ＫＢ）を選択する。そして使用時一定電圧メモリ割当部５２５は、サイズ情報Ｓ１を参照して関数群Ｆ＿Ａ２を配置可能な使用時一定電圧メモリであるメモリＢ（サイズ８ＫＢ）を見つけ、関数群Ｆ＿Ａ２をメモリＢへ割り当てる。このときメモリＢの残りのメモリサイズは４ＫＢとなる。
【０３５４】
ここで、関数群Ｆ＿Ａ２と呼出関係のある関数群（呼出頻度Ｑ（Ｆ＿Ａ２，Ｇ）＞０を満たす関数群Ｇ）は、関数群Ｆ＿Ａ１と関数群Ｆ＿Ａ３である。このうち、関数群Ｆ＿Ａ２との呼出頻度Ｑは、関数群Ｆ＿Ａ１の方が大きい。関数群Ｆ＿Ａ１の合計コード量（２ＫＢ）は、メモリＢの残りメモリサイズ（４ＫＢ）以下であり、メモリＢに割り当て可能なので、使用時一定電圧メモリ割当部５２５は、関数群Ｆ＿Ａ１をメモリＢへ割り当てる。
【０３５５】
関数群Ｆ＿Ａ１が割り当てられたため、関数群Ｆ＿Ａ２と呼出関係がある関数群のうち、未割り当ての関数群は関数群Ｆ＿Ａ３のみとなる。関数群Ｆ＿Ａ３の合計コード量は２ＫＢであり、メモリＢの残りのメモリサイズと同じであるから、関数群Ｆ＿Ａ３はメモリＢへ割り当て可能である。よって使用時一定電圧メモリ割当部５２５は、関数群Ｆ＿Ａ３をメモリＢへ割り当てる。このときメモリＢの残りのメモリサイズは０ＫＢとなり、割り当て可能なメモリはメモリＣのみとなる。
【０３５６】
この時点で関数群Ｆ＿Ａ２と呼出関係がある関数群のうち、未割り当ての関数群は存在しない。したがって使用時一定電圧メモリ割当部５２５は、未割り当ての関数群Ｆ＿Ａ４、関数群Ｆ＿Ａ５のうち、合計コード量が最大である関数群Ｆ＿Ａ５（合計コード量３ＫＢ）をメモリＣ（メモリサイズ８ＫＢ）に割り当てる。このときメモリＣの残りのメモリサイズは５ＫＢとなる。
【０３５７】
ここで関数群Ｆ＿Ａ５と呼出関係がある関数群のうち、未割り当ての関数群は関数群Ｆ＿Ａ４のみとなる。関数群Ｆ＿Ａ４の合計コード量は２ＫＢであり、メモリＣに割り当て可能である。よって使用時一定電圧メモリ割当部５２５は、関数群Ｆ＿Ａ４をメモリＣへ割り当てる。
【０３５８】
以上で全ての関数群が割り当て済みとなる。このようにして関数群を使用時一定電圧メモリに割り当てた結果を図５９に示す。図５９は、使用時一定電圧メモリの割り当て結果の一例を示す図である。
【０３５９】
図５９では、関数群Ｆ＿Ａ１、関数群Ｆ＿Ａ２、関数群Ｆ＿Ａ３は、使用時一定電圧メモリであるメモリＢへ割り当てられている。また関数群Ｆ＿Ａ４、関数群Ｆ＿Ａ５は使用時一定電圧メモリであるメモリＣへ割り当てられている。
【０３６０】
本実施形態では、以上に説明したように、呼出関係のある関数群同士の呼出頻度等に基づきメモリマップを決定するため、関数が複数のメモリにまたがって配置されることを抑制することができる。したがって本実施形態では、メモリを低電圧状態とする制御コードを挿入する回数を低減することができ、且つ効率的に各メモリの電源制御を行うことができる。このため本実施形態では、更なる消費電力の削減に貢献することができる。
【０３６１】
また本実施形態は、例えば第五の実施形態や第六の実施形態等と組み合わせることにより、さらなる消費電力の削減に貢献することができる。
【０３６２】
本発明の実施形態は、以下に記載する付記のような構成が考えられる。
（付記１）
複数の領域を有するメモリに書き込まれるプログラムコードに、電源電圧が安定した状態で前記領域を切り替えられるように前記電源電圧を制御する制御コードを挿入する挿入位置を算出する挿入位置算出手段と、
前記メモリの構造情報と前記挿入位置とに基づきメモリマップを作成するメモリマップ生成手段と、
前記制御コードを前記挿入位置へ挿入してプログラムコードを生成するコード生成手段と、を有するコード生成装置。
（付記２）
前記挿入位置算出手段は、
一命令コードを一サイクルとして定められたサイクル数が実行される時間を前記電源電圧の変動にかかる時間として前記挿入位置を算出する付記１記載のコード生成装置。
（付記３）
前記プログラムコードをリンクして前記電源電圧を制御する制御コードが含まれるバイナリを出力するリンク手段を有する付記１又は２記載のコード生成装置。
（付記４）
前記挿入位置算出手段において算出された挿入位置において前記プログラムコードを分割する分割手段を有する付記１乃至３の何れか一項に記載のコード生成装置。
（付記５）
前記分割手段は、
前記プログラムコードの開始アドレスから前記挿入位置までのプログラムコードを前半部分とし、前記挿入位置以降のプログラムコードを後半部分として分割し、
前記コード生成手段は、
前記前半部分は常に電源電圧が供給されている領域へ配置され、
前記後半部分は使用時に電源電圧が供給される領域へ配置されるようにプログラムコードを生成する付記４記載のコード生成装置。
（付記６）
前記制御コードを前記プログラムコードへ挿入するコード挿入手段を有し、
前記コード挿入手段は、
前記前半部分の先頭へ前記後半部分が配置された領域へ電源電圧を供給させるための制御コードを挿入する付記５記載のコード生成装置。
（付記７）
前記コード挿入手段は、
前記前半部分の最後に前記後半部分が配置された領域へジャンプさせる制御コードを挿入する付記５又は６記載のコード生成装置。
（付記８）
前記プログラムコードは割込ハンドラを含み、
前記コード挿入手段は、
前記プログラムコードに対して呼出関係図を生成し、メイン関数と前記割込ハンドラとの両方から到達できる関数のノードを複製し、
前記割込ハンドラから複製された前記ノードへと関連付ける付記１乃至７の何れか一項に記載のコード生成装置。
（付記９）
前記プログラムコードのコードサイズを、前記制御コードのコードサイズに基づき前記制御コードを挿入した後のコードサイズに補正するコードサイズ補正手段を有する付記１乃至８の何れか一項に記載のコード生成装置。
（付記１０）
前記コード生成手段は、
関数の呼出関係に従って下層に配置された関数からメイン関数へ復帰するまでの間に、一度使用された前記使用時に電源電圧が供給される領域が再度使用されない場合に、
前記使用時に電源電圧が供給される領域に配置された関数を呼び出す関数のコードに、前記使用時に電源電圧が供給される領域の電圧を前記電源電圧よりも低い電圧とする制御コードを挿入する付記１乃至９の何れか一項に記載のコード生成装置。
（付記１１）
前記コード生成手段は、
関数毎のアセンブリコードを取得するコード取得手段と、
前記コード取得手段にて取得した関数のコードが前記使用時に電源電圧が供給される領域と前記常に電源電圧が供給される領域とに配置されているかを判定する配置判定手段と、
前記配置判定手段の判定を受けて、前記前半部分の先頭へ前記後半部分が配置された領域へ電源電圧を供給させるための制御コードを挿入するスリープ解除コード挿入手段と、
前記関数の命令が関数呼出命令であり且つ前記関数呼出命令により呼び出される関数が配置されている領域が、前記関数呼出命令が配置された領域と同一の領域又は前記常に電源電圧が供給される領域でない場合に、前記関数呼出命令の直後に前記使用時に電源電圧が供給される領域の電圧を電源電圧より低い電圧とする制御コードを挿入するスリープコード挿入手段と、を有する付記１乃至１０の何れか一項に記載のコード生成装置。
（付記１２）
前記コード生成手段は、
関数毎のアセンブリコードを取得するコード取得手段と、
メイン関数から前記関数に至るまでに使用する全ての使用時一定電圧メモリの集合である第一の集合と、前記関数が呼び出す呼出先関数が使用する使用時一定電圧メモリの集合である第二の集合とに共通部分が存在するか否かを示す情報が、前記関数が呼び出す呼出先関数それぞれについて格納されたテーブルを作成するスリープコード挿入可能表作成手段と、
前記コード取得手段にて取得した関数のコードが前記使用時に電源電圧が供給される領域と前記常に電源電圧が供給される領域とに配置されているかを判定する配置判定手段と、
前記配置判定手段の判定を受けて、前記前半部分の先頭へ前記後半部分が配置された領域へ電源電圧を供給させるための制御コードを挿入するスリープ解除コード挿入手段と、
前記関数の命令が関数呼出命令であって、且つ前記テーブルにおいて前記第一の集合と前記第二の集合とが前記共通部分が存在しない場合に、前記関数呼出命令の直後に前記使用時に電源電圧が供給される領域の電圧を電源電圧より低い電圧とする制御コードを挿入するスリープコード挿入手段と、を有する付記１乃至１０の何れか一項に記載のコード生成装置。
（付記１３）
前記メモリマップ作成手段は、
呼出頻度情報に従って、親関数を一つ特定する親関数決定手段と、
常時一定電圧メモリへの関数割り当てを実行する常時一定電圧メモリ割当手段と、
使用時一定電圧メモリに割り当てる関数群の使用時一定電圧メモリのコード量の合計を求めるコード量計算手段と、
前記使用時一定電圧メモリに割り当てる関数群間の呼出頻度を算出したテーブルを作成する呼出頻度算出手段と、
前記コード量計算手段により計算された前記コード量の合計と、前記呼出頻度算出手段で作成したテーブルとを元に、関数群毎に使用時一定電圧メモリへ割り当てる使用時一定電圧メモリ割当手段と、
前記使用時一定電圧メモリ割当手段の結果を参照し、前記常時一定電圧メモリ割当手段による割り当てを修正し、各関数の一定電圧部、低電圧部の開始アドレスを計算する割当調整・アドレス計算手段と、を有する付記１乃至１２の何れか一項に記載のコード生成装置。
（付記１４）
複数の領域を有するメモリに書き込まれるプログラムコードに、電源電圧が安定した状態で前記領域を切り替えられるように前記電源電圧を制御する制御コードを挿入する挿入位置を算出する挿入位置算出手順と、
前記メモリの構造情報と前記挿入位置とに基づきメモリマップを作成するメモリマップ生成手順と、
前記制御コードを前記挿入位置へ挿入してプログラムコードを生成するコード生成手順と、を実行するコード生成方法。
（付記１５）
半導体集積回路へ実装されるプログラムコードを生成するコード生成装置において実行されるコード生成プログラムであって、
前記コード生成装置に、
複数の領域を有するメモリに書き込まれるプログラムコードに、電源電圧が安定した状態で前記領域を切り替えられるように前記電源電圧を制御する制御コードを挿入する挿入位置を算出する挿入位置算出ステップと、
前記メモリの構造情報と前記挿入位置とに基づきメモリマップを作成するメモリマップ生成ステップと、
前記制御コードを前記挿入位置へ挿入してプログラムコードを生成するコード生成ステップと、を実行させるコード生成プログラム。
【０３６３】
本発明の実施形態は、具体的に開示された実施例に限定されるものではなく、特許請求の範囲から逸脱することなく、種々の変形や変更が可能である。
【符号の説明】
【０３６４】
５０  アセンブリ
５２  関数サイズ情報
５５  アセンブリコード
６０  パラメータ
６２  構造情報
６３  制御コードパターン
６４  電源制御コードパターン
７０  電源制御入りバイナリ
１００、１００Ａ、１００Ｂ、１００Ｃ、１００Ｄ  コード生成装置
【図１】
2011134288.tif 000006
【図２】
2011134288.tif 000007
【図３】
2011134288.tif 000008
【図４】
2011134288.tif 000009
【図５】
2011134288.tif 000010
【図６】
2011134288.tif 000011
【図７】
2011134288.tif 000012
【図８】
2011134288.tif 000013
【図９】
2011134288.tif 000014
【図１０】
2011134288.tif 000015
【図１１】
2011134288.tif 000016
【図１２】
2011134288.tif 000017
【図１３】
2011134288.tif 000018
【図１４】
2011134288.tif 000019
【図１５】
2011134288.tif 000020
【図１６】
2011134288.tif 000021
【図１７】
2011134288.tif 000022
【図１８】
2011134288.tif 000023
【図１９】
2011134288.tif 000024
【図２０】
2011134288.tif 000025
【図２１】
2011134288.tif 000026
【図２２】
2011134288.tif 000027
【図２３】
2011134288.tif 000028
【図２４】
2011134288.tif 000029
【図２５】
2011134288.tif 000030
【図２６】
2011134288.tif 000031
【図２７】
2011134288.tif 000032
【図２８】
2011134288.tif 000033
【図２９】
2011134288.tif 000034
【図３０】
2011134288.tif 000035
【図３１】
2011134288.tif 000036
【図３２】
2011134288.tif 000037
【図３３】
2011134288.tif 000038
【図３４】
2011134288.tif 000039
【図３５】
2011134288.tif 000040
【図３６】
2011134288.tif 000041
【図３７】
2011134288.tif 000042
【図３８】
2011134288.tif 000043
【図３９】
2011134288.tif 000044
【図４０】
2011134288.tif 000045
【図４１】
2011134288.tif 000046
【図４２】
2011134288.tif 000047
【図４３】
2011134288.tif 000048
【図４４】
2011134288.tif 000049
【図４５】
2011134288.tif 000050
【図４６】
2011134288.tif 000051
【図４７】
2011134288.tif 000052
【図４８】
2011134288.tif 000053
【図４９】
2011134288.tif 000054
【図５０】
2011134288.tif 000055
【図５１】
2011134288.tif 000056
【図５２】
2011134288.tif 000057
【図５３】
2011134288.tif 000058
【図５４】
2011134288.tif 000059
【図５５】
2011134288.tif 000060
【図５６】
2011134288.tif 000061
【図５７】
2011134288.tif 000062
【図５８】
2011134288.tif 000063
【図５９】
2011134288.tif 000064