package metadata; use base 'Exporter'; use strict; use warnings; our @EXPORT = qw(%package %vpackage %srcpackage %category %overrides clear_packages parse_package_metadata parse_target_metadata get_multiline @ignore %usernames %groupnames); our %package; our %vpackage; our %srcpackage; our %category; our %overrides; our @ignore; our %usernames; our %groupnames; our %userids; our %groupids; sub get_multiline { my $fh = shift; my $prefix = shift; my $str; while (<$fh>) { last if /^@@/; $str .= (($_ and $prefix) ? $prefix . $_ : $_); } return $str ? $str : ""; } sub confstr($) { my $conf = shift; $conf =~ tr#/\.\-/#___#; return $conf; } sub parse_package_metadata_usergroup($$$$$) { my $makefile = shift; my $typename = shift; my $names = shift; my $ids = shift; my $spec = shift; my $name; my $id; # the regex for name is taken from is_valid_name() of package shadow if ($spec =~ /^([a-z_][a-z0-9_-]*\$?)$/) { $name = $spec; $id = -1; } elsif ($spec =~ /^([a-z_][a-z0-9_-]*\$?)=(\d+)$/) { $name = $1; $id = $2; } else { warn "$makefile: invalid $typename spec $spec\n"; return 0; } if ($id =~ /^[1-9]\d*$/) { if ($id >= 65536) { warn "$makefile: $typename $name id $id >= 65536"; return 0; } if (not exists $ids->{$id}) { $ids->{$id} = { name => $name, makefile => $makefile, }; } elsif ($ids->{$id}{name} ne $name) { warn "$makefile: $typename $name id $id is already taken by $ids->{$id}{makefile}\n"; return 0; } } elsif ($id != -1) { warn "$makefile: $typename $name has invalid id $id\n"; return 0; } if (not exists $names->{$name}) { $names->{$name} = { id => $id, makefile => $makefile, }; } elsif ($names->{$name}{id} != $id) { warn "$makefile: id of $typename $name collides with that defined defined in $names->{$name}{makefile}\n"; return 0; } return 1; } sub parse_target_metadata($) { my $file = shift; my ($target, @target, $profile); my %target; my $makefile; open FILE, "<$file" or do { warn "Can't open file '$file': $!\n"; return; }; while () { chomp; /^Source-Makefile: \s*((.+\/)([^\/]+)\/Makefile)\s*$/ and $makefile = $1; /^Target:\s*(.+)\s*$/ and do { my $name = $1; $target = { id => $name, board => $name, makefile => $makefile, boardconf => confstr($name), conf => confstr($name), profiles => [], features => [], depends => [], subtargets => [] }; push @target, $target; $target{$name} = $target; if ($name =~ /([^\/]+)\/([^\/]+)/) { push @{$target{$1}->{subtargets}}, $2; $target->{board} = $1; $target->{boardconf} = confstr($1); $target->{subtarget} = 1; $target->{parent} = $target{$1}; } }; /^Target-Name:\s*(.+)\s*$/ and $target->{name} = $1; /^Target-Arch:\s*(.+)\s*$/ and $target->{arch} = $1; /^Target-Arch-Packages:\s*(.+)\s*$/ and $target->{arch_packages} = $1; /^Target-Features:\s*(.+)\s*$/ and $target->{features} = [ split(/\s+/, $1) ]; /^Target-Depends:\s*(.+)\s*$/ and $target->{depends} = [ split(/\s+/, $1) ]; /^Target-Description:/ and $target->{desc} = get_multiline(*FILE); /^Target-Optimization:\s*(.+)\s*$/ and $target->{cflags} = $1; /^CPU-Type:\s*(.+)\s*$/ and $target->{cputype} = $1; /^Linux-Version:\s*(.+)\s*$/ and $target->{version} = $1; /^Linux-Testing-Version:\s*(.+)\s*$/ and $target->{testing_version} = $1; /^Linux-Release:\s*(.+)\s*$/ and $target->{release} = $1; /^Linux-Kernel-Arch:\s*(.+)\s*$/ and $target->{karch} = $1; /^Default-Subtarget:\s*(.+)\s*$/ and $target->{def_subtarget} = $1; /^Default-Packages:\s*(.+)\s*$/ and $target->{packages} = [ split(/\s+/, $1) ]; /^Target-Profile:\s*(.+)\s*$/ and do { $profile = { id => $1, name => $1, has_image_metadata => 0, supported_devices => [], priority => 999, packages => [], default => "y if TARGET_ALL_PROFILES"
#!/bin/bash
set -ex
sed 's/SB_MAC16/SB_MAC16_UUT/; /SB_MAC16_UUT/,/endmodule/ p; d;' < ../cells_sim.v > test_dsp_model_uut.v
if [ ! -f "test_dsp_model_ref.v" ]; then
	cat /opt/lscc/iCEcube2.2017.01/verilog/sb_ice_syn.v > test_dsp_model_ref.v
fi
for tb in testbench \
		testbench_comb_8x8_A testbench_comb_8x8_B testbench_comb_16x16 \
		testbench_seq_16x16_A testbench_seq_16x16_B \
		testbench_comb_8x8_A_signedA testbench_comb_8x8_A_signedB testbench_comb_8x8_A_signedAB \
		testbench_comb_8x8_B_signedA testbench_comb_8x8_B_signedB testbench_comb_8x8_B_signedAB \
		testbench_comb_16x16_signedA testbench_comb_16x16_signedB testbench_comb_16x16_signedAB
do
	iverilog -s $tb -o test_dsp_model test_dsp_model.v test_dsp_model_uut.v test_dsp_model_ref.v
	vvp -N ./test_dsp_model
done