Python处理verilog文件(一)拆分多module文件

Verilog文件拆分的原因

(1) 有的工具需要文件名和module名称一致,比如emacs的verilog插件。
(2) 有的工具在识别同一个文件中的多个module时认不全,比如verdi。

拆分方法

(1) 删除有内容的//注释行。这是为了防止识别出无用的代码。
(2) 删除有内容的/* */注释行。这是为了防止识别出无用的代码。
(3) 经过前两步,可能会剩下一些/*****/之类的注释行,不影响拆分。
(4) 根据 module name (……. endmodule来拆分出独立的verilog文件。

Import re
mom_file = open(‘one.v’,’r’)
raw_code = mom_file.read()

# 1. trim //
pat_slash = re.compile(r’(//..*\n)’)
code_noslash = pat_slash.sub(‘’,raw_code)

# 2. trim /*..*/
Pat_star = re.compile(r’/\*/([^*]*?\*/)’, re.S)
Code_nostar = pat_star.sub(‘’, code_noslash)
Code = code_nostar

# 3. Prepare moduleendmodule and module-name pattern
pat_module = re.compile(r’(module(..*?)endmodule)’,re.S)
pat_name = re.compile(r’module\s+(\w+)\s*(‘, re.S)

srch1 = ‘True’
while srch1:
     srch1 = pat_module.search(code)
     if srch1 :
         srch2 = pat_name.search(srch1.group())
     else:
         break
     code = pat_module.sub(‘’,code,count=1)
     
     separate_f = open(‘./files/’+srch2.group(1)+’.v’,’w’)
     separate_f.write(srch1.group())
     separate_f.close()

注释一:re.S选项,可以跨行匹配,比如 ’module abc \n (‘ , ‘ /* line 1 \n line 2 */’。
注释二:如果注释可能有/a/b/c/之类,需要替换# 2 步的代码,并执行两遍。每一遍删除 最里面的/不空/

embed_star = r'((/\*)([^*]*)(?!(\*/))([^*]*)(?!<(/\*))(\*/))'
pat_embed = re.compile(embed_star,re.S)
Code = pat_embed.sub(‘’,code_noslash)

下面依次解释embed pattern中每一组()的含义
(1)((/*) 表示开始的’/
(2)([^/
]) 表示第一项后面的内容,可以是除了’’、’空’之外的任何字符
(3)(?!(*/)) 表示第二项的后面不能是’ /’。不存在第三项的实体内容。
(4)([^/
]) 表示第二项后面的内容,可以是除了’’、’空’之外的任何字符
(5)(?!<(/*)) 表示第四项的后面不能是’ /*’。不存在第三项的实体内容。
(6)(*/)) 表示末尾的’ */’

这部分代码不能识别’/*******/’, ‘/**/’这样完全无其它字符的字符串。

猜你喜欢

转载自blog.csdn.net/zt5169/article/details/83829750
今日推荐