9 # $segs{$seg}{FeatCount} does not include Fixed
10 # $segs{$seg}{Feats}{$pt}{Kind} Point or Fixed
11 # $segs{$seg}{Feats}{$pt}{Weight} ) for Point only
12 # $segs{$seg}{Feats}{$pt}{Posns} ) for Point only
13 # $segs{$seg}{Feats}{$pt}{BoOb} ) for Point only
14 # $segs{$seg}{Feats}{$pt}{Fixed} position, for Fixed only
16 our ($mode,$invertible);
19 sub line_barf () { die; }
21 sub begin_points () { }
23 my ($seg,$pt,@boob,$bodef);
24 m,^\s+(\w+)/([A-Za-z]+)\s+((\d+)\.\d+)\s+(\d*\.\d+)$, or die "$_ ?";
25 ($seg,$pt,$boob[0],$bodef,$boob[1])=($1,$2,$3,$4,$5);
26 $boob[1] =~ s/^\./$bodef./;
27 die "$_ ?" unless exists $segs{$seg};
28 die "$_ ?" if exists $segs{$seg}{Feats}{$pt};
29 $segs{$seg}{Feats}{$pt}= {
31 Weight => $segs{$seg}{Posns},
35 $segs{$seg}{Posns} *= 2;
36 $segs{$seg}{FeatCount}++;
39 sub begin_fixed () { }
42 m,^\s+(\w+)/([A-Za-z]+)(\d+)$, or die "$_ ?";
43 ($seg,$pt,$pos)=($1,$2,$3);
44 die "$_ ?" unless exists $segs{$seg};
45 die "$_ ?" if exists $segs{$seg}{Feats}{$pt};
46 $segs{$seg}{Feats}{$pt}= {
52 sub begin_segment () { }
55 m/^\s+(\w+)\s+(\d+\.\d+)$/ or die "$_ ?";
57 die "$_ ?" if exists $segs{$seg};
67 sub begin_endwiring () {
70 # o("static const SegPosCombInfo spci_${seg}[]= {");
72 # for ($comb=0; $comb < $segv->{Posns}; $comb++) {
75 sub line_endwiring () {
76 my (@ns,$seg,$subspec,$dist);
77 m,^\s*segment\s+(\w+\.\d+)\s+(\w+\.\d+)\s+(\w+)((?:/\w+\*\d+)?)\s+([0-9.]+)$, or die "$_ ?";
78 ($ns[0],$ns[1],$seg,$subspec,$dist)=($1,$2,$3,$4,$5);
79 if (!exists $segs{$seg}) {
80 print STDERR "ditching unwired $seg$subspec\n";
83 for ($end=0; $end<2; $end++) {
84 $ns[$end] =~ m/^([a-z]\w+)\.([01])$;
85 ($node,$side)=($1,$2);
86 if (exists $nodes{$node}
91 print STDOUT $_[0] or die $!;
98 $boob =~ m/^([1-9]\d)*\.([1-9]\d*)$/ or die "$boob ?";
99 return sprintf "%d,%d",$1,$2;
109 if (m/^(invertible|vanilla|points|fixed|endwiring)$/) {
111 $invertible= ($mode eq 'invertible');
112 $mode= 'segment' if $mode =~ m/^(?:vanilla|invertible)$/;
121 my ($seg,$segv,$pt,$ptv, $delim);
122 o("/* autogenerated - do not edit */\n\n");
123 for $seg (keys %segs) {
125 next unless $segv->{FeatCount};
126 o("static const MovFeatInfo mfi_${seg}[]= {");
128 for $pt (keys %{ $segv->{Feats} }) {
129 $ptv= $segv->{Feats}{$pt};
130 next if exists $ptv->{Fixed};
132 o(" { \"$seg/$pt\", $ptv->{Posns}, $ptv->{Weight} }");