chiark / gitweb /
layout/data2safety: honour movfeatposmap on input and output, and check that we used...
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 12 Dec 2010 02:05:59 +0000 (02:05 +0000)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 12 Dec 2010 02:05:59 +0000 (02:05 +0000)
layout/data2safety

index 3fd179e2c20b3be3b68126d328b953d15c9d1a2e..31f0b14aea910413ceb6054857282a4e24b569b2 100755 (executable)
@@ -26,7 +26,8 @@ our (%segs);
 # $segs{$seg}{Feats}{$feat}{Fixed}      position, for Fixed only
 # $segs{$seg}{FeatMap}[]{Abstract}     as from ours.m4
 # $segs{$seg}{FeatMap}[]{Concrete}     as in ours.wiring, for safety:movpos.c
-# $segs{$seg}{FeatMap}[]{Used}
+# $segs{$seg}{FeatMap}[]{UsedAbstract}
+# $segs{$seg}{FeatMap}[]{UsedConcrete}
 # $segs{$seg}{Inter}{Seg}              ) calculated
 # $segs{$seg}{Inter}{Map}               )  in writeout
 
@@ -279,6 +280,37 @@ sub endmistake ($) {
     $mistakes++;
 }
 
+sub movfeatposmap ($$$$$) {
+    my ($subspecr, $segr, $entfrom, $entto, $call) = @_;
+    my $featmap= $segr->{FeatMap};
+    return unless $featmap;
+
+    foreach my $mapent (@$featmap) {
+       next unless
+           $$subspecr =~ s/
+               (?<! [A-Za-z] ) $mapent->{$entfrom} (?! \d )
+               /$mapent->{$entto}/x;
+       $mapent->{"Used$entfrom"}++;
+       $call->($mapent);
+    }
+}
+
+sub movfeatposmap_checks () {
+    foreach my $seg (keys %segs) {
+       my $segr= $segs{$seg};
+       my $featmap= $segr->{FeatMap};
+       next unless $featmap;
+       foreach my $mapent (@$featmap) {
+           foreach my $chk (qw(Abstract Concrete)) {
+               next if $mapent->{"Used$chk"};
+               endmistake("movfeatposmap entry $seg $mapent->{Abstract}".
+                          " $mapent->{Concrete} unused for \L$chk lookup");
+               last;
+           }
+       }
+    }
+}
+
 sub line_endwiring () {
     my (@ns,$seg,$subspec,$dist);
     my ($segr,@subsegil,$feat,$pos,$featr,$combpos,%featposwant);
@@ -290,6 +322,14 @@ sub line_endwiring () {
        return;
     }
     $segr= $segs{$seg};
+    my $desc= $seg;
+    if (defined $subspec) {
+       $desc .= "/$subspec";
+       movfeatposmap(\$subspec, $segr, Abstract, Concrete, sub {
+           my ($mapent) = @_;
+           $desc .= "[$mapent->{Concrete}]";
+       });
+    }
     @subsegil= defined $subspec ? $subspec =~ m/([A-Za-z]+)(\d+)/g : ();
     while (@subsegil) {
        ($feat,$pos,@subsegil) = @subsegil;
@@ -656,10 +696,13 @@ sub writeout () {
                $pi.= sprintf("%s%d", $feat,
                              ($comb / $featv->{Weight}) % $featv->{Posns});
            }
+           my $pi_abstr= $pi;
+           movfeatposmap(\$pi_abstr, $segr, Concrete, Abstract, sub { });
+           $pi_abstr =~ 
            o("$delim\n");
            my $dist= $segr->{Dist}[$comb];
            o(sprintf " { %-7s%4d, { ",
-             '"'.$pi.'",',
+             '"'.$pi_abstr.'",',
              defined($dist) ? $dist : 1);
            for ($end=0; $end<2; $end++) {
                o(", ") if $end;
@@ -966,4 +1009,5 @@ mainread();
 redaction();
 writeout();
 writeasm();
+movfeatposmap_checks();
 exit 1 if $mistakes;