our (%nodes);
# $nodes{$node}[$side]{Seg}
+# $nodes{$node}[$side]{End}
our ($mode,$invertible);
$mode= 'barf';
mistake("duplicate topology for $seg/$subspec")
if defined $segs{$seg}{Dist}[$combpos];
$segs{$seg}{Dist}[$combpos]= $dist;
+ $endposr= $segr->{Ends}[$combpos];
+ die "$seg $combpos @$endposr ?" if defined $endposr && @$endposr;
for ($end=0; $end<2; $end++) {
$ns[$end] =~ m/^([a-z]\w+)\.([01])$/;
($node,$side)=($1,$2);
$nsr= $nodes{$node}[$side];
if (!exists $nsr->{Seg}) {
- $nsr->{Seg}= $seg;
- } elsif ($seg ne $nsr->{Seg}) {
- mistake("topology for $node.$side both $seg and $nsr->{Seg}");
+ $nodes{$node}[$side]= { Seg => $seg, End => $end };
+ } else {
+ $seg eq $nsr->{Seg} or
+ mistake("topology for $node.$side both $seg and $nsr->{Seg}");
+ $end == $nsr->{End} or
+ mistake("topology for $node.$side $seg both ends ($end".
+ " and also $nsr->{End})");
}
- $endposr= $segr->{Ends}[$combpos];
- die "$seg $combpos ?" if defined $endposr && @$endposr;
- $endposr->[$end]= [ $node, $side ];
+ $segr->{Ends}[$combpos][$end]= [ $node, $side ];
}
}
sub writeout () {
my (@segs,$segn,$seg,$segr,$pt,$ptv, $delim);
my ($comb,$pi,$feat,$featr,$end);
+ my ($node,$side,$otherend,$nodeotherside,$otherseg,$otherbackrelus);
o("/* autogenerated - do not edit */\n\n".
"#include \"safety.h\"\n\n");
@segs=();
}
foreach $seg (@segs) {
$segr= $segs{$seg};
- next unless $segr->{FeatCount};
- o("static const MovFeatInfo mfi_${seg}[]= {");
- $delim='';
- for $pt (keys %{ $segr->{Feats} }) {
- $ptv= $segr->{Feats}{$pt};
- next if exists $ptv->{Fixed};
- o("$delim\n");
- o(" { \"$seg/$pt\", $ptv->{Posns}, $ptv->{Weight} }");
- $delim=',';
- }
- o("\n};\n");
+
o("static const SegPosCombInfo spci_${seg}[]= {");
$delim='';
for ($comb=0; $comb < $segr->{Posns}; $comb++) {
($comb / $featr->{Weight}) % $featr->{Posns});
}
o("$delim\n");
- o(sprintf " %s {",
- "/*$pi*/");
+ o(sprintf " %-10s {", length $pi ? "/*$pi*/" : '');
for ($end=0; $end<2; $end++) {
- $other= $segs{$seg}{Ends}[$combpos][$end];
+ o(',') if $end;
o(" { ");
- if (defined $other) {
- ($node,$side) = @$other;
-
+ $otherend= $segr->{Ends}[$comb][$end];
+ defined $otherend or die "$seg $comb $end ?";
+ ($node,$side) = @$otherend;
+ $nodeotherside= $nodes{$node}[1-$side];
+ if (defined $nodeotherside) {
+ $otherseg= $nodeotherside->{Seg};
+ $otherbackrelus= $nodeotherside->{End} ^ $end ^ 1;
o(sprintf "/*%5s.%d %-6s*/ %d,%3d",
- "/* $other*/", $
+ $node,$side,
+ ($otherbackrelus?'-':' ').$otherseg,
+ $otherbackrelus,
+ $segs{$otherseg}{Num});
} else {
-
- );
-o(" },");
+ o(sprintf "/*%5s.%d*/ 0,NOTA(Segment)",
+ $node,$side);
+ }
+ o(" }");
}
o(sprintf " }");
$delim= ',';
}
o("\n};\n");
+
+ next unless $segr->{FeatCount};
+
+ o("static const MovFeatInfo mfi_${seg}[]= {");
+ $delim='';
+ for $pt (keys %{ $segr->{Feats} }) {
+ $ptv= $segr->{Feats}{$pt};
+ next if exists $ptv->{Fixed};
+ o("$delim\n");
+ o(" { \"$seg/$pt\", $ptv->{Posns}, $ptv->{Weight} }");
+ $delim=',';
+ }
+ o("\n};\n");
}
o("static const SegmentInfo info_segments[".scalar(@segs)."]= {");
$delim= '';
o(sprintf " { %-7s %d, %2d,%-9s %3d,%-10s %-6s }",
"\"$seg\",", $segr->{Inv},
$segr->{FeatCount}, ($segr->{FeatCount} ? "mfi_$seg," : '0,'),
- $segr->{Posns}, ($segr->{FeatCount} ? "spci_$seg," : '0,'),
+ $segr->{Posns}, "spci_$seg,",
so_oboob($segr));
$delim= ',';
}