#!/usr/bin/perl
#
# Compare board and schematic netlists.
# The board is presumed correct, the schematic is
# presumed damaged by copying and pasting.
#
open(INPUT, "ok.txt") || die "ok.txt: $!";
%ok = ();
while () {
last if /^Net /;
}
%ok = ();
while () {
if (/^(\S+)\s+(\S+)\s+(\S+)\r*$/) {
($net, $part, $pad) = ($1, $2, $3);
$ok{$net} .= "$part.$pad ";
next;
}
if (/^\s+(\S+)\s+(\S+)\r*$/) {
($part, $pad) = ($1, $2);
$ok{$net} .= "$part.$pad ";
next;
}
}
open(INPUT, "bad.txt") || die "bad.txt: $!";
%bad = ();
while () {
last if /^Net /;
}
%bad = ();
while () {
if (/^(\S+)\s+(\S+)\s+(\S+)\s+/) {
($net, $part, $pad) = ($1, $2, $3);
$bad{$net} .= "$part.$pad ";
next;
}
if (/^\s+(\S+)\s+(\S+)\s+/) {
($part, $pad) = ($1, $2);
$bad{$net} .= "$part.$pad ";
next;
}
}
#
# Now compare good and bad netlists, generating
# A list of remappings.
#
foreach $net (keys %ok) {
chop $ok{$net};
chop $bad{$net};
%list = ();
foreach $pin (split(/ /, $ok{$net})) {
$list{$pin} = 1;
}
%badlist = ();
foreach $pin (split(/ /, $bad{$net})) {
$list{$pin} -= 1;
}
$toprint = "";
foreach $pin (keys %list) {
$toprint .= " $pin($list{$pin})" if $list{$pin} != 0;
}
print "$net:$toprint\n" if $toprint;
}