summaryrefslogtreecommitdiff
path: root/tests/tools/profiler.pl
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2013-01-05 11:13:26 +0100
committerClifford Wolf <clifford@clifford.at>2013-01-05 11:13:26 +0100
commit7764d0ba1dcf064ae487ee985c43083a0909e7f4 (patch)
tree18c05b8729df381af71b707748ce1d605e0df764 /tests/tools/profiler.pl
initial import
Diffstat (limited to 'tests/tools/profiler.pl')
-rwxr-xr-xtests/tools/profiler.pl55
1 files changed, 55 insertions, 0 deletions
diff --git a/tests/tools/profiler.pl b/tests/tools/profiler.pl
new file mode 100755
index 00000000..456f634b
--- /dev/null
+++ b/tests/tools/profiler.pl
@@ -0,0 +1,55 @@
+#!/usr/bin/perl
+# parse 'yosys -t' logfile and find slow passes
+
+my $max_depth = 0;
+my %last_line_by_depth;
+my %last_time_by_depth;
+
+my @lines_text;
+my @lines_depth;
+my @lines_time;
+
+while (<>)
+{
+ chomp;
+ next unless /^\[([0-9.]+)\] (([0-9]+\.)+)/;
+ my ($this_time, $this_id, $this_header) = ($1, $2, $4);
+
+ push @lines_text, $_;
+ push @lines_depth, 0;
+ push @lines_time, 0;
+
+ my $depth = $this_id;
+ $depth =~ s/[^.]//g;
+ $depth = length $depth;
+ $max_depth = $depth if $depth > $max_depth;
+
+ for (my $i = $depth; $i <= $max_depth; $i++) {
+ next unless exists $last_time_by_depth{$i};
+ $lines_time[$last_line_by_depth{$i}] = $this_time-$last_time_by_depth{$i};
+ delete $last_time_by_depth{$i};
+ delete $last_header_by_depth{$i};
+ }
+
+ $last_time_by_depth{$depth} = $this_time;
+ $last_line_by_depth{$depth} = $#lines_text;
+ $lines_depth[$#lines_text] = $depth;
+}
+
+for (my $depth = 1; $depth <= $max_depth; $depth++) {
+ printf "\nSlow passes on recursion depth %d:\n", $depth;
+ my @lines;
+ for (my $i = 0; $i <= $#lines_text; $i++) {
+ next if $lines_depth[$i] != $depth or $lines_time[$i] < 1.0;
+ push @lines, sprintf("%3d %08.2f %s\n", $lines_depth[$i], $lines_time[$i], $lines_text[$i]);
+ }
+ for my $line (sort {$b cmp $a} @lines) {
+ print $line;
+ }
+}
+
+printf "\nFull journal of headers:\n";
+for (my $i = 0; $i <= $#lines_text; $i++) {
+ printf "%3d %08.2f %s\n", $lines_depth[$i], $lines_time[$i], $lines_text[$i];
+}
+