Python的進擊(下)--python在IC設(shè)計里的應用點滴
掃描二維碼
隨時隨地手機看文章
通過前兩篇的了解,一起解決了為什么要用python(Why)以及怎么用python(How)的問題,在這個系列的最后一講里,一起再來看看在IC設(shè)計的征途中里的案例和一些推薦
案例一:大型文件高速比對
IC設(shè)計里邊主要處理的對象還是以文本為主,但是在某些特殊的情況下,文本文件非常巨大,譬如上G的文件。這個時候?qū)ξ募牟轵灪捅容^都是比較麻煩的,尤其對于VIMer而言尤其是困難(由于VIM的設(shè)定,是需要將文件全部讀入到內(nèi)存里邊,大文件的打開和覆寫操作都很慢)。
文件體量
筆者有兩個比較大的lib文件,

這兩個文件的大小很相近,看文件大小的詳情可以有所體會

但是這里請各位小伙伴注意,同樣字符長度的lib描述,很有可能只是內(nèi)容不同,但是文件大小可能非常相近,設(shè)置大小完全一致

所以,斷言這兩個lib的內(nèi)容有多么一致或者不一致從大小上看是比較困難的。如果采用vimdiff或者unix自帶的diff工具,速度會使非常非常慢(VIM基本30分鐘沒有結(jié)果~~)
python的高效處理示例
python里邊有很強大的數(shù)據(jù)結(jié)構(gòu)能力,這里使用zip命令可以非常高效的進行文件比對。先說結(jié)論,然后慢慢展開

從以上截圖可以看到,使用python進行文件比對,基本在10秒內(nèi)可以完成兩個1.6G文件的比對,其中共找到了19K+的不同行,不同之處可以方便的導出到out.rpt里邊??匆幌抡w行數(shù):

