pretty code

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

2024年9月13日 星期五

十三號星期五

這個星期都在跟某個 EDA 奮戰,明明照著文件下了幾個 debug command,結果都不符預期!連想要透過 check point 存檔進入 GUI mode 也無法隨心所欲。

還好我沒聽文件在唬爛,使用快失效 command 的 session 指令存檔進入 GUI mode 以避免重複執行的等待時間。

由於之前還不知道有這兩個 command,所以這星期至少打了 10 幾次 make 有,打久了對 make 每次都有 Error 也不免感到困惑?

原本以為是不是因為 makefile 是從別人的專案來的,故裡面有地方沒有用到 tab 字元?後來拿掉沒用的 target 後情況依舊,我才恍然大悟跟 makefile 本身無關。

網路上查了一下,那是 make 在執行指令時指令本身回傳的,也就是 EDA tool 回傳的。

剛寫了個測試程式試了一下,果然是這樣沒錯,現在只差不清楚為什麼 $? 永遠回傳 2 就是了?

以我的例子來說,make test 執行我的 test_make 時,因為不是回傳 0,故其實 make 也不會往下執行了,因此為了避免 make 不如預期浪費時間,畢竟 EDA 隨便都要跑一個小時以上,我的建議是在 makefile 要執行的指令前一律加上 -@,另外在 makefile 裡面要印出 $?,記得要變成 $$?

- ignore error
@ not display command


2024/09/14 更新

早上不死心繼續 Google 了一下,看到一篇之前就看過的文章,先前可能被 EDA 搞得很累,沒有很認真看那篇文章,但至少是從那篇文章知道 Error Code 是從指令來的。

原來 $? 之所以永遠回傳 2,那是因為對 GNU make 來說,這就表示 make 執行其他指令時有問題,故 make 遇到有錯一律會回傳 2

所以在執行 Shell Script 時,我們只需要關心 return code  是不是 0 就好了。

當然如果你的 Makefile 是在編譯執行檔,Error Code 還是多少有點用處,不過除錯這件事嗎,只能 case by case,沒有一個放諸四海皆準的道理。

另外,昨天建議加上 -@,睡過覺起來覺得似乎也不太對,約耳說,要讓錯出現在錯的地方,忽略它繼續往下走,其實也沒什麼幫助就是。

2024年5月28日 星期二

2024 week 22 新玩意

關於 Verilog 好像有一些領悟,但對於 timing 的 coding 還是覺得說不上哪裡怪?希望之後能有機會補充這些知識。

01. grep in Makefile

對於 grep 來說,有搜尋到東西 status 是 0,沒有則是 1,也就是會反映到 $? 這個 shell 變數。

如果在 Makefile target 中有呼叫 grep 做些事情,如果是找不到,Makefile 就會報 Error,如果這個 grep 只是做檢查用,記得加上 "-grep",這樣 Makefile 便會忽略錯誤繼續執行。

02. \n in VIM

對於 search,\n is \n。
對於 replace,\n is \r。


03. Flexlm Server

Flexlm 是 EDA 廠商使用的授權管理軟體伺服器端,EDA tool 利用此機制檢查是否有授權,一般使用者會設定 License Variable 為某台主機,這樣就可以使用該套軟體。

2024年3月30日 星期六

2024 week 13 新玩意

01. VIM 果然好用,以後不需要買第三套 UltraEdit 了

果然學習新東西需要配合環境!

新部門需要在工作站上工作,只能使用 VIM,也趁此機會在本機安裝了 gvim,終於可以好好學習了。

qa   開始錄製巨集到 register a,再按一次 q 結束。
使用 @a 使用巨集,使用 @@ 使用上一次使用的巨集。

:tabe + filename 開啟檔案到另一個分頁,gt 依序切換分頁。
vim -p file1 file2 將檔案分別開啟到分頁上。

:new 水平分割視窗
:vnew 垂直分割視窗

ctrl + w + w 切換視窗

02. Makefile 重複 target

Target1 : dependence2

Target1 : dependence1
        xxxx

執行順序是 dependence1,dependence2,xxxx。

第一個 Target1 只能有相依性選項,該 Target 下不能再執行其他指令。

03. OpenROAD-flow-scripts hierarchy synthesis

當設定 SYNTH_HIERARCHICAL = 1 時,其 Makefile 就是走 02 的寫法,故其實會做兩次 synthesis。

第一次是 synth_hier_report.tcl,第二次是 synth.tcl,除了最前面會設定 hierarchy module(檔案 mark_hier_stop_modules.tcl 在 flow/objects 裡面,跟 abc.constr 同層)。

我目前 trace 的結論是第一次的結果並不會傳遞給第二次,至少從 tcl script 看不出來。

這就是一個很奇怪的點?除非 yosys 結果是分享到記憶體空間,不然我看不到傳遞的地方。

另外,當 abc command 帶 -nocleanup 時,abc-temp-dir 不會被刪除,且資料夾位置會從 /tmp/yosys-abc-xxxxxxx 變成 flow/_tmp_yosys-abc-xxxxxx,裡面會有相關檔案。

design - config.mk 中的 LATCH_MAP_FILE 不設時,當合成的 netlist 有 LATCH,就會以 general 的 $_DLATCH_N_ or $_DLATCH_P_ 代替,並非像 document 說的可以不用設。

constraint 檔案要照文件格式,指令用小寫,不然 period 會無法 parsing 成功。

2024/04/01 更新

終於搞懂 hierarchy 的流程了!

第一次做 yosys 是為了得到第一次 general synthesis 的結果,目的是知道各別 module 的面積,配合 Makefile 裡面的 MAX_UNGROUP_SIZE 變數,當各別 module 面積小於 MAX_UNGROUP_SIZE 時,此 module 會不做 hierarchy synthesis,改做 flatten synthesis,好處是可以得到更好的最佳化結果(相對 synthesis 時間會比較久)。

但因為 MAX_UNGROUP_SIZE 預設值為 0,故其實沒有必要做第一次 synthesis,取而代之是要想辦法得到真實的 module name,因為在設定 "setattr -mod -set hierarchy 1"  時,是使用 yosys 過一手後的 module name。

要得到 module name 也很簡單,hierarchy -check -top top_module 後,使用 stat 或 ls 就可得到。

2024年1月4日 星期四

Some tips in Makefile - 003

01. $(XXX:.lib=_.lib)

WRAP_LIBS = abc.lib def.so
$(info $(WRAP_LIBS:.lib=_.lib))

將 XXX 變數裡的 ".lib" 字串變成 "_.lib"

$(patsubst %.lib,%_.lib, $(WRAP_LIBS)))

也可以用 patsubst 函數,但 %_.lib 前面不能有空格,否則被取代的字串前面會多一個空格。

2023年12月29日 星期五

Some tips in Makefile - 002

01. export 

ABC ?= abc

上面表示如果 $(ABC) 未定義,則值等於 abc。

我們可以在呼叫 make 前,在 Shell 下 export ABC=ddd,則 Makefile 中就可以看到被定義成 ddd,另外一種方式則是 make ABC=ddd xxxx_target。

如果在 Makefile 中寫成 export ABC ?= abc,則這個 $(ABC) 可以傳遞到其他的程序。

假設是這樣執行 $(shell ./test.sh),即使用了 export,test.sh 中也看不到 $ABC 這個變數,這部份待確認?

順帶一提,在 Shell 下使用 export 則是將變數傳給其他的程序,比如另一個 shell script 或是執行檔等,像 C 語言可以用 getenv 取的環境變數。

02. 只看 make 執行過程,不真正執行

make -n 即可。

03. 使用 wildcard, abspath, notdir

像是在 Makefile 印出當前目錄下的所有檔案但不包括目錄本身,如果要絕對路徑則是用 abspath 取代 notdir 即可。

$(foreach log, $(notdir  $(wildcard ./*.log), $(info $(log)))

另外,foreach 語法如下:

$(foreach n, list, text)

list 是一串用空白分隔的字串,n 是當前取到的單一字串,text 則是你要做的事。

04. $@, $^, $<, $?, $*

有一 rule 如下:

main.o:    main.c def.h
            gcc -c main.c

假設 def.h 有更動過。

$@ = main.o  --> target
$^ = main.c  def.h  --> dependence
$< = main.c  --> first dependence
$? = def.h  --> changed file
$* = main  --> the primary name of target

故 gcc -c main.c  可以寫成 gcc -c $<。

另外,假設 target = all,則 $* 是空字串,因為 all 沒有副檔名。

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。

2008年9月2日 星期二

makefile 概述



如果 make 後面不指定 makefile name(gnu make use -f)
則預設使用當前路徑下的 makefile。

如果 make 後面不加 target
則預設去找第一個(本例的 test)
故只會印出 Just Test 的字串。

一般來說會將 all 擺在第一個
也就是預設 make 是做 make all。

make all 的順序:
1. 先找 mytest 的 target。
2. 做 mytest 前必須要有 main.o, TestDef.o。
3. 找到 main.o 的 target。
4. 做該 target 的事。
5. 找到 TestDef.o 的 target。
6. 做該 target 的事。
7. 最後做 mytest 要做的事,編出 mytest 的執行檔。

一些符號的意義:

- 表示忽略錯誤
@ 表示不印出訊息

以下來自 "http://www.study-area.org/cyril/opentools/opentools/x1176.html"

%.o: %.c

%表示所有相對於後面先決條件的檔名的意思,他不是*,因為他有一對一的相對應關係,foo.o 就要找foo.c。

foo.o: foo.c foo.h

$@ -- foo.o
$* -- 這個只有在內隱規則中有用。表示樣式或副檔名規則中對應到的字串。
$< -- foo.c
$? -- 同一個規則的所有先決條件名,但是只有原始程式碼改過的比 obj 檔新才會符合,也就是比 target 還新的先決條件檔案。
$^-- 所有先決條件,但是有的 make 像 solaris make 可能不認得這個自動變數。