11 # $segs{$seg}{FeatCount} does not include Fixed
12 # $segs{$seg}{Feats}{$pt}{Kind} Point or Fixed
13 # $segs{$seg}{Feats}{$pt}{Weight} ) for Point only
14 # $segs{$seg}{Feats}{$pt}{Posns} ) for Point only
15 # $segs{$seg}{Feats}{$pt}{BoOb} ) for Point only
16 # $segs{$seg}{Feats}{$pt}{Fixed} position, for Fixed only
17 # $segs{$seg}{Ends}[$combpos][$end] = [ $node,$side ]
20 # $nodes{$node}[$side]{Seg}
22 our ($mode,$invertible);
25 sub line_barf () { die; }
27 sub begin_points () { }
29 my ($seg,$pt,@boob,$bodef);
30 m,^\s+(\w+)/([A-Za-z]+)\s+((\d+)\.\d+)\s+(\d*\.\d+)$, or die "$_ ?";
31 ($seg,$pt,$boob[0],$bodef,$boob[1])=($1,$2,$3,$4,$5);
32 $boob[1] =~ s/^\./$bodef./;
33 die "$_ ?" unless exists $segs{$seg};
34 die "$_ ?" if exists $segs{$seg}{Feats}{$pt};
35 $segs{$seg}{Feats}{$pt}= {
37 Weight => $segs{$seg}{Posns},
41 $segs{$seg}{Posns} *= 2;
42 $segs{$seg}{FeatCount}++;
45 sub begin_fixed () { }
48 m,^\s+(\w+)/([A-Za-z]+)(\d+)$, or die "$_ ?";
49 ($seg,$pt,$pos)=($1,$2,$3);
50 die "$_ ?" unless exists $segs{$seg};
51 die "$_ ?" if exists $segs{$seg}{Feats}{$pt};
52 $segs{$seg}{Feats}{$pt}= {
58 sub begin_segment () { }
61 m/^\s+(\w+)\s+(\d+\.\d+)$/ or die "$_ ?";
63 die "$_ ?" if exists $segs{$seg};
73 sub begin_endwiring () {
76 # o("static const SegPosCombInfo spci_${seg}[]= {");
78 # for ($comb=0; $comb < $segv->{Posns}; $comb++) {
83 die "mistake: $m\n in \`$currentline'\n";
86 sub line_endwiring () {
87 my (@ns,$seg,$subspec,$dist);
88 my ($segr,@subsegil,$feat,$pos,$featr,$combpos,%featposwant);
89 my ($end,$node,$side,$nsr,$endposr);
90 m,^\s*segment\s+(\w+\.\d+)\s+(\w+\.\d+)\s+(\w+)(?:/((?:[A-Za-z]+\d+)+)\*\d+)?\s+([0-9.]+)$, or die "$_ ?";
91 ($ns[0],$ns[1],$seg,$subspec,$dist)=($1,$2,$3,$4,$5);
92 if (!exists $segs{$seg}) {
93 print STDERR "ditching unwired $seg$subspec\n";
97 @subsegil= defined $subspec ? $subspec =~ m/([A-Za-z]+)(\d+)/g : ();
99 ($feat,$pos,@subsegil) = @subsegil;
100 mistake("no wiring for $seg/$feat")
101 unless exists $segr->{Feats}{$feat};
102 $featr= $segr->{Feats}{$feat};
103 if (exists $featr->{Fixed}) {
104 if ($pos != $featr->{Fixed}) {
105 print STDERR "ditching fixed-elsewise $seg$subspec\n";
109 die "$pos $featr->{Posns} ?" unless $pos < $featr->{Posns};
110 $featposwant{$feat}= $pos;
114 for $feat (keys %{ $segr->{Feats} }) {
115 $featr= $segr->{Feats}{$feat};
116 next if exists $featr->{Fixed};
117 die "$feat ?" if !exists $featposwant{$feat};
118 $combpos += $featposwant{$feat} * $featr->{Weight};
120 for ($end=0; $end<2; $end++) {
121 $ns[$end] =~ m/^([a-z]\w+)\.([01])$/;
122 ($node,$side)=($1,$2);
123 $nsr= $nodes{$node}[$side];
124 if (!exists $nsr->{Seg}) {
126 } elsif ($seg ne $nsr->{Seg}) {
127 die "$seg $nsr->{Seg} ?";
129 $endposr= $segr->{Ends}[$combpos];
130 die "$seg $combpos ?" if defined $endposr && @$endposr;
131 $endposr->[$end]= [ $node, $side ];
136 print STDOUT $_[0] or die $!;
143 $boob =~ m/^([1-9]\d*|0)\.([1-9]\d*|0)$/ or die "$boob ?";
144 return sprintf "%d,%2d",$1,$2;
154 if (m/^(invertible|vanilla|points|fixed|endwiring)$/) {
156 $invertible= ($mode eq 'invertible');
157 $mode= 'segment' if $mode =~ m/^(?:vanilla|invertible)$/;
168 $p =~ s/\d{1,6}/ sprintf "%06d%d",$&,$& /ge;
173 my (@segs,$segn,$seg,$segr,$pt,$ptv, $delim);
174 o("/* autogenerated - do not edit */\n\n".
175 "#include \"safety.h\"\n\n");
177 for $seg (sort { nummap($a) cmp nummap($b) } keys %segs) {
178 $segs{$seg}{Num}= @segs;
181 foreach $seg (@segs) {
183 next unless $segr->{FeatCount};
184 o("static const MovFeatInfo mfi_${seg}[]= {");
186 for $pt (keys %{ $segr->{Feats} }) {
187 $ptv= $segr->{Feats}{$pt};
188 next if exists $ptv->{Fixed};
190 o(" { \"$seg/$pt\", $ptv->{Posns}, $ptv->{Weight} }");
195 o("static const SegmentInfo info_segments[".scalar(@segs)."]= {");
197 foreach $seg (@segs) {
200 o(sprintf " { %-7s %d, %2d,%-9s %3d,%-9s %-6s }",
201 "\"$seg\",", $segr->{Inv},
202 $segr->{FeatCount}, ($segr->{FeatCount} ? "mfi_$seg," : '0,'),
203 $segr->{Posns}, ($segr->{FeatCount} ? "pci_$seg," : '0,'),