pretty code

顯示具有 Tcl 標籤的文章。 顯示所有文章
顯示具有 Tcl 標籤的文章。 顯示所有文章

2026年4月6日 星期一

Hack Tessent command

EDA 相關工作最討厭的就是只能透過 EDA 執行!

目前這份工作會遇到的問題,說穿了就是不斷的改寫 command,try command,確認結果是否符合預期!

雖然還不確定 AI 對 Verilog 的掌握度?但這樣的工作模式,直覺就是很適合用 Claude Code 來執行。

不過 AI 在我們這行有資料安全性的問題,故也不太可能用 AI 來幫助工作。

針對一些較複雜的問題,比如我最近完成的,感覺就真的要當作 Coding 來處理。

這時問題就來了,我們的 script 穿插了 EDA 指令以及正常的 Tcl command,如果只是不小心 Tcl 語法寫錯,往往都要等到 EDA 執行到該階段才會報錯,一來一往真的很浪費時間。

而我個人最討厭的就是浪費時間。

我想,我應該要花點時間把一些 EDA command 轉成自己的 Tcl procedure,這樣一來,如果只是要檢查純 Tcl 語法,我就不需要靠 EDA 來執行。

雖然這只能解決我一部分痛點,很多東西,我還是需要 EDA 執行,才能得到真實電路的回傳結果。

沒魚蝦也好,不然我也不知該怎麼辦了?

還是來聽萬芳的歌好了XD

2026年4月3日 星期五

奉公守法錯了嗎

從小媽媽告訴我,寫程式要註解。

我就說,奉公守法錯了嗎XD

從昨天到現在就跟客戶的一個需求奮戰,這個需求其實上星期客戶又提了一次,但我真的抽不出時間,只好在昨天開始動工。

這個需求有些細節還未知,比如 bus 訊號名稱,於是我只好能用變數包住的都先用變數包住,之後需求變更就只要更動這些變數即可,算是幫我留條後路,也能拿去別的 block 使用。

沒想到一個小小的註解,也能引發 EDA 錯誤。

這個錯誤的原因居然是因為我寫了註解,不過嚴格來說,是我對 Tcl 語法還不熟導致。

一天上班只有八小時,七個小時半都在忙,實在沒辦法精進 Tcl 語法。

不囉嗦,直接看 Code。


剛突然想到,拿去問問 AI,看是否能看出些端倪?

忘記把註解拿掉,問 Gemini 的結果做不得準,但跟 Claude 一樣,都會給出額外的建議。

下面是 Claude 的回答。



還好有學到一些東西,也不枉我這幾個小時的辛勞,這星期都還沒打電動呀!

2025年11月16日 星期日

Tcl 一些備忘

最近又開始用 Tcl 做一些事,之後應該會一直更新這篇。

01. array 傳遞方式

簡單來說,分別用 array get 以及 array set 來處理。

array get -> list -> array set。


02. exec 外部程式,比如 grep sed 等技巧

避免 regex 跳脫太複雜,把 regex 用 { } 包住即可。

03. Tcl 8.5 dict + upvar

從 Tcl 8.5 開始,有 dict 可用,配合 upvar 使用,array set 也可以比照辦理。


04. { } 裡面可以有 { },不需要跳脫

exec echo 123 456 | awk {{print $1}}

05. 使用 grep 最好的方式

最好的方式就是不要用 grep,改用 sed。

因為 grep 天生遇到沒有匹配的情況會回傳 1,這會導致我們需要對結果做些事,才不會顯示 child process existed abnormally。

2025年4月26日 星期六

快速 parsing 檔案

以前需要臨時對檔案 parsing,一般來說我都會選擇 C 語言,因為這是唯一一個我不需要 google 就可以寫完的程式。

年紀大了還要編譯有點懶,再加上需要做這件事的時候,往往還需要搭配 regex。思來想去,想用一個簡單一點,語法好記的語言,於是便決定以後就用 Tcl 了。

bash script 好是好,但是速度有點慢,不知道是不是我剛沒寫好的關係?

set input "c:\\Vim\\vim91\\autoload\\netrw.vim"

set infile [open $input r]
fconfigure $infile -encoding utf-8

