\input texi @c -*-texinfo-*-
@c %**start of header
@setfilename mics.info
@settitle MICS 0.2.0 Manual 
@documentencoding EUC-JP
@c %**end of header

@copying
Copyright @copyright{} 2007 Takefumi MIYOSHI, All Rights Reserved.
@end copying

@titlepage
@title MICS 0.2.0 Manual
@page
@vskip 0pt plus 1filll
@insertcopying
@end titlepage

@c Output the table of contents at the begging.
@contents

@ifnottex
@node Top
@top MICS Manual

@insertcopying
@end ifnottex

@menu
* MICSとは::                    
* シミュレーションモデル::      
* 設定::                        
* ユニット::                    
* ツール::                      
* 索引::                        
@end menu

@node MICSとは, シミュレーションモデル, Top, Top
@chapter MICSとは

開発の初期段階で，プロセッサやハードウェア構成の詳細が決まっていることは大変稀なことであり，一般には開発の初期段階で様々な仕様のハードウェアユニットを選別あるいは設計し，それらを組み合わせた上でのソフトウェアの動作を評価，検証する必要がある．
しかし，従来のアーキテクチャの詳細な設計に基づくシミュレータや，プロセッサ毎に独立したシミュレータでは，仕様や構成を変更する度にシミュレーション環境やソフトウェアの開発環境を逐一構築することが必要であり，システムアーキテクチャ設計が大変困難かつ時間を要する作業となっている．

これを容易にするために，開発の初期段階で決定可能な情報であるプロセッサの実行サイクル数や，ハードウェアユニット間の通信サイクル数などによってソフトウェアの動作をシミュレートし，アプリケーションのボトルネックの検出や，変更による効果を検証や評価できるシステムアーキテクチャ設計のためのシミュレータが強く求められている．

MICSは，
@enumerate
@item
ハードウェアユニットを抽象化した基底に基づいて，シミュレータ要素を実装し，
@item
各要素の処理に対する必要サイクル数によってシステム全体の動作を仮想的に，
@end enumerate
実現する，ことで柔軟なシステム構成と，開発の初期段階から実アプリケーションに近いソフトウェアを動作させることができるシミュレーション環境である．

同じ基底に基づいて実装された要素が可換であることから，(1)により，シミュレーション要素の組み合わせを容易に変更することが可能となる．また，(2)により，開発の段階に応じてユーザがシステムを構成する各要素のシミュレーション精度を任意に決定し，ソフトウェアを動作させることができる．サイクル数を求めるために，他のツール，例えばgdbやRTLシミュレータとの連携を行うことでシミュレータの再実装の手間を削減することもできる．

@node シミュレーションモデル, 設定, MICSとは, Top
@chapter シミュレーションモデル
MICSはシミュレーションの対象となるハードウェアエレメントのシミュレータ構成要素と，それを管理，駆動するエンジンからなる．

@section シミュレータ要素の基底とインターフェース
シミュレータ構成要素は，次の基底クラス@code{MicsElement}を継承したクラスとして実装され，また，その機能に応じて，ハードウェアユニットの機能を抽象化した次の4つのインターフェースから，ひとつあるいは複数を実装する．
@itemize
@item
@code{ExecutableElement}
@item
@code{Channel}
@item
@code{DataBuffer}
@item
@code{ChannelConnectable}
@end itemize

@subsection シミュレータ構成要素の基底
@cindex シミュレータ構成要素の基底, @code{MicsElement}
すべてのシミュレータ構成要素は，@code{MicsElement}を継承する．@code{MicsElement}は，エンジンで管理するための次の基本メソッドが定義されている．
@table @code
@item void initialize(java.lang.String id, org.w3c.Node node)
構成要素の初期設定を行う．シミュレーション構成で唯一の文字列であるIDと要素の設定を示すXMLノードを与える．実際には，このメソッドを子クラスでオーバライドする．ただし，@code{super.initialize(id, node)}として，親クラスのこのメソッドを呼び出さなければならない．

@item String getInfo()
この構成要素の情報を返す．親クラスである@code{MicsElement}では，IDとクラス名を含む文字列を返す．継承した子クラスで任意の表示内容を返すことができる．

@item String id()
この構成要素のIDを返す

@end table

@subsection @code{ExecutableElement}
@cindex @code{ExecutableElement}

@subsection @code{Channel}
@cindex @code{ExecutableElement}

@subsection @code{DataBuffer}
@cindex @code{ExecutableElement}

@subsection @code{ChannelConnectable}
@cindex @code{ExecutableElement}

@section データ構造
@cindex データ,MicsDataPacket

@node 設定, ユニット, シミュレーションモデル, Top
@chapter 設定

MICSでは，ハードウェアユニットの組み合わせを自由に決定できるように，XML形式でそれらを組み合わせたアーキテクチャを定義する．設定XMLのエレメントを次に示す．

@table @code
@item mics
ルートエレメント
p
@item element id=@var{ID} class=@var{用いるクラス}
ハードウェアユニットに対応するエレメント．エンジンで管理するためのアーキテクチャ中で唯一の文字列からなるIDと，用いるクラスを指定する．クラスの初期設定を行う@code{MicsElement.initialize}メソッドに，このエレメントのXMLノードが渡されるため，子エレメントや，idとclas以外の属性に関しては，ユーザが任意に決定できる．

