chiark / gitweb /
layout/data2safety: parse movfeatposmap (but actual implementation still lacking)
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 12 Dec 2010 01:21:27 +0000 (01:21 +0000)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 12 Dec 2010 01:21:27 +0000 (01:21 +0000)
layout/data2safety

index e196fbff7f2619f0bc8a4bc7872df8cf8fb0877c..3ea2ccae777dd75f51bbc1950f2c2196217bb29a 100755 (executable)
@@ -24,6 +24,9 @@ our (%segs);
 # $segs{$seg}{Feats}{$feat}{Posns}      ) for Point or Relay only
 # $segs{$seg}{Feats}{$feat}{BoObs}[]    ) for Point or Relay only
 # $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}{Inter}{Seg}              ) calculated
 # $segs{$seg}{Inter}{Map}               )  in writeout
 
@@ -236,6 +239,34 @@ sub line_interferences () {
     push @interfs, { Invert => $invert, Segs => $is };
 }
 
+sub begin_movfeatposmap () { }
+sub line_movfeatposmap () {
+    my ($segr,$abstr_namebase,$abstr_firstpos,$abstr_lastpos,$conc_posns) =
+       m,^\s+(\w+)\s+([A-Za-z]+)(\d+)(?:\-(\d+))?((?:\s+(?:[A-Za-z]+\d+)*)+)$,;
+    defined $segr or return syntaxerror();
+
+    my $seg= $segs{$segr};
+    return mistake("unknown segment $segr in movfeatposmap") unless $seg;
+
+    $abstr_lastpos= $abstr_firstpos unless defined $abstr_lastpos;
+    my $nabstr_posns= $abstr_lastpos - $abstr_firstpos + 1;
+    
+    $conc_posns =~ s/^\s+//;
+    my (@conc_posns) = split /\s+/, $conc_posns;
+
+    @conc_posns == $nabstr_posns
+       or return mistake("number of concrete poscombs ".@conc_posns.
+                         " differs from number of abstract poscombs".
+                         " $nabstr_posns");
+    for (my $i=0; $i<@conc_posns; $i++) {
+       push @{ $seg->{FeatMap} }, {
+           Abstract => $abstr_namebase.($abstr_firstpos+$i),
+           Concrete => $conc_posns[$i],
+           Used => 0,
+       };
+    }
+}
+
 sub mistake ($) {
     my ($m) = @_;
     print STDERR "mistake: $m\n in $mode, \`$currentline'\n";
@@ -491,7 +522,7 @@ sub mainread () {
        s/\s+$//;
        next unless m/\S/;
        last if m/^end$/;
-       if (m/^(invertible|vanilla|points|relays|fixed|endwiring|boards|interferences)$/) {
+       if (m/^(invertible|vanilla|points|relays|fixed|endwiring|boards|interferences|movfeatposmap)$/) {
            $mode= $1;
            $invertible= ($mode eq 'invertible');
            $mode= 'segment' if $mode =~ m/^(?:vanilla|invertible)$/;