2012年10月23日火曜日

HSPICEの出力桁の制御(.option measdgt/numdgt)

HSPICEは標準出力(.lis)および..MEASUREの出力ファイル(.ma0,.mt0,.ms0等)に測定結果を書き込むが,デフォルトの出力桁は4桁でしかない.出力桁数を変えるには,MEASDGTオプションおよびNUMDGTオプションを使う.
MEASDGTオプションは.MEASUREの出力ファイルへの出力桁数を指定し,NUMDGTオプションは標準出力への出力桁数を指定する.

.option measdgt=value
.option numdgt=value


valueのところに桁数を指定する事で,出力桁を制御する.なお,最大値は10である.

2012年10月19日金曜日

HSPICEのライセンス数を知る

最近のHSPICEは-mpオプション(マルチプロセッサ),-mtオプション(マルチスレッド)等があり,うまく制御できれば計算速度を飛躍的に向上させることができる.一方でこれらの高速化機能を使うとモリモリライセンスを占有してしまう欠点がある.特にVDECのCADを使わせてもらっているところでは,むやみにライセンスを占有すると他の利用者に迷惑になる可能性が高い.

従って,今存在しているFloating License数を知る事ができれば,ある程度並列化しても良い規模を見積もることができる.

HSPICEでシミュレーションを実行すればライセンス数はわかるが,毎回C-cで止めるのはおっくうである.この場合,HSPICEをインタラクティブモードで起動させることで,HSPICEのライセンスを知ることができる.

hspice -I

インタラクティブモードで起動することで,1ライセンスを取り,次の入力待ちとなる.なおquitでHSPICEを終了する.

% hspice -I  
lic:
lic: FLEXlm: v10.8
lic: USER: xxxxxxxxxx HOSTNAME: xxxxxxxxxx
lic: HOSTID: xxxxxxxxxx PID: 2426
lic: Using FLEXlm license file:
lic: 
lic: Checkout 1 hspice
lic: License/Maintenance for hspice will expire on 01-may-2013/2011.09
lic: 37(in_use)/xxx(total) FLOATING license(s) on SERVER 
lic:
Hspice license have checked out
HSPICE >quit

lic: Release hspice token(s)

%

もう少しエレガントにできればいいのだが,まあこれで満足(でもC-cと大して変わらないかも).

2012年10月18日木曜日

HSPICEの出力フォーマットを変える(.option measform)

HSPICEの出力結果は,デフォルトで見やすいものではなく,またgnuplotやExcel
等の加工に向かない.
いままではスクリプトを使って加工していたが,実はHSPICEのオプションで制御できる.

.option measform=value

valueは0から3の数字で,それぞれ
0: default
1: スペース区切り
2: HSIM互換
3: csv (.m*は作らない)
となる.
以下に,それぞれのオプションの出力結果を示す.

(1) .option measform=0
% cat nmos_TT.ms0
$DATA1 SOURCE='HSPICE' VERSION='E-2010.12 32-BIT'
.TITLE '*ring oscillator'
 index    _vdd             iload              ipower              
          temper           alter#          
 1         1.000000e-01     3.992798e-10     1.215245e-08   
           2.500000e+01    1               
 2         2.000000e-01     5.940276e-09     1.756581e-07   
           2.500000e+01    1               
 3         3.000000e-01     7.720563e-08     2.095723e-06   
           2.500000e+01    1               
 4         4.000000e-01     7.989804e-07     1.771483e-05   
           2.500000e+01    1               

(2) .option measform=1
% cat nmos_TT.ms0
$DATA1 SOURCE='HSPICE' VERSION='E-2010.12 32-BIT'
$OPTION MEASFORM=1
.TITLE '*ring oscillator'
index _vdd iload ipower temper alter#
1  1.000000e-01  3.992798e-10  1.215245e-08  2.500000e+01 1
2  2.000000e-01  5.940276e-09  1.756581e-07  2.500000e+01 1
3  3.000000e-01  7.720563e-08  2.095723e-06  2.500000e+01 1
4  4.000000e-01  7.989804e-07  1.771483e-05  2.500000e+01 1


