Post date: 2012/08/27 10:37:26
シミュレータの結果処理をRubyで行うために、ASCOとRubyをリンクしました。変更したファイルは、ASCOの本体であるasco.cと、初期処理を行う、initialize.cおよびシミュレータの起動と結果処理を行うerrfunc.cの3つです。変更したファイルほか一式を添付します。
変更したファイル
rasco.c --- Rubyの初期化を行う
initialize_with_ruby.c --- cfgファイルからRubyで記述したポストスクリプト用のスクリプトを抽出する
errfunc_with_ruby.c --- シミュレーション実行後にRubyで記述したスクリプトを実行し、得られたパフォーマンスをC言語の構造体にセットする
ascoでは、errfunc.cの中から、auxfunc_measurefromlis.cに定義されたProcessOutputFileを呼び出し、その中でパフォーマンスの計算を行なっています。パフォーマンスは、extract以下にパフォーマンスごとに取得方法が別々に記述されています。.measureステートメントだけでなく、シミュレータのログファイルに出力されるトランジスタの動作点情報などのどう取り出して、どういう計算をするかを逆ポーランド記法で記述したりしてます。
これらは、RASCOでは一切不要なので(それまでわからず悪戦苦闘した記録はauxfunc_measure_with_ruby.cに残ってます)、errfunc_with_ruby.cの中で、WriteToMemのかわりにmeasure_with_rubyを定義し、errfuncから直接呼び出しています。
【Rubyとのリンク】
Rubyとリンクするためには、まずRuby単体をソースからコンパイルします(Windows MingwでRubyコンパイルにまとめています)。次に、Makefile.win32を使って make -f Makefile.win32 rasco するだけです。Windowsでのコンパイル環境には、MinGWを使用しました。LinuxでのコンパイルはMakefileを使ってください。
【スクリプトの例】
extract_script.rbは、シミュレータの結果からパフォーマンスを取り出す例です。パフォーマンスを取り出すスクリプトは自分で作成する必要があります。スクリプトをcfgファイルの# Post Processing #以下に記述すると、@scriptに代入されます。
以下はスクリプトの例です。
# Post Processing #
#
vdd, i_vdd=@ltspice.get_dc 'V(vdd)', 'I(Vdd)'
@ac_power0 = (vdd.to_f * i_vdd.to_f).abs
#log "@ac_power=#{@ac_power}"
wave=@ltspice.save 'ac.csv', 'ac', 'frequency', 'V(vout)', 'V(vin-)'
freq =wave.col_vec(0)
vout = wave.col_vec(1)
voutp = wave.col_vec(2)
vin = wave.col_vec(3)
vinp = wave.col_vec(4)
vout_vin = vout.minus vin
voutp_vinp = voutp.minus vinp
@unity_gain_frequency = freq.where(vout_vin, 0, true) || 1000
@unity_gain_frequency_max = @unity_gain_frequency
@amp3_slew_rate= @unity_gain_frequency.to_f*3.1415926
@phase_margin = (voutp_vinp.where(freq, @unity_gain_frequency, true) || 0)