tcl語法和后端腳本實踐 - 2:流程控制
掃描二維碼
隨時隨地手機看文章
循環(huán)命令for:
for {初始化變量} {變量測試語句} {變量操作} {循環(huán)語句}
這里需要注意的是,所有的循環(huán)命令后面跟的測試、初始化語句以及循環(huán)語句等等,都是使用 大括號包含起來,這也是大括號的一個重要的用途。
這里列出來的變量操作,指的是在循環(huán)語句結(jié)束時的變量操作。簡單的for 語句示例如下,循環(huán)運行直到測試條件不再滿足:
測試命令if:
測試表達式,為真則執(zhí)行命令,更加完備的格式是if-elseif-else 方式。當(dāng)然,和其他高級語言一樣,使用非完備格式從語法上講,是沒有任何問題的,但是設(shè)計者應(yīng)該有策略保證表達式不被滿足的情形。
If是初始測試,elseif是不滿足的初始測試情況下再次測試,隨后的else是以上條件都不滿足時,執(zhí)行的默認命令,示例如下:
更加格式化的測試命令switch:
switch {測試策咯} {測試選項} {變量} {測試結(jié)果的分支執(zhí)行語句}
Tcl里邊的switch是可以和if-elseif-else完全作對等替換的,switch的好處是,結(jié)構(gòu)化更好,對于簡單的分支執(zhí)行語句的可視化很好。tcl這里給出多一個命令測試命令供用戶選用:
這里的測試策咯有三種:-exact, -glob 和-regexp,默認是使用-exact來做匹配,示例如下:
Switch和if-elseif一樣,碰到第一個滿足條件就執(zhí)行,然后直接退出測試結(jié)構(gòu),語句執(zhí)行完成。
在switch里邊還有兩個特殊字符?!?-” 和“-“,看下面的實例:
第147行的“--“是測試策咯和選項的結(jié)束標(biāo)志,tcl就會認為”--“后面跟的就是變量,使用”--”可以明確區(qū)分測試選項部分和變量部分。
第149行的“-“是一種更為簡便的寫法。意思是執(zhí)行的命令和下一句一致,所以能看到,最終的結(jié)果,是采用了第150行的命令進行執(zhí)行,并非真實的執(zhí)行了第150行的命令。
循環(huán)控制命令
break:在循環(huán)體內(nèi),結(jié)束當(dāng)前循環(huán),并且終止循環(huán)體的剩余循環(huán)操作
continue:在循環(huán)體內(nèi),結(jié)束當(dāng)前循環(huán),立刻開始循環(huán)體的下一個循環(huán)操作
可以通過它們,去干預(yù)內(nèi)部循環(huán)細節(jié),這個可以增加腳本的靈活性,break的示例如下:
注意觀察第24,25行,這里的打印,是在break語句干預(yù)下,所引起的循環(huán)操作變化。整個循環(huán)語句的最終結(jié)果如下,可以看到,由于break的介入y的值被鎖定到3:
類似的,使用continue,會有另外一副畫面:
細心的讀者,可以從第62、63行可以看出continue的命令運行方式了吧:當(dāng)前循環(huán)立刻結(jié)束,立刻啟動下次循環(huán)。
使用continue的最終結(jié)果,也稍有不同,大家再體會一下
循環(huán)往復(fù)的while:
while {測試命令} {循環(huán)腳本},
和if、for比較,while的強大之處是它的無限往復(fù)功能:只要條件滿足,永遠都會執(zhí)行循環(huán)腳本,當(dāng)且僅當(dāng)測試條件不滿足,才會結(jié)束while,腳本向下繼續(xù)運行,如果是在等待某個機制的情形下,while可以很好的滿足這種需求,間接的,這也可以演化成一種交互式的操作;其次也可以作為迭代的一種控制。使用好while,可以讓腳本運行效率更高,具體示例如下
當(dāng)x=3的時候,while的判斷不成立,這時候才會運行while后面的語句。
列表循環(huán)foreach:
foreach {變量名} {列表} {循環(huán)腳本},
這時候foreach會把列表里的每一個值帶入到變量里邊,然后運行循環(huán)腳本,當(dāng)然,循環(huán)腳本里邊不一定必須要出現(xiàn)變量名:
還有更高級的用法是:
foreach {列表變量} {列表} {列表變量} {列表} {循環(huán)腳本}
foreach會把列表里的變量進行羅列,然后逐一進行賦值直到?jīng)]有列表的內(nèi)容全部被賦值結(jié)束。
仔細看下面的這個示例,foreach把列表變量{I j}和{k l m},先展開成為獨立的變量,而后盡量與后面的列表完成一一匹配,目標(biāo)是打印完所有的賦值后,結(jié)束foreach,這里的示例如下:
后端應(yīng)用實踐:
實際的工作中,foreach是一個常用的命令,再加上對文件讀取訪問,可以使用簡單的tcl腳本實現(xiàn)比較復(fù)雜的操作,例如:讀入timing report -> 使用foreach對文件內(nèi)容進行解析 -> 滿足某種條件下的觸發(fā)操作命令:
在PT里邊,可以使用命令生成max_delay類型的violation結(jié)果,
這時候,可能需要抽取出所有violation對應(yīng)的startpoint,下邊的這個腳本就可以快速的實現(xiàn)這個功能:
最后的得到的結(jié)果如下,抽取結(jié)果的打印格式是:startpoint endpoint slack
可以看到,工具命令結(jié)合tcl的控制語句,可以快速讀入report 結(jié)果,然后進行處理,從而得到數(shù)據(jù)庫里的需要的信息。
這里涉及到了一個新的課題,就是文件內(nèi)容的訪問,這正是下期講座的討論主題之一,敬請期待。





