2.4 auto.bat の働き


auto コマンドとは何か

2.3節では,例題を用いて,とりあえず論理合成を体験してみることができました.そこで重要な役割を果たしていたのが autoコマンドですが,これを理解することが,PARTHENONの論理合成系の各プログラムを使いこなすための近道となります.

じつは,autoコマンドをキー・インしたときに実行されるのは,%PARTHENON%\com (%PARTHENON% は,PARTHENON をインストールしたパス名を示す)に置かれている,auto.bat というバッチ・ファイルです.このバッチ・ファイルは,PARTHENONの論理合成系の一連のプログラムを典型的な手順で実行させるために用意してあるものです.そして,この auto.bat の内容を読んで,その動きを追うことで,合成系の各プログラムの標準的な使用方法が理解できるはずです.なお,auto.bat は通常のバッチ・プログラムですので,好みに応じてカスタマイズすることが可能です.また,合成する回路の最適化の程度などをコントロールするためには,一部を書き換えて使用する必要性もでてきます.まず,ここでは,PARTHENONのインストール時にできたauto.batを,そのまま使用することを前提として説明をします.


auto.bat が想定している処理の流れ

auto.bat が想定している一連の処理の流れを,図2.6に示します.図中,およびここでの説明ででてくる module_name は,実際は合成対象としている回路のトップ・モジュール名(auto.batの第1パラメータとして指定)を表しています.

<図2.6> auto.bat が想定している合成系の流れ

(1) まず,論理合成プログラム SFLEXP が起動され,SFLソースの module_name.sfl から,HSL形式のネットリスト module_name.hsl が合成されます.

SFLEXPの実行中に,PRIME,NEGATEの各処理プログラムが必要に応じて繰り返し起動されます.

(2) 次に,ネットリスト形式変換プログラム HSL_NLD により,NLD形式のネットリストが module_name.1st というサブディレクトリ内にできます.

なお,NLD形式のネットリストは,階層構成を形成するサブモジュールごとに別のファイル(トップ・モジュールの module_name.nld は必ず存在する.ほかにサブモジュール名.nld というファイルができる)となりますので,module_name.1st 内にあるファイルは一つとはかぎりません(そのためにサブディレクトリを設けて混乱しないようにしている).

(3) 続いて,回路最適化プログラム OPT_MAP が起動され,テクノロジ(セル・ライブラリの物理情報)とは無関係な論理レベルでの論理回路の簡単化を実施します.

OPT_MAPを動作させるためには,対話的にコマンドをキー・インするか,または,OPT_MAP のコマンド・シーケンスを記述したスクリプト・ファイルを用意しておくことが必要ですが,ここでは後者の手法をとります.auto.batの第3パラメータで指定されるセル・ライブラリのディレクトリ(図2.6では cell_libと表している)内に,このスクリプト・ファイルを自動的に作成するためのテンプレート・ファイル opt_scr.op1 が用意されており,実際に OPT_MAP が使用するスクリプト・ファイル module_name.op1は,このテンプレート・ファイルから作成されます.

また,module_name.op1から,別のスクリプト・ファイル module_name.ons をコールして実行するようになっており,この module_name.ons は,やはりセル・ライブラリに置かれているテンプレート・ファイル opt_scr.lv3 から作成されます.そして,OPT_MAP がこの module_name.ons を実行することによって,論理回路簡単化プログラム ONSET が繰り返し起動されます.こうして,回路の明らかな冗長部分は除去され,組み合わせ回路部分には論理を考慮した簡単化が実施されます.この結果のネットリストは,OPT_MAPから module_name.2ndというサブディレクトリ内にNLD形式で格納されます.

(4) ここまでの論理回路には,大域的にはさらに簡単化の余地が残っています.そこで,対象を極性の最適化(インバータの削減)に絞って,大規模回路にも効率的に適用できる 極性最適化プログラム RINV が起動されます.RINVは,module_name.2nd にあるネットリストを読み込み,回路全体の極性最適化を図ったあと,サブディレクトリ module_name.3rd に結果をNLD形式で格納します.

