# $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
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";
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)$/;