@end table

たとえば，バス，メモリ，プロセッサで構成される単純なアーキテクチャの設定ファイルは次のようになる．

@example
@code{
<?xml version="1.0" encoding="euc-jp"?>
<mics>
  <element id="mem0" class="net.wasamon.mics.memory.RandomAccessMemory" size="2048"/>
  <element id="bus0" class="net.wasamon.mics.bus.SingleDataBus" ram="0"/>
  <element id="proc0" class="net.wasamon.mics.processor.SimpleProcessor" memory="2048">
    <channel id="bus0" offset="2048"/>
  </element>
</mics>
}
@end example


尚，設定ファイル中に現われているクラスに関しては，ユニットで説明する．

@node ユニット, ツール, 設定, Top
@chapter 定義されているユニット
@cindex ユニット

MICS 0.2.0で供えているハードウェアユニットクラスを次に示す．

@table @code
@item SimpleProcesor
単純なRISCシミュレータ

@item SH_GDB_Procesor
SHプロセッサ用にクロスコンパイルしたGDBプロセスを起動しシミュレーションします．

@item SingleDataBus
単一バスに相当するバス．複数のChannelConnectableと，一つのDataBufferを接続するが，同じサイクルでの競合アクセスは排他的に処理される．

@item MultiDataBus
メモリに対してマルチポートでのアクセスを提供する．複数のChannelConnectableと，一つのDataBufferを接続する．

@item RandomAccessMemory
単純なメモリデバイス．

@item CacheMemory
単純なキャッシュメモリ

@item DMAController
DMAコントローラ

@item ReconfigurableProcessor
内部に持つロジックユニットの構成を切り換えることで，その時々で異る演算を行うことができるハードウェアユニットのシミュレータ．

@item CharacterDisplay
内部のメモリデータを，文字として表示することができるディスプレイ．

@end table

@node ツール, 索引, ユニット, Top
@chapter ツール/ユーティリティ
@cindex ツール,ユーティリティ

@section 構成要素設定メソッド生成ツール
@cindex MakeInitialize, 構成要素設定メソッド生成ツール
シミュレーション構成要素は，先に述べた@code{MicsElement}を継承し，幾つかのインターフェースを実装しなければならない．
これらの実装において，MICSのフレキシビリティを保つためには，
適切に@code{MicsElement}の@code{initialize}をオーバライドすることが必要である．また，このメソッドの中身は各ユニットの実装者に任されているため，そのドキュメントもまた重要である．
そこで，MICSでは，@code{net.wasamon.mics.tools.MakeInitialize}というツールを用意している．

@subsection 使い方

@example
@command{
java net.wasamon.mics.MakeInitialize [-o 出力フォーマット] ソースファイル
}
@end example


出力フォーマットは，現在javaとHTMLをサポートしている．またオプションの指定を省略した場合には，Javaのソースコードを出力する．

@subsection ソースファイルの書き方

@code{MakeInitialize}は，XMLで記述した設定ファイルの構成からJavaのソースコードや，HTML形式によるドキュメントなどを生成することができるツールである．@code{MakeInitialize}の入力XMLの形式を次に示す．

@table @code
@item initalize name=@var{クラス名}
MakeInitializeに与えるソースのルートエレメント．属性@code{name}で，クラス名を指定する．これは，クラスのトップの設定に対応する．

@item attribute name=@var{属性名} type=@var{型}
現在のエレメントレベルにおいて指定すべき属性の名前と，Javaにおける型．型はStringとintだけが認められる．intは，@code{Integer.parseInt}を用いてプリミティブのint型に変換される．

@item child name=@var{エレメント名} repeatable=@var{true|false}
現在のエレメントレベルの子エレメント．@code{name}で指定した名前の要素を子エレメントに持てることを指示する．@code{repeatable}が@code{false}の場合，設定ファイル中では，この要素を必ず一つ指定しなければならない．一方@code{repeatable}が@code{true}の場合には，この要素を幾つでも指定することが(あるいは指定しないことが)できる．

@item exec
このエレメントの設定に対して，実行すべきJavaのソースコード．この部分では，同じエレメントレベルの@code{attribute}エレメントの@code{name}で指定した文字列に対応する値を@code{$変数名}として利用することができる．

@end table


たとえば，SimpleProcessorの設定ファイルは次のように構成されている．

@example
@code{
<initialize name="net.wasamon.mics.processor.SimpleProcessor">
  <attribute name="memory" type="int"/>
  <child name="channel" repeatable="true">
    <attribute name="id" type="String"/>
    <attribute name="offset" type="int"/>
    <exec>
channelManager.add($id, $offset);
    </exec>
  </child>
  <exec>
memory = new RandomAccessMemory($memory);
  </exec>
</initialize>
}
@end example

これは，次に示すSimpleProcessorへの設定ファイルを受け付ける．

@example
@code{
  <element id="proc0" class="net.wasamon.mics.processor.SimpleProcessor" memory="2048">
    <channel id="bus0" offset="2048"/>
  </element>
}
@end example


@node 索引,  , ツール, Top
@unnumbered 索引

@printindex cp

@bye