set func_pattern {^fun(\s|!)+ (.*)\s*\(.*}
set end_func_pattern {^endfun}

while {[gets $infile line] >= 0} {
    if {[regexp $func_pattern $line >= null f_name]} {

    } elseif {[regexp $end_func_pattern $line]} {
    
    } elseif {[string first "winrestview" $line] != -1} {
    
    }
}

剛剛希望找到 Netrw 所有呼叫 winrestview 回復 cursor position 的地方,很可惜,確認了幾個地方,但都不是對的地方,我到現在還找不到開啟右邊視窗後,回到原本 Netrw 瀏覽視窗的地方,到底是哪個函數破壞了我自己回存 position 的意圖?


我甚至把所有的 winrestview 都註解了,還是解不掉這個行為,我開始懷疑我的方向錯了?

2025/04/26 晚上更新


想要把之前註解掉的語句回復,使用上面 Tcl 語法,遇到 UTF-8 編碼,還是有少數幾句會有問題,這個問題先記錄起來,以後有空再回來確認。

後來想到可以使用巨集來回復,只要先設定 set nowrapscan,不要讓搜尋從頭開始,這樣就可以設定下面巨集了。ˊ

01. / winrestview 先 trigger search
02. gg 回到第一列
03. qq 開始記錄
04. n^x<ESC>j
05. q 停止紀錄
06. 100@q 執行 100 次巨集,數字要比所有的 winrestview 次數還要多。

04 巨集最重要的是最後面的 j 也就是跳到下一列,這樣按下 n 才會往下一個 winrestview 前進。

2025/04/27 更新

既然 Vim 巨集這麼好用,今天一口氣在每個函數入口加上 echom function_name 的功能,但居然都不是呼叫 winrestview 的函數被觸發而是 s:NetrwInsureWinVars。

現在只能猜測是 Netrw 有去動 buffer 或是什麼我不知道的東西?

有時在想,自己寫一個 directory explorer plugin 會不會比較簡單?

Tcl global error

之前用 Go 重寫 tool 時,改由自己得到 Top module name,不再從 command line arg 取得。

覺得這樣也蠻方便的,故將 Tcl code 也比照辦理。

由於之前的 Tcl code 遞迴用很深,故我很多參數都是拉出來變成全域變數,就只是忘了在 proc 中加上 global var 宣告,害我昨天找了老半天XD

2025年3月13日 星期四

tcl performance

原本我的 netlist_treeview 是要拿來當我的 gui tool 用,後來為了 report 加了一些額外的功能。

當遇到比較多 instance 的 netlist,居然要跑個 5 ~ 6 分鐘,這樣的速度不是很能接受!

於是做了一些修改,記錄一下自己的心得。

01. 減少 function call

原本的功能都是寫成函數,增加不同類別的檢查只要改變參數呼叫原本的 function 即可,為了加速,我把原本的函數複製了 3 份,貼在原本各自呼叫的地方,雖然程式碼很醜,但快了 20 幾秒有。

也減少了一直重複呼叫 array get 或是 array set,因為要將 array 傳進 proc 似乎要先 list 化?沒有直接傳進去的用法。

02. 遞迴函數減少參數傳遞,改用全域變數。

這樣的改動對於加速也是有感的,大概可以再快個幾秒,就不知道是否是雜訊就是了?

03. 減少 lreplace lappend 的呼叫

改完後感覺有時還變慢?不確定是不是為了這個,反而在遞迴中增加參數傳遞導致,但至少目前這個遞迴函數的行數比原本少了一半,看起來舒服多了。

另外,可以透過 override proc 和 trace 來將原本沒有計時的函數呼叫自動增加計時功能,但這樣一來執行速度會變得很慢,我要跑 5 ~ 6 分鐘的 case 根本沒辦法順利 profile 。

下面是網友的範例程式,記得要在程式結束前自己呼叫 TimingProfilerDump。


2025/03/14 更新

果然跟我想的一樣,問題是出在遞迴上,加上下面 command 就可以解決問題。原本要跑 5 ~ 6 分鐘的程式,現在只要 15 秒,感覺合理多了。

interp recursionlimit {} 100000

另外,參考網友 callback 方式,改了一版自己的 monitor 程式,整體來說也比較好懂。

一般來說,遞迴函數一定會帶參數,這樣才能有條件來結束遞迴,我的 monitor 也能支持遞迴記錄。

array set ::debug_state {}
set fd [open "debug.log" w]

proc  monitor {args} {
global debug_state
global fd

set proc [lindex [lindex $args 0] 0]
set index [lindex [lindex $args 0] end]
set type [lindex $args end]

set key "${proc}@${index}"

if {$type == "enter"} {
set debug_state($key) [clock clicks -milliseconds]
} else {
set end [clock clicks -milliseconds]
puts $fd "$key took: [expr {$end - $::debug_state($key)}]"
}
}

rename proc _proc
_proc proc {name arg body} {
_proc $name $arg $body

trace add execution $name enter monitor
trace add execution $name leave monitor
}

proc test {index} {
if {$index >= 5} {
return
}

after 500
puts "in test_${index}"

incr index
test $index
}

test 1

2025/03/14 晚上更新

雖然要跑 5 ~ 6 分鐘的 design 可以透過調整 stack 參數,變成只要 15 秒。但有一個需要跑 99 秒的 design 卻還是要花差不多的時間?

目前只能確定,還是因為多了一個要檢查的 cell 類別,導致在遞迴函數裡,需要多呼叫 4 ~ 5 萬次導致,如果拿掉這個 cell 類別的檢查,就又會回到 10 幾秒的水準。

之前猜測遞迴耗時的原因是因為動態調整 stack size 的緣故,而這個所謂調整的演算法一次增加的幅度應該不多,這才能解釋遇到過多的遞迴呼叫導致時間不合理增加。

改天還是要看看 source code 才能得知。

2025/03/16 更新

我越想越覺得不對?這個參數看起來超過限制就是會報錯,跟我的情況似乎搭不起來?

我開始懷疑我在耍白癡了?我的 netlist_treeview.tcl 會因為要檢查的 cell 類別檔案在不在而決定要不要檢查,感覺是影響我變慢的那一個 cell 類別檔案當時並不在同資料夾內,導致我以為我的更動有效的緣故?

明天去公司的第一件事要來檢查一番。

2025/03/17 更新

果然是我耍白癡,沒有把 sdff.txt 放在同一個資料夾,害我誤以為 recursionlimit 可以解決問題。

不過問題來了,那到底是哪邊有問題?

雖然早上停等紅燈,無故被推撞,導致一整天心緒不寧XD

終於還是在決定下班前請個 2 小時假去醫院做個檢查前找到問題。

在記錄問題前,先記錄一下相關數據。

我這個 netlist 裡面的 instance 大概有 111 萬個,sdff 全部則是 28 萬個,如果不檢查 sdff,在遞迴函數內全部只需要 5 秒鐘,比原本的 6 分多鐘少了很多。

之前做了一些調整後,最好時可以壓在 5 分鐘內。

OK,這個問題的本質是我有一些 Tcl Array,因為我在遞迴檢查時,如果符合某個 cell name 我要記錄他的 hierarchy 資訊,原本我的寫法是:

set tmp myarray($cell_name)
lappend tmp $my_hier_info
set myarray($cell_name) $tmp

原來我可以直接這樣寫就好了。

lappend myarray($cell_name) $my_hier_info

如果是這樣的話,全部就只要 5 秒鐘就好。

這樣改可以生效是因為我減少了很多不需要的賦值和設值動作。

2025年2月26日 星期三

netlist_treeview

沒想到我的 netlist_treeview 還有隱藏版功能?

顧名思義,我這支 tcl 程式主要目的是用來瀏覽 netlist 用,但 module 或是 instance 的 regex 語法不管是 RTL code or netlist 其實都是一樣,故他其實也是可以開啟 RTL code 無誤XD

目前只有一個問題,我的 instance regex 語法本來就會避開單行註解,故這部分沒有問題,不過當 instance 是在多行註解中,之前 parser 為了快速處理,連我另一支用 Python 寫的 netlist parser 處理單行的機制都沒有,故我沒辦法避開這樣的情形。

查了一下 Standard 2005,還好他不允許巢狀註解,故要快速處理就很方便了。


順便查了一下 Standard C11,同樣也是不允許巢狀註解。


剛好想到為什麼之前買的 C11 這麼便宜?原來有這樣的疑問不只我一個,我們可以在這個討論串找到解答。

簡單來說,INCITS/ISO/IEC 9899-2012 是美國內部採用的標準,所以賣得比較便宜,當初不知標準險惡,以為台幣兩千是正常的(我以為這樣已經很貴了XD),直到最近買了兩份 IEEE Standard 噴了兩萬,我才知道以前的我還是太嫩了XD

2025/02/26 更新

看似簡單的東西,沒想到也會犯下低級錯誤,還好只花了幾分鐘就想到了XD

set is_multi_comment 0

if {[string first "*/" $line] != -1} {
    set is_multi_comment 0
} elseif {[string first "/*" $line] != -1} {
    set is_multi_comment 1
} elseif {$is_multi_comment == 1} {
    # do nothing
}

不小心把最後一個 elseif 放在第一行,故永遠不會脫離。

另外,下午也開始嘗試處理 clock tracing,果然跟我想的一樣麻煩。

不先規劃好遞迴中止條件,也沒先歸納出 clock path 的一些態樣,真的很難把程式寫好。

還好我不趕時間XD

2025年1月19日 星期日

tcl 函數呼叫原則

上上星期找到一篇文章,內容是關於 tcl 常見誤區,可惜存在辦公室電腦,家裡 Chrome 並未同步。

其中有一段是在敘述如何決定何時傳給 tcl 函數的變數,前面是否要加 $?

大原則是這樣:

01. 如果要改動到原變數的值,則不要加 $。
02. 如果需要原變數內容的時候,則加上 $。

目前看來大概可以解決 8 成以上的困擾。

目前用過的函數,除了 info,array 相關,lreplace 是例外。 

2024年12月29日 星期日

tcl/tk

真的很難搞懂 TCL 的邏輯XD

雖然想要升上 LV 99,但該做的事還是要做一下。

為了得到 netlist hierarchy 的資訊,上上星期拿之前寫的 netlist parser 產生出 XML 檔案,再用 XMLNotepad 迂迴的達到我要的目的。

雖然步驟多了一些,但有現成的還是用現成的就好。

美中不足的是還少了一些功能:
01. 列出選中 item 的 hierarchy module 資訊。
02. 點選選中 item 後,開啟 gvim 查看 code。

所以還是要寫個 GUI 才能達到此功能。

考量到工作站安裝軟體不易,試了一下,tcl/tk 是可以順利執行的,於是便決定用 tk 來搞定。

這個星期看 IP 文件累了就改一下 code,這兩天放假有空也改一下 code,終於在剛剛完成全部功能。

雖然還有幾個小 bug 待解,但終於有了一個初版可用,其他就再看看吧。
01. 開啟 gvim 後,如果不關掉 gvim,tk window 會卡在那。
02. right frame width 不受控制。
03. font size 用法可能還要找資料。


2025/01/04

之前自己耍白爛,誤會了 tcl 檢查 array key 是否存在的作法,誤將 key 轉成 list 再用 lsearch 的方式,這也是導致讀取真正 design netlist 建 tree 速度過慢的元兇。

改了之後,原本一個要 5 分鐘,一個要 10 分鐘的 IP netlist,現在只需要不到 15 秒就可以搞定。

又拿了一個目前為止我碰過最大的 design netlist,也只要不到 30 秒就可以建完 tree。

沒辦法,tcl 的官方文件閱讀體驗很糟,不管是 3 個中的哪一個,真的都不是給人讀的XD

也許是我英文太爛了吧XD

2025/01/04 再次更新

原來這麼簡單,只要這樣就可以搞定 exec gvim 卡住的問題,其實嚴格來說不算卡住,因為該函數就是要等程式執行完畢。

反正我是用 git bash 裡面的 tcl/tk 環境,這樣不管 Windows or Linux 都可以一併解決此問題。

2024年9月6日 星期五

Tcl 變數邏輯

繼昨天了解 env var 如何判斷後,今天拿了之前買的一本 Tcl 紙本書去辦公室,放在辦公室應該比較有機會翻閱?

我在工作站建了兩支檔案,test.csh 以及 test.tcl,把練習過的語法寫在裡面,以後要找也方便。

不過,可能是看得還不夠多,到現在還是不太能抓到 Tcl 變數在不同 command 下,到底何時要加 $?


就拿常用的 for loop 來說,incr i 就不需要加 $,但是 llength 和 lindex 後面的 list 變數就要加 $,似乎不能單純看變數是否要改變來決定是否要加 $,又或者是 list 有它自己的規則?

2024/09/07 更新

昨天晚上想睡了,回頭看好像自打嘴巴,感覺以這裡來說,因為 incr 有改變值,所以才不加 $,好像還蠻合理,但 info exists command 確實是不用加 $,我印象中紙本書前幾頁也是有不用加 $ 的 command?

2024年9月5日 星期四

認真過每一天

下班前一個百思不解的問題,沒想到在洗澡時就讓我無意間想出來了?

前幾天在中央集權的框架中加入了一個地方自治的機制,雖然改動的不多,但我還真的蠻佩服我自己,當初只是為了不要大改別人家的專案才這樣設計,沒想到居然還有保留彈性的副作用,差點都以為自己是天才了,誰說一定要善用設計模式才是高手,只要認真過每一天,每天勤練感謝的正拳,總有一天,我們也能成為獵人協會會長XD

這個問題就是,雖然加入了地方自治的機制,但因為 DC license 有限,我也沒時間測試原本框架的功能是否正常,早上跑完自己想知道的頻率數據後,下午想說就來跑看看原始流程吧,沒想到還是出事了!

Tcl 變數其實跟 C 語言很像,使用前要先宣告。

前天為了兩者兼容,加了一段 if else 語法,下面是該語法示意:

if {"$::env(variable)" == "1") {
    set file_name "file_name_${varable}.log"
} else {
    set file_name "file_name.log"
}

殊不知當 variable 不存在時,此段語法會報錯,但不會影響 DC 繼續往下跑下去。

只要工作不會中斷,一切都好辦,將 else 往上提變成預設值,因為地方自治一定會有該變數,故不會有問題,而當跑中央集權框架時,因為有著預設值的關係,故變數不存在報錯也無妨。

雖然無妨,但那 Error 的字眼就掛在 DC log 中也是很礙眼,故下班前有稍微找一下如何檢查 Tcl 變數,但一直不懂為什麼要拿掉 $ 符號?

原來 info exists variable 的用法,variable 本來就不用加上 $,既然我們要檢查的是 env,當然就要從 $::env(variable) 變成 ::env(variable) 才行。

2024 week 36 新玩意

01. 跳板工作站顯目提醒

前幾天自己耍笨,以為工作站沒有安裝相關軟體,又麻煩老闆重傳一次檔案XD

但這樣下去不行,下次搞不好又會忘記跌股?年紀大了,不能依賴自己的記憶。

原本想要加一個 dispatcher,就是 shell 收到指令,都要先攔截進到這個 dispatcher,就可以趁機檢查工作站名稱並提醒自己,但不知道有沒有這種東西?

還好昨天突然想到可以用 prompt,就是那個 shell 提示。

Bash 要設定 $PS1,C Shell 則是要設定 $prompt,兩者顏色語法好像也不一樣?


02. DC 獨立男人

DC 可能因為一直改版,有些指令參數跟以前不一樣,一般都是進到 dc_shell,再用 man 指令查詢。不過,部門只有一套授權,所以當在 log 發現 Error 時,只能等到 DC 跑完才能查XD

前天因為沒什麼睡,昨天下午在完成老闆交代的任務後,就不勉強自己繼續看 Spec,而是上網查詢一下 csh 相關知識,終於讓我無意間看到好東東

alias dcman "man -M $SYNOPSYS/doc/syn/man"

之後就可以直接打 dcman create_clock 查詢了。

03. DC check tcl 語法

也是從同一個網站看來,前天加入自動化 build 不同參數 DC 時,很多錯誤都要等到執行到那邊才會知道,這也是將流程拆分成不同檔案的缺點,無法一目了然的看到並發現錯誤。我們可以用 DC 自帶的 tool 來檢查,只是不知道能不能從進入點 tcl 一直檢查到所有 tcl 檔案?早上進辦公室後在確認一下。

dcprocheck xxx.tcl

2024年9月3日 星期二

天下大勢,分久必合,合久必分

之前將某 VLSI Synthesis 專案架構加到某個 Open Source 的框架當中,當時心裡就想,這樣其實會失去彈性,我個人是比較支持原本那樣的架構,不要走中央集權的模式。

果不其然,下午有個需求想知道某專案的上限在哪?這樣的需求還是要透過自動化處理比較 Smart,還好之前是用最低限度修改的方式將專案加入到框架當中,稍微想了一下,複製了幾個檔案,為了不要大改之前的東西並重複利用 config.mk 原本的內容,在某專案根目錄又加回了 Makefile,方便我在根目錄中觸發自動化流程。

此次修改最麻煩的是 C Shell 一些語法撰寫,我想一般人應該都比較熟悉 Bash,在不斷的 Google 下,終於順利將自動化流程跑起來,但也花了我一個半小時XD

本次快速重點

01. 不管是 Tcl or C Shell 變數都可以用 {} 包住,避免串接時失敗。
02. @ 是 C Shell 用來執行數學運算。
03. bc 是用來處理浮點數並格式化。


小專案單次合成雖然很快,但也要跑將近一個小時,本想晚上回到家吃完飯再用 VPN 連回公司確認一下是否有照我的想法一個接一個的自動化跑下去,無奈公司電腦網路在休眠時常常會無端斷線,只好明天再來看看結果如何?

經過這次事件,明白到自己還是缺少 C Shell 以及 Tcl 相關書籍,趕快買了 2 本書壓壓驚,Tcl 就算了,C Shell 的書還真是難找,只好找了一本快 30 年前的書XD

不得不說,O'Reilly 出版商真是有情有義,在 Google Play 買的書都沒有 DRM 保護,直接就可以下載,也算是節省了我一些時間。

有沒有人可以告訴我使用 Bash 跑商業 EDA tool 到底會不會有問題呀?我實在不想繼續考古下去了…

2024/09/04 更新

作夢都夢到自己在改 C Shell script,有沒有這麼可怕XD

害我半夜三點起來就沒睡了,趕緊把最近買的五本書使用自己開發的 kobofileserver 上傳到 Kobo Elipsa 電子書閱讀器上,然後就沒然後了XD

一直到剛剛都還在看著 PTT 追新聞,我也算是有情有義的男人吧XD


感謝網友 usimon 建議增加多檔上傳功能,原來這功能還真是好用,可能是我以前只會循序邏輯的執行事情吧XD

難道這就是傳說中的單核單執行緒先佔式多工老男人腦XD

2024/09/04 到公司後更新

恨呀,果然有問題,偏偏昨天 VPN 連不回來。

昨天犯了一個錯誤,都怪該死的 DC command 語法,害我不小心中招XD

{$clock} 因為在 Tcl 裡面,{} 就跟 Bash 的單引號一樣,是當純字串的,想單然爾,我昨天的心力都白費了。

解決方式也很簡單,跳脫大小括弧即可。

\{$clock\}

但是人生就是有那麼多 But,此招對 DC 這個聖鬥士無效,它就是需要 {},無奈之下,只好將該 command 改用 echo 自動化產生 Tcl script。

為了這個臭蟲,早上雖然提早來公司,但又花了我一個小時 debug,今天真不是我的天呀!

2023年12月28日 星期四

Some tips in Makefile - 001

今天開始接觸未來可能的工作流程,雖然只是練習用,但也算是有點感覺了。

主管還很貼心的提供了一個小測驗,由於我對 Tcl 或是 Makefile 都只是略懂,一開始先花點時間整理脈絡,直到看到主管說的關鍵字後,便開始主攻這個測驗。

雖然這個測驗有點像腦筋急轉彎?但在一步一步分解問題後,最後還是能找到解法,但我也花了一個小時多有,還好在吃飯前順利搞定。

簡單快速紀錄一下,今天學到的東西XD

01. Makefile 變數賦值

= 在使用到變數時展開。
:= 宣告變數時就展開。
?= 變數為空時才給值。
+= 將值附加到原本變數。

02. .DEFAULT_GOAL

如題,此變數為 GNU make 的一個特殊變數,有設定這個,假設 make 後面沒帶 target 就會以這個變數為主,而不是檔案中找到的第一個 target。

03. $$0 in awk command of Makefile

原本 awk 取原始字串是 $0,但在 Makefile 中 $ 有特殊用途,故在 awk 指令中,需要多加一個 $。

另外,如果想印出 $@,則應該要這樣寫 @echo \$$@。

04. env variable in Tcl

puts $::env(OS),此指令的意思是印出 OS 這個環境變數,env 本身是 array,array in Tcl 是關聯陣列。

05. call proc in some Tcl files.

source $::env(SCRIPTS_DIR)/report_metrics.tcl
report_metrics 6 "finish"

report_metrics.tcl 檔案中都是函數,這樣就可以呼叫該檔案裡面的 report_metrics 函數。

06. /usr/bin/time -f '%E %MKb' sleep 5

time 是用來記錄執行指令的時間,不同的 format 可以顯示不同的資訊,上面表示記錄 sleep 5 執行的時間及最大記憶體使用。

07. export QT_QPA_PLATFORM = offscreen,console 執行時就不會報錯。

08. $(shell command -v ls)

執行 command 查詢 ls 指令。

09. awk, mawk, gawk 三個是不同的程式

awk 'match($$0, pattern, array) 是錯的,因為這是 gawk 才有的語法,awk 有 match 但不能將 pattern 裡面抓到的 group 資訊存到 array。