(3) .option measform=2
% cat nmos_TT.ms0
$DATA1 SOURCE='HSPICE' VERSION='E-2010.12 32-BIT'
$OPTION MEASFORM=2
.TITLE '*ring oscillator'
index =  1.000000e+00 
_vdd =  1.000000e-01 
iload =  3.992798e-10 
ipower =  1.215245e-08 
temper =  2.500000e+01 
alter# =  1.000000e+00 

index =  2.000000e+00 
_vdd =  2.000000e-01 
iload =  5.940276e-09 
ipower =  1.756581e-07 
temper =  2.500000e+01 
alter# =  1.000000e+00 

index =  3.000000e+00 
_vdd =  3.000000e-01 
iload =  7.720563e-08 
ipower =  2.095723e-06 
temper =  2.500000e+01 
alter# =  1.000000e+00 

index =  4.000000e+00 
_vdd =  4.000000e-01 
iload =  7.989804e-07 
ipower =  1.771483e-05 
temper =  2.500000e+01 
alter# =  1.000000e+00 



(4) .option measform=3
% cat nmos_TT.ms0.csv
$DATA1 SOURCE='HSPICE' VERSION='E-2010.12 32-BIT'
.TITLE '*ring oscillator'
index,_vdd,iload,ipower,temper,alter#
1, 1.000000e-01, 3.992798e-10, 1.215245e-08, 2.500000e+01,1
2, 2.000000e-01, 5.940276e-09, 1.756581e-07, 2.500000e+01,1
3, 3.000000e-01, 7.720563e-08, 2.095723e-06, 2.500000e+01,1
4, 4.000000e-01, 7.989804e-07, 1.771483e-05, 2.500000e+01,1


個人的には,.option measform=1にするのがお薦め.

2012年7月8日日曜日

dynabook SS RX2のCPUファンを換装する

dynabook RX2 TJ140Hを買って3年.今年の冬にHDDを投げ捨ててSSDにしたこともあり快適なのだが,古いSSD(Kingston V100S2/256GB)が理由なのか妙に熱い.


最近はWindowsMediaPlayerで音楽聞きながら書類書きという軽作業でもCPUが100%に張り付き,温度は65度に張り付き,動作がのろのろと遅くなる.またキーボードもパームレストもあっちっちで.CPUから廃熱もすっごく熱い空気がちょろちょろとしか出てこない.CPUファンがダメになってしまったようだ.


そこで,出張ついでにCPUファンを買ってきた.お店はもちろん,東芝ファンの聖地,信頼とサービスのチチブデンキである.「dynabook SS RX2用のCPUファンありますか?」と聞いたら0.1ぐらいのディレイで出てきて笑ってしまった.それだけみんな買い換えているのだろうか.


1個3150円です.念のため2個買っておいた.


買ったブツ.GDM61000413という部品らしい.


帰宅し,さっそく愛機を解体して,CUPファンを取り出す.


こいつがCPUファン.



買ったもの.


取り外したもの.型番は同じだけれど,スタンプされた記号も,シールのフォントも異なる.ロットが異なるのだろう.

CPUに着いている硬化したグリスを拭き取り,新たにグリスを塗り,新しいファンに交換.電源を入れると
「ブオン!」
とファンの音が.そういえばこいつ,起動時にファンが一瞬全力で動作するんだっけ.完全に忘れていたwww


ファンを交換したことで,負荷をかけても媒体が熱くなることもなく,動作もサクサクである.おそらく以前はCPUの温度が制限値に達したためにNOPをボンボン入れてたので遅くなっていたのだろう.ファンの横に位置するSSDの温度も下がった!RX2は,あと10年は戦える!

あなたの愛機,CPUファンはちゃんと動いていますか?

2012年5月24日木曜日

gnuplotのプロット結果をzsh関数を使ってファイルに書き出す

測定結果をgnuplotでプロットする事が多いと思いますが,あとで微修正しようとして「ああ,どういう条件でプロットしたか忘れた!」と言うこと,よくありますよね.私は一つの図に対して一つのgnuplotのコマンドファイルを用意するようにしているのですが,saveコマンドでは余計な変数定義が大量に挿入されること,replotがすべてplotに結合されてしまう事から,

(1) gnuplotに打ち込んだコマンドをヤンク

(2) テキストエディタにコピー

(3) gnuplotのターミナル等を手動で消す

という作業をしていました.
zed等を使っていたのですが,もっと効率的に作業できないかと思い,zshの関数zed-plt()を作ったので公開してみる.~/.zshrcに書き込むだけ!


function zed-plt () {
local zed_file_name
zed_file_name=$1
echo "usage: C-xC-w:save C-c:cancel"
zed $zed_file_name
if [[ -f $zed_file_name ]] then
sed -e "s/gnuplot> //g;/Terminal type set to/D;/Options are/D" $zed_file_name > tmpfile.plt
mv tmpfile.plt $zed_file_name
fi
return 0
}


使い方は
% zed-plt "filename.plt"
でまずzedが開くので,ここにgnuplotに打ち込んだコマンドをコピー&ペースト
その後C-x,C-wでzedをセーブすると,sedで不要な文字列を削除という流れ.

% zed-plt hoge.plt
usage: C-xC-w:save C-c:cancel
gnuplot> plot "Sec4-VCCS-Current.txt" w lp
gnuplot> set yrange [0:200]
gnuplot> set size 0.7,0.7
gnuplot> replot
gnuplot> set terminal tgif 24
Terminal type set to 'tgif'
Options are 'portrait [1,1] color linewidth 1.000000 dashed "Helvetica" 24'
gnuplot> set output "Sec4-VCCS-Current.obj"
gnuplot> replot
gnuplot> exit
% cat hoge.plt
plot "Sec4-VCCS-Current.txt" w lp
set yrange [0:200]
set size 0.7,0.7
replot
set terminal tgif 24
set output "Sec4-VCCS-Current.obj"
replot
exit


お手軽にコマンドをセーブできるようになって上機嫌!

2012年4月19日木曜日

AnalogArtistでレイヤの表示/非表示を一発で切り替える.

