Skill 遍歷整個專案設計的兩個思路
阿新 • • 發佈:2020-12-21
https://www.cnblogs.com/yeungchie/
RecursiveProject 遞迴專案
- code
procedure(ycRecursiveProject(\@optional cv(geGetEditCellView()) "d") prog((insts viewNames master) unless(boundp('masters) masters = nil) unless(boundp('ignoreLibNames) ignoreLibNames = nil) ; 優先處理頂層的操作放這裡 printf("Opened \t libName : %s \t cellName : %s \n" cv~>libName cv~>cellName) ;;;;;;;;;;;;;;;;;;;;;;;;;; insts = cv~>instances foreach(inst insts case(cv~>cellViewType ("schematic" ; schematic 雖然呼叫的是 symbol ,但需要處理的是 schematic viewNames = inst~>master~>cell~>views~>name if(member("schematic" viewNames) master = dbOpenCellViewByType( inst~>libName inst~>cellName "schematic" "schematic" "r" ; 這裡用的是隻讀模式,需要編輯內容的時候改為追加模式 "a" 即可。 ) master = nil ) ) ("maskLayout" ; layout 可以直接呼叫 master master = inst~>master ) ) when(master && !member(master masters) unless(member(inst~>libName ignoreLibNames) ycRecursiveProject(master) ) ) ) ; 優先處理底層的操作放這裡 ;;;;;;;;;;;;;;;;;;;;;;;;;; masters = append1(masters cv) ;dbSave(cv) ;dbClose(cv) ; 我喜歡不儲存不關閉,因為這樣可以有一個反悔的機會,避免誤操作。 ) ); ycRecursiveProject
- run
; 不太喜歡全域性變數,所以套一個 prog
prog((masters ignoreLibNames)
; ignoreLibNames 用來指定忽略不需要開啟哪些庫中的 cellView
ignoreLibNames = list("techLib" "basic" "analogLib")
ycRecursiveProject()
)
如果專案不大的可以用上面的 RecursiveProject 方式來處理,當專案比較大的時候遞迴的效率可能非常的低,此時推薦下面的 TraverseHierarchyTree ,Virtuoso 可以獲取到 Tree 檔案,通過它來依次開啟每個 cellView 。
曾經遞迴一個晶片頂層,花了兩天一夜還沒跑完,也可能是我 Memoization 沒做好,跟公司的一個大佬交流後決定換用下面的方式,結果只跑了不到半小時。
TraverseHierarchyTree 遍歷層次樹
procedure(ycTraverseHierarchyTree(treeFile "t")
prog(()
; 還沒寫,有空再更。
)
)