#!/usr/bin/perl # Perl script to read the partlist and pinlist from Eagle and # output VHDL to instantiate the parts. open(STDOUT, ">pdp8i.vhdl") || die "pdp8i.vhdl: $!"; %partlist = (); # Extract the architectures. open(INPUT, "Mxxx.vhd") || die "Mxxx.vhd: $!"; $inarch = 0; while () { y/A-Z/a-z/; $part = $1 if /architecture\s+.*\sof\s+(\w+)/; if (/begin/) { $inarch = 1; next; } next unless $inarch; if (/end structural/) { $inarch = 0; next; } if (/end behavioral/) { $inarch = 0; next; } if (defined($arch{$part})) { $arch{$part} .= $_; } else { $arch{$part} = $_; #print STDERR "Got arch for $part\n"; } } # Now, read the instantiations. open(INPUT, "pdp8i.inst") || die "pdp8i.inst: $!"; $incomponent = 0; $inarch = 0; $def = ""; while () { y/A-Z/a-z/; # Strip comments s/--.*//; next unless /\S/; # Strip component declarations. if (/component\s/) { $incomponent = 1; next; } if (/end\s+component/) { $incomponent = 0; next; } if (/^\s*end\s+\S+/) { print $def; $inarch = 0; } next if $incomponent; # Copy until the begin line. print $_ unless $inarch; if (/begin/) { $inarch = 1; next; } next unless $inarch; # Begin substituting architectures. s/\);/,/ if /^\s+(\w+)\s+=>\s+(\S+)\)/; if (/^\s+(\w+)\s+=>\s+(\S+),/) { ($pad, $signal) = ($1, $2); $def =~ s/\b$pad\b/$signal/g; next; } print $def; if (/(\w+):\s+(\w+)\s+port/) { warn "$2" unless defined $arch{$2}; $arch{$2} = "bogus\n" unless defined $arch{$2}; $device = $1; $def = $arch{$2}; foreach $i ('a', 'b', 'c', 'd', 'e', 'f', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'u', 'v') { $def =~ s/(\bt[$i][12]\b)/$device\1/g; $def =~ s/(\bt[ab][$i][12]\b)/$device\1/g; } print "-- $1: $2\n"; } else { print; } } exit;