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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

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

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

[复制链接]
 楼主| 发表于 2024-12-25 13:25:22 | 显示全部楼层


acrofoxAgain 发表于 2024-12-25 10:39
你是不是漏掉了tconc那句?tconc会改变allCellViews,而pendingCellViews是allCellViews的一部分,所以跟 ...


糟心,我重启了一次virtuoso,然后在没改代码的情况下再次运行脚本得到了正确的结果。
我对指针的理解还是太薄弱了,再次感谢您的回复!!!
 楼主| 发表于 2024-12-25 14:42:48 | 显示全部楼层


acrofoxAgain 发表于 2024-12-25 10:39
你是不是漏掉了tconc那句?tconc会改变allCellViews,而pendingCellViews是allCellViews的一部分,所以跟 ...


好巧不巧,今天在翻找资料的时候刚好看到了这样一句话:“list的赋值实际上是指针的引用”。之前虽然也看过了,但一直没在意,也没有深入的理解。

通过你给的例子反倒理解了。

allCellViews是一个tconc结构的指针,指向内存中的当前cellView的地址。pengdingCellViews=car(allCellViews)是使pengdingCellViews指向allCellViews的第一个地址,在whiel循环中pengdingCellViews=cdr(pengdingCellViews)则是使指针移向allCellViews的下一个地址,并不需要重新赋值之类的,纯粹只是指针的移动,只要allCellViews存储的数据不断增加或者pengdingCellViews指向的地址未到allCellViews的末尾的下一位(nil),则循环会一直进行。

可能理解还是很片面,但还是学到了很多东西,再次感谢。

发表于 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 16:37:38 | 显示全部楼层


acrofoxAgain 发表于 2024-12-25 15:50
基本上就是这样了,有一点需要更正一下。


“car得到的是第一个元素,不是地址。”这点我知道,可能我还是没说清楚吧,我的理解是tconc结构本身是一个list,所以其所赋值的参数allCellViews是指向这个地址的指针,然后pengdingCellViews=car(allCellViews)得到的还是一个list,所以pengdingCellView依然是一个地址指针。包括后面的cdr()这一步骤,其返回值还是一个list,所以从头到尾pengdingCellViews都是一个地址指针。


“用tconc高效的原因是保存了最后一个元素的位置,可以迅速跳到尾部去添加数据。“之前看函数解释知道append1、nconc、tconc之间的效率差异及工作方式,但没具体想过tconc为什么会保留最后一位元素在list里形成这么一种奇怪的结构,经你这么一说就明白了。
我之前写的脚本觉得数据不多的时候就直接用append系列了,觉得要处理大量的数据才构建tconc结构,也是偷懒了。
发表于 2024-12-25 16:48:58 | 显示全部楼层


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


这就类似于广度优先遍历吧
发表于 2024-12-25 17:25:12 | 显示全部楼层


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


是的,广度优先。
 楼主| 发表于 2025-1-10 15:02:47 | 显示全部楼层
更新 快速版


去掉了统计调用器件次数的功能。

放了4种不同实现方法在压缩包里:
FindTechLibInstFast:在第一版的基础上改的,依然用的是递归方式。速度在fast系列最慢。
FindTechLibInstFast2:用schGetCellViewListInSearchScope()函数获取all cell views。速度快。
FindTechLibInstFast3:用动态指针处理。速度快。(感谢acofoxAgain提供的思路和代码)
FindTechLibInstFast4:用动态list处理。速度比2、3慢。

推荐用2、3。

FindTechLibInstFast.zip

4.43 KB, 下载次数: 4 , 下载积分: 资产 -2 信元, 下载支出 2 信元

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

本版积分规则

关闭

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


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

GMT+8, 2025-1-18 10:58 , Processed in 0.033301 second(s), 19 queries , Gzip On.

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