(57)【要約】【課題】ソフトウエア設計言語による論理回路設計の効率化を図ることができる論理シミュレーション方法を提供する。【解決手段】論理回路をＣ＋＋言語で記述し、論理回路の階層構造を保持する手段として、階層構造を再現するオブジェクトを用意する。このオブジェクトには関数ｃａｌｌと関数ｃａｌｌからのｒｅｔｕｒｎを模擬するためのｍｅｔｈｏｄとしてｉｎｉｔ（）を用意する。また、集めたい対象を登録するためのｍｅｔｈｏｄとしてｅｎｔｒｙ（）を用意する。ｉｎｉｔ（）関数のｃａｌｌ前後にはｈｔｐ−＞ｃａｌｌ＿ｎｏｄｅ（＜ｍｏｄｕｌｅ名＞）；とｈｔｐ−＞ｒｅｔｕｒｎ＿ｎｏｄｅ（）；を記述するものとする。【選択図】　　図１
2004013860.tif 000002
【特許請求の範囲】
【請求項１】
論理回路をソフトウエア設計言語で記述してシミュレーションする論理シミュレーション方法であって、
前記ソフトウエア設計言語による前記論理回路の記述に階層構造情報を取得するための手段を含めることを特徴とする論理シミュレーション方法。
【請求項２】
論理回路をソフトウエア設計言語で記述してシミュレーションする論理シミュレーション方法であって、
前記ソフトウエア設計言語による前記論理回路の記述に複数のクロックを一元管理するための手段を含めることを特徴とする論理シミュレーション方法。
【請求項３】
論理回路をソフトウエア設計言語で記述してシミュレーションする論理シミュレーション方法であって、
前記論理回路をシミュレーションし、所定の時間間隔でデータを作成する第１のプロセスと、
前記データを前記所定の時間間隔で参照し、前記第１のプロセスに後行して前記論理回路をシミュレーションする第２のプロセスを有することを特徴とする論理シミュレーション方法。
【請求項４】
論理回路をソフトウエア設計言語で記述してシミュレーションする論理シミュレーション装置であって、
前記論理回路をシミュレーションし、所定の時間間隔でデータを作成する第１の手段と、
前記データを前記所定の時間間隔で参照し、前記第１の手段に後行して前記論理回路をシミュレーションする第２の手段を有することを特徴とする論理シミュレーション装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンピュータを使用して論理回路を設計する場合に使用して好適な論理シミュレーション方法及び装置に関する。
【０００２】
【従来の技術】
近年、ソフトウエアとハードウエアの協調設計の観点からソフトウエア設計言語（例えば、Ｃ＋＋言語）にハードウエア設計言語（例えば、Ｖｅｒｉｌｏｇ−ＨＤＬ）の機能を追加して論理回路を設計する方法が提案されている。
【０００３】
【発明が解決しようとする課題】
ソフトウエア設計言語にハードウエア設計言語の機能を追加して論理回路を設計する従来の方法においては、ハードウエア設計言語で可能であったブロック間で引数を渡すことなく値を参照することができなかった。また、レジスタの全てを参照するような機構がなかった。このため、全レジスタを波形出力できるように設定するような処理が面倒であった。
【０００４】
また、クロックを引数で渡さなければならず、シミュレーション上の部品を作成しても、クロックを渡すためには関数の引数を書き替える必要があり、手間であった。また、クロックのイベントの発生を制御する記述を記述しなければならず、手間であった。これらのため、シミュレーション上の汎用部品設計が非効率的であった。
【０００５】
また、ソフトウエア設計言語にハードウエア設計言語の機能を追加した環境においても、従来のハードウエア設計言語による環境においても、シミュレーション開始後、ある計算結果をもとに遡って動的にシミュレーションの実行過程を変更することが簡単にはできなかった。このため、ある計算結果をもとに遡ってシミュレーションの実行過程を変更するためには、最初から再実行せざるをえず、時間がかかっていた。
【０００６】
本発明は、かかる点に鑑み、ソフトウエア設計言語による論理回路設計の効率化を図ることができる論理シミュレーション方法及び装置を提供することを目的とする。
【０００７】
【課題を解決するための手段】
本発明中、第１の発明は、論理回路をソフトウエア設計言語で記述してシミュレーションする論理シミュレーション方法であって、ソフトウエア設計言語による論理回路の記述に階層構造情報を取得するための手段を含めるというものである。
【０００８】
本発明中、第１の発明によれば、ソフトウエア設計言語による論理回路の記述に階層構造情報を取得するための手段を含めるとしているので、階層構造を利用した処理を行うことができる。
【０００９】
本発明中、第２の発明は、論理回路をソフトウエア設計言語で記述してシミュレーションする論理シミュレーション方法であって、ソフトウエア設計言語による論理回路の記述に複数のクロックを一元管理するための手段を含めるというものである。
【００１０】
本発明中、第２の発明によれば、ソフトウエア設計言語による論理回路の記述に複数のクロックを一元管理するための手段を含めるとしているので、サイクル精度のシミュレーションを実現することができる。また、クロックのイベントの発生を制御することもできる。
【００１１】
本発明中、第３の発明は、論理回路をソフトウエア設計言語で記述してシミュレーションする論理シミュレーション方法であって、論理回路をシミュレーションし、所定の時間間隔でデータを作成する第１のプロセスと、第１のプロセスが作成したデータを所定の時間間隔で参照し、第１のプロセスに後行して同一の論理回路をシミュレーションする第２のプロセスを有するというものである。
【００１２】
本発明中、第３の発明によれば、論理回路をシミュレーションし、所定の時間間隔でデータを作成する第１のプロセスと、第１のプロセスが作成したデータを所定の時間間隔で参照し、第１のプロセスに後行して同一の論理回路をシミュレーションする第２のプロセスを有するとしているので、第１のプロセスによる計算結果を第２のプロセスが受け取り、動的にシミュレーションの実行過程を変更することができる。
【００１３】
本発明中、第４の発明は、論理回路をソフトウエア設計言語で記述してシミュレーションする論理シミュレーション装置であって、論理回路をシミュレーションし、所定の時間間隔でデータを作成する第１の手段と、第１の手段が作成したデータを所定の時間間隔で参照し、第１の手段に後行して同一の論理回路をシミュレーションする第２の手段を有するというものである。
【００１４】
本発明中、第４の発明によれば、論理回路をシミュレーションし、所定の時間間隔でデータを作成する第１の手段と、第１の手段が作成したデータを所定の時間間隔で参照し、第１の手段に後行して同一の論理回路をシミュレーションする第２の手段を有するとしているので、第１の手段による計算結果を第２の手段が受け取り、動的にシミュレーションの実行過程を変更することができる。
【００１５】
【発明の実施の形態】
（第１の発明の一実施形態・・図１〜図５）
本発明中、第１の発明の一実施形態では、論理回路をＣ＋＋言語で記述し、論理回路の階層構造を保持する手段として、階層構造を模擬するために階層構造を再現するオブジェクトを用意する。そして、このオブジェクトには関数ｃａｌｌと関数ｃａｌｌからのｒｅｔｕｒｎを模擬するためのｍｅｔｈｏｄとしてｉｎｉｔ（）を用意する。また、集めたい対象を登録するためのｍｅｔｈｏｄとしてｅｎｔｒｙ（）を用意する。
【００１６】
図１〜図４は本実施形態を説明するための図であり、図５に示すような階層構造の論理回路（ｍｏｄｕｌｅ１）をＣ＋＋言語で記述したものである。図１はｍａｉｎ関数の部分の記述（以下、記述１という）の一部分、図２はｍｏｄｕｌｅ１．ｈの部分の記述（以下、記述２という）の一部分、図３はｍｏｄｕｌｅ２．ｈの部分の記述（以下、記述３という）の一部分、図４はｍｏｄｕｌｅ３．ｈの部分の記述（以下、記述４という）の一部分を示している。なお、登録したい対象をレジスタとしている。
【００１７】
記述１は、自己解析フェーズと実行フェーズをｍａｉｎ関数内で分けた例を示している。自己解析フェーズでは、ｍａｉｎ関数内のｍｏｄｕｌｅ．ｉｎｉｔ（）により記述２のｉｎｉｔ（）が呼ばれる。なお、記述１〜記述３に示すように、ｉｎｉｔ（）関数のｃａｌｌ前後には、必ずｈｔｐ−＞ｃａｌｌ＿ｎｏｄｅ（＜ｍｏｄｕｌｅ名＞）；とｈｔｐ−＞ｒｅｔｕｒｎ＿ｎｏｄｅ（）；を記述するものとする。
【００１８】
すなわち、本実施形態では、ｃａｌｌ＿ｎｏｄｅ（＜ｉｎｓｔａｎｃｅ名＞）；で得られるインスタンス名を登録する。ｃａｌｌ＿ｎｏｄｅ（＜ｉｎｓｔａｎｃｅ名＞）；の直後で呼ばれるｉｎｉｔ（）内でｅｎｔｒｙ（）される要素名と要素へのｐｏｉｎｔｅｒをインスタンス名と関連づける。なお、記述２〜記述４では、レジスタ“ｒ１”とレジスタ“ｒ２”の登録を実施している。
【００１９】
記述２、記述３のようにｉｎｉｔ（）の中でｈｔｐ−＞ｃａｌｌ＿ｎｏｄｅ（＜ｍｏｄｕｌｅ＞）；が呼ばれている場合には現在参照しているインスタンス名の子として登録する。ｉｎｉｔ（）から抜けるｈｔｐ−＞ｒｅｔｕｒｎ＿ｎｏｄｅ（）；が呼ばれて一つ上のインスタンス名を指す。以上の処理により、階層オブジェクトの中に階層構造情報を持たせることができる。
【００２０】
なお、シミュレーション実行には、サイクル同期をとるためのオブジェクトを使用する。このオブジェクトには、全てのクロックを登録し、サイクル・イベントの発生の有無を参照できるようにする。また、全てのシミュレーション実行前の自己解析フェーズを示すイベントも発生させ、このイベントの発生の有無も参照できるようにする。このようにすることにより、シミュレーション実行時の処理記述部分に自己解析部分の記述を書き込むことができる。
【００２１】
また、これら２つのオブジェクト（手段）を使うことにより、ポート（ｐｏｒｔ）を介さずに信号を簡単に参照することができる。階層を表現するオブジェクトには、ｍｅｔｈｏｄ　ｆｉｎｄ（＜ｐａｔｈ＞）を用意する。＜ｐａｔｈ＞で与えられた文字列を解析し、所望の要素（例えば、レジスタ）へのポインタを返すことができる。これにより、ポートを介さずに信号を参照することができる。
【００２２】
また、所望の要素（例えば、レジスタ）に波形出力のｏｎ／ｏｆｆなどのｍｅｔｈｏｄをつけることにより、実行時に階層管理オブジェクトを利用してｓｗｉｔｃｈの設定を変更することができる。しかも、関数の変数の引数を変更したりしなくても、その関数の外側（そのｃｌａｓｓの外側）から制御することが可能である。階層管理オブジェクトにより設定の変更が容易にできる。
【００２３】
以上のように、本実施形態によれば、論理回路の階層構造を保持する手段として、階層構造を模擬するために階層構造を再現するオブジェクトを用意するとしているので、階層構造を利用した処理を行うことができる。したがって、Ｃ＋＋言語による論理回路設計の効率化を図ることができる。
【００２４】
（第２の発明の一実施形態）
本発明中、第２の発明の一実施形態は、Ｃ＋＋言語による論理回路の記述に複数のクロック（ｃｌｏｃｋ）を一元管理するための時間管理オブジェクトを導入し、この時間管理オブジェクトに、フラグ（ｆｌａｇ）ＩＮＩＴ＿ＦＬＡＧと、変数Ｇ＿ＶＡＬと、配列Ｃ＿ＬＥＮ［］、Ｃ＿ＲＥＳＴ［］、Ｃ＿ＮＡＭＥ［］と、Ｃ＿ＥＶＥＮＴ［］を持たせるというものである。
【００２５】
フラグＩＮＩＴ＿ＦＬＡＧは、時間管理オブジェクトがインスタンスされてから最初の時間更新手続きがコール（ｃａｌｌ）されるまでの間のみ「真」となるイニシャル（ｉｎｉｔｉａｌ）を示すものである。変数Ｇ＿ＶＡＬ　は、グローバル（ｇｌｏｂａｌ）な時間を格納し、グローバルな時間を管理するためのものである。
【００２６】
配列Ｃ＿ＬＥＮ［］は、クロックのサイクルの長さを格納するものである。配列Ｃ＿ＲＥＳＴ［］は、クロックの次のサイクル・イベント（ｃｙｃｌｅ　ｅｖｅｎｔ）までの残り時間を格納するものである。配列Ｃ＿ＮＡＭＥ［］は、クロックの名前を格納するためのものである。配列Ｃ＿ＥＶＥＮＴ［］は、クロック・イベントの発生の有無を格納するためのものである。
【００２７】
本実施形態においては、時間管理オブジェクトがインスタンスした時点で、ＩＮＩＴ＿ＦＬＡＧにｔｒｕｅを代入し、Ｇ＿ＶＡＬに（ｕｎｓｉｇｎｅｄ）−１を代入する。また、登録関数によりクロックに一意のＩＤ番号が付与される。この処理は、クロックの名前をＣ＿ＮＡＭＥ［ＩＤ］に代入し、クロックのサイクルの長さをＣ＿ＬＥＮ［ＩＤ］に代入し、クロックのサイクルの残り時間＋１をＣ＿ＲＥＳＴ［ＩＤ］に代入する。なお、本例では、Ｃ＿ＲＥＳＴ［ＩＤ］にクロックのサイクルの残り時間＋１を代入しているが、これは、実質的なシミュレーションの開始が１ｔｉｃｋ消費してから行われることによる。
【００２８】
時間管理オブジェクトは、ｕｐｄａｔｅ（）　ｍｅｔｈｏｄのコールにより時間の更新をする。時間の更新方法は、以下の通りである。
（１）Ｃ＿ＲＥＳＴ［ＩＤ］の最小値（ｍｉｎ＿ｖａｌ）を求める。
（２）Ｃ＿ＲＥＳＴ［］の全ての要素ごとに残り時間＝（格納値−ｍｉｎ＿ｖａｌ）を計算する。そして、Ｃ＿ＲＥＳＴ［ＩＤ］＝０であるクロックについては、Ｃ＿ＥＶＥＮＴ［ＩＤ］＝ｔｒｕｅ、Ｃ＿ＲＥＳＴ［ＩＤ］＝Ｃ＿ＬＥＮ［ＩＤ］とし、Ｃ＿ＲＥＳＴ［ＩＤ］≠０であるクロックについては、Ｃ＿ＥＶＥＮＴ［ＩＤ］＝ｆａｌｓｅ、Ｃ＿ＲＥＳＴ［ＩＤ］＝（格納値−ｍｉｎ＿ｖａｌ）とする。
（３）ＩＮＩＴ＿ＦＬＡＧ＝ｆａｌｓｅ
【００２９】
時間管理オブジェクトは、ｓｅｔＭｏｎｉｎｇＣａｌｌ（）　ｍｅｔｈｏｄのコールにより次のイベントの発生を遅延させる。次のイベントの発生を遅延させる方法は、以下の通りである。
（１）ｓｅｔＭｏｎｉｎｇＣａｌｌ（）は、引数にクロックのＩＤ番号と遅延させるサイクル数ＣＮＵＭをとる。
（２）Ｃ＿ＲＥＳＴ［ＩＤ］＝Ｃ＿ＲＥＳＴ［ＩＤ］＋Ｃ＿ＬＥＮ［ＩＤ］＊ＣＮＵＭ
【００３０】
時間管理オブジェクトは、ｓｌｅｅｐＥｖｅｎｔ（）　ｍｅｔｈｏｄのコールによりイベントの発生を可能な限り遅延させる。イベントの発生を可能な限り遅延させる方法は、以下の通りである。
（１）ｓｌｅｅｐＥｖｅｎｔ（）は、引数にクロックのＩＤ番号をとる。
（２）ｔｅｍｐ１に（ｕｎｓｉｇｎｅｄ）−１をＣ＿ＬＥＮ［ＩＤ］で割った商を代入する。
（３）ｔｅｍｐ２にＣ＿ＲＥＳＴ［ＩＤ］以上で最も小さいＣ＿ＬＥＮ［ＩＤ］の倍数を代入する。
（４）Ｃ＿ＲＥＳＴ［ＩＤ］＝Ｃ＿ＲＥＳＴ［ＩＤ］＋（ｔｅｍｐ１−（ｔｅｍｐ２／Ｃ＿ＬＥＮ［ＩＤ］））＊Ｃ＿ＬＥＮ［ＩＤ］
【００３１】
時間管理オブジェクトは、ｆｏｒｃｅＥｖｅｎｔ（）　ｍｅｔｈｏｄのコールによりイベントの発生を強制する。イベントの発生を強制する方法は、以下の通りである。
（１）ｆｏｒｃｅＥｖｅｎｔ（）は、引数にクロックのＩＤ番号をとる。
（２）Ｃ＿ＲＥＳＴ［ＩＤ］にＣ＿ＲＥＳＴ［ＩＤ］をＣ＿ＬＥＮ［ＩＤ］で割った余りを代入する。
【００３２】
以上のように、本実施形態によれば、Ｃ＋＋言語による論理回路の記述に複数のクロックを一元管理するための時間管理オブジェクトを導入するとしているので、サイクル精度のシミュレーションを実現することができる。また、クロックの発生を制御することもできる。したがって、Ｃ＋＋言語による論理回路設計の効率化を図ることができる。
【００３３】
（第３、第４の発明の一実施形態・・図６〜図９）
図６は本発明中、第３の発明の一実施形態を実行するための環境を示す図（第４の発明の一実施形態の構成図）であり、図６中、１０、２０はＣ＋＋言語で記述された同一の論理回路についてシミュレーションを行うものである。
【００３４】
本実施形態は、マシーン１０には、マシーン２０に先行させてシミュレーション・プロセスを開始させ、所定の時間間隔でデータを作成させ、マシーン２０には、マシーン１０で得られるデータを参照させ、マシーン１０に常に後行させてシミュレーション・プロセスを実行させるというものである。
【００３５】
本実施形態の適用例としては、例えば、マシーン１０（先行シミュレーション・プロセス）は、論理回路内のバッファの利用率のデータなどの統計データをとり、これをマシーン２０（後行シミュレーション・プロセス）に送り、マシーン２０はバッファの利用率が所定値以上ならば、関係のある波形データをとる場合などである。
【００３６】
図７は先行シミュレーション・プロセスと後行シミュレーション・プロセスとの間の通信方法を示す図である。図７Ａに示す通信方法は、プロセス間通信（ｓｏｃｋｅｔ、ｔｈｒｅａｄなど）を利用したデーモン３０を用意し、先行シミュレーション・プロセスはデーモン３０にデータを書き、後行シミュレーション・プロセスはデーモン３０からデータを読み出すというものである。
【００３７】
図７Ｂに示す通信方法はファイル４０を利用したものであり、先行シミュレーション・プロセスは、所定のタイミングで、そのタイミングが分かるようなファイル４０を生成し、後行シミュレーション・プロセスは、所定のタイミングで、ファイル４０を読み込むというものである。
【００３８】
図８は先行シミュレーション・プロセスと後行シミュレーション・プロセスとの同期の取り方の一例を示す図であり、先行シミュレーション・プロセスと後行シミュレーション・プロセスとの通信方法としてファイルを用いた場合を例にしている。
【００３９】
本例では、先行シミュレーション・プロセスと後行シミュレーション・プロセスとは、１００００ｎｓ毎に待ち合わせをしている場合を例にしており、先行シミュレーション・プロセスは、１００００ｎｓ毎に論理回路の評価を行い、データをファイルに落とすとしている。
【００４０】
すなわち、先行シミュレーション・プロセスは、シミュレーションの開始後、まず、最初に、０−１００００ｎｓ間のデータのファイルを作成する。これに対して、後行シミュレーション・プロセスは、先行シミュレーション・プロセスが０−１００００ｎｓ間のデータのファイルを作成するまで待ち、作成したら、ファイルを呼んで、０−１００００ｎｓ間にすべきことを決定して設定し、シミュレーションを開始する。
【００４１】
なお、後行シミュレーション・プロセスの待ち方として、ファイル・オープンを定期的に検査してオープンすることができたときに、待ちを解除する方法などがある。また、動的な設定の必要な対象については先の階層管理オブジェクトに登録することにより、少ない記述の変更で１個所に集約した記述が可能になる。
【００４２】
以上のように、本実施形態によれば、マシーン１０による先行シミュレーション・プロセスとマシーン２０による後行シミュレーション・プロセスとを並列実行し、先行シミュレーション・プロセスによる計算結果を後行シミュレーション・プロセスが受け取り、動的にシミュレーションの実行過程を変更することができるようにしている。したがって、Ｃ＋＋言語による論理回路設計の効率化を図ることができる。
【００４３】
なお、本実施形態においては、後行シミュレーション・プロセスが１つの場合について説明したが、後行シミュレーション・プロセスが複数ある場合にも、先行後行並列実行によるシミュレーションを行うことができる。図９は後行シミュレーション・プロセスが複数ある場合の先行シミュレーション・プロセスと後行シミュレーション・プロセスとの繋ぎ方を示す図であり、図９Ａは後行シミュレーション・プロセスが階層構造を持たない場合、図９Ｂは後行シミュレーション・プロセスが階層構造を持つ場合である。
【００４４】
また、本発明の実施形態では、ソフトウエア設計言語として、Ｃ＋＋言語を使用しているが、本発明は、Ｃ＋＋言語以外のソフトウエア設計言語を使用する場合にも適用することができる。
【００４５】
【発明の効果】
以上のように、本発明中、第１の発明によれば、ソフトウエア設計言語による論理回路の記述に階層構造情報を取得するための手段を含めるとしたことにより、階層構造を利用した処理を行うことができるので、ソフトウエア言語による論理回路設計の効率化を図ることができる。
【００４６】
本発明中、第２の発明によれば、ソフトウエア設計言語による論理回路の記述に複数のクロックを一元管理するための手段を含めるとしたことにより、サイクル精度のシミュレーションを実現することができるのみならず、クロックの発生を制御することもできるので、ソフトウエア言語による論理回路設計の効率化を図ることができる。
【００４７】
本発明中、第３の発明によれば、論理回路をシミュレーションし、所定の時間間隔でデータを作成する第１のプロセスと、第１のプロセスが作成したデータを所定の時間間隔で参照し、第１のプロセスに後行して同一の論理回路をシミュレーションする第２のプロセスを有するとしたことにより、第１のプロセスによる計算結果を第２のプロセスが受け取り、動的にシミュレーションの実行過程を変更することができるので、ソフトウエア言語による論理回路設計の効率化を図ることができる。
【００４８】
本発明中、第４の発明によれば、論理回路をシミュレーションし、所定の時間間隔でデータを作成する第１の手段と、第１の手段が作成したデータを所定の時間間隔で参照し、第１の手段に後行して同一の論理回路をシミュレーションする第２の手段を有するとしたことにより、第１の手段による計算結果を第２の手段が受け取り、動的にシミュレーションの実行過程を変更することができるので、ソフトウエア言語による論理回路設計の効率化を図ることができる。
【図面の簡単な説明】
【図１】本発明中、第１の発明の一実施形態を説明するための図（ｍａｉｎ関数の部分の記述の一部分を示す図）である。
【図２】本発明中、第１の発明の一実施形態を説明するための図（ｍｏｄｕｌｅ１．ｈの部分の記述の一部分を示す図）である。
【図３】本発明中、第１の発明の一実施形態を説明するための図（ｍｏｄｕｌｅ２．ｈの部分の記述の一部分を示す図）である。
【図４】本発明中、第１の発明の一実施形態を説明するための図（ｍｏｄｕｌｅ３．ｈの部分の記述の一部分を示す図）である。
【図５】シミュレーションの対象である論理回路（ｍｏｄｕｌｅ１）の階層構造を示す図である。
【図６】本発明中、第３の発明の一実施形態を実行するための環境を示す図（第４の発明の一実施形態の構成図）である。
【図７】先行シミュレーション・プロセスと後行シミュレーション・プロセスとの間の通信方法を示す図である。
【図８】先行シミュレーション・プロセスと後行シミュレーション・プロセスとの同期の取り方の一例を示す図である。
【図９】後行シミュレーション・プロセスが複数ある場合の先行シミュレーション・プロセスと後行シミュレーション・プロセスとの繋ぎ方を示す図である。
【符号の説明】
１０…マシーン
２０…マシーン
３０…デーモン
４０…ファイル
【図１】
2004013860.tif 000003
【図２】
2004013860.tif 000004
【図３】
2004013860.tif 000005
【図４】
2004013860.tif 000006
【図５】
2004013860.tif 000007
【図６】
2004013860.tif 000008
【図７】
2004013860.tif 000009
【図８】
2004013860.tif 000010
【図９】
2004013860.tif 000011