chiark / gitweb /
ready for testing data2safety ?
authorian <ian>
Fri, 25 Mar 2005 11:44:19 +0000 (11:44 +0000)
committerian <ian>
Fri, 25 Mar 2005 11:44:19 +0000 (11:44 +0000)
layout/data2safety

index 81a8ea5f36619db56756e3c64ac63e1aaa490cf3..61cb0489ea29e3ca8148b600f2f41479875e8a2c 100755 (executable)
@@ -12,6 +12,8 @@ our (%segs);
 # $segs{$seg}{Feats}{$pt}{Posns}      ) for Point only
 # $segs{$seg}{Feats}{$pt}{BoOb}       ) for Point only
 # $segs{$seg}{Feats}{$pt}{Fixed}      position, for Fixed only
+# $segs{$seg}{Ends}[$combpos][$end] = [ $node,$side ]
+# $nodes{$node}[$side]{Seg}
 
 our ($mode,$invertible);
 $mode= 'barf';
@@ -74,16 +76,43 @@ sub begin_endwiring () {
 
 sub line_endwiring () {
     my (@ns,$seg,$subspec,$dist);
-    m,^\s*segment\s+(\w+\.\d+)\s+(\w+\.\d+)\s+(\w+)((?:/\w+\*\d+)?)\s+([0-9.]+)$, or die "$_ ?";
+    m,^\s*segment\s+(\w+\.\d+)\s+(\w+\.\d+)\s+(\w+)(?:/((?:[A-Za-z]+\d+)+)\*\d+)?\s+([0-9.]+)$, or die "$_ ?";
     ($ns[0],$ns[1],$seg,$subspec,$dist)=($1,$2,$3,$4,$5);
     if (!exists $segs{$seg}) {
        print STDERR "ditching unwired $seg$subspec\n";
        return;
     }
+    $segr= $segs{$seg};
+    @subsegil= $subspec =~ m/([A-Za-z]+)(\d+)/g;
+    while (@subsegil) {
+       ($feat,$pos,@subsegil) = @subsegil;
+       die "$feat ?" unless exists $segr->{Feats}{$feat};
+       $featr= $segr->{Feats}{$feat};
+       if (exists $featr->{Fixed}) {
+           die "$pos $featr->{Fixed} ?" unless $pos == $featr->{Fixed};
+       } else {
+           die "$pos $featr->{Posns} ?" unless $pos < $featr->{Posns};
+           $featposwant{$feat}= $pos;
+       }
+    }
+    $combpos= 0;
+    for $feat (keys %{ $segr->{Feats} }) {
+       $featr= $segr->{Feats}{$feat};
+       next if exists $featr->{Fixed}
+       die "$feat ?" if !exists $featposwant{$feat};
+       $combpos += $featposwant{$feat} * $featr->{Weight};
+    }
     for ($end=0; $end<2; $end++) {
        $ns[$end] =~ m/^([a-z]\w+)\.([01])$;
        ($node,$side)=($1,$2);
-       if (exists $nodes{$node}
+       $nsr= $nodes{$node}[$side];
+       if (!exists $nsr->{Seg}) {
+           $nsr->{Seg}= $seg;
+       } elsif ($seg ne $nsr->{Seg}) {
+           die "$seg $nsr->{Seg} ?";
+       }
+       die "$seg $combpos ?" if @{ $segr->{Ends}[$combpos] };
+       $segr->{Ends}[$combpos][$end]= [ $node, $side ];
     }
 }
 
@@ -120,7 +149,12 @@ sub mainread () {
 sub writeout () {
     my ($seg,$segv,$pt,$ptv, $delim);
     o("/* autogenerated - do not edit */\n\n");
+    @segs;
     for $seg (keys %segs) {
+       $segs{$seg}{Num}= @segs;
+       push @segs, $seg;
+    }
+    for ($segn=0; $segn<@segs; $segn++) {
        $segv= $segs{$seg};
        next unless $segv->{FeatCount};
        o("static const MovFeatInfo mfi_${seg}[]= {");
@@ -134,6 +168,18 @@ sub writeout () {
        }
        o("\n};\n");
     }
+    o("static const SegmentInfo info_segments[".scalar(@segs)."]= {");
+    $delim= '';
+    foreach $seg (@segs) {
+       $segr= $segs{$seg};
+       o("$delim\n");
+       o("  { \"$seg\", $segr->{Inv},\n".
+         "    $segr->{FeatCount}, ".
+         ($segr->{FeatCount} ? "mfi_${seg}" : 0).",".
+         " $segr->{Posns}, POSCOMBS, ".so_oboob($segr->{BoOb})." }");
+       $delim= ',';
+    }
+    o("\n};\n");
 }
 
 mainread();