1
0
mirror of git://projects.qi-hardware.com/eda-tools.git synced 2024-06-28 22:38:34 +03:00
eda-tools/old-boom/bom2part
2012-05-01 23:09:24 -03:00

130 lines
2.7 KiB
Perl
Executable File

#!/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;