From: Ian Jackson Date: Sun, 12 Dec 2010 01:21:27 +0000 (+0000) Subject: layout/data2safety: parse movfeatposmap (but actual implementation still lacking) X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=e1b7fd0247f13a07f750d6b32ec7fa88c3f12ec7;p=trains.git layout/data2safety: parse movfeatposmap (but actual implementation still lacking) --- diff --git a/layout/data2safety b/layout/data2safety index e196fbf..3ea2cca 100755 --- a/layout/data2safety +++ b/layout/data2safety @@ -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)$/;