#! /usr/local/bin/python
import sys, string
column = 5
def main():
if len(sys.argv)<3:
print "Usage: %s {MGC report file} {Altera report file}"%(sys.argv[0],)
sys.exit(-1)
if len(sys.argv)>3:
global column
column = string.atoi(sys.argv[3])
print "will use column", column
#
# First read through report for quicksim symbol and build up
# map from pin number to (name, vertex name, x, y)
#
pin_dict = {}
nx = {}
ny = {}
pin_name = ""
pin_no = ""
lines = open(sys.argv[1]).readlines()
lines.append("Property\n")
for line in lines:
words = string.split(line[:-1])+["", "", "", "", ""]
if words[1]=="PIN_NO":
pin_no = words[2]
pin_xy = string.split(words[4][1:-1], ",")
pin_x = string.atof(pin_xy[0])
if not nx.has_key(pin_x):
nx[pin_x] = 1
else:
nx[pin_x] = nx[pin_x]+1
pin_y = string.atof(pin_xy[1])
if not ny.has_key(pin_y):
ny[pin_y] = 1
else:
ny[pin_y] = ny[pin_y]+1
elif words[1]=="PIN_NAME":
pin_name = words[2]
if len(pin_name)>=3 and pin_name[:3]=="IN/":
pin_name = pin_name[3:]
pin_name = string.upper(pin_name)
elif words[0]=="Property":
if pin_no=="" and pin_name=="":
pass
elif pin_no=="":
print "don't have pin_no for pin_name=%s"%(pin_name,)
elif pin_name=="":
print "don't have pin_name for pin_no=%s"%(pin_no,)
else:
pin_dict[pin_no] = (pin_name, pin_x, pin_y)
pin_name = ""
pin_no = ""
else:
pass
nkeys = len(pin_dict.keys())
sys.stderr.write("read data for %d pins\n"%(nkeys,))
xlo, xhi, ylo, yhi = 0.0, 0.0, 0.0, 0.0
nxl, nxh, nyl, nyh = 0, 0, 0, 0
for x in nx.keys():
if nxl<=nxh and nx[x]>nxl:
xlo = x
nxl = nx[x]
elif nxh<=nxl and nx[x]>nxh:
xhi = x
nxh = nx[x]
for y in ny.keys():
if nyl<=nyh and ny[y]>nyl:
ylo = y
nyl = ny[y]
elif nyh<=nyl and ny[y]>nyh:
yhi = y
nyh = ny[y]
if xlo>xhi:
xlo, xhi = xhi, xlo
if ylo>yhi:
ylo, yhi = yhi, ylo
print "xlo=%f xhi=%f nxl=%d nxh=%d"%(xlo, xhi, nxl, nxh)
print "ylo=%f yhi=%f nyl=%d nyh=%d"%(ylo, yhi, nyl, nyh)
#
# Next read through Altera report file
#
nname = 0
fp = open("pin.dofile", "w")
save_stdout = sys.stdout
sys.stdout = fp
done = {}
for line in open(sys.argv[2]).readlines():
words = string.split(line[:-1])
col = column
if len(words)<1+col:
continue
if words[col]=="INPUT" or \
words[col]=="OUTPUT" or \
words[col]=="BIDIR" or \
words[col]=="OPNDRN" or \
words[col]=="FF" or \
words[col]=="TRI":
pin_no = words[0]
net_name = words[-1]
if net_name[0]=="(" and net_name[-1]==")":
net_name = words[-2]
if done.has_key(net_name):
continue
done[net_name] = pin_no
try:
pin_name, pin_x, pin_y = pin_dict[pin_no]
except KeyError:
sys.stderr.write("key "+pin_no+" not found\n")
sys.stderr.write(`words`+"\n")
pin_name = "?"
sys.stderr.write("pin: %s %s %s\n"%(pin_no, net_name, pin_name))
if pin_name=="?":
continue
dd = 0.05*min(xhi-xlo, yhi-ylo)
if pin_x==xlo:
dx = -dd
dy = 0
elif pin_x==xhi:
dx = dd
dy = 0
elif pin_y==ylo:
dx = 0
dy = -dd
elif pin_y==yhi:
dx = 0
dy = dd
print '$unselect_all( \\'
print ' @comment, @frame, @instance, @pin, \\'
print ' @property, @symbolpin, @text, @vertex);'
print '$select_by_property(@union, "pin_no", "%s", void);'%(pin_no,)
print '$add_property( \\'
print ' "NET", "%s", \\'%(net_name,)
xx = pin_x+dx
yy = pin_y+dy
rot = 0
if dx>0:
rot = 0
elif dx<0:
rot = 180
elif dy>0:
rot = 90
elif dy<0:
rot = 270
print ' [%f, %f, ""], \\'%(pin_x, pin_y)
print ' @string, @on, @nopin);'
print '$move([%f, %f, ""], @noflip, 0, %d);'%(xx, yy, rot)
nname = nname+1
sys.stdout = save_stdout
sys.stderr.write("named %d nets\n"%(nname,))
if __name__=="__main__":
main()