mirror of
https://github.com/wfjm/w11.git
synced 2026-01-18 17:37:09 +00:00
update xviv_msg_filter
- add c type rules for 'count-only' filters - add support for bitstream generation checking ([bit] section) - update vmfsets
This commit is contained in:
parent
a73bda34de
commit
89732fe3e0
@ -85,7 +85,10 @@ The full set of tests is only run for tagged releases.
|
||||
- tbcore_rlink: wait 40 cycles after CONF_DONE
|
||||
- serport_master_tb: add 100 ps RXSD,TXSD delay to allow clock jitter
|
||||
- tools changes
|
||||
- xviv_msg_filter: display INFO Common 17-14 'further message disabled'
|
||||
- xviv_msg_filter
|
||||
- display INFO Common 17-14 'further message disabled'
|
||||
- add c type rules for 'count-only' filters
|
||||
- add support for bitstream generation checking ([bit] section)
|
||||
- tbrun: add --all option
|
||||
- (all perl scripts): add and use bailout instead of die
|
||||
- viv_tools_build.tcl: increase message limits (all 200, some 5000)
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
# $Id: generic_vivado.mk 830 2016-12-26 20:25:49Z mueller $
|
||||
# $Id: generic_vivado.mk 1091 2018-12-23 12:38:29Z mueller $
|
||||
#
|
||||
# Copyright 2015-2016 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
# Copyright 2015-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
# License disclaimer see License.txt in $RETROBASE directory
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2018-12-22 1091 1.4.2 add bitgen flow checking
|
||||
# 2016-08-27 802 1.4.1 viv_clean: rm only vivado logs
|
||||
# 2016-07-22 792 1.4 relocate viv tcl code to tools/vivado
|
||||
# 2016-06-24 778 1.3 add rsim.vhd and [sorep]sim.v targets
|
||||
@ -76,10 +77,14 @@ endif
|
||||
@ if [ -r $*_syn.log ]; \
|
||||
then xviv_msg_filter syn $*.vmfset $*_syn.log; \
|
||||
else echo " !!! no $*_syn.log found"; fi
|
||||
@ echo "=== Implementation flow summary=============================="
|
||||
@ echo "=== Implementation flow summary ============================="
|
||||
@ if [ -r $*_imp.log ]; \
|
||||
then xviv_msg_filter imp $*.vmfset $*_imp.log; \
|
||||
else echo " !!! no $*_imp.log found"; fi
|
||||
@ echo "=== Bitgen flow summary ====================================="
|
||||
@ if [ -r $*_bit.log ]; \
|
||||
then xviv_msg_filter bit $*.vmfset $*_bit.log; \
|
||||
else echo " !!! no $*_bit.log found"; fi
|
||||
#
|
||||
# Configure FPGA with vivado hardware server
|
||||
# input: %.bit
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# $Id: sys_w11a_br_arty.vmfset 1073 2018-11-23 18:05:51Z mueller $
|
||||
# $Id: sys_w11a_br_arty.vmfset 1091 2018-12-23 12:38:29Z mueller $
|
||||
#
|
||||
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
[syn]
|
||||
@ -190,3 +190,9 @@ r [Synth 8-3354] R_REGS_reg[state].*'one-hot'.*'sysmon_rbus_core'
|
||||
[imp]
|
||||
I [Vivado 12-2489] # multiple of 1 ps
|
||||
I [Physopt 32-742] # BRAM Flop Optimization
|
||||
|
||||
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
[bit]
|
||||
# --> DSP multiplier is not pipelined, ok # OK 2018-12-22
|
||||
i [DRC DPOP-1] PREG Output pipelining
|
||||
i [DRC DPOP-2] MREG Output pipelining
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# $Id: sys_w11a_br_as7.vmfset 1073 2018-11-23 18:05:51Z mueller $
|
||||
# $Id: sys_w11a_br_as7.vmfset 1091 2018-12-23 12:38:29Z mueller $
|
||||
#
|
||||
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
[syn]
|
||||
@ -121,3 +121,10 @@ r [Synth 8-3354] R_REGS_reg[state].*'one-hot'.*'sysmon_rbus_core'
|
||||
[imp]
|
||||
I [Vivado 12-2489] # multiple of 1 ps
|
||||
I [Physopt 32-742] # BRAM Flop Optimization
|
||||
|
||||
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
[bit]
|
||||
# --> DSP multiplier is not pipelined, ok # OK 2018-12-22
|
||||
# indicated everywhere, but not in as7 ??
|
||||
#i [DRC DPOP-1] PREG Output pipelining
|
||||
#i [DRC DPOP-2] MREG Output pipelining
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# $Id: sys_w11a_b3.vmfset 1073 2018-11-23 18:05:51Z mueller $
|
||||
# $Id: sys_w11a_b3.vmfset 1091 2018-12-23 12:38:29Z mueller $
|
||||
#
|
||||
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
[syn]
|
||||
@ -140,3 +140,9 @@ r [Synth 8-3354] R_REGS_reg[state].*'one-hot'.*'sysmon_rbus_core'
|
||||
[imp]
|
||||
I [Vivado 12-2489] # multiple of 1 ps
|
||||
I [Physopt 32-742] # BRAM Flop Optimization
|
||||
|
||||
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
[bit]
|
||||
# --> DSP multiplier is not pipelined, ok # OK 2018-12-22
|
||||
i [DRC DPOP-1] PREG Output pipelining
|
||||
i [DRC DPOP-2] MREG Output pipelining
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# $Id: sys_w11a_c7.vmfset 1073 2018-11-23 18:05:51Z mueller $
|
||||
# $Id: sys_w11a_c7.vmfset 1091 2018-12-23 12:38:29Z mueller $
|
||||
#
|
||||
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
[syn]
|
||||
@ -32,6 +32,8 @@ I [Synth 8-3331] DM_STAT_SE # generic
|
||||
I [Synth 8-3331] DM_STAT_VM # generic
|
||||
I [Synth 8-3331] CP_STAT # generic
|
||||
I [Synth 8-3331] SER_MONI # generic
|
||||
# --> I_BTN not used # OK 2018-12-22
|
||||
i [Synth 8-3331] I_BTN[\d]
|
||||
# --> ireg indeed not fully used # OK 2018-11-18
|
||||
i [Synth 8-3331] pdp11_sequencer .* IREG[1(1|2|3|4)]
|
||||
# --> ccin indedd not fully used # OK 2018-11-18
|
||||
@ -152,3 +154,9 @@ r [Synth 8-3354] R_REGS_reg[state].*'one-hot'.*'sysmon_rbus_core'
|
||||
[imp]
|
||||
I [Vivado 12-2489] # multiple of 1 ps
|
||||
I [Physopt 32-742] # BRAM Flop Optimization
|
||||
|
||||
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
[bit]
|
||||
# --> DSP multiplier is not pipelined, ok # OK 2018-12-22
|
||||
i [DRC DPOP-1] PREG Output pipelining
|
||||
i [DRC DPOP-2] MREG Output pipelining
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# $Id: sys_w11a_n4.vmfset 1073 2018-11-23 18:05:51Z mueller $
|
||||
# $Id: sys_w11a_n4.vmfset 1091 2018-12-23 12:38:29Z mueller $
|
||||
#
|
||||
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
[syn]
|
||||
@ -144,3 +144,9 @@ r [Synth 8-3354] R_REGS_reg[state].*'one-hot'.*'sysmon_rbus_core'
|
||||
[imp]
|
||||
I [Vivado 12-2489] # multiple of 1 ps
|
||||
I [Physopt 32-742] # BRAM Flop Optimization
|
||||
|
||||
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
[bit]
|
||||
# --> DSP multiplier is not pipelined, ok # OK 2018-12-22
|
||||
i [DRC DPOP-1] PREG Output pipelining
|
||||
i [DRC DPOP-2] MREG Output pipelining
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#!/usr/bin/perl -w
|
||||
# $Id: xviv_msg_filter 1072 2018-11-18 22:27:35Z mueller $
|
||||
# $Id: xviv_msg_filter 1091 2018-12-23 12:38:29Z mueller $
|
||||
#
|
||||
# Copyright 2016-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
#
|
||||
@ -14,6 +14,7 @@
|
||||
#
|
||||
# Revision History:
|
||||
# Date Rev Version Comment
|
||||
# 2018-12-22 1091 1.1.3 add count-only rules; add -pcnt; add [bit] handling
|
||||
# 2018-11-18 1072 1.1.2 display INFO Common 17-14 'further message disabled'
|
||||
# 2018-08-11 1039 1.1.1 allow {yyyy.x} tags (in addition to ranges)
|
||||
# 2017-06-06 909 1.1 add version-range tags
|
||||
@ -28,23 +29,25 @@ use Getopt::Long;
|
||||
|
||||
my %opts = ();
|
||||
|
||||
GetOptions(\%opts, "help", "pacc") || exit 1;
|
||||
|
||||
sub print_help;
|
||||
sub read_mfs;
|
||||
sub read_log;
|
||||
GetOptions(\%opts, "help", "pacc", "pcnt")
|
||||
or bailout("bad command options");
|
||||
|
||||
my $type = shift @ARGV;
|
||||
my $mfsnam = shift @ARGV;
|
||||
my $lognam = shift @ARGV;
|
||||
my %finfokill;
|
||||
my @flist;
|
||||
my @mlist;
|
||||
my %msgcnt;
|
||||
my %msgsev;
|
||||
my $nackcnt = 0;
|
||||
my $ackcnt = 0;
|
||||
my $imisscnt = 0;
|
||||
my $rmisscnt = 0;
|
||||
my $cntcnt = 0;
|
||||
my $timebad = 0;
|
||||
my $timegood = 0;
|
||||
my $bitgood = 0;
|
||||
|
||||
my $vercur;
|
||||
my $vermin = "0000.0";
|
||||
@ -55,19 +58,16 @@ my $retrobase = $ENV{RETROBASE};
|
||||
autoflush STDOUT 1 if (-p STDOUT); # autoflush if output into pipe
|
||||
|
||||
if (exists $opts{help}) {
|
||||
print_help;
|
||||
print_help();
|
||||
exit 0;
|
||||
}
|
||||
|
||||
if (!defined $type || !defined $mfsnam || !defined $lognam) {
|
||||
print STDERR "xviv_msg_filter-E: one of 'type mfset log' missing \n\n";
|
||||
print_help;
|
||||
exit 1;
|
||||
bailout("one of 'type mfset log' missing");
|
||||
}
|
||||
|
||||
if ($type !~ m{^(syn|imp)$}) {
|
||||
print STDERR "xviv_msg_filter-E: type must be syn or imp\n";
|
||||
exit 1;
|
||||
if ($type !~ m{^(syn|imp|bit)$}) {
|
||||
bailout("type must be syn, imp or bit");
|
||||
}
|
||||
|
||||
if (read_ver($lognam)) {exit 1;}
|
||||
@ -75,41 +75,50 @@ if (read_mfs($mfsnam)) {exit 1;}
|
||||
if (read_log($lognam)) {exit 1;}
|
||||
|
||||
foreach my $m (@mlist) {
|
||||
my $msev = $m->[0];
|
||||
my $mcode = $m->[1];
|
||||
my $mtext = $m->[2];
|
||||
my $msgmatch = 0;
|
||||
|
||||
# check for timing closure
|
||||
# bad: [Route 35-39] The design did not meet timing requirements
|
||||
# bad: [Timing 38-282] The design failed to meet the timing ...
|
||||
# good: [Route 35-61] The design met the timing requirement
|
||||
$timebad += 1 if $type eq 'imp' && $mcode eq 'Route 35-39';
|
||||
$timebad += 1 if $type eq 'imp' && $mcode eq 'Timing 38-282';
|
||||
$timegood += 1 if $type eq 'imp' && $mcode eq 'Route 35-61';
|
||||
# bad: [Route 35-39] The design did not meet timing requirements
|
||||
# bad: [Timing 38-282] The design failed to meet the timing ...
|
||||
# good: [Route 35-61] The design met the timing requirement
|
||||
$timebad += 1 if $type eq 'imp' && $$m{code} eq 'Route 35-39';
|
||||
$timebad += 1 if $type eq 'imp' && $$m{code} eq 'Timing 38-282';
|
||||
$timegood += 1 if $type eq 'imp' && $$m{code} eq 'Route 35-61';
|
||||
# check for proper bitstream generation
|
||||
# good: [Vivado 12-1842] Bitgen Completed Successfully
|
||||
$bitgood += 1 if $type eq 'bit' && $$m{code} eq 'Vivado 12-1842';
|
||||
|
||||
foreach my $f (@flist) {
|
||||
my $fmode = $f->[0];
|
||||
my $fcode = $f->[1];
|
||||
my $frege = $f->[2];
|
||||
if ($frege eq '') {
|
||||
$msgmatch = $mcode eq $fcode;
|
||||
if ($$f{rege} eq '') {
|
||||
$msgmatch = $$m{code} eq $$f{code};
|
||||
} else {
|
||||
$msgmatch = $mcode eq $fcode && $mtext =~ m{$frege};
|
||||
$msgmatch = $$m{code} eq $$f{code} && $$m{text} =~ m{$$f{rege}};
|
||||
}
|
||||
if ($msgmatch) {
|
||||
#print "+++m '$fmode' '$fcode' '$frege' : '$mcode' '$mtext'\n";
|
||||
$f->[3] += 1;
|
||||
$$f{cnt} += 1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
if ($mcode ne 'Common 17-14' && $msev eq 'INFO') {
|
||||
$msgmatch = 1; # accept all INFO except 'further msg disabled'
|
||||
# accept all INFO except 'further msg disabled'
|
||||
# show 'further msg disabled' only
|
||||
# if the code is not an INFO messages
|
||||
# if the code is not covered by a 'I' rule
|
||||
if ($$m{sev} eq 'INFO') {
|
||||
if ($$m{code} eq 'Common 17-14') {
|
||||
if ($$m{text} =~ m/Message '(.*?)' appears/) {
|
||||
my $code = $1;
|
||||
$msgmatch = 1 if exists $msgsev{$code} && $msgsev{$code} eq 'INFO';
|
||||
$msgmatch = 1 if $finfokill{$code};
|
||||
}
|
||||
} else {
|
||||
$msgmatch = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ($msgmatch) {
|
||||
$m->[3] += 1;
|
||||
$$m{cnt} += 1;
|
||||
} else {
|
||||
$nackcnt += 1;
|
||||
}
|
||||
@ -118,16 +127,16 @@ foreach my $m (@mlist) {
|
||||
if ($nackcnt) {
|
||||
print "Unexpected messages of type [$type] from $lognam:\n";
|
||||
foreach my $m (@mlist) {
|
||||
next if $m->[3];
|
||||
next if $$m{cnt};
|
||||
|
||||
# now prety print the message
|
||||
# remove $RETROBASE from file names
|
||||
my $mtext = $m->[2];
|
||||
my $mtext = $$m{text};
|
||||
$mtext =~ s/${retrobase}/.../g if defined $retrobase;
|
||||
# and break it up into 80 character wide lines
|
||||
my @mwl = split /\s+/,$mtext;
|
||||
unshift @mwl, '[' . $m->[1] . ']';
|
||||
unshift @mwl, $m->[0] . ':';
|
||||
unshift @mwl, '[' . $$m{code} . ']';
|
||||
unshift @mwl, $$m{sev} . ':';
|
||||
my $pref = ' ';
|
||||
my $line = ' ';
|
||||
while (scalar(@mwl)) {
|
||||
@ -144,13 +153,15 @@ if ($nackcnt) {
|
||||
}
|
||||
|
||||
foreach my $f (@flist) {
|
||||
if ($f->[3] != 0) { # matches seen
|
||||
if ($$f{cnt} != 0) { # matches seen
|
||||
$ackcnt += 1;
|
||||
} else { # matches not seen
|
||||
if ($f->[0] eq 'i') { # complain if 'i'
|
||||
} else { # matches not seen
|
||||
if ($$f{mode} eq 'i') { # complain if 'i'
|
||||
$imisscnt += 1;
|
||||
} elsif ($f->[0] eq 'r') { # complain if 'r'
|
||||
} elsif ($$f{mode} eq 'r') { # complain if 'r'
|
||||
$rmisscnt += 1;
|
||||
} elsif ($$f{mode} eq 'c') { # show count if 'c'
|
||||
$cntcnt += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -158,8 +169,17 @@ foreach my $f (@flist) {
|
||||
if ($ackcnt && exists $opts{pacc}) {
|
||||
print "Accepted messages for type [$type] from $lognam:\n";
|
||||
foreach my $f (@flist) {
|
||||
next if $f->[3] == 0;
|
||||
printf "%4d: [%s] %s\n", $f->[3], $f->[1], $f->[2];
|
||||
next if $$f{cnt} == 0;
|
||||
printf "%4d: [%s] %s\n", $$f{cnt}, $$f{code}, $$f{rege};
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
|
||||
if ($cntcnt) {
|
||||
print "Count-only filter rules for $lognam:\n";
|
||||
foreach my $f (@flist) {
|
||||
printf "%4d: [%s] %s\n", $$f{cnt}, $$f{code}, $$f{rege}
|
||||
if $$f{mode} eq 'c';
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
@ -167,8 +187,8 @@ if ($ackcnt && exists $opts{pacc}) {
|
||||
if ($imisscnt) {
|
||||
print "Ignore filter rules with no matches for type [$type] from $lognam:\n";
|
||||
foreach my $f (@flist) {
|
||||
next if $f->[3] != 0;
|
||||
printf "%4d: [%s] %s\n", $f->[3], $f->[1], $f->[2] if $f->[0] eq 'i';
|
||||
next if $$f{cnt} != 0;
|
||||
printf "%4d: [%s] %s\n", $$f{cnt}, $$f{code}, $$f{rege} if $$f{mode} eq 'i';
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
@ -176,8 +196,16 @@ if ($imisscnt) {
|
||||
if ($rmisscnt) {
|
||||
print "Missed required messages for type [$type] from $lognam:\n";
|
||||
foreach my $f (@flist) {
|
||||
next if $f->[3] != 0;
|
||||
printf "%4d: [%s] %s\n", $f->[3], $f->[1], $f->[2] if $f->[0] eq 'r';
|
||||
next if $$f{cnt} != 0;
|
||||
printf "%4d: [%s] %s\n", $$f{cnt}, $$f{code}, $$f{rege} if $$f{mode} eq 'r';
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
|
||||
if ($opts{pcnt}) {
|
||||
print "Message statistics:\n";
|
||||
foreach my $code (sort keys %msgcnt) {
|
||||
printf "%4d %s : %s\n", $msgcnt{$code}, $code, $msgsev{$code};
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
@ -187,18 +215,23 @@ if ($type eq 'imp' && ($timebad > 0 || $timegood == 0)) {
|
||||
printf "!! FAILED TO REACH TIMING CLOSURE !!\n";
|
||||
printf "!! ------------------------------ !!\n";
|
||||
}
|
||||
if ($type eq 'bit' && $bitgood == 0) {
|
||||
printf "!! --------------------------- !!\n";
|
||||
printf "!! FAILED TO CREATE BIT STREAM !!\n";
|
||||
printf "!! --------------------------- !!\n";
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
sub read_mfs {
|
||||
my ($fname) = @_;
|
||||
|
||||
if (not -r $fname) {
|
||||
print STDERR "xviv_msg_filter-E: \'$fname\' not existing or readable\n";
|
||||
print STDERR "xviv_msg_filter-E: '$fname' not existing or readable\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
my $fh = new FileHandle;
|
||||
$fh->open($fname) or die "can't open for read $fname: $!";
|
||||
$fh->open($fname) or bailout("can't open for read '$fname': $!");
|
||||
|
||||
my $intyp = 0;
|
||||
|
||||
@ -241,14 +274,18 @@ sub read_mfs {
|
||||
|
||||
next if $vercur lt $vermin || $vercur gt $vermax;
|
||||
|
||||
if (/^([iIr])\s+\[(.+?)\]\s*(.*)\s*$/) {
|
||||
if (/^([iIrc])\s+\[(.+?)\]\s*(.*)\s*$/) {
|
||||
#print "+++0m '$1' '$2' '$3'\n";
|
||||
my $fmode = $1;
|
||||
my $fcode = $2;
|
||||
my $frege = $3;
|
||||
$frege =~ s/\[/\\\[/g;
|
||||
$frege =~ s/\]/\\\]/g;
|
||||
push @flist, [$fmode,$fcode,$frege, 0];
|
||||
push @flist, {mode => $fmode,
|
||||
code => $fcode,
|
||||
rege => $frege,
|
||||
cnt => 0};
|
||||
$finfokill{$fcode} += 1 if $fmode eq 'I';
|
||||
} else {
|
||||
printf STDERR "xviv_msg_filter-E: bad line in mfset: '%s'\n", $_;
|
||||
}
|
||||
@ -268,13 +305,25 @@ sub read_log {
|
||||
return 1;
|
||||
}
|
||||
|
||||
open (LFILE, $fname) or die "can't open for read $fname: $!";
|
||||
open (LFILE, $fname) or bailout("can't open for read '$fname': $!");
|
||||
|
||||
my $skip = $type eq 'bit'; # enable skip for bit
|
||||
|
||||
while (<LFILE>) {
|
||||
chomp;
|
||||
if ($type eq 'bit') {
|
||||
$skip = 0 if m/INFO: \[Common 17-206\] Exiting Vivado/;
|
||||
next if $skip;
|
||||
}
|
||||
|
||||
if (m{^(INFO|WARNING|CRITICAL WARNING|ERROR):\s*\[(.+?)\]\s*(.*)}) {
|
||||
#print "+++0l '$1' '$2' '$3'\n";
|
||||
push @mlist, [$1,$2,$3,0];
|
||||
# print "+++0l '$1' '$2' '$3'\n";
|
||||
push @mlist, {sev => $1,
|
||||
code => $2,
|
||||
text => $3,
|
||||
cnt => 0};
|
||||
$msgcnt{"$2"} += 1; # message counter
|
||||
$msgsev{"$2"} = $1; # message severity tracking
|
||||
}
|
||||
}
|
||||
|
||||
@ -292,7 +341,7 @@ sub read_ver {
|
||||
return 1;
|
||||
}
|
||||
|
||||
open (LFILE, $fname) or die "can't open for read $fname: $!";
|
||||
open (LFILE, $fname) or bailout("can't open for read '$fname': $!");
|
||||
|
||||
my $nline = 0;
|
||||
while (<LFILE>) {
|
||||
@ -312,12 +361,21 @@ sub read_ver {
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
sub bailout {
|
||||
my ($msg) = @_;
|
||||
print STDERR "xviv_msg_filter-F: $msg\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
sub print_help {
|
||||
print "usage: xviv_msg_filter [options] type mfset log\n";
|
||||
print " type log file type: syn or imp\n";
|
||||
print " type log file type: syn, imp or bit\n";
|
||||
print " mfset message filter set file\n";
|
||||
print " log log file\n";
|
||||
print " Options:\n";
|
||||
print " --pacc print summary of accepted messages\n";
|
||||
print " --pcnt print message counts\n";
|
||||
print " --help this message\n";
|
||||
}
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
.\" -*- nroff -*-
|
||||
.\" $Id: xviv_msg_filter.1 909 2017-06-09 16:21:55Z mueller $
|
||||
.\" $Id: xviv_msg_filter.1 1093 2018-12-25 19:52:53Z mueller $
|
||||
.\"
|
||||
.\" Copyright 2016- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
.\" Copyright 2016-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
||||
.\"
|
||||
.\" ------------------------------------------------------------------
|
||||
.TH XVIV_MSG_FILTER 1 2017-06-06 "Retro Project" "Retro Project Manual"
|
||||
.TH XVIV_MSG_FILTER 1 2018-12-24 "Retro Project" "Retro Project Manual"
|
||||
.\" ------------------------------------------------------------------
|
||||
.SH NAME
|
||||
xviv_msg_filter \- message filter for Xilinx Vivado tool chain log files
|
||||
@ -12,7 +12,7 @@ xviv_msg_filter \- message filter for Xilinx Vivado tool chain log files
|
||||
.SH SYNOPSIS
|
||||
.
|
||||
.SY xviv_msg_filter
|
||||
.OP \-\-pack
|
||||
.RI [ OPTION ]...
|
||||
.I TYPE
|
||||
.I VMFSET
|
||||
.I LOGFILE
|
||||
@ -43,6 +43,8 @@ The accepted values for \fITYPE\fP are:
|
||||
Vivado synthesis flow
|
||||
.IP \fBimp\fP
|
||||
Vivado implementation flow
|
||||
.IP \fBbit\fP
|
||||
Vivado bitfile generation step
|
||||
.PD
|
||||
.RE
|
||||
.
|
||||
@ -53,6 +55,9 @@ Vivado implementation flow
|
||||
Print a summary of all accepted messages. The match count for each rule is
|
||||
listed.
|
||||
.
|
||||
.IP \fB\-\-pcnt\fP
|
||||
Print a statistics of all detected messages.
|
||||
.
|
||||
.\" ----------------------------------------------
|
||||
.IP \fB\-\-help\fP
|
||||
print full help.
|
||||
@ -73,7 +78,7 @@ A line of the form
|
||||
{yyyy.n:}
|
||||
{:}
|
||||
.EE
|
||||
acts as version range tag and specifies a range of vivado versions for which the
|
||||
acts as version range tag and specifies a range of Vivado versions for which the
|
||||
following rules shall be applied.
|
||||
"{:2016.4}" means up to version 2016.4, "{:2017.1}" from 2017.1 on, while
|
||||
"{:}" cancels version range checking.
|
||||
@ -95,17 +100,20 @@ determines how the rule is applied
|
||||
matching messages are ignored
|
||||
.IP \fBi\fP 4
|
||||
matching messages are not printed, if no matching message is found a
|
||||
notifivation is printed.
|
||||
notification is printed.
|
||||
.IP \fBc\fP 4
|
||||
matching messages are counted, only a summary of the message counts is
|
||||
printed.
|
||||
.IP \fBr\fP 4
|
||||
signals that at least one matching message is required, if none seen, a
|
||||
notifivation is printed.
|
||||
notification is printed.
|
||||
.PD
|
||||
.RE
|
||||
.IP \fBname\fP
|
||||
Vivado message name, enclosed in [] brackets
|
||||
.IP \fBpattern\fP
|
||||
regular expression to match the message text. This field is optional, if
|
||||
omitted all messages with th given name will match. '[' and ']' characters
|
||||
omitted all messages with the given name will match. '[' and ']' characters
|
||||
are escaped to '\\[' and '\\]', because [] is very often part of signal
|
||||
names. Character set matches are therefore not possible, unfortunately.
|
||||
|
||||
@ -120,6 +128,10 @@ names. Character set matches are therefore not possible, unfortunately.
|
||||
# -----------
|
||||
[imp]
|
||||
I [Vivado 12-2489] # multiple of 1 ps
|
||||
# -----------
|
||||
[bit]
|
||||
i [DRC DPOP-1] PREG Output pipelining
|
||||
i [DRC DPOP-2] MREG Output pipelining
|
||||
.EE
|
||||
.\" ------------------------------------------------------------------
|
||||
.SH EXIT STATUS
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user