#!/usr/bin/perl # usage: # pinout-gen BOARDNAME use IO::Handle; @ARGV==1 or die $!; $board= shift @ARGV; $cpin=1; $_=''; for (;;) { if (!length) { $_= ; last unless length; $_.=' '; s/^\s+//; } if (m/^\#/) { $_=''; } elsif (s/^\-\s+//) { $cpin++; } elsif (s/^[ABCDE]\s+//) { $port= ord($&) - ord('A'); } elsif (s/^([0-7])\s+//) { die unless defined $port; $pins[$cpin++]= sprintf "%d,%d,0x%02x", $port, $1, 1 << $1; } else { die "$_ ?"; } } die unless $cpin==41; print "our (\%pin_info,\%kind_count);\n" or die $!; $kinds= 'pt|sense|reverse'; open B, "../pcb/$board.net" or die $!; while () { if (s/\\$//) { $_.= ; } m/^(\w+)\s+[A-Z]\w+\s+([-_A-Z0-9 \t]+)$/; $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}; } B->error and die $!; for $kind (split /\|/, $kinds) { printf("\$kind_count{'%s'}{'%s'}= %d;\n", $board, $kind, $count{$kind}) or die $!; } print "1;\n" or die $!; __DATA__ # 1..20 - A 0 1 2 3 4 5 E 0 1 2 - - - A 6 C 0 1 2 3 D 0 1 # 21..6 D 2 3 C 4 5 6 7 D 4 5 6 7 - - B 0 1 2 3 4 5 6 7