平均來看,基本是2.2M行/秒的比較速度,可以說是秒比也不為過。
核心命令
這個腳本比較簡單,其中的核心命令如下:
zip(open(f1), open(f2))
這條命令蘊含著下面幾個加速方法
-
直接對文件f1/f2進行迭代,并不去對文件對象使用readlines()的操作。python對于文件操作的時候,open()函數(shù)打開的對象就會被直接轉(zhuǎn)換成可迭代對象。當然,數(shù)據(jù)保留的格式是內(nèi)部數(shù)據(jù)結(jié)構(gòu)
。并非list或者str,這樣可以大大提升處理速度
-
zip函數(shù)可以對于可迭代對象進行原地打包,并且生成一個新可迭代對象,直接被for...in...調(diào)用,效率高出天際。
案例一小結(jié):盡量使用可迭代對象(Iterable)而非直接的顯式list/str,可以大幅度的提高運行效率。
案例二:規(guī)范的腳本開發(fā)思路和策略
在IC設(shè)計里邊,大部分的工作都是短小的腳本處理,目的就是快速和高效。這種開發(fā)思路是有優(yōu)勢的,譬如:數(shù)據(jù)的快速迭代、抽取、解析、分析以及結(jié)果導出。一個合格的IC工程師,可能每天都要面對多個處理和迭代的需求。一周寫個三、五個腳本是很稀松平常的。這樣的腳本開發(fā)是典型的頭疼醫(yī)頭、腳疼醫(yī)腳的短平快的開發(fā)方法。高效,所見即所得是其最大的優(yōu)勢。
常見語言的優(yōu)缺點
在討論腳本開發(fā)的思路之前,一起看一下常見語言的優(yōu)缺點:
語言各有優(yōu)缺點,唯場景以定之?;诠P者的工作經(jīng)驗來看,腳本的開發(fā)有以下幾個階段
-
階段一:TCL統(tǒng)管一切
最開始工作的時候,主要的工作場景都是在EDA工具里邊。TCL確實好用,和工具的嵌套比較緊密,甚至可以調(diào)用shell或者perl腳本,基本可以在工具里邊完成大部分事情。一些短平快的腳本基本都用TCL開發(fā)。但是隨著腳本越來越多,那些隨意化的腳本非常的散亂,格式也不統(tǒng)一,由于是EDA based的,很多命令只能在特定的EDA工具里邊運行,交互起來缺乏便利性。
結(jié)局:由于以上原因,很多用意類似腳本被反復書寫,效率低下,繼承性低。 -
階段二:shell的支持
shell是直接運行在unix下的語言,可以很好的對unix環(huán)境進行調(diào)劑和管控,簡單編程就可以生成比較好用的膠水工具箱,譬如:R2G流程的聯(lián)動(SYN->APR->extraction -> PV -> STA etc.),傳遞參數(shù)運行多個并行的后臺流程(R2G_run1, R2G_run2 etc.)。但是由于shell語法比較簡單的原因,對于結(jié)果的解析通常只能使用awk、sed等unix native命令,需要學習獨立的語法和用法,這些損耗有時候已經(jīng)超出shell腳本本身。
結(jié)局:shell腳本很多,但是好用的還是比較少,數(shù)據(jù)抽取操作弱,對于糾錯和容錯處理相對困難 -
階段三:perl的介入
這個時候,perl的介入就是毋庸置疑了。很多公司的大型仿真、驗證環(huán)境都是使用perl語言搭建的。數(shù)據(jù)結(jié)構(gòu)復雜,文本操作方式多,效率也不差??梢酝昝廊〈鷖hell成為更為流程可控、輸出標準的膠水工具。后端也很喜歡用perl,譬如對timing report進行summary和格式化打印,可以方便的對于每一版本的數(shù)據(jù)進行歸一化比對;再譬如,對于某一個block的R2G運行環(huán)境進行遷移的時候,可以使用異常靈活的perl -pie命令行方式,對所有的腳本文件中特定字串進行高速替換,效率極高??傊?,perl對實際常見文本的處理非常高效和方便
結(jié)局:perl文本處理異常強大和高效,但是強大的代價是松散的上下文決定式(context)的語法體系,這個對于后期維護帶來了一定的障礙。復雜數(shù)據(jù)結(jié)構(gòu)的表達較晦澀(reference/dereference),不易操作 -
階段四:python的出現(xiàn)
上述三個階段的文本處理、膠水工具、格式化輸出等等復雜的問題。在高級語言python看起來,都不是問題。python和perl都是用C語言編寫的初版(perl6以后有使用java編寫的可能;python前期的Cpython(使用C編譯),后期的Jpython(Java 編譯,用于JVM環(huán)境)都是一些拓展的話題)。python文本處理沒有perl直接,也不支持命令行快速操作模式,但是以上種種,都不失為一個系統(tǒng)化、增量化、可視化、易繼承、易維護的一個語言選擇。 - 規(guī)范的語法規(guī)則以及PEP8的加持
- 良好的閱讀性和可維護性
- 復雜數(shù)據(jù)結(jié)構(gòu)的支持
- 更類似于高級語言的編程方法和思路
系統(tǒng)化的解決問題的痛點
通常的工作,都是點滴任務(wù)的直接需求,用戶可以把這些簡單腳本視為一個一個的點腳本。為了日后的可擴展、可維護以及可套疊的長遠目標。需要相對統(tǒng)一的開發(fā)方式進行各個點腳本的開發(fā),包括但不限于下列的限制和規(guī)范:- 統(tǒng)一的命名方式:蛇形命名法(snake_case):使用下滑線連接單詞進行變量命名:cell_order_reversed
- PEP8 句法 規(guī)則:這里并非真正的語法要求,而是python推薦的代碼書寫風格(coding style),譬如:逗號(‘,’)前邊沒有空格,后面需要接一個空格等等。具體細節(jié),可以點擊查看 PEP8的規(guī)范文檔。(Pycharm里邊默認就使能了PEP8的代碼書寫風格檢查)
- 局部的、專一的功能盡量使用函數(shù)(def)或者類(class)進行描述,減少冗長的代碼,并且提高代碼維護性的效率。
- 使用main函數(shù)進行主程序的執(zhí)行
- 點腳本的鏈式集合:過往的點腳本,使用模塊的導入(import)的方式進行盡可能的重用和構(gòu)建
- 腳本的格式化和規(guī)范化輸出
- 構(gòu)建具有趨勢性的JSON 作為API接口,以供日后使用
ICer的python腳本模板分享
python的理念相當先進,和專家相比,筆者也是初來乍到,結(jié)合上述表述,構(gòu)建了一個簡單的python 腳本模板,這里分享出來以饗讀者,也歡迎各位ICer使用和討論:#!/usr/bin/python3.6 -u # use -u to support tee meaage in unix # support Chinese encoding # -*- coding: utf-8 -*- # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # import part # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ import argparse import utils_local as ut # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Scripts version info # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ver = 'V0.1' ver_date = 'September 13, 2021' ver_des = 'initial version.' ut.ver = ver ut.ver_date = ver_date ut.ver_des = ver_des # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # CLASS part # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ class TextParse def __init__(self, file): self.file = file ...... def get_text_header(self): ...... return XXX # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # FUNCTION part # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ def parse_argu(): ...... return argus def func_1(): ...... return func_1_value def func_2(): ...... return func_2_value def main_run(......): ...... func_1() func_2() ...... return main_run_status # ------------------------------------------------------------ # MAIN part # ------------------------------------------------------------ if __name__ == '__main__': # global variable for main run cell_name = "abc" setup_margin = 0.3 # welcome message include scripts version message from local utils ut.welcome() # args parse args = parse_argu() # Call main run main_run(*args) # bye message from local utils ut.bye()上述示例可以簡單的提供一個python的開發(fā)模板,按照這種格式化的模板,利用本地工具模塊(utils_local.py)可以方便的進行格式化(welcome 、bye message)的輸出打印。就算后期需要調(diào)整打印格式(盡量避免),也可以通過只改動這個模塊文件進行同意刷新(new-face)。
python是強大的高級語言,使用python可以設(shè)立更大的目標,如果未來想實現(xiàn)更為復雜、結(jié)構(gòu)化的腳本環(huán)境,建議讀者們可以從現(xiàn)在就向python靠攏。設(shè)想在不遠的未來,可以將一個個簡單的點腳本串接在一起呈現(xiàn)出系統(tǒng)化、結(jié)構(gòu)化的工具箱式的工具包,提供給各位ICer使用。
本章詞匯
詞匯解釋|
|
|
| 蛇形命名法(snake_case) | 使用下劃線進行單詞連接方式的命名法 |





