#! /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()