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になりました.

うーん,便利!

2011年6月3日金曜日

The Difference Between Parasitic Data Formats SPF, DSPF, RSPF, SPEF, and SBPF

寄生RCデータのフォーマットの違いについて混乱してきたので記事を起こしてみる.
他人任せに英語のテキストを直訳しただけだったり(ぉ

取り扱うのはSPF,DSPF,RSPF,SPEF,SBPFで,それぞれ

SPF -- Standard Parasitic Format

DSPF -- Detailed Standard Parasitic Format

RSPF -- Reduced Standard Parasitic Format

SPEF -- Standard Parasitic Exchange Format

SBPF -- Synopsys Binary Parasitic Format

の略称です.

SPFはCadence Design Systemsがネットリストの寄生RCの標準フォーマットとして定義している物です.後で述べるDSPFとRSPFはSPFで表現されるネットリストの一形式です.SPF自身は一般的な寄生RCを表現するときに使われます.一方DSPFとRSPFは寄生RCをRCのネットワークで表現します.

RSPFは各信号配線をパイ型のRCモデルで表現します.等価抵抗を中心に,等価容量で挟む形でRCモデルを表現します.ノードの数には依存せず,各信号配線がそれぞれのパイ型のネットワークを持ちます.さらに,RSPFを用いることでPrimeTimeによる各ノード間の配線遅延のElmore遅延を計算する事ができます.

一方でDSPFは各信号配線の詳細な寄生RCを表現します.従ってRSPFよりも精度は高いですが,ファイルサイズが大きくなります.またDSPFにはカップリングキャパシタの定義がありません.他のフォーマットに比べ,DSPFはSPICEのネットリストと最も近いフォーマットとなります.

SPEFはOpen Verilog Initiative(OVI,現在はIEEEにて標準化)における寄生RCのフォーマットです.SPEFはSPFとほぼ同じ構造をもっています.SPF同様に抵抗とキャパシタによる寄生素子があり,詳細な寄生RCネットワークもしくはパイ型モデルによるRCモデルが定義されています.パイ型モデルはSPFよりもより一般的に用いられます.SPEFは異なるネット間の結合容量を定義する構文があるため,PrimeTime SIを用いたクロストーク解析に利用されます.SPEFはSPFやDSPFよりもファイルサイズが小さいですが,それは各ノード名を数字に置き換えてしまうためです.

SBPFはPrimeTimeで採用されているバイナリフォーマットです.寄生RCの情報はSPEFよりも小容量で高速に読み込むことができます.


研究室では「SPEFはすべての寄生RCを含んだネットワークで,それをパイ型に縮約したものがDSPF」という扱いだったのだけれど,調べてみるといろいろあるみたいですね.


元ネタ:
The Difference Between Parasitic Data Formats SPF, DSPF, RSPF, SPEF, and SBPF

2011年5月16日月曜日

IEEE Tranのクラスファイルをインストールする方法

研究室のPCにIEEE Tranのクラスファイル(+とbstファイル)を入れたので,個人的備忘録としてメモ.別にIEEEに限らず一般的な話だとは思う.OSはCentOS 5.5です.

latexのバージョン:ptetex3.0.1

http://tutimura.ath.cx/~nob/tex/ptetex/ptetex3/rpm/
にて配布されている,rpmをインストール.


(1) IEEEtranのクラスファイルをダウンロードする.

IEEEのサイトからダウンロード

"LaTeX Archive Contents"と"LaTeX (Bibliography Files)"があるので,両方ダウンロード.

ダウンロードしたらtarコマンドで解凍する.


(2) IEEEtranクラスファイルのコピー

探し回った結果,
/usr/share/texmf-dist/tex/latex/
以下にクラスファイルを入れるとよい様だ.
探すには
% locate .cls
とすると,現地点で保存されているクラスファイルの場所がわかる.

ディレクトリをつくって,クラスファイルをコピーする.
% cd /usr/share/texmf-dist/tex/latex/
% sudo mkdir IEEEtran
% sudo cp ~/IEEEtran2.cls /usr/share/texmf-dist/tex/latex/IEEEtran


(3) bstファイルのコピー

こちらは
/usr/share/texmf-dist/bibtex/bst
以下にファイルを入れると良いようだ.
ディレクトリをつくって,クラスファイルをコピーする.
% cd /usr/share/texmf-dist/bibtex/bst
% sudo mkdir IEEEtran
% sudo cp ~/*.bst /usr/share/texmf-dist/bibtex/bst

(4) インストール
ls-Rを更新する
% sudo texhash

これでok.あとはテンプレートのファイル(たとえばbare_conf.tex)をコンパイルしてみてpdfができればok

% platex bare_conf.tex
% dvipdfmx bare_conf.dvi

「UNIXって何(´・ω・`)」な2年前の自分はこれにだいぶ時間を費やした物だ.さかのぼって教えてあげたい.

2011年5月5日木曜日

HSPICEで電流を測る方法

SPICEでは電圧源以外の電流を測定することができません.
そのためSPICEで電流を測るときは,測りたいノードに起電力0の電圧源を挟んでその電流を測定するというのはよく行う手法です.

ですが,HSPICEではそのような面倒なことをしなくても,.MEASUREで素子の電流を直接測ることができます.

たとえば過渡解析で抵抗R1の平均電流を測りたい場合.

.MEASURE TRAN CURRENT_R1 AVG I(R1) FROM=1n TO=100n

とすれば平均電流を計算してくれますし,過渡解析なので.tr*には波形が格納されます.

なお.MEASUREはどこに記述してもokです.サブサーキット中に記述しても測定してくれます.

2011年3月16日水曜日

英語セミナー

基本的にこのBlogはある特定の読者を対象とするわけではないのだけれど,珍しくこのポストではウチの大学固有の話をします.

研究科のGCOEの英語セミナーに行ってきました.Berlizのコースを1日4コマ(90分x4)を7日間,Interview,Discussion,Negotiaition,Debate,Presentationを短期集中で勉強するコース.もしかしたらこのBlog主と同じコースかもしれない.
自宅から通うEnglish合宿
面白かったのは,講義形式ではなくとにかく演習,実践させること.下手でもいいからとにかく話す.

□良かった点
・(GCOEの人は不満そうだが)少人数なのでクラス内に連帯感が生まれた.
・とにかく下手でもいいから話す!を徹底できた.
・プレゼンの手法について互いに評価しあえた.研究室では内容は議論するが手法は議論しないので勉強になった.
・(今回だけかもしれないが)参加者のスキルもモチベーションも高い.いい刺激になる.
・Practice!Practice!Practice!

□悪かった点
・スキルよりも,「英語を話す度胸」をつける事を重視(短期なので仕方がない?).
・短期集中はしんどい.研究が進まない.
・意味のよくわからないGTECというテストでスコアを評価される.

おおむね典型的な日本人(読み書きはできるが,聞く話すが苦手,萎縮してしまう)にはいいコースだったけれど,英語を話す度胸がある人にはあまり意味はないかもしれない.また授業中はず~っと英語を話すので,酸欠で夜に頭が痛くてフラフラになってしまった.それでもみんなで英語を話す機会があると言うことは,大変貴重で楽しかった.

「英語を話すと萎縮する」と言う人は,こういうセミナーは積極的に参加するといいですね.研究室の人にお勧めしておこう.