tcl语法和后端脚本实践 - 2:流程控制
扫描二维码
随时随地手机看文章
循环命令for:
for {初始化变量} {变量测试语句} {变量操作} {循环语句}
这里需要注意的是,所有的循环命令后面跟的测试、初始化语句以及循环语句等等,都是使用 大括号包含起来,这也是大括号的一个重要的用途。
这里列出来的变量操作,指的是在循环语句结束时的变量操作。简单的for 语句示例如下,循环运行直到测试条件不再满足:
测试命令if:
测试表达式,为真则执行命令,更加完备的格式是if-elseif-else 方式。当然,和其他高级语言一样,使用非完备格式从语法上讲,是没有任何问题的,但是设计者应该有策略保证表达式不被满足的情形。
If是初始测试,elseif是不满足的初始测试情况下再次测试,随后的else是以上条件都不满足时,执行的默认命令,示例如下:
更加格式化的测试命令switch:
switch {测试策咯} {测试选项} {变量} {测试结果的分支执行语句}
Tcl里边的switch是可以和if-elseif-else完全作对等替换的,switch的好处是,结构化更好,对于简单的分支执行语句的可视化很好。tcl这里给出多一个命令测试命令供用户选用:
这里的测试策咯有三种:-exact, -glob 和-regexp,默认是使用-exact来做匹配,示例如下:
Switch和if-elseif一样,碰到第一个满足条件就执行,然后直接退出测试结构,语句执行完成。
在switch里边还有两个特殊字符。“--” 和“-“,看下面的实例:
第147行的“--“是测试策咯和选项的结束标志,tcl就会认为”--“后面跟的就是变量,使用”--”可以明确区分测试选项部分和变量部分。
第149行的“-“是一种更为简便的写法。意思是执行的命令和下一句一致,所以能看到,最终的结果,是采用了第150行的命令进行执行,并非真实的执行了第150行的命令。
循环控制命令
break:在循环体内,结束当前循环,并且终止循环体的剩余循环操作
continue:在循环体内,结束当前循环,立刻开始循环体的下一个循环操作
可以通过它们,去干预内部循环细节,这个可以增加脚本的灵活性,break的示例如下:
注意观察第24,25行,这里的打印,是在break语句干预下,所引起的循环操作变化。整个循环语句的最终结果如下,可以看到,由于break的介入y的值被锁定到3:
类似的,使用continue,会有另外一副画面:
细心的读者,可以从第62、63行可以看出continue的命令运行方式了吧:当前循环立刻结束,立刻启动下次循环。
使用continue的最终结果,也稍有不同,大家再体会一下
循环往复的while:
while {测试命令} {循环脚本},
和if、for比较,while的强大之处是它的无限往复功能:只要条件满足,永远都会执行循环脚本,当且仅当测试条件不满足,才会结束while,脚本向下继续运行,如果是在等待某个机制的情形下,while可以很好的满足这种需求,间接的,这也可以演化成一种交互式的操作;其次也可以作为迭代的一种控制。使用好while,可以让脚本运行效率更高,具体示例如下
当x=3的时候,while的判断不成立,这时候才会运行while后面的语句。
列表循环foreach:
foreach {变量名} {列表} {循环脚本},
这时候foreach会把列表里的每一个值带入到变量里边,然后运行循环脚本,当然,循环脚本里边不一定必须要出现变量名:
还有更高级的用法是:
foreach {列表变量} {列表} {列表变量} {列表} {循环脚本}
foreach会把列表里的变量进行罗列,然后逐一进行赋值直到没有列表的内容全部被赋值结束。
仔细看下面的这个示例,foreach把列表变量{I j}和{k l m},先展开成为独立的变量,而后尽量与后面的列表完成一一匹配,目标是打印完所有的赋值后,结束foreach,这里的示例如下:
后端应用实践:
实际的工作中,foreach是一个常用的命令,再加上对文件读取访问,可以使用简单的tcl脚本实现比较复杂的操作,例如:读入timing report -> 使用foreach对文件内容进行解析 -> 满足某种条件下的触发操作命令:
在PT里边,可以使用命令生成max_delay类型的violation结果,
这时候,可能需要抽取出所有violation对应的startpoint,下边的这个脚本就可以快速的实现这个功能:
最后的得到的结果如下,抽取结果的打印格式是:startpoint endpoint slack
可以看到,工具命令结合tcl的控制语句,可以快速读入report 结果,然后进行处理,从而得到数据库里的需要的信息。
这里涉及到了一个新的课题,就是文件内容的访问,这正是下期讲座的讨论主题之一,敬请期待。





