chiark / gitweb /
appears to generate a correct ours.safety.c - try compiling that
authorian <ian>
Sun, 27 Mar 2005 21:28:26 +0000 (21:28 +0000)
committerian <ian>
Sun, 27 Mar 2005 21:28:26 +0000 (21:28 +0000)
layout/data2safety

index d5db4d080d7ddb7b0bc00a734b829f33b6e21d22..03f88c061ba14aa5de13af59982382b8848927ad 100755 (executable)
@@ -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= ',';
     }