日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > 艾思后端實(shí)現(xiàn)

通過前兩篇的了解,一起解決了為什么要用python(Why)以及怎么用python(How)的問題,在這個系列的最后一講里,一起再來看看在IC設(shè)計(jì)的征途中里的案例和一些推薦

案例一:大型文件高速比對

IC設(shè)計(jì)里邊主要處理的對象還是以文本為主,但是在某些特殊的情況下,文本文件非常巨大,譬如上G的文件。這個時候?qū)ξ募牟轵?yàn)和比較都是比較麻煩的,尤其對于VIMer而言尤其是困難(由于VIM的設(shè)定,是需要將文件全部讀入到內(nèi)存里邊,大文件的打開和覆寫操作都很慢)。

文件體量

筆者有兩個比較大的lib文件,

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

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

所以,斷言這兩個lib的內(nèi)容有多么一致或者不一致從大小上看是比較困難的。如果采用vimdiff或者unix自帶的diff工具,速度會使非常非常慢(VIM基本30分鐘沒有結(jié)果~~)

python的高效處理示例

python里邊有很強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)能力,這里使用zip命令可以非常高效的進(jìn)行文件比對。先說結(jié)論,然后慢慢展開

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

平均來看,基本是2.2M行/秒的比較速度,可以說是秒比也不為過。

核心命令

這個腳本比較簡單,其中的核心命令如下:

		

zip(open(f1), open(f2))

這條命令蘊(yùn)含著下面幾個加速方法

  • 直接對文件f1/f2進(jìn)行迭代,并不去對文件對象使用readlines()的操作。python對于文件操作的時候,open()函數(shù)打開的對象就會被直接轉(zhuǎn)換成可迭代對象。當(dāng)然,數(shù)據(jù)保留的格式是內(nèi)部數(shù)據(jù)結(jié)構(gòu)。并非list或者str,這樣可以大大提升處理速度
  • zip函數(shù)可以對于可迭代對象進(jìn)行原地打包,并且生成一個新可迭代對象,直接被for...in...調(diào)用,效率高出天際。
對于可迭代的對象可以直接進(jìn)行比對,對那些不相等的部分,才進(jìn)行顯式打印,這樣的幾個操作下來,在大型的文件之間的diff也會變得毫無壓力。
案例一小結(jié):盡量使用可迭代對象(Iterable)而非直接的顯式list/str,可以大幅度的提高運(yùn)行效率。

案例二:規(guī)范的腳本開發(fā)思路和策略

在IC設(shè)計(jì)里邊,大部分的工作都是短小的腳本處理,目的就是快速和高效。這種開發(fā)思路是有優(yōu)勢的,譬如:數(shù)據(jù)的快速迭代、抽取、解析、分析以及結(jié)果導(dǎo)出。一個合格的IC工程師,可能每天都要面對多個處理和迭代的需求。一周寫個三、五個腳本是很稀松平常的。
這樣的腳本開發(fā)是典型的頭疼醫(yī)頭、腳疼醫(yī)腳的短平快的開發(fā)方法。高效,所見即所得是其最大的優(yōu)勢。

常見語言的優(yōu)缺點(diǎn)

在討論腳本開發(fā)的思路之前,一起看一下常見語言的優(yōu)缺點(diǎn):

ICer的腳本開發(fā)的幾個階段
語言各有優(yōu)缺點(diǎn),唯場景以定之?;诠P者的工作經(jīng)驗(yàn)來看,腳本的開發(fā)有以下幾個階段
  • 階段一:TCL統(tǒng)管一切
    最開始工作的時候,主要的工作場景都是在EDA工具里邊。TCL確實(shí)好用,和工具的嵌套比較緊密,甚至可以調(diào)用shell或者perl腳本,基本可以在工具里邊完成大部分事情。一些短平快的腳本基本都用TCL開發(fā)。但是隨著腳本越來越多,那些隨意化的腳本非常的散亂,格式也不統(tǒng)一,由于是EDA based的,很多命令只能在特定的EDA工具里邊運(yùn)行,交互起來缺乏便利性。
    結(jié)局:由于以上原因,很多用意類似腳本被反復(fù)書寫,效率低下,繼承性低。
  • 階段二:shell的支持
    shell是直接運(yùn)行在unix下的語言,可以很好的對unix環(huán)境進(jìn)行調(diào)劑和管控,簡單編程就可以生成比較好用的膠水工具箱,譬如:R2G流程的聯(lián)動(SYN->APR->extraction -> PV -> STA etc.),傳遞參數(shù)運(yùn)行多個并行的后臺流程(R2G_run1, R2G_run2 etc.)。但是由于shell語法比較簡單的原因,對于結(jié)果的解析通常只能使用awk、sed等unix native命令,需要學(xué)習(xí)獨(dú)立的語法和用法,這些損耗有時候已經(jīng)超出shell腳本本身。
    結(jié)局:shell腳本很多,但是好用的還是比較少,數(shù)據(jù)抽取操作弱,對于糾錯和容錯處理相對困難
  • 階段三:perl的介入
    這個時候,perl的介入就是毋庸置疑了。很多公司的大型仿真、驗(yàn)證環(huán)境都是使用perl語言搭建的。數(shù)據(jù)結(jié)構(gòu)復(fù)雜,文本操作方式多,效率也不差??梢酝昝廊〈鷖hell成為更為流程可控、輸出標(biāo)準(zhǔn)的膠水工具。后端也很喜歡用perl,譬如對timing report進(jìn)行summary和格式化打印,可以方便的對于每一版本的數(shù)據(jù)進(jìn)行歸一化比對;再譬如,對于某一個block的R2G運(yùn)行環(huán)境進(jìn)行遷移的時候,可以使用異常靈活的perl -pie命令行方式,對所有的腳本文件中特定字串進(jìn)行高速替換,效率極高。總之,perl對實(shí)際常見文本的處理非常高效和方便
    結(jié)局:perl文本處理異常強(qiáng)大和高效,但是強(qiáng)大的代價是松散的上下文決定式(context)的語法體系,這個對于后期維護(hù)帶來了一定的障礙。復(fù)雜數(shù)據(jù)結(jié)構(gòu)的表達(dá)較晦澀(reference/dereference),不易操作
  • 階段四:python的出現(xiàn)
    上述三個階段的文本處理、膠水工具、格式化輸出等等復(fù)雜的問題。在高級語言python看起來,都不是問題。python和perl都是用C語言編寫的初版(perl6以后有使用java編寫的可能;python前期的Cpython(使用C編譯),后期的Jpython(Java 編譯,用于JVM環(huán)境)都是一些拓展的話題)。python文本處理沒有perl直接,也不支持命令行快速操作模式,但是以上種種,都不失為一個系統(tǒng)化、增量化、可視化、易繼承、易維護(hù)的一個語言選擇。
    • 規(guī)范的語法規(guī)則以及PEP8的加持
    • 良好的閱讀性和可維護(hù)性
    • 復(fù)雜數(shù)據(jù)結(jié)構(gòu)的支持
    • 更類似于高級語言的編程方法和思路

系統(tǒng)化的解決問題的痛點(diǎn)

通常的工作,都是點(diǎn)滴任務(wù)的直接需求,用戶可以把這些簡單腳本視為一個一個的點(diǎn)腳本。為了日后的可擴(kuò)展、可維護(hù)以及可套疊的長遠(yuǎn)目標(biāo)。需要相對統(tǒng)一的開發(fā)方式進(jìn)行各個點(diǎn)腳本的開發(fā),包括但不限于下列的限制和規(guī)范:
  • 統(tǒng)一的命名方式:蛇形命名法(snake_case):使用下滑線連接單詞進(jìn)行變量命名:cell_order_reversed
  • PEP8 句法 規(guī)則:這里并非真正的語法要求,而是python推薦的代碼書寫風(fēng)格(coding style),譬如:逗號(‘,’)前邊沒有空格,后面需要接一個空格等等。具體細(xì)節(jié),可以點(diǎn)擊查看 PEP8的規(guī)范文檔。(Pycharm里邊默認(rèn)就使能了PEP8的代碼書寫風(fēng)格檢查
  • 局部的、專一的功能盡量使用函數(shù)(def)或者類(class)進(jìn)行描述,減少冗長的代碼,并且提高代碼維護(hù)性的效率。
  • 使用main函數(shù)進(jìn)行主程序的執(zhí)行
  • 點(diǎn)腳本的鏈?zhǔn)郊希哼^往的點(diǎn)腳本,使用模塊的導(dǎo)入(import)的方式進(jìn)行盡可能的重用和構(gòu)建
  • 腳本的格式化和規(guī)范化輸出
  • 構(gòu)建具有趨勢性的JSON 作為API接口,以供日后使用

ICer的python腳本模板分享

python的理念相當(dāng)先進(jìn),和專家相比,筆者也是初來乍到,結(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)可以方便的進(jìn)行格式化(welcome 、bye message)的輸出打印。就算后期需要調(diào)整打印格式(盡量避免),也可以通過只改動這個模塊文件進(jìn)行同意刷新(new-face)。
python是強(qiáng)大的高級語言,使用python可以設(shè)立更大的目標(biāo),如果未來想實(shí)現(xiàn)更為復(fù)雜、結(jié)構(gòu)化的腳本環(huán)境,建議讀者們可以從現(xiàn)在就向python靠攏。設(shè)想在不遠(yuǎn)的未來,可以將一個個簡單的點(diǎn)腳本串接在一起呈現(xiàn)出系統(tǒng)化、結(jié)構(gòu)化的工具箱式的工具包,提供給各位ICer使用。

本章詞匯

詞匯解釋


蛇形命名法(snake_case) 使用下劃線進(jìn)行單詞連接方式的命名法

【敲黑板劃重點(diǎn)】

python的潛力大、可維護(hù)性好,是構(gòu)建大型ICer工作環(huán)境和復(fù)雜腳本的優(yōu)選語言之一

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