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

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜全文
查看: 7044|回复: 36

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

[复制链接]
发表于 2024-12-21 20:54:58 | 显示全部楼层
把 append1 改为 cons,可以提高效率。

其实可以不用递归,也可以不用全局变量。

保存一个“已处理列表”的话,可以避免重复查找,进一步提高效率。
回复 支持 反对

使用道具 举报

发表于 2024-12-23 10:21:25 | 显示全部楼层


   
着着着火了 发表于 2024-12-23 10:11
感谢你的建议。

有两个问题请教一下:


全局变量名字忘了,手机上没下载。就是递归函数里你是改变一个全局(至少是非本地)变量的吧。


我之前写过一个类似功能的函数,没用递归,但是因为是工作电脑上写的,不方面传上来。

方法是:做个队列,类似FIFO的,一开始队列只有顶层cellview。通过while循环从队列头部取cellview进行处理。

对于cellView中的每一个instance,不是立即descend进去处理,而是将其master加入队列。

队列的实现是一个tconc列表queue,可以方便地在尾部添加数据,另一个初始值为car(queue)的指针用来从头部取值。

存入队列是可以判断队列中是否已存在,这样也就可以避免重复处理多次,也避免了楼上有人提出的list过长的问题。既节省时间又节省空间。
回复 支持 反对

使用道具 举报

发表于 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:35:24 | 显示全部楼层
这个cellView是函数调用传入的参数啊。
回复 支持 反对

使用道具 举报

发表于 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 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:39:02 | 显示全部楼层


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


你是不是漏掉了tconc那句?tconc会改变allCellViews,而pendingCellViews是allCellViews的一部分,所以跟着改变。
回复 支持 反对

使用道具 举报

发表于 2024-12-25 15:50:51 | 显示全部楼层
基本上就是这样了,有一点需要更正一下。



   
pengdingCellViews=car(allCellViews)是使pengdingCellViews指向allCellViews的第一个地址



car得到的是第一个元素,不是地址。但是因为tconc结构的特殊性,第一个元素就是我们真正需要的整个list,tconc结构的第2个元素是我们需要的那个list(即tconc第一个元素)的尾巴(last)。

使用append1追加元素效率低下,因为要复制原来的list,并在最后增加一个元素。

使用nconc去掉复制步骤,可以提高点效率,但是它还是需要从头一步一步找到尾巴再添加元素,所以效率也不高。

用tconc高效的原因是保存了最后一个元素的位置,可以迅速跳到尾部去添加数据。

有一个例子可见效率差别。我用群里“SKILL教程”中那个dbkShapeQuery做测试,试图从一个大版图中查询所有DIFF图形时,运行10几分钟还没结果,不得不Control-C终止,改写后1秒出结果。(教程旨在讲解函数用法,效率低不是教程的问题)
回复 支持 反对

使用道具 举报

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


   
jobkong 发表于 2024-12-25 16:48
这就类似于广度优先遍历吧


是的,广度优先。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

X 关闭广告

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

GMT+8, 2025-10-16 03:51 , Processed in 0.016554 second(s), 4 queries , Gzip On, Redis On.

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