chiark / gitweb /
realtime: print all movpos positions on entering Run
[trains.git] / layout / pin-info-gen
1 #!/usr/bin/perl
2 # usage:
3 #  pinout-gen BOARDNAME
4
5 use IO::Handle;
6
7 @ARGV==1 or die $!;
8 $board= shift @ARGV;
9
10 $cpin=1; $_='';
11 for (;;) {
12     if (!length) { $_= <DATA>; last unless length; $_.=' '; s/^\s+//; }
13     if (m/^\#/) {
14         $_='';
15     } elsif (s/^\-\s+//) {
16         $cpin++;
17     } elsif (s/^[ABCDE]\s+//) {
18         $port= ord($&) - ord('A');
19     } elsif (s/^([0-7])\s+//) {
20         die unless defined $port;
21         $pins[$cpin++]= sprintf "%d,%d,0x%02x",
22             $port, $1, 1 << $1;
23     } else {
24         die "$_ ?";
25     }
26 }
27 die unless $cpin==41;
28
29 print "our (\%pin_info,\%kind_count);\n"
30     or die $!;
31
32 $kinds= 'pt|sense|reverse';
33 $oraw= '';
34
35 sub raw_pin ($) {
36     my ($name) = @_;
37     $oraw.= "\$pin_info_raw{'$board'}{'$name'}= '$pins[$pin]';\n";
38 }
39 sub direct ($$) {
40     my ($kind,$num) = @_;
41     die "$pin $kind $num ?" unless defined $pins[$pin];
42     print "\$pin_info{'$board'}{'$kind'}[$num]= '$pins[$pin]';\n"
43         or die $!;
44 }
45
46 open B, "../pcb/$board.net" or die $!;
47 while (<B>) {
48     if (s/\\$//) { $_.= <B>; }
49     m/^(\w+)\s+[A-Z]\w+\s+([-_A-Z0-9 \t]+)$/;
50     $net= $1; $pins= $2; $pin= undef;
51     map { $pin=$1 if m/PIC-(\d+)/; } split /\s+/, $pins;
52     next unless defined $pin;
53     if ($net =~ m/^(?:.*__)?($kinds)(\d+)(?:__.*)?$/) {
54         ($kind,$num)=($1,$2);
55         direct($kind,$num);
56         $count{$kind}= $num+1 if $num>=$count{$kind};
57     }
58     @indivnames= ();
59     map {
60         if (m/^(INDIV\d?)\-(\d+)$/) {
61             push @indivnames, lc($1).'_'.$2;
62         }
63     } split /\s+/, $pins;
64     if (@indivnames) {
65         push @indivnames, split /__/, $net;
66         $n= $count{'indiv'}++;
67         direct('indiv', $n);
68         map {
69             $oindiv.= "\$pin_info_indiv{'$board'}{'$_'}= $n;\n";
70         } @indivnames;
71     }
72 }
73 B->error and die $!;
74
75 for $kind (qw(indiv), split /\|/, $kinds) {
76     printf("\$kind_count{'%s'}{'%s'}= %d;\n",
77            $board, $kind, $count{$kind})
78         or die $!;
79 }
80 print $oindiv or die $!;
81 print "1;\n"
82     or die $!;
83
84 __DATA__
85 # 1..20
86 -
87 A 0 1 2 3 4 5
88 E 0 1 2
89 - - -
90 A 6
91 C 0 1 2 3
92 D 0 1
93 # 21..6
94 D 2 3
95 C 4 5 6 7
96 D 4 5 6 7
97 - -
98 B 0 1 2 3 4 5 6 7