2012年10月25日木曜日

GVimのフォントを変える

GVimのフォントを変える際,以下の手順をたどると良い.

(1) GUIで好みのフォントを探す.
(2) 指定したフォントを.vimrcに指定する.

(1) フォントを探す
GVimをひらき,[編集]→[フォント設定]をひらく.するとGUIでフォントを選ぶ画面が出るので,好みのフォントを入れる.



 今回は,Osakaフォントの10ptを選ぶ.

(2) 指定したフォントを.vimrcに指定する.
次に,指定すべきフォントの名前を調べる.現在のフォントの設定は,以下のコマンドで調べることができる.

:set guifont

実行した結果を以下に示す.




これを,.vimrcに書けばよい.フォントの名前に全角が入っているが,きちんと認識するようだ.スペースはバックスラッシュ"\"を使ってエスケープする必要がある.

set guifont=Osaka-等幅\ 10


参考にしたサイト
新しくフォントをインストールしてVimエディタから利用する。
vim/任意のフォントを設定する方法

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も積極的に技術情報を提示できるよう頑張りたいものである.