From: ian Date: Sun, 27 Mar 2005 21:28:26 +0000 (+0000) Subject: appears to generate a correct ours.safety.c - try compiling that X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=6dcb07d2dd916d3677549bb91c9df01418d5728e;p=trains.git appears to generate a correct ours.safety.c - try compiling that --- diff --git a/layout/data2safety b/layout/data2safety index d5db4d0..03f88c0 100755 --- a/layout/data2safety +++ b/layout/data2safety @@ -21,6 +21,7 @@ our (%segs); our (%nodes); # $nodes{$node}[$side]{Seg} +# $nodes{$node}[$side]{End} our ($mode,$invertible); $mode= 'barf'; @@ -140,18 +141,22 @@ sub line_endwiring () { 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 ]; } } @@ -202,6 +207,7 @@ sub nummap ($) { 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=(); @@ -211,17 +217,7 @@ sub writeout () { } 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++) { @@ -233,25 +229,45 @@ sub writeout () { ($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= ''; @@ -261,7 +277,7 @@ o(" },"); 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= ','; }