以下、本発明の実施形態を図面に基づいて説明する。始めに図1乃至図3を参照して本実施形態の概念について説明する。
図1は、メモリの電源電圧の制御を行うシステムの一例を示す図である。図1に示すシステムは、メモリユニット10と、プロセッサ20と、レジスタ30とを含む。メモリユニット10とプロセッサ20とレジスタ30とは、それぞれがバス40で接続されている。
メモリユニット10は、例えばSRAM(Static Random Access Memory)であり、電源電圧を低下させた状態で書き込まれた内容を保持することができる。メモリユニット10は、複数の領域であるメモリA〜メモリEを含む。メモリA〜メモリEは、それぞれが別々のメモリであっても良いし、1つのメモリが複数の領域に分割されたメモリ領域であっても良い。メモリA〜メモリEは、命令用メモリとデータ用メモリとに分けて使用することができ、それぞれに電源電圧を供給する電源線41が電源電圧を変動させる電圧変換器42を介して接続されている。プロセッサ20は、メモリA〜E毎に電源電圧の切り替えをレジスタ30へ設定し、電圧変換器42はレジスタ30の設定値に応じてメモリA〜メモリEの電源電圧を変動させる。
本実施形態では、プログラムコードに含まれる関数単位でメモリA〜メモリEの電源電圧の変動の制御を完結できるように、プログラムコードに電源電圧を制御するための制御コードを挿入する。
図2は、プログラムコードに含まれる関数の静的なコールグラフとメモリマップとの関係の一例を示す図である。
本実施形態では、メモリユニット10において、一定の電源電圧が供給された状態である一定電圧状態とされるメモリ(以下、常時一定電圧メモリ)と、使用されないときは電源電圧が低電圧とされる低電圧状態とされるメモリ(以下、使用時一定電圧メモリ)とを設ける。尚低電圧は、一定電圧よりも低い電圧である。尚使用時一定電圧メモリは、低電圧状態であってもメモリに書き込まれた内容を保持できる。
本実施形態では、長時間実行されることが予測される関数は、常時一定電圧メモリへ配置される。長時間実行されることが予測される関数とは、関数の呼出階層が上位のメイン関数等である。またメイン関数等に呼び出される関数は、前半部分(以下、一定電圧部)と後半部分(以下、低電圧部)に分割される。関数の一定電圧部のコードは常時一定電圧メモリへ配置される。
図2の例では、メモリAは常時一定電圧メモリであり、メイン関数funcMが配置されている。またメモリAには、メイン関数funcMに呼び出される関数func1と関数func2の一定電圧部Z1、Z2が配置されている。またメモリAには、関数func1、関数func2に呼び出されるその他の関数func3が配置されている。メモリB、メモリCは、使用時一定電圧メモリであり、関数func1と関数func2の低電圧部K1、K2が配置されている。
本実施形態では、関数func1と関数func2を分割する際に、関数func1、関数func2において電圧変動時間内に実行可能なコードまでを一定電圧部Z1、Z2としてメモリAへ配置し、それ以降のコードを低電圧部K1、K2としてメモリB、メモリCへ配置する。そして関数func1、関数func2の先頭部分へメモリB、メモリCを一定電圧状態にするコードを挿入してプログラムコードを生成する。
本実施形態の電圧変動時間とは、電源電圧が一定電圧から低電圧になるまでにかかる時間、又は低電圧から一定電圧になるまでにかかる時間である。
本実施形態により生成されたプログラムコードは、例えばLSI(Large Scale Integration)等のメモリに書き込まれる。本実施形態により生成されたプログラムコードが書き込まれたLSIでは、電圧変動時間を考慮したタイミングでメモリの電源電圧を変動させる制御を実現することができ、電圧変動時間を吸収することができる。尚関数の分割とコードの挿入の詳細は後述する。
本実施形態により生成されたプログラムコードでは、例えば関数func1の一定電圧部Z1の先頭に、使用時一定電圧メモリであるメモリBを一定電圧状態とするための制御コードが挿入されている。よって関数func1の一定電圧部Z1の実行が終了して低電圧部Z2を実行するためのメモリをメモリAからメモリBへ切り替えたとき、メモリBは一定電圧状態となっている。よって本実施形態では、電源電圧がメモリへ安定して供給された状態でメモリの切り替えを行うことができる。
図3は、本実施形態において生成されたプログラムコードのメモリマップの一例を示す図である。
メモリユニット10において、開始アドレスが0x0000であり終了アドレスが0x0fffのメモリAには、メイン関数funcM、メモリBを一定電圧状態とする電源制御コード、関数func1の一定電圧部Z1、メモリCを一定電圧状態とする電源制御コード、関数func2の一定電圧部Z2、その他の関数func3が配置される。開始アドレスが0x1000であり終了アドレスが0x1ffffのメモリBには、図2に示していない他の関数と、関数func1の低電圧部K1が配置される。開始アドレスが0x2000であり終了アドレスが0x2ffffのメモリCには、図2に示していない他の関数と、関数func2の低電圧部K2が配置される。
図3に示すメモリマップにしたがってプログラムコードを実装すれば、電圧変動時間を考慮したタイミングでメモリB、メモリCの電源電圧を制御することができる。よってメモリB、メモリCを適切なタイミングで低電圧状態から一定電圧状態へ移行させることができる。
(第一の実施形態)
以下に、図面を参照して本発明の第一の実施形態について説明する。始めに、プログラムコードを生成する第一の実施形態のコード生成装置について説明する。
図4は、コード生成装置を説明するための図である。本実施形態のコード生成装置100は、プログラムコードであるアセンブリ50と後述するパラメータ60とが入力されると、アセンブリ50にメモリユニット10に供給される電源電圧を制御するための制御コードを挿入し、制御コードが挿入されたアセンブリ50をアセンブル及びリンケージして、電源制御入りバイナリ70を生成して出力する。
本実施形態のコード生成装置100は、それぞれバスBで相互に接続されている入力装置101、出力装置102、ドライブ装置103、補助記憶装置104、メモリ装置105、演算処理装置106及びインターフェース装置107で構成される。
入力装置101はキーボードやマウスなどで構成され、各種信号を入力するために用いられる。出力装置102はディスプレイ装置などで構成され、各種ウインドウやデータ等を表示するために用いられる。インターフェース装置107は、モデム、LANカードなどで構成されており、ネットワークに接続する為に用いられる。
本実施形態のコード生成プログラムは、コード生成装置100を制御する各種プログラムの少なくとも一部である。コード生成プログラムは例えば記録媒体108の配布やネットワークからのダウンロードなどによって提供される。コード生成プログラムを記録した記録媒体108は、CD−ROM、フレキシブルディスク、光磁気ディスク等の様に情報を光学的、電気的或いは磁気的に記録する記録媒体、ROM、フラッシュメモリ等の様に情報を電気的に記録する半導体メモリ等、様々なタイプの記録媒体を用いることができる。
また、コード生成プログラムを記録した記録媒体108がドライブ装置103にセットされると、コード生成プログラムは記録媒体108からドライブ装置103を介して補助記憶装置104にインストールされる。ネットワークからダウンロードされたコード生成プログラムは、インターフェース装置107を介して補助記憶装置104にインストールされる。
補助記憶装置104は、インストールされたコード生成プログラムを格納すると共に、必要なファイル、データ等を格納する。補助記憶装置104には、例えばアセンブリ50とパラメータ60とが格納されても良い。メモリ装置105は、コンピュータの起動時に補助記憶装置104からコード生成プログラムを読み出して格納する。そして、演算処理装置106はメモリ装置105に格納されたコード生成プログラムに従って、後述するような各種処理を実現している。
本実施形態のアセンブリ50には、関数毎のアセンブリコード55が含まれる。また本実施形態のパラメータ60には、サイクル数N、メモリユニット10の構造情報62、制御コードパターン63が含まれる。サイクル数Nは、アセンブリ50に記述された一命令を一サイクルとして予め設定された値である。本実施形態のサイクル数Nは、サイクル数N分の命令を実行するのにかかる時間がメモリユニット10への電源電圧の電圧変動時間に相当するように設定されている。
メモリユニット10の構造情報62は、メモリユニット10の有するメモリA〜メモリEにおけるそれぞれの開始アドレスと終了アドレスを示す。制御コードパターン63とは、メモリA〜メモリEへの電源電圧の制御を行うための制御コードのパターンである。制御コードパターン63は、制御コードパターン63に含まれる特定のパラメータを決定することで制御コードが決定される。制御コードパターン63には、例えばメモリA〜メモリEを一定電圧状態から低電圧状態へ又は低電圧状態から一定電圧状態へ変化させる電源制御コードパターン64、分割位置から分割された先へジャンプさせるジャンプ制御コードパターン65(図9参照)が含まれる。
以下に図5を参照して本実施形態のコード生成装置100の動作を説明する。図5は、コード生成装置の動作を説明するフローチャートである。尚図5で説明する各ステップの処理の詳細は後述する。
本実施形態のコード生成装置100において、アセンブリ50とパラメータ60に含まれるサイクル数Nとが入力されると、コード生成装置100は、関数毎のアセンブリコード55の分割位置を算出する(ステップS51)。尚本実施形態では、ステップS51で算出された分割位置が制御コードが挿入される挿入位置である。
ステップS51においてアセンブリコード55の分割位置が算出されると、コード生成装置100は、分割位置とパラメータ60に含まれるメモリユニット10の構造情報62とに基づき分割されたアセンブリコード55を配置するためのメモリマップを決定する(ステップS52)。
メモリマップが生成されると、コード生成装置100はパラメータ60に含まれる制御コードパターン63に代入するパラメータを決定して制御コードを生成し、アセンブリコード55の分割位置に制御コードを挿入する(ステップS53)。制御コードが挿入されたアセンブリ50をアセンブリ50Aとする。コード生成装置100は、制御コードが挿入されたアセンブリコード55を含むアセンブリ50Aをアセンブル及びリンケージして(ステップS54)、制御コードが含まれる電源制御入りバイナリ70を出力してコード生成を完了する。
本実施形態のコード生成装置100から出力された電源制御入りバイナリ70は、記録媒体108とは別の記録媒体に記録されても良い。
次に、図6乃至図8を参照して本実施形態における関数の分割位置の算出について説明する。
本実施形態のコード生成装置100では、予め所定のサイクル数Nが設定されている。本実施形態では、一命令を実行するサイクルを一サイクルとしている。また本実施形態でのサイクル数Nは、Nサイクル分命令を実行するのにかかる時間が電圧変動時間に相当するように設定されている。
コード生成装置100は、アセンブリ50に含まれるアセンブリコード55においてサイクル数Nで到達し得る最も遠いアドレスを分割位置として算出する。そしてコード生成装置100は、アセンブリコード55においてNサイクル内に実行可能な命令までを一定電圧部とし、Nサイクル内では到達しない命令を低電圧部として、アセンブリコード55を分割する。
尚本実施形態のコード生成装置100では、メイン関数等のように長時間実行されることが予測される関数は、予め分割しないように設定されていても良い。
図6は、関数に分岐がない場合の分割位置の算出を説明するための図である。図6(A)は命令のフローを示し、図6(B)は分割の例を示す図である。
アセンブリ50に含まれる関数func1を例として説明する。図6(A)に示すように、関数func1の処理フローに条件分岐がない場合、命令のフローは直鎖状のフローとなる。よってNサイクルとは単純にN番目の命令のアドレスが、サイクル数Nで到達し得る最も遠いアドレス(以下、最遠アドレス)となる。
コード生成装置100は、図6(B)の例1に示すように、関数func1のアセンブリコード55の開始アドレスから最遠アドレスまでを一定電圧部Z1とし、最遠アドレスから関数func1のアセンブリコード55の終了アドレスまでを低電圧部K1とするように関数func1のアセンブリコード55を分割する。よって本実施形態では、最遠アドレスがコード生成装置100により算出される分割位置となる。
また図6(B)の例2に示すように、開始アドレスから終了アドレスまでがNサイクル内に実行可能な関数func3の場合は、分割せずに関数func3のアセンブリコード55を常時一定電圧メモリへ配置する。
図7は、関数に分岐がある場合の分割位置の算出を説明するための図である。図7(A)は命令のフローを示し、図7(B)は分割の例を示す図である。
関数に分岐がある場合にコード生成装置100は、Nサイクル内の命令を辿った際に、分岐点を通過して到達し得る最も遠いアドレスを最遠アドレスとする。
関数func1が図7(A)に示す分岐を有する関数であった場合、分岐点1を通過した後の命令のフローは、経路1と経路2とに別れる。関数func1が図7(B)に示すようなコードであった場合、分岐点1からn3サイクルへ進む経路2の方が、Nサイクル内に関数func1のアセンブリコード55の開始アドレスから離れたアドレスへ到達できる。よってコード生成装置100は、経路2においてNサイクル内に到達し得る最も遠いアドレスを最遠アドレス(分割位置)として算出する。そしてコード生成装置100は、関数func1のアセンブリコード55の開始アドレスから最遠アドレスまでを一定電圧部Z1とし、最遠アドレスから関数func1のアセンブリコード55の終了アドレスまでを低電圧部K1として分割する。
図8は、図5のステップS51に示すアセンブリコード55の分割位置の算出を説明するフローチャートである。尚、図8で説明する処理は、アセンブリ50に含まれる関数毎のアセンブリコード55に対して実行する。
本実施形態のコード生成装置100は、アセンブリ50とパラメータ60に含まれるサイクル数Nが入力されると、関数の開始命令ノードと、サイクル数=0とを積んだ状態で作業用キューを初期化する(ステップS801)。
次にコード生成装置100は、キューから命令ノードとサイクル数とを取り出す(ステップS802)。そしてコード生成装置100は、キューから取り出した命令ノードがリターン命令であるか、又はサイクル数がNより大きくなったか否かを判断する(ステップS803)。ステップS803において、キューから取り出した命令ノードがリターン命令でなく、且つサイクル数がNより大きくない場合、コード生成装置100はステップS804へ進む。ステップS803において、キューから取り出した命令ノードがリターン命令である場合、又はサイクル数がNより大きい場合、コード生成装置100は後述するステップS807以降の処理を行う。
ステップS804において、コード生成装置100は、キューから取り出された命令ノードが条件分岐命令であるか否かを判断する。ステップS804において条件分岐命令である場合、コード生成装置100はステップS805へ進む。ステップS805において、コード生成装置100は、分岐先の命令ノードを求めてキューへ積む。ステップS804において条件分岐命令でない場合、コード生成装置100はステップS806へ進む。ステップS806においてコード生成装置100は、条件分岐命令の次の命令ノードをキューへ積む。
続いてコード生成装置100は、命令ノードの現アドレスが最遠アドレスよりもアセンブリコード55の開始アドレスから遠いアドレスか否かを判断する(ステップS807)。尚ステップS807で現アドレスと比較される最遠アドレスには、予め初期値が設定された仮の最遠アドレスとした。また命令ノードの現アドレスとは、最後のキューに積まれた命令ノードのアドレスである。
ステップS807で現アドレスの方が、仮の最遠アドレスよりもアセンブリコード55の開始アドレスから遠いアドレスであった場合ステップS808へ進む。ステップS808においてコード生成装置100は、現アドレスを仮の最遠アドレスへ代入し、現アドレスを最遠アドレスに決定する。
ステップS807において現アドレスの方が、仮の最遠アドレスよりもアセンブリコード55の開始アドレスから近いアドレスであった場合ステップS809へ進む。ステップS809においてコード生成装置100は、キューが空か否かを判断し、キューが空でない場合にはステップS803以降の処理を繰り返す。
ステップS809においてキューが空であった場合、コード生成装置100は、ステップS810へ進み、最遠アドレスをアセンブリコード55の分割位置に決定し、アセンブリコード55の開始アドレスから最遠アドレスまでのコード長を一定電圧部、最遠アドレスからアセンブリコード55の終了アドレスまでのコード長を低電圧部として分割位置の算出を終了する。尚アセンブリコード55の一定電圧部は常時一定電圧メモリへ配置されるコードであり、アセンブリコード55の低電圧部は使用時一定電圧メモリへ配置されるコードである。
尚本実施形態では、一命令を実行するサイクルを一サイクルとしてサイクル数を取り出しているが、これに限定されない。例えばコード生成装置100は、命令コードとサイクル数とが対応付けられたテーブルを保持しており、命令コード毎にテーブルを参照してサイクル数を取り出しても良い。
次に、図9を参照してコード生成装置100におけるメモリマップの決定について説明する。図9は、図5のステップS52に示すメモリマップの決定を説明するフローチャートである。
コード生成装置100は、関数毎のアセンブリコード55を参照して低電圧部を有する関数を呼び出している回数を呼出回数情報として抽出する(ステップS901)。図10に、呼出回数情報の一例を示す。図10に示す呼出回数情報51では、低電圧部を有する関数を呼び出している関数として関数func1、関数func2が抽出されている。呼出回数情報51は、関数名と、関数毎の一定電圧部において低電圧部を有する関数を呼び出している回数、低電圧部において低電圧部を有する関数を呼び出している回数とが対応付けられた情報である。
図9に戻って、コード生成装置100は、制御コードパターン63に含まれる電源制御コードパターン64、ジャンプコードパターン65から、電源制御コードのコードサイズs_vとジャンプ制御コードのコードサイズs_jとを抽出する。
次にコード生成装置100は、アセンブリ50のコードサイズの補正を行う(ステップS903)。コード生成装置100は、ステップS901で抽出された呼出回数情報51と、ステップS902で抽出されたコードサイズs_vとコードサイズs_jと、後述する関数サイズ情報52とに基づきアセンブリ50のコードサイズの補正を行う。
以下にコードサイズの補正の詳細を説明する。
コード生成装置100では、アセンブリ50に含まれるアセンブリコード55の分割位置が算出されると、コード生成装置10は関数名と関数毎のアセンブリコード55のサイズに関する情報とを対応させた関数サイズ情報52を生成する。図11は、関数サイズ情報の一例を示す図である。関数サイズ情報52は、分割位置が決定されたアセンブリコード55の関数名と、関数毎の低電圧部のサイズ、一定電圧部のサイズとが対応付けられた情報である。図11に示す関数サイズ情報52では、低電圧部を有する関数の関数名である関数func1、関数func1の一定電圧部のサイズ、関数func1の低電圧部のサイズとが対応付けられている。また関数func2についても同様に、関数func2の関数名、関数func2の一定電圧部のサイズ、関数func2の低電圧部のサイズとが対応付けられている。
コード生成装置100では、アセンブリコード55を一定電圧部と低電圧部とに分割した場合、一定電圧部のアセンブリコード55を配置するメモリに、低電圧部が配置された使用時一定電圧メモリを特定するジャンプ制御コードと、使用時一定電圧メモリを一定電圧状態にさせる電源制御コードとを挿入する必要がある。
そこでコード生成装置100は、低電圧部を有する関数の呼出回数情報51と、低電圧部を有する関数の関数サイズ情報52と、電源制御コードのコードサイズs_vとジャンプ制御コードのコードサイズs_jとに基づき、関数毎のアセンブリコード55のサイズを補正する。より具体的には、低電圧部を有する関数について、(一定電圧部のサイズ)は(コードサイズs_v)×(一定電圧部において低電圧部を有する関数を呼び出している回数+1)+(コードサイズs_j)を加えることで、また(低電圧部のサイズ)は(電源制御コードのコードサイズs_v)×(低電圧部において低電圧部を有する関数を呼び出している回数)を加えることで補正する。一方、低電圧部を有さない関数について、(一定電圧部のサイズ)は(コードサイズs_v)×(一定電圧部において低電圧部を有する関数を呼び出している回数)を加えて補正する。そしてコード生成装置100は、低電圧部を有する関数のアセンブリコード55について補正を行った結果をアセンブリ50のサイズに反映させることで、アセンブリ50のコードサイズを補正する。
アセンブリ50のコードサイズの補正が完了すると、コード生成装置100は、常時一定電圧メモリと、使用時一定電圧メモリの両方においてメモリの割当を行う(ステップS904)。メモリの割当は、パラメータ60に含まれるメモリユニット10の構造情報62に基づき行われる。図12は、メモリユニットの構造情報の一例を示す図である。構造情報62は、メモリユニット10に含まれる複数のメモリのメモリ名と、開始アドレスと、終了アドレスとが対応付けられた情報である。メモリの割当の詳細は後述する。
図9に戻って、コード生成装置100は、メモリの割当が終了すると、アセンブリコード55の低電圧部のラベル付けを行い(ステップS905)、メモリマップ決定を完了する。コード生成装置100は、分割位置が決定されたアセンブリコード55の低電圧部の開始部分に、(関数名)_Lというラベルを付ける。図13は、ラベル付けの一例を示す図である。コード生成装置100は、例えば使用時一定電圧メモリであるメモリAに配置された関数func1のアセンブリコード55の低電圧部の開始アドレスに、関数func1_Lというラベルを付ける。関数func2についても同様に、メモリBに配置された関数func2のアセンブリコード55の低電圧部の開始アドレスに、関数func2_Lというラベルを付ける。
次に、図14乃至図17を参照して図9のステップS904におけるメモリの割当について説明する。本実施形態のコード生成装置100は、図14乃至図17に示す何れかの方法により、常時一定電圧メモリに対するメモリ割当と使用時一定電圧メモリに対するメモリ割当とを行えば良い。
図14は、メモリ割当を説明する第一のフローチャートである。コード生成装置100は、アセンブリ50のコードサイズの補正が完了すると、アセンブリ50に含まれるアセンブリコード55をメモリユニット10の有する複数のメモリの先頭から割り当てる(ステップS1401)。次にコード生成装置100は、アセンブリ50において最初に登場するアセンブリコード55を最初のメモリ(メモリA)に割り当て、アセンブリコード55がメモリAとメモリBの境界を跨ぐか否かを判断する(ステップS1402)。
ステップS1402においてメモリの境界を跨ぐとき、コード生成装置100は、アセンブリコード55をメモリBにのみ割り当てる(ステップS1403)。ステップS1402においてメモリの境界を跨がないとき、コード生成装置100は、アセンブリコード55をメモリAへ割り当て、アセンブリ50に含まれる全ての関数のアセンブリコード55を割り当てたか否かを判断する(ステップS1404)。ステップS1404において全てのアセンブリコード55の割り当てが完了すると、コード生成装置100はメモリ割当を終了する。
図15は、メモリ割当を説明する第二のフローチャートである。コード生成装置100は、アセンブリ50のコードサイズの補正が完了すると、アセンブリ50に含まれる関数名をアルファベット順にソートする(ステップS1501)。次にコード生成装置100は、図14のステップS1401からステップS1404までの処理を実行する。
図16は、メモリ割当を説明する第三のフローチャートである。コード生成装置100は、アセンブリ50のコードサイズの補正が完了すると、メモリユニット10を走査してアセンブリ50において最初に登場するアセンブリコード55をメモリの境界を跨がずに割り当てられるメモリを求め、アセンブリコード55を割り当てる(ステップS1601)。
コード生成装置100は、ステップS1601の処理をアセンブリ50に含まれる全てのアセンブリコード55を割り当てたか否かを判断し(ステップS1602)、全てのアセンブリコード55を割り当てた場合にメモリ割当を終了する。
図17は、メモリ割当を説明する第四のフローチャートである。コード生成装置100は、アセンブリ50のコードサイズの補正が完了すると、アセンブリ50に含まれるアセンブリコード55をコードサイズの大きい順にソートする(ステップS1701)。そしてコード生成装置100は、図16のステップS1601、ステップS1602の処理を実行する(ステップS1702)。
次に、コード生成装置100における制御コードの挿入について説明する。本実施形態のコード生成装置100は、低電圧部を有する関数のアセンブリコード55に、分割位置に低電圧部が割り当てられた使用時一定電圧メモリへのジャンプ制御コードを挿入する。またコード生成装置100は、アセンブリコード55の先頭部分に低電圧部が割り当てられた使用時一定電圧メモリを一定電圧状態とする電源制御コードを挿入する。さらにコード生成装置100は、アセンブリコード55の低電圧部が配置されている使用時一定電圧メモリを関数実行後に低電圧状態として良いか否かを判断し、低電圧状態として良い場合には使用時一定電圧メモリを低電圧状態とする電源制御コードを挿入する。
以下に図18、図19を参照して制御コードの挿入について説明する。図18は、図5のステップS53に示す制御コードの挿入を説明する第一のフローチャートである。
コード生成装置100は、アセンブリ50に含まれる関数から低電圧部を有する関数を抽出して低電圧部を有する関数のリストL1を生成する(ステップS1801)。尚このリストL1は、例えば図9で説明したコードサイズの補正において、関数サイズ情報52を抽出する際に抽出されていても良い。
コード生成装置100は、ステップS1801で作成されたリストL1から、一つの関数funcを選択し、選択した関数のアセンブリコード55を取り出してファイルfとする(ステップS1802)。
次にコード生成装置100は、ステップS51で算出した分割位置、ステップS52で決定したメモリマップに基づき電源制御コードパターン64とジャンプ制御コードパターン65とにパラメータを埋め込む(ステップS1803)。例えばファイルfに取り出されたアセンブリコード55の低電圧部のコードがメモリBへ配置される場合、コード生成装置100は、電源制御コードパターン64に、一定電圧状態とするメモリを指定する「メモリB」をパラメータとして埋め込む。またコード生成装置100は、ジャンプ制御コードパターン65に、ジャンプ先のアドレスとして、ステップS52で決定したメモリマップを参照し求めた関数funcの低電圧部の開始アドレスを埋め込む。
パラメータを埋め込むと、コード生成装置100は、パラメータを埋め込んだ電源制御コードとジャンプ制御コードとをファイルfへ挿入する(ステップS1804)。次にコード生成装置100は、ステップS1801で作成されたリストL1が空か否かを判断し(ステップS1805)、リストL1が空になるまでステップS1802〜ステップS1804を反復実行する。リストL1が空になると後述するステップS1901へ進む。
図19は、図5のステップS53に示す制御コードの挿入を説明する第二のフローチャートである。図19では、リストL1が空になった後に実行される処理を示している。
コード生成装置100は、アセンブリ50に含まれる関数の静的コールグラフ(呼出関係図)を作成する(ステップS1901)。次にコード生成装置100は、アセンブリ50中の関数の呼出命令のアドレスと、呼び出された関数名とを対応付けたリストL2を作成する(ステップS1902)。
コード生成装置100は、リストL2から、一つの呼出命令のアドレスをアドレスxとして取り出し、アドレスxにて呼び出される関数名を文字列変数funcxとして取り出す(ステップS1903)。コード生成装置100は、文字列変数funcxにより指し示される関数が配置されるメモリをMxと置き、文字列変数funcを文字列変数funcxで更新する(ステップS1904)。続いてコード生成装置100は、文字列変数funcを文字列変数funcにより示される関数の呼出元関数名に置き換え、文字列変数funcxにより示される関数が配置されるメモリをMと置く(ステップS1905)。
次にコード生成装置100は、メモリMとメモリMxとが同じメモリであるか否かを判断する(ステップS1906)。後述する反復実行を考慮すると、コード生成装置100は、呼出先関数のアセンブリコード55と、メイン関数から呼出元関数に至るまでに呼び出される関数のアセンブリコード55のいずれか、とが同じメモリに配置されるか否かを判断している。
ステップS1906においてメモリMとメモリMxとが同じメモリであった場合はステップS1907に進む。
ステップS1906においてメモリMとメモリMxとが同じメモリでない場合、コード生成装置100は、文字列変数func(ここでは呼出元関数を指す)がメイン関数を指すものか否かを判断する(ステップS1908)。文字列変数funcがメイン関数を指すものと判断された場合、コード生成装置100は、電源制御コードパターン64にパラメータを埋め込み電源制御コードを決定する(ステップS1909)。ここで埋め込まれるパラメータは、文字列変数funcxが示す呼出先関数が配置されたメモリMxを低電圧状態へするためのパラメータである。
電源制御コードパターン64にパラメータが埋め込まれると、コード生成装置100は電源制御コードをステップS1902で取り出したアドレスxの直後に挿入し(ステップS1910)、ステップS1907へ進む。
ステップS1907において、コード生成装置100はリストL2が空か否かを判断し、リストL2が空だったときは制御コードの挿入を終了する。リストL2が空でなければ、ステップS1903に戻り、ステップS1903〜ステップS1906及びステップS1908〜ステップS1910の処理を繰り返す。
尚図19では呼出元関数が複数存在している場合について説明していないが、複数存在する場合はステップS2704、ステップS2705を全ての呼出元について実行する。
コード生成装置100は、アセンブリ50に制御コードが挿入されると、制御コード挿入後のアセンブリ50Aをアセンブル及びリンケージして電源制御入りバイナリ70を出力する。
以下に図20を参照して本実施形態のコード生成装置100により出力された電源制御入りバイナリ70が実装されたLSI等の動作を説明する。図20は、第一の実施形態のコード生成装置により生成された電源制御入りバイナリが実装された半導体集積回路の動作の一例を説明する図である。
図20では、メモリに配置された関数の実行状況と、メモリの電源電圧の状態とを対応させて示している。メモリAは常時一定電圧メモリであり、メモリB、C、Dは使用時一定電圧メモリである。
メモリAに配置されたメイン関数funcMにより関数func1が呼び出されると、関数func1が実行される。関数func1の開始アドレスには、メモリBを一定電圧状態とする電源制御コードが挿入されている。よって関数func1の実行が開始されるとメモリBは一定電圧状態への移行を開始する。関数func1には、Nサイクル分の命令を実行するとメモリBへジャンプするようにジャンプ制御コードが挿入されている。よって関数func1はNサイクル後にメモリBへジャンプし、関数func1の低電圧部のアセンブリコードの実行を開始する。ここでメモリBの電圧変動時間は、Nサイクルの命令の実行に係る時間に相当する。よって関数func1がメモリBへジャンプしたときには、メモリBは一定電圧状態となっている。関数func2、関数func3も関数func1と同様である。
以下に図21乃至図24を参照して本実施形態のコード生成装置100の動作例について説明する。
図21は、コード生成装置に入力されるアセンブリの一例を示す図である。
コード生成装置100では、図21に示すアセンブリ50が入力されると、アセンブリコード50に制御コードを挿入する。尚アセンブリ50には、図21で定義されている関数以外の関数も含まれていても良い。
図22は、アセンブリに定義されている関数のコールグラフの一例を示す図である。関数func1、関数func2は、メイン関数funcMに呼び出される。関数func3は、関数func1と関数func2により呼び出される。
図23は、制御コードが挿入された後のアセンブリの一例を示す第一の図であり、図24は、制御コードが挿入された後のアセンブリの一例を示す第二の図である。図23は、常時一定電圧メモリであるメモリAに配置されるコードの例を示しており、図24は、使用時一定電圧メモリであるメモリBとメモリCに配置されるコードの例を示している。
図23のコードA1、コードA2は、図19で説明した制御コードの挿入により挿入されるコードである。コードA1は、メモリBに低電圧部が配置された関数func1の実行が終了すると、メモリBを一定電圧状態から低電圧状態へ移行させる制御を行う電源制御コードである。コードA2は、メモリCに低電圧部が配置された関数func2の実行が終了すると、メモリCを一定電圧状態から低電圧状態へ移行させる制御を行う電源制御コードである。
図23のコードB1、コードB2は、図18で説明した制御コードの挿入により挿入されるコードである。コードB1は、関数func1の一定電圧部の実行開始直後に、関数func1の低電圧部が配置されたメモリBを低電圧状態から一定電圧状態へ移行させるための電源制御コードである。コードB2は、関数func1の低電圧部が配置されたメモリBへジャンプさせるジャンプ制御コードである。コードB2は、関数func1の一定電圧部の最後に挿入されている。
コードB3は、関数func2の一定電圧部の実行開始直後に、関数func2の低電圧部が配置されたメモリCを低電圧状態から一定電圧状態へ移行させるための電源制御コードである。コードB4は、関数func2の低電圧部が配置されたメモリCへジャンプさせるジャンプ制御コードである。コードB4は、関数func2の一定電圧部の最後に挿入されている。
図24のコードCは、図9のステップS905で説明した低電圧部のラベル付けにより付与されたラベルである。コードCは、メモリBに配置された関数func1の低電圧部の開始アドレスに付与されている。同様に図24のコードDは、メモリCに配置された関数func2の低電圧部の開始アドレスに付与されている。
以上に説明したように、本実施形態によれば、関数において、電圧変動時間と対応したNサイクル以内に実行可能なコードを常時一定電圧メモリに配置し、Nサイクル以内に実行できないコードを使用時一定電圧メモリへ配置する。そして常時一定電圧メモリに配置されたコードの先頭に、使用時一定電圧メモリを一定電圧状態へさせる制御コードを挿入する。本実施形態では、上記構成により、電圧変動時間を考慮したタイミングでメモリの電源電圧を変動させるプログラムコードを生成することができる。
(第二の実施形態)
以下に図面を参照して本発明の第二の実施形態について説明する。第二の実施形態では、割り込み処理を考慮した点が第一の実施形態と相違する。よって以下の第二の実施形態の説明では、第一の実施形態との相違点についてのみ説明し、第一の実施形態と同様の機能構成を有するものには第一の実施形態の説明で用いた符号と同様の符号を付与し、その説明を省略する。
図25は、割り込み処理を考慮した場合の制御コードの挿入を説明する第一のフローチャートである。
図18のステップS1805において、リストL1が空であった場合、コード生成装置100は、アセンブリ50に含まれる関数の静的コールグラフを作成する(ステップS2501)。コールグラフが作成されると、コード生成装置100は、割込ハンドラINT_HANDLERから到達可能な関数の集合を抽出し、抽出した関数を以下の集合に分割する(ステップS2502)。コード生成装置100は、抽出した関数をメイン関数funcMからのみ到達可能な関数、割込ハンドラINT_HANDLERからのみ到達可能な関数の集合、メイン関数funcMと割込ハンドラINT_HANDLERとの両方から到達可能な関数の集合に分割する。
次のコード生成装置100は、メイン関数funcMと割込ハンドラINT_HANDLERとの両方から到達可能な関数の複製を生成する(ステップS2503)。そしてコード生成装置100は、メイン関数funcMからのみ到達可能な関数と、割込ハンドラINT_HANDLERからのみ到達可能な関数とから、割込ハンドラINT_HANDLERへアクセス可能とするための枝を作成し(ステップS2504)、図27で説明する処理へ進む。
以下に図26を参照して図25で生成されるコールグラフについて説明する。図26は、コールグラフの一例を示す図である。図26(A)は、図25のステップS2501で生成されたコールグラフの一例を示す。また、図26(B)は、図26(A)で示されたコールグラフの、図25のステップS2504完了時点でのコールグラフを示す。
アセンブリ50に含まれる関数の集合は、図5のステップS2502において、メイン関数funcMからのみ到達可能な関数の集合F1、割込ハンドラINT_HANDLERからのみ到達可能な関数の集合F2、メイン関数funcMと割込ハンドラINT_HANDLERとの両方から到達可能な関数の集合F3とに分割される。
関数の集合が分割されると、図5のステップS2503において集合F3の複製である集合F3aが生成し、集合F2から集合F3へ向かっていた枝の接続先を集合F3aとする。次にコード生成装置100は、図25のステップS2504において集合F1に含まれる関数及び集合F3に含まれる関数と、割込ハンドラINT_HANDLERとを接続する枝を作成する。
尚集合F3については、割り込み用と通常(割り込みがない場合)用とで関数が二種類ある扱いになっているため、スタートするノードが2つとなる。データ構造としては、ノードの管理テーブルを二種類用意する方法と、コールグラフの隣接枝のリストを四種類(出力、入力を二種類)保持する方法が考えられる。
図27は、割り込み処理を考慮した場合の制御コードの挿入を説明する第二のフローチャートである。図27のステップS2701からステップS2709までの処理は、図19のステップS1902からステップS1910までの処理と同様であるから説明を省略する。
以上のように、本実施形態では、関数の実行中に割り込みが発生する場合を考慮して制御コードが挿入されたコードを生成することができる。
(第三の実施形態)
以下に図面を参照して本発明の第三の実施形態について説明する。第三の実施形態では、関数に割り当てるメモリが複数の場合を考慮した点が第一の実施形態と相違する。よって以下の第三の実施形態の説明では、第一の実施形態との相違点についてのみ説明し、第一の実施形態と同様の機能構成を有するものには第一の実施形態の説明で用いた符号と同様の符号を付与し、その説明を省略する。
第一の実施形態、第二の実施形態では、制御コードが挿入される前の関数に割り当てるメモリは1つであり、関数がメモリの境界を跨がないという前提があった。本実施形態では、制御コードを挿入する前の関数に割り当てるメモリを複数とした場合を考慮している。
図28は、関数に割り当てるメモリが複数の場合を説明するための図である。図28では、メイン関数funcMにはメモリAが割り当てられ、関数func0にはメモリBが割り当てられ、関数func1にはメモリCが割り当てられ、関数func2にはメモリAが割り当てられ、関数func3にはメモリB、メモリCが割り当てられている。
図28の例では、メモリBには関数func0が、メモリCには関数func1が配置されている。よってメイン関数funcMが関数func0を呼び出し、関数func0が関数func1を呼び出し、関数func1が関数func3を呼び出した場合に、関数func3の実行が完了して関数func1に復帰するときには、関数func1はメモリBもメモリCも低電圧状態とすることができない。
これに対し、メイン関数funcMが関数func0を呼び出し、関数func0が関数func2を呼び出し、関数func2が関数func3を呼び出した場合、関数func3の実行が完了して関数func2が復帰するときには、メモリBには関数func0が配置されているためメモリBを低電圧状態とすることができ乃至かし、メモリCにはメイン関数funcM、関数func0、関数func2のいずれも配置されていないためメモリCを低電圧状態とすることはできる。このように、関数に複数のメモリを割り当てた場合、メモリを低電圧状態にして良い条件は、メモリ毎に独立して決められる。
図29は、関数に割り当てるメモリが複数である場合のメモリ割当を説明するフローチャートである。
図29のステップS2901とステップS2902の処理は、図14のステップS1401とステップS1402の処理と同様であるから説明を省略する。
ステップS2902においてメモリの境界を跨ぐとき、コード生成装置100は、関数を複数のメモリに割り当てる(ステップS2903)。例えばコード生成装置100は、ステップS2901で割り当てられたメモリと、その次のメモリとに関数を割り当てても良い。ステップS2904の処理は図14のステップS1404の処理と同様であるから説明を省略する。
次に図30を参照して本実施形態の制御コードの挿入について説明する。図30は、関数に複数のメモリを割り当てられた場合の制御コードの挿入を説明するフローチャートである。
図30のステップS3001からステップS3003までの処理は、図19のステップS1901からステップS1903までの処理と同様であるから説明を省略する。
ステップS3004において、コード生成装置100は、文字列変数funcxにより指し示される関数が配置されるメモリの集合をMxと置き、文字列変数funcを文字列変数funcxで更新する。
ステップS3005において、文字列変数funcを、文字列変数funcにより指し示される関数の呼出元の関数名で更新する。またメモリの集合を、文字列変数funcにより指し示される関数が配置されたメモリの集合Mで更新する。よってステップS3005のメモリMとは、文字列変数funcにより指し示される関数の呼出元関数が配置されたメモリの集合を示すこととなる。そしてMx\MをMxとする。尚M、Mxは、メモリの集合を示し、\は差集合を示す演算子である。
ここでMxは、ステップS3003でリストL2から取り出された文字列変数funcが指し示す関数が配置されたメモリである。よってMx\Mは、ステップS3002でリストL2から取り出された関数が配置されたメモリのうち、メイン関数からステップS3002で取り出された関数の呼出元関数に至るまでに呼び出される関数が配置されたメモリに含まれないものとなる。
次にコード生成装置100は、Mxが空集合であるか否かを判断する(ステップS3006)。Mxが空集合である場合、ステップS3002で取り出された関数が配置されたメモリの全てが、メイン関数からステップS3002で取り出された関数の呼出元関数に至るまでに呼び出される関数が配置されたメモリのいずれかに含まれることを示す。
ステップS3006においてMxが空集合と判断されると、コード生成装置100は、リストL2が空か否かを判断する(ステップS3007)。ステップS3007においてリストL2が空でない場合、ステップS3003以降の処理を繰り返す。ステップS3007においてリストL2が空の場合、制御コードの挿入を終了する。
ステップS3006においてMxが空集合でないと判断されると、コード生成装置100は、ステップS3008に進む。ステップS3008からステップS3010の処理は、図19のステップS1908からステップS1910の処理と同様であるから説明を省略する。
以上のように本実施形態では、制御コードが挿入される前の関数のアセンブリコード55が複数のメモリに割り当てられた場合にも、第一の実施形態と同様の効果を奏することができる。
(第四の実施形態)
以下に図面を参照して本発明の第四の実施形態について説明する。以下の第四の実施形態の説明では、第一の実施形態との相違点についてのみ説明し、第一の実施形態と同様の機能構成を有するものには第一の実施形態の説明で用いた符号と同様の符号を付与し、その説明を省略する。
本実施形態のコード生成装置100Aでは、始めに全てのメモリを一定電圧状態としておき、分岐があった場合に分岐先のアセンブリコード55が配置されたメモリ以外のメモリを全て低電圧状態とする制御を行う。
図31は、第四の実施形態のコード生成装置の動作を説明するフローチャートである。尚図31に示す各ステップの処理の詳細は後述する。
コード生成装置100Aは、アセンブリ50に含まれるアセンブリコード55と、サイクル数61とに基づき制御コードの挿入位置を算出する(ステップS3101)。制御コードの挿入位置が算出されると、コード生成装置100Aは、メモリの構造情報62と、制御コードパターン63とに基づきメモリマップを決定する(ステップS3102)。
次にコード生成装置100Aは、制御コードパターン63に代入するパラメータを決定して制御コードをステップS3101で算出された位置へ挿入する(ステップS3102)。制御コードが挿入されると、コード生成装置100Aは、制御コード挿入後のアセンブリ50Aをアセンブル及びリンケージして電源制御入りバイナリ70を出力する。
以下に、本実施形態における制御コード挿入位置の算出について説明する。図32は、図31のステップS3101に示す制御コードの挿入位置の算出を説明するフローチャートである。尚図32で説明する処理は、アセンブリ50に含まれる関数のアセンブリコード55毎に実行される。
コード生成装置100Aは、アセンブリコード55の開始アドレスxからの命令の数をカウントするカウンタのカウンタ値を0とする(ステップS3201)。次にコード生成装置100Aは、アセンブリコード55から命令を取得し、カウンタ値をステップS3201で設定したカウント値と取得した命令のサイクル数との和とする(ステップS3202)。ステップS3201においてカウンタ値は0であるから、ステップS3202ではカウンタ値は取得した命令のサイクル数の値となる。
続いてコード生成装置100Aは、カウンタ値<2Nサイクルであるか否かを判断する(ステップS3203)。カウンタ値が2Nサイクルより小さい場合、コード生成装置100Aは、取得した命令にリターン命令が含まれるか判断する(ステップS3204)。ステップS3204においてリターン命令が含まれていた場合、コード生成装置100Aは、電源Low挿入位置リストから開始アドレスxを除く(ステップS3205)。電源Low挿入位置リストとは、メモリを一定電圧状態から低電圧状態へ移行させる電源制御コードの挿入位置を示したリストである。
次にコード生成装置100Aは、アセンブリコード55に含まれる全ての命令を走査したか否かを判断する(ステップS3206)。ステップS3206で全ての命令を走査したと判断されると、制御コード挿入位置の算出を終了する。ステップS3206で全ての命令を走査していないと判断されると、ステップS3202以降の処理を繰り返す。
ステップS3203において、カウンタ値が2Nサイクルより大きい場合、コード生成装置100Aは、取得した命令にリターン命令が含まれるか否かを判断する(ステップS3207)。ステップS3207においてリターン命令が存在するとき、コード生成装置100Aは、電源High挿入位置を算出する(ステップS3208)。電源High挿入位置とは、メモリを低電圧状態から一定電圧状態へ移行させる電源制御コードを挿入する位置を示す。尚ステップS3207の処理の詳細は後述する。
ステップS3208において電源High挿入位置が算出されると、コード生成装置100Aは、ステップS3206へ進む。
ステップS3204においてリターン命令が存在しないと判断されると、コード生成装置100Aは、関数の呼出命令が存在するか否かを判断する(ステップS3209)。呼出命令が存在した場合、コード生成装置100Aは、カウンタ値を0にし(ステップS3210)、ステップS3205へ進む。呼出命令が存在しない場合、コード生成装置100AはステップS3206へ進む。
ステップS3207においてリターン命令が存在しない場合、コード生成装置100Aは、呼出命令が存在するか否かを判断する(ステップS3211)。ステップS3211で呼出命令が存在する場合、コード生成装置100Aは、カウンタ値を0にし、呼出命令の次のアドレスを開始アドレスxとする。そして電源Low挿入位置リストに開始アドレスxを追加する(ステップS3212)。よって電源Low挿入位置リストには、呼出命令の次のアドレスが追加される。コード生成装置100Aは、ステップS3212に続いてステップS3208へ進む。
ステップS3211において呼出命令が存在しない場合、コード生成装置100Aは、ステップS3206へ進む。
このように本実施形態では、関数の開始アドレス(呼出命令の分岐先)あるいは呼出命令の次の命令(リターン命令の分岐先)から2Nサイクル数以内に呼出命令又はリターン命令がない限りはり、自関数が使うメモリ以外のメモリを低電圧状態とするように、制御コードの挿入位置を算出する。
図33は、図32のステップS3208に示す制御コードの挿入位置の算出を説明するフローチャートである。
コード生成装置100Aは、ステップS3208において、呼出命令又はリターン命令のNサイクル前に全メモリを一定電圧状態とするために、Nサイクル手前の位置を特定する。
コード生成装置100Aは、アセンブリコード55に含まれる該当する命令ノードと、サイクル数=0と、をキューに積む。またコード生成装置100Aは、仮の最遠アドレスを該当する命令ノードのアドレスとする(ステップS3301)。次にコード生成装置100Aは、キューから命令ノードとサイクル数とを取り出す(ステップS3302)。
コード生成装置100Aは、取り出した命令ノードが関数の先頭であるか、又はサイクル数がNより大きいか否かを判断する(ステップS3303)。コード生成装置100Aは、ステップS3303において命令ノードが関数の先頭でないとき、又はサイクル数がNより小さいと判断すると、ステップS3303で取り出した命令ノードよりも一つ前の命令ノードをキューに積む(ステップS3304)。
コード生成装置100Aは、ステップS3303において命令ノードが関数の先頭である、又はサイクル数がNより大きいと判断すると、ステップS3302で取り出した命令ノードのアドレスの方が仮の最遠アドレスよりも関数の先頭から遠いか否かを判断する(ステップS3305)。ステップS3305において、ステップS3302で取り出したアドレスの方が仮の最遠アドレスよりも遠いと判断された場合、コード生成装置100Aは、現在のアドレス(ステップS3302で取り出したアドレス)を最遠アドレスとする(ステップS3306)。
次にコード生成装置100Aは、キューが空か否かを判断する(ステップS3307)。ステップS3307においてキューが空でない場合、ステップS3302以降の処理を繰り返す。ステップS3307においてキューが空である場合、コード生成装置100Aは、電源High挿入位置リストに最遠アドレスを追加し(ステップS3308)、処理を終了する。尚電源High挿入位置リストとは、メモリを低電圧状態から一定電圧状態へ移行させる電源制御コードの挿入位置を示したリストである。
尚本実施形態のコード生成装置100Aは、図32、図33で説明した処理により、関数毎の電源High挿入位置リストをリストL10、関数毎の電源Low挿入位置リストをリストL20として生成するものとした。
次に図34を参照して、本実施形態のメモリマップの決定について説明する。図34は、図31のステップS3102に示すメモリマップの決定を説明するフローチャートである。
コード生成装置100Aは、関数毎のアセンブリコード55を参照して低電圧部を有する関数の呼出回数を呼出回数情報として抽出する(ステップS3401)。次にコード生成装置100Aは、電源制御コードパターン64から電源制御コードのコードサイズs_vを抽出する(ステップS3402)。
コード生成装置100Aは、ステップS3402で抽出されたコードサイズs_vと関数サイズ情報52とに基づきアセンブリ50のコードサイズの補正を行う(ステップS3403)。本実施形態のコード生成装置100Aは、アセンブリ50に含まれる関数のアセンブリコード55毎に、関数の呼出回数に1を加算した値とコードサイズs_vとの積をアセンブリコード55のサイズに加算した結果を補正後のコードサイズとする。
ステップS3404とステップS3405の処理は、図9で説明したステップS904とステップS905の処理と同様であるから説明を省略する。
次に図35、図36を参照して本実施形態の制御コードの挿入について説明する。図35は、図31のステップS3103に示す制御コードの挿入を説明する第一のフローチャートである。
コード生成装置100Aは、制御コードパターン63に含まれる電源制御コードパターン64に、全メモリを一定電圧状態とするパラメータを埋め込む(ステップS3501)。次にコード生成装置100Aは、関数毎の電源High挿入位置リストを含むリストL10から、1つの関数の電源High挿入位置リストを取り出し、xとする(ステップS3502)。次にコード生成装置100Aは、ステップS3501でパラメータが埋め込まれた電源制御コードパターンをxへ挿入する(ステップS3503)。コード生成装置100Aは、リストL10が空か否かを判断する(ステップS3504)。
ステップS3504においてリストL10が空である場合、コード生成装置100Aは、図36で説明する処理へ進む。ステップS3504においてリストL10が空でない場合、ステップS3502以降の処理を繰り返す。
図35の処理により、アセンブリ50にはメモリを一定電圧状態にするための電源制御コードが挿入される。
図36は、図31のステップS3103に示す制御コードの挿入を説明する第二のフローチャートである。
コード生成装置100Aは、関数毎の電源Low挿入位置リストを含むリストL20から、1つの関数の電源Low挿入位置リストを取り出し、xとする(ステップS3601)。次にコード生成装置100Aは、ステップS3601で取り出されたxと対応する関数が配置されたメモリMEM(x)以外のメモリを低電圧状態とするパラメータを電源制御コードパターン64へ埋め込む(ステップS3602)。
コード生成装置100Aは、パラメータが挿入された電源制御コードをxの直後へ挿入する(ステップS3603)。次にコード生成装置100Aは、リストL20が空か否かを判断する(ステップS3604)。ステップS3604においてリストL20が空の場合、コード生成装置100Aは制御コードの挿入を終了し、アセンブリ50Aを出力する。ステップS3604でリストL20が空でない場合、ステップS3601以降の処理を繰り返す。
図36の処理により、アセンブリ50には、不要なメモリを低電圧状態にするための電源制御コードが挿入される。
以下に図37を参照して本実施形態のコード生成装置100Aにより生成された電源制御入りバイナリ70が実装されたLSI等の動作を説明する。図37は、第四の実施形態のコード生成装置により生成された電源制御入りバイナリが実装された半導体集積回路の動作の一例を説明する図である。
図37では、メモリに配置された関数の実行状況と、メモリの電源電圧の状態とを対応させて示している。メモリAは常時一定電圧メモリであり、メモリB、C、Dは使用時一定電圧メモリである。
図37の例では、メモリAに配置されたメモリ関数funcMによりメモリBに配置された関数func1が呼び出されNサイクル手前で、全てのメモリ(メモリA〜D)が一定電圧状態とされる。また図37では、関数func1が呼び出されると、関数func1が配置されたメモリB以外のメモリは低電圧状態とされる。そして、関数func1から関数func3が呼び出されるNサイクル手前で、再度全メモリが一定電圧状態とされる。
関数func3は、呼び出されてから2Nサイクル以内に関数func1に復帰するため、関数func3が呼び出された後も関数func3が配置されたメモリD以外のメモリは一定電圧状態のままとなる。
以上に説明したように、本実施形態によれば、電圧変動時間を考慮したタイミングでメモリの電源電圧を変動させるプログラムコードを生成することができる。
(第五の実施形態)
以下に図面を参照して本発明の第五の実施形態について説明する。以下の第五の実施形態の説明では、第一の実施形態との相違点についてのみ説明し、第一の実施形態と同様の機能構成を有するものには第一の実施形態の説明で用いた符号と同様の符号を付与し、その説明を省略する。
本発明の第五の実施形態では、メイン関数からある一定階層までは常時一定電圧メモリに配置され、常時一定電圧メモリに配置された関数の直下の関数が常時一定電圧メモリと使用時一定電圧メモリとに配置された場合について考える。
本実施形態では、上記場合において、常時一定電圧メモリと使用時一定電圧メモリとに配置された関数より下の階層では、呼出元関数が配置されている使用時一定電圧メモリと同一のメモリを使用し、かつ、同一の使用時一定電圧メモリを使用する複数の呼出元関数が存在する場合(呼出元関数が一つである場合も含む)に常時一定電圧メモリを使用しない前提とする。
以下に図38を参照して上記前提について説明する。図38は、第五の実施形態の前提を説明するための図である。
図38に示す配置では、メイン関数funcMと、メイン関数funcMの一層下の階層である関数funcB1、関数funcB2とが常時一定電圧メモリAに配置されている。関数funcB1の直下の関数は、関数funcC1、関数funcC2である。関数funcB2の直下の関数は、関数funcC3である。関数funcC1は、常時一定電圧メモリであるメモリAと使用時一定電圧メモリであるメモリBとに、関数funcC2は、常時一定電圧メモリであるメモリAと使用時一定電圧メモリであるメモリCとに、関数funcC3は、常時一定電圧メモリであるメモリAと使用時一定電圧メモリであるメモリDとに、それぞれ配置されている。関数funcC1、関数funcC2、関数funcC3においてメモリAに配置されている部分は、それぞれの関数の一定電圧部である。
図38では関数funcC3の一定電圧部をC3−1と図示した。関数funcC1、関数funcC2、関数funcC3において、それぞれ、メモリB、メモリC、メモリDに配置されている部分は、それぞれの関数の低電圧部である。図38では関数funcC3の低電圧部をC3−2と図示した。
関数funcC1の下層には、関数funcD1、関数funcD2が配置され、さらにその下層には関数funcE1、関数funcE2が配置されている。関数funcC2の下層には、関数funcD3が配置され、さらにその下層には関数funcE3が配置されている。関数funcC3の下層には、関数funcD4が配置され、さらにその下層には関数funcE4が配置されている。
関数funcE1の呼出元関数は、関数funcD1と関数funcD2である。よって関数funcE1は、関数funcD1と関数funcD2と同一の使用時一定電圧メモリであるメモリBのみに配置されている。関数funcE2の呼出元関数は、関数funcD2と関数funcD3であり、これらの関数の配置されているメモリは、それぞれメモリB、メモリCと異なる。したがって、どちらのメモリのみを使用している状態でも関数呼出が正常に行えるように、関数funcE2は、常時一定電圧メモリであるメモリAおよび、使用時一定電圧メモリであるメモリB又はメモリCの何れかに配置される。
図38の例では関数funcE2は、メモリAと関数funcD2と同一の使用時一定電圧メモリであるメモリBとに配置されている。関数funcD1、関数funcD2は、それぞれの呼出元関数である関数funcC1と同一の使用時一定電圧メモリであるメモリBに配置されている。
メモリCにおいても、関数funcE3、関数funcD3は、どちらの関数も、メモリC以外に配置されている関数から関数呼出を行われる可能性がある。このため関数funcE3、関数funcD3は、常時一定電圧メモリAおよび、それぞれの呼出元関数と同一のメモリCに配置されている。メモリDにおいても、関数funcE4、関数funcD4はそれぞれの呼出元関数と同位置のメモリDに配置されている。
図38に示す配置において、例えば関数funcD3からメイン関数funcMに復帰するまでの経路は、以下の2通りが考えられる。
(1)関数funcD3(メモリC)→関数funcC2(低電圧部)(メモリC)→関数funcC2(一定電圧部)(メモリA)→関数funcB1(メモリA)→メイン関数funcM(メモリA)
(2)関数funcD3(メモリC)→関数funcC3(低電圧部C3−2)(メモリD)→関数funcC3(一定電圧部C3−1)(メモリA)→関数funcB2(メモリA)→メイン関数funcM(メモリA)
このうち、まず(1)の経路でメイン関数funcMまで復帰するように動作した場合について考える。
関数funcC2でメモリCを使用する。よって第一の実施形態のコード生成装置100は図5のステップS53において、関数funcD3から復帰後の位置にメモリCを低電圧状態とするコードは挿入しない。しかし、関数funcC2より後ではメモリCを使用しないため、第一の実施形態のコード生成装置100は、関数funcC2から復帰後の位置にメモリCを低電圧状態とするコードは挿入する。したがって、メモリCが低電圧状態となってからメイン関数funcMまで戻ることになる。
次に、(2)の経路でメイン関数funcMまで復帰するように動作した場合について考える。
関数funcD3から関数funcC3の低電圧部C3−2に復帰した以降は、メモリCは不使用である。しかしながら、関数funcD3にはメモリCを低電圧状態とするコードは挿入されていない。また関数funcC3、関数funcB2、メイン関数funcMにおいてメモリCは関係せず制御の対象外である。このためメモリCが一定電圧状態のままメイン関数funcMまで戻ることになる。
そこで本実施形態では、関数の呼出関係に従って下層の関数からメイン関数へ復帰する際に、使用時一定電圧メモリに配置された関数の実行後その使用時一定電圧メモリが使用されないことが確認できる場合に限り、該当する使用時一定電圧メモリを低電圧状態とする。尚本実施形態において、下層の関数からメイン関数へ復帰する際に、一度使用された使用時一定電圧メモリが再度使用する場合は、再び該当する使用時一定電圧メモリを一定電圧状態とする電源制御コードを通る。このため本実施形態では、一度使用された使用時一定電圧メモリが再度使用されるか否かを判別できる。
本実施形態では、このようにメイン関数に戻るまでの間に再び使用されることのない使用時一定電圧メモリを低電圧状態とすることで、消費電力の低減に貢献することができる。
図39は、第五の実施形態のコード生成装置の機能構成を説明する図である。本実施形態のコード生成装置100Bは、コード取得部110、配置判定部120、スリープ解除コード挿入処理部130、スリープコード挿入処理部140を有する。
コード取得部110は、本実施形態のコード生成装置100Bに入力されるアセンブリ50から関数のアセンブリコードを取得する。配置判定部120は、後述するメモリマップ情報57に基づき、取得した関数のアセンブリコードが使用時一定電圧メモリと常時一定電圧メモリの両方に配置されているか否かを判定する。
尚本実施形態のコード生成装置100Bは、図40に示すように、図3に示す物理領域をメモリマップ情報57のテーブルとして有している。図40は、第五の実施形態におけるメモリマップ情報の一例を示す図である。
スリープ解除コード挿入処理部130は、配置判定部120による判定結果に基づき、使用時一定電圧メモリの低電圧状態が解除されるようにする。例えばスリープ解除コード挿入処理部130は、電源制御コードによりメモリが低電圧状態(以下、スリープ状態)から一定電圧状態となるように、スリープ解除コードを生成し、関数のコードへ挿入する。スリープ解除コード挿入処理部130の処理の詳細は後述する。
スリープコード挿入処理部140は、メモリマップ情報57と電源制御コードパターン64とに基づき、関数のアセンブリコードに電源制御コードを挿入し、使用時一定電圧メモリが低電圧状態となるようにする。ここで挿入される電源制御コードは、メモリをスリープ状態とする電源制御コード(以下、スリープコード)である。スリープコード挿入処理部140の処理の詳細は後述する。
本実施形態のコード生成装置100Bにおいて、スリープ解除コードとスリープコードとが挿入された関数のアセンブリコードは、電源制御コード挿入後のアセンブリ50Aとして出力される。
次に図41を参照して本実施形態のコード生成装置100Bによる制御コードの挿入について説明する。図41は、第五の実施形態のコード生成装置による制御コードの挿入を説明するフローチャートである。
図41に示す処理は、図5のステップS53において実行される処理である。尚本実施形態のコード生成装置100Bは、図5のステップS51、ステップS52と同様の処理を実行した後に、図41に示す処理を開始する。そして図41に示す処理が完了すると、制御コードが挿入されたアセンブリ50Aが出力される。コード生成装置100Bは、アセンブリ50Aが出力された後、図5のステップS54と同様の処理を行い、電源制御入りバイナリ70を出力する。本実施形態のコード生成装置100Bは、図41に示す処理を各関数毎に実行する。
本実施形態のコード生成装置100Bは、ステップS51においてコード取得部110により、関数毎のアセンブリコード55を取得し、分割位置を算出する。以下の説明では、関数funcXのアセンブリコードを取得したものとする。
コード生成装置100Bは、ステップS52において、分割位置とパラメータ60に含まれるメモリユニット10の構造情報62とに基づき分割されたアセンブリコード55を配置するためのメモリマップを決定し、メモリマップ情報57を出力する。
次にコード生成装置100Bは、ステップS53へ進む。尚図41におけるステップS4101からステップS4106までの処理は、配置判定部120とスリープ解除コード挿入処理部130とにより実行される処理である。またステップS4107からステップS4109までの処理は、スリープコード挿入処理部140により実行される処理である。
コード生成装置100BがステップS53の実行を開始すると、配置判定部120は、分割されたアセンブリコード55と、メモリマップ情報57とに基づき、関数funcXのアセンブリコード55が使用時一定電圧メモリと常時一定電圧メモリとの両方を使用するか否かを判定する(ステップS4101)。
ステップS4101において、関数funcXが使用時一定電圧メモリと常時一定電圧メモリのいずれかのみを使用する場合、後述するステップS4106へ進む。
ステップS4101において、使用時一定電圧メモリと常時一定電圧メモリとの両方を使用する場合、コード生成装置100Bは、ステップS51で算出した分割位置に従って関数funcXのアセンブリコード55を分割する(ステップS4102)。分割されたアセンブリコード55の前半部分を一定電圧部Xa、後半部分を低電圧部Xbとする。
続いて、コード生成装置100Bは、ステップS52で決定したメモリマップに基づき電源制御コードパターン64とジャンプ制御コードパターン65とにパラメータを埋め込む(ステップS4103〜4106)。
スリープ解除コード挿入処理部130は、一定電圧部Xaの先頭の電源制御コードパターン64に、一定電圧状態とするメモリを指定する「低電圧部Xbが配置された使用時一定電圧メモリ」をパラメータとして埋め込む(ステップS4103)。本実施形態では、一定電圧状態とするパラメータが埋め込まれた電源制御コードパターンをスリープ解除コードとする。本実施形態のスリープ解除コードは、例えば低電圧部Xbが配置されたメモリを一定電圧状態(使用できる状態)とする。
次にコード生成装置100Bは、関数funcXの低電圧部Xbの開始アドレスを表すラベルfuncX_Lを挿入する(ステップS4104)。さらにコード生成装置100Bは、ジャンプ制御コードパターン65に、関数funcXの低電圧部の開始アドレスを示すラベルfuncX_Lを埋め込む(ステップS4105)。
以上により、関数funcXのアセンブリコード55に使用時一定電圧メモリを使用できるようにするためのスリープ解除コードが挿入される。
次にコード生成装置100Bは、関数funcX内の関数呼出について、使用時一定電圧メモリを低電圧状態とするためのスリープコードを挿入する処理を実行する(ステップS4106)。尚ステップS4106の処理では、以下に説明するステップS4107〜4109の処理を行う。
本実施形態のコード生成装置100Bは、関数funcX内の命令(コード)を一命令ごと走査し、call命令か否かを判定する(ステップS4107)。ステップS4107において命令がcall命令でない場合、ステップS4106の処理を終了する。
ステップS4107において命令がcall命令の場合、スリープコード挿入処理部140は、呼出先関数が配置されているメモリ(以下、呼出先メモリ)が、関数funcXのcall命令が配置されたメモリと同一のメモリ又は常時一定電圧メモリであるか否かを判断する(ステップS4108)。ステップS4108において、呼出先関数が配置されているメモリがcall命令が配置されたメモリと同一のメモリ又は常時一定電圧メモリである場合、ステップS4106の処理を終了する。
ステップS4108において、呼出先メモリがcall命令が配置されたメモリと同一のメモリ又は常時一定電圧メモリでない場合、スリープコード挿入処理部140は、関数funcXのcall命令の次に呼出先メモリの電源を低電圧とする電源制御コードを挿入し(ステップS4109)、ステップS4106の処理を終了する。
例えば、関数funcXのアセンブリコード55中の低電圧部XbのコードがメモリYへ配置されており、関数funcXのアセンブリコード55中で、メモリZに配置された関数funcYを呼び出す場合を考える。
コード生成装置100Bは、関数funcYの実行後に関数funcXに復帰する際に、メモリZを低電圧状態とする。すなわちスリープコード挿入処理部140は、電源制御コードパターン64に、低電圧状態とするメモリを指定する「メモリZ」をパラメータとして埋め込んでスリープコードを生成する。そしてスリープコード挿入処理部140は、関数funcXのアセンブリコード55中の関数funcYを呼び出す関数呼出命令の直後に生成したスリープコードを挿入する。
以下に、図42乃至図46を参照して、図41に示す処理についてさらに説明する。
図42は、スリープ解除コード挿入処理部とスリープコード挿入処理部の処理を説明する図である。
図41のステップS4101において、関数funcXが常時一定電圧メモリか使用時一定電圧メモリのいずれかのみを使用する場合、スリープ解除コード挿入処理部130はスリープ解除コードを挿入しない。また関数funcXが常時一定電圧メモリと使用時一定電圧メモリとを使用する場合、関数funcXは、一定電圧部Xaと低電圧部Xbとに分割される。スリープ解除コード挿入処理部130は、一定電圧部Xaの先頭に、低電圧部Xbが配置されたメモリを一定電圧状態とするスリープ解除コードを挿入する。尚図42では、低電圧部Xbが配置された使用時一定電圧メモリをメモリXBとした。
スリープコード挿入処理部140は、関数funcXのアセンブリコード55にcall命令が存在する場合、呼出先メモリがcall命令が配置されたメモリと同一のメモリ又は常時一定電圧メモリであるか否かを判断する。呼出先メモリがcall命令が配置されたメモリと同一のメモリ又は常時一定電圧メモリである場合、スリープコード挿入処理部140はスリープコードを挿入しない。
呼出先メモリがcall命令が配置されたメモリと同一のメモリ又は常時一定電圧メモリでない場合、スリープコード挿入処理部140は関数funcXのcall命令の次に呼出先メモリを低電圧状態とするスリープコードを挿入する。
図42のように、関数funcXのcall命令がメモリXに配置されており、呼出先メモリがメモリYである場合、スリープコード挿入処理部140は関数funcXのcall命令の次にメモリYを低電圧状態とするスリープコードを挿入する。
このようにスリープコードを挿入することで、関数funcYから関数funcXに復帰する際にメモリYを低電圧状態とすることができ、消費電力の低減に貢献することができる。
以下にスリープ解除コード挿入処理部130とスリープコード挿入処理部140の処理について、図38を例としてさらに説明する。
図43は、関数funcXがメイン関数funcMの場合を示す図である。
メイン関数funcMは常時一定電圧メモリのみ使用するように配置されており、低電圧部が割り当てられる使用時一定電圧メモリへのジャンプ制御コードと、低電圧部が割り当てられた使用時一定電圧メモリを一定電圧状態とする電源制御コードの挿入は不要である。したがって、関数funcXがメイン関数funcMの場合、図41では、ステップS4101からステップS4106へ進む。
ステップS4107において、メイン関数funcMには、関数funcB1を呼び出すcall命令が存在する。よってステップS4108へ進む。ステップS4108では、呼出先関数である関数funcB1が配置されているメモリは、常時一定電圧メモリである。よって使用時一定電圧メモリを低電圧状態とする電源制御コードを挿入は不要となり、ステップS4106の処理を終了する。
図44は、関数funcXが関数funcB1の場合を示す図である。
関数funcB1も、メイン関数funcMと同様に常時一定電圧メモリに配置されており、使用時一定電圧メモリへのジャンプ制御コードと低電圧部が割り当てられた使用時一定電圧メモリを一定電圧状態とする電源制御コードの挿入は不要である。
したがって、関数funcXが関数funcB1の場合、図41では、ステップS4101からステップS4106へ進む。
ステップS4107において、関数funcB1には、関数funcC1を呼び出すcall命令が存在する。よってステップS4108へ進む。ステップS4108において、関数funcC1は使用時一定電圧メモリBに配置されている。メモリBは、関数funcB1が配置されているメモリと同一ではなく、また常時一定電圧メモリではない。よってステップS4109へ進む。
関数funcC1が実行された後にメイン関数funcMに戻るまでにメモリBは使用されない。よってステップS4109において、関数funcB1のcall命令の次にメモリBを低電圧状態とする電源制御コードが挿入される。
図45は、関数funcXが関数funcD2の場合を示す図である。
関数funcD2は、使用時一定電圧メモリのみ使用するように配置されている。したがって、他の使用時一定電圧メモリを一定電圧状態とする電源制御コードの挿入は不要である。したがって、関数funcXが関数funcD2の場合、図41では、ステップS4101からステップS4106へ進む。
ステップS4107において、関数funcD2には、関数funcE1、関数funcE2と関数funcE3を呼び出すcall命令が存在する。よってステップS4108へ進む。
ステップS4108において、関数funcE1、関数funcE2は関数funcD2と同一の使用時一定電圧メモリBに配置されている。すなわち関数funcE1、関数funcE2が関数funcD2に復帰した後もメモリBを使用するため、関数funcD2にメモリBを低電圧状態とする電源制御コードを挿入せずにステップS4106の処理を終了する。
一方、関数funcE3は関数funcD2と別の使用時一定電圧メモリCに配置されている。よってステップS4109へ進む。関数funcE3が関数funcD2へ復帰した後はメモリBを使用するため、ステップS4109では、関数funcD2における関数funcE3のcall命令の次にメモリCを低電圧状態とする電源制御コードが挿入される。
図46は、関数funcXが関数funcC3の場合を示す図である。
関数funcC3は、常時一定電圧メモリであるメモリAと、使用時一定電圧メモリであるメモリDとを使用するように配置されている。したがって、図41のステップS4101からステップS4102以降の処理へ進む。
関数funcC3は、関数サイズ情報52に基づき一定電圧部C3−1と低電圧部C3−2に分割される。一定電圧部C3−1はメモリAへ、低電圧部C3−2はメモリDへ割り当てられる。
関数funcC3が分割されると、スリープ解除コード挿入処理部130は、低電圧部C3−2が配置されるメモリDを一定電圧状態とするためのスリープ解除コードを一定電圧部C3−1の先頭に挿入する。またスリープ解除コード挿入処理部130は、低電圧部C3−2の先頭にラベル付けを行い、一定電圧部C3−1の最後にメモリDへのジャンプ制御コードを挿入する。
関数funcC3には、関数funcD3と関数funcD4を呼び出すcall命令が存在する。関数funcD4は、関数funcC3と同一の使用時一定電圧メモであるメモリDに配置されており、関数funcD4は復帰後メモリDを使用する。よってスリープコード挿入処理部140は、関数funcC3のアセンブリコード中に関数funcD4のcall命令の次にメモリDを低電圧状態とするスリープコードは挿入しない。
一方、関数funcD3は関数funcC3と別の使用時一定電圧メモリであるメモリCに配置されており、関数funcD3から関数funcC3に復帰した後はメモリCを使用しない。よってスリープコード挿入処理部140は、関数funcC3のアセンブリコード中において、関数funcD3のcall命令の直後にメモリCを低電圧状態とするスリープコードを挿入する。
以上に説明したように、本実施形態では、呼出元関数が配置されたメモリと呼出先関数が配置された呼出先メモリとが異っており、呼出先関数から呼出元関数へ復帰した後に呼出先メモリが再度使用されない場合に、呼出元関数のアセンブリコード55中のcall命令の直後に呼出先メモリを低電圧状態とするスリープコードを挿入する。本実施形態では、これにより呼出先関数が呼出元関数に復帰する際に呼出先メモリを低電圧状態とすることができ、消費電力の低減に貢献することができる。
(第六の実施形態)
以下に図面を参照して本発明の第六の実施形態について説明する。以下の第六の実施形態の説明では、第五の実施形態との相違点についてのみ説明し、第五の実施形態と同様の機能構成を有するものには第五の実施形態の説明で用いた符号と同様の符号を付与し、その説明を省略する。
本発明の第六の実施形態では、第五の実施形態同様、メイン関数からある一定階層までは常時一定電圧メモリに配置され、常時一定電圧メモリに配置された関数の直下の関数が常時一定電圧メモリと使用時一定電圧メモリとに配置された場合について考える。
また、上記場合において、常時一定電圧メモリと使用時一定電圧メモリとに配置された関数より下の階層では、呼出元関数が配置されている使用時一定電圧メモリと同一のメモリを使用し、かつ、同一の使用時一定電圧メモリを使用する複数の呼出元関数が存在する場合(呼出元関数が一つである場合も含む)に常時一定電圧メモリを使用しない前提も、第五の実施形態同様である。
図47は、第六の実施形態の前提を説明するための図である。図47(A)は、本実施形態における関数の呼出関係を示している。図47(B)は、図47(A)に示す呼出関係に基づきメモリマップを生成した結果を示している。図47の状態において、第五の実施形態のコード生成装置100Bにより制御コードの挿入を行うと、以下のようにメモリB、Cが低電圧状態となるようにスリープコードが挿入される。
メモリBが低電圧状態となるとき:
(1)関数funcA2から関数funcMAINに復帰するとき
(2)関数funcA5から関数funcMAINに復帰するとき
(3)関数funcB1から関数funcA1に復帰するとき
(4)関数funcB2から関数funcA3に復帰するとき
(5)関数funcD1から関数funcC1に復帰するとき
(6)関数funcC2から関数funcB3に復帰するとき
メモリCが低電圧状態となるとき:
(1)関数funcA1から関数funcMAINに復帰するとき
(2)関数funcA3から関数funcMAINに復帰するとき
(3)関数funcA4から関数funcMAINに復帰するとき
(4)関数funcC1から関数funcB1に復帰するとき
(5)関数funcB5から関数funcB4に復帰するとき
上記のタイミングでメモリB、メモリCが低電圧状態となるように制御コードが挿入されたプログラムにおいて、関数funcMAIN、関数funcA1、関数funcB1、関数funcC1、関数funcD1の順に関数が呼び出される場合を考える。
この場合、関数funcD1から関数funcC1に復帰するときにメモリBは低電圧状態となる。続いて、関数funcC1から関数funcB1に復帰しようとするが、このときメモリBは既に低電圧状態となっている。
したがって、このプログラムを実行しているプロセッサが関数funcC1から関数funcB1へ復帰するという命令を実行しようした場合に、プロセッサはメモリBへアクセスすることができない。このためプロセッサは命令を得ることができず、正しく動作しなくなる虞がある。
本実施形態では、どのようなメモリマップが得られた場合でも、プロセッサが命令を得て正しく動作することができるように制御コードを生成する。
図48は、第六の実施形態のコード生成装置の機能構成を説明する図である。本実施形態のコード生成装置100Cは、第五の実施形態のコード生成装置100Bの有する各部に加え、スリープ可能表作成部150を有する。
本実施形態のコード生成装置100Cは、このスリープ可能表作成部150により作成されたテーブルに基づき制御コードを挿入する。
本実施形態のスリープ可能表作成部150は、関数呼出関係情報58、メモリマップ57により、関数fに至るまでに使用しうる全ての使用時一定電圧メモリの集合を示すテーブルであるUPFM(f)を作成する。また本実施形態のスリープ可能表作成部150は、UPFM(f)に基づき、関数gから関数fへ復帰するときに、関数gの配置されているメモリを低電圧状態にしてもよい否かを示すテーブルであるPowerOff(f,g)を作成する。作成された上記2つのテーブルは、本実施形態のコード生成装置100Cの有する補助記憶装置104又はメモリ装置105の所定の領域へ記憶される。スリープ可能表作成部150による上記2つのテーブルの作成の詳細は後述する。
尚本実施形態の関数呼出関係情報58は、アセンブリ50に含まれる各関数における呼出関係を示すものである。本実施形態の関数呼出関係情報58は、予めコード生成装置100Cに与えられるものであっても良いし、コード生成装置100Cがアセンブリ50から生成したものであっても良い。
次に図49を参照して本実施形態のコード生成装置100Cによる制御コードの挿入について説明する。図49は、第六の実施形態のコード生成装置による制御コードの挿入を説明するフローチャートである。
図49に示す処理は、図5のステップS53において実行される処理である。尚本実施形態のコード生成装置100Cは、図5のステップS51、ステップS52と同様の処理を実行した後に、図49に示す処理を開始する。そして図49に示す処理が完了すると、制御コードが挿入されたアセンブリ50Aが出力される。
コード生成装置100Cは、アセンブリ50Aが出力された後、図5のステップS54と同様の処理を行い、電源制御入りバイナリ70を出力する。本実施形態のコード生成装置100Cは、図49に示す処理を各関数毎に実行する。
本実施形態のコード生成装置100Cは、ステップS51においてコード取得部110により、関数毎のアセンブリコード55を取得し、分割位置を算出する。以下の説明では、関数funcXのアセンブリコードを取得したものとする。
コード生成装置100Cは、ステップS52において、分割位置とパラメータ60に含まれるメモリユニット10の構造情報62とに基づき分割されたアセンブリコード55を配置するためのメモリマップを決定し、メモリマップ情報57を出力する。
次にコード生成装置100Cは、ステップS53へ進み、ステップS4901以降の処理を実行する。尚図49におけるステップS4901からステップS4906までの処理は、配置判定部120、スリープ解除コード挿入処理部130、スリープ可能表作成部150により実行される処理である。またステップS4908からステップS4910までの処理は、スリープコード挿入処理部140により実行される処理である。
コード生成装置100CがステップS53の実行を開始すると、スリープ可能表作成部150は、ステップS50を実行してPowerOff(f,g)を作成する(ステップS4901)。尚ステップS50の詳細は後述する。
ステップS4902からステップS4907までの処理は、図41のステップS4101からステップS4106までの処理と同様であるから説明を省略する。
ステップS4907の処理では、スリープコード挿入処理部140が、以下に説明するステップS4908〜4910の処理を行う。
本実施形態のコード生成装置100Cは、関数funcX内の命令(コード)を一命令ごと走査し、call命令か否かを判定する(ステップS4908)。ステップS4908において命令がcall命令でない場合、ステップS4907の処理を終了する。
ステップS4908において命令がcall命令の場合、スリープコード挿入処理部140は、PowerOff(f,g)を参照してスリープコードの挿入が可能か否かを判断する(ステップS4909)。ステップS4909において、スリープコードの挿入が不可能である場合、ステップS4907の処理を終了する。ステップS4909において、スリープコードの挿入が可能である場合、スリープコード挿入部140は、関数funcXのcall命令の次に呼出先メモリの電源を低電圧とする電源制御コードを挿入し(ステップS4910)、ステップS4907の処理を終了する。
このように本実施形態では、UPFM(f)に基づき生成されたPowerOff(f,g)から、スリープコードの挿入が可能と判断された場合にのみ、スリープコードを挿入する。
ここで、スリープ可能表作成部150によるUPFM(f)と、PowerOff(f,g)の作成について説明する。初めに、UPFM(f)について説明する。
本実施形態のUPFM(f)は、関数fに至るまでに使用しうる全ての使用時一定電圧メモリの集合を示すテーブルである。UPFM(f)は以下の式(1)のように定義される。
ここで、Using_PFM(f)はメモリマップ情報57において関数fが使用する使用時一定電圧メモリ名の集合である。
例えば関数fが関数funcMAINであった場合、UPFM(f)は以下のようになる。
UPFM(funcMAIN):=φ
すなわち、関数funcMAINに至るまでに使用しうる全ての使用時一定電圧メモリの集合UPFM(funcMAIN)は、空集合となる。
また関数fが関数funcA1であった場合、UPFM(f)は以下のようになる。
UPFM(funcA1):=UPFM(funcMAIN)∪ Using_PFM(funcA1)={C}
すなわち、関数funcA1に至るまでに使用しうる全ての使用時一定電圧メモリの集合UPFM(funcA1)は、メモリCのみとなる。
また関数fが関数funcB1であった場合、UPFM(f)は以下のようになる。
UPFM(funcB1):=UPFM(funcA1)∪UPFM(funcA2)∪ Using_PFM(funcB1)={B,C}
すなわち、関数funcB1に至るまでに使用しうる全ての使用時一定電圧メモリの集合UPFM(funcB1)は、メモリB、メモリCとなる。
また関数fが関数funcC1であった場合、UPFM(f)は以下のようになる。
UPFM(funcC1):=UPFM(funcA1)∪UPFM(funcB1)∪ Using_PFM(funcC1)={B,C}
すなわち、関数funcC1に至るまでに使用しうる全ての使用時一定電圧メモリの集合UPFM(funcC1)は、メモリB、メモリCとなる。
次にPowerOff(f,g)について説明する。本実施形態のPowerOff(f,g)は、関数gから関数fへ復帰するときに、関数gの配置されているメモリを低電力状態にしてよいか否かを示すテーブルであり、以下の式(2)のように定義される。
PowerOff(f,g)において、例えば関数fが関数funcA1、関数gが関数funcB1の場合について考える。この場合、Using_PFM(funcB1)={B}、UPFM(funcA1)={C}であり、関数funcB1と関数funcA1との間に共通の要素は存在しない。すなわち、
Using_PFM(funcB1)∩UPFM(funcA1)=φ
となり、
PowerOff(funcA1,funcB1):=True
となる。よって関数funcB1は、関数funcB1が配置されたメモリBを低電圧状態とするスリープコードを関数funcA1のcall命令の直後に挿入することができる。
次に、PowerOff(f,g)において、例えば関数fが関数funcB1、関数gが関数funcC1の場合について考える。この場合、Using_PFM(funcC1)={C}、UPFM(funcB1)={B,C}であり、関数funcC1と関数funcB1との間に共通の要素{C}が存在する。すなわち、
Using_PFM(funcC1)∩UPFM(funcB1)≠φ
となり、
PowerOff(funcB1,funcC1):=False
となる。よって関数funcC1は、関数funcC1が配置されたメモリCを低電圧状態とするスリープコードを関数funcC1のcall命令の直後に挿入することができない。
次に、図50を参照して図49のステップS50におけるスリープ可能表作成部150のUPFM(f)とPowerOff(f,g)の作成について説明する。図50は、第六の実施形態のスリープ可能表作成部によるテーブルの作成を説明するフローチャートである。本実施形態では、関数の呼出関係図を幅優先探索することにより、UPFM(f)とPowerOff(f,g)とを作成する。尚幅優先探索とは、メイン関数を始点とし、メイン関数の一階層下の関数の全ての関数、続いてメイン関数の二階層下の関数の全ての関数、・・・という順序で呼出関係を順次辿っていく探索方法を指す。
本実施形態のスリープ可能表作成部150は、まずキューQの初期化を行う(ステップS5001)。尚キューQは、関数名を保存するための、先入れ先出しのデータ構造である。
次にスリープ可能表作成部150は、初期データの設定として、キューQにf_MAINを投入した状態とし(ステップS5002)、次にUPFM(f_MAIN)を空集合φに初期化する(ステップS5003)。尚f=f_MAIN以外のUPFM(f)の初期値は空集合とは区別される未定義状態とする。
続いてスリープ可能表作成部150は、キューQが空であるかを判定する(ステップS5004)。そしてスリープ可能表作成部150は、ステップS5004において、キューQが空でなければ、ステップS5005へ進む。
ステップS5004においてキューQが空でない場合、スリープ可能表作成部150はキューQから関数を取り出し、取り出した関数を関数fとする(ステップS5005)。続いてスリープ可能表作成部150は、関数呼出関係情報58を参照し、関数fの呼出先関数(子関数)を得る(ステップS5006)。尚ステップS5006において、関数fの呼出先関数を関数f1,f2,・・・,fnとする。
スリープ可能表作成部150は、以下に説明するステップS5007〜ステップS5015の処理により、ステップS5006で得た呼出先関数g=f1,f2,・・・,fnについてのPowerOff(f,g)とUPFM(g)を作成する。またスリープ可能表作成部150は、ステップS5007〜ステップS5015に於いて、キューQに関数f1,f2,・・・,fnの呼出先関数(子関数)を積む。ここでキューQに積んだ関数はステップS5004を経由し、ステップS5005にて取り出され、ステップS5007〜ステップS5015に於いて、また関数f1,f2,・・・,fnそれぞれの呼出先関数の呼出先関数(孫関数)を積む。本実施形態では、これを繰り返すことにより全ての関数fについてUPFM(f)を、また全ての関数fから関数gへの呼び出しについてPowerOff(f,g)を求めている。
以下にステップS5007からステップS5015までの各ステップについて説明する。
本実施形態のスリープ可能表作成部150は、関数f1,f2,・・・,fnを指し示すカウンタ変数iを1に初期化する(ステップS5007)。以下では、関数gとして、i番目の関数fiが選択されているものとして説明する。次にスリープ可能表作成部150は、式(2)に基づき現時点でのPowerOff(f,fi)を計算する(ステップS5008)。
ステップS5008において、スリープ可能表作成部150は、UPFM(f)とUsing_PFM(fi)とが共通部分(共通の要素)を持つか否かを判定する。ステップS5008において、共通部分を持たない場合、PowerOff(f,fi):=Trueと設定する(ステップS5009)。ステップS5008において、共通部分を持つ場合、PowerOff(f,fi):=Falseと設定する(ステップS5010)。
続いてスリープ可能表作成部150は、ステップS5011〜ステップS5014にて、UPFM(fi)を更新する。ステップS5011からステップS5014の処理は、同一の階層の関数同士の間に呼出関係が存在する場合に実行される処理である。
スリープ可能表作成部150は、UPFM(fi)の仮の値として、集合T:=UPFM(f)∪Using_PFM(fi)を計算する(ステップS5011)。
次にスリープ可能表作成部150は、集合TをUPFM(f)と比較する(ステップS5012)。ステップS5012において、集合TとUPFM(f)とが等しければ、UPFM(fi)の更新の必要がないので、ステップS5015へ進む。
ステップS5012において、集合TとUPFM(f)とが等しくなければ、UPFM(f)を集合Tに置き換えて更新する(ステップS5013)。またスリープ可能表作成部150は、再計算の対象に入れるために、キューQにfiを積む(ステップS5014)。これは、この更新がPowerOff(f,g)に影響するためである。
尚、f=f_MAIN以外のUPFM(f)の初期値は空集合とは区別される未定義状態であり、必ず一度はステップS5013、ステップS5014を通過してキューQに挿入される。そのため、全ての関数fについてUPFM(f)を、また全ての関数fから関数gへの呼び出しについてPowerOff(f,g)を求めることができる。
スリープ可能表作成部150は、ステップS5015においてカウンタ変数iがnと等しくなれば、関数f1,f2,・・・,fnについてステップS5008〜ステップS5014の処理を実行したことになるので、ステップS5004へ戻る。ステップS5015において、カウンタ変数iがnと等しくない場合は、iをインクリメントした後(ステップS5016)にステップS5008へ戻る。
スリープ可能表作成部150は、ステップS5004においてキューQが空であると判定した場合に処理を終了する。
本実施形態では、以上の構成により、プロセッサが命令を得て正しく動作することができるように制御コードを生成することができる。また本実施形態では、不要な制御コードを挿入しないため、制御コードの挿入回数を低減し、且つ効率的に各メモリの電源制御を行うことができる。
(第七の実施形態)
以下に図面を参照して本発明の第七の実施形態について説明する。本実施形態のコード生成装置は、制御コードの挿入を低減させるようにメモリマップを決定する。尚本実施形態において、第一乃至第六の実施形態と同様の機能構成を有するものには、第一乃至第六の実施形態の説明で用いた符号と同様の符号を用いる。
本発明の第七の実施形態では、第五及び第六の実施形態と同様に、メイン関数からある一定階層までが常時一定電圧メモリに配置され、常時一定電圧メモリに配置された関数の直下の関数が常時一定電圧メモリと使用時一定電圧メモリとに配置された場合について考える。
また、上記場合において、常時一定電圧メモリと使用時一定電圧メモリとに配置された関数より下の階層では、呼出元関数が配置されている使用時一定電圧メモリと同一のメモリを使用し、かつ、同一の使用時一定電圧メモリを使用する複数の呼出元関数が存在する場合(呼出元関数が一つである場合も含む)に常時一定電圧メモリを使用しないという前提も、第五及び第六の実施形態同様である。
本実施形態では、更に消費電力を削減することを目的としている。例えば第六の実施形態では、どのようなメモリマップでも第五の実施形態相等の電力を実現できる。しかし、関数呼出のパターン次第では、さらなる電力削減の余地が存在する。例えば、図47(B)のメモリマップの場合について考える。
図47(B)のメモリマップにおいて、関数funcMAIN、関数funcA2、関数funcB1、関数funcD1という経路で各関数呼び出された場合、メモリBが一定電圧状態となるのみである。しかし、関数funcMAIN、関数funcA1、関数funcB1、関数funcC1、関数funcD1という経路で呼び出された場合、関数funcB1の低電圧部の実行を開始するタイミングから関数funcC1へ復帰するまでの間は、メモリB、C共に一定電圧状態となる。すなわちこのとき使用していないメモリCも一定電圧状態となる。
このように、常時一定電圧メモリと使用時一定電圧メモリとに配置された関数より下の階層では、呼出元関数が配置されている使用時一定電圧メモリと同一のメモリを使用するという制約だけでは、消費電力削減の余地のあるメモリマップが決定されることがある。
そこで本実施形態のコード生成装置100Dは、さらに消費電力の削減することができるメモリマップを決定する。
図51は、第七の実施形態のコード生成装置の動作を説明するフローチャートである。
本実施形態のコード生成装置100Dにおいて、アセンブリ50とパラメータ60に含まれるサイクル数Nとが入力されると、コード生成装置100Dは、関数毎のアセンブリコード55の分割位置を算出する(ステップS5101)。尚本実施形態では、ステップS5101で算出された分割位置が制御コードが挿入される挿入位置である。
ステップS5101においてアセンブリコード55の分割位置が算出されると、コード生成装置100Dは、分割位置とパラメータ60に含まれるメモリユニット10の構造情報62とに基づき分割されたアセンブリコード55を配置するためのメモリマップを決定する(ステップS5102)。本実施形態におけるメモリマップの決定の詳細は後述する。
メモリマップが生成されると、コード生成装置100はパラメータ60に含まれる制御コードパターン63に代入するパラメータを決定して制御コードを生成し、アセンブリコード55の分割位置に制御コードを挿入する(ステップS5103)。コード生成装置100Dは、制御コードが挿入されたアセンブリコード55を含むアセンブリ50Aをアセンブル及びリンケージして(ステップS5104)、制御コードが含まれる電源制御入りバイナリ70を出力してコード生成を完了する。
以下に、図52を参照して本実施形態のメモリマップの決定について説明する。図52は、第七の実施形態におけるメモリマップの決定を説明する図である。
本実施形態のコード生成装置100Dは、親関数選択部521、常時一定電圧メモリ割当部522、合計コードサイズ計算部523、呼出頻度算出部524、使用時一定電圧メモリ割当部525、割当調整・アドレス計算部526を有する。コード生成装置100Dは、上記各部によりメモリマップを決定する。
本実施形態の親関数選択部521は、各関数間の呼出頻度情報ρを作成し、この呼出頻度情報に従って親関数を1つ特定する。本実施形態の呼出頻度情報ρは、ソースコード上での呼出回数や実行履歴上での呼出回数、あるいはその重み付け和等に基づき作成される。
図53は、関数間の呼出頻度情報の一例を示す図である。図53に示すように、呼出頻度情報ρでは、呼出元関数(親関数)と、呼出先関数(子関数)と、呼出元関数が呼出先関数を呼び出す回数(スコア)とが対応付けられている。本実施形態の親関数選択部521は、一つの子関数に対して複数の親関数が存在する場合には、最も関係の強い関数、すなわちスコアが最も大きい関数を親関数として選択する。
常時一定電圧メモリ割当部522は、常時一定電圧メモリへの関数割当を行う。本実施形態の常時一定電圧メモリ割当部522は、常時一定電圧メモリに全体を割り当てる関数の階層数を決定する。次に常時一定電圧メモリ割当部522は、常時一定電圧メモリとするメモリを決定する。次に常時一定電圧メモリ割当部522は、常時一定電圧メモリに一定電圧部を割り当てる関数の候補を抽出する。そして常時一定電圧メモリ割当部522は、全体を常時一定電圧メモリに割り当てる関数に対するメモリの割当と、一定電圧部を常時一定電圧メモリに割り当てる関数に対するメモリの割当とを決定する。
合計コードサイズ計算部523は、常時一定電圧メモリに全体が割り当てられる関数の直下の階層に存在する関数を代表とする関数群を作成し、関数サイズ情報52に基づき関数群のコード量を計算する。
図54は、関数群のコード量の計算の一例を示す図である。合計コードサイズ計算部523による計算結果は、出力テーブル54として出力される。出力テーブル54では、常時一定電圧メモリに全体が配置される関数である関数funcMAINの直下の関数である関数funcA1、関数funcA2、関数funcA3、関数funcA4、関数funcA5を代表とする関数群が作成されている。そして各関数群と、各関数群の合計コード量とが対応付けられている。尚本実施形態において、この関数群は、代表とする関数そのものとその子孫関数のみを含むものとなる。
呼出頻度算出部524は、出力テーブル54と呼出頻度情報ρとを参照し、使用時一定電圧メモリに割り当てる関数群の間の呼出頻度Qを算出した呼出頻度テーブルTを作成する。本実施形態の呼出頻度算出部524の処理の詳細は後述する。
使用時一定電圧メモリ割当部525は、関数サイズ情報52、出力テーブル54、呼出頻度Qを参照して、関数の集合毎に使用時一定電圧メモリに割り当てる。使用時一定電圧メモリ割当部525の処理の詳細は後述する。
割当調整・アドレス計算部526は、使用時一定電圧メモリ割当部525による割当結果を参照して不要なものを削除する等の修正を行い、各関数の一定電圧部と低電圧部の開始アドレスを計算する。不要なものとは、例えば使用時一定電圧メモリ割当部525による割当の結果、全ての呼出元関数が同一メモリに配置されているもの等である。
そして割当調整・アドレス計算部526は、各関数の低電圧部のサイズを更新する。そして割当調整・アドレス計算部526は、各関数の一定電圧部、低電圧部の開始アドレスを計算する。
以下に図55を参照して本実施形態の呼出頻度算出部524の処理について説明する。図55は、第七の実施形態の呼出頻度算出部の処理を説明するフローチャートである。
本実施形態では、関数fを代表とする関数群Fと関数gを代表とする関数群G間の呼出頻度Q(f,g)は、以下の式(3)で与えるものとする。
ここで、p(φ,ψ)は、関数ψから関数φへの呼出回数(スコア)であり、呼出頻度情報ρから取得される。本実施形態では、この呼出頻度Q(f,g)を、常時一定電圧メモリに配置する階層の次の階層の各関数を代表とする関数群全てのペアについて計算する。また呼出頻度算出部524は、出力テーブル54の関数フィールドの各値(常時一定電圧に配置する階層の次の階層の関数の名前)をf[1],・・・,f[L_MAX]として参照する。
L_MAXは、常時一定電圧メモリに配置され関数の次の階層の関数の数である。また出力テーブル54は、L_MAX×L_MAX要素の2次元配列Qとして格納されることを前提としている。したがって、本実施形態では、前述の関数fと関数gは、ともにf[1],・・・,f[L_MAX]を名前とする関数を順次選択し、走査する(但し、fとgで同じものは選択されない)。
呼出頻度算出部524は、変数iを1に初期化する(ステップS5501)。続いて呼出頻度算出部524は、変数jをi+1にセットする(ステップS5502)。続いて呼出頻度算出部524は、式(3)で与えられる呼出頻度Q(f[i],f[j])を計算し(ステップS5503)、2次元配列Q[i,j]に格納する(ステップS5504)。呼出頻度算出部524は、iとjがそれぞれL_MAX以下である間、ステップS5503、ステップS5504の処理を反復する(ステップS5505〜ステップS5508)。本実施形態の呼出頻度算出部524は、以上のようにして呼出頻度Qを算出する。
図56は、算出された呼出頻度Qの一例を示す図である。図56を参照してf[i]を出力テーブル54の関数群F_A3とし、f[j]を出力テーブル54の関数群F_A4とした場合の呼出頻度Q(F_A3,F_A4)について説明する。
関数群F_A3={f_A3,f_B3}であり、関数群F_A4={f_A4,f_B4}である。尚f_A3は関数funcA3、f_A4は関数funcA4、f_B3は関数funcB3、f_B4は関数funcB4を示す。
したがって呼出頻度Qは、呼出頻度情報ρに基づき、
Q(F_A3,F_A4)={p(f_A3,f_A4)+p(f_A4,f_A3)}+{p(f_A3,f_B4)+p(f_B4,f_A3)}+{p(f_B3,f_A4)+p(f_A4,f_B3)}+{p(f_B3,f_B4)+p(f_B4,f_B3)}=(0+0)+(0+0)+(0+0)+(13+0)=13
と計算される。尚呼出頻度情報ρにないものは0として計算される。このようにして、出力テーブル54の全ての関数群間の呼出頻度Qを算出し、呼出頻度テーブルTを作成する。図56は、呼出頻度テーブルの一例を示す図である。
次に、本実施形態の使用時一定電圧メモリ割当部525の処理について説明する。本実施形態の使用時一定電圧メモリ割当部525は、関数サイズ情報52、出力テーブル54、呼出頻度テーブルTを参照して、使用時一定電圧メモリに関数を割り当てる。
図57は、第七の実施形態の使用時一定電圧メモリ割当部の処理を説明するフローチャートである。
使用時一定電圧メモリ割当部525は、配列M_rest[m]を使用時一定電圧メモリmのサイズで初期化する(ステップS5701)。尚mは、使用時一定電圧メモリの名前を表す。
続いて使用時一定電圧メモリ割当部525は、ステップS5702〜ステップS5704において、一つの関数群を割り当てるメモリを特定する。
具体的には、使用時一定電圧メモリ割当部525は、出力テーブル54を走査して合計コード量(関数群に含まれる全ての関数の低電圧部のサイズの合計)が最大である関数群を選ぶ。そしてその関数群の代表関数を関数f_Mとする(ステップS5702)。
次に使用時一定電圧メモリ割当部525は、関数f_Mを代表関数とする関数群が配置できる使用時一定電圧メモリを見つける(ステップS5703)。ここで使用時一定電圧メモリ割当部525は、配列M_rest[m]が関数f_Mを代表関数とする関数群の合計コード量以上となるような使用時一定電圧メモリmを見つける。ステップS5703で見つかったメモリmは、関数群f_Mの各関数の低電圧部を配置するメモリとされる。
尚本実施形態では、使用時一定電圧メモリのサイズは、図58に示すように関数サイズ情報52から取得されても良い。図58は、使用時一定電圧メモリのサイズ情報の一例を示す図であり、使用時一定電圧メモリのサイズ情報S1が示されている。
次に使用時一定電圧メモリ割当部525は、メモリmについて、配列M_rest[m]を配列M_rest[m]から関数f_Mを代表関数とする関数群を構成する各関数の低電圧部のサイズを減じた値に更新する(ステップS5704)。
次に使用時一定電圧メモリ割当部525は、ステップS5705〜ステップS5710にて、ステップS5702〜ステップS5704で割り当てたメモリmに配置する関数群を特定する。
使用時一定電圧メモリ割当部525は、まず関数群の代表関数の集合F={f|Q(f_M,f)>0}を算出する(ステップS5705)。この集合Fは、関数f_Mを代表とする関数群に所属する関数から呼び出されるか、または関数f_Mを代表とする関数群に所属する関数を呼び出すような関数の集合である。
使用時一定電圧メモリ割当部525は、集合Fが空集合か否かを判断する(ステップS5706)。ステップS5706において集合Fが空集合でない場合、関数f_Mを代表とする関数群に所属する関数から呼び出されるか、または関数f_Mを代表とする関数群に所属する関数を呼び出すような関数は存在する。
集合Fが空集合でない場合、使用時一定電圧メモリ割当部525は、呼出頻度Q(f_M,f)が最大となる関数fを代表とする関数群を選択する(ステップS5707)。但し、呼出頻度Q(f_M,f)が最大のものが複数存在する場合は、関数fを代表とする関数群のサイズ合計s(f)(各関数の低電圧部のサイズの合計)が最大のものを選択する。
次に使用時一定電圧メモリ割当部525は、その関数fを代表とする関数群のサイズ合計s(f)が配列M_rest[m]以下であるか否かを判断する(ステップS5708)。ステップS5708でサイズ合計s(f)が配列M_rest[m]以下であった場合、使用時一定電圧メモリ割当部525は、関数fを代表とする関数群の各関数の低電圧部を配置するメモリとしてメモリmを使用し、配列M_rest[m]を配列M_rest[m]からサイズ合計s(f)を減じた値に更新する(ステップS5709)。
そして使用時一定電圧メモリ割当部525は、関数fを代表とする関数群の低電圧部を配置するメモリが決定したか否かにかかわらず、集合Fから関数fを取り除く(ステップS5710)。ステップS5708でサイズ合計s(f)が配列M_rest[m]以下でない場合、ステップS5710へ進む。使用時一定電圧メモリ割当部525は、これを集合Fが空集合となるまでステップS5706以降の処理を繰り返す。
ステップS5706において集合Fが空集合であった場合、関数f_Mを代表とする関数群に所属する関数から呼び出されるか、または関数f_Mを代表とする関数群に所属する関数を呼び出すような関数は存在しない。したがって使用時一定電圧メモリ割当部525は、未割り当ての関数群が存在するか否かを判断する(ステップS5711)。ステップS5711において、未割り当ての関数が存在する場合、使用時一定電圧メモリ割当部525はステップS5702へ戻り、その関数群のうち合計コード量の大きい物から割り当てを続ける。ステップS5711において未割り当ての関数群の存在しない場合、使用時一定電圧メモリ割当部525は、全ての関数群のメモリ割当が完了しているので、処理を終了する。
以下に、具体例を挙げて使用時一定電圧メモリ割当部525の処理を説明する。
使用時一定電圧メモリ割当部525は、まず出力テーブル54から関数群の合計コード量が最大である、関数群F_A2(合計コード量4KB)を選択する。そして使用時一定電圧メモリ割当部525は、サイズ情報S1を参照して関数群F_A2を配置可能な使用時一定電圧メモリであるメモリB(サイズ8KB)を見つけ、関数群F_A2をメモリBへ割り当てる。このときメモリBの残りのメモリサイズは4KBとなる。
ここで、関数群F_A2と呼出関係のある関数群(呼出頻度Q(F_A2,G)>0を満たす関数群G)は、関数群F_A1と関数群F_A3である。このうち、関数群F_A2との呼出頻度Qは、関数群F_A1の方が大きい。関数群F_A1の合計コード量(2KB)は、メモリBの残りメモリサイズ(4KB)以下であり、メモリBに割り当て可能なので、使用時一定電圧メモリ割当部525は、関数群F_A1をメモリBへ割り当てる。
関数群F_A1が割り当てられたため、関数群F_A2と呼出関係がある関数群のうち、未割り当ての関数群は関数群F_A3のみとなる。関数群F_A3の合計コード量は2KBであり、メモリBの残りのメモリサイズと同じであるから、関数群F_A3はメモリBへ割り当て可能である。よって使用時一定電圧メモリ割当部525は、関数群F_A3をメモリBへ割り当てる。このときメモリBの残りのメモリサイズは0KBとなり、割り当て可能なメモリはメモリCのみとなる。
この時点で関数群F_A2と呼出関係がある関数群のうち、未割り当ての関数群は存在しない。したがって使用時一定電圧メモリ割当部525は、未割り当ての関数群F_A4、関数群F_A5のうち、合計コード量が最大である関数群F_A5(合計コード量3KB)をメモリC(メモリサイズ8KB)に割り当てる。このときメモリCの残りのメモリサイズは5KBとなる。
ここで関数群F_A5と呼出関係がある関数群のうち、未割り当ての関数群は関数群F_A4のみとなる。関数群F_A4の合計コード量は2KBであり、メモリCに割り当て可能である。よって使用時一定電圧メモリ割当部525は、関数群F_A4をメモリCへ割り当てる。
以上で全ての関数群が割り当て済みとなる。このようにして関数群を使用時一定電圧メモリに割り当てた結果を図59に示す。図59は、使用時一定電圧メモリの割り当て結果の一例を示す図である。
図59では、関数群F_A1、関数群F_A2、関数群F_A3は、使用時一定電圧メモリであるメモリBへ割り当てられている。また関数群F_A4、関数群F_A5は使用時一定電圧メモリであるメモリCへ割り当てられている。
本実施形態では、以上に説明したように、呼出関係のある関数群同士の呼出頻度等に基づきメモリマップを決定するため、関数が複数のメモリにまたがって配置されることを抑制することができる。したがって本実施形態では、メモリを低電圧状態とする制御コードを挿入する回数を低減することができ、且つ効率的に各メモリの電源制御を行うことができる。このため本実施形態では、更なる消費電力の削減に貢献することができる。
また本実施形態は、例えば第五の実施形態や第六の実施形態等と組み合わせることにより、さらなる消費電力の削減に貢献することができる。
本発明の実施形態は、以下に記載する付記のような構成が考えられる。
(付記1)
複数の領域を有するメモリに書き込まれるプログラムコードに、電源電圧が安定した状態で前記領域を切り替えられるように前記電源電圧を制御する制御コードを挿入する挿入位置を算出する挿入位置算出手段と、
前記メモリの構造情報と前記挿入位置とに基づきメモリマップを作成するメモリマップ生成手段と、
前記制御コードを前記挿入位置へ挿入してプログラムコードを生成するコード生成手段と、を有するコード生成装置。
(付記2)
前記挿入位置算出手段は、
一命令コードを一サイクルとして定められたサイクル数が実行される時間を前記電源電圧の変動にかかる時間として前記挿入位置を算出する付記1記載のコード生成装置。
(付記3)
前記プログラムコードをリンクして前記電源電圧を制御する制御コードが含まれるバイナリを出力するリンク手段を有する付記1又は2記載のコード生成装置。
(付記4)
前記挿入位置算出手段において算出された挿入位置において前記プログラムコードを分割する分割手段を有する付記1乃至3の何れか一項に記載のコード生成装置。
(付記5)
前記分割手段は、
前記プログラムコードの開始アドレスから前記挿入位置までのプログラムコードを前半部分とし、前記挿入位置以降のプログラムコードを後半部分として分割し、
前記コード生成手段は、
前記前半部分は常に電源電圧が供給されている領域へ配置され、
前記後半部分は使用時に電源電圧が供給される領域へ配置されるようにプログラムコードを生成する付記4記載のコード生成装置。
(付記6)
前記制御コードを前記プログラムコードへ挿入するコード挿入手段を有し、
前記コード挿入手段は、
前記前半部分の先頭へ前記後半部分が配置された領域へ電源電圧を供給させるための制御コードを挿入する付記5記載のコード生成装置。
(付記7)
前記コード挿入手段は、
前記前半部分の最後に前記後半部分が配置された領域へジャンプさせる制御コードを挿入する付記5又は6記載のコード生成装置。
(付記8)
前記プログラムコードは割込ハンドラを含み、
前記コード挿入手段は、
前記プログラムコードに対して呼出関係図を生成し、メイン関数と前記割込ハンドラとの両方から到達できる関数のノードを複製し、
前記割込ハンドラから複製された前記ノードへと関連付ける付記1乃至7の何れか一項に記載のコード生成装置。
(付記9)
前記プログラムコードのコードサイズを、前記制御コードのコードサイズに基づき前記制御コードを挿入した後のコードサイズに補正するコードサイズ補正手段を有する付記1乃至8の何れか一項に記載のコード生成装置。
(付記10)
前記コード生成手段は、
関数の呼出関係に従って下層に配置された関数からメイン関数へ復帰するまでの間に、一度使用された前記使用時に電源電圧が供給される領域が再度使用されない場合に、
前記使用時に電源電圧が供給される領域に配置された関数を呼び出す関数のコードに、前記使用時に電源電圧が供給される領域の電圧を前記電源電圧よりも低い電圧とする制御コードを挿入する付記1乃至9の何れか一項に記載のコード生成装置。
(付記11)
前記コード生成手段は、
関数毎のアセンブリコードを取得するコード取得手段と、
前記コード取得手段にて取得した関数のコードが前記使用時に電源電圧が供給される領域と前記常に電源電圧が供給される領域とに配置されているかを判定する配置判定手段と、
前記配置判定手段の判定を受けて、前記前半部分の先頭へ前記後半部分が配置された領域へ電源電圧を供給させるための制御コードを挿入するスリープ解除コード挿入手段と、
前記関数の命令が関数呼出命令であり且つ前記関数呼出命令により呼び出される関数が配置されている領域が、前記関数呼出命令が配置された領域と同一の領域又は前記常に電源電圧が供給される領域でない場合に、前記関数呼出命令の直後に前記使用時に電源電圧が供給される領域の電圧を電源電圧より低い電圧とする制御コードを挿入するスリープコード挿入手段と、を有する付記1乃至10の何れか一項に記載のコード生成装置。
(付記12)
前記コード生成手段は、
関数毎のアセンブリコードを取得するコード取得手段と、
メイン関数から前記関数に至るまでに使用する全ての使用時一定電圧メモリの集合である第一の集合と、前記関数が呼び出す呼出先関数が使用する使用時一定電圧メモリの集合である第二の集合とに共通部分が存在するか否かを示す情報が、前記関数が呼び出す呼出先関数それぞれについて格納されたテーブルを作成するスリープコード挿入可能表作成手段と、
前記コード取得手段にて取得した関数のコードが前記使用時に電源電圧が供給される領域と前記常に電源電圧が供給される領域とに配置されているかを判定する配置判定手段と、
前記配置判定手段の判定を受けて、前記前半部分の先頭へ前記後半部分が配置された領域へ電源電圧を供給させるための制御コードを挿入するスリープ解除コード挿入手段と、
前記関数の命令が関数呼出命令であって、且つ前記テーブルにおいて前記第一の集合と前記第二の集合とが前記共通部分が存在しない場合に、前記関数呼出命令の直後に前記使用時に電源電圧が供給される領域の電圧を電源電圧より低い電圧とする制御コードを挿入するスリープコード挿入手段と、を有する付記1乃至10の何れか一項に記載のコード生成装置。
(付記13)
前記メモリマップ作成手段は、
呼出頻度情報に従って、親関数を一つ特定する親関数決定手段と、
常時一定電圧メモリへの関数割り当てを実行する常時一定電圧メモリ割当手段と、
使用時一定電圧メモリに割り当てる関数群の使用時一定電圧メモリのコード量の合計を求めるコード量計算手段と、
前記使用時一定電圧メモリに割り当てる関数群間の呼出頻度を算出したテーブルを作成する呼出頻度算出手段と、
前記コード量計算手段により計算された前記コード量の合計と、前記呼出頻度算出手段で作成したテーブルとを元に、関数群毎に使用時一定電圧メモリへ割り当てる使用時一定電圧メモリ割当手段と、
前記使用時一定電圧メモリ割当手段の結果を参照し、前記常時一定電圧メモリ割当手段による割り当てを修正し、各関数の一定電圧部、低電圧部の開始アドレスを計算する割当調整・アドレス計算手段と、を有する付記1乃至12の何れか一項に記載のコード生成装置。
(付記14)
複数の領域を有するメモリに書き込まれるプログラムコードに、電源電圧が安定した状態で前記領域を切り替えられるように前記電源電圧を制御する制御コードを挿入する挿入位置を算出する挿入位置算出手順と、
前記メモリの構造情報と前記挿入位置とに基づきメモリマップを作成するメモリマップ生成手順と、
前記制御コードを前記挿入位置へ挿入してプログラムコードを生成するコード生成手順と、を実行するコード生成方法。
(付記15)
半導体集積回路へ実装されるプログラムコードを生成するコード生成装置において実行されるコード生成プログラムであって、
前記コード生成装置に、
複数の領域を有するメモリに書き込まれるプログラムコードに、電源電圧が安定した状態で前記領域を切り替えられるように前記電源電圧を制御する制御コードを挿入する挿入位置を算出する挿入位置算出ステップと、
前記メモリの構造情報と前記挿入位置とに基づきメモリマップを作成するメモリマップ生成ステップと、
前記制御コードを前記挿入位置へ挿入してプログラムコードを生成するコード生成ステップと、を実行させるコード生成プログラム。
本発明の実施形態は、具体的に開示された実施例に限定されるものではなく、特許請求の範囲から逸脱することなく、種々の変形や変更が可能である。