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





