chiark / gitweb /
New "waggle" object kind for relays - processing from wiring etc.
authorian <ian>
Wed, 7 May 2008 23:32:28 +0000 (23:32 +0000)
committerian <ian>
Wed, 7 May 2008 23:32:28 +0000 (23:32 +0000)
cebpic/README.protocol
detpic/pindata.inc
hostside/movpos.c
hostside/startup.c
layout/data2safety
layout/layout-data.h
layout/pin-info-gen

index dff93063d3caa217ed5be1afc7b0a03a9cd8cd49..49c534380e5d84fdcc890346e9a20da5a505a718 100644 (file)
@@ -23,6 +23,8 @@ From host to PIC:
  > 0 0010 001             (11) ON        Power on
  > 0 0010 000             (10) OFF       Power off
 
+;> 1 0101 YWW  0 WWWWWWW  (a1)  WAGGLE    Set pin WWWWWWWWW to level Y
+
 ;> 00000000                     CRASHED   Acknowledge panic, go to readout mode
 ;> 00001010               (0a) TELLMODE  Confirm mode - say HELLO or CRASHED
 ;                                          if crashed, undoes the effect of ack
@@ -66,6 +68,7 @@ From PIC to host:
  < 0 000 1101             (CR)  WTIMEOUT  Watchdog timeout happened
  < 0 000 0111             (BEL) FAULT    Fault exists
  < 0 000 0110             (ACK) FIXED    Fault now fixed
+ < 0 000 0100             (ENQ)        WAGGLED   Pin changed according to WAGGLE
  < 0 0100 PPP             (20+)        POINTED   Point change done using capacitor P
  < 0 0101 PPP             (28+)        CHARGED   Point capacitor P is now charged
  < 0 00000 FF                  NMRADONE  Have processed F NMRADATA message(s)
index b53ae9ad13c6552b12d1f023e6c43896c7a59572..4d0709a4dc43a1eebeddb94710253a5a43fd87f4 100644 (file)
@@ -4,6 +4,10 @@
 
 picno2ptmap            equ     0x6100
 bkptix2portnumbitnum   equ     0x6000
+
+picno2wagglemap                equ     0x6240
+bkwaggleix2portnumbitnum equ   0x6200
+
 pic2detinfo            equ     0x6040
 picno2revmasks         equ     0x6080
 
@@ -12,3 +16,6 @@ maxpics                       equ     1 << maxpics_ln2
 
 maxpoints_ln2          equ     5
 maxpoints              equ     1 << maxpoints_ln2
