# $segs{$seg}{Ends}[$combpos][$end] = [ $node,$side ]
# $segs{$seg}{Dist}[$combpos]
-our (@interferences);
-# $interferences[][] = "$seg/$posre" "/.*" added during parsing if necc.
+our (@interfs);
+# $interfs[]{Invert} = $invert
+# $interfs[]{Segs}[] = "$seg/$posre" "/.*" added during parsing if necc.
our (%nodes);
# $nodes{$node}[$side]{Seg}
sub line_interferences () {
s/^\s+// or return syntaxerror();
my ($is) = [ split /\s+/, $_ ];
- map { s,$,/.*, unless m,/,; } @$is;
+ my ($invert)= 0;
+ if ($is->[0] eq '-') {
+ shift @$is;
+ $invert= 1;
+ }
+ map {
+ $invert ^= 1 if s/^\-//;
+ s,$,/.*, unless m,/,;
+ } @$is;
return syntaxerror() if grep { !m,^\w+/, } @$is;
- push @interferences, $is;
+ push @interfs, { Invert => $invert, Segs => $is };
}
sub mistake ($) {
$$objnum_rr= $objnum;
$pin_used{$kind}[$objnum]= [ $board, $pi->[$obj], $obj ]
if $mkused;
- return sprintf("%#5x /* %d.%-2d*/", $objnum, $board, $obj);
+ return sprintf("%#5x /* %d.%-*d*/", $objnum, $board,
+ $kind eq 'reverse' ? 1 : 2, $obj);
} else {
#print "so_boob >$objnum_rr|$$objnum_rr< -\n";
return " 0 /*none*/ ";
my (@segs,$segn,$seg,$segr,$pt,$ptv, $delim);
my ($comb,$pi,$feat,$featr,$end,$boob);
my ($node,$side,$otherend,$nodeotherside,$otherseg,$otherbackrelus);
- my ($ourinter,$pcname,$inter,$intother);
+ my ($ourinter,$pcname,$intere,$intother);
o("/* autogenerated - do not edit */\n\n");
@segs=();
for $seg (sort { nummap($a) cmp nummap($b) } keys %segs) {
$delim='';
$segr->{Inter}{Map}= 0;
+ $segr->{Inter}{Invert}= 0;
$ourinter= $segr->{Inter};
for ($comb=0; $comb < $segr->{Posns}; $comb++) {
$pi='';
$delim= ',';
$pcname= "$seg/$pi";
- for $inter (@interferences) {
+ for $intere (@interfs) {
+ my ($inter)= $intere->{Segs};
next unless grep {
if ($pcname =~ m/^$_$/) {
s,/.*,/ ?,; 1;
"involving $seg, $1, $ourinter->{Seg}");
} else {
$ourinter->{Seg}= $1;
+ $ourinter->{Invert}= $intere->{Invert};
}
}
endmistake("unsupported too-moveable interference")
}
o("\n};\n");
}
- for $inter (@interferences) {
+ for $intere (@interfs) {
map {
warn "warning: unused interference specification $_\n" unless m, ,;
- } @$inter;
+ } @{ $intere->{Segs} };
}
my (@sensemap,$sensenum,$i);
foreach $seg (@segs) {
$segr= $segs{$seg};
o("$delim\n");
- o(sprintf " { %-7s%d,%2d,%-9s%d,%-10s%-6s,%-7s",
- "\"$seg\",",$segr->{Inv},
+ o(sprintf " { %-7s%d,%d,%2d,%-9s%d,%-10s%-6s,%-7s",
+ "\"$seg\",",$segr->{Inv},$segr->{Inter}{Invert},
$segr->{FeatCount}, ($segr->{FeatCount} ? "mfi_$seg," : '0,'),
$segr->{Posns}, "spci_$seg,",
so_objboob('sense',1, $segr, \$sensenum),
so_objboob('reverse',1, $segr->{Inv} ? $segr : undef).',');
$ourinter= $segr->{Inter};
if (defined $ourinter->{Seg}) {
- o(sprintf "%5s,0%o", so_segnum($ourinter->{Seg}),
+ o(sprintf "%4s,0%o ", so_segnum($ourinter->{Seg}),
$ourinter->{Map});
} else {
- o(" -1");
+ o(" -1 ");
}
- o(" }");
+ o("}");
$delim= ',';
$sensemap[$sensenum]= $seg;
$segnum++;