(5) 次に,再度,回路最適化プログラム OPT_MAP が起動され,今度は module_name.op2というスクリプト・ファイルによって,外部条件や実セルの物理的条件(遅延時間,負荷ドライブ能力,面積など)に基づく最適化を実施します.このコマンド・スクリプトでは,まず,実セルへのマッピング,遅延評価などを実施します.このあと,クリティカル・パスを含む組み合わせ回路のくくりだしと,論理回路簡単化プログラム ONSET によるクリティカル・パスの再圧縮処理を,module_name.cpb というスクリプト・ファイルを呼び出すことによって繰り返し実行します.

これらの module_name.op2,module_name.cpb といったスクリプト・ファイルは,やはりセル・ライブラリに置かれているテンプレート・ファイル opt_scr.op2,opt_scr.cpb からそれぞれ自動的に作成されます.こうして,制約条件を満たす最終回路のネットリストが,NLD形式でサブディレクトリ module_name.4thに格納されるとともに,EDIF形式のネットリスト module_name.edf がカレント・ディレクトリに作成されます.

(6) 回路図作成プログラム NLD_PS は,module_name.4thにあるNLD形式のファイルから PostScript形式の回路図を作成し,カレント・ディレクトリに module_name.psというファイル名で格納します.

なお,テンプレート・ファイルから,OPT_MAP用のスクリプト・ファイルを作成する際には,文字列置き換えプログラム SRP が使用されます.


auto.bat が想定しているセル・ライブラリの構成

auto.bat の動作時に使用するセル・ライブラリには,start,start_e,cell,cell_e といったサブディレクトリが存在することが前提となっていますが,その理由をここで簡単に説明します(詳細は 4.3節 セル・ライブラリの作り方を参照のこと).なお,PARTHENONのインストール時に作成されるデモ用ライブラリ celldemo は,この典型的な例になっています.

(1) 実セル情報格納用サブディレクトリ cell

物理的情報を含む実セルの情報は,サブディレクトリcell内に PCD形式(ファイル名は,モジュール名.pcd)で格納します.最終ネットリストは,ここにある実セルをクラス(部品種別)とするインスタンス(個々の部品)間の接続情報になります.

(2) 仮想セル格納用サブディレクトリ start

ところで,用意されている実セルの種別およびそのモジュール名,端子名などは,当然,セル・ライブラリによって異なります.そこで,PARTHENONでは,使用するテクノロジとは無関係(テクノロジ・インディペンデント)な段階での処理は,この実セルの種別と名称に依存することなく,各処理プログラム間で統一的に扱えるセル(基本ゲート,フリップフロップなど)の種別と,その名称(inv-,nand--2,reg--1などの予約名)を使用します.SFLEXPが合成するネットリストや,ONSET,RINVによって出力されるネットリストは,このようなセル(仮想セルと呼ぶ)をクラスとするインスタンス間の接続情報となります.

仮想セルからなるネットリストも,実セルからなるネットリストと同様に,各処理プログラムから一元的に取り扱うことができると便利です.そこで,仮想セルの情報もセル・ライブラリ内に用意しておきます.startはそのためのサブディレクトリであり,予約名をもつすべてのセル情報が,PCDまたはNLD形式(ファイル名はそれぞれ,モジュール名.pcd,モジュール名.nld)で格納されている必要があります.ここで NLDで使われるのは,必要な仮想セルと同一機能の実セルが存在しない場合です.このとき,他のセルからなるネットリストによって同一機能を実現しておく必要があります.

(3) 機能回路用サブディレクトリ cell_e, start_e

また,標準的に用意されている実セル以外に,設計者が機能回路"circuit"として使用するハード・マクロのような実セルと,それに対応した仮想セルの情報を格納する目的で,それぞれ cell_e,start_e というサブディレクトリを設けています.


