Prefix Verilog Modules

做Top STA或Power分析的时候,需要用到Top的Verilog Netlist,但是在DFT的时候没有把所有的模块都uniquify, ICC在做优化的时候会在模块上面加port/pin,所以在Top读网表的时候会模块定义会有冲突。写了个脚本,给各个模块加了个前缀,解决了这个问题。

#! /tools/cfr/bin/python
 
import re
import os
import sys
import sets
 
def get_all_module_names(lines):
  patt = """^module ([^ ]*)"""
  module_names = []
  for line in lines:
    if not line: continue
    module_name = re.findall(patt, line)
    if module_name:
      module_name = "".join(module_name)
      module_names.append(module_name)
  return module_names
 
def prefix_module_names(lines, module_names, prefix, fixed_module_names):
  new_lines = []
  module_name_set = sets.Set(module_names)
  patt_instance = """^([A-Za-z0-9_]*)\s[A-Za-z0-9_]*\s\("""
  patt_module = """^module\s([^\s]*)\s\("""
  for line in lines:
    if not line.strip():
      new_lines.append(line)
      continue
    new_line = line
    module_name = re.findall(patt_instance, line)
    if module_name:
      module_name = "".join(module_name)
      if module_name in fixed_module_names:
        pass
      elif module_name in module_name_set:
        new_line = prefix + line
 
    module_name = re.findall(patt_module, line)
    if module_name:
      module_name = "".join(module_name)
      if module_name in fixed_module_names:
        pass
      else:
        new_line = "module " + prefix + line[len("module "):]
    new_lines.append(new_line)
  return new_lines
 
if __name__=="__main__":
 
  verilog_dir = "/home/zx211100/users/dongu/design_data/netlist/TDH2"
  verilog_files = [
    ("pre1_", "cw004265_1_0_wrapper_dcap.v",),
    ("pre2_", "ddr1_top_wrapper_dcap.v",),
    ("pre3_", "ddr2_top_wrapper_dcap.v",),
    ("pre4_", "dlp_spu_dcap.v",),
    ("pre5_", "ics_top_dcap.v",),
    ("pre6_", "ramplus_c_38400x1024_dcap.v",),
    ("pre7_", "srio_top_wrapper_dcap.v",),
    ("pre8_", "uld_top_dcap.v",),
    ("pre9_", "ulp_top_dcap.v",),
    ]
  fixed_module_names = [
    "cw004265_1_0_wrapper",
    "ddr1_top_wrapper",
    "ics_top",
    "ramplus_c_38400x1024",
    "ddr2_top_wrapper",
    "dlp_spu",
    "srio_top_wrapper",
    "uld_top",
    "ulp_top",
    "cw000523_1_0",
    ]
  for prefix, v in verilog_files:
    print "Proecess %s" % v
    v_file = os.path.join(verilog_dir, v)
    lines = open(v_file, 'r').readlines()
    module_names = get_all_module_names(lines)
    new_lines = prefix_module_names(lines, module_names, prefix, fixed_module_names)
    v_new = "".join(new_lines)
    new_name = v_file + 'p'
    open(new_name, 'w').write(v_new) 
    #break
vlsi/scripts/prefix-verilog-module.txt · 最后更改: 2011/11/27 11:13 由 admin
2007~2011 Copyright @ http://www.pythonclub.org