MOSFETにAD, AS, PD, PSを付加する

研究室に残してきたノウハウ(2006-09-24)より転記.


シミュレーションする際,MOSFETにL, Wのみではなく,周辺長等のAD, AS, PD, PSのパラメータを追加しないと,正確なシミュレーションができない.しかし,実際はAD, AS, PD, PSのパラメータを計算し,手入力するのは大変である.

そこで,以前から使用していた,add-spice-adas-pdps.rbスクリプトを修正して,add-ltspice-adas-pdps.rbを作成した(本エントリ最後: add-ltspice-adas-pdps.rb).以下のコマンドで,MOSFETのL, WからAD, AS, PD, PSを追加することができる.

ruby add-ltspice-adas-pdps.rb hoge.asc > moge.asc

なお,スクリプト中には,lambdaを指定する必要がある.現在は,TSMC 0.18umプロセス用にlambda=0.1としてあるのに注意.

また,LTSpice上でサブサーキットを利用している場合は,サブサーキットの方にもAD, AS, PD, PSを付加しなくてはならないのに注意.


以下,add-ltspice-adas-pdps.rb

#!/usr/bin/env ruby
#!/opt/local/bin/ruby

#                作成 in 2003-11-29
#                修正 in 2003-07-16
#   LTSpice向けに修正 in 2006-09-23
# 使い方   : add-adas-pdps.rb hoge.sp > xxx.sp
# 結果     : W,L から AD,AS,PD,PS を計算して結果を挿入
# 対応書式 : M2 Y A VDD! VDD!  P  L=400E-9 W=1.9E-6 
#            M2 Y A VDD! VDD!  P  L=0.4u W=1.9u

# 0.1は,TSMC 0.18umの場合
lambda = 0.1

# W,L の値を入れる変数(小数)と計算パラメータ
p_w = 0.0; p_l = 0.0; p_adas = 0.0; p_pdps = 0.0;

lines = ARGF.readlines
lines.each do |x|
  flag_w = 0; flag_l = 0
  if /[Ww]\=([0-9]+(?:\.[0-9]+)?)(u|([eE]-[0-9]))/ =~ x then
    # W=0.4u または W=400E-9 にマッチ
    p_w = $1.to_f; flag_w = 1
    p_w = p_w * 0.001 if /[eE]-9/ =~ $2 # E-9 の場合は 0.001 をかける
  end
  if /[Ll]\=([0-9]+(?:\.[0-9]+)?)(u|([eE]-[0-9]))/ =~ x then
    # W=0.4u または W=400E-9 にマッチ
    p_l = $1.to_f; flag_l = 1
    p_l = p_l * 0.001 if /[eE]-9/ =~ $2 # E-9 の場合は 0.001 をかける
  end
  p_adas = p_w * 6*lambda         # AD=AS=W*6*lambda    
  p_pdps = 2 * (p_w + 6*lambda)   # PD=PS=2*(W+6*lambda)  see study note M1.5
  if flag_w==1 and flag_l==1 then
    x = x.chomp + " ad=#{p_adas}e-12 as=#{p_adas}e-12 pd=#{p_pdps}e-6 ps=#{p_pdps}e-6"
    puts x
  else
    print x
  end
end
>