auto.bat の使用方法

auto.bat の起動時には,以下のように,4個までのパラメータを指定します.

auto module_name goal cell_lib mode

ここで,各パラメータは,次のように指定します.

module_name : 合成対象となるSFL記述のトップ・モジュール名を指定 (ただし,SFLソース・ファイル名は module_name.sflであること)

goal::= {hsl | nld1 | nld2 | nld3 | nld4 | ps | clean} 合成系の各処理をどこまで実行するかを指定
hsl :論理合成プログラム SFLEXP まで実行して,HSL形式のネットリストを作成
nld1 :上記に加え,ネットリスト変換プログラム HSL_NLD を実行し,NLD形式の初期ネットリストを作成
nld2 :上記に加え,回路最適化プログラム OPT_MAP を実行し,簡単化されたネットリストを作成
nld3 :上記に加え,極性最適化プログラム RINV を実行,極性最適化されたネットリストを作成
nld4 :上記に加え,回路最適化プログラム OPT_MAP (2度目)を実行し,テクノロジ・マッピング,最適化を行った最終ネットリストを作成
ps :上記に加え,回路図作成プログラム NLD_PS を実行,PostScript形式の回路図を作成
clean :論理合成時に作成された各種ファイルや,ディレクトリを消去 (この場合,第3,第4のパラメータは不要)

cell_lib : 合成の際に使用するセル・ライブラリが格納されているディレクトリ名を指定 (%PARTHENON%からのパス名で指定する)

mode ::= {(なし) | quick}
(なし) :論理簡単化処理を通常に実施
quick :論理簡単化処理をスキップして高速に合成する場合に指定

たとえば,SFLソース・ファイル TIMER.sflからTIMERというモジュールをトップ・モジュールとして合成する場合,module_name はTIMERとなります.そして論理回路図作成まで実行する場合,goal としてpsと指定すれば,SFLEXP から NLD_PS までの処理が順番に実行されます.cell_lib には,サンプル用にPARTHENONに添付されているセル・ライブラリの celldemo (%PARTHENON%\celldemoに置かれているはず)を指定できます.mode は省略して,結局,

A>auto TIMER ps celldemo

という2.3節の冒頭で示した(6)の実行例になります.

なお,mode にquickを指定すると,PRIME,NEGATE,ONSETの各処理が実行されません.ただし,このとき SFLEXP は,PRIME,NEGATEの処理をスキップさせるために,-nopostというオプション付きで実行されます.階層構造をもつ(サブモジュールをもつ) SFL記述を合成する場合には,このオプションを指定すると予期せぬループ回路ができてしまう(SFLEXP自体は正常に終了するが,後のOPT_MAPで遅延評価ができないなどの問題が起こる)おそれがあります.したがって,quick指定でのSFLEXPの使用はできるかぎり避けてください.OPT_MAPの実行時に,ONSETがスキップされることに関しては,論理回路の簡単化処理が省略されるだけであり,問題を発生させることはありません.


auto.bat の内容を読んでみる

さて,お手持ちのエディタなどを使用して,%PARTHENON%\comにある auto.bat の中身をのぞいてみてください.if文やgoto文など,論理合成処理の本質とは関係のない制御文が多くて読みにくいかと思いますが,バッチ・ファイルのコマンド(詳細は,MS-DOSのマニュアルなどを参照のこと)に慣れていれば,読むのはそんなに難しくないかと思います.

たくさんの if文や,goto文などは,まず,パラメータ(バッチ・ファイル内では,%1,%2,%3,%4として参照される)の正当性のチェックと,それに応じたプログラムの起動のために置かれています.たとえば,

A>auto TIMER nld1 celldemo

とすれば,サブディレクトリ TIMER.1st 内に初期ネットリストができた段階で処理を終えます.

そのほか,すでに実行済みの処理はスキップし,必要な処理から開始させるために,多くの制御文が置かれています.たとえば,すでに

A>auto TIMER nld4 celldemo

を実行していて,最終ネットリストまでができあがっている場合,次に,

A>auto TIMER ps celldemo

を実行すると,実行済みの SFLEXPからOPT_MAPまでの処理をすべてスキップして,いきなり NLD_PS の処理から開始します.

ただし,たとえば TIMER.ons を修正したので,もう一度,最初の OPT_MAPの処理からやり直したいという場合には,そのやり直したい処理の出力ファイルだけを消去すればよいようになっています.この場合は,

A>del TIMER.2nd\*.*
A>auto TIMER ps celldemo

とすれば,SFLEXP から HSL_NLD までの処理はスキップし,その後の OPT_MAP から NLD_PS までの一連の処理が起動されます.

それでは,これらの実行制御のためのif文,goto文,echo文などは除いて,本質的に実行されるコマンド・シーケンスだけに着目してみましょう.2.3節の冒頭の(6)で示した実行例,すなわち

A>auto TIMER ps celldemo

を実行する場合に,本質的に実行されるコマンド・シーケンスだけを抜き出して記述するとリスト2.11のようになります(ディレクトリの区切り記号として\と/が混在しているが問題はない).


auto の本質を理解する

autoの本質,すなわちPARTHENONの合成系の典型的な使用方法は,リスト2.11に示された16行に集約されています.ここでこれを説明します.

<リスト2.11> auto.bat で実行されるコマンド・シーケンスの例

 1: sflexp TIMER.sfl TIMER.hsl
 2: mkdir TIMER.1st
 3: hsl_nld TIMER.hsl TIMER.1st
 4: srp TargeT TIMER A:\par\celldemo\opt_scr.op1 > TIMER.op1
 5: srp TargeT TIMER A:\par\celldemo\opt_scr.lv3|srp InputpiN 12 >  TIMER.ons
 6: srp TargeT TIMER A:\par\celldemo\opt_scr.lv3|srp InputpiN 12 >> TIMER.ons
 7: mkdir TIMER.2nd
 8: echo TIMER.op1|opt_map TIMER TIMER.1st A:\par/sfl_lib.dir A:\par/celldemo/start 
    A:\par/celldemo/start_e
 9: mkdir TIMER.3rd
10: rinv TIMER TIMER.2nd A:\par/celldemo/start A:\par/celldemo/start_e -w TIMER.3rd
11: srp TargeT TIMER A:\par\celldemo\opt_scr.op2 > TIMER.op2
12: srp TargeT TIMER A:\par\celldemo\opt_scr.cpb|srp InputpiN 10 >  TIMER.cpb
13: srp TargeT TIMER A:\par\celldemo\opt_scr.cpb|srp InputpiN 10 >> TIMER.cpb
14: mkdir TIMER.4th
15: echo TIMER.op2 | opt_map TIMER TIMER.3rd A:\par/celldemo/start A:\par/celldemo/s
    tart_e A:\par/celldemo/cell
16: nld_ps -c "PARTHENON v2.3" -p 1.2 -s A4 -o TIMER.ps TIMER TIMER.4th A:\par/celld
    emo/cell A:\par/celldemo/cell_e

もちろん,リスト2.11のとおりにコマンドを順番に実行していけば,

auto TIMER ps celldemo 

と実行したのと同じ結果が得られることになります.

ここで,4〜6行,11〜13行のスクリプト・ファイル作成の部分はさらに説明が必要ですが,その他の部分は,各プログラムの起動オプションの説明と合わせてみれば理解しやすいはずです.


OPT_MAP 用のスクリプト・ファイルを理解する

さて,リスト2.11の4〜6行,11〜13行で作成されるOPT_MAP用の 4種のスクリプト・ファイルの内容について,重要な部分を簡単に説明します.2.3節の冒頭の例の(6)を実施したあとにも,この4種のスクリプト・ファイルが残っているはずですので,それをエディタなどで参照してみてください.これらのスクリプト・ファイルは,すべてOPT_MAP用のコマンド・シーケンスとなっています.


(1) TIMER.op1で重要なのは,rmというコマンドによって,回路の明らかな冗長部分を除去すること,TIMER.ons という外部のスクリプト・ファイルをコールすること,そして,write_org_type コマンドで結果のネットリストをTIMER.2ndへ格納することになります.


(2) TIMER.onsでは,まずflatコマンドで全体の階層構成を無くし,次にenciaコマンドによって最大12入力となるような組み合わせ論理回路の囲い込みを実施します.次に,この囲い込まれた各論理回路ごとにONSETを適用させて簡単化を実施させるようなスクリプト・ファイル TIMER._tpを,eachnコマンドによって一時的に作成します.そして,TIMER._tp をコールして実行し,その後,囲い込みをdiseコマンドによって解消します.そして,この処理全体をもう一度繰り返し実行します.

TIMER._tpの実行時に起こるONSETとのインタフェースには,一時的なサブディレクトリ TIMER._dr 内において,OPT_MAP側からの出力にはBLIF形式のネットリスト,ONSET側からの出力にはNLD形式のネットリストの各ファイルを用います.OPT_MAPの中からONSETを起動するために,一時的なバッチ・ファイル _tmp.bat を作成して実行します.

_tmp.bat には,ONSET が実行すべきスクリプト・ファイルとして %PARTHENON%/com /onset.dir/b2n_area.scr が指定されるほか,第1パラメータとして,ネットリストのパス名,第2パラメータとしてonが指定されます.これらのパラメータは,ONSETが実行するb2n_area.scrで参照され,結果としてONSETは,さらに%PARTHENON%/com/ onset.dir/area.scr を呼び出して面積優先の簡単化を実行することになります.


(3) TIMER.op2 では,flat,rmなどの実行後,設計条件を設定しています.init pinコマンドや,setコマンドによって,遅延計算の起点となるイベントを外部入力端子に設定しています.また,maxコマンドで,一部の外部入力端子に対する負荷容量の制約条件を指定しています.さらに,setvコマンドによって,OPT_MAPのグローバル変数?cycle に値をセットしています.この ?cycle という変数は,celldemo のセル・ライブラリ記述において,フリップフロップのセットアップ時間,ホールド時間などの制約条件の記述に現れる変数名であり,このライブラリの使用時においては,サイクル時間に相当するものとみなされます.

さて,これらの条件を設定したあと,opt コマンドが実行され,すべての制約条件が解消する方向への回路の最適化が起こります.opt コマンドの 1回だけの実行では,未解決の制約条件が残る場合をあり得ますので,ここでは,3回程度実行しています(制約条件違反がなくなった状態では,optコマンドの実行で何も起こらない).

そして,TIMER.cpbという外部のスクリプト・ファイルをコールしたあと後,最終ネットリストをlast_org_typeコマンドによってTIMER.4thへ格納するとともに,edifコマンドで EDIF 形式のネットリストを TIMER.edfというファイル名で作成しています.


(4) TIMER.cpb は,TIMER.ons と同様に,ONSETを起動するためのOPT_MAPのスクリプト・ファイルですが,encid コマンドによって,最大遅延伝搬パスにあると評価されたモジュールを優先的に囲い込み,それに対して速度優先のスクリプト・ファイルによるONSETを適用させるなどの相違点があります.ONSETによる処理を受けた部分回路は,仮想セルで構成されることになりますので,そのあと,optコマンドの実行が必要となります.


ところで,TIMER.op2 で設定されている制約条件の値などは,まったく根拠のないものです.実際にLSI化する場合には,それに応じたセル・ライブラリを用意するとともに,実際に即した制約条件を正しく設定しなければならないことは言うまでもありません.autoで作られるこれらのスクリプト・ファイルは,あくまでもひな形として利用してください.


