pyd文件怎么查看,python3运行py文件
窥镜是疾控中心重要的检测工具。其主要功能是抽象SOC,生成sgdc文件,支持RTL分析、CDC分析、功耗分析等。一个完整的SOC项目可能会生成几十个sgdc文件,每个文件都有上万行。手工分析sgdc文件比较麻烦,需要脚本来帮助分析。
版本:python 3.7
使用的工具:正则表达式
任务:分析所有sdgc文件并生成同名的csv文件。csv文件中的详细表述抽象端口的信息
要对文件进行预处理,必须先打开只读模式中Spyglass生成的sgdc文件。您不能销毁原始sgdc文件。打开sgdc文件后,有很多约束换行。具体如下。
时钟-名称 XXX -标记XXX-域D7-周期40000-边缘 0 20000 时钟-名称 XXX -标记XXX \ -域0-周期1666.666626-边缘 0 833.333313 时钟-名称 XXX -标记XXX\-域D1-周期1250-边缘 0
defsgdc_func(path,file _ name):file 1=open)path / file _ name, r )file 1 _ temp _ name=file _ name[:-5] _ revised 。sgdc file 1 _ temp=open(file 1 _ temp _ namp)))、replace \和\ n with fillace 0)relocatefilepointertofileheadfile 1 _ lines=file 1 _ temp . read lines)
1 _ lines是列表,元素是sgdc文件中每一行的约束,元素类型是字符串。
关键词匹配最重要的部分是基于去掉约束换行后抽取。csv文件的标题信息如下:
2 _ name=文件名[:-5]。csv file2=open (file2 _ name, w) file2.write(,。Join))时钟/域/源,方向/周期/除/值) \ n
Width/clk/reset标记端口的位宽,区分clk和generated_clk,标记reset;
模块/标签端口所属的模块和时钟的标签;
Clock/domain/source标记端口受哪些时钟约束,标记的时钟所属的时钟域,generated_clk的来源;
方向/周期/分频/值标志端口方向、时钟周期、分频系数和复位值。
Abstract_port默认sdgc文件中的所有端口都属于同一个模块;
关键字abstract_port表示该语句限制端口。代码如下所示。
num=0IF file 1 _ LINES 3360 # file 1 _ linessitforite min range(len)file 1 _ LINES)(:if)re。search)ABSTRACH file 1 _ LINES[item])(:#关键字abstract _ port匹配模式是abstract_port -ports。这是因为有些注释也跟在abstract_port,-ports后面。
计算位宽很麻烦。因为sgdc文件的端口位宽是这样写的。
抽象端口-端口 XXX -时钟 XXX -模块 XXX 抽象端口-端口 XXX[0]-时钟 XXX-mod
tract _ port-ports XXX[6:4]-clock XXX -module XXX -related_ports XXX[0]XXX[1]汇总规则:多位宽度中必须有[],但有[]不一定是多位,因为-related _ ports的参数也可能包含[
Python把多位宽和单位宽分开处理,一个键匹配模式是:
if re.search(r (?=(-ports ))\s* ?\w*\[\d*:(\d*)?\] [\ b],file1 _ lines [item]): #需要合并端口[a: b]和[a]这种匹配模式忽略related_ports中的括号,不识别单位宽度,识别多位宽度的所有形式;
将带:的表格与不带:的表格分开,分别提取带:的表格左右两边的数字。做差后取绝对值加1作为该行语句对应的位宽,不加:
同时,您需要提取当前行和下一行的端口名称。如果端口名称相同,表明当前的端口描述还未结束,您需要继续分析下一行。如果不同,则表示当前端口的描述结束,可以计算端口的位宽。具体代码如下:
如果(回复。search( abstract _ port-ports ,file 1 _ lines[item]):#关键字抽象_端口列表1=[]if re。搜索(r (?=(-ports ))\s* ?\w*\[\d*:(\d*)?\][^ \b],file1_lines[item]): #需要合并端口[甲:乙]和[A]如果重新搜索(r (?=(-ports ))\s* ?\w*\[\d*:(\d*)?\][^ \b],file1_lines[item]): #的形式A:B str1=re.search(r (?=(-ports ))\s* ?\w*\[\d*:(\d*)?\][^ \b],file1_lines[item]).group() str1=str1.strip().strip( )str 2=re。搜索(r (?=(\[))[^:]*,str1).group() str3=re.search(r (?=(:))[^\]]*,str1).group()num _ temp=ABS(int(str 3)-int(str 2))1 num=num _ temp else:num=1 #以[A] str1=re.search(r (?=(-ports ))\s* ?\w*\[\d*:(\d*)?\][^ \b],file1_lines[item]).group() # str1需要取消分配str1=str1.strip().strip( )str 1=re.match(r[a-za-z0-9_]*[^\[:\]],str1).group() #如果重新搜索,端口名称匹配不搜索(r (?=(-ports ))\s* ?\w*\[\d*:(\d*)?\][^ \b],file 1 _ lines[item 1]):str 2=re。搜索(r (?=(-ports ))\s* ?\w*\[\d*:(\d*)?\][^ \b],file1_lines[item 1]).group() str2=str2.strip().strip( )str 2=re.match(r[a-za-z0-9_]*[^\[:\]],str2).group()else:str 2= if(str 1==str 2):continue else:list 1。追加(字符串1)列表1。append(str(num))num=0单位宽语句的处理,直接将位宽加一即可!
多余空格和引号的处理实际分析浸渍提拉法文件时,发现-港口等所有关键词与后面的参数之间,未必是固定一个空格,可能存在若干个不定数量的空格,且参数有可能用引号包裹,也有可能没有引号包裹,所以匹配模式的通用形式是
(?=(-module ))\s* ?[^]*-XXX表明关键字,但是后面必须要有\s*,否则会漏匹配一些语句,且大蟒的正则表达式不支持将不定长的内容用?=修饰,其实一般的正则表达式解释器是支持的,?也很重要,因为参数可能用 包裹,也有可能没有引号!
匹配完成后一定要去掉多余的空格和引号,方法为:
str2=str2.strip().条带("")输出与时钟名称与重置这两个的处理方法与抽象_端口接近,但是时钟名称关键字会同时匹配到时钟名称与生成时钟名称,所以还需要再次进行区分
多文件处理从sgdc _ func导入重新导入操作系统导入sgdc _ func path= your _ path path _ list=OS。listdir(path)path _ list _ sgdc=[]对于路径列表中的项目:if re . search(r (r .*\.sgdc)[^ .swp]?item): if re.search(r (.*\.sgdc)[^ .swp]?项目)。group()==item:path _ list _ sgdc。附加(项目)打印(有%d个浸渍提拉法文件!\ n % len(path _ list _ sgdc))path _ list _ sgdc。排序()首先使用os.listdir()函数获取指定路径下所有的文件名列表,注意区别浸渍提拉法格式的文件和sgdc.swp格式的文件。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。