openocd jtag pin toggle
[x300-pci] / vhdl-pingen.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4 use autodie;
5
6 use Storable;
7 use Data::Dump qw(dump);
8
9 my $sections = 4;
10
11 my $pin2io = retrieve('/dev/shm/pin2io.storable');
12 warn "# $= ",dump($pin2io);
13 my @pin2io = @{ $$pin2io };
14 warn "# @= ",dump( @pin2io );
15
16 my @ports;
17 my $stat;
18 my @pin_s;
19 my @location_assignment,
20
21 my $pins_in_section = @pin2io / $sections;
22 warn "# sections: $sections with $pins_in_section pins each\n";
23
24 foreach my $pin ( @pin2io ) {
25         if ( $pin =~ m/IO(\d+)/ ) {
26                 my $nr = $1;
27                 push @ports, "$pin: inout std_logic;";
28                 my $s = int($nr/$pins_in_section);
29                 push @pin_s, "$pin <= s$s;";
30                 $stat->{sections}->{ $s }++;
31                 push @location_assignment, $nr;
32         } else {
33                 push @ports, "-- $pin";
34         }
35 }
36
37 $ports[$#ports] =~ s/;$//; # remove last semicolumn
38
39 print qq{
40
41 library ieee;
42 use ieee.std_logic_1164.all;
43 use ieee.std_logic_unsigned.all;
44 entity epm3128 is
45  port(
46
47 }, join("\n", @ports), qq {
48
49  );
50 end epm3128;
51
52
53 architecture rtl of epm3128 is
54
55 signal }, join(", ", map { "s$_" } sort keys %{ $stat->{sections} }), qq{ : std_logic;
56
57 begin
58
59 };
60
61 my @vals = ( 0, 1, 'Z' );
62 my $i = 0;
63 foreach my $s ( sort keys %{ $stat->{sections} } ) {
64         my $v = $vals[$i];
65         print qq{s$s <= '$v';\n};
66         $i++; $i = $i % 3;
67 }
68
69
70 print join("\n", @pin_s), qq{
71
72 end rtl;
73
74 };#/vhdl
75
76 open(my $qsf, '>', 't.qsf');
77 foreach (@location_assignment) {
78         print $qsf "set_location_assignment PIN_$_ -to IO$_\n";
79 }
80