(57)【要約】【課題】装置の機能にかかわらず、メモリバンクへ適切に命令コードを配置して効率的な電力供給を可能にすること。【解決手段】まず、対象装置のファームウェアのソース１０１をコンパイルしてオブジェクト１０２を抽出する。同時に、コールグラフ作成部１２０によってソース１０１から命令同士の呼び出し関係を表すコールグラフ１０３を作成しておく。その後、命令配置装置１００によって、上述のように用意されたオブジェクト１０２と、コールグラフ１０３ならびに対象装置に搭載されているメモリバンクの分割状態（総容量いくつのメモリが、それぞれ容量いくつのメモリバンクに分割されているか）を表すメモリ分割情報１０４が取得され、配置情報１０５が作成される。作成された配置情報１０５は、対象装置のメモリバンクへの電力制御システム２００における命令コードの配置に利用されることによってメモリバンクへの供給電力の省電力化が可能になる。【選択図】図１
2010257437.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータを、
対象装置に適用されたファームウェア内の命令同士の呼び出し関係を表すコールグラフを取得する取得手段、
前記取得手段によって取得されたコールグラフによって表された命令のうち、最上位から所定階層以上に位置する第１の命令群と、当該命令以外の第２の命令群とに分類する分類手段、
前記分類手段によって第１の命令群に分類された命令を呼び出すためのコードを、前記対象装置に搭載されたメモリバンクのうち、常時電力が供給される第１のメモリバンクへ配置するように設定した配置情報を作成する作成手段、
前記作成手段によって作成された配置情報を出力する出力手段、
として機能させることを特徴とする命令配置プログラム。
【請求項２】
前記作成手段は、前記第２の命令群に分類された命令を呼び出すためのコードを、前記第１のメモリバンク以外のメモリバンクへ配置するように設定した配置情報を作成することを特徴とする請求項１に記載の命令配置プログラム。
【請求項３】
前記コンピュータを、さらに、
前記取得手段によって取得されたコールグラフによって表された命令に特定の命令が含まれているか否かを判断する判断手段、として機能させ、
前記作成手段は、前記判断手段によって前記特定の命令が含まれていると判断された場合、前記第１のメモリバンクに前記特定の命令を呼び出すコードを配置するように設定した配置情報を作成することを特徴とする請求項１または２に記載の命令配置プログラム。
【請求項４】
前記分類手段は、前記第１の命令群に分類された命令の中から所定の条件を満たす命令を、あらたに前記第２の命令群に分類することを特徴とする請求項１〜３のいずれか一つに記載の命令配置プログラム。
【請求項５】
対象装置に適用されたファームウェア内の命令同士の呼び出し関係を表すコールグラフを取得する取得手段と、
前記取得手段によって取得されたコールグラフによって表された命令のうち、最上位から所定階層以上に位置する第１の命令群と、当該命令以外の第２の命令群とに分類する分類手段と、
前記分類手段によって第１の命令群に分類された命令を呼び出すためのコードを、前記対象装置に搭載されたメモリバンクのうち、常時電力が供給される第１のメモリバンクへ配置するように設定した配置情報を作成する作成手段と、
前記作成手段によって作成された配置情報を出力する出力手段と、
を備えることを特徴とする命令配置装置。
【請求項６】
コンピュータが、
対象装置に適用されたファームウェア内の命令同士の呼び出し関係を表すコールグラフを取得する取得工程と、
前記取得工程によって取得されたコールグラフによって表された命令のうち、最上位から所定階層以上に位置する第１の命令群と、当該命令以外の第２の命令群とに分類する分類工程と、
前記分類工程によって第１の命令群に分類された命令を呼び出すためのコードを、前記対象装置に搭載されたメモリバンクのうち、常時電力が供給される第１のメモリバンクへ配置するように設定した配置情報を作成する作成工程と、
前記作成工程によって作成された配置情報を出力する出力工程と、
を実行することを特徴とする命令配置方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、メモリの省電力を目的とした命令配置プログラム、命令配置装置、および命令配置方法に関する。
【背景技術】
【０００２】
従来より、携帯電話機や小型情報端末など携帯用機器の普及は著しく、これら携帯用機器は、蓄電池からの供給電力によって駆動するという環境上、省電力化技術の開発が積極的に進められている。省電力技術としては、主に携帯用機器のロジック部分の処理負荷の軽減や、処理分散といったロジック部分の効率的な動作を担保する技術が提供されている。ところが、近年では、ＯＳや各種アプリケーションの推奨する動作環境や、処理速度の向上といった観点から携帯用機器に搭載されるメモリの容量も増加傾向にある。したがって、携帯用機器のロジックよりメモリの方が電力、回路規模に与える影響が大きく、メモリに対する省電力化技術に注目が集まっている。
【０００３】
すでに提供されている省電力技術としては、メモリを所定の容量ごとのメモリバンクに分割して、使用されていないメモリバンクへの電力供給を動的に制御するという手法が知られている。実際にメモリバンクへの電力供給を制御する場合には、電力が供給される通常モードと電力が供給されないスタンバイモードとの切り替えの間に時間的オーバーヘッドがかかってしまう。そこで、通話状態と待ち受け状態との切り替え状況を解析し、この解析結果を反映させることによってオーバーヘッドをなくしたシステムを構築する技術が開示されている（たとえば、下記特許文献１参照。）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００２−２６８０３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、上述した従来技術の場合、省電力化は図れるものの、適用対象が、通話と待ち受けとが発生する電話機能を備えた携帯型機器に限定されてしまう。一般的に、メモリバンクには、ファームとして提供されている命令を呼び出すためのコードが格納される。したがって、携帯電話端末のように、通話時と待ち受け時と、状況ごとに利用される命令が明確に分類可能であれば、分類した命令を呼び出すための命令コードをそれぞれ異なるメモリバンクへ配置すればよい。
【０００６】
ところが、電話機能をもつ機器以外では、上述したように命令コードを一意的に分類することはできない。結果として、命令コードを分散しても、各メモリバンクに常時電力を供給しなければならなかったり、電力供給先となるメモリバンクの切り替え処理が頻繁に発生してしまい、非効率な電力供給になってしまうという問題があった。
【０００７】
本開示技術は、上述した従来技術による問題点を解消するため、装置の機能にかかわらず、メモリバンクへ適切に命令コードを配置して効率的な電力供給を可能にする命令配置プログラム、命令配置装置および命令配置方法と、上述の技術によって命令コードが配置された対象装置によってメモリバンクの省電力化を実現する電力制御システムとを提供することを目的とする。
【課題を解決するための手段】
【０００８】
上述した課題を解決し、目的を達成するため、本開示技術は、コンピュータが、対象装置に適用されたファームウェア内の命令同士の呼び出し関係を表すコールグラフを取得する処理と、取得されたコールグラフによって表された命令のうち、最上位から所定階層以上に位置する第１の命令群と、当該命令以外の第２の命令群とに分類する処理と、前記第１の命令群に分類された命令を呼び出すためのコードを、前記対象装置に搭載されたメモリバンクのうち、常時電力が供給される第１のメモリバンクへ配置するように設定した配置情報を作成する処理と、作成された配置情報を出力する処理と、を含むことを特徴とする。
【０００９】
本開示技術によれば、コールグラフによって、命令同士の呼び出し関係を特定し、利用頻度の高い命令群とそれ以外の命令群とに分類する。そして、対象装置に搭載されたメモリバンクのうち、常時電力が供給されるメモリバンクへ利用頻度の高い命令群を配置するように設定した配置情報を作成することによって、電力供給先となるメモリバンクを頻繁に切り替えるような事態を避け、効率的な電力制御を図ることができる。
【発明の効果】
【００１０】
本命令配置プログラム、命令配置装置および命令配置方法によれば、装置の機能にかかわらず、メモリバンクへ適切に命令コードを配置して効率的な電力供給を可能にするとともに、本電力制御システムによれば、上述の技術によって命令コードが配置された対象装置によってメモリバンクの省電力化を実現するという効果を奏する。
【図面の簡単な説明】
【００１１】
【図１】本実施の形態にかかる命令配置処理の概要を示す説明図である。
【図２】電力制御システムの構成例を示す説明図である。
【図３】再帰的な呼び出しの一例を示す説明図である。
【図４−１】ＭＡＩＮ関数が最上位にある構成のファームウェアの一例を示すコールグラフである。
【図４−２】実際の関数の呼び出し関係を示すコールグラフである。
【図５】本実施の形態にかかる命令配置装置のハードウェア構成を示すブロック図である。
【図６】本実施の形態にかかる命令配置装置の機能的構成を示すブロック図である。
【図７】命令配置処理の手順を示す説明図である。
【図８】制御装置の構成を示す説明図である。
【図９】制御信号の構成例を示す説明図である。
【図１０】実施例１における配置情報作成手順を示すフローチャート（その１）である。
【図１１】実施例１における配置情報作成手順を示すフローチャート（その２）である。
【図１２】実施例１における配置情報作成手順を示すフローチャート（その３）である。
【図１３】実施例１における配置情報作成手順を示すフローチャート（その４）である。
【図１４】実施例１における配置情報作成手順を示すフローチャート（その５）である。
【図１５】分岐数の計数のイメージを示す説明図である。
【図１６】分岐数２以下と計数された場合の命令配置を示す説明図である。
【図１７】常時ＯＮバンクへの移動例を示す説明図である。
【図１８】バンク内の容量がオーバーした場合の処理を示す説明図である。
【図１９】プログラムコードに含まれる関数の静的なコールグラフとメモリマップとの関係を示す説明図である。
【図２０】関数に分岐がない場合の分割位置の算出処理を示す説明図である。
【図２１】関数に分岐がある場合の分割位置の算出処理を示す説明図である。
【図２２】マルチコアによる電力制御システムの構成を示す説明図である。
【図２３】マルチコアによる電力制御例を示す説明図である。
【図２４】ログの出力手順を示すフローチャートである。
【図２５】ログのフォーマットを示すデータテーブルである。
【図２６】各関数のデータサイズ例を示す説明図である。
【図２７】ログの出力例を示すデータテーブルである。
【図２８】修正後のログの出力例を示すデータテーブルである。
【図２９】ログを用いたソース修正手順を示すフローチャートである。
【図３０】実施例４〜９における命令配置装置の機能的構成を示すブロック図である。
【図３１】コールグラフの一例を示す説明図である。
【図３２】実施例４における命令配置処理を示す説明図である。
【図３３】テーブルＣのデータ例を示すデータテーブルである。
【図３４】テーブルＳのデータ例を示すデータテーブルである。
【図３５】テーブルＭのデータ例を示すデータテーブルである。
【図３６】親関数決定部の詳細な処理を示す説明図である。
【図３７】テーブル１の作成例を示すデータテーブルである。
【図３８】常時ＯＮメモリ割当部の詳細な処理を示す説明図である。
【図３９】常時ＯＮメモリ割当処理の手順を示すフローチャートである。
【図４０】初期化時のテーブルＭ＿ｒｅｓｔ・テーブル３のデータ例を示すデータテーブルである。
【図４１】テーブル２の作成例を示すデータテーブルである。
【図４２】テーブル３への割当処理の手順を示すフローチャートである。
【図４３】テーブルＭ＿ｒｅｓｔのデータ例を示すデータテーブルである。
【図４４】テーブル３への割当例を示すデータテーブルである。
【図４５】常時ＯＮメモリ割当処理の実行結果を示すデータテーブルである。
【図４６】コード量計算部の詳細な処理を示す説明図である。
【図４７】コード量算出の手順を示すフローチャートである。
【図４８】テーブル４の作成例を示すデータテーブルである。
【図４９】電力制御メモリ割当部の詳細な処理を示す説明図である。
【図５０】電力制御メモリ割当の手順を示すフローチャートである。
【図５１】初期化時のテーブルＭ＿ｒｅｓｔ・テーブル５のデータ例を示すデータテーブルである。
【図５２】ソートしたテーブル４を示すデータテーブルである。
【図５３】テーブル５への割当処理の手順を示すフローチャートである。
【図５４】合計コード量に応じたテーブルＭ＿ｒｅｓｔのデータ例を示すデータテーブルである。
【図５５】テーブル５に割り当てられたデータ例を示すデータテーブルである。
【図５６】電力制御メモリの割当処理の実行結果を示すデータテーブルである。
【図５７】割当調整・アドレス計算部の詳細な処理を示す説明図である。
【図５８】割当調整処理の手順を示すフローチャートである。
【図５９】割当調整後のテーブル３のデータ例を示すデータテーブルである。
【図６０】テーブル６−１の出力例を示すデータテーブルである。
【図６１】アドレス計算処理の手順を示すフローチャートである。
【図６２】初期化時の配列ａｄｄｒのデータ例を示すデータテーブルである。
【図６３】常時ＯＮメモリのメモリアドレス設定処理の手順を示すフローチャートである。
【図６４】常時ＯＮメモリのアドレス計算開始時のテーブル６・配列ａｄｄｒのデータ例を示すデータテーブルである。
【図６５】常時ＯＮメモリのアドレス計算完了時のテーブル６・配列ａｄｄｒのデータ例を示すデータテーブルである。
【図６６】電力制御メモリのメモリアドレス設定処理の手順（その１）を示すフローチャートである。
【図６７】電力制御メモリのメモリアドレス設定処理の手順（その２）を示すフローチャートである。
【図６８】電力制御メモリのアドレス計算開始時のテーブル６・配列ａｄｄｒのデータ例を示すデータテーブルである。
【図６９】電力制御メモリのアドレス計算実行後のテーブル６・配列ａｄｄｒのデータ例を示すデータテーブルである。
【図７０】子孫関数についてのアドレス計算時のテーブル６・配列ａｄｄｒのデータ例を示すデータテーブルである。
【図７１】子孫関数についてのアドレス計算完了時のテーブル６・配列ａｄｄｒのデータ例を示すデータテーブルである。
【図７２】実施例５における親関数決定部の処理を示す説明図である。
【図７３】重み付け和を利用した親関数決定処理を示す説明図である。
【図７４】重み付け例を示すデータテーブルである。
【図７５】実施例６におけるメモリ割当処理を示す説明図である。
【図７６】割当優先度情報付きのメモリ情報のデータ例を示すデータテーブルである。
【図７７】常時ＯＮメモリ割当時ソートの手順を示すフローチャートである。
【図７８】ソート後の割当優先度情報付きのメモリ情報のデータ例を示すデータテーブルである。
【図７９】電力制御メモリ割当時ソートの手順を示すフローチャートである。
【図８０】実施例７における電力制御メモリ割当処理を示す説明図である。
【図８１】残りメモリ量の評価の手順を示すフローチャートである。
【図８２】残りメモリ量の評価時のテーブル５・テーブルＭ＿ｒｅｓｔのデータ例を示すデータテーブルである。
【図８３】実施例８における関数複製処理を示す説明図である。
【図８４】実施例８における関数複製処理の手順を示すフローチャートである。
【図８５】関数複製対象となるテーブルＣのデータ例を示すデータテーブルである。
【図８６】関数複製済後のテーブルＣのデータ例を示すデータテーブルである。
【図８７】実施例９における関数複製処理の手順（その１）を示すフローチャートである。
【図８８】実施例９における関数複製処理の手順（その２）を示すフローチャートである。
【図８９】関数複製済後のテーブルＣのデータ例を示すデータテーブルである。
【図９０】関数複製後のテーブルＭ＿ｒｅｓｔのデータ例を示すデータテーブルである。
【発明を実施するための形態】
【００１２】
以下に添付図面を参照して、この発明にかかる命令配置プログラム、命令配置装置、および命令配置方法の好適な実施の形態を詳細に説明する。
【００１３】
（命令配置処理の概要）
まず、本実施の形態にかかる命令配置処理の概要について説明する。図１は、本実施の形態にかかる命令配置処理の概要を示す説明図である。本実施の形態では、まず、メモリの省電力化を図りたい対象装置に搭載されたメモリバンクの命令コードの配置位置を設定した配置情報１０５を作成する。
【００１４】
具体的な手順としては、まず対象装置のファームウェアのソース１０１をコンパイラ１１０によってコンパイルしてオブジェクト１０２を抽出する。同時に、コールグラフ作成部１２０によってソース１０１から命令同士の呼び出し関係を表すコールグラフ１０３を作成しておく。その後、命令配置装置１００によって、上述のように用意されたオブジェクト１０２と、コールグラフ１０３ならびに対象装置に搭載されているメモリバンクの分割状態（総容量いくつのメモリが、それぞれ容量いくつのメモリバンクに分割されているか）を表すメモリ分割情報１０４が取得されて配置情報１０５が作成される。作成された配置情報１０５は、対象装置のメモリバンクへの電力制御システム２００における命令コードの配置に利用される。
【００１５】
ここで、図２は、電力制御システムの構成例を示す説明図である。図２のように、本実施の形態では、プロセッサ２０１と、周辺回路２０２と、電源２０３と、制御装置２０４と、メモリバンク（バンク０〜３）２０５と、バス２０６とによって構成される対象装置のうち、メモリバンク２０５への電力制御に関連するハードウェア（電源２０３、制御装置２０４およびメモリバンク２０５）を電力制御システム２００として以下説明をおこなう。当然のことながら、図２の構成は対象装置の一例であり、電力制御システム２００相当の機能を含んでいれば、プロセッサ２０１の個数や周辺回路２０２の内容などは特に限定されない。
【００１６】
また、命令コードを配置するメモリバンクは、大きく２種類に分けられ、常時電力が供給される「常時ＯＮバンク」と、命令コードを読み出す場合にのみ電力が供給される「電力制御バンク」とが用意されているものとする。たとえば、図２のメモリバンク２０５の場合、バンク０，１が常時ＯＮバンク、バンク２，３が電力制御バンクといったように設定される。
【００１７】
したがって、メモリバンク２０５には、それぞれ電力のＯＮ／ＯＦＦを制御する制御機構として制御装置２０４が備えられている。なお、対象装置に応じて搭載されているメモリバンク２０５の総数が異なり、ファームウェア内の命令の構成によっては、常時ＯＮバンクに配置する命令コードの容量も増減し、常時ＯＮバンクの数も変化する。したがって、制御装置２０４も、メモリバンク２０５の数に応じた数の用意が必要となる。
【００１８】
このように、本実施の形態にかかる命令配置処理によって作成された配置情報１０５を利用するための対象装置のハードウェア構成について説明したが、その他にも、効率的な電力供給を担保した配置情報１０５を作成するには、ファームウェアの構成として下記のような前提条件を満たす必要がある。
【００１９】
１）再帰的な呼び出しを含まない
２）ポインタ関数を含まない
３）ＯＳなしでＭＡＩＮ関数が最上位に位置する構成をもつ
【００２０】
図３は、再帰的な呼び出しの一例を示す説明図である。上記１）の再帰的な呼び出しとは、一旦呼び出された関数がさらに下位の関数によって呼び出される構成を意味する。再帰的な呼び出しが含まれると、後述するコールグラフを作成した場合に、図３のように循環型グラフとなってしまい、適切な命令配置をおこなえない。
【００２１】
また、上記２）ポインタ関数とは、下記のように命令内に特定のアドレスに格納されている関数を呼び出すような構成の場合、命令の呼び出し対象があちこちに分散してしまう。すなわち、下記ｆｕｎｃ（）の中にアドレス０ｘ０８００００００が入るような構成を指す。
【００２２】
Ｖｏｉｄ  ｆｕｎｃ（）
｛
・・・
ＩＦ（ＦＬＡＧ＝＝１）ｂｒａ  ０ｘ０８００００００
・・・
【００２３】
そして、図４−１は、ＭＡＩＮ関数が最上位にある構成のファームウェアの一例を示すコールグラフである。上記３）のＭＡＩＮ関数が最上位に位置する構成とは、図４−１のように、ＭＡＩＮ関数が最上位に位置しており、その他の命令を表す関数が階層的に配置されている構成を意味する。なお、図４−２は、実際の関数の呼び出し関係を示すコールグラフである。図４−１に示したコールグラフでは、複数個所で呼び出された関数をそれぞれ別のものとしているため、同一の関数が複数表示されている。実際には、図４−２のように、複数個所で呼び出された関数を１つの点として表しても図４−１と同じ呼び出し関係にて構成されている。
【００２４】
上述のように、図４−１と図４−２とのいずれのコールグラフも同一の呼び出し関係であり、図４−１のように同じ関数が複数箇所に登場しても、実際には同一の箇所に配置された命令コードによって呼び出される。なお、以下では、視覚的なわかり易さを考慮して、図４−１のように、複数の関数から呼び出される関数をそれぞれ表したコールグラフを用いて、命令配置処理を説明する。
【００２５】
（命令配置装置のハードウェア構成）
つぎに、本実施の形態にかかる命令配置装置１００のハードウェア構成について説明する。図５は、本実施の形態にかかる命令配置装置のハードウェア構成を示すブロック図である。図５において、命令配置装置１００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）５０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）５０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）５０３と、磁気ディスクドライブ５０４と、磁気ディスク５０５と、通信Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）５０６と、入力デバイス５０７と、出力デバイス５０８と、を備えている。また、各構成部はバス５１０に
よってそれぞれ接続されている。
【００２６】
ここで、ＣＰＵ５０１は、命令配置装置１００の全体の制御を司る。ＲＯＭ５０２は、ブートプログラムや、本実施の形態にかかる命令配置処理を実現するための命令配置プログラムなどの各種プログラムを記憶している。ＲＡＭ５０３は、ＣＰＵ５０１のワークエリアとして使用される。磁気ディスクドライブ５０４は、ＣＰＵ５０１の制御にしたがって磁気ディスク５０５に対するデータの更新／参照を制御する。磁気ディスク５０５は、磁気ディスクドライブ５０４の制御で書き込まれたデータを記憶する。なお、図５のハードウェア構成では、記録媒体として、磁気ディスク５０５を用いているが、光ディスクや、フラッシュメモリなど他の記録媒体を利用してもよい。
【００２７】
通信Ｉ／Ｆ５０６は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク（ＮＥＴ）５０９に接続され、このネットワーク５０９を介して他の情報処理装置やその他の外部装置に接続される。そして、通信Ｉ／Ｆ５０６は、ネットワーク５０９と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。通信Ｉ／Ｆ５０６の構成例としては、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００２８】
入力デバイス５０７は、命令配置装置１００に対しての外部からの入力を受け付ける。入力デバイス５０７としては、具体的には、キーボード、マウスなどが挙げられる。キーボードの場合、たとえば、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウスの場合、たとえば、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。また、ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００２９】
出力デバイス５０８は、命令配置処理によって作成された配置情報を出力する。出力デバイス５０８としては、具体的には、ディスプレイ、プリンタなどが挙げられる。ディスプレイの場合、たとえば、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイとしてさらに、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。また、プリンタの場合、たとえば、画像データや文書データを印刷する。さらに、レーザプリンタやインクジェットプリンタを採用することができる。
【００３０】
（命令配置装置の機能的構成）
つぎに、命令配置装置の機能的構成について説明する。図６は、本実施の形態にかかる命令配置装置の機能的構成を示すブロック図である。図６のように、命令配置装置１００は、取得部６０１と、分類部６０２と、作成部６０３と、出力部６０４と、判断部６０５と、抽出部６０６と、算出部６０７と、を含む構成である。この制御部となる機能（取得部６０１〜算出部６０７）は、具体的には、たとえば、図５に示したＲＯＭ５０２、ＲＡＭ５０３、磁気ディスク５０５などの記憶領域に記憶された命令配置プログラムをＣＰＵ５０１に実行させることにより、または、通信Ｉ／Ｆ５０６により、その機能を実現する。
【００３１】
取得部６０１は、対象装置に適用されたファームウェア内の命令同士の呼び出し関係を表すコールグラフを取得する機能を有する。コールグラフ１０３は、図１のように、コールグラフ作成部１２０などによってあらかじめ作成されている。コールグラフ作成部１２０は、公知の技術として広く用いられているコールグラフ作成ツール（たとえば、ｃｏｄｅｖｉｚ，ｇｐｒｏｆ，ｐｙｃａｌｌｇｒａｐｈなど）によって実現されるため、詳細な説明は省略する。また、取得されたコールグラフは、ＲＡＭ５０３、磁気ディスク５０５などの記憶領域に記憶される。
【００３２】
分類部６０２は、取得部６０１によって取得されたコールグラフ１０３によって表された命令を分類する機能を有する。分類部６０２は、具体的には、コールグラフ１０３によって表された命令のうち（たとえば、図４−１のような命令群）、ＭＡＩＮ関数によって表された最上位の命令から所定階層以上に位置する第１の命令群と、第１の命令群以外の第２の命令群とに分類する。たとえば、最上位から２階層以内の命令とそれ以外の命令といったような分類がおこなわれる。なお、分類結果を表すデータは、ＲＡＭ５０３、磁気ディスク５０５などの記憶領域に記憶される。
【００３３】
このように、分類部６０２を設けることによって、ファームウェア内の命令を呼び出し頻度の高い命令とそれ以外の命令とに分類することができる。呼び出し頻度の高い命令とそれ以外の命令とに分類するための基本的な手法として、ここでは、コールグラフ１０３における階層を判断基準としている。なお、分類部６０２は、呼び出し頻度の高い命令を分類するための手法として他に、後述する判断部６０５、抽出部６０６および算出部６０７による処理結果を利用することもできる（詳しくは、各機能部の説明の際に記述する）。
【００３４】
作成部６０３は、分類部６０２による分類結果に応じて命令を呼び出すための命令コードをいずれのメモリバンク２０５へ配置するかを設定した配置情報１０５を作成する。具体的には、分類部６０２によって第１の命令群に分類された命令を呼び出すためのコードを、常時ＯＮバンクへ配置するように設定した配置情報１０５を作成する。また、作成部６０３は、第２の命令群（ファームウェア内の命令のうち第１の命令群以外の命令）に分類された命令を呼び出すためのコードを、電力制御バンクへ配置するように設定した配置情報１０５を作成する。
【００３５】
さらに、作成部６０３は、第２の命令群を呼び出すコードの配置を設定する際に、上位の階層の命令が一致する命令同士を同一の電力制御バンクへ配置するように設定した配置情報を作成する。すなわち、作成部６０３は、第２の命令群に分類された命令の命令コードをむやみに電力制御バンクのいずれかに配置するような設定を防ぐ。そして、作成部６０３は、少なくとも、上位の命令が同一の命令同士を、同一の電力制御バンクへ配置するような設定をおこなうことができる。
【００３６】
したがって、図４−１の例では、上位２階層までの命令が第１の命令群に分類された場合、Ｂ１から呼び出される下位の命令群（Ｃ１，Ｃ２，Ｄ１〜Ｄ３，Ｅ１〜Ｅ３）を同一の電力制御バンクへ配置し、Ｂ２から呼び出される下位の命令群（Ｃ３，Ｄ２，Ｄ４，Ｅ２〜Ｅ４）を同一の電力制御バンクへ配置するように設定する。なお、作成された配置情報１０５は、ＲＡＭ５０３、磁気ディスク５０５などの記憶領域に記憶される。
【００３７】
このように、作成部６０３を設けることによって、呼び出し頻度の高い命令（第１の命令群）の命令コードを常時ＯＮバンクへ配置するように設定した配置情報１０５を作成することができる。呼び出し頻度が高い命令を常時ＯＮバンクに優先的に配置することによって、電力制御バンクに配置されている命令を呼び出す機会が削減される。すなわち、電力が供給されていない可能性のある電力制御バンクに配置された命令を呼び出す頻度を低く抑えることができるため、従来の課題に挙げたようなオーバーヘッドが発生しにくい。
【００３８】
出力部６０４は、作成部６０３によって作成された配置情報１０５を出力する機能を有する。出力形式としては、たとえば、出力デバイス５０８として提供されたディスプレイへの表示、プリンタへの印刷出力、通信Ｉ／Ｆ５０６による外部装置への送信がある。また、出力された配置情報１０５は、ＲＡＭ５０３、磁気ディスク５０５などの記憶領域に記憶される。
【００３９】
判断部６０５は、取得部６０１によって取得されたコールグラフ１０３によって表された命令に特定の命令が含まれているか否かを判断する機能を有する。判断部６０５によって判断される特定の命令は、利用者によって任意に設定可能である。したがって、ファームウェア内の命令の構成に応じて使用頻度の高い命令を特定の命令に設定することができる。また、判断部６０５による判断結果は、ＲＡＭ５０３、磁気ディスク５０５などの記憶領域に記憶される。なお、判断部６０５によって、特定の命令が含まれていると判断された場合、作成部６０３は、常時ＯＮバンクに上述の特定の命令を呼び出すコードを配置するように設定した配置情報を作成する。
【００４０】
このように、判断部６０５を設けることによって、コールグラフ１０３によって表された階層に関係なく、指定した命令の命令コードを常時ＯＮバンクに配置させるように設定した配置情報を作成することができる。したがって、ファームウェアの命令の構成に応じて、柔軟に命令コードの配置を設定することができる。
【００４１】
抽出部６０６は、取得部６０１によって取得されたコールグラフ１０３によって表された命令のうち、所定数以上の命令からの呼び出し対象となっている命令を抽出する機能を有する。所定数は利用者によって適宜設定することができる。したがって、所定数として、たとえば３が設定されている場合、抽出部６０６は、コールグラフ１０３の呼び出し関係を参照して３回以上の呼び出し関係が発生している命令を抽出する。また、抽出部６０６による抽出結果は、ＲＡＭ５０３、磁気ディスク５０５などの記憶領域に記憶される。なお、抽出部６０６によって、命令が抽出された場合、作成部６０３は、常時ＯＮバンクに、抽出された命令を呼び出すコードを配置するように設定された配置情報を作成する。
【００４２】
このように、抽出部６０６を設けることによって、複数の命令から呼び出される可能性のある命令を抽出することができる。複数の命令から呼び出される可能性が高いとは、すなわち、利用頻度が高くなる可能性が高いことを意味している。したがって、抽出部６０６を備えることによって、上述した判断部６０５のように、利用者の手作業によって利用頻度が高くなると想定される命令を指定しなくても、自動的に利用頻度の高い命令を抽出することができる。
【００４３】
算出部６０７は、配置情報によって常時ＯＮバンクへ配置すると設定されたコードのデータの総量を算出する機能を有する。算出部６０７によって、あらかじめ、命令コードが配置された場合のデータの総量を算出しておくことによって、命令コードを常時ＯＮバンクに格納できるのか否かを判断することができる。また、算出されたデータは、ＲＡＭ５０３、磁気ディスク５０５などの記憶領域に記憶される。なお、作成部６０３は、算出部６０７によって算出されたデータの総量の値に応じて、常時ＯＮバンクの数を変更し、変更後の常時ＯＮバンクに、第１の命令群を呼び出すコードを分散して配置するように設定した配置情報を作成する。
【００４４】
また、算出部６０７は、常時ＯＮバンク、電力制御バンクを問わず、配置情報によって同一のメモリバンク２０５に配置すると設定されたコードごとに、それぞれデータの総量を算出してもよい。また、算出部６０７によって算出した各バンクのデータの総量は、出力部６０４によって出力することによって利用者に提供される。
【００４５】
このように、算出部６０７を設けることによって、第１の命令群として分類された命令コードが物理的に常時ＯＮバンクに配置可能か否かを判断できる。また、常時ＯＮバンク以外にも電力制御バンクに配置するために分類した第２の命令群も、それぞれ電力制御バンクに配置可能か否かを判断することができる。この算出結果に基づいて、命令コードが配置できないか（バンクの容量が足りない）、否かを判断して、常時ＯＮバンクや電力制御バンクの数を増減することもでき、効率的なバンク構成が可能となる。
【００４６】
（命令配置処理の手順）
つぎに、命令配置装置１００による命令配置処理の手順について説明する。図７は、命令配置処理の手順を示す説明図である。図７に示したように、以下の説明では、図４−１に例示したコールグラフ１０３によって表されるファームウェアの命令コードの配置情報１０５を作成する場合について説明する。
【００４７】
１）
まず、初期設定として、最低１つ以上の常時ＯＮバンクを設定しておく必要があるため、メモリバンク２０５のうちの１つのバンク（たとえば、バンク０）を常時ＯＮバンクに設定して、電力制御をおこなわないものとする。また、後述する手順によって、電力制御バンクへの配置処理を制御するため、メモリバンク２０５の総数をＮ（＝４）として設定しておく。
【００４８】
２）
つぎに、コールグラフ１０３のＭＡＩＮ関数および割り込みハンドラーの呼び出し関係を参照し、直接呼び出し関係にある下位の関数への分岐を順に特定していく。ここで特定された分岐数がＮ−１のとき、その分岐の直後の関数を各バンクの最上位関数とする。図７の場合、ＭＡＩＮ関数から特定された分岐はＢ１，Ｂ２の２つ、割り込みハンドラーから特定された分岐はＢ３の１つで、計３つの関数が特定される。そして、上述したように、Ｎ＝４であるため分岐数＝Ｎ−１となり、関数Ｂ１，Ｂ２，Ｂ３が最上位関数となる。
【００４９】
なお、特定された分岐数がＮ−１未満のときはＭＡＩＮ関数からさらに、下位の関数へ移行して分岐を特定する。たとえば、図７の例であれば、Ｂ１からさらに、下位のＣ１，Ｃ２やＢ２からさらに、下位のＣ３が特定される。下位の分岐を特定後、いまだＮ−１未満であれば、さらに、下位の関数への分岐を特定して、特定される関数がＮ−１になるまで、同様の特定処理を繰り返す。
【００５０】
なお、下位の関数を特定した際に、逆に分岐数がＮ−１を超えてしまうような場合には、特定処理を終了し、各分岐先から下位に接続されている関数を呼び出す際の命令コードの合計のサイズを計算する。ただし、サイズを計算する際に、複数の分岐先で使用されている関数分は除く。たとえば、図７において、Ｂ１から下位に接続されている関数の合計を求める際、Ｄ２，Ｄ３，Ｅ２，Ｅ３は、同じ階層のＢ２，Ｂ３の下位にも接続されている。したがって、Ｂ１以下に接続されている命令コードのサイズの合計を計算する場合には、排除される。こうして求めたサイズが大きい方からＮ−１個を選んで各バンクの最上位関数とする。
【００５１】
３）
上記２）において計算した最上位関数とそれ以下の関数のセットをメモリバンク２０５のうち電力制御バンクに配置する。そして、残った関数を（ＭＡＩＮや割り込みハンドラーなど）、常時ＯＮバンクに配置する。
【００５２】
４）
上記３）によって大まかな命令コードの配置が完了し、つぎに、関数の内容に応じて、より効率的な配置にするための調整処理がおこなわれる。まず、常時ＯＮバンク以外の電力制御バンクに配置された関数のうち複数のバンクで使用されている関数およびライブラリ関数を常時ＯＮバンクへ移動する。
【００５３】
５）
さらに、常時ＯＮバンクを除く各電力制御バンクのサイズと配置された関数の命令コードの合計を比較する。比較の結果、命令コードが格納できないと判断された電力制御バンクについては、さらに、バンク内の各関数を分割するための処理に移行する。たとえば、バンク内の最上位の関数について下位の接続を参照して、分岐可能な関数を探索する。ここでも、上記２）と同様に、分岐先から下位に接続されている関数を呼び出す際の命令コードの合計のサイズを計算して、電力制御バンクに配置可能となるように分岐を選択する。
【００５４】
６）
つぎに、メモリバンク２０５のうち、電力制御バンクに配置された最上位関数の先頭部分を電力制御のオーバーヘッドにかかる時間分だけ常時ＯＮに移動する。
【００５５】
７）
その後、常時ＯＮバンクのサイズと配置された関数の命令コードのサイズの合計とを比較する。この比較の結果、命令コードが常時ＯＮバンクに格納しきれないと判断された場合には、メモリバンク２０５のうち、常時ＯＮバンクの数を増加して、電力制御バンクへの配置処理を上記２）の処理からやり直す。なお、メモリバンク２０５の実装上、これ以上常時ＯＮバンクが増やせない状況であれば、格納しきれないものとしてそのまま処理を終了する（この結果を利用者に提供することによって、ソース１０１の修正に利用される）。
【００５６】
８）
以上７）までの処理が完了すると、各メモリバンク２０５に配置された最上位関数の先頭アドレス（分割後）と終了アドレスを電力制御ＯＮ、ＯＦＦのトリガとなるアドレスとして出力して配置情報１０５として供される。なお、図８は、制御装置の構成を示す説明図であり、図９は、制御信号の構成例を示す説明図である。上述のように作成された配置情報１０５を用いて、図８のような構成の制御装置２０４による電力制御をおこなう場合、上記８）の処理によって出力された配置情報１０５のアドレスをハードウェアに設定するコードをスタートアップに追加する。
【００５７】
そして、制御装置２０４のブート時にアドレスがハードウェアに設定され動的な電力制御が可能になる。電力制御が開始されると、図９に示すように、制御信号のリセット指示に応答して判定処理が実行される。ＰＣ（プログラムカウンタ）がＯＮアドレスと一致すると、動作状態となり、ＯＦＦアドレスと一致するとスタンバイ状態となる。
【００５８】
以上説明したように、本実施の形態にかかる命令配置処理を用いることによって、メモリバンク２０５ごとに関数をセットするため、常に常時ＯＮバンクのみあるいは常時ＯＮバンク＋１バンクのみが稼動状態となり、残りのバンクは、電力制御バンクとなり、通常はスタンバイ状態となる。具体的に説明すると、図７の例では、メモリバンク２０５の総数が４で、常時ＯＮバンク数が１のとき、個々のメモリバンク２０５に対して電力制御をおこなわない場合と比較すると、常に２バンク以上がスタンバイ状態となる。したがって、大幅な省電力化が期待できる。
【００５９】
また、頻繁に呼び出される利用頻度の高い命令を常時ＯＮバンクに集中して配置した配置情報１０５を作成する。したがって、電力制御バンクへの切り替え回数を抑えてオーバーヘッドを削減させるとともに、電力制御バンクのスタンバイ状態を長く維持できる点でも省電力化効果が期待できる。以下上述した命令配置処理を実現する際の具体例について、いくつか説明する。
【００６０】
（実施例１）
まず、実施例１として図７にて説明した手順によって配置情報１０５を作成する際の具体的なロジックの一例について説明する。図１０〜１４は、実施例１における配置情報作成手順を示すフローチャートである。配置情報１０５を作成するために、まず、図１０のフローチャートにおいて、まず、配置情報１０５の作成に利用する変数を初期化する（ステップＳ１００１）。
【００６１】
ステップＳ１００１では、具体的には、下記の変数が初期化される。
Ｎ：メモリバンク２０５総数
Ｐ：各メモリバンク２０５のサイズ
ｋ：常時ＯＮバンク数
ｌ：コールグラフ１０３のうち現在到達している分岐数
ｍ，ｎ，ｉ：計数用変数
【００６２】
そして、変数ｋ＝１に設定し（ステップＳ１００２）、メモリバンク２０５のうち、ｋ個のバンクを常時ＯＮバンクに設定する（ステップＳ１００３）。つぎに、変数ｌ＝１に設定し（ステップＳ１００４）、ＭＡＩＮ関数から分岐数ｌごとに関数個数を計数する（Ｓ１００５）。ここで、図１５は、分岐数の計数のイメージを示す説明図である。図１５のように、コールグラフ１０３の接続状態に応じてＭＡＩＮから分岐数ｌ＝１であれば、関数個数＝２、分岐数ｌ＝２であれば関数個数＝４とそれぞれ計数される。
【００６３】
つぎに、分岐数ｌにおける関数個数とＮ−１とを比較する（ステップＳ１００６）。Ｎ−１とは、すなわち、メモリバンク２０５のうち、常時ＯＮバンクを除いた電力制御バンクの総数を意味する。そして、ステップＳ１００６において、関数個数とＮ−１とが等しいと判断された場合（ステップＳ１００６：Ｙｅｓ）、図１２のステップＳ１２０１の処理に移行する。
【００６４】
一方、ステップＳ１００６において、関数個数とＮ−１とが等しくないと判断された場合（ステップＳ１００６：Ｎｏ）、関数個数がＮ−１よりも少ないか否かを判断する（ステップＳ１００７）。ここで、関数個数がＮ−１よりも少ないと判断された場合（ステップＳ１００７：Ｙｅｓ）、電力制御バンクに余裕があるため、関数個数を増加させるため、分岐数ｌを１インクリメントして（ステップＳ１００８）、再度、ステップＳ１００５の処理をおこなう。
【００６５】
ステップＳ１００７において、関数個数がＮ−１よりも少なくないと判断された場合（ステップＳ１００７：Ｎｏ）は、すなわち、関数個数が電力制御バンクよりも多い場合を表している（ステップＳ１００６の判断において、同数ではないと判断されているため）。したがって、つぎに、図１１のステップＳ１１０１の処理に移行する。
【００６６】
図１１のフローチャートにおいて、まず、変数ｍ，ｎを０に設定する（ステップＳ１１０１）。つぎに、ＭＡＩＮ関数からｌ分岐後のｍ番目の関数から分岐された関数のｎ番目ｆｕｎｃ［ｍ］［ｎ］が他でも使用されている関数か否かを判断する（ステップＳ１１０２）。上述のように、ｍ，ｎは初期値０に設定されているため、後述する処理に応じてｍ，ｎの値は加算され、すべての関数に関して漏らすことなくステップＳ１１０２の判断がおこなわれる。
【００６７】
ステップＳ１１０２において、指定された関数が他では使用されていないと判断された場合（ステップＳ１１０２：Ｎｏ）、ｍ配下の命令コードの量について、累積加算をおこなう。すなわち、仮サイズ［ｍ］＝仮サイズ［ｍ］＋（ｆｕｎｃ［ｍ］［ｎ］のサイズ）とする（ステップＳ１１０３）。ステップＳ１１０３において、仮サイズが求められた場合、もしくはステップＳ１１０２において、指定された関数が他では使用されていないと判断された場合（ステップＳ１１０２：Ｙｅｓ）、ｍ番目の関数の配下をすべて数えたか否かを判断する（ステップＳ１１０４）。
【００６８】
ステップＳ１１０４において、いまだに数えていない関数があると判断された場合は（ステップＳ１１０４：Ｎｏ）、ｎを１インクリメントして（ステップＳ１１０８）、ステップＳ１１０２の処理に移行する。一方、ステップＳ１１０４において、すべての関数について数え終えたと判断された場合（ステップＳ１１０４：Ｙｅｓ）、変数ｍが分岐数ｌ−１よりも小さいか否かを判断する（ステップＳ１１０５）。ここで、小さいと判断された場合は（ステップＳ１１０５：Ｙｅｓ）、ｍを１インクリメントして（ステップＳ１１０６）、ステップＳ１１０２の処理に移行する。
【００６９】
一方、ステップＳ１１０５において、変数ｍが分岐数ｌ−１よりも小さくないと判断された場合（ステップＳ１１０５：Ｎｏ）、コードサイズとして、上位ｌ−１におけるサイズを抽出する（ステップＳ１１０７）。ここで抽出されるコードサイズは、ステップＳ１１０３において算出された仮サイズ［ｍ］の上位ｌ−１個を抽出したサイズとなる。ここで、図１６は、分岐数２以下と計数された場合の命令配置を示す説明図である。このように、コードサイズが特定されると、図１２のステップＳ１２０１の処理に移行する。
【００７０】
図１６のように、ＭＡＩＮ関数から分岐数ｌ＝１に移行した後（Ｓ１）、Ｎ−１との比較によってさらに分岐数ｌ＝２に移行した場合（Ｓ２）、Ｂ１に着目すると、Ｂ１をｍ＝０の関数とした場合、ｍ＝０の配下の関数としてＢ２，Ｃ１が特定される。このとき、Ｂ２がｎ＝０の関数となり、Ｃ１がｎ＝１の関数となり、Ｂ１，Ｂ２，Ｃ１がｍ＝０配下の関数１６００として図１１にて説明した処理が施される。
【００７１】
図１２のフローチャートにおいて、まず、コードサイズ上位ｌ−１個に入らなかった関数を常時ＯＮバンクに移動する（ステップＳ１２０１）。その後、変数ｎを１に設定し（ステップＳ１２０２）、バンクｎに配置された関数の中でバンクｎ以外でも使用されているものを常時ＯＮバンクへ移動する（ステップＳ１２０３）。
【００７２】
最後に、変数ｎがメモリバンク２０５の総数Ｎよりも小さいか否かを判断し（ステップＳ１２０４）、小さいと判断された場合には（ステップＳ１２０４：Ｙｅｓ）、ｎをインクリメントして（ステップＳ１２０５）、あらたに設定されたｎに基づいて、ステップＳ１２０３の処理をおこなう。そして、変数ｎがメモリバンクの総数Ｎよりも小さくはないと判断された場合（ステップＳ１２０４：Ｎｏ）、図１３の、ステップＳ１３０１の処理に移行する。
【００７３】
ここで、図１７は、常時ＯＮバンクへの移動例を示す説明図である。図１７のように、コードサイズ上位ｌ−１に入らなかったＭＡＩＮ関数並びにＡ１，Ａ２は、常時ＯＮバンクであるバンク０に配置される。また、図１２の処理によってｍ＝０の配下に特定された関数であっても、他で使用される命令Ｂ２，Ｃ１は、同じく常時ＯＢバンクであるバンク０に移動される。
【００７４】
つぎに、図１３のフローチャートにおいて、まず変数ｎを常時ＯＮバンクｋの値に設定し（ステップＳ１３０１）、変数ｍを０に設定する（ステップＳ１３０２）。なお、ここで利用するｍは思考回数（処理の実行回数）を意味する。さらに、計数用の変数ｉを１に設定する（ステップＳ１３０３）。そして、上位階層からｉ番目の階層は常時ＯＮバンクに移動させたか否かを判断する（ステップＳ１３０４）。
【００７５】
ここで、上位階層からｉ番目の階層は常時ＯＮバンクに移動させていないと判断された場合（ステップＳ１３０４：Ｎｏ）、つぎに、バンク内の関数を計数する（ステップＳ１３０５）。そして、計数結果に基づいて、バンク内の関数がメモリバンク２０５に収まるか否かを判断する（ステップＳ１３０６）。ここで、収まると判断された場合（ステップＳ１３０６：Ｙｅｓ）、さらに、変数ｎがメモリバンク２０５の総数Ｎよりも小さいか否かを判断する（ステップＳ１３０７）。ここで、小さくないと判断された場合（ステップＳ１３０７：Ｎｏ）、そのまま図１４のステップＳ１４０１の処理に移行する。
【００７６】
一方、ステップＳ１３０７において、変数ｎがメモリバンク２０５の総数Ｎよりも小さいと判断された場合（ステップＳ１３０７：Ｙｅｓ）、ｎを１インクリメントして（ステップＳ１３０８）、ステップＳ１３０２の処理に移行する。また、ステップＳ１３０４において、上位階層からｉ番目の階層は常時ＯＮバンクに移動させていると判断された場合（ステップＳ１３０４：Ｙｅｓ）はそのまま、またステップＳ１３０６において、バンク内の関数がメモリバンクに収まらないと判断された場合（ステップＳ１３０６：Ｎｏ）、ｍを１インクリメントして（ステップＳ１３０９）、それぞれステップＳ１３１０の処理に移行する。
【００７７】
ステップＳ１３１０では、まず、ｉを１インクリメントする（ステップＳ１３１０）。そして、つぎに、上位階層からｉ番目の関数があるか否かを判断する（ステップＳ１３１１）。ここで、上位階層からｉ番目の関数がないと判断された場合（ステップＳ１３１１：Ｎｏ）、さらに、上位階層からｉ＋１番目の関数があるか否かを判断する（ステップＳ１３１２）。
【００７８】
ステップＳ１３１２において、上位階層からｉ＋１番目の関数がないと判断された場合（ステップＳ１３１２：Ｎｏ）、サイズ＝０として（ステップＳ１３１３）、ステップＳ１３０７の処理に移行する。一方、上位階層からｉ＋１番目の関数があると判断された場合（ステップＳ１３１２：Ｙｅｓ）、ステップＳ１３１０に移行してｉを１インクリメントする。
【００７９】
そして、ステップＳ１３１１において、上位階層からｉ番目の関数があると判断された場合（ステップＳ１３１１：Ｙｅｓ）、さらに、上位階層からｉ番目の関数は１個か否かを判断する（ステップＳ１３１４）。ここで、上位階層からｉ番目の関数は１個であるとい判断された場合は（ステップＳ１３１４：Ｙｅｓ）、ステップＳ１３０５の処理に移行する。
【００８０】
一方、ステップＳ１３１４において、上位階層からｉ番目の関数は１個ではないと判断された場合（ステップＳ１３１４：Ｎｏ）、さらに、ｉ番目の深さで最もサイズの大きい分岐を選択する（ステップＳ１３１５）。そして、ｉ番目階層以降で選択された関数、すなわち、ステップＳ１３１５にて選択された関数以外の関数を常時ＯＮバンクに移動し（ステップＳ１３１６）、ステップＳ１３０５の処理に移行する。
【００８１】
このように、図１３に示した処理によって、命令配置装置１００では、バンク内に配置する命令コードの合計がオーバーフローしないように調整することができる。ここで、図１８は、バンク内の容量がオーバーした場合の処理を示す説明図である。たとえば、メモリバンク２０５の１個あたりの容量が１６［Ｋｂｙｔｅ］の場合、図１８のように、バンク１に配置した命令の上位の命令Ｂ１のサイズが１６［Ｋｂｙｔｅ］を上回った時点で、下位の命令Ｂ２，Ｃ１は常時ＯＮバンクに移動される。また、バンク３のように、配置された命令の合計サイズが１６［Ｋｂｙｔｅ］を上回ってしまった場合には、サイズの最も小さいＣ４を常時ＯＮバンクに移動させる。すなわち、バンク３には、Ｂ３，Ｃ３の組み合わせが配置されることになり、合計サイズは１３［Ｋｂｙｔｅ］となる。したがって、バンク３の中になるべく空き領域が発生しないような配置になっている。
【００８２】
そして、図１４のフローチャートにおいて、まず、各バンクの最上位関数の先頭部分を常時ＯＮバンクへ移動する（ステップＳ１４０１）。このステップＳ１４０１をおこなうには、対象となる関数を分割する必要がある。したがって、ここで、図１９〜２１を用いて、上位関数の先頭部分を分割するための処理について説明する。
【００８３】
図１９は、プログラムコードに含まれる関数の静的なコールグラフとメモリマップとの関係を示す説明図である。図１９に示した例では、メモリ０を常時ＯＮバンクとしてメイン関数ｆｕｎｃＭが配置されている。またメモリ０には、メイン関数ｆｕｎｃＭに呼び出される関数ｆｕｎｃ１と関数ｆｕｎｃ２の一定電圧部Ｚ１、Ｚ２が配置されている。またメモリ０には、関数ｆｕｎｃ１、関数ｆｕｎｃ２に呼び出されるその他の関数ｆｕｎｃ３が配置されている。一方、メモリ１、メモリ２は、電力制御バンクとして機能するメモリであり、関数ｆｕｎｃ１と関数ｆｕｎｃ２の低電圧部Ｋ１、Ｋ２が配置されている。
【００８４】
図１４のステップＳ１４０１の処理では、電力制御バンクの上位関数として分類された関数は、図１９の関数ｆｕｎｃ１、関数ｆｕｎｃ２のように、分割され一部分を常時ＯＮバンクに配置させるものである。ここで、図２０は、関数に分岐がない場合の分割位置の算出処理を示す説明図である。そして、図２１は、関数に分岐がある場合の分割位置の算出処理を示す説明図である。
【００８５】
図１９のように関数を分割する場合、関数に分岐がない場合とある場合とを考慮する必要がある。まず、図２０の（Ａ）のように分岐のない関数の場合、まず、所定のサイクル数Ｎを設定する。これは電力制御によるオーバーヘッドにかかるサイクル数である。そして、（Ｂ）のように一命令を実行するサイクルを一サイクルとし、Ｎサイクル内の命令を辿った際に、分岐点を通過して到達し得る最も遠いアドレスを最遠アドレスとし、このアドレス部分を分割点として分割する。
【００８６】
また、図２１の（Ａ）のように分岐のある関数の場合も基本的には、上述したように、分岐がない場合と同様にサイクル数Ｎを設定するが、このとき、分岐によって生じる各経路を探索する。図２１の場合、経路１と経路２とが生じるため、（Ｂ）のように各経路についてＮサイクルで到達しうる最も遠いアドレスを求め、これが分割点となり、関数が分割される。
【００８７】
図１４のフローチャートに戻り、ステップＳ１４０１の処理が完了すると、つぎに、常時ＯＮバンクのサイズがＰ未満か否かを判断する（ステップＳ１４０２）。このステップＳ１４０２において、常時バンクのサイズがＰ未満であると判断された場合（ステップＳ１４０２：Ｙｅｓ）、電力制御バンクの最上位関数の先頭アドレス（ステップＳ１４０１による分割後）と、終了アドレスとを配置情報１０５として出力する（ステップＳ１４０３）。そして、最後に、配置情報１０５に、ステップＳ１４０１において分割した箇所に分岐命令を追加して（ステップＳ１４０４）一連の処理を終了する。
【００８８】
一方、ステップＳ１４０２において、常時ＯＮバンクのサイズがＰ未満ではないと判断された場合（ステップＳ１４０２：Ｎｏ）、さらに、常時バンクのサイズがＰより大きいか否かを判断する（ステップＳ１４０５）。ここで、そして、常時ＯＮバンクのサイズがＰより大きいと判断された場合は（ステップＳ１４０５：Ｙｅｓ）、常時ＯＮバンクの数が足りないと判断され、常時ＯＮバンク数ｋが１インクリメントされ（ステップＳ１４０６）、再度、図１０のステップＳ１００１の処理からやり直される。一方、ステップＳ１４０５において、常時ＯＮバンクのサイズがＰより大きくはないと判断された場合（ステップＳ１４０５：Ｎｏ）、常時ＯＮバンクの数は足りないものの、これ以上常時ＯＮバンクを増やせない状態であると判断され、最適な配置情報１０５を作成できないまま解なしとして（ステップＳ１４０７）、一連の処理を終了する。
【００８９】
以上説明したように、実施例１では、図１０〜１４に示したアルゴリズムに基づいて、コールグラフ１０３によって表された関数を常時ＯＮバンクと電力制御バンクとのいずれかから効率的に呼び出すために設定された配置情報１０５を作成することができる。
【００９０】
（実施例２）
実施例２では、マルチコアを備えた対象装置に適応するファームウェアの命令コードを配置する際の配置情報１０５の作成について説明する。図２２は、マルチコアによる電力制御システムの構成を示す説明図である。図２２のように、電力制御システム２２００の場合には、複数のプロセッサ２０１によってそれぞれ独立して命令コードの呼び出しがおこなわれる。
【００９１】
したがって、電力制御システム２２００の場合は、複数のプロセッサ２０１のうち、プロセッサ１を主体とするコア１と、プロセッサ２を主体とするコア２との呼び出し動作に分けて、それぞれ配置情報１０５を作成して、メモリバンク２０５に適用させる。
【００９２】
ここで、図２３は、マルチコアによる電力制御例を示す説明図である。図２３のようにマルチコアの場合には、コア１用の配置情報１０５とコア２用の配置情報１０５とをそれぞれ作成するため、メモリバンク２０５も、あらかじめコア１用とコア２用とに分類しておく必要がある。さらに、通信用関数をＭＡＩＮ関数と同様に最上位にもってきてツリーを構成することでシングルコアを各コア（コア１，２）に適用可能である。このとき、コアごとに使用バンクが分かれていない場合には、トップのＭＡＩＮ関数と通信用関数がコアの数分あると考えてそれぞれ配置させれば、実施例１にて説明した処理をそのまま適用することができる。
【００９３】
（実施例３）
実施例３では、配置情報１０５の作成の際にメモリバンク２０５内のデータ量に関するログを利用した命令配置を最適化する。実施例１にて説明したように、本実施の形態では、配置情報１０５を作成する際に、図１０〜１４のアルゴリズムが利用されている。実施例３では、このアルゴリズムにおけるバンク内のサイズ比較に関する処理結果をログとして出力させる。出力されたログは、より効率的な配置情報１０５を作成するため、ファームウェアのソースの構成自体の修正に利用される。
【００９４】
図２４は、ログの出力手順を示すフローチャートである。図２４のフローチャートは、図１３の処理を表すフローチャートである。実施例３では、図１３の処理におけるステップＳ１３０６およびステップＳ１３１３の結果をログとして出力させる（ステップＳ２４０１，Ｓ２４０２）。なお、ステップＳ１３０６の場合、Ｙｅｓ／Ｎｏにかかわらず判断結果をログとして出力させる。
【００９５】
たとえば、図２５は、ログのフォーマットを示すデータテーブルである。図２４にて説明したステップＳ２４０１ならびにＳ２４０２では、データテーブル２５００のようなフォーマットに基づいたログを出力させる。また、図２６は、各関数のデータサイズ例を示す説明図である。実施例１のアルゴリズムを実行させることによって、コールグラフ１０３を構成する関数のデータサイズが算出される。
【００９６】
ここで、図２７は、ログの出力例を示すデータテーブルである。図２６のようなコールグラフ１０３についてログを出力させた場合、まず、データテーブル２７００の思考１（１回目処理）の結果が提供される。利用者は、提供されたデータテーブル２７００を参照して配置情報１０５を修正することができる。
【００９７】
データテーブル２７００のように、思考１ではバンク３について容量が超えてしまっており、修正が必要なことが判断できる。したがって、思考２ではバンク３を分割してバンク０に関数を移動する。すると今度はバンク０が容量を超えてしまう。そこで、思考３にて、バンク１をあらたに常時ＯＮバンクとして再計算をおこなう。思考３の結果、バンク３が容量を超えているため、思考４によって、再度バンク３を分割してバンク０に関数を移動し、容量不足を解消した配置情報１０５を作成することができる。その結果が思考４であり、これが答えとして出力される。
【００９８】
また、なるべく常時ＯＮバンクの数を減らしたいという観点からデータテーブル２７００とは異なる修正をおこなうこともできる。データテーブル２７００のログを参照すると、バンク１，２の容量にはまだ余裕がある。そして、問題点はバンク３の余剰分をバンク０にもっていったときにバンク０が容量不足に陥る点にある。もしバンク０の関数をバンク１，２に分配できれば常時ＯＮバンクは１つで済むことになる。
【００９９】
そこで関数Ｃ２を呼び出す命令コードについては、中身は同じだが名称の異なるものを複数用意する。ここで、図２８は、修正後のログの出力例を示すデータテーブルである。関数Ｃ２について呼び出される下位の命令の違いに応じて、関数Ｃ２＿１と、関数Ｃ２＿２という別名を設定する。この場合、データテーブル２７００のように、同一の命令である関数Ｃ２＿１と、関数Ｃ２＿２とは、それぞれ別のバンクに配置される。この場合、常時ＯＮバンクを１つに抑え、なおかつ電力制御バンクの容量問題も解決することができる。
【０１００】
このように、実施例３では、配置情報１０５の修正を利用者によって人的におこなうための補助情報をログとして出力させている。そして、図２９は、ログを用いたソース修正手順を示すフローチャートである。図２９のフローチャートにおいて、まず、命令配置装置１００では、命令配置処理の実行に伴う実行ログを出力させる（ステップＳ２９０１）。つぎに、利用者は、ステップＳ２９０１によって出力されたログを解析して命令配置装置１００に入力されたソース１０１（図１参照）の配置情報１０５を修正する（ステップＳ２９０２）。
【０１０１】
ステップＳ２９０２におけるソース１０１の修正が終了すると、命令配置装置１００は、この修正ソースによる命令配置処理を実行させ、実行ログを出力させる（ステップＳ２９０３）。利用者は、ステップＳ２９０３によって出力された実行ログを参照して実行結果がＯＫか否かを判断する（ステップＳ２９０４）。このステップＳ２９０４において、実行結果に問題があると判断された場合は（ステップＳ２９０４：Ｎｏ）、再度、ステップＳ２９０２の処理に戻り、ソース（修正ソース）の修正処理に移行する。一方、ステップＳ２９０４において、実行結果に問題がなくＯＫであると判断された場合（ステップＳ２９０４：Ｙｅｓ）、そのまま、一連の処理を終了する。このように、実施例３では、実施例１における配置情報１０５作成処理によって作成された情報を出力させ、利用者による配置情報１０５の修正をアシストすることができる。
【０１０２】
以上実施例１〜３にて説明したように、本実施の形態にかかる命令配置プログラム、命令配置装置、および命令配置方法によれば、コールグラフ１０３によって、命令同士の呼び出し関係を特定し、利用頻度の高い命令群とそれ以外の命令群とに分類する。そして、対象装置に搭載されたメモリバンク２０５のうち、常時電力が供給されるメモリバンク２０５へ利用頻度の高い命令群を配置するように設定した配置情報１０５を作成する。結果として、電力供給先となるメモリバンク２０５を頻繁に切り替えるような事態を避け、効率的な電力制御を図ることができる。
【０１０３】
したがって、配置情報１０５を利用する対象装置のメモリバンク２０５のハードウェア構成にかかわらず、メモリバンク２０５へ適切に命令コードを配置して効率的な電力供給を可能にする。さらに、上述の処理によって作成された配置情報に応じて命令コードを配置することによって、メモリバンク２０５の省電力化を実現することができる。
【０１０４】
一方、実施例１〜３を利用した場合であっても、省電力化が望めないような事態も発生する。たとえば、複数の関数から呼び出される命令が所定数以上（たとえば、１つのメモリバンクに格納できない程の容量となる数）ある場合には、複数個のメモリバンク２０５を常時ＯＮバンクとして利用しなければならない。結果として、常時電力を供給しなければいけないメモリが増加し、命令配置処理による省電力効果が薄れてしまう。
【０１０５】
そこで、複数の関数から呼び出される命令が所定数以上の場合であっても、省電力効果を得るための実施例として、以下の実施例４〜９について説明する。具体的には、実施例４〜９の場合、２つ以上の関数から呼び出される命令について、更に、呼び出し内容に応じた場合分けをおこない、常時ＯＮバンクに配置する命令と、電力制御バンクに配置する命令とに振り分ける。そこで、実施例４では、２つ以上の関数から呼び出される命令についてのメモリバンク２０５への割当処理について説明する。そして、実施例５〜９では、実施例４の割当処理を利用した応用例について説明する。
【０１０６】
（実施例４〜９における命令配置装置の機能的構成）
図３０は、実施例４〜９における命令配置装置の機能的構成を示すブロック図である。実施例４〜９の場合、命令配置装置１００は、図６に示した分類部６０２の内部にさらに、機能部として、親関数決定部３００１と、常時ＯＮメモリ割当部３００２と、コード量計算部３００３と、電力制御メモリ割当部３００４と、割当調整・アドレス計算部３００５とを備える。そして、命令配置装置１００は、実施例１〜３と同様にソース１０１と、コールグラフ１０３と、メモリ分割情報１０４と、を利用して、配置情報１０５を作成する。
【０１０７】
なお、実施例４〜９において配置情報１０５を作成する際には、コールグラフ１０３に含まれている、ソース１０１内の各関数の呼び出し関係を表す関数呼出関係情報１０３−１および各関数を呼び出すためのコードの容量を表す関数コード量情報１０３−２と、メモリ分割情報１０４に含まれているメモリバンク２０５の構造を表すメモリ構造情報１０４−１と、が利用される。
【０１０８】
図３１は、コールグラフの一例を示す説明図である。以下の実施例４〜９の説明では、ソース１０１から作成したコールグラフ１０３が、図３１に示したような呼び出し関係をもつ場合を例に挙げて説明をおこなう。また、実施例１〜３と区別するため、階層数を表す変数を「Ｌ」とする。
【０１０９】
親関数決定部３００１は、ソース１０１を構成する関数ｆのうち、主要な親関数を決定する機能を有する。関数ｆの主要な親関数とは、関数ｆの親関数のうち、関数ｆを呼び出す回数が最多となる関数を指す。親関数決定部３００１では、ソース１０１のコールグラフ１０３（実施例４〜９、図３１の呼出関係をもつ）の場合を参照して主要親関数を決定する。
【０１１０】
常時ＯＮメモリ割当部３００２は、ソース１０１を構成する関数のうち、メモリバンク２０５群の常時ＯＮバンクとして利用するメモリバンク２０５に配置する関数を決定する機能を有する。具体的には、コールグラフ１０３によって表された階層関係のうち、常時ＯＮバンクとなるメモリバンク２０５に配置する関数の配置されている階層数や、具体的に常時ＯＮメモリのどこに割り当てるかを決定する。
【０１１１】
コード量計算部３００３は、ソース１０１を部分木に分解した際の部分木ごとのコード量を計算する機能を有する。なお、コールグラフ１０３をどのような部分木に分解するかは、任意に設定することができるが、親関数決定部３００１にて決定した主要な親関数の情報を使用すると木構造となるため、一意に決定することができる。
【０１１２】
電力制御メモリ割当部３００４は、ソース１０１を構成する関数のうち、常時ＯＮバンク以外の電力制御バンクとして利用するメモリバンク２０５に配置する関数を決定する機能を有する。具体的には、常時ＯＮメモリ割当部３００２によって常時ＯＮバンクに配置すると決定された関数以外の関数を、残りの電力制御バンクのいずれに配置するかを決定する。
【０１１３】
割当調整・アドレス計算部３００５は、電力制御バンクに配置すると決定された関数のうち、親関数の配置関係（どの関数とどの関数とが同一のメモリバンク２０５に配置されているか）による常時ＯＮバンク配置部分の要不要の調整処理（割当調整）と、配置された関数を呼び出すための関数の先頭のアドレスを計算処理（アドレス計算）する機能とを有する。割当調整によって、常時ＯＮバンクへの割当コード量を削減し、また不必要な電力制御コード及び分岐またはジャンプ命令の挿入を削減するなど、より効率的なコードとなる。また、アドレス計算することによって、割り当てた関数を実際に配置するときのアドレスを特定することができる。
【０１１４】
以下には、図３０のような機能的構成の命令配置装置１００を利用した命令配置処理の実施例４〜９について順に説明する。
【０１１５】
（実施例４）
実施例４は、実施例１〜３と同様に、メイン関数から、数階層以内の関数や、電力制御を解除するオーバーヘッド内に到達するアドレスまでの関数を常時ＯＮバンクへ配置する。その一方で、実施例４の場合、複数（２つ以上）の関数から呼出のある関数については、呼出元となる関数と、呼出先となる関数との関係に応じて、常時ＯＮバンクに配置する関数と、同一の電力制御バンクに配置する関数とに分ける処理をおこなう。
【０１１６】
図３２は、実施例４における命令配置処理を示す説明図である。実施例４の場合、親関数決定部３００１は、ソース１０１が入力されると、関数決定のための準備処理として、テーブルＣと、テーブルＳとをそれぞれ作成する。また、テーブル命令配置処理を実行する際には、テーブルＣと、テーブルＳに加えて、メモリ分割情報１０４からメモリ構造情報１０４−１を表すテーブルＭも作成しておく。
【０１１７】
図３３は、テーブルＣのデータ例を示すデータテーブルであり、図３４は、テーブルＳのデータ例を示すデータテーブルである。テーブルＣは、ソース１０１を構成する関数について、どのような呼出関係にあるかを一覧表示した構成になっている。なお、ソース１０１を構成する各関数のうち、呼出元（なんらかの関数を呼び出す）となる関数を「親関数」、呼出先（なんらかの関数から呼び出される）となる関数を「子関数」とよぶ。
【０１１８】
したがって、図３３に例示した、データテーブル３３００の場合、メイン関数（ＭＡＩＮ）は、ソース１０１をコンパイルしたオブジェクト１０２の実行状況に応じて、４つの子関数（Ａ１，Ａ２，Ａ３，Ａ４）を呼び出すような呼出関係になっている。また、テーブルＳは、関数ごとのコード量をそれぞれ一覧表示した構成になっている。また、テーブルＳによって表されるコード量は、図３４に例示したデータテーブル３４００のように、関数ごとの総コード量を表す「サイズ」と、関数を分割した際の「前半サイズ」と「後半サイズ」との３種類がある。
【０１１９】
図３５は、テーブルＭのデータ例を示すデータテーブルである。命令配置装置１００には、テーブルＣ，Ｓの他に、各メモリバンク２０５の構成を表すテーブルＭが与えられる。テーブルＭは、メモリバンク２０５の構成を一覧表示した構成になっており、メモリ構造情報１０４−１から作成される。具体的には、図３５のデータテーブル３５００のように、バンク０〜４の各メモリバンク２０５について開始アドレスと、サイズとが対応付けられている。
【０１２０】
まず、親関数決定部３００１は、テーブルＳを参照して、関数ごとに、呼出回数が最多となる親関数を特定し、特定結果を一覧表示したテーブル１を作成する。一方、常時ＯＮメモリ割当部３００２では、テーブルＳとテーブルＭとを参照して、常時ＯＮバンクに配置する関数の階層数とメモリ割当を決定する。常時ＯＮメモリ割当部３００２による処理結果として、階層数Ｌと常時ＯＮバンクへの割当結果を表すテーブル３が作成される。なお、テーブル２は、常時ＯＮメモリ割当部３００２の内部処理の際に作成されるため、常時ＯＮメモリ割当部３００２の説明の際に詳しく説明する。
【０１２１】
つぎに、コード量計算部３００３は、テーブル１，Ｓ，Ｃと階層数Ｌを用いて、部分木ごとのコード量を計算してテーブル４を作成する。部分木とは、ある関数を親関数とした場合に、この関数と呼出関係にあるすべての子関数を抽出した子孫関数群である。子孫関数とは、ある親関数の子関数（子関数１世代目）と、子関数１世代目の子関数（子関数２世代目）である孫関数とを網羅した関数群を意味する。テーブル４は、関数ごとに、呼出関係にある子孫関数を抽出するとともに、子孫関数の合計コード量の計算結果が関連付けられて一覧表示されている（詳しくは後述する）。
【０１２２】
そして、電力制御メモリ割当部３００４は、テーブル３，４，Ｍ，Ｓを利用して、部分木ごとのメモリ割当をおこなう。したがって、電力制御メモリ割当部３００４では、各関数の子孫関数を電力制御バンクの中のどのバンクに配置するかの割当処理がおこなわれる。そして、電力制御メモリ割当部３００４による割当結果は、テーブル５として出力される。
【０１２３】
最後に、割当調整・アドレス計算部３００５では、テーブルＭ，Ｓを利用してテーブル３，５に基づいた、メモリマップとしてテーブル６を作成する。テーブル６はソース１０１を構成するすべての関数について、それぞれ開始アドレスと配置されるメモリ名が対応付けて一覧表示された構成になっている。割当調整・アドレス計算部３００５によって作成されたテーブル６は、配置情報１０５として格納される。以下に、上述した各機能部の処理を詳細に説明する。
【０１２４】
＜親関数決定部の処理＞
図３６は、親関数決定部の詳細な処理を示す説明図である。親関数決定部３００１では、ソース１０１が入力されると、ソース１０１を構成する関数ごとに関数別の呼出回数をカウントする（ステップＳ３６０１）。ステップＳ３６０１のカウント処理によってテーブル１−１が作成される。
【０１２５】
テーブル１−１は、ソース１０１を構成する関数ごとに、呼出先の関数と呼出回数とを対応付けて一覧表示した構成になっている。すなわち、図３６に例示したテーブル１−１では、ＭＡＩＮ関数が、関数Ａ１を１０回呼び出していることがわかる。そして、親関数決定部３００１は、テーブル１−１を参照して、呼出先関数ごとに回数の欄が最大となる呼出元関数を選択することによって（ステップＳ３６０２）、テーブル１を作成する。
【０１２６】
テーブル１は、各関数について、それぞれ最も呼び出している呼出元の関数を表している。したがって、図３６の場合、テーブル１では、関数Ａ１を最も呼び出している呼出元はＭＡＩＮ関数であり、関数Ｂ１を最も呼び出している呼出元は関数Ａ１であることを意味する。
【０１２７】
図３７は、テーブル１の作成例を示すデータテーブルである。図３７のデータテーブル３７０１のように、ステップＳ３６０１の処理によって作成されるテーブル１−１は、ソース１０１内の関数ごとに、呼出先の子関数と、呼出される回数とが関連付けられている。なお、テーブル１−１に表示されている回数は、実際の動作時の呼出履歴から特定された値ではなく、図３１に示したようなコールグラフ１０３の呼出関係から特定される静的な値である。したがって、ソース１０１が表すコールグラフ１０３によって一意的に決定される値である。
【０１２８】
また、図３７に示すように、テーブル１−１を参照してテーブル１を作成する際、内部的には、まず、テーブル１−２が作成される。テーブル１−２は、データテーブル３７０２のように、テーブル１−１を子関数フィールドでソートした構成になっている。テーブル１−２を作成することによって、子関数ごとに最も回数の多い親関数（呼出元）が明らかになる。したがって、テーブル１−２の子関数ごとに回数が最大となる親関数を選択すれば、データテーブル３７０３のような構成のテーブル１が自動的に作成される。
【０１２９】
＜常時ＯＮメモリ割当部の処理＞
図３８は、常時ＯＮメモリ割当部の詳細な処理を示す説明図である。常時ＯＮメモリ割当部３００２では、テーブルＳ，Ｍと親関数決定部３００１によって作成されたテーブル１とを用いて常時ＯＮバンクに配置する関数の階層数Ｌと、常時ＯＮバンクに配置する関数の割当結果を表すテーブル３を作成する。なお、常時ＯＮメモリ割当部３００２によって常時ＯＮバンクに配置すると割り当てられた関数は、後述する割当調整・アドレス計算部３００５によって変更される場合があり、言わば仮割当の状態となる。
【０１３０】
図３９は、常時ＯＮメモリ割当処理の手順を示すフローチャートである。図３９のフローチャートは、常時ＯＮメモリ割当処理として、常時ＯＮバンクに配置する関数の階層数Ｌと、常時ＯＮバンクに配置する関数を一覧表示したテーブル３を作成する手順を表している。図３９の各処理を実行することによって、ソース１０１を構成する関数のうち、常時ＯＮバンクに配置する関数の候補（上述したように、割当調整・アドレス計算部３００５によって変更される場合があるため）を抽出することができる。
【０１３１】
図３９において、まず、割当処理に利用する変数Ｎ，Ｌ，Ｎ＿ＯＮの値を初期化する（ステップＳ３９０１）。変数Ｎはメモリバンク２０５の総数、変数Ｌは常時ＯＮバンクに配置する関数の階層数、変数Ｎ＿ＯＮは常時ＯＮバンク数をそれぞれ表す。変数Ｎは、電力制御システム内の構成に応じて一意的に決定されるため、固定値となる。その他の、変数Ｌ，Ｎ＿ＯＮは、初期化時には、最小値の１が設定される。
【０１３２】
つぎに、階層数に応じた関数の分岐数Ｆを設定する（ステップＳ３９０２）。具体的には、Ｆは現在の階層数Ｌから階層数Ｌ＋１階層目までの分岐数が設定される。つぎに、分岐数Ｆが、Ｎ−Ｎ＿ＯＮ、すなわち、電力制御バンク数よりも少ないか否かを判断する（ステップＳ３９０３）。ここで、Ｆ＜Ｎ−Ｎ＿ＯＮ、すなわち、分岐数Ｆが電力制御バンク数よりも少ないと判断された場合（ステップＳ３９０３：Ｙｅｓ）、階層数Ｌを＋１インクリメントして（ステップＳ３９０４）、再度ステップＳ３９０２の処理をおこなう。
【０１３３】
ステップＳ３９０３において、分岐数Ｆが電力制御バンク数以上であると判断されると（ステップＳ３９０３：Ｎｏ）、つぎに、テーブルＭ＿ｒｅｓｔ・テーブル３を初期化する（ステップＳ３９０５）。テーブルＭ＿ｒｅｓｔは、テーブルＭによって表された各メモリバンク２０５に関数を配置後の残りの容量を一覧表示した構成になっている。
【０１３４】
図４０は、初期化時のテーブルＭ＿ｒｅｓｔ・テーブル３のデータ例を示すデータテーブルである。ステップＳ３９０５の初期化時は、いずれのメモリバンク２０５にも関数が割り当てられていない。したがって、テーブルＭ＿ｒｅｓｔは、データテーブル４０１０のように、テーブルＭと同じ値になっている。同様に、テーブル３もデータテーブル４０２０のように関数が割当られていない空の状態になっている。
【０１３５】
各テーブルが初期化されると、つぎに、テーブル２に所定の条件を満たす関数ｆｕｎｃを追加する（ステップＳ３９０６）。テーブル２は常時ＯＮバンクに配置する関数の候補を抽出するためのテーブルである。
【０１３６】
図４１は、テーブル２の作成例を示すデータテーブルである。ステップＳ３９０６では、テーブルＳを構成する関数フィールド  テーブルＳ［ｆｕｎｃ］の中から下記のような条件を満たす関数ｆｕｎｃをテーブル２に追加する。追加された関数は、データテーブル４１００のように、テーブル２を構成する関数フィールド  テーブル２［ｆｕｎｃ］として設定される。
【０１３７】
階層数Ｌまでの関数：
テーブル２［ｆｕｎｃ］．サイズ＝テーブルＳ［ｆｕｎｃ］．サイズ
（なお、“テーブル２［ｆｕｎｃ］．サイズ”とはテーブル２の最も左にあるフィールドである関数フィールドがｆｕｎｃであるようなエントリの、サイズフィールドの値を示す。ただし、テーブル２のようにフィールドが２つの場合は、“．”以降のフィールド名の指定を省略することもある。）
階層数Ｌ＋１の関数：
テーブル２［ｆｕｎｃ］．サイズ＝テーブルＳ［ｆｕｎｃ］．分割前半サイズ
階層数Ｌ＋２以下の関数のうち、複数の関数から呼び出される関数：
テーブル２［ｆｕｎｃ］．サイズ＝テーブルＳ［ｆｕｎｃ］．分割前半サイズ
【０１３８】
図３９の説明に戻り、テーブル２に格納されている関数ｆｕｎｃのサイズ順にテーブル３への割当処理をおこなう（ステップＳ３９０７）。ステップＳ３９０７では、サイズの大きな関数順に割当処理がおこなわれる。以下に、割当処理の手順について詳細に説明する。
【０１３９】
図４２は、テーブル３への割当処理の手順を示すフローチャートである。図４２のフローチャートは、テーブルＭからテーブル２に抽出された関数について、Ｆｉｒｓｔ  Ｈｉｔアルゴリズムによりテーブル３へ割り当てる関数を抽出する手順を表している。図４２の各処理を実行することによって、常時ＯＮバンクに配置される関数を決定することができる。
【０１４０】
図４２において、まず、テーブルＭのメモリ名フィールドに属する要素ｍのうち、下記式（１）を満たす最初のメモリｍを抽出する（ステップＳ４２０１）。
【０１４１】
Ｍ＿ｒｅｓｔ［ｍ］≧テーブル２［ｆｕｎｃ］    …（１）
【０１４２】
つぎに、抽出したメモリＭ＿ｒｅｓｔ［ｍ］からテーブル２［ｆｕｎｃ］を引いたものをあらたにＭ＿ｒｅｓｔ［ｍ］に設定する（ステップＳ４２０２）。最後に、テーブル３［ｍ］．の関数にｆｕｎｃを追加して（ステップＳ４２０３）、一連の割当処理を終了する。
【０１４３】
図４３は、テーブルＭ＿ｒｅｓｔのデータ例を示すデータテーブルであり、図４４は、テーブル３への割当例を示すデータテーブルである。テーブルＭ＿ｒｅｓｔの値がデータテーブル４１００のような構成の場合、ステップＳ４２０１では、Ｍ＿ｒｅｓｔ［ｍ］≧テーブル２［ｆｕｎｃ］となるサイズを満たす最初の要素ｍとしてバンク０が抽出される。したがって、ステップＳ４２０２では、バンク０のサイズとして、データテーブル４３００のように、４０９６−３０００＝１０９６［ｂｙｔｅ］が設定される。また、ステップＳ４２０３の処理によってテーブル３には、データテーブル４４００のように、バンク０のエントリにＭＡＩＮ関数が追加される。
【０１４４】
図３９の説明に戻り、ステップＳ３９０７の処理が終了すると、つぎに、テーブル３内の空集合でないエントリ数がＮ＿ＯＮよりも多いか否かを判断する（ステップＳ３９０８）。テーブル３内の空集合でないエントリ数がＮ＿ＯＮよりも多いと判断された場合（ステップＳ３９０８：Ｙｅｓ）、常時ＯＮバンクの数が足りないため、Ｎ＿ＯＮの値を＋１インクリメントし、Ｌの値を１に設定して（ステップＳ３９０９）、再度、ステップＳ３９０２からの処理を繰り返す。
【０１４５】
一方、テーブル３内の空集合でないエントリ数がＮ＿ＯＮよりも多くはないと判断された場合（ステップＳ３９０８：Ｎｏ）、テーブル３に割り当てた関数は常時ＯＮバンクに配置可能となるため、現在設定されている階層数Ｌとテーブル３を出力して（ステップＳ３９１０）、一連の割当処理を終了する。
【０１４６】
図４５は、常時ＯＮメモリ割当処理の実行結果を示すデータテーブルである。図３９のフローチャートを実行した結果、テーブルＭ＿ｒｅｓｔとしてデータテーブル４５１０，テーブル３としてデータテーブル４５２０がそれぞれ出力される。
【０１４７】
＜コード量計算部の処理＞
図４６は、コード量計算部の詳細な処理を示す説明図である。コード量計算部３００３では、テーブルＳ，Ｃと、親関数決定部３００１によって作成されたテーブル１と、常時ＯＮメモリ割当部３００２によって作成された階層数Ｌとを用いて、電力制御バンクに配置する子孫関数のコードの総量を計算する。コード量計算部３００３による計算処理によってテーブル４が作成される。
【０１４８】
図４７は、コード量算出の手順を示すフローチャートである。図４７のフローチャートは、親関数として決定された関数以外の子孫関数のコード量を表すテーブル４を作成する手順を表す。図４７の各処理を実行することによって、同一の電力制御バンクに配置する関数群のコード量を特定することができる。
【０１４９】
コード量計算部３００３では、まず、テーブル１上でのＬ＋１階層の関数ｆｕｎｃを抽出する（ステップＳ４７０１）。つぎに、抽出した各関数ｆｕｎｃの値を下記のように設定する（ステップＳ４７０２）。
【０１５０】
Ｆ＿Ｄ＝｛ｆｕｎｃのテーブル１上での子孫｝
ｓ＝テーブルＳ［ｆｕｎｃ］．分割後半サイズ＋Ｆ＿Ｄに含まれる各関数のテーブルＳのサイズフィールドの総和
【０１５１】
そして、ステップＳ４７０２の設定値を利用してテーブル４の各値を下記のように設定する（ステップＳ４７０３）。設定後のテーブル４を出力して（ステップＳ４７０４）、一連の算出処理を終了する。
【０１５２】
テーブル４［ｆｕｎｃ］．子孫関数＝Ｆ＿Ｄ
テーブル４［ｆｕｎｃ］．合計コード量＝ｓ
【０１５３】
たとえば、Ｌ＋１＝２（階層）の場合、ステップＳ４７０１によって抽出される関数ｆｕｎｃは、Ａ１，Ａ２，Ａ３，Ａ４となる。関数Ａ１において、ステップＳ４７０２の処理をおこなうと、Ｆ＿Ｄ＝｛Ｂ１，Ｂ２，Ｂ３，Ｂ１０，Ｃ１｝と設定される。これらの値は、テーブル１におけるＡ１の子孫関数であり、Ｂ１，Ｂ２，Ｂ３，Ｂ１０がＡ１の子関数、Ｃ１がＢ１０の子関数となる。
【０１５４】
同様に、ｓ＝１２８６０［ｂｙｔｅ］となる。具体的には、ｓ＝関数Ａ１の分割後半サイズ＋関数Ｂ１のサイズ＋関数Ｂ２のサイズ＋関数Ｂ３のサイズ＋関数Ｂ１０のサイズ＋関数Ｃ１のサイズ＝２４６０＋２５６０＋２５６０＋２５６０＋２５６０＋１６０＝１２８６０［ｂｙｔｅ］となる。
【０１５５】
図４８は、テーブル４の作成例を示すデータテーブルである。ステップＳ４７０２において、まず、関数Ａ１について各値が設定されデータテーブル４８１０が作成される。同様に、他の関数についても各値が設定され、データテーブル４８２０が作成され、テーブル４として出力される。
【０１５６】
＜電力制御メモリ割当部の処理＞
図４９は、電力制御メモリ割当部の詳細な処理を示す説明図である。電力制御メモリ割当部３００４では、テーブルＳ，Ｍと、常時ＯＮメモリ割当部３００２によって作成されたテーブル３と、コード量計算部３００３によって作成されたテーブル４とを用いて、部分木ごとの電力制御バンクを割り当てたテーブル５を作成する。なお、上述したように電力制御メモリ割当部３００４では、部分木として子孫関数として同じ親関数に対応付けられた関数群が処理される。
【０１５７】
図５０は、電力制御メモリ割当の手順を示すフローチャートである。図５０のフローチャートは、Ｌ＋１階層以下の関数についてのメモリバンク２０５への割当処理の手順を表している。図５０の各処理を実行することによって、ソース１０１を構成する関数のうち、配置先が決定していない残りの関数を適切な電力制御バンクに割り当てることができる。
【０１５８】
図５０において、まず、テーブルＭ＿ｒｅｓｔ、テーブル５の値を初期化する（ステップＳ５００１）。テーブルＭ＿ｒｅｓｔでは、テーブル３に設定されている関数が空集合でない場合は、すなわち、なんらかの関数が設定されているバンクについては、０［ｂｙｔｅ］、それ以外のバンクについてはテーブルＭに設定されたサイズをそのまま流用する。また、テーブル５の関数（親関数）には、テーブル４の関数（親関数）、テーブル５の子孫関数には、テーブル４の子孫関数をそのまま流用する。
【０１５９】
図５１は、初期化時のテーブルＭ＿ｒｅｓｔ・テーブル５のデータ例を示すデータテーブルである。ステップＳ５００１のように初期化をおこなった場合、テーブルＭ＿ｒｅｓｔは、データテーブル５１１０のように、常時ＯＮバンクとして利用されるバンク０，１には、すでに関数が設定されているため、サイズは０［ｂｙｔｅ］となる。そして、残りのバンク２〜４には、関数が設定されていないため、それぞれ、テーブルＭの値がそのまま設定される。また、テーブル５は、データテーブル５１２０のようにテーブル４の設定値がそのまま設定される。
【０１６０】
図５０の説明に戻り、各テーブルを初期化後、テーブル４の関数をＦｉｒｓｔ  Ｈｉｔ  Ｄｅｃｒｅａｓｉｎｇアルゴリズムにより、電力制御バンクへの割当処理を実行する。すなわち、テーブル４の関数を合計コード量が大きい順に並べ替え（ステップＳ５００２）、テーブル４の関数について並べ替えた順にテーブル５の割当処理を実行する（ステップＳ５００３）。電力制御メモリ割当部３００４は、ステップＳ５００３の処理が終了すると、テーブル５を出力する（ステップＳ５００４）。以下には、ステップＳ５００３の割当処理について詳細に説明する。
【０１６１】
図５２は、ソートしたテーブル４を示すデータテーブルである。ステップＳ５００２の処理によってソートしたテーブル４はデータテーブル５２００のように、合計コード量が大きい順に並べられている。
【０１６２】
図５３は、テーブル５への割当処理の手順を示すフローチャートである。図５３のフローチャートは、ステップＳ５００３によるテーブル５への割当処理の手順を表している。図５３の各処理を実行することによって、テーブル５に設定された各関数の子孫関数を割り当てるメモリバンク２０５（電力制御バンク）を設定することができる。
【０１６３】
図５３において、まず、テーブルＭのメモリ名フィールドに登場する要素ｍのうちＭ＿ｒｅｓｔ［ｍ］≧テーブル４［ｆｕｎｃ］．合計コード量を満たす最初のメモリｍを抽出する（ステップＳ５３０１）。そして、抽出したＭ＿ｒｅｓｔ［ｍ］からテーブル４［ｆｕｎｃ］．合計コード量を引いたコード量をＭ＿ｒｅｓｔ［ｍ］のサイズに設定する（ステップＳ５３０２）。その後、テーブル５［ｆｕｎｃ］の割当メモリとして抽出されたｍを設定する（ステップＳ５３０３）。
【０１６４】
図５４は、合計コード量に応じたテーブルＭ＿ｒｅｓｔのデータ例を示すデータテーブルであり、図５５は、テーブル５に割り当てられたデータ例を示すデータテーブルである。テーブルＭ＿ｒｅｓｔの値がデータテーブル５１１０のような構成の場合、ステップＳ５３０１では要素ｍとしてバンク２が抽出される。したがって、ステップＳ５３０２では、バンク２のサイズとして、データテーブル５４００のように、１８３８４−１２８６０＝３５２４［ｂｙｔｅ］が設定される。また、ステップＳ５３０３の処理によってテーブル５には、データテーブル５５００のように、関数Ａ１の割当メモリとしてバンク２が設定される。
【０１６５】
図５６は、電力制御メモリの割当処理の実行結果を示すデータテーブルである。ステップＳ５００４によってテーブル４に設定されたすべての関数についての割当処理が終了すると、テーブルＭ＿ｒｅｓｔとしてデータテーブル５６１０、テーブル５としてデータテーブル５６２０がそれぞれ作成される。
【０１６６】
＜割当調整・アドレス計算部の処理＞
図５７は、割当調整・アドレス計算部の詳細な処理を示す説明図である。割当調整・アドレス計算部３００５では、常時ＯＮバンク配置修正（ステップＳ５７０１）と、アドレス計算（ステップＳ５７０２）との２つの処理がおこなわれる。まず、テーブルＣと、テーブル３，５と、階層数Ｌと、を利用して、テーブル６−１を作成する。その後、テーブルＳ，Ｍと、テーブル５，６−１と、階層数Ｌとを利用して、テーブル６を作成する。
【０１６７】
図５８は、割当調整処理の手順を示すフローチャートである。図５８のフローチャートは、ステップＳ５７０１における常時ＯＮバンク配置修正の手順を表す。図５８の各処理を実行することによって、テーブル３に設定されている関数が常時ＯＮバンクに配置する関数として適しているかを選別したテーブル６−１を作成することができる。
【０１６８】
図５８において、まず、テーブル３上の関数ｆｕｎｃを抽出し（ステップＳ５８０１）、抽出した関数ｆｕｎｃがテーブル１において、Ｌ＋２階層以下か否かを判断する（ステップＳ５８０２）。ステップＳ５８０２において、抽出した関数ｆｕｎｃがテーブル１において、Ｌ＋２階層以下であると判断された場合（ステップＳ５８０２：Ｙｅｓ）、さらに、抽出した関数ｆｕｎｃがテーブルＣ上で親関数が複数存在するか否かを判断する（ステップＳ５８０３）。
【０１６９】
ステップＳ５８０３において、抽出した関数ｆｕｎｃがテーブルＣ上で親関数が複数存在すると判断された場合（ステップＳ５８０３：Ｙｅｓ）、さらに、抽出した関数ｆｕｎｃがテーブル５上で親関数が同じバンクに分割されているか否かを判断する（ステップＳ５８０４）。ステップＳ５８０４において、抽出した関数ｆｕｎｃがテーブル５上で親関数が同じバンクに分割されていると判断された場合（ステップＳ５８０４：Ｙｅｓ）、テーブル３からｆｕｎｃを削除する（ステップＳ５８０５）。
【０１７０】
ステップＳ５８０５の処理が終了すると、つぎに、抽出した関数ｆｕｎｃをすべて処理したか否かを判断し（ステップＳ５８０６）、未処理の関数ｆｕｎｃが残っている場合には（ステップＳ５８０６：Ｎｏ）、ステップＳ５８０２の処理に戻り、未処理の関数ｆｕｎｃについて同様に処理をおこなう。
【０１７１】
また、抽出した関数ｆｕｎｃがテーブル１において、Ｌ＋２階層以下ではないと判断された場合（ステップＳ５８０２：Ｎｏ）、テーブルＣ上で親関数が複数存在しないと判断された場合（ステップＳ５８０３：Ｎｏ）、テーブル５上で親関数が同じバンクに分割されていないと判断された場合（ステップＳ５８０４：Ｎｏ）は、いずれもステップＳ５８０６の処理に移行して、未処理の関数ｆｕｎｃが無くなるまで処理を繰り返す。その後、未処理の関数ｆｕｎｃが残っていないと判断されると（ステップＳ５８０６：Ｙｅｓ）、一連の割当調整処理を終了する。
【０１７２】
図５９は、割当調整後のテーブル３のデータ例を示すデータテーブルである。テーブル３上の関数ＭＡＩＮ，Ａ１，…，Ａ４の場合、Ｌ＋２＝３階層以下ではないため、そのままテーブル３に格納される。また、関数Ｂ２，Ｂ３の場合、３階層以下であり、テーブルＣにおいて、複数の親関数が存在するが、テーブル５上で親関数が同一のバンクではないため、そのままテーブル３に格納される。一方、関数Ｂ４は、３階層以下であり、テーブルＣにおいて、複数の親関数が存在し、なおかつ、親関数が同一バンクであるため、データテーブル５９００のようにバンク０から削除される。
【０１７３】
図６０は、テーブル６−１の出力例を示すデータテーブルである。テーブル３上のすべての関数について、図５８の処理が完了すると、テーブル３からさらにＢ７，Ｃ２が削除されたデータテーブル６０００が作成される。データテーブル６０００のように、テーブル３から所定の条件下の関数を削除したテーブルがテーブル６−１として出力される。
【０１７４】
図６１は、アドレス計算処理の手順を示すフローチャートである。図６１のフローチャートは、割当調整・アドレス計算部３００５における２つめのステップであるアドレス計算処理の手順を表す。図６１の処理をおこなうことによって、各関数をメモリに配置する際の、アドレスを特定することができる。
【０１７５】
図６１において、まず、配列ａｄｄｒ［ｍ］＝（テーブルＭ［ｍ］．開始アドレス）に初期化する（ステップＳ６１０１）。さらに、ｆｕｎｃ１ではテーブル６−１上の関数ごとに、ｆｕｎｃ２ではテーブル５上の関数ごとに、それぞれメモリアドレス設定処理をおこなう（ステップＳ６１０２，Ｓ６１０３）。以上の処理が終了すると、メモリアドレス設定結果を反映したテーブル６を出力して（ステップＳ６１０４）、一連のアドレス計算処理を終了する。
【０１７６】
図６２は、初期化時の配列ａｄｄｒのデータ例を示すデータテーブルである。配列ａｄｄｒは、メモリバンク２０５ごとの開始アドレスの設定が一覧表示された構成になる。したがって、ここでは、データテーブル６２００のように、バンク０〜４の５つのメモリバンク２０５についての開始アドレスが設定されている。
【０１７７】
図６３は、常時ＯＮメモリのメモリアドレス設定処理の手順を示すフローチャートである。図６３のフローチャートは、ステップＳ６１０２におけるｆｕｎｃ１におけるメモリアドレス設定処理の手順を示す。図６３の処理を実行することによって、常時ＯＮバンクに配置された各関数についてのメモリアドレスを設定することができる。
【０１７８】
図６３において、まず、ｍ，ｓを下記のように設定する（ステップＳ６３０１）。
【０１７９】
ｍ＝テーブル６−１［ｆｕｎｃ１］．メモリ名
ｓ＝テーブルＳ［ｆｕｎｃ１］．サイズ（ｆｕｎｃ１がＬ階層以上の場合）
もしくは
ｓ＝テーブルＳ［ｆｕｎｃ１］．分割前半サイズ（ｆｕｎｃ１がＬ階層以上ではない場合）
【０１８０】
つぎに、テーブル６に下記のエントリを追加する（ステップＳ６３０２）。最後に、配列ａｄｄｒ［ｍ］にｓを追加して（ステップＳ６３０３）、一連のアドレス設定処理を終了する。
【０１８１】
テーブル６［ｆｕｎｃ１］．アドレス＝ａｄｄｒ［ｍ］
テーブル６［ｆｕｎｃ１］．メモリ名＝ｍ
【０１８２】
図６４は、常時ＯＮメモリのアドレス計算開始時のテーブル６・配列ａｄｄｒのデータ例を示すデータテーブルである。図６３の処理を実行することによって、データテーブル６４１０のようにｍ＝バンク０、ｓ＝テーブルＳ［ＭＡＩＮ］．サイズ＝３０００が追加されたテーブル６が設定される。したがって、配列ａｄｄｒはデータテーブル６４２０のように、バンク０にあらたな開始アドレスが追加される。
【０１８３】
図６５は、常時ＯＮメモリのアドレス計算完了時のテーブル６・配列ａｄｄｒのデータ例を示すデータテーブルである。図６３の処理によってテーブル６−１に設定されたすべての関数が処理されると、データテーブル６５１０のようなアドレスが設定されたテーブル６が作成される。同様に、配列ａｄｄｒも、データテーブル６５２０のように、バンク０，１にあらたな開始アドレスが追加される。
【０１８４】
図６６および図６７は、電力制御メモリのメモリアドレス設定処理の手順を示すフローチャートである。図６６および図６７のフローチャートは、ステップＳ６１０３におけるｆｕｎｃ２におけるメモリアドレス設定処理の手順を示す。図６６および図６７の処理を実行することによって、電力制御バンクに配置された各関数についてのメモリアドレスを設定することができる。
【０１８５】
図６６において、まず、ｆｕｎｃ３をｆｕｎｃ２として、メモリアドレス設定処理を実行する（ステップＳ６６０１）。そして、同様にｆｕｎｃ３をテーブル５［ｆｕｎｃ２］．子孫関数の各関数として、メモリアドレス設定処理を実行し（ステップＳ６６０２）、一連の処理を終了する。
【０１８６】
図６７は、上述したステップＳ６６０１，Ｓ６６０２におけるメモリアドレス設定処理を表す。図６７において、まず、ｍ，ｓ，ｆを下記のように設定する（ステップＳ６７０１）。
【０１８７】
ｍ＝テーブル５［ｆｕｎｃ２］．メモリ名
ｓ＝テーブルＳ［ｆｕｎｃ３］．分割後半サイズ（ｆｕｎｃ３がテーブル６−１に含まれる場合）
もしくは
ｓ＝テーブルＳ［ｆｕｎｃ３］．サイズ（ｆｕｎｃ３がテーブル６−１に含まれない場合）
ｆ＝ｆｕｎｃ３の後ろに“＿Ｌ”を連結した文字列
【０１８８】
つぎに、テーブル６に下記のエントリを追加する（ステップＳ６７０２）。最後に、配列ａｄｄｒ［ｍ］にｓを追加して（ステップＳ６７０３）一連のアドレス設定処理を終了する。
【０１８９】
テーブル６［ｆ］．アドレス＝ａｄｄｒ［ｍ］
テーブル６［ｆ］．メモリ名＝ｍ
【０１９０】
図６８は、電力制御メモリのアドレス計算開始時のテーブル６・配列ａｄｄｒのデータ例を示すデータテーブルである。図６６および図６７によって、ｆｕｎｃ２＝Ａ１として処理をおこなった場合、ｍ＝バンク２、ｓ＝テーブルＳ［Ａ１］．分割後半サイズ＝２４６０となる。したがって、テーブル６には、データテーブル６８１０のように、関数Ａ１＿Ｌが追加される。また、今回のメモリアドレス設定処理によって、配列ａｄｄｒには、データテーブル６８２０のようにバンク２の開始アドレスが関数Ａ１＿Ｌに応じてあらたに追加される。
【０１９１】
図６９は、電力制御メモリのアドレス計算実行後のテーブル６・配列ａｄｄｒのデータ例を示すデータテーブルである。図６６，６７によって、ｆｕｎｃ２＝Ａ１として処理をおこない、テーブル５［Ａ１］の子孫関数についてメモリアドレス設定処理をおこなう場合、対象となるｆｕｎｃ３は関数Ｂ１となる。したがって、ｍ＝バンク２、ｓ＝テーブルＳ［Ａ１］．サイズ＝２５６０となる（Ｂ１はテーブル６には含まれていないため）。したがって、テーブル６には、データテーブル６９１０のように、関数Ｂ１＿Ｌが追加される。また、今回のメモリアドレス設定処理によって、配列ａｄｄｒには、データテーブル６９２０のようにバンク２の開始アドレスが関数Ｂ１＿Ｌに応じてあらたに追加される。
【０１９２】
図７０は、子孫関数についてのアドレス計算時のテーブル６・配列ａｄｄｒのデータ例を示すデータテーブルである。図６６および図６７によって、テーブル５［Ａ１］の子孫関数についてすべてメモリアドレス設定処理をおこなうと、テーブル６には、データテーブル７０１０のように、関数Ａ＿１，Ｂ１＿Ｌ，Ｂ２＿Ｌ，Ｂ３＿Ｌ，Ｂ１０，Ｃ１＿Ｌが追加される。また、配列ａｄｄｒには、データテーブル７０２０のようにバンク２の開始アドレスが追加されたエントリに応じて追加された状態となる。
【０１９３】
図７１は、子孫関数についてのアドレス計算完了時のテーブル６・配列ａｄｄｒのデータ例を示すデータテーブルである。図６６および図６７によって、テーブル５の各関数についてすべてメモリアドレス設定処理をおこなうと、図７１のデータテーブル７１１０のようなテーブル６と、データテーブル７１２０のような配列ａｄｄｒが作成される。
【０１９４】
割当調整・アドレス計算部３００５によって作成されたテーブル６が配置情報１０５として、ソース１０１を構成する各関数の配置処理に利用される。
【０１９５】
以上説明したように、実施例４の処理を実現することによって、実施例１〜３を利用した場合には多数の関数を常時ＯＮバンクに配置しなければならない場合であっても、子孫関数の有無や、子孫関数が同一のメモリバンク２０５に配置されているか否かといった呼出関係の詳細な状況が判断される。そして、他の親関数と比較して、より呼出の頻度が高く、また、常時ＯＮバンクに配置した方が効率的であると判断された関数のみが常時ＯＮバンクに配置される。したがって、ソースの１０１を構成する関数同士の呼出関係にかかわらず、省電力効果を備えた命令配置処理が可能となる。
【０１９６】
（実施例５）
実施例５は、ソース１０１を利用した動作履歴を考慮して、実際に呼出の多い親関数を主要な親関数に決定する処理が追加されている。具体的には、親関数決定部３００１において、あらたに、関数の呼出履歴に関する情報を取得する。そして呼出履歴が多い親関数については、優先的に主要な親関数に決定されるように重み付けをおこなう。
【０１９７】
図７２は、実施例５における親関数決定部の処理を示す説明図である。図７２のように、実施例５の場合、親関数決定部３００１への入力情報として、ソース１０１の他に、ソース１０１を構成する各関数についての呼出履歴７２００が追加される。親関数決定部３０００１では、ソース１０１を静的情報、呼出履歴７２００を動的情報として、それぞれの呼出回数をカウントして重み付けをおこない、テーブル１を作成する。
【０１９８】
図７３は、重み付け和を利用した親関数決定処理を示す説明図である。また、図７４は、重み付け例を示すデータテーブルである。図７３のように、親関数決定部３００１では、入力されたソース１０１を参照して関数ごとに関数別の呼出回数をカウントして、テーブル１−１を作成する（ステップＳ７３０１）。同様に、親関数決定部３００１では、入力された呼出履歴７２００を参照して関数ごとに関数別の呼出回数をカウントしてテーブル１−３を作成する（ステップＳ７３０２）。その後、親関数決定部３００１は、ステップＳ７３０１，Ｓ７３０２のカウント結果を加算し、さらに重み付け和を考慮してテーブル１−４を作成する（ステップＳ７３０３）。
【０１９９】
図７４に例示したように、ステップＳ７３０１によって作成されるテーブル１−１は、実施例４の親関数決定部３００１と同様に、コールグラフ１０３から各親関数の呼出回数が子関数ごとにカウントされたデータテーブル７４１０のような構成になる。また、ステップＳ７３０２によって作成されるテーブル１−３は、呼出履歴７２００に記録された実際の呼出回数がカウントされたデータテーブル７４２０のような構成になる。
【０２００】
そして、ステップＳ７３０３では、テーブル１−１とテーブル１−３のカウント結果をどのように反映させるかに応じて重み付け和が設定される。図７４では、呼出履歴７２００の情報を重用して主要な親関数を決定するため、静的なテーブル１−１のカウント回数と、動的なテーブル１−３のカウント回数との比率を１：９に設定している。
【０２０１】
したがって、テーブル１−４は、テーブル１−１のカウント回数×１と、テーブル１−３のカウント回数×９との加算結果が親関数と子関数との呼出の優先度を表すポイントとして設定されたデータテーブル７４３０のような構成になる。たとえば、ＭＡＩＮ−Ａ１の呼出関係のポイントは、２（回数）×１（重み）＋１５（回数）×９（重み）＝１３７（ポイント）と決定される。
【０２０２】
最後に、親関数決定部３００１は、ステップＳ７３０３によって作成されたテーブル１−４を参照して、呼出先関数ごとに回数の欄が最大である呼出元関数を主要親関数として選択し（ステップＳ７３０４）、テーブル１を作成する。したがって、ステップＳ７３０４によって作成されたテーブル１は、実施例４の場合と異なり呼出履歴７２００が反映された構成になっている。
【０２０３】
以上説明したように、実施例５の処理を実現することによって、ソース１０１を利用した処理について、より動作実態に近い呼出状況を想定することができる。すなわち、複数の関数から呼び出される可能性がある親関数のうち、実際に呼び出される可能性が高い親関数が優先的に常時ＯＮバンクに割り当てられる。したがって、作成された配置情報１０５による関数の振り分けによる省電力効果を高めることができる。
【０２０４】
（実施例６）
実施例６は、用意されたメモリバンク２０５群のうち、優先的に電力制御バンクとして利用したいメモリを設定する処理が追加されている。優先的に電力制御バンクとして利用したいメモリとは、たとえば、高速な電圧変化が可能なメモリや、消費電力の少ないメモリなどが挙げられる。上述のような特徴を備えたメモリを電力制御バンクとして利用することによって、無作為に電力制御バンクを設定する場合と比較して、電力消費量を抑えることができる。
【０２０５】
図７５は、実施例６におけるメモリ割当処理を示す説明図である。実施例６では、常時ＯＮメモリ割当部３００２と、電力制御メモリ割当部３００４とにおける割当処理の際に、あらたに割当優先度情報付きのテーブルＭ（以下、「テーブルＭ’」とよぶ）を利用する。したがって、常時ＯＮメモリ割当部３００２によって作成されるテーブル３も、電力制御メモリ割当部３００４によって作成されるテーブル５もテーブルＭ’を参照した値になっている。
【０２０６】
図７６は、割当優先度情報付きのメモリ情報のデータ例を示すデータテーブル。割当優先度付きのメモリ情報として提供されるテーブルＭ’は、データテーブル７６００のように、メモリバンク２０５ごとに、優先度が関連付けられた構成になっている。優先度は、常時ＯＮバンクにしたいメモリバンク２０５ほど値が大きくなるように設定されている。なお、優先度の設定は、利用者が手動でおこなってもよいし、上位プログラムが電力制御システムとして提供されたメモリバンク２０５のスペックから一意的に設定してもよく、特に限定はない。
【０２０７】
実施例６の場合、常時ＯＮメモリ割当部３００２と、電力制御メモリ割当部３００４とでは、実施例４において説明した割当処理を実行する前段の処理として、テーブルＭ’を優先度順位ソートする手順が追加される。
【０２０８】
図７７は、常時ＯＮメモリ割当時ソートの手順を示すフローチャートである。図７７において、まず、テーブルＭ’を優先度順にソートする（ステップＳ７７０１）。そして、ソートされたテーブルＭ’に応じて常時ＯＭメモリに配置する階層数・メモリ割当を決定して（ステップＳ７７０２）、一連の処理を終了する。
【０２０９】
図７８は、ソート後の割当優先度情報付きのメモリ情報のデータ例を示すデータテーブル。ステップＳ７７０１のソート処理では、テーブルＭ’の各エントリを優先度が大きい順に並べ替えるため、データテーブル７８００のような構成に変更される。
【０２１０】
図７９は、電力制御メモリ割当時ソートの手順を示すフローチャートである。図７９において、まず、テーブルＭ’を優先度順にソートする（ステップＳ７９０１）。そして、ソートされたテーブルＭ’に応じて部分木ごとのメモリ割当を決定して（ステップＳ７９０２）、一連の処理を終了する。図７７，７９のフローチャートから明らかなように、実施例６は、実施例４にソート処理を実行するステップを追加するだけで容易に実現可能となる。
【０２１１】
以上説明したように、実施例６の処理を実現することによって、メモリバンク２０５群の中に電力制御バンクとしての利用が適しているメモリがある場合には、このメモリを優先的に電力制御バンクとして利用することができる。したがって、メモリの機能を活かした効率的な電力供給が可能となり、さらなる省電力効果が期待できる。
【０２１２】
（実施例７）
実施例７は、各メモリバンク２０５の割当処理と同時に、メモリバンク２０５の残容量のより精密な評価を可能にする。関数を配置した後のメモリバンク２０５の空き容量を正確に評価することによって、わずかな評価誤差で関数を配置できる、もしくは配置できないといった判断をおこなう場合であってもメモリの容量を最大限に活用することができる。
【０２１３】
図８０は、実施例７における電力制御メモリ割当処理を示す説明図である。実施例７では、電力制御メモリ割当部３００４において、割当処理を実行後に、あらたに残りメモリ量を評価するステップを追加する。この追加ステップによって、実施例４よりも、精密に残りメモリ量を評価する。
【０２１４】
図８１は、残りメモリ量の評価の手順を示すフローチャートである。図８１のフローチャートは、図５３にて説明したテーブル５への割当処理の手順を示すフローチャートにおいて、ステップＳ５３０３の後に実行する処理を表す。
【０２１５】
図８１において、まず、テーブル５に割り当てた関数の中に、他の電力制御バンクから呼び出される関数があるか否かを判断する（ステップＳ８１０１）。他の電力制御バンクから呼び出される関数があると判断された場合（ステップＳ８１０１：Ｙｅｓ）、該当する関数についてのメモリ量を評価して（ステップＳ８１０２）、一連の評価処理を終了する。
【０２１６】
ステップＳ８１０２の評価処理とは、具体的には、まず、他の電力制御バンクから呼び出される関数ｆｕｎｃ’と、ｆｕｎｃ’が割り当てられているメモリｍ’のメモリ量を求める。なお、メモリｍ’を一覧表示したのが、図８０のテーブル３’となる。そして、現在の残りメモリ量Ｍ＿ｒｅｓｔ［ｍ’］に、テーブルＳ［ｍ’］サイズからテーブルＳ［ｍ’］．分割後半サイズを引いた値を加算した値が正確な残りメモリ量となる。なお、ステップＳ８１０１において、他の電力制御バンクから呼び出される関数がないと判断された場合には（ステップＳ８１０１：Ｎｏ）、そのまま、一連の評価処理を終了する。
【０２１７】
図８２は、残りメモリ量の評価時のテーブル５・テーブルＭ＿ｒｅｓｔのデータ例を示すデータテーブルである。たとえば、関数Ａ１〜関数Ａ４について、メモリ量の評価処理をおこなうと、テーブル５はデータテーブル８２１０のような構成となる。たとえば、バンク２に割り当てられているＣ１が関数Ａ１〜関数Ａ４以外の他の関数によって呼び出されていれば、Ｍ＿ｒｅｓｔ［バンク２］＝Ｍ＿ｒｅｓｔ［バンク２］＋（テーブルＳ［Ｃ１］．サイズ−テーブルＳ［Ｃ１］．分割後半サイズ）となる。したがって、Ｍ＿ｒｅｓｔ［バンク２］＝３５２４＋（２５６０−２４６０）＝３６２４となり、データテーブル８２２０のような構成となる。
【０２１８】
以上説明したように、実施例７では、Ｌ＋１階層の関数ごとに残りのメモリ量を評価する。実施例４の場合、たとえば、オーバーヘッドが存在するが、その一方で、複数のメモリバンク２０５から呼び出されるために常時ＯＮバンクに配置される関数などは、メモリ量が重複して計算されてしまっていた。一方、実施例７では、メモリ量を正しく計算するため、従来発生していた重複計算された容量を空き領域として利用することが可能となる。したがって、使用するメモリバンク２０５の総数も減少可能となり、消費電力の削減が期待できる。
【０２１９】
（実施例８）
実施例８は、複数の関数から呼び出される関数を複製する第１の手法である。実施例８では、コールグラフ１０３によって示した際に、末端階層にあたる関数のコードを複製することによって、複数の関数から呼び出される親関数の数を削減する。
【０２２０】
図８３は、実施例８における関数複製処理を示す説明図である。実施例８では、親関数決定部３００１の前段に、関数を複製する関数複製部８３００を追加した構成になっている。関数複製部８３００では、呼出関係を参照して末端階層にある関数を複製する。したがって、親関数決定部３００１以降の各機能部では、ソース１０１に代わって、関数複製部８３００によって関数が複製された複製済みソース８３０１を利用して処理をおこなう。
【０２２１】
図８４は、実施例８における関数複製処理の手順を示すフローチャートである。図８４のフローチャートは、ソース１０１と、テーブルＣとの入力をトリガに開始される関数複製処理の手順を表す。図８４の各処理を実行することによって、所定の条件を満たす関数を自動的に複製することができる。
【０２２２】
図８４において、まず、ｆｕｎｃは、テーブルＣの末端にあたる関数か否かを判断する（ステップＳ８４０１）。ｆｕｎｃが、テーブルＣの末端にあたる関数であると判断された場合（ステップＳ８４０１：Ｙｅｓ）、つぎに、ｆｕｎｃは、複数の親をもつ関数であるか否かを判断する（ステップＳ８４０２）。
【０２２３】
ステップＳ８４０２において、ｆｕｎｃが、複数の親をもつ関数であると判断された場合（ステップＳ８４０２：Ｙｅｓ）、ｆｕｎｃの名前を書き換えて複製する（ステップＳ８４０３）。ステップＳ８４０３では、具体的には、まず、ｆｕｎｃを親関数の数だけコピーして関数名をｆｕｎｃＰｉ＿ｆｕｎｃ（ただし、ｆｕｎｃＰｉ（ｉ＝１，２，…，（親関数の数））は親関数）と変更する。その後、ｆｕｎｃＰｉ内でｆｕｎｃを呼び出している部分を、ｆｕｎｃＰｉ＿ｆｕｎｃを呼び出すように書き換える。
【０２２４】
ステップＳ８４０３においてｆｕｎｃが複製されると、一連の処理が終了する。なお、ステップＳ８４０１においてｆｕｎｃが、テーブルＣの末端にあたる関数ではないと判断された場合（ステップＳ８４０１：Ｎｏ）、もしくは、ステップＳ８４０２においてｆｕｎｃが、複数の親をもつ関数ではないと判断された場合（ステップＳ８４０２：Ｎｏ）、それぞれ、複製を用意する必要はないため、そのまま一連の処理を終了する。
【０２２５】
図８５は、関数複製対象となるテーブルＣのデータ例を示すデータテーブルであり、図８６は、関数複製済後のテーブルＣのデータ例を示すデータテーブルである。関数複製部８３００にデータテーブル８５００のような構成のテーブルＣが入力された場合、関数Ｃ１，Ｃ２がステップＳ８４０１，Ｓ８４０２の条件を満たす。したがって、データテーブル８６００のように、関数複製部８３００は、関数Ｃ１の先頭に呼出元のＢ９と“＿”を付加してＢ９＿Ｃ１を複製する。同様に、Ｂ１０＿Ｃ１，Ｂ１１＿Ｃ２，Ｂ１２＿Ｃ２が複製される。
【０２２６】
（実施例９）
実施例９は、複数の関数から呼び出される関数を複製する第２の手法である。実施例８と異なり、実施例９では、電力制御メモリ割当部３００４において、複数の関数から呼び出される関数を複製する処理を実行する。電力制御メモリ割当部３００４では、合計コード量の多い順にＬ＋１階層以下の関数のまとまりを、Ｆｉｒｓｔ  Ｆｉｔ  Ｄｅｃｒｅａｓｉｎｇアルゴリズムによりメモリバンク２０５に割り当てている。そこで、実施例９では、割当処理の結果、親関数（呼出元）が複数のバンクに配置されていることがわかったタイミングで関数を表現するコードの複製をおこなう。
【０２２７】
図８７，８８は、実施例９における関数複製処理の手順を示すフローチャートである。図８７，８８のフローチャートは、図５３と同様に、テーブル５への割当処理の手順を表している。図８７，８８の各処理を実行することによって、テーブル５に設定された各関数の子孫関数を割り当てるとともに、複数の関数から呼び出される関数については適宜複製し、複製関数を電力制御バンクに割り当てることもできる。
【０２２８】
図８７，８８において、まず、テーブルＭのメモリ名フィールドに登場する要素ｍのうちＭ＿ｒｅｓｔ［ｍ］≧テーブルＳ［ｆｕｎｃ］．サイズを満たす最初のメモリを抽出する（ステップＳ８７０１）。そして、抽出したＭ＿ｒｅｓｔ［ｍ］をテーブル４の合計コード量との差分サイズに設定する（ステップＳ８７０２）。その後、テーブル５［ｆｕｎｃ］．割当メモリとして抽出されたｍを設定する（ステップＳ８７０３）。
【０２２９】
さらに、他の電力制御バンクから呼び出される関数があるか否かを判断する（ステップＳ８７０４）。このステップＳ８７０４において、他の電力制御バンクから呼び出される関数があると判断された場合（ステップＳ８７０４：Ｙｅｓ）、該当する関数についてのメモリ量を評価する（ステップＳ８７０５）。一方、他の電力制御バンクから呼び出される関数がないと判断された場合（ステップＳ８７０４：Ｎｏ）、そのまま一連の処理を終了する。
【０２３０】
つぎに、図８８を用いて、ステップＳ８７０５の処理について詳細に説明する。図８８において、まず、処理対象のｆｕｎｃがテーブルＣの末端にあたる関数か否かを判断する（ステップＳ８８０１）。ｆｕｎｃが、テーブルＣの末端にあたる関数であると判断された場合（ステップＳ８８０１：Ｙｅｓ）、つぎに、ｆｕｎｃの名前を書き換えて複製する（ステップＳ８８０２）。その後、子孫関数に複製した関数を追加して再度、割当メモリを設定して（ステップＳ８８０３）、一連の処理を終了する。
【０２３１】
なお、ステップＳ８８０３における複製処理の詳細は、実施例８と同一であるため、ここでは説明を省略する。また、ステップＳ８８０１において、ｆｕｎｃが、テーブルＣの末端にあたる関数ではないと判断された場合（ステップＳ８８０１：Ｎｏ）、関数を複製する必要がないため、割当メモリを設定して（ステップＳ８８０４）、そのまま一連の処理を終了する。
【０２３２】
図８９は、関数複製済後のテーブルＣのデータ例を示すデータテーブルであり、図９０は、関数複製後のテーブルＭ＿ｒｅｓｔのデータ例を示すデータテーブルである。通常の割当処理の場合、データテーブル８９２０のようなテーブル５が作成される。したがって、図８７，８８の処理を追加することによって、データテーブル８９１０のように、関数Ａ４に複製された子孫関数Ｂ９＿Ｃ１が追加される。複製された子孫関数Ｂ９＿Ｃ１が追加されることによって、デーブルＭ＿ｒｅｓｔの値も、データテーブル９０００のバンク４のように、追加分のメモリが利用され、残りメモリ量が変更される。
【０２３３】
以上説明したように、実施例８，９の処理を実現することによって、実施例４に関数複製部８３００を追加するまたは、電力制御メモリ割当部３００４に処理を追加するといった比較的簡易な処置のみで、複数の関数から呼び出される関数を複製することができる。すなわち、下位の階層でありながら、複数の関数に呼び出されるような関数については、あらかじめ複製を用意するため、複数のメモリバンク２０５に配置されるような呼出元関数の発生を防ぐことができ、常時ＯＮバンクの増加を防ぎ、省電力効果を保つことができる。
【０２３４】
なお、実施例５にて説明した関数の呼出履歴を利用した親関数設定処理、実施例６にて説明した優先度に応じたメモリバン２０５の設定処理、実施例７にて説明したメモリ量計算、さらに、実施例８，９にて説明した命令の複製処理は、それぞれ実施例１〜３にも適用してもよい。
【０２３５】
以上実施例４〜９にて、説明したように、本実施の形態にかかる命令配置プログラム、命令配置装置、および命令配置方法によれば、コールグラフ１０３によって、命令同士の呼び出し関係を特定し、利用頻度の高い命令群とそれ以外の命令群とに分類する。さらに、実施例４〜９では、利用頻度と、配置効率を考慮した条件を設けている。したがって、利用頻度の高い命令群の中でも、必要最低限の命令群のみを、常時電力が供給されるメモリバンク２０５へ配置するように設定した配置情報１０５を作成する。結果として、コールグラフ１０３の表す呼出関係の状態にかかわらず、電力供給先となるメモリバンク２０５を頻繁に切り替えるような事態を避け、効率的な電力制御を図ることができる。
【０２３６】
なお、本実施の形態で説明した命令配置方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーションなどのコンピュータで実行することにより実現することができる。本命令配置プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤなどのコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本命令配置プログラムは、インターネットなどのネットワークを介して配布してもよい。
【０２３７】
また、本実施の形態で説明した命令配置装置１００は、スタンダードセルやストラクチャードＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）などの特定用途向けＩＣ（以下、単に「ＡＳＩＣ」と称す。）やＦＰＧＡなどのＰＬＤ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｄｅｖｉｃｅ）によっても実現することができる。具体的には、たとえば、上述した命令配置装置１００の機能（取得部６０１〜算出部６０７）をＨＤＬ記述によって機能定義し、そのＨＤＬ記述を論理合成してＡＳＩＣやＰＬＤに与えることにより、命令配置装置１００を製造することができる。
【０２３８】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０２３９】
（付記１）コンピュータを、
対象装置に適用されたファームウェア内の命令同士の呼び出し関係を表すコールグラフを取得する取得手段、
前記取得手段によって取得されたコールグラフによって表された命令のうち、最上位から所定階層以上に位置する第１の命令群と、当該命令以外の第２の命令群とに分類する分類手段、
前記分類手段によって第１の命令群に分類された命令を呼び出すためのコードを、前記対象装置に搭載されたメモリバンクのうち、常時電力が供給される第１のメモリバンクへ配置するように設定した配置情報を作成する作成手段、
前記作成手段によって作成された配置情報を出力する出力手段、
として機能させることを特徴とする命令配置プログラム。
【０２４０】
（付記２）前記作成手段は、前記第２の命令群に分類された命令を呼び出すためのコードを、前記第１のメモリバンク以外のメモリバンクへ配置するように設定した配置情報を作成することを特徴とする付記１に記載の命令配置プログラム。
【０２４１】
（付記３）前記コンピュータを、さらに、
前記取得手段によって取得されたコールグラフによって表された命令に特定の命令が含まれているか否かを判断する判断手段、として機能させ、
前記作成手段は、前記判断手段によって前記特定の命令が含まれていると判断された場合、前記第１のメモリバンクに前記特定の命令を呼び出すコードを配置するように設定した配置情報を作成することを特徴とする付記１または２に記載の命令配置プログラム。
【０２４２】
（付記４）前記コンピュータを、さらに、
前記取得手段によって取得されたコールグラフによって表された命令のうち、所定数以上の命令からの呼び出し対象となっている命令を抽出する抽出手段、として機能させ、
前記作成手段は、前記抽出手段によって前記所定数以上の命令からの呼び出し対象となっている命令が抽出された場合、前記第１のメモリバンクに、前記抽出された命令を呼び出すコードを配置するように設定された配置情報を作成することを特徴とする付記１〜３のいずれか一つに記載の命令配置プログラム。
【０２４３】
（付記５）前記コンピュータを、さらに、
前記抽出手段は、前記取得手段によって取得されたコールグラフによって表された命令のうち、ライブラリ関数となっている命令を抽出し、
前記作成手段は、前記抽出手段によってライブラリ関数となっている命令が抽出された場合、前記第１のメモリバンクに、前記抽出された命令を呼び出すコードを配置するように設定された配置情報を作成することを特徴とする付記４に記載の命令配置プログラム。
【０２４４】
（付記６）前記コンピュータを、さらに、
前記配置情報によって前記第１のメモリバンクへ配置すると設定されたコードのデータの総量を算出する算出手段、
前記作成手段は、前記算出手段によって算出されたデータの総量の値に応じて、前記第１のメモリバンクの数を変更し、変更後の第１のメモリバンクに、前記第１の命令群を呼び出すコードを分散して配置するように設定した配置情報を作成することを特徴とする付記１〜５のいずれか一つに記載の命令配置プログラム。
【０２４５】
（付記７）前記作成手段は、前記第２の命令群を呼び出すコードのうち、上位の階層の命令が一致する命令同士を前記第１のメモリバンク以外の同一のメモリバンクへ配置するように設定した配置情報を作成することを特徴とする付記１〜６のいずれか一つに記載の命令配置プログラム。
【０２４６】
（付記８）前記算出手段は、配置情報によって同一のメモリバンクに配置すると設定されたコードごとに、それぞれデータの総量を算出し、
前記出力手段は、前記算出手段によって算出されたデータの総量を出力することを特徴とする付記５〜７のいずれか一つに記載の命令配置プログラム。
【０２４７】
（付記９）前記分類手段は、前記第１の命令群に分類された命令の中から所定の条件を満たす命令を、あらたに前記第２の命令群に分類することを特徴とする付記１〜８のいずれか一つに記載の命令配置プログラム。
【０２４８】
（付記１０）前記分類手段は、前記第１の命令群に分類された命令について、それぞれ、前記コールグラフから特定される同一の命令からの呼び出し回数が最多となる命令以外の命令を、あらたに前記第２の命令群に分類することを特徴とする付記９に記載の命令配置プログラム。
【０２４９】
（付記１１）前記分類手段は、前記第１の命令群に分類された命令について、それぞれ、前記ファームウェアの動作履歴から特定される同一の命令からの呼び出し回数が最多となる命令以外の命令を、あらたに前記第２の命令群に分類することを特徴とする付記９に記載の命令配置プログラム。
【０２５０】
（付記１２）前記作成手段は、前記メモリバンクの中から指定されたメモリバンクに優先的に前記第１の命令群を呼び出すためのコードを配置するように設定した配置情報を作成することを特徴とする付記１〜１１のいずれか一つに記載の命令配置プログラム。
【０２５１】
（付記１３）前記算出手段は、算出結果として得られた前記第１のメモリバンクへ配置すると設定されたコードのデータの総量から、前記第１のメモリバンクに配置された同一の命令を呼び出すコードの容量を減算し、
前記出力手段は、
前記算出手段による減算結果を出力することを特徴とする付記６に記載の命令配置プログラム。
【０２５２】
（付記１４）前記コンピュータを、さらに、
前記コールグラフによって表された最下層の命令のうち、複数の命令から呼び出される命令の複製を当該命令とは異なる命令として作成する複製手段として機能させ、
前記分類手段は、前記複製手段によって作成された命令をそれぞれ前記第１の命令群と前記第２の命令群とに分類することを特徴とする付記１〜８のいずれか一つに記載の命令配置プログラム。
【０２５３】
（付記１５）前記コンピュータを、さらに、
前記コールグラフによって表された最下層の命令のうち、複数の命令から呼び出される命令の複製を当該命令とは異なる命令として作成する複製手段として機能させ、
前記分類手段は、前記第１の命令群に分類された命令の中から所定の条件を満たす命令を、あらたに前記第２の命令群に分類することを特徴とする付記９〜１３のいずれか一つに記載の命令配置プログラム。
【０２５４】
（付記１６）前記コンピュータを、さらに、
前記分類手段によって分類された第２の命令群のうち、複数の命令から呼び出される命令の複製を当該命令とは異なる命令として作成する複製手段として機能させ、
前記分類手段は、前記複製手段によって前記命令の複製が作成された場合、当該複製後の命令をそれぞれ前記第１の命令群と前記第２の命令群とに分類することを特徴とする付記１〜８のいずれか一つに記載の命令配置プログラム。
【０２５５】
（付記１７）前記コンピュータを、さらに、
前記分類手段によって分類された第２の命令群のうち、複数の命令から呼び出される命令の複製を当該命令とは異なる命令として作成する複製手段として機能させ、
前記分類手段は、前記複製手段によって前記命令の複製が作成された場合、当該複製後の命令について、前記第１の命令群に分類された命令の中から所定の条件を満たす命令を、あらたに前記第２の命令群に分類することを特徴とする付記９〜１３のいずれか一つに記載の命令配置プログラム。
【０２５６】
（付記１８）対象装置に適用されたファームウェア内の命令同士の呼び出し関係を表すコールグラフを取得する取得手段と、
前記取得手段によって取得されたコールグラフによって表された命令のうち、最上位から所定階層以上に位置する第１の命令群と、当該命令以外の第２の命令群とに分類する分類手段と、
前記分類手段によって第１の命令群に分類された命令を呼び出すためのコードを、前記対象装置に搭載されたメモリバンクのうち、常時電力が供給される第１のメモリバンクへ配置するように設定した配置情報を作成する作成手段と、
前記作成手段によって作成された配置情報を出力する出力手段と、
を備えることを特徴とする命令配置装置。
【０２５７】
（付記１９）コンピュータが、
対象装置に適用されたファームウェア内の命令同士の呼び出し関係を表すコールグラフを取得する取得工程と、
前記取得工程によって取得されたコールグラフによって表された命令のうち、最上位から所定階層以上に位置する第１の命令群と、当該命令以外の第２の命令群とに分類する分類工程と、
前記分類工程によって第１の命令群に分類された命令を呼び出すためのコードを、前記対象装置に搭載されたメモリバンクのうち、常時電力が供給される第１のメモリバンクへ配置するように設定した配置情報を作成する作成工程と、
前記作成工程によって作成された配置情報を出力する出力工程と、
を実行することを特徴とする命令配置方法。
【符号の説明】
【０２５８】
１００  命令配置装置
１０１  ソース
１０２  オブジェクト
１０３  コールグラフ
１０４  メモリ分割情報
１０５  配置情報
１１０  コンパイラ
１２０  コールグラフ作成部
２００  電力制御システム
２０１  プロセッサ
２０２  周辺回路
２０３  電源
２０４  制御装置
２０５  メモリバンク
２０６  バス
６０１  取得部
６０２  分類部
６０３  作成部
６０４  出力部
６０５  判断部
６０６  抽出部
６０７  算出部
３００１  親関数決定部
３００２  常時ＯＮメモリ割当部
３００３  コード量計算部
３００４  電力制御メモリ割当部
３００５  割当調整・アドレス計算部
【図１】
2010257437.tif 000003
【図２】
2010257437.tif 000004
【図３】
2010257437.tif 000005
【図４−１】
2010257437.tif 000006
【図４−２】
2010257437.tif 000007
【図５】
2010257437.tif 000008
【図６】
2010257437.tif 000009
【図７】
2010257437.tif 000010
【図８】
2010257437.tif 000011
【図９】
2010257437.tif 000012
【図１０】
2010257437.tif 000013
【図１１】
2010257437.tif 000014
【図１２】
2010257437.tif 000015
【図１３】
2010257437.tif 000016
【図１４】
2010257437.tif 000017
【図１５】
2010257437.tif 000018
【図１６】
2010257437.tif 000019
【図１７】
2010257437.tif 000020
【図１８】
2010257437.tif 000021
【図１９】
2010257437.tif 000022
【図２０】
2010257437.tif 000023
【図２１】
2010257437.tif 000024
【図２２】
2010257437.tif 000025
【図２３】
2010257437.tif 000026
【図２４】
2010257437.tif 000027
【図２５】
2010257437.tif 000028
【図２６】
2010257437.tif 000029
【図２７】
2010257437.tif 000030
【図２８】
2010257437.tif 000031
【図２９】
2010257437.tif 000032
【図３０】
2010257437.tif 000033
【図３１】
2010257437.tif 000034
【図３２】
2010257437.tif 000035
【図３３】
2010257437.tif 000036
【図３４】
2010257437.tif 000037
【図３５】
2010257437.tif 000038
【図３６】
2010257437.tif 000039
【図３７】
2010257437.tif 000040
【図３８】
2010257437.tif 000041
【図３９】
2010257437.tif 000042
【図４０】
2010257437.tif 000043
【図４１】
2010257437.tif 000044
【図４２】
2010257437.tif 000045
【図４３】
2010257437.tif 000046
【図４４】
2010257437.tif 000047
【図４５】
2010257437.tif 000048
【図４６】
2010257437.tif 000049
【図４７】
2010257437.tif 000050
【図４８】
2010257437.tif 000051
【図４９】
2010257437.tif 000052
【図５０】
2010257437.tif 000053
【図５１】
2010257437.tif 000054
【図５２】
2010257437.tif 000055
【図５３】
2010257437.tif 000056
【図５４】
2010257437.tif 000057
【図５５】
2010257437.tif 000058
【図５６】
2010257437.tif 000059
【図５７】
2010257437.tif 000060
【図５８】
2010257437.tif 000061
【図５９】
2010257437.tif 000062
【図６０】
2010257437.tif 000063
【図６１】
2010257437.tif 000064
【図６２】
2010257437.tif 000065
【図６３】
2010257437.tif 000066
【図６４】
2010257437.tif 000067
【図６５】
2010257437.tif 000068
【図６６】
2010257437.tif 000069
【図６７】
2010257437.tif 000070
【図６８】
2010257437.tif 000071
【図６９】
2010257437.tif 000072
【図７０】
2010257437.tif 000073
【図７１】
2010257437.tif 000074
【図７２】
2010257437.tif 000075
【図７３】
2010257437.tif 000076
【図７４】
2010257437.tif 000077
【図７５】
2010257437.tif 000078
【図７６】
2010257437.tif 000079
【図７７】
2010257437.tif 000080
【図７８】
2010257437.tif 000081
【図７９】
2010257437.tif 000082
【図８０】
2010257437.tif 000083
【図８１】
2010257437.tif 000084
【図８２】
2010257437.tif 000085
【図８３】
2010257437.tif 000086
【図８４】
2010257437.tif 000087
【図８５】
2010257437.tif 000088
【図８６】
2010257437.tif 000089
【図８７】
2010257437.tif 000090
【図８８】
2010257437.tif 000091
【図８９】
2010257437.tif 000092
【図９０】
2010257437.tif 000093