在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: 着着着火了

[原创] 一个可以在当前sch中搜索到调用了某个lib的cell的信息统计的skill脚本

[复制链接]
 楼主| 发表于 2024-12-23 15:44:20 | 显示全部楼层


acrofoxAgain 发表于 2024-12-23 10:21
全局变量名字忘了,手机上没下载。就是递归函数里你是改变一个全局(至少是非本地)变量的吧。


1.你说的队列是指list吗?

2.我还是没明白不通过递归,你如何获取整个hierarchy的cell的cellView?
3.我重新理了一遍我的代码,确实是有在重复处理master的情况,这和我构建的统计cell调用次数的num参数有关,如果不重复处理就得不到这个参数的正确结果。不要这个参数确实能优化很多步骤。

Thanks。
发表于 2024-12-23 17:07:04 | 显示全部楼层
上面已经说了,队列用tconc实现,类似这样




  1. allCellViews = tconc(nil cellView)
  2. pendingCellViews = car(allCellViews)
  3. while( pendingCellViews
  4.     currentCellView = car(pendingCellViews)
  5.     ; do domething
  6.     foreach( inst currentCellView->instances
  7.         ; ...
  8.        unless(member(instSchView car(allCellViews))
  9.             tconc(allCellViews  instSchView)
  10.         )
  11.     )
  12.     pendingCellViews = cdr(pendingCellView)
  13. )

  14. ; car(allCellViews) is list of all dependent cell views


复制代码
 楼主| 发表于 2024-12-23 18:15:40 | 显示全部楼层


acrofoxAgain 发表于 2024-12-23 17:07
上面已经说了,队列用tconc实现,类似这样


我的问题是:allCellViews=tconc(nil cellView)中的cellView你是通过什么方法去获取的,就你说的不通过递归的那种方法
发表于 2024-12-23 18:35:24 | 显示全部楼层
这个cellView是函数调用传入的参数啊。
 楼主| 发表于 2024-12-24 10:11:35 | 显示全部楼层


acrofoxAgain 发表于 2024-12-23 18:35
这个cellView是函数调用传入的参数啊。


你说的函数是这个吗:schGetCellViewListInSearchScope

先假定是吧,其返回值确实包含了hierarchy的cellView,但本质上还是用了递归,只是省了自己写,直接调用函数得到结果了,然后你再对结果用while进行加工处理。
(纯属猜测哈,若不对请见笑)
发表于 2024-12-24 10:17:50 | 显示全部楼层
本帖最后由 acrofoxAgain 于 2024-12-24 10:26 编辑


着着着火了 发表于 2024-12-24 10:11
你说的函数是这个吗:schGetCellViewListInSearchScope

先假定是吧,其返回值确实包含了hierarchy的cell ...


我贴的代码已经包含全部关键代码了,没有额外的高端函数要用了,唯一没包含的可以说就是没有根据当前inst找对应的schematic view那一块,我在我的实现中是通过switch view list来找的,我看你是固定打开schematic这个view的,基本上也能应对绝大部分情况,没啥问题。


再补充一点关于递归的事情。其实递归只是一种手段,很多时候都不是唯一的手段。在没有计算机的情况下,递归是很难的,但是类似的事人还是要干。举个例子,假如我让一个图书管理员找出某本书直接或者间接参考了的该图书管的书目(这里间接参考指被它的参考书目参考或者参考书目的参考书目参考……)。如果是电子化的,写个程序,递归可能是最容易想到的方法。如果是纸质书,纯人工,他会递归么?十有八九是不会的。他可以把这本书用到的本馆参考文献都拿一本出来,摆专门架子上作为待处理书目。等这本书处理完了,再从待处理书目上拿一本,用同样的方法,将新的参考书目放到专用架子上。等这个架子上没有没处理过的书目了,也就找完了。

我用的就是这种方法。
 楼主| 发表于 2024-12-24 17:58:39 | 显示全部楼层


acrofoxAgain 发表于 2024-12-24 10:17
我贴的代码已经包含全部关键代码了,没有额外的高端函数要用了,唯一没包含的可以说就是没有根据当前inst ...


while循环以pengdingCellViews的有无作为判断条件,在循环里通过pengdingCellViews=cdr(pengdingCellView)来减少list的元素,所以最开始的pengdingCellView=car(allCellViews)决定了pengdingCellView这个list的长度。



所以你最开始的cellView得是包含整个hierarchy cellView的一个list,但我问你是否是用schGetCellViewListInSearchScope()这个函数获取的你没明说,从语义来看是否定的意思,所以我还是想问一下你是怎么获取hierarchy cellView的。

另外,再请教一下通过switch view list来找的instSchView的方法,找了很多函数尝试都没成功。


发表于 2024-12-24 20:25:24 | 显示全部楼层


着着着火了 发表于 2024-12-24 17:58
while循环以pengdingCellViews的有无作为判断条件,在循环里通过pengdingCellViews=cdr(pengdingCellView ...


pendingCellViews是car(allCellViews)的尾部list,而allCellViews是一个tconc结构,会在循环中动态增长car(allCellViews)。

循环开始pendingCellViews越来越长,后期越来越短。
至于找switch view,除了自己按顺序查找以外,还有个函数,大概叫dbGetInstSwitchView,如果不对,可以在API Finder里找一下,搜switch看db开头的函数就是了。
 楼主| 发表于 2024-12-25 10:35:22 | 显示全部楼层


acrofoxAgain 发表于 2024-12-24 20:25
pendingCellViews是car(allCellViews)的尾部list,而allCellViews是一个tconc结构,会在循环中动态增长ca ...


allCellViews是动态增长的这没问题,但在while循环里能对pengdingCellView重新赋值的也只有最后那句pengdingCellView=cdr(pengdingCellView),pengdingCellView这个参数并不会跟随allCellViews动态改变。
如果想跟随动态改变则需要在while循环里对pengdingCellView通过pengdingCellView=car(allCellViews)重新赋值,这就会造成死循环。所以动态赋值应该在while循环外,那就得执行第二遍才能让pengdingCellView=car(allCellViews)得到重新赋值并进入while循环,这不就又成了递归吗?


switch view那个函数我找到了,叫dbGetAnyInstSwtichMaster(),这函数比dbOpenCellViewByType需要一开一关速度快且不占用内存,感谢!
发表于 2024-12-25 10:39:02 | 显示全部楼层


着着着火了 发表于 2024-12-25 10:35
allCellViews是动态增长的这没问题,但在while循环里能对pengdingCellView重新赋值的也只有最后那句pengd ...


你是不是漏掉了tconc那句?tconc会改变allCellViews,而pendingCellViews是allCellViews的一部分,所以跟着改变。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-1-18 10:50 , Processed in 0.032429 second(s), 17 queries , Gzip On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表