+
+maxwaggles_ln2         equ     4
+maxwaggles             equ     1 << maxwaggles_ln2
index 586bcf737d1bb88ee2b8f497f7eec068f8dee26b..dc283038013d39ee3d59247e4a7447c52cb79a52 100644 (file)
@@ -538,6 +538,7 @@ static ErrorCode nomove_confirm(Change *chg, Segment *move, int n_motions,
 static const KindInfo methodinfos[]= {
  { "nomove", nomove_allocate, nomove_reserve, nomove_confirm, nomove_destroy },
  { "point",  point_allocate,  point_reserve,  point_confirm,  point_destroy  },
+ { 0 },
  { 0 }
 };
 
index 195ae25ee446371b2141f6d753f067020f28c327..baf0f872be6da25e9191ac9cf3940ac7a0d30a9c 100644 (file)
@@ -213,6 +213,8 @@ void on_pic_wtimeout(const PicInsnInfo *pii, const PicInsn *pi, int objnum) {
 
 void on_pic_hello(const PicInsnInfo *pii, const PicInsn *pi, int objnum)
   { abort(); }
+void on_pic_waggled(const PicInsnInfo *pii, const PicInsn *pi, int objnum)
+  { abort(); }
 void on_pic_aaargh(const PicInsnInfo *pii, const PicInsn *pi, int objnum)
   { abort(); }
 void on_pic_spurious(const PicInsnInfo *pii, const PicInsn *pi, int objnum) {
index 21e6b4d26b5493e0fa2f0c77bf9df0fdbbad2c76..9df30cc8db5120ea8f87f17c0e7471f96d8442d8 100755 (executable)
@@ -10,17 +10,21 @@ $basename =~ s/\.wiring$//;
 our ($mistakes, $currentline);
 
 our (%segs);
-# $segs{$seg}{Inv}
+# ->{BoOb}{Kind}  'pt' 'sense' 'reverse' 'waggle'
+# ->{BoOb}{Board}
+# ->{BoOb}{Obj}
+# ->{BoOb}{Indiv}   for `indiv' board objects like wagglers
+# $segs{$seg}{InvBoOb}
 # $segs{$seg}{BoOb}
 # $segs{$seg}{Posns}
-# $segs{$seg}{FeatCount}              does not include Fixed
-# $segs{$seg}{Feats}{$pt}{Kind}       Point or Fixed
-# $segs{$seg}{Feats}{$pt}{Weight}     ) for Point only
-# $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}{Inter}{Seg}            ) calculated
-# $segs{$seg}{Inter}{Map}             )  in writeout
+# $segs{$seg}{FeatCount}                does not include Fixed
+# $segs{$seg}{Feats}{$feat}{Kind}       Point, Fixed, or Relay
+# $segs{$seg}{Feats}{$feat}{Weight}     ) for Point or Relay only
+# $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}{Inter}{Seg}              ) calculated
+# $segs{$seg}{Inter}{Map}               )  in writeout
 
 # $segs{$seg}{Num}
 # $segs{$seg}{Ends}[$combpos][$end] = [ $node,$side ]
@@ -35,6 +39,7 @@ our (%nodes);
 # $nodes{$node}[$side]{End}
 
 our ($maxptixln2) = 5;
+our ($maxwaggleixln2) = 4;
 
 our ($nextboardnum,@boardtype,@sensesin,$maxreverseobjnum);
 our (@reversersboardnum,@sensesbase,@objkinds,%pin_used);
@@ -46,9 +51,9 @@ our (@reversersboardnum,@sensesbase,@objkinds,%pin_used);
 # $pin_used{$objkind}[$objnum] = [ $boardnum, $pin_info, $objonboard ]
 $nextboardnum= 0;
 $sensesin[0]= 0;
-@objkinds= qw(pt sense reverse);
+@objkinds= qw(pt sense reverse waggle);
 
-our (%kind_count,%pin_info); # from BOARD.pin-info
+our (%kind_count,%pin_info,%pin_info_indiv); # from BOARD.pin-info
 
 our ($mode,$invertible);
 $mode= 'barf';
@@ -98,48 +103,70 @@ sub ditch ($) {
     print STDERR "info: ditching $m\n";
 }
 
+sub seg_wiring ($$$) {
+    my ($seg,$feat,$hash) = @_;
+    mistake("unknown wiring for $seg in $seg/$feat")
+       unless exists $segs{$seg};
+    mistake("duplicate wiring for $seg/$feat")
+       if exists $segs{$seg}{Feats}{$feat};
+    if (exists $hash->{Posns}) {
+       $hash->{Weight}= $segs{$seg}{Posns};
+       $segs{$seg}{Posns} *= 2;
+       $segs{$seg}{FeatCount}++;
+    }
+    $segs{$seg}{Feats}{$feat}= $hash;
+}
+
 sub begin_points () { }
 sub line_points () {
-    my ($seg,$pt,@boob,$bodef);
+    my ($seg,$pt,@boobstr,$bodef);
     m,^\s+(\w+)/([A-Za-z]+)\s+((\d+)\.\d+)\s+(\d*\.\d+)$, or
        return syntaxerror();
-    ($seg,$pt,$boob[0],$bodef,$boob[1])=($1,$2,$3,$4,$5);
-    $boob[1] =~ s/^\./$bodef./;
-    mistake("unknown wiring for $seg in $seg/$pt") unless exists $segs{$seg};
-    mistake("duplicate wiring for $seg/$pt") if exists $segs{$seg}{Feats}{$pt};
-    $segs{$seg}{Feats}{$pt}= {
+    ($seg,$pt,$boobstr[0],$bodef,$boobstr[1])=($1,$2,$3,$4,$5);
+    $boobstr[1] =~ s/^\./$bodef./;
+    seg_wiring($seg,$pt, {
        Kind => Point,
-       Weight => $segs{$seg}{Posns},
        Posns => 2,
-       BoOb => [ map { pa_boob($_) } @boob ]
-       };
-    $segs{$seg}{Posns} *= 2;
-    $segs{$seg}{FeatCount}++;
-}
+       BoObs => [ map { pa_boob('pt',$_) } @boobstr ],
+    });
+}
+
+sub begin_relays () { }
+sub line_relays () {
+    my ($seg,$rly,$waggle);
+    m,^\s+(\w+)/([A-Za-z]+)\s+([1-9]\d*|0)\.(\w+)$, or return syntaxerror();
+    ($seg,$rly)= ($1,$2);
+    $waggle= { Kind => 'waggle', Board => $3, Indiv => $4 };
+    seg_wiring($seg,$rly, {
+       Kind => Relay,
+       Posns => 2,
+       BoObs => [ $waggle ],
+    });
+}    
 
 sub begin_fixed () { }
 sub line_fixed () {
-    my ($seg,$pt,$pos);
+    my ($seg,$feat,$pos);
     m,^\s+(\w+)/([A-Za-z]+)(\d+)$, or return syntaxerror();
-    ($seg,$pt,$pos)=($1,$2,$3);
-    mistake("unknown wiring for $seg in $seg/$pt") unless exists $segs{$seg};
-    mistake("duplicate fixed $seg/$pt") if exists $segs{$seg}{Feats}{$pt};
-    $segs{$seg}{Feats}{$pt}= {
+    ($seg,$feat,$pos)=($1,$2,$3);
+    seg_wiring($seg,$feat, {
        Kind => Fixed,
-       Fixed => $pos
-       };
+       Fixed => $pos,
+    });
 }
 
 sub begin_segment () { }
 sub line_segment () {
-    my ($seg,$boob);
+    my ($seg,$boobstr,$boob);
     m/^\s+(\w+)\s+(\d+\.\d+)$/ or return syntaxerror();
-    ($seg,$boob)=($1,$2);
+    ($seg,$boobstr)=($1,$2);
     mistake("duplicate topology for $seg") if exists $segs{$seg};
-    $boob= pa_boob($boob);
+    $boob= pa_boob('sense', $boobstr);
     $segs{$seg}= {
        BoOb => $boob,
-       Inv => $invertible,
+       InvBoOb => $invertible ? { Kind => 'reverse',
+                                  Board => $boob->{Board},
+                                  Obj => $boob->{Obj} } : undef,
        Posns => 1,
        Feats => { },
        FeatCount => 0
@@ -184,7 +211,7 @@ sub line_boards_detectors { }
 sub line_segment_vanilla ($) { }
 sub line_segment_invertible ($) {
     my ($boob) = @_;
-    $reversersboardnum[$boob->[0]]= -1;
+    $reversersboardnum[ $boob->{Board} ]= -1;
 }
 
 sub begin_interferences () {
@@ -281,20 +308,28 @@ sub o ($) {
     print STDOUT $_[0] or die $!;
 }
 
-sub pa_boob ($) {
-    my ($boob) = @_;
-    if ($boob !~ m/^([1-9]\d*|0)\.([1-9]\d*|0)$/) {
-       mistake("invalid board object $boob");
-       return [ 0,0 ];
+sub pa_boob ($$) {
+    my ($kind,$str) = @_;
+    if ($str !~ m/^([1-9]\d*|0)\.([1-9]\d*|0)$/) {
+       mistake("invalid board object $str");
+       return { Kind => $kind, Board => 0, Obj => 0 };
     }
-    return [ $1,$2 ];
+    return { Kind => $kind, Board => $1, Obj => $2 };
 }
 
-# boob2objnum_KIND($boardnum,$objnum,$boardtype,$mkused
+# boob2objnum_KIND($boob,$boardnum,$objnum,$boardtype,$mkused ...)
 #  -> global object number
 
+sub boob2objnum_waggle {
+    my ($boob,$boardnum,$objnum) = @_;
+    mistake("waggle encoding out of range") if
+       $boardnum >= (1 << (9 - $maxwaggleixln2));
+    die if $objnum >= (1 << $maxwaggleixln2);
+    return ($boardnum << ($maxwaggleixln2+1)) | $objnum;
+}
+
 sub boob2objnum_pt {
-    my ($boardnum,$obj)=@_;
+    my ($boob,$boardnum,$obj)=@_;
     mistake("point encoding out of range") if
        $boardnum >= (1 << (10 - $maxptixln2));
     die if $obj >= (1 << $maxptixln2);
@@ -302,7 +337,7 @@ sub boob2objnum_pt {
 }
 
 sub boob2objnum_reverse {
-    my ($orgboardnum,$obj,$boardtype)=@_;
+    my ($boob,$orgboardnum,$obj,$boardtype)=@_;
     # Converts board and object number (in canonical pic number plus
     # and reverse0...reverse5 as seen on pinout diagrams), to the
     # segment number for POLARITY command numbered as shown in
@@ -355,7 +390,7 @@ sub boob2objnum_reverse {
 }
 
 sub boob2objnum_sense {
-    my ($boardnum,$obj)=@_;
+    my ($boob,$boardnum,$obj)= @_;
     my $type= $boardtype[$boardnum];
     my $bitnum= $sensepermute{$type}[$obj];
     die "$type $obj ($boardnum)" unless defined $bitnum;
@@ -365,39 +400,63 @@ sub boob2objnum_sense {
     return $base+$bitnum;
 }    
 
-sub boob2objnum ($$$$) {
-    my ($boardnum,$obj,$kind,$mkused) = @_;
-    my ($type);
+sub boob2objnum ($$) {
+    my ($mkused,$boob) = @_;
+    my ($kind,$boardnum,$type);
+    $kind= $boob->{Kind};
+    $boardnum= $boob->{Board};
+#use Data::Dumper;
+#print STDERR "boob2objnum($mkused, ", Dumper($boob), " )\n";
     $type= $boardtype[$boardnum];
-    return &{"boob2objnum_$kind"}($boardnum,$obj,$type,$mkused);
+    return &{"boob2objnum_$kind"}
+        ($boob, $boardnum, $boob->{Obj}, $type, $mkused);
 }
 
-sub boob_used ($$$) {
-    my ($boardnum,$obj,$kind) = @_;
+sub boob_used ($) {
+    my ($boob) = @_;
     my ($objnum);
-    $objnum= boob2objnum($boardnum, $obj, $kind, 0);
-    return $pin_used{$kind}[$objnum];
+    $objnum= boob2objnum(0, $boob);
+    return $pin_used{$boob->{Kind}}[$objnum];
 }
 
-sub boob_used_bit ($$$) {
-    my ($boardnum,$obj,$kind) = @_;
-    return defined boob_used($boardnum,$obj,$kind) ? 1 : 0;
+sub boob_used_bit ($) {
+    my ($boob) = @_;
+    return defined boob_used($boob) ? 1 : 0;
 }
 
-sub so_boob ($$$;$) {
-    my ($kind,$mkused,$bo, $objnum_rr) = @_;
-    my ($type,$pi);
+sub boardtype ($) {
+    my ($board)=@_;
+#print STDERR ">$board<\n";
+    mistake("unknown board number $board") unless defined $boardtype[$board];
+    return $boardtype[$board];
+}
+
+sub kind2genkind ($) {
+    my ($k) = @_;
+    return 'indiv' if $k eq 'waggle';
+    return $k;
+}
+
+sub boob2genkind ($) {
+    my ($boob) = @_;
+    return kind2genkind($boob->{Kind});
+}
+
+sub so_boob ($$;$) {
+    my ($mkused,$bo, $objnum_rr) = @_;
+    my ($type,$objnum,$pi,$genkind);
     if (defined $bo) {
-       my ($board,$obj)= @$bo;
-       my ($objnum,$type,$pi);
-       mistake("unknown board number $board")
-           unless defined $boardtype[$board];
-       $type= $boardtype[$board];
-       $pi= $pin_info{$type}{$kind};
-       mistake("object reference $kind $board.$obj out of range for".
-               " board type $type")
+       my ($kind,$board,$obj) = map { $bo->{$_} } qw(Kind Board Obj);
+#print STDERR "so_boob >$kind|$board$obj<\n";
+       $genkind= boob2genkind($bo);
+#print STDERR "so_boob    >$board|$obj<\n";
+       $type= boardtype($board);
+       $pi= $pin_info{$type}{$genkind};
+       mistake("object reference $genkind ($kind) $board.$obj out of range".
+               " for board type $type")
            unless defined $pi->[$obj];
-       $objnum= boob2objnum($board,$obj,$kind,$mkused);
+print STDERR "so_boob >$kind|$board $obj|$pi->[$obj]<\n" if $kind eq 'waggle';
+       $objnum= boob2objnum($mkused,$bo);
 #print "so_boob >$objnum_rr|$$objnum_rr< = $objnum\n";
        $$objnum_rr= $objnum;
        $pin_used{$kind}[$objnum]= [ $board, $pi->[$obj], $obj ]
@@ -410,10 +469,9 @@ sub so_boob ($$$;$) {
     }
 }
 
-sub so_objboob ($$$;$) {
-    my ($kind,$mkused,$obj, $objnum_rr) = @_;
-    return so_boob($kind,$mkused,
-                  defined $obj ? $obj->{BoOb} : undef,
+sub so_objboob ($$;$) {
+    my ($mkused,$obj,$objnum_rr) = @_;
+    return so_boob($mkused, defined $obj ? $obj->{BoOb} : undef,
                   $objnum_rr);
 }
 
@@ -425,7 +483,7 @@ sub mainread () {
        s/\s+$//;
        next unless m/\S/;
        last if m/^end$/;
-       if (m/^(invertible|vanilla|points|fixed|endwiring|boards|interferences)$/) {
+       if (m/^(invertible|vanilla|points|relays|fixed|endwiring|boards|interferences)$/) {
            $mode= $1;
            $invertible= ($mode eq 'invertible');
            $mode= 'segment' if $mode =~ m/^(?:vanilla|invertible)$/;
@@ -437,6 +495,21 @@ sub mainread () {
     }
 }
 
+sub redact_indir ($$) {
+    my ($r, $what)= @_;
+#use Data::Dumper;
+#print STDERR "redact ", Dumper($r), "\n";
+    return unless exists $r->{Indiv};
+    my ($board,$indiv);
+    $board= $r->{Board};
+    $indiv= $r->{Indiv};
+#print STDERR "redact >$board|$indiv<\n";
+    my $boardtype= boardtype($board);
+    mistake("unknown pin name $boardtype.$indiv for $what")
+       unless defined $pin_info_indiv{$boardtype}{$indiv};
+    $r->{Obj}= $pin_info_indiv{$boardtype}{$indiv};
+}
+
 sub redaction () {
     my ($num,$mappednum,$i,$objnum);
     $maxreverseobjnum= 0;
@@ -445,11 +518,23 @@ sub redaction () {
        die if $reversersboardnum[$num] != -1;
        $reversersboardnum[$num]= $mappednum;
        for ($i=0; $i<6; $i++) {
-           $objnum= boob2objnum($mappednum,$i,'reverse',0);
+           $objnum= boob2objnum(0, { Kind => 'reverse',
+                                     Board => $num,
+                                     Obj => $i });
            $maxreverseobjnum= $objnum+1 if $objnum >= $maxreverseobjnum;
        }
        $mappednum++;
     }
+    my ($seg,$segr,$feat,$featr,$board,$indir,$boardtype);
+    foreach $seg (keys %segs) {
+       $segr= $segs{$seg};
+       foreach $feat (keys %{ $segr->{Feats} }) {
+           $featr= $segr->{Feats}{$feat};
+           map {
+               redact_indir($_,"segment $featr->{Kind} $seg/$feat");
+           } @{ $featr->{BoObs} };
+       }
+    }
 }    
 
 sub nummap ($) {
@@ -463,8 +548,8 @@ sub so_segnum ($) {
 }
 
 sub writeout () {
-    my (@segs,$segn,$seg,$segr,$pt,$ptv, $delim);
-    my ($comb,$pi,$feat,$featr,$end,$boob);
+    my (@segs,$segn,$seg,$segr,$feat,$featv, $delim);
+    my ($comb,$pi,$end,$boob);
     my ($node,$side,$otherend,$nodeotherside,$otherseg,$otherbackrelus);
     my ($ourinter,$pcname,$intere,$intother);
     o("/* autogenerated - do not edit */\n\n");
@@ -498,10 +583,10 @@ sub writeout () {
        for ($comb=0; $comb < $segr->{Posns}; $comb++) {
            $pi='';
            foreach $feat (keys %{ $segr->{Feats} }) {
-               $featr= $segr->{Feats}{$feat};
-               next if exists $featr->{Fixed};
+               $featv= $segr->{Feats}{$feat};
+               next if exists $featv->{Fixed};
                $pi.= sprintf("%s%d", $feat,
-                             ($comb / $featr->{Weight}) % $featr->{Posns});
+                             ($comb / $featv->{Weight}) % $featv->{Posns});
            }
            o("$delim\n");
            o(sprintf " { %-7s%4d, { ",
@@ -563,14 +648,14 @@ sub writeout () {
 
        next unless $segr->{FeatCount};
 
-       for $pt (keys %{ $segr->{Feats} }) {
-           $ptv= $segr->{Feats}{$pt};
-           next if exists $ptv->{Fixed};
-           o("static const BoardObject mfbo_${seg}_${pt}"."[]= {");
+       for $feat (keys %{ $segr->{Feats} }) {
+           $featv= $segr->{Feats}{$feat};
+           next if exists $featv->{Fixed};
+           o("static const BoardObject mfbo_${seg}_${feat}"."[]= {");
            $delim=' ';
-           foreach $boob (@{ $ptv->{BoOb} }) {
+           foreach $boob (@{ $featv->{BoObs} }) {
                o($delim);
-               o(so_boob('pt',1, $boob));
+               o(so_boob(1, $boob));
                $delim= ', ';
            }
            o(" };\n");
@@ -578,12 +663,12 @@ sub writeout () {
            
        o("static const MovFeatInfo mfi_${seg}"."[]= {");
        $delim='';
-       for $pt (keys %{ $segr->{Feats} }) {
-           $ptv= $segr->{Feats}{$pt};
-           next if exists $ptv->{Fixed};
+       for $feat (keys %{ $segr->{Feats} }) {
+           $featv= $segr->{Feats}{$feat};
+           next if exists $featv->{Fixed};
            o("$delim\n");
-           o("  { \"$pt\", mfk_".lc($ptv->{Kind}).",".
-             " $ptv->{Posns}, $ptv->{Weight}, mfbo_${seg}_$pt }");
+           o("  { \"$feat\", mfk_".lc($featv->{Kind}).",".
+             " $featv->{Posns}, $featv->{Weight}, mfbo_${seg}_$feat }");
            $delim=',';
        }
        o("\n};\n");
@@ -603,11 +688,11 @@ sub writeout () {
        $segr= $segs{$seg};
        o("$delim\n");
        o(sprintf " { %-7s%d,%d,%2d,%-9s%d,%-10s%-6s,%-7s",
-         "\"$seg\",",$segr->{Inv},$segr->{Inter}{Invert},
+         "\"$seg\",",$segr->{InvBoOb}?1:0,$segr->{Inter}{Invert},
          $segr->{FeatCount}, ($segr->{FeatCount} ? "mfi_$seg," : '0,'),
          $segr->{Posns}, "spci_$seg,",
-         so_objboob('sense',1, $segr, \$sensenum),
-         so_objboob('reverse',1, $segr->{Inv} ? $segr : undef).',');
+         so_objboob(1, $segr, \$sensenum),
+         so_boob(1, $segr->{InvBoOb}).',');
        $ourinter= $segr->{Inter};
        if (defined $ourinter->{Seg}) {
            o(sprintf "%4s,0%o ", so_segnum($ourinter->{Seg}),
@@ -688,24 +773,32 @@ END
     o_section_end_fill($num, 0, 2);
 }
 
-sub writeasm_pt {
+sub writeasm_pt ($$) { writeasm_ptwag('pt',$maxptixln2); }
+sub writeasm_waggle ($$) { writeasm_ptwag('waggle',$maxwaggleixln2); }
+sub writeasm_ptwag ($$) {
+    my ($ptwag, $maxthingixln2) = @_;
+    my $bitmapbitsperpic= 1<<$maxthingixln2;
+    my $bitmapbytesperpic= 1<<($maxthingixln2-3);
     my ($num, $elemsize, $byte, $bit, $objnum);
-    o_section('picno2ptmap',<<'END');
-; Bitmap indexed first by pic no, and then by point no. on that board,
-; saying whether the point is present or not.  Each pic has 4 bytes,
-; ie 32 bits.  First byte is points 0 to 7, in bits 0 to 7 respectively
-; so that MSbit of byte 3 (4th byte) is point no.31.  Unused boards
-; or boards with no points are all-bits-0.
+    o_section("picno2${ptwag}map",<<"END");
+; Bitmap indexed first by pic no, and then by thing no. on that board,
+; saying whether the thing is present or not.  Each pic has
+; $bitmapbytesperpic bytes, ie $bitmapbitsperpic bits.  First byte is
+; objects 0 to 7, in bits 0 to 7 respectively so that MSbit of byte 3
+; (4th byte) is object no.31.  Unused boards or boards with no such
+; objects are all-bits-0.
 END
     for ($num=0; $num<@boardtype; $num++) {
        if (!defined $boardtype[$num]) { o("  dw  0\t\t\t\t; $num"); next; }
-       die if $maxptixln2 < 4; # must be whole no. of 16-bit words
-       $elemsize= 1 << ($maxptixln2-3);
+       die if $maxthingixln2 < 4; # must be whole no. of 16-bit words
+       $elemsize= $bitmapbytesperpic;
        for ($byte=0; $byte < $elemsize; $byte++) {
            o_db($byte, 0);
            o("b'");
            for ($bit=7; $bit>=0; $bit--) {
-               o(boob_used_bit($num, $byte*8 + $bit, 'pt'));
+               o(boob_used_bit({ Kind => $ptwag,
+                                 Board => $num,
+                                 Obj => $byte*8 + $bit }));
            }
            o("'");
        }
@@ -714,15 +807,16 @@ END
     o("\n");
     o_section_end_fill($num, 0, $elemsize);
 
-    my($typeix,$type,$pt,$pi);
-    o_section('bkptix2portnumbitnum',<<"END");
-; Table giving physical ports and pins for points for each
-; kind of board.  Index is point number (for reversers boards)
-; or point number + 2^$maxptixln2 (for detectors boards).
+    my ($typeix,$type,$pi,$indexpr);
+    $indexpr= '0'x(7-$maxthingixln2). 'D'. 'o'x$maxthingixln2;
+    o_section("bk${ptwag}ix2portnumbitnum",<<"END");
+; Table giving physical ports and pins for points/wagglers for each
+; kind of board.  Index is object number (for reversers boards)
+; or object number + 2^$maxthingixln2 (for detectors boards).
 ; Value is one byte, either 0xff meaning that board type has
-; no such point, or top nybble being port number (0 for A, 1 for B,
+; no such object, or top nybble being port number (0 for A, 1 for B,
 ; etc.) and bottom nybble being bit number.  Ie,
-;   Index:  00Dppppp    where D is 1 iff detectors board and p is pt ix
+;   Index:  $indexpr    where D is 1 iff detectors board and o is obj
 ;   Value:  0ppp0bbb    where p is port num and b is bit num; or 0xff
 END
     o("  radix hex\n");
@@ -730,9 +824,9 @@ END
        $type= qw(reversers detectors)[$typeix];
        die $type unless $pin_info{$type};
        o("; $type:");
-       for ($pt=0; $pt < (1 << $maxptixln2); $pt++) {
-           o_db($pt);
-           $pi= $pin_info{$type}{'pt'}[$pt];
+       for ($objnum=0; $objnum < (1 << $maxthingixln2); $objnum++) {
+           o_db($objnum);
+           $pi= $pin_info{$type}{kind2genkind($ptwag)}[$objnum];
            if (defined $pi) {
                $pi =~ m/^(\d)\,(\d)\,/ or die;
                o($1.$2);
@@ -757,7 +851,9 @@ END
        @portae= ([],[]);
        $kc= $kind_count{$boardtype[$num]}{'reverse'};
        for ($bit= $kc-1; $bit>=0; $bit--) {
-           $pu= boob_used($num, $bit, 'reverse');
+           $pu= boob_used({ Board => $num,
+                            Obj => $bit,
+                            Kind => 'reverse' });
            next unless $pu;
            $pu->[1] =~ m/^([04])\,\d,(0x\w{2})$/ or die;
            push @{ $portae[!!$1] }, $2;
index 8952f3f7c6baa03569f27294515029a574b8e696..c45ab8a9e705e28d154b25fda92c3f012a66b145 100644 (file)
@@ -26,7 +26,8 @@ typedef int Distance;
 
 typedef enum {
   mfk_none,
-  mfk_point
+  mfk_point,
+  mfk_relay
   /* must also add new entries to movpos.c:methodinfos */
 } MovFeatKind;
 
index 2da9769a32f2993098bae2de4ae55c4265f55a68..cf8dffb32322c61bd98e362a155489c2170b7c4c 100755 (executable)
@@ -30,6 +30,18 @@ print "our (\%pin_info,\%kind_count);\n"
     or die $!;
 
 $kinds= 'pt|sense|reverse';
+$oraw= '';
+
+sub raw_pin ($) {
+    my ($name) = @_;
+    $oraw.= "\$pin_info_raw{'$board'}{'$name'}= '$pins[$pin]';\n";
+}
+sub direct ($$) {
+    my ($kind,$num) = @_;
+    die "$pin $kind $num ?" unless defined $pins[$pin];
+    print "\$pin_info{'$board'}{'$kind'}[$num]= '$pins[$pin]';\n"
+       or die $!;
+}
 
 open B, "../pcb/$board.net" or die $!;
 while (<B>) {
@@ -38,20 +50,34 @@ while (<B>) {
     $net= $1; $pins= $2; $pin= undef;
     map { $pin=$1 if m/PIC-(\d+)/; } split /\s+/, $pins;
     next unless defined $pin;
-    next unless $net =~ m/^(?:.*__)?($kinds)(\d+)(?:__.*)?$/;
-    $kind= $1; $num= $2;
-    die "$pin $kind $num ?" unless defined $pins[$pin];
-    print "\$pin_info{'$board'}{'$kind'}[$num]= '$pins[$pin]';\n"
-       or die $!;
-    $count{$kind}= $num+1 if $num>=$count{$kind};
+    if ($net =~ m/^(?:.*__)?($kinds)(\d+)(?:__.*)?$/) {
+       ($kind,$num)=($1,$2);
+       direct($kind,$num);
+       $count{$kind}= $num+1 if $num>=$count{$kind};
+    }
+    @indivnames= ();
+    map {
+       if (m/^(INDIV\d?)\-(\d+)$/) {
+           push @indivnames, lc($1).'_'.$2;
+       }
+    } split /\s+/, $pins;
+    if (@indivnames) {
+       push @indivnames, split /__/, $net;
+       $n= $count{'indiv'}++;
+       direct('indiv', $n);
+       map {
+           $oindiv.= "\$pin_info_indiv{'$board'}{'$_'}= $n;\n";
+       } @indivnames;
+    }
 }
 B->error and die $!;
 
-for $kind (split /\|/, $kinds) {
+for $kind (qw(indiv), split /\|/, $kinds) {
     printf("\$kind_count{'%s'}{'%s'}= %d;\n",
           $board, $kind, $count{$kind})
        or die $!;
 }
+print $oindiv or die $!;
 print "1;\n"
     or die $!;