SP2SPの解析
by K.I
Index
- gwave(Freeの波形SpiceViewer)を改良しようとしたが困難だったので、
- ヘッダー部分だけを解析して、それをもとに新しいviewerを作ろうと考えた。
- Avanwaveは機能的には充分だがライセンス料が高く導入は厳しい。
- gwaveの良い点・・・hspiceのバイナリのデータを直接よめる。
- gwaveの悪い点・・・目盛りが無い、sweepに対応していない。
[top]
- PowerViewでinverterのみ入ったサンプルを作った。
- (inverterが最も単純で解析しやすい回路であったため)
- inverterの中身(こちらもPowerViewからもってきた)
[top]
- spicelinkを使ってネットリストを作成した。→inverter.cirができた。(.cirは回路ネットリストの拡張子)
* Project INVERTER
* Powerview Wirelist Created with Version 6.1
* Inifile : wspice.ini
* Options : -m -f -n
* Levels :
*
M101P01 X A VDD VDD PMOST L=1.00U W=3.98U AD=9.11P AS=5.97P PD=8.56U
+ PS=6.98U
M101N01 X A 0 0 NMOST L=1.00U W=2.38U AD=5.45P AS=3.57P PD=6.96U
+ PS=5.38U
* DICTIONARY 1
* GND = 0
*SPICElinkで作成したネットリストに以下のものを追加
VDD VDD 0 DC 5→VDD電源の定義(ノードVDD,0の間に5VのDC電源を定義する)
VIN1 A 0 PULSE( 0 5 10NS 2NS 2NS 20NS 40NS)→VIN1電源の定義(ノードA,0の間にパルス電源を定義する)
.TRAN 1NS 100NS SWEEP TEMP 25 75 25→過渡解析を1NSから100NSまで行う(温度を25度,50度,75度で振る)
.lib '/home/libdata/hspice/para2/b500h.0.2.typ.par' TT→ライブラリの取り込み
.include '/home/libdata/hspice/para2/b500h.bjt.0.0.par'
.OPTIONS INGOLD=2 CSDF=2 POST→ポストデータのフォーマットを作る
.END
[top]
[top]
- gwaveはsweepパラメータに対応していないので温度を固定したものを例として挙げる。
[top]
- ss_open
- hspiceのファイルをopenしてSpiceStreamを生成する。
- ss_open_internal
- フォーマットから使う関数を調べて(hspiceの場合sf_rdhdr_hspice)呼び出す。
- sf_rdhdr_hspice
- 先頭がコントロールコードならバイナリーとして読む。
- sf_rdhdr_hsbin
- バイナリー形式のhspiceヘッダーを読む。
- sf_readrowにsf_readrow_hsbinをセットする。
- まず"$&%#"が出てくるまで読む。その後バージョンをチェックして
- sf_read block_hsbin
- hhブロックとahdrブロックを読む。
- 実際に読んだバイト数を戻り値になる。
- bufsizeはbufに入ったバイト数(読んだ数より大きくなることがある)。
- hs_process_header
- ahdr+256の位置からhstypeを読んで次にivar,dvar,svarの名前を読む。
- SpiceStreamを生成する。
- ss_new
- SpiceStreamの生成(filename,ndv,nsweepparamを設定する)。
- parse_field_numbers
- parse_field_names
- ascii_header_output
- ヘッダー部分の表示。
- ss_var_name
- バッファにvarの名前を戻す。
- ascii_data_output
- 1行分のデータを表示する。
- ss_readrow
- 1行分読む。(sf->readrowに入っているコマンドを実行する。
- asciiデータの場合はsf_readrow_hsascii
- 、バイナリデータの場合はsf_readrow_hsbinを実行。)
- sf_readrow_hsbin(バイナリ形式のhsデータを一行だけ読む。)
- ivarとdvarを読む。ivar>=1.0e29ならば終わり。
- sf_readsweep_hsbin
- sf_getval_hsbin(バイナリ形式のhsデータを一個だけ読む。)
- sf->read_valsを1つ増やす.
- sf_getval_hsbin(バイナリ形式のhsデータを一個だけ読む。)
- sf->read_valsを1つ増やす.
- sweepparamについては評価データで無効になっているので解析されていない。
- ivar(iはindependenceで独立の意味)→独立変数(他のことに影響されない)
- dvarが変化することによってivarも変化する。
[top]
- hs_block header
- h1 (4byte) →4になる(0x4000000の場合はリトルエンディアン)
- h2 (4byte)
- h3 (4byte) →4になる(0x4000000の場合はリトルエンディアン)
- block_nbytes (4byte) →ahdrのbyte数
- リトルエンディアン→小さな桁から書き出していく。4321とあったらそれは1234(千二百三十四)。
- ビッグエンディアン→大きな桁から書き出す。4321とあったらそれは4321(四千三百二十一)こちらが一般に生活の中で使用されている。
- ahdr(asciiheader)
- naut (4byte)→ivar+dvarの数
- nprobe (4byte)→proveの数?(不明)
- nsweepparam (4byte)→sweepさせるパラメータの数。
- ???? (4byte)
- Postformatversion (4byte)
- ???? (156byte)
- ntable? (80byte)
- ivar_type(ASCII数値、空白orTABorCR区切り)
- dvar(ndv)_type*ndv (ndv=nauto-1+nprove)(ASCII数値、空白orTABorCR区切り)
- ivar_name(ASCII文字列、空白orTABorCR区切り)(16byte?)
- dvar(ndv)_name(ASCII文字列、空白orTABorCR区切り)(16byte?)
- spar(nsweepparam)_name(ASCII文字列、空白orTABorCR区切り)(16byte?)
- "$&%#"+空白4つ(8byte)
- trailer (4byte) →ahdrのbyte数(block_nbytesと同じ)
- hs_block header
- h1 (4byte) →4になる(0x4000000の場合はリトルエンディアン)
- h2 (4byte)
- h3 (4byte) →4になる(0x4000000の場合はリトルエンディアン)
- block_nbytes (4byte) →ahdrのbyte数(sf->expected_valsに入れる。)
- data (block_nbytes byte)
- pvar (4byte) sweepパラメータの値。sweepしない時は無い。
- ivar (4byte) ivarとdvarはデータ数の分だけ繰り返す。
- dvar(ncols) (4byte*ncols)
- trailer (4byte) →ahdrのbyte数(block_nbytesと同じ)
- SpiceStreamとはsp2spのプログラム内でのSpiceのデータを読み込んだもの
struct _SpiceStream {
char *filename;
int filetype;
int ndv; /* number of dependent variables */
int ncols; /* number of columns of data readrow will fill in */
SpiceVar *ivar; /* ptr to independent-variable info */
SpiceVar *dvar; /* ptr to array of dependent variable info */
SpiceVar *spar; /* ptr to array of sweep parameter info */
SSReadRow readrow; /* func to read one row of data points */
SSReadSweep readsweep; /* func to read one row of data points */
int ntables; /* number of data tables in the file */
int nsweepparam; /* number of sweep parameter values at the start of each table */
/* the following stuff is for private use of reader routines */
FILE *fp;
int flags;
int lineno;
char *linebuf;
int line_length;
int lbufsize;
int expected_vals;
int read_vals;
int read_rows;
int read_tables;
int read_sweepparam;
char *linep;
};
[top]
- ① バイナリデータかアスキーデータかをみわける。
- 先頭がバイナリコードならバイナリデータ、アスキーコードならアスキーデータ。
- ② エンディアンを調べる。
- sf_readblock_hsbinからhhを読む。
- h1とh3が0x04000000ならリトルエンディアン、
- ③ block_nbyteの数だけahdrを読む。
- trailerとblock_nbytesの値が同じかを確認。
- "$&%#"が無ければ3番を繰り返す。(hhとahdrが複数あるものがある?)
- ④ 各パラメータの数を読む。
- nauto、nprove、nsweepparamを読む。
- nauto=データの数(ivar+dvar)。
- nprove=?の数。(何の数かは不明)
- nsweepparam=sweepパラメータの数。
- ⑤ フォーマットのバージョンをチェック。
- ahdr+16にあるフォーマットを読む。これが9007か9601であることを確認。
- ⑥ データタイプをもとめる。(nautoの数だけ繰り返す)
- ahdr+256を読む。hstypeにivarとdvarのデータタイプが書いてあるので読む。
- ivar type 1 = TIME 2 = FREQUNCY 3 = VOLTAGE
- dvar type 1・2 = VOLTAGE 8・15・22 =CURRENT
- ivar typeがFREQUENCYでdvarの数がnauto-1より小さい場合は
- ⑦ ivar、dvar、sweepparamの名前を読む。
- nauto+nprove+nsweepparamの数だけ読む。
- ivar=TIME、dvar=0、a、vdd、x、I(vdd)、I(vin1)
- nsweepparam=TEMPERATURE(今回の名前。その時々によって変化。)
- ⑧ バイナリデータかアスキーデータかをみわける。(1と同じ)
- 先頭がバイナリコードならバイナリデータ、アスキーコードならアスキーデータ。
- ⑨ エンディアンを調べる。(2と同じ)
- sf_readblock_hsbinからhhを読む。
- h1とh3が0x04000000ならリトルエンディアン
- ⑩ block_nbyteの数だけデータブロックを読む。
- sweepパラメータの値を読む。(データブロックの一番最初)
- trailerとblock_nbytesの値が同じかを確認。
- nautoの数(7つ)分ずつ繰り返してデータを読む。
- ⑪ sweepした分データブロックがあるのでデータのファイルが終わるまで⑧,⑨,⑩を繰り返す。
- データブロックの個数は読み終わらないとわからない。
[top]
データ名 | 値 | 意味 |
ivar_type | 1 | TIME |
| 2 | FREQUENCY |
| 3 | VOLTAGE |
| | |
ivar_col | 0 | 何カラム目かを示す(最初のカラムが0) |
| | |
ivar_ncols | 1 | ? |
| | |
ncols | 1 | データの列数(独立変数含む) |
| | |
ntables | 1 | データブロックの数 |
| | |
dvar(ndv)_type | 1,2 | VOLTAGE |
| 8,15,22 | CURRENT |
| | |
dvar(ndv)_col | 1 | 何カラム目かを示す(最初のカラムが0) |
| | |
dvar(ndv)_ncols | 1 | ? |
| 2 | ivar_type=FREQでn |
| | |
ivar_name | 16byte | 独立変数の名前 |
| | |
dvar(ndv)_name | 1 | 独立変数が変化した場合のデータ名 |
| | |
spar(nsweepparam)_name | 1 | sweepパラメータの名前 |
| | |
| | |
expected_vals | 1 | データの数 |
| | |
read_vals | 0 | ?現在何個目のデータを読んでいるか |
| | |
ivar | 0 | データを得るための変数の値 |
| | |
dvar | 0 | データの値 |
| | |
nsel | ? | ? |
| | |
outfiletype | cazm | ascii形式でcazmヘッダをつける |
| ascii | ascii形式でヘッダも出力(デフォルト) |
| nohead | ascii形式でデータのみ出力 |
| none | 何も出力しない |
| | |
out_indices | ? | 出力データを示す? |
| | |
outi_size | ? | ? |
| | |
fieldnamelist | ? | ? |
| | |
fieldnumlist | ? | ? |
[top]
[Homeに戻る]