pretty code

2024年7月31日 星期三

2024 week 31 新玩意

01. SRAM

M x N

M depth,  M words of memory.
N width,  bits per word.

SRAM 4096X96

wire [95:0] D;
wire [95:0] Q;
wire [11:0] Adder;
reg [95:0] ram[4095:0];

 2^12 = 4096, 12 is the address line width.

Column mux is used to reduce the length of row (4096), it can reduce the area of SRAM ( 讓 SRAM 長寬不要差太多,也可以增加效率 ).

SP means single port SRAM, the port can be used to read or write function.
    clk, addr, en, wen, data.    

2P means two port SRAM, one port for read, one port for write.
    clk_r, clk_w, addr_r, addr_w, en_r, en_w, wen_r, wen_w

DP mean dual port SRAM, two port for read or write function.
    clk_a, clk_b, addr_a, addr_b, en_a, en_b, wen_a, wen_b
    you can read or write at addr_a or addr_b.

02. \d is for PCRE, not for basic regex.

We can use -P when we use grep. 

還好我都習慣使用 [0-9],但偶爾會突然想用 \d,每次都會忘記是 for PCRE。

2024年7月15日 星期一

關於筆記軟體之心得

除了 10 幾年前考公務員時有認真讀書做過筆記,從小到大幾乎沒有任何做筆記的印象?

前年工作上為了學習 AI 作 defect detection,開始嘗試用 Evernote,後來因為轉研究結構光都是看 github 專案和一小部分論文,故也沒繼續做筆記了,已經忘了使用體驗的感覺了。

最近一本塗鴉隨筆用的 13K 筆記已經快寫完了,為了將這半年的一些重要東西記錄下來,便又開始了我的筆記之旅(之前每換一本 13K 筆記本,只會將重要頁面拍照留存)!

我選擇的是 Obsidian,標榜雙向連結以及卡片筆記盒的精神,看看兩年多前買的《卡片盒筆記》一書,終於可以開始學習了(翻開書本)? 

Obsidian 使用 Markdown 語法撰寫筆記,這對我來說是個好處,也是時候開始學習 Markdown 了,這就跟 Vim 一樣,日常生活中不常用的話,永遠就只會基本操作!

從上星期四開始安裝後,到今天已經把紙本筆記本重要的事項全部數位化完畢,感覺還蠻合我的胃口!

再試用一陣子便要訂閱了,畢竟我不算是個人使用,就試用到這個星期五好了,我的下一個筆記軟體應該就是它了!

Obsidian 好處

01. 使用 Markdown 語法。
02. Local Storage。
03. 使用 Node.js 便可以撰寫 plug-in。
04. 剪貼簿貼上圖片後選擇另存圖片還算方便。

目前對我來說大概就是這些好處吧。


以後的使用模式應該會是這樣,一般知識以及沒有 PO 上網疑慮的我應該還是會放 Blog,畢竟這樣存取才方便;Obsidian 跟工作有關的我也不方便同步到 Google Drive,就讓它存放在公司電腦上。

至於以後換工作或是 blogger 收了,那些知識可能也都不重要了…

後記

其實我平常寫 Blog 的方式也算是雙向連結,有更新的部分則會寫回到原本的文章裡,至於另開新文章的則是會找到舊文章的連結並貼上到新文章裡。

2024/07/16 更新

裝了 Theme 後,筆記看起來有質感多了,最主要是比較容易區分小標題!

我們可以在筆記軟體中按下 Ctrl + Shift + I(大寫 i) ,便可以叫出開發者工具,方便我們找到 CSS Class 來修改。

CSS 檔案則是位於 /Vault/.obsidian/themes/XXX/theme.css

如果是沒有設定過的 Class,可以比照下面方法來設定。

--hr-color_x: 128, 128, 128;
--hr-color: rgb(var(--hr-color_x));

2024/07/18 更新

卡片的最小單位就是一則筆記,這是卡片盒筆記的基本精神之一。

這樣的好處是容易組合成各種不同主題,也就是 bottom-up 的整理脈絡。就像 Verilog top module 什麼 RTL code 都沒有,只有 initial different modules。

2024/07/26 更新

如果是已經結構化的資料,使用 sed 加上 Markdown 語法也是一件很輕鬆的事。

比如說我想將之前 DC 查過的 command 轉成一篇筆記,我先前簡報備忘欄裡的格式是:

Command
      The description of command.

sed -Ei 's/(^[a-zA-Z])(.*)/## \1\2/g' cmd.txt

使用上述 sed 指令便可以把 cmd.txt 裡面的所有 Command 前面加上 ## 標題符號了。

\1 對應第一個括弧,以此類推。

2024年7月10日 星期三

2024 week 28 新玩意

01. 工作站 grep

假設我要找 cell,但不要 .db 的檔案。

grep -r pattern --exclude="*.db"

也可以正向表列

grep -r pattern --include="*.lib"

至於為什麼要加上雙引號?那是因為整個指令傳給 grep 時,*.lib 會被 shell 轉譯過一遍,所以會造成問題,因此要加上雙引號或單引號。

不過照連結所述,當前目錄如果沒有 .lib 檔案應該是要沒問題的,我不確定是否是工作站 grep 版本過舊導致。


晚上用 Windows 11 WSL - Ubuntu 22.04.2 LTS 試了一下,確實是不用加上星號,看來是版本問題?


2024/07/12 更新

更精確來說,既然問題是出在被 shell 過了一手,那應該是 shell 版本的問題,工作站使用的是 tcsh,在我改用 bash 後,這個問題就消失了。

為了之後工作效率著想,以後不管是 glob or regex pattern,最好都用雙引號框住,才不會在急著需要做甚麼事的時候又出問題。

晚上在 WSL 裝了 tcsh 6.21.00,不加上雙引號仍然會有問題,開始懷疑是 tcsh 的 feature 了XD



02. Yosy 執行方式

Yosys 總共有好幾種執行方式:

Run directly
直接執行,手動下 command。

-c *.tcl ( refer to tcl command )
將指令寫在 tcl script 中,最前面要加上 yosys -import,才可以執行 yosys command。

使用這個模式的好處是可以用 tcl 語法,靈活性最大。

-s *.ys ( refer to script command )
將指令寫在 script 中,與 -c 差別在不需要 yosys -import 就可以執行 yosys command。

也因為不是走 tcl callbak,故整個檔案的解析都在 run_frontend 這個函數中。

yosys *.ys
同上,會在 run_frontend 中,執行 default auto command 並靠副檔名決定執行 script command。

嚴格來說上面兩個 run_frontend 執行的地方不一樣,這裡是在 while (optind < argc) 的敘述裡。

yosys xxx
因為沒有副檔名可供判斷,故在 run_frontend 中便會報錯。


03. 工作站 Shell

因為 EDA tool 緣故,大部分工作站預設的 Shell 都是跑 csh(tcsh)。但是自己寫的 Shell script,如果第一行沒有指定 Shell,則預設是跑 bash。

我想一般人應該都是比較熟悉 bash 吧?我不確定此行為是我們工作站獨有,還是 Linux 都是這樣?不過經我剛才在 WSL Ubuntu 上 22.04 實測,看起來未指定第一行會以預設 Shell 來執行。


04. alias 進階用法


雖然我後來才知道有 realpath 這個外部 command 可用,但當初想知道如何用 awk 達成此目的,也算在 shell script 中撞了一堆坑,故想要留下個記錄。以後凡事還是要先 Google,畢竟你的需求別人應該也早就碰到過了,很多事應該不用都自己來才合理。

話說回來,想要用 alias 包裝 command,遇到像雙引號或是 $ 這種特殊符號,就是用接續的方式來處理指令。

畫橘色線的是一個一個串接指令的字串,雙引號和 $ 是直接在 Shell 中,故要加上跳脫字元。

我這裡用的 shell 是 bash,tcsh 也是同樣的道理,差別在 alias 語法不是用等號而是空白。

2024/07/19 更新

晚上實測一下,realpath 無法接受 pipeline,故也不是萬能!

想要在當前目錄下找 Cell Library - realpath *.lib
想要用 grep 遞迴搜尋 Cell name - 還是只能用 awk 也就是這邊用的 alias ($9 改 $1 比較通用,有需要再用 awk 切一次)方式。

2024年7月8日 星期一

又是一週雜事紀錄

01. 無形 44 抗渦漩盾掉落

昨天拿弓馬跑了一下,掉了這個很難掉落的盾。

除此之外,打暗黑又掉了一顆喬丹之石,雖然先前我已經用數學機率搞定了XD

我目前有兩個結論:

a. 有些職業的東西,就是要某些職業比較容易掉落,像我都是靠標馬打到戰爭召喚用的權杖,分別打到過 +2 祝槌以及 +2 天拳,愛斯特龍、天堂之光、綠裝權杖也都是標馬打到的。

b. 超市確實容易出寶,三頂格利風都是在超市打的,分別是電法、弓馬以及天拳丁打到。

02. MFA 換手機須知

MFA 程式在換手機時,新手機登入時仍需要舊手機輸入驗證碼,不然你會陷入鬼打牆,永遠沒辦法登入 Office 365 相關服務,除非有在帳號輸入其他驗證方式,但貌似接聽電話驗證方式要另外收錢?

假設手機壞掉換機,還是要請公司 IT 幫忙重設。

03. Daily Money Android Studio porting

看了這裡才知道還有另外一個版本的 Daily Money,裡面提到有熱心網友已經改了可以用 Android Studio 編譯。

另外,原本作者也出了新版的 DailyMoneyOne,應該是用類似 Web 的方式通吃 Android/iOS,故舊手機似乎會變慢,有機會要支持一下原作者。

2024年7月4日 星期四

Kobo Expense 又不能用了

Kobo 網頁的工程師真應該要打屁股,CSS 語法一直換來換去,照道理不應該改 CSS 名字而是直接改實作才合理。

只是多了一個 bold 屬性就導致我的 Chrome Extension 又失效了。


決定以後都用我自己的 local 版就好,這樣修改也比較方便。

2024年7月3日 星期三

我果然是 C++ 白癡

想看的 EDA 文章都看得差不多了,今天下午想說來試試將 Python netlist parser porting 到 yosys command。

大概花了 5 個小時,才只完成 80 %,Python code 其實只有 701 行而已。

目前只剩下 save_netlist 相關 code 待移植以及修改 std::getline 呼叫方式。

不想用 namespace std 就必須多打好多 code(std::xxx),有些東西 Standard C++ 也沒有。

至少 regex, read_file line by line 有現成的可用,不過貌似 gcc std::regex constructor 很慢?待確認中。


2024/07/04 更新

早上改完 std::getline 行為後,原本以為可以順風順水,沒想到搞到 12 點多還是有一個莫名的 Segmentation Fault 問題。

下午動用了 GDB,還是看不出是死在自己程式碼的哪個地方,只能看到呼叫一堆的 std::regex 函數?

使用萬能 printf 大法,終於找到出問題的地方。搞到快 4 點多,突然想要 Google 看看,才發現居然是 std::regex 自己的問題,詳此處。 

簡單來說,要做 std::regex_search 的字串不能太長,不然 regex 因為使用遞迴實作,會有 stack 爆掉的問題,難怪 bt 指令看到的都是 regex 函數,Bug 回報的是 100 K 左右就會有問題了,最好的解決方式是改用 boost::regex。

而我手上的 netlist 居然會有 1.5 M 長度的 wire 宣告字串,還不只一條,難怪會死得一塌糊塗!

為了這個不是自己的問題,save_netlist 的功能都還沒 porting,只好之後再說了。 

順便記錄一下 C++ 與 Python 版的差異,為了快速驗證,直接將 netlist 檔案裡 3 條過長的 wire 宣告拿掉。

C++  - 106 seconds, 4G RAM.
Python - 255 seconds, 10G RAM, 離開 Python 約需 7 秒才能回到 shell 提示字元。

因為偷懶,我的 C++ 版本都還沒優化,果然 C++ 還是有其效能上的優勢,不過只是照本宣科 porting 所花的時間都快到 Python 開發時間的一半了。

2024/07/08 更新

早上花了快一個小時將 save_netlist 沒 porting 完的補完,實測結果 yosys C++ 大概也要花個 22 秒左右。

C++ 版本在 save_netlist 函數裡是直接寫檔,除了 instance 的是回傳字串再寫。

Python 版本則是得到一整個 design 字串再一口氣寫檔。

不確定 Python 處理好幾百 MB 的字串效率如何?這應該是一個可以再優化的方向(60 seconds vs 22 seconds)!

下午試了一下,事情跟我想的不一樣,Python 如果只是幾百 MB 的串接字串,一口氣寫檔似乎比一個字串寫一次還來的快,單獨寫的小程式測試結果也是如此?不確定是跟 list 中 iteration 有關還是跟寫檔 buffer I/O 有關?

另外,我測試 yosys command 時繼承的是 Backend,exexute 傳進來的 filename 只有空字串,還需要呼叫 extra_args 才會將檔名從 args 抓出來寫到 filename。

我也順便改了 code,直接用 std::string function 取代 wire regex,也算是避開了 std::regex bug 了。

我是不是全台灣最懂 yosys 的人了XD

2024年7月2日 星期二

一週雜事記錄

01. 夜翼面紗終於到手

應該是聽小老婆演唱會 03/02 那日子附近想要打到這顆頭盔,終於在 06/30 出貨了,不像喬丹之石可以用數學機率解決,這顆頭盔的掉落只能訴求天意,這意外之喜的掉落也算是給這苦悶的日子一點小小慰藉。

體感上似乎殺傷力變強了?現在只差讓這支冰法升到 96 級便算完美。

02. Pixel 8a 入手

終於買了一支超過 6500 的手機了,兩年前那支 Sharp 本想用到明年再換,但最近手機的體感溫度變強,加上上星期五因為過熱沒有網路導致一連串的鳥事發生沒有吃到中餐,晚上回到家後已然身心俱疲,於是便直接購買了這支手機,反正四年前就想買 pixel 4a 了,現在買也還不晚!

昨天到手後便開始轉移資料,不過一開始便不順利,不確定是哪邊沒操作好,後來只好一個一個 App 慢慢裝回來,還好我需要安裝的軟體不會超過 10 個。

台北等公車兩年前還可以用安裝舊版軟體的方式解決匯入常用站牌的問題,昨天雖然能安裝,但一執行便要求更新軟體,故沒有機會執行匯入功能,現在想想應該是 Android 14 或作者的機制導致?

兩年前隨便打的帳號資料還是一登入就同步下來蓋過本機資料,不意外的一樣沒有提供付費版功能,這個程式設計師一點都不值得尊重。

為了偵測手機溫度確認問題,上星期五晚上隨便下載了一個 App 試用,玩了一下馬上花了第二最高金額 300 贊助,這才是值得尊重的程式設計師,不會為了硬要賺錢死不提供付費版及拿掉必要功能。

無奈最近百廢待興,只好重新註冊一個 yahoo 帳號來同步資料,反正現在只有每個月剪頭髮回家那趟會用到,下次換手機應該不會再裝它了。

台北等公車不裝還無所謂,Daily Money 不能使用就比較麻煩,原來 Android 14 開始,Target SDK 至少要大於等於 Android 6.0 (23),故我前幾個月 build 的 Apk 已無法使用,幸好還可以使用 adb 方式安裝,xxx.apk 指的是 PC 路徑,不是 Android 路徑。

allow usb debug function
adb device
adb install --bypass-low-target-sdk-block xxx.apk

由於之前改 source code 是 hardcode 寫死 db 路徑,故要先建立 /sdcard/bwDailyMoney 資料夾再去啟動 Daily Money。

Detail Layout 使用 To - Money 才是我習慣的顯示方式。

目前記帳資料筆數來到 21,163 筆(2024/01/13 - 20,450)。

剛試了一下,程式也沒重新編譯,原本不能用的資料備份到 Google Drive 功能現在也可以使用了,不確定為什麼就是了?

目前只剩 Garmin 手錶收不到通知待解。

03. 管委會交接

昨天交接完後,終於可以無事一身輕了,可惜的是還是沒有完成用 Vue.js 開發管委會報表的 Web App,一開始應該用 pure javascript 就好了,想想還是覺得遺憾!

既然已經花了不少時間建立這 10 年的電子檔資料,完美就差臨門一腳,無奈…

04. Add command in yosys

試了一下,果然跟我想的一樣,找想要的 Pass 繼承即可,也順便寫了簡報分享給同事!

今天寫完簡報才發現原來 yosys 網頁已經提到了,不過我的簡報還是解釋得比較清楚就是了XD

另外這篇文章也寫得不錯,裡面有提到 netlist 其實沒有標準的問題,但照 yosys 所述,assign signal 應該需要被支援才對,改天再加到我的 netlist parser,左右兩邊都把它當 wire or pin arg 解析應該就可以了?