編 者 按
作為一個在數據中心搬磚的邏輯開發,日常不是僅僅簡單的寫寫RTL就可以完事兒的。在數據中心,你可能連板卡都看不到,日常常打交道的,也就是PCIe。作為邏輯版本的生產者,出現問題往往需要自己有詳細的定位手段和方式(沒有誰比設計者更清楚邏輯的功能。專門的軟件人員來做當然沒問題,但增加溝通成本),那么一套自己常用的軟件工具還是非常有必要的。對于這種工具型工具,C就顯得太笨重了,而Python才是首選。
推薦幾個不錯的Python庫
ctypes
作為常與PCIe打交道的人來說,99%的定位方式都是通過寄存器來進行定位信息。在python中自然也可以通過mmap來實現PCIe Bar空間的映射,但有一個問題就是Python下的mmap一次讀或者寫有時往往會產生兩次TLP讀寫。這么高深的問題自然邏輯開發人員是解不了的。那這時候最好的方式就是通過ctypes來實現與C的打通,mmap與寄存器讀寫功能API交給C代碼來做,生成.so后Python通過ctypes來實現調用即可,方便簡潔。
rich
在linux環境里,基本上就是一個命令行窗口,那么基本上就是各種打印了。有些時候想基于Python的print自己實現各種功能還是太略顯麻煩了。那么rich庫是一個很好的選擇。
Rich 是一個 Python 庫,可以為您在終端中提供富文本和精美格式。
Rich 的 API 讓在終端輸出顏色和樣式變得很簡單。此外,Rich 還可以繪制漂亮的表格、進度條、markdown、語法高亮的源代碼以及棧回溯信息(tracebacks)等——開箱即用。 網上關于rich庫的介紹挺多的,這里就不拾人牙慧了。借助rich的豐富功能,可以基于少量的代碼來實現相對比較豐富的功能。
舉個例子,對于設計而言,維護寄存器/文檔的一致性除非代碼用腳本生成的那么其他情況下往往項目做到最后越來越文不對題。在邏輯開發中,我會基于SpinalHDL中的regif來在代碼中進行定義寄存器實現,在其上面基礎上重定義了它文檔生成的代碼,用來能夠生成整個系統的寄存器文檔。日常會輸出一份html寄存器文檔以及一份Json格式寄存器文檔。隨后在做集成工具時會通過命令行參數直接將json文件直接傳給命令行工具,解析后借助rich的table直接能夠一鍵dump所有的寄存器,并精確給到每個寄存器每個比特的注釋說明,這比讀一個寄存器,再去對照寄存器文檔去看什么意思簡直不要方便太多!
當然,借助chatgpt來實現基于rich定義各種顯示功能這種體力勞動更能節省思考和動手能力。
Fire
既然定位是工具類型的,那么我們最終需要的肯定是一個命令行工具CLIs。這里推薦使用Fire這個庫。不為別的,它最簡單,簡單到令人發指!
importfire defadd(x, y): returnx + y defmultiply(x, y): returnx * y if__name__ == '__main__': fire.Fire({ 'add': add, 'multiply': multiply, })
在上面這段代碼里,我們定義的功能函數僅需把函數注冊到Fire里就能自動生成命令行工具:
$ pythonexample.pyadd1020 30 $ pythonexample.pymultiply 1020 200
基本零成本實現一個CLI工具,簡直太香了。
在VSCode中配合autoDocstring - Python Docstring Generator這個插件可以方便的為函數增加注釋,從而在上面生成的命令行中很方便的生成幫助信息
importfire defadd(x:int, y:int)-> int: """add operation Args: x (int): data y (int): data Returns: int: sum """ returnx + y defmultiply(x:int, y:int)-> int: """multiply operation Args: x (int): data y (int): data Returns: int: multiply """ returnx*y defversion()-> str: """get version info Returns: str: version number """ return"1.2.3" if__name__ == '__main__': fire.Fire()
運行時:
python3test.py--help NAME test.py SYNOPSIS test.pyGROUP | COMMAND GROUPS GROUP isone of the following: fire The Python Fire module. COMMANDS COMMAND isone of the following: add addoperation multiply multiply operation version getversioninfo
python3test.pyadd--help NAME test.pyadd- addoperation SYNOPSIS test.pyaddXY DESCRIPTION addoperation POSITIONAL ARGUMENTS X Type: int data Y Type: int data NOTES You can also use flags syntaxforPOSITIONAL ARGUMENTS
白嫖的即視感!
pyinstaller
這種腳本在不同的機器上運行,自然是不希望直接將代碼復制到機器上的,畢竟還要安裝各種依賴包,有時候這些機器往往是不聯網的。那么最簡單的方式就是通過pyinstaller打包成一個可執行文件了。pyinstaller網上資料也比較多,也可以記住chatgpt來獲取如何打包的方式。
比如針對上面的需要帶.so的打包,我們僅需針對python main文件執行一條指令即可:
pyinstaller --onefile --add-binary='./clib/a.so:.' Test.py
審核編輯:湯梓紅
-
寄存器
+關注
關注
31文章
5392瀏覽量
121922 -
Linux
+關注
關注
87文章
11378瀏覽量
211339 -
數據中心
+關注
關注
16文章
4964瀏覽量
72686 -
python
+關注
關注
56文章
4813瀏覽量
85314
原文標題:數據中心邏輯搬磚要會的——幾個好用的Python庫
文章出處:【微信號:Spinal FPGA,微信公眾號:Spinal FPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
動態庫封裝成python模塊的方法
Python機器學習常用庫
用Python做幾個表情包
140種Python標準庫、第三方庫和外部工具都有了
Python連接Oracle數據庫

如何安裝常用Python庫
Python常用的幾個命令介紹
SQLite數據庫與python的區別
python有什么用 如何用python創建數據庫
python讀取數據庫數據 python查詢數據庫 python數據庫連接
如何使用Python和PinPong庫控制Arduino

評論