tcl 加速运行的方法

3 篇文章 1 订阅

https://mp.weixin.qq.com/s/hTP3eju1CnGZrqdeRHOyhg
习惯一: 尽量用proc
Native的TCL command(不是ICC2自带的命令,比如place_opt就不算是native的 TCL command),在proc里的运行速度是直接运行时的2~5倍!所以对于循环次数很多,计算很多的脚本,尽量放在proc里。
啥会快呢?因为ICC2在执行proc时,会把proc预编译成byte code,所以会比直接执行TCL快很多。
举个栗子。一个简单的循环累加脚本:
icc2_shell> time {
for {set x 1} {$x < 10000} {incr x} {incr a 1};
echo KaTeX parse error: Expected 'EOF', got '}' at position 3: a }̲ 9999 2295 micr…x < 10000} {incr x} {incr a 1};
echo $a
}
icc2_shell> time {bb}
9999
417 microseconds per iteration
这是一个简单的循环累加,用proc比不用proc快了5倍,有没有?

习惯二:expr里的函数要用花括号
expr计算我们天天要用,但是我们可能没有注意到,函数加上花括号{},比不加花括号,速度要快很多!
先举个栗子:
icc2_shell> time {expr sin(50)}
21 microseconds per iteration
icc2_shell> time {expr {sin(50)}}
13 microseconds per iteration
就一个简单的“赛你”函数,加上花括号后,速度快了一倍。为啥呢?
因为如果不加花括号,ICC2要把表达式转换成字符串string,再转换成函数和数字。而有了花括号,ICC2直接当作函数和数字来处理,所以很快。

习惯三:及时unset你的collection
这个非常非常的重要!!!
为什么呢?
当我们有一个或者多个很大的collection时,后续的一些命令可能会变得非常慢。因为每个命令结束后都要花额外的时间去维护这些collection,确保这些collection继续有效。
比如:
icc2_shell > set C1 [get_cells xxx]
icc2_shell > sizeof_collection $C1
2,000,000
现在有个collection C1,有2M的cell在里面。接着你做eco,删除design里的一个cell A。这时工具会自动更新collection C1,如果A在C1里,则会把A从C1里删除掉。不然,后面使用C1可能会产生各种错误了。这种维护会消耗不少的时间。
所以,当你不再需要个collection时,及时的把它unset掉。不然,它一直存在,一直需要维护,直到你退出ICC2。
当使用proc时,这个问题不存在,因为proc里的collection是临时的,局部的,当proc执行结束后,这个collection就不存在了,工具会自动unset。

习惯四: 用新的匹配方式替代lsearch
当list很长时,我们会常常用到lsearch去匹配。但如果我们用新的方式,速度可以加快2~3倍!
time {
if {[lsearch $data “IC Compiler II”] >= 0} {
set found true
}
}
326.398 microseconds periteration
time {
if {“IC Compiler II” in KaTeX parse error: Expected 'EOF', got '}' at position 5: data}̲ { set …pattern in $list"的方式,查找速度比lsearch快很多

习惯五: 尽量不用foreach
如果对ndm进行操作,像get_pins, get_cells, get_attributes 等等,尽量一次完成,而不要用foreach。比如:
time {
get_attribute [get_cells -physical_context] ref_block.name
}
3809 microseconds per iteration
time {
foreach_in_collection cell [get_cells-physical_context] {
get_attribute $cell ref_block.name
}
}
116589 microseconds per iteration
可以看到,一次抓取比foreach快了无数倍。因为foreach需要每次都去ndm库里找东西,然后退出来,再进去,所以浪费了很多的时间。

习惯六: 尽量不用-filter
尽量不用-filter,除非没有别的办法。推荐使用get_* -of_object $obj

习惯七. 尽量用cascaded attribute
不知道如何翻译cascaded attribute才恰当。什么是cascaded attribute? 就是有些attribute是collection属性时,那么它会有第二级甚至第三级属性。比如找一个cell的pin的lib pin的名字。lib_pin是一级attribute,是一个collection,我们可以直接用lib_pin.name找到它的名字。
不好的习惯: set lib_pin [get_attribute [get_lib_pins -of $pin] name]
好的习惯: set lib_pin [get_attribute $pin lib_pin.name]

送一个习惯:使用append_to_collection
推荐使用append_to_collection代替add_to_collection,特别是在一个loop里,需要非常多次的循环操作时。append_to_collection会快很多,因为它直接修改collection,而不是像add_to_collection那样先加,再返回到一个新的collection。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值