● auto の高度な使用方法

OPT_MAP 用のスクリプト・ファイルを変更する

さて,

A> auto TIMER ps celldemo quick

として,quickモードを指定してautoコマンドを実行した場合にできる,TIMER.ons,TIMER.cpbの二つのスクリプト・ファイルの内容は,quickを指定しない場合と全く異なるものとなり,この場合は,ONSET がまったく実行されなくなります.

これは,極端な例ですが,これらのスクリプト・ファイルの内容によってONSETの適用方法をコントロールすることができます.

まず,リスト2.11の 5,6行によって,組み合わせ回路のくくり出しとそれぞれに対するONSET適用を,2回繰り返すことになりますが,6行をもう一度実行して,以下のように TIMER.ons を作成すると,これが 3回の繰り返しになります.

   srp TargeT TIMER A:\par\celldemo\opt_scr.lv3|srp InputpiN 12 >  TIMER.ons
   srp TargeT TIMER A:\par\celldemo\opt_scr.lv3|srp InputpiN 12 >> TIMER.ons
   srp TargeT TIMER A:\par\celldemo\opt_scr.lv3|srp InputpiN 12 >> TIMER.ons

実際は,auto.bat のこの部分を書き換えれば,それ以降,この auto.bat で作られるスクリプト・ファイルに反映されることになります.

また,この部分で,InputpiN を 12 に置き換えていますが,これが,組み合わせ回路くくり出しの際の最大入力端子数の指定になります.この数値を大きくすれば(最大 31),一度に大きな回路に対してONSETを適用させることになります(簡単化にきわめて長時間かかる場合もでてくる).

多くの回路では,15入力端子程度の分割で,5回程度の繰り返しを実施すれば,それ以上の簡単化の効果がほとんど現れない状態に落ち着くようです.ただし,例外的な論理回路も当然存在します.これに対しては,いろいろな手法を試して,よい結果を探し出すことも必要になります.

なお,例題のTIMER に含まれている程度の小規模な組み合わせ回路では,ONSETの1回の適用で十分な簡単化が起こりますので,繰り返し適用の効果はほとんど現れません.

一方,リスト2.11の 12, 13行に相当する部分は,クリティカル・パスと思われる部分へのONSETの適用を図るものですが,ここでも同様に,相当する auto.bat の部分を変更することで,繰り返し実行の制御を行うことができます.ただし,より性能の高い回路に仕上げる際には,OPT_MAP を対話的に使用し,最適化の状況に応じて,きめ細かい対応を実施することをお勧めします.

このように,auto.bat を変更すること以外にも,作成されたスクリプト・ファイルに手を加える,あるいは,その元となるテンプレート・ファイルに手を加える,ONSETが実行するスクリプト・ファイルを変更するなどの手段も試してみてください.たとえ,これらのファイルをこわしてしまっても,PARTHENONを再インストールすれば,元に戻ります.


auto.bat を大胆に変更する

auto.bat は,あくまでもPARTHENONの合成系の各プログラムを標準的に使用するための指針をしめすものです.気に入らなければ大胆に変更してかまいません.

たとえば,合成系において,極性最適化プログラム RINV は,どうしても適用しなければならないプログラムではありません.もし,RINVを使用しないならば,OPT_MAPを2回に分けて実行する必要がなくなりますので,処理が簡単になります.それに対応させた auto.bat や,テンプレート・ファイルを作成すれば,その効果を実験してみることができます.もちろん,既存のauto.bat とは異なる名前で共存させて,必要に応じて使いわけることも可能です.

また,処理の各過程ごとに回路図作成プログラム NLD_PS で回路図を出力させるとか(仮想セルから構成される回路図ももちろん作成できる),もし,PostScriptファイルを画面表示するビューワがある場合には,それを自動的に起動するといった変更も可能です.


PARTHENONによる設計入門 のページへ戻る

ホームページに戻る