研究が進まない時に限って,研究以外の仕事に手が向いてしまう.
AnalogArtistでレイアウトを書いていると,LSWで頻繁にレイヤの表示/非表示を切り替える必要がある.
近年のプロセスは配線層が多層なので,たとえば12層配線あるとメタルとVIAを消すのに23回もクリックしないといけない.これはあまりに非生産的.
これを解決するために,簡単なプログラムを書いてみた.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBTRtsiQaEW2W0NCut0K_Kb_QcKcKzaRKsR6N8xEyD-NgkTBVrdg56FVINJMhoI_0JXysB-izhOwKevP7-3d5bHAIVVX8gGd7NJTDyajNogPmKlyfNnkDrtmEXqmauc4Qy_D0jrrHdyNAp/s320/VisibleLayer.png)
図を見れば一発でわかると思うが,念のため説明すると上から順に
[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も積極的に技術情報を提示できるよう頑張りたいものである.