研究が進まない時に限って,研究以外の仕事に手が向いてしまう. AnalogArtistでレイアウトを書いていると,LSWで頻繁にレイヤの表示/非表示を切り替える必要がある. 近年のプロセスは配線層が多層なので,たとえば12層配線あるとメタルとVIAを消すのに23回もクリックしないといけない.これはあまりに非生産的. これを解決するために,簡単なプログラムを書いてみた. 図を見れば一発でわかると思うが,念のため説明すると上から順に [1] 全レイヤーの非表示 [2] Diffusion,Poly,I.I+,コンタクト,M1の表示 [3] M1からM3まで表示 [4] M4からM6まで表示 [5] Semi-Global1からSemi-Global3まで表示 [6] Global1からGlobal2まで表示 [7] コメントレイヤの表示(未実装) [8] 全レイヤーの表示 である. プログラムは以下の通りである.単にleSetLayerVisibleコマンドでレイヤの表示/非表示を切り替えているだけである.
;;
;; layerselect.il 2012/04/19
;; 
;; version: 0.1
;;
;; Description:
;;  (1)  adds "VisibleLayer" menu in toolbar of Layout and Layout-XL
;;  (2)  set some shortcut keys to change the visibility of design layers.
;;        [1]  ALL Inisible
;;        [2]  Diff-Poly-M1 Visible
;;        [3]  M1-M3 Visible
;;        [4]  M4-M6 Visible
;;        [5]  SG1-SG3 Visible
;;        [6]  G1-G2 Visible
;;        [7]  ALL Comments Visible (not implemented)
;;        [8]  ALL Visible
;;
;; Usage:
;;  [.cdsinit]
;;   (load "layerselect.il")
;;   (deRegUserTriggers "schematic" nil nil 'LayerAddMenusTrigger)
;;   (deRegUserTriggers "maskLayout" nil nil 'LayerAddMenusTrigger)
;;   (deRegUserTriggers "maskLayoutXL" nil 'nil LayerAddMenusTrigger)


(procedure
 LayerCreatePullDownMenu()
 (let
  (item001 item002 item003 item004 item005 item006 item007 item008 menuItems)
  
  item001 = (hiCreateMenuItem
             ?name 'item001
             ?itemText "ALL Invisible"
             ?callback "setLayerVisible( 1 )"
                       )
  
  item002 = (hiCreateMenuItem
             ?name 'item002
             ?itemText "Diff-Poly-M1 Visible"
             ?callback "setLayerVisible( 2 )"
             )

  item003 = (hiCreateMenuItem
             ?name 'item003
             ?itemText "M1-M3 Visible"
             ?callback "setLayerVisible( 3 )"
             )
  
  item004 = (hiCreateMenuItem
             ?name 'item004
             ?itemText "M4-M6 Visible"
             ?callback "setLayerVisible( 4 )"
             )
  
  item005 = (hiCreateMenuItem
             ?name 'item005
             ?itemText "SG1-SG3 Visible"
             ?callback "setLayerVisible( 5 )"
                       )
  
  item006 = (hiCreateMenuItem
             ?name 'item006
             ?itemText "G1-PM1 Visible"
             ?callback "setLayerVisible( 6 )"
             )

  item007 = (hiCreateMenuItem
             ?name 'item007
             ?itemText "ALL Comments Visible"
             ?callback "setLayerVisible( 7 )"
             )
  
  item008 = (hiCreateMenuItem
             ?name 'item008
             ?itemText "ALL Visible"
             ?callback "setLayerVisible( 8 )"
             )
  
  menuItems = (list
               item001
               item002
               item003
               item004
               item005
               item006
               item007
               item008
               )
  
  (hiCreatePulldownMenu
   'trLayerPulldownMenu               ; menu handle
   "VisibleLayer"                        ; menu title
   menuItems
   )
  )                           ; end let
 )                               ; end procedure createLayerPullDownMenu

;;==========================================
;;
;;==========================================
(procedure
 LayerAddMenus()
 (let
     (newMenu)
   
   newMenu = (LayerCreatePullDownMenu )
   (hiInsertBannerMenu
    getCurrentWindow()
    'newMenu
    hiGetNumMenus(getCurrentWindow())
    )
   ) ; let
 ) ; procedure

;;==========================================
;;
;;==========================================
(procedure
 LayerAddMenusTrigger(args)
 (let
     (newMenu)
   newMenu = ( LayerAddMenus )
   (list newMenu)
   )
)
;;==========================================
;;==========================================
(procedure setLayerVisible(value)
 (let
     (winID)
   
    (case value
        (1 
       leSetAllLayerVisible( nil ) )
        (2 
             leSetLayerVisible(list("df" "sd") t ) 
             leSetLayerVisible(list("pii" "sd") t ) 
             leSetLayerVisible(list("nii" "sd") t ) 
             leSetLayerVisible(list("ndii" "sd") t ) 
             leSetLayerVisible(list("p" "sd") t ) 
             leSetLayerVisible(list("vaa" "sd") t ) 
             leSetLayerVisible(list("maa" "sd") t ) 
        )
        (3 
             leSetLayerVisible(list("maa" "sd") t ) 
             leSetLayerVisible(list("vab" "sd") t ) 
             leSetLayerVisible(list("mab" "sd") t ) 
             leSetLayerVisible(list("vac" "sd") t ) 
             leSetLayerVisible(list("mac" "sd") t ) 
        )
        (4 
             leSetLayerVisible(list("vad" "sd") t ) 
             leSetLayerVisible(list("mad" "sd") t ) 
             leSetLayerVisible(list("vae" "sd") t ) 
             leSetLayerVisible(list("mae" "sd") t ) 
             leSetLayerVisible(list("vaf" "sd") t ) 
             leSetLayerVisible(list("maf" "sd") t ) 
        )
        (5 
             leSetLayerVisible(list("vba" "sd") t ) 
             leSetLayerVisible(list("mba" "sd") t ) 
             leSetLayerVisible(list("vbb" "sd") t ) 
             leSetLayerVisible(list("mbb" "sd") t ) 
             leSetLayerVisible(list("vbc" "sd") t ) 
             leSetLayerVisible(list("mbc" "sd") t ) 
        )
        (6 
             leSetLayerVisible(list("vca" "sd") t ) 
             leSetLayerVisible(list("mca" "sd") t ) 
             leSetLayerVisible(list("vcb" "sd") t ) 
             leSetLayerVisible(list("mcb" "sd") t ) 
        )
        (8 leSetAllLayerVisible( t ) )
    ); case

   
   ); let
 ); procedure setLayerVisible

;;==========================================
;;==========================================

「どこかで見覚えがあるぞ」と思った方はご明察.元ネタは吉原研Wikiグリッド変更SKILLである.このSKILL自体もバグがあるので,修正する必要がある. 吉原研のWikiは必読である.大変勉強になる.ただし「NDA的に大丈夫なのかしら」と思ってしまう事も事実だが... NDAを恐れない吉原研のアグレッシブさに負けないように,本Blogも積極的に技術情報を提示できるよう頑張りたいものである.

2012年2月21日火曜日

配線負荷モデル

配線負荷モデルってなんですの?ということで調べてみた.

配線負荷モデル(Wire Loading Model)とは,DesignCompiler等で論理合成する際に,ゲート間の配線に寄生する容量,抵抗等を論理合成ツールに考慮させるためのパラメータである.

実際の回路ではゲート内のRC以外にも,ゲート間の配線に寄生する容量(C)や抵抗(R)が存在する.これらのパラメータは配線長,およびファンアウト(次段につながるゲート数)に依存して変動する.
一方論理合成する際は正確な配線長はわからない.正確な寄生容量/抵抗を知るためにはレイアウトを行う必要がある.そのため過去に設計したレイアウトから回路の面積やファンアウトに対する寄生容量/抵抗の値を統計的に抽出し,この統計情報を利用して論理合成した回路内の配線の寄生容量/抵抗を考慮する.

セルのキャラクタライズを行った後のデータベース(.lib)がファブから提供されている場合,配線負荷モデルの値は.libファイルに書かれている.配線負荷モデルの一例を挙げると以下のようになる.

wire_load hoge_area200 {
resistance : 0 ;
capacitance : 1 ;
area : 0 ;
slope : 10e-10;
fanout_length: 1.0 10e-4 ;
fanout_length: 2.0 20e-4 ;
fanout_length: 4.0 40e-4 ;
}

"hoge_area200"は配線負荷モデルの名前を示す.後述するが配線負荷モデルは回路面積(想定される配線長)に応じて使い分けることができる.
"area"は配線が占める面積,"capacitance"は単位配線長あたりの容量,"resistance"は単位配線長あたりの抵抗,"slope"はファンアウト数あたりの波形の傾きである.fanout_lengthはファンアウト数に対する配線資源を示す.


配線負荷モデルの選択は

wire_load_selection Libname {
wire_load_from_area : 0.00 200 hoge_area200 ;
wire_load_from_area : 200.50 400 hoge_area400 ;
wire_load_from_area : 400.50 800 hoge_area800 ;
}

の様にかける.ここで"wire_load_selection"内の"wire_load_from_area"の値,つまり回路面積に応じて対応する"wire_load"に分岐する事ができる.

今回は回路面積に対する配線負荷モデルを示したが,たとえば消費電力の最悪値を見積もるために,別の配線負荷モデルを使い分ける事もできるようだ.

2011年12月6日火曜日

IC Compilerの最適化を防ぐ方法

ジョン      「クソッ!このファッ○ンIC Compiler!!!1!」
ダニエエエエエエル「どうしたんだい,ジョン?」
ジ「IC Compilerがバッファーを勝手に消すんだよ.いったい何考えているんだこの○×■※!」
ダ「ハハッ,IC Compilerはタイミング制約を満たしていると判断して消しているんだね.」
ジ「そうかもしれないけれど,P&Rツールなんだから最適化なんてせずに配置配線だけしてくれたらいいのに.」
ダ「ジョン,もしかしてplace_optをしていないかい?そんなときはcreate_placementして,legalize_placementすれば一発さ!これで手書きのネットリストも自動配置してくれるぞ!」
ジ「まあダニエル!素敵!愛してるわ!」

むやみに"place_opt"コマンドを使うのは止めましょう,というのが今日のお話.
"place_opt"コマンドを手書きのネットリストに対して実行すると,セルのタイミング情報を読みに行き,バッファ等を最適化して消してしまう場合があります.たとえばバッファリングするだけのマクロを作る場合,"place_opt"を実行するとバッファはすべて消されます.その場合,"place_opt"ではなく,"create_placement"と"legalize_placement"を利用する事で,セルの配置,およびアラインメントをしてくれます.

実際にバッファマクロに対してフロアプランを作り,



"create_placement"をしてみる.



セルがフロアプランに配置されます.
セル同士が重なっているので,"legalize_placement"でアラインメントします.



重なりが取れました.
あとは電源レール,ストラップを張り,配線したら終了です.

むやみに最適化コマンドを使わないようにしましょう.配線の最適化を行う"route_opt"も危険です.


IC Compilerはネタはあるけれど,NDAに引っかかりそうなのが残念なところ.

2011年9月16日金曜日

VMwareで簡易インストールを使わない

VMwareでOSをインストールする際に,対応OSでは簡易インストールという機能を使えます.
OSインストール時の諸設定を自動で行ってくれる便利機能です.VMware-toolsも自動でインストールされます.

しかしCentOS 5.5のインストール時に簡易設定を利用すると,
HDDのパーティション割り振りや,パッケージの選択等をすべて自動で行ってしまいます.これは不便.簡易インストールではなく,自分で好みのパッケージを入れたい!




通常のインストールを行うには,新規仮想マシン作成時に"あとでOSをインストール"を選択します.


仮想マシンを作成後,"仮想マシン設定の編集"からCD-ROMの設定画面へ移動し,マウントするISOイメージを指定します.

この状態で仮想マシンを再生すると,ISOイメージを読み込み,通常インストールが始まります.これで思い通りのパッケージを入れることが可能になります.

最後にVMware-toolsをインストールすることを忘れずに!

2011年9月15日木曜日

VMwareのCtrl+Altを変える

VMwareでは,ゲストOSからホストOSへフォーカスを変えるときにCtrl+Altを押しますが,このショートカットに関してちょっと困った話.


XFce利用時に,私はよくたくさんのTerminalをたくさんのワークスペースにまたがって開きます.
TerminalのタブはCtrl+PageDown,Ctrl+PageUpで遷移し,ワークスペース自体はCtrl+Alt+矢印で遷移します(ノートPCなので,PageDown/PageUpはFN+矢印です).こうするとキーボードショートカットでスパスパ遷移できて快適です.

しかし,VMwareではCtrl+Altは予約されているので,ショートカットが使えない.いちいちマウスでワークスペース指定するのは面倒だ.これはこまった.

調べてみると,preferences.iniを修正することでキーボードショートカットを変えることができるらしい.

参考:VMware Playerのhotkey(Ctrl + Alt)を変更する

preferences.iniは
C:\Documents and Settings\[ユーザー名]\Application Data\VMware\preferences.ini
のディレクトリにありました.

このBlog主と同様に

pref.hotkey.shift = "true"
pref.hotkey.control = "true"
pref.hotkey.alt = "true"


と書き足す事で,ショートカットがCtrl+Shift+Altになりました.

うーん,便利!