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(()
; 还没写,有空再更。
)
)