Sign board (previous commit), changing from discrete resistors to network changes...
[trinary.git] / bb / mergepads.py
blobff9e9ca92e820ed10d922dfc5510593c5d43585e
1 #!env python
2 # Created:20080516
3 # By Jeff Connelly
5 # Merge two PADS-PCB files
7 import sys, os
9 SHARED_SIGNALS = ("$G_Vdd", "$G_Vss", "0")
11 def load_pads(f):
12 l = f.readline().strip()
13 if l != "*PADS-PCB*":
14 print "not PADS-PCB format, first line: %s" % (l,)
15 raise SystemExit
17 # Read comments until parts section
18 while True:
19 l = f.readline()
20 if len(l) == 0:
21 print "unexpected end-of-file before parts section"
22 raise SystemExit
23 if l.strip() == "*PART*":
24 # got it
25 break
27 # Read all parts until *NET*
28 parts = {}
29 while True:
30 part = f.readline()
31 if len(part) == 0:
32 print "Unexpected end-of-file while reading parts"
33 raise SystemExit
34 break
36 part = part.strip()
37 if len(part) == 0: # (stripped)
38 # whitespace
39 continue
41 if part == "*NET*":
42 break
43 name, package = part.split()
44 parts[name] = package
46 # Read signals
47 signal = None
48 pins = []
49 nets = {}
50 while True:
51 line = f.readline()
52 if len(line) == 0:
53 break
55 line = line.strip()
56 if line.startswith("*SIGNAL*"):
57 if signal:
58 nets[signal] = pins
60 signal = line.split()[1]
61 pins = []
62 else:
63 pins.extend(line.split())
64 # Add last signal
65 nets[signal] = pins
67 return parts, nets
69 def save_pads(parts, net, name):
70 out = "*PADS-PCB*\n"
71 out += "*%s*\n" % (name,)
72 out += "*PART*\n"
73 for name, package in parts.iteritems():
74 out += "%s %s\n" % (name, package)
75 out += "*NET*\n"
76 for signal in net:
77 out += "*SIGNAL* %s\n" % (signal,)
78 for pin in net[signal]:
79 out += "%s\n" % (pin,)
80 return out
82 if len(sys.argv) != 3:
83 print "usage: python mergepads.py file-1.pads file-2.pads"
84 raise SystemExit
86 f1 = file(sys.argv[1], "rt")
87 f2 = file(sys.argv[2], "rt")
89 parts, nets = load_pads(f1)
90 parts2, nets2 = load_pads(f2)
92 # Merge part list
93 for name, package in parts2.iteritems():
94 new_name = name
95 if name in parts:
96 # Need to rename part to avoid collision
97 new_name += "_2"
98 assert new_name not in parts, "Name %s in both netlists, even after suffixing" % (name,)
100 # Go through pins and rename if needed
101 for signal, pins in nets2.iteritems():
102 new_pins = []
103 for pin in pins:
104 part_name, pin_no = pin.split(".")
105 if part_name == name:
106 new_pins.append("%s.%s" % (new_name, pin_no))
107 else:
108 new_pins.append("%s.%s" % (part_name, pin_no))
109 nets2[signal] = new_pins
111 parts[new_name] = package
113 # Merge nets
114 for signal in nets2:
115 new_signal = signal
116 if signal in nets and signal not in SHARED_SIGNALS:
117 new_signal += "_2"
118 # If this happens, improve suffixing (try alternatives)
119 assert new_signal not in nets, "Signal %s in both netlists, even after suffix" % (new_signal,)
121 if new_signal in SHARED_SIGNALS:
122 nets[new_signal].extend(nets2[signal])
123 else:
124 nets[new_signal] = nets2[signal]
126 print save_pads(parts, nets, "%s + %s" % (sys.argv[1], sys.argv[2]))