热度 3| |
“ 对不起,我 get 不到你的笑点。”
“ 你 man 一下试试 ”
秋雨过后,天气转凉,连笑话都有点冷。
后端工作谈不上多么辛苦,也一点儿不轻松。流程,命令,细节,参数,当deadline逼近的时候不免有些黑云压城的感觉。这时候,一把利器在手 ,克敌制胜的信心自然增加不少。作为IC学徒,深感辅助工具的重要性。而且高效率的工作方式也是自己一直所追求的,工欲善其事,必先利其器嘛。对TCl脚本有了一段时间的应用之后,多有感触。
1. 正面交锋,直取中军
案例:在APR过程中,需要对比 init 阶段和 postRoute 阶段的 stdcell 发生了多大比例的变化。
问题分析:既是对比,就需要两个阶段的相应文件,这个容易,defOut即可。关键在于如何对比,tcl正式和于文本处理。
程序一: set file1 init.def # def文件经过处理只有instance name的信息
set file2 postRoute.def
set num [open ./same.file w+]
set key 0
set mm 0
dbForEachFileLine $file1 line {
if {[lindex $line 0] == "COMPONENTS"} {
set key 1
}
if {$key == 1} {
set iniline $line
dbForEachFileLine $file2 line {
if {[lindex $iniline 1] == [lindex $line 1] } {
puts $num $line
incr mm
}
}
}
}
puts $num $mm
close $num
经过测试,行数在2万左右时TCL可以很快完成,当达到10万数量级的时候就运行困难了。因此普通的TCL语言或者这种思路下不能有效地完成这个任务。
程序二 :cat init.def post.def | sort | uniq -d > samefile
哈,搞定!找到合适的command就能破除所有障碍,一举成功。他山之石,可以攻玉。
2.以迂求直,侧面进攻
案例:对一文件进行处理,将每一行“/”后面的呢绒输出
问题分析:关键是如何确定“/”后面内容的位置呢?如果有封装好的command,那么就迎刃而解了。困难在于目前没有找到合适的command,这时就需要采取迂回的策略,绕过障碍。
程序:set line "This is a teat file / to test a tcl command"
set num [string first / $line]
set result [string range $line $num end] #如果不需要“/”,可对$num作加一操作
puts $result
工欲善其事,必先利其器。掌握好一定的辅助工具,和一些思考方法在关键时刻定能派上大用场,与诸君共勉。