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