mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-11-09 08:35:19 +02:00
130 lines
2.7 KiB
Plaintext
130 lines
2.7 KiB
Plaintext
|
#!/usr/bin/perl
|
||
|
|
||
|
require "parser.pl";
|
||
|
require "match.pl";
|
||
|
require "misc.pl";
|
||
|
|
||
|
|
||
|
sub issue
|
||
|
{
|
||
|
print shift(@_), " ", join(" ", @_, &eq(@_)), "\n";
|
||
|
}
|
||
|
|
||
|
|
||
|
sub scale
|
||
|
{
|
||
|
local ($v, $m) = @_;
|
||
|
|
||
|
return $v*1e-12 if $m eq "p";
|
||
|
return $v*1e-9 if $m eq "n";
|
||
|
return $v*1e-6 if $m eq "u";
|
||
|
return $v*1e-3 if $m eq "m";
|
||
|
return $v*1e3 if $m eq "k";
|
||
|
return $v*1e6 if $m eq "M";
|
||
|
return $v*1e9 if $m eq "G";
|
||
|
return $v if $m eq "";
|
||
|
die "unknown multiplier \"$m\"";
|
||
|
}
|
||
|
|
||
|
|
||
|
sub compat
|
||
|
{
|
||
|
local ($a, $b) = @_; # $a = part char., $b = component spec.
|
||
|
|
||
|
return 1 if $a eq $b;
|
||
|
return 0 unless $a =~ /^([0-9.]+)([GMkmunp]?)/;
|
||
|
my ($av, $am, $au) = ($1, $2, $');
|
||
|
return 0 unless $b =~ /^(>|>=|<|<=)([0-9.]+)([GMkmunp]?)/;
|
||
|
my ($rel, $bv, $bm, $bu) = ($1, $2, $3, $');
|
||
|
return 0 if $au ne $bu;
|
||
|
$av = &scale($av, $am);
|
||
|
$bv = &scale($bv, $bm);
|
||
|
return $av > $bv if $rel eq ">";
|
||
|
return $av >= $bv if $rel eq ">=";
|
||
|
return $av < $bv if $rel eq "<";
|
||
|
return $av <= $bv if $rel eq "<=";
|
||
|
die;
|
||
|
}
|
||
|
|
||
|
|
||
|
if ($ARGV[0] eq "-d") {
|
||
|
$debug = 1;
|
||
|
shift @ARGV;
|
||
|
}
|
||
|
&parse;
|
||
|
|
||
|
$total = 0;
|
||
|
$bad = 0;
|
||
|
|
||
|
print "#PAR\n";
|
||
|
for $ref (keys %cmp) {
|
||
|
@f = @{ $cmp{$ref} };
|
||
|
$total++;
|
||
|
|
||
|
print STDERR "REF $ref\n" if $debug;
|
||
|
|
||
|
# if we're lucky, we get a direct ID match
|
||
|
|
||
|
if (defined $id{$f[0]}) {
|
||
|
print STDERR "FIRST ID\n" if $debug;
|
||
|
&issue($ref, $id{$f[0]});
|
||
|
next;
|
||
|
}
|
||
|
|
||
|
# no such luck. Let's roll up our sleeves and to the substitutions.
|
||
|
|
||
|
undef %field;
|
||
|
$field{"REF"} = $ref;
|
||
|
$field{"VAL"} = $f[0];
|
||
|
if ($f[1] eq "") {
|
||
|
print STDERR "warning: $ref ($f[0]) has no footprint\n";
|
||
|
} else {
|
||
|
$field{"FP"} = $f[1];
|
||
|
}
|
||
|
for (my $i = 1; $i != 10; $i++) {
|
||
|
$field{"F$i"} = $f[$i+1];
|
||
|
}
|
||
|
&apply_rules();
|
||
|
|
||
|
# try our luck again
|
||
|
|
||
|
if (defined $id{$field{"VAL"}}) {
|
||
|
print STDERR "SECOND ID\n" if $debug;
|
||
|
&issue($ref, $id{$field{"VAL"}});
|
||
|
next;
|
||
|
}
|
||
|
|
||
|
# still nothing. Let's match characteristics then.
|
||
|
|
||
|
my @p = ();
|
||
|
COMP: for my $c (keys %chr) {
|
||
|
print STDERR "PART $c\n" if $debug;
|
||
|
for (keys %field) {
|
||
|
next if $_ eq "REF" || $_ eq "VAL" || $_ =~ /^F\d$/;
|
||
|
next if $field{$_} eq "";
|
||
|
print STDERR " $_=",$field{$_}," " if $debug;
|
||
|
if (!defined $chr{$c}{$_}) {
|
||
|
print STDERR "NO FIELD\n" if $debug;
|
||
|
next COMP;
|
||
|
next;
|
||
|
}
|
||
|
if (&compat($chr{$c}{$_}, $field{$_})) {
|
||
|
print STDERR "== $chr{$c}{$_}\n" if $debug;
|
||
|
} else {
|
||
|
print STDERR "!= $chr{$c}{$_}\n" if $debug;
|
||
|
next COMP;
|
||
|
}
|
||
|
}
|
||
|
push(@p, $c);
|
||
|
}
|
||
|
if (@p) {
|
||
|
&issue($ref, @p);
|
||
|
next;
|
||
|
}
|
||
|
|
||
|
print STDERR "unmatched: $ref (", join(", ", @f), ")\n";
|
||
|
$bad++;
|
||
|
# print join("#", ($ref, @f)), " -> $id{$f[0]}\n";
|
||
|
}
|
||
|
print STDERR "$bad/$total unmatched\n" if $bad;
|