5 # Merge two PADS-PCB files
9 SHARED_SIGNALS
= ("$G_Vdd", "$G_Vss", "0")
12 l
= f
.readline().strip()
14 print "not PADS-PCB format, first line: %s" % (l
,)
17 # Read comments until parts section
21 print "unexpected end-of-file before parts section"
23 if l
.strip() == "*PART*":
27 # Read all parts until *NET*
32 print "Unexpected end-of-file while reading parts"
37 if len(part
) == 0: # (stripped)
43 name
, package
= part
.split()
56 if line
.startswith("*SIGNAL*"):
60 signal
= line
.split()[1]
63 pins
.extend(line
.split())
69 def save_pads(parts
, net
, name
):
71 out
+= "*%s*\n" % (name
,)
73 for name
, package
in parts
.iteritems():
74 out
+= "%s %s\n" % (name
, package
)
77 out
+= "*SIGNAL* %s\n" % (signal
,)
78 for pin
in net
[signal
]:
79 out
+= "%s\n" % (pin
,)
82 if len(sys
.argv
) != 3:
83 print "usage: python mergepads.py file-1.pads file-2.pads"
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
)
93 for name
, package
in parts2
.iteritems():
96 # Need to rename part to avoid collision
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():
104 part_name
, pin_no
= pin
.split(".")
105 if part_name
== name
:
106 new_pins
.append("%s.%s" % (new_name
, pin_no
))
108 new_pins
.append("%s.%s" % (part_name
, pin_no
))
109 nets2
[signal
] = new_pins
111 parts
[new_name
] = package
116 if signal
in nets
and signal
not in SHARED_SIGNALS
:
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
])
124 nets
[new_signal
] = nets2
[signal
]
126 print save_pads(parts
, nets
, "%s + %s" % (sys
.argv
[1], sys
.argv
[2]))