From: ian Date: Fri, 25 Mar 2005 11:44:19 +0000 (+0000) Subject: ready for testing data2safety ? X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=11ecbe09c11a6e5404d5cc8717978e42cf5819b2;p=trains.git ready for testing data2safety ? --- diff --git a/layout/data2safety b/layout/data2safety index 81a8ea5..61cb048 100755 --- a/layout/data2safety +++ b/layout/data2safety @@ -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();