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