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

如何安裝常用Python庫
Python常用的幾個命令介紹
SQLite數(shù)據(jù)庫與python的區(qū)別
python有什么用 如何用python創(chuàng)建數(shù)據(jù)庫
python讀取數(shù)據(jù)庫數(shù)據(jù) python查詢數(shù)據(jù)庫 python數(shù)據(jù)庫連接
如何使用Python和PinPong庫控制Arduino

評論