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)(*/)) 表示末尾的’ */’

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值