⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysc2ver.py

📁 这个是systemc的一个小的程序
💻 PY
字号:
#!/usr/bin/python##############################################################################################           This program reads in a SystemC file then writes out verilog RTL file#           making the appropriate substitutions. ##           syntax: sysc2ver.py filename(no extension)##	    Author: John Hamilton - Medtronic#	    Copyright (c) 2004, Medtronic Inc.##	    This software may be used and distributed according to the terms of#	    the GNU General Public License (GPL), incorporated herein by reference.##	    Initial revision 0.5#############################################################################################import sysimport stringimport reinfile=[]ports=[]senslst=[]moduleports=[]ioports=[]iodefs='\n'regdefs='\n'seqptr = initptr = 0state = 0senscmd1=''senscmd=[]sensindx = 0casecount = 0casetree = [0,0,0,0,0,0,0,0]# Check that there is a filename specified then open the header file and output fileif len(sys.argv) > 1:  fpath = sys.argv[1]+'.h'  f=open(fpath, 'r')  fo=open(sys.argv[1]+'.v', 'w')  fp=open('portlist.txt', 'a')  # Read in header file and write out verilog file  for line in f.readlines():    # STATE 0 - Add comments to verilog file    if state == 0: # Find comments      if line[0:9]=='SC_MODULE':	state = 1	modulestr = 'module '+sys.argv[1]+' ('	portstr = sys.argv[1]+' '+sys.argv[1]+' ('      elif line[0:8]!='#include':	fo.write(line)    # STATE 1 - Read in I/O signals, create I/O defs and module statement    elif state == 1: # Find array definitions      ports = string.split(line)      if len(ports) > 1:	isreg = 0	if ports[0] == 'sc_in<bool>':	  iodefs = iodefs + '  input        '	elif ports[0] == 'sc_out<bool>':	  iodefs = iodefs + '  output       '	  regdefs = regdefs + '  reg          '	  isreg = 1	elif ports[0][0:12] == 'sc_inout_rv<':	  if ports[0][13] == '>':	    iodefs = iodefs + '  inout  [' + str(int(ports[0][12]) -1) + ':0] '	  else:	    indxval = int(ports[0][12])*10 + int(ports[0][13])	    iodefs = iodefs + '  input  [' + str(indxval - 1) + ':0]'	elif ports[0][0:14] == 'sc_in<sc_uint<':	  if ports[0][15] == '>':	    iodefs = iodefs + '  input  [' + str(int(ports[0][14]) -1) + ':0] '	  else:	    indxval = int(ports[0][14])*10 + int(ports[0][15])	    iodefs = iodefs + '  input  [' + str(indxval - 1) + ':0]'	elif ports[0][0:17] == 'sc_in<sc_biguint<':	  if ports[0][18] == '>':	    iodefs = iodefs + '  input  [' + str(int(ports[0][17]) -1) + ':0] '	  else:	    indxval = int(ports[0][17])*10 + int(ports[0][18])	    iodefs = iodefs + '  input  [' + str(indxval - 1) + ':0]'	elif ports[0][0:15] == 'sc_out<sc_uint<':	  if ports[0][16] == '>':	    iodefs = iodefs + '  output [' + str(int(ports[0][15]) -1) + ':0] '	    regdefs = regdefs + '  reg    [' + str(int(ports[0][15]) -1) + ':0] '	    isreg = 1	  else:	    indxval = int(ports[0][15])*10 + int(ports[0][16])	    iodefs = iodefs + '  output [' + str(indxval -1) + ':0]'	    regdefs = regdefs + '  reg    [' + str(indxval -1) + ':0]'	    isreg = 1	elif ports[0][0:18] == 'sc_out<sc_biguint<':	  if ports[0][19] == '>':	    iodefs = iodefs + '  output [' + str(int(ports[0][18]) -1) + ':0] '	    regdefs = regdefs + '  reg    [' + str(int(ports[0][18]) -1) + ':0] '	    isreg = 1	  else:	    indxval = int(ports[0][18])*10 + int(ports[0][19])	    iodefs = iodefs + '  output [' + str(indxval -1) + ':0]'	    regdefs = regdefs + '  reg    [' + str(indxval -1) + ':0]'	    isreg = 1	if ports[1] == '>':	  ioname = string.replace(ports[2],';','')	  modulestr = modulestr + ioname + ', '	  portstr = portstr + '.' + ioname + '(' + ioname + ')' + ', '	else:	  ioname = string.replace(ports[1],';','')	  modulestr = modulestr + ioname + ', '	  portstr = portstr + '.' + ioname + '(' + ioname + ')' + ', '	iodefs = iodefs + '  ' + ioname + ';\n'	if isreg == 1:	  regdefs = regdefs + '  ' + ioname + ';\n'      else:	fo.write(modulestr[0:len(modulestr)-2] + ');\n')	fp.write(portstr[0:len(portstr)-2] + ');\n')	fo.write(iodefs)	fo.write(regdefs)	regdefs = '\n'	state = 2    # STATE 2 - Create local register definitions    elif state == 2:      ports = string.split(line)      if len(ports) > 1:	if ports[0] == 'bool':	  iodefs = iodefs + '  reg          '	elif ports[0][0:8] == 'sc_uint<':	  if ports[0][9] == '>':	    regdefs = regdefs + '  reg    [' + str(int(ports[0][8]) -1) + ':0] '	  else:	    indxval = int(ports[0][8])*10 + int(ports[0][9])	    regdefs = regdefs + '  reg    [' + str(indxval -1) + ':0]'	elif ports[0][0:11] == 'sc_biguint<':	  if ports[0][12] == '>':	    regdefs = regdefs + '  reg    [' + str(int(ports[0][11]) -1) + ':0] '	  else:	    indxval = int(ports[0][11])*10 + int(ports[0][12])	    regdefs = regdefs + '  reg    [' + str(indxval -1) + ':0]'	if ports[1] == '>':	  ioname = string.replace(ports[2],';','')	else:	  ioname = string.replace(ports[1],';','')	if string.find(ioname,'[') > 0:	  ioname = ioname[0:string.find(ioname,'[')+1]+"0:"+str(int(ioname[(string.find(ioname,'[')+1):string.find(ioname,']')])-1)+"]"        regdefs = regdefs + '  ' + ioname + ';\n'      else:	regdefs = re.sub('\[0:0\]','     ',regdefs)	fo.write(regdefs)	state = 3    # STATE 3 - Create method and sensitivity definitions    elif state == 3:      senslst = string.split(line)      if len(senslst) > 1:	if senslst[0][0:9] == 'sensitive':	  edgedir = ''	  if senslst[0][9:13] == '_pos':	    senscmd.append('always @(posedge ')	    edgedir = 'posedge '	  elif senslst[0][9:13] == '_neg':	    senscmd.append('always @(negedge ')	    edgedir = 'negedge '	  else:	    senscmd.append('always @(')	  firstone = 0	  for senselem in senslst:	    if senselem[0:9] != 'sensitive':	      if senselem[0:2] == '<<':		i = len(senscmd) - 1		if firstone > 0:		  senscmd[i] = senscmd[i] + ' or ' + edgedir		else:		  firstone = 1	      else:		senscmd[i] = senscmd[i] + string.replace(senselem,';',')\n')  f.close()  fpath = sys.argv[1]+'.cpp'  f=open(fpath, 'r')  state = 0  # Read in code file and write out verilog file  fo.write('\n\n')  edgecode = 0  for line in f.readlines():    subflag = string.find(line,'//#SUB')    if (subflag >= 0):      line = line[subflag+6:];      fo.write(line)    elif line[0:4] == 'void':      newline = senscmd.pop(0)      if (string.find(newline,'posedge') >= 0) or (string.find(newline,'negedge') >= 0):	edgecode = 1      else:	edgecode = 0      fo.write('\n' + newline)    else:      if string.find(line,'case') >= 0:	line = string.replace(line,'case ','')	i = string.find(line,':')	line = line[0:i+1] + ' begin ' + line[i+1:]      if string.find(line,'switch') >= 0:	casecount = casecount + 1	line = string.replace(line,'switch','case')	if string.find(line,'{') >= 0:          line = string.replace(line,'{','')          casetree[casecount] = casetree[casecount] + 1      if string.find(line,'{') >= 0:	if (casecount > 0):	  if casetree[casecount] == 0:	    line = string.replace(line,'{','')	  else:	    line = re.sub('{','begin',line)          casetree[casecount] = casetree[casecount] + 1	else:	  line = re.sub('{','begin',line)      if string.find(line,'}') >= 0:	if (casecount > 0):	  casetree[casecount] = casetree[casecount] - 1	  if casetree[casecount] == 0:	    line = re.sub('}','endcase',line)	    casecount = casecount - 1	  else:	    line = re.sub('}','end',line)	else:          line = re.sub('}','end',line)      line = re.sub('.read\(\)','',line)      line = re.sub('"ZZZZZZZZ"','8\'hzz',line)      newline = re.split('([A-Z])',line,1)      if len(newline) == 3:	line = newline[0] + '`' + newline[1] + newline[2]      line = re.sub('  break;','end',line)      line = re.sub('break;','end',line)      i = string.find(line,'0x')      if i >= 0:	if line[i+3:i+4] == ';' or line[i+3:i+4] == ' ':	  line = re.sub('0x','4\'h',line)	elif line[i+4:i+5] == ';' or line[i+4:i+5] == ' ':	  line = re.sub('0x','8\'h',line)	elif line[i+5:i+6] == ';' or line[i+5:i+6] == ' ':	  line = re.sub('0x','12\'h',line)	elif line[i+6:i+7] == ';' or line[i+6:i+7] == ' ':	  line = re.sub('0x','16\'h',line)	elif line[i+7:i+8] == ';' or line[i+7:i+8] == ' ':	  line = re.sub('0x','20\'h',line)	elif line[i+8:i+9] == ';' or line[i+8:i+9] == ' ':	  line = re.sub('0x','24\'h',line)	elif line[i+9:i+10] == ';' or line[i+9:i+10] == ' ':	  line = re.sub('0x','28\'h',line)	elif line[i+10:i+11] == ';' or line[i+10:i+11] == ' ':	  line = re.sub('0x','32\'h',line)	elif line[i+11:i+12] == ';' or line[i+11:i+12] == ' ':	  line = re.sub('0x','36\'h',line)	elif line[i+12:i+13] == ';' or line[i+12:i+13] == ' ':	  line = re.sub('0x','40\'h',line)	elif line[i+13:i+14] == ';' or line[i+13:i+14] == ' ':	  line = re.sub('0x','44\'h',line)	elif line[i+14:i+15] == ';' or line[i+14:i+15] == ' ':	  line = re.sub('0x','48\'h',line)	elif line[i+15:i+16] == ';' or line[i+15:i+16] == ' ':	  line = re.sub('0x','52\'h',line)	elif line[i+16:i+17] == ';' or line[i+16:i+17] == ' ':	  line = re.sub('0x','56\'h',line)	elif line[i+17:i+18] == ';' or line[i+17:i+18] == ' ':	  line = re.sub('0x','60\'h',line)	elif line[i+18:i+19] == ';' or line[i+18:i+19] == ' ':	  line = re.sub('0x','64\'h',line)      if edgecode == 1:	line = re.sub(' = ',' <= ',line)      if string.find(line,'(0') >= 0:	line = re.sub('\(0','{3\'b000',line)	line = re.sub('\)','}',line)      if string.find(line,'.range') >= 0:	strmatch = re.compile(r".range\((\d+)\,(\d+)\)")	line = strmatch.sub(r'[\1:\2]', line)      if string.find(line,'= (') >= 0:	line = re.sub('\(','{',line)	line = re.sub('\)','}',line)      line = re.sub('default:','default: begin',line)      if line[0:8]!='#include':	fo.write(line)  fo.write('endmodule\n')  f.close()  fo.close()  fp.write('\n')  fp.close()  print "done with " + sys.argv[1] + "!"  fpath = sys.argv[1]+'.cpp'# If no file specified on command line, print out syntaxelse:  print "genverilog.py cfile"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -