chiark / gitweb /
undo broken deletion
[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
34 open B, "../pcb/$board.net" or die $!;
35 while (<B>) {
36     if (s/\\$//) { $_.= <B>; }
37     m/^(\w+)\s+[A-Z]\w+\s+([-_A-Z0-9 \t]+)$/;
38     $net= $1; $pins= $2; $pin= undef;
39     map { $pin=$1 if m/PIC-(\d+)/; } split /\s+/, $pins;
40     next unless defined $pin;
41     next unless $net =~ m/^(?:.*__)?($kinds)(\d+)(?:__.*)?$/;
42     $kind= $1; $num= $2;
43     die "$pin $kind $num ?" unless defined $pins[$pin];
44     print "\$pin_info{'$board'}{'$kind'}[$num]= '$pins[$pin]';\n"
45         or die $!;
46     $count{$kind}= $num+1 if $num>=$count{$kind};
47 }
48 B->error and die $!;
49
50 for $kind (split /\|/, $kinds) {
51     printf("\$kind_count{'%s'}{'%s'}= %d;\n",
52            $board, $kind, $count{$kind})
53         or die $!;
54 }
55 print "1;\n"
56     or die $!;
57
58 __DATA__
59 # 1..20
60 -
61 A 0 1 2 3 4 5
62 E 0 1 2
63 - - -
64 A 6
65 C 0 1 2 3
66 D 0 1
67 # 21..6
68 D 2 3
69 C 4 5 6 7
70 D 4 5 6 7
71 - -
72 B 0 1 2 3 4 5 6 7