大概花了 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
沒有留言:
張貼留言