1#!/usr/bin/env perl 2# 3# Copyright 2017, Data61 4# Commonwealth Scientific and Industrial Research Organisation (CSIRO) 5# ABN 41 687 119 230. 6# 7# This software may be distributed and modified according to the terms of 8# the BSD 2-Clause license. Note that NO WARRANTY is provided. 9# See "LICENSE_BSD2.txt" for details. 10# 11# @TAG(DATA61_BSD) 12# 13 14use warnings; 15use strict; 16use Switch; 17 18my $setcount = -1; 19my @sets = []; 20 21while(<>) { 22 if (m/^SB&#Sample, Cycles, PMC0, PMC1, FN Mode, FN Name, FN line, Extra\s*$/) { 23 $setcount++; 24# printf "new dataset %d\n", $setcount; 25 $sets[$setcount] = []; 26 } 27 elsif(m/^SB&\s*(\d+)\/(\d+)\s+-\s+(\d+), (\d+), (\d+), (\w+), (\w+), (\d+), ([^[:cntrl:]]*)[[:cntrl:]]*$/) { 28#apparently there are random control characters at the ends of lines. yay. 29 ${$sets[$setcount]}[$1] = { 30 'Time' => $3, 31 'PMC0' => $4, 32 'PMC1' => $5, 33 'Mode' => $6, 34 'Func' => $7, 35 'Desc' => $8 36 }; 37# printf "datapoint %d/%d: %d %s-%s\n", $1 + 1, $2, $3, $4, $5; 38 } 39} 40 41#print "\nData aggregation complete.\n\n"; 42# 43#printf "setcount = %d\n", $setcount + 1; 44#print "sets = @sets\n"; 45#foreach (@sets) { 46# print; 47# print ":\n"; 48# foreach(@{$_}) { 49# print "\t"; 50# print join("\t", %{$_}); 51# print "\n"; 52# } 53#} 54# 55#print "\nBegin data processing.\n\n"; 56 57#datasets go: overhead, send/wait, send/replywait, send/reply+wait, [repeat in reverse] 58 59#total dataset 60my %phasedata = (); 61 62for(my $set = 0; $set < (scalar @sets); $set++) { 63 print "Processing set $set...\n"; 64 65 foreach(@{$sets[$set]}) { 66 my $datapoint = $_; 67 switch(${$datapoint}{'Mode'}) { 68 case "enter" { 69 my $starttime = ${$datapoint}{'Time'}; 70 my $phase = ${$datapoint}{'Func'}; 71 72 $phasedata{$phase} = \%{$datapoint}; 73 74 #print "$phase $starttime\n"; 75 } 76 case "exit" { 77 my $phase = ${$datapoint}{'Func'}; 78 79 if(defined $phasedata{$phase}) { 80 #my $timetaken = ${$datapoint}{'Time'} - $phasedata{$phase}{'Time'}; 81 #if($timetaken < 0) { 82 # $timetaken = $timetaken + (2 ** 32); 83 #} 84 #print "$phase: $timetaken\n"; 85 my @perfdata = map { (${$datapoint}{$_} - $phasedata{$phase}{$_}) % (2 ** 32) } ('Time', 'PMC0', 'PMC1'); 86 print "$phase: "; 87 print join ", ", @perfdata; 88 print "\n"; 89 delete $phasedata{$phase}; 90 } else { 91 print "phase $phase never started...\n"; 92 print join("\t", %{$datapoint}); 93 print "\n"; 94 exit -1; 95 } 96 97# print "$phase: "; 98# print join(" ", %{$phasedata{$phase}}); 99# print "\n"; 100 } 101# case "none" { 102# } 103# else { 104# print "invalid mode in datapoint: "; 105# printf "\t%s\n", ${$datapoint}{'Mode'}; 106# printf "\t%s\n", ${$datapoint}{'Func'}; 107# printf "\t%s\n", ${$datapoint}{'Desc'}; 108# printf "\t%d\n", ${$datapoint}{'Time'}; 109# printf "\n"; 110# exit -1; 111# } 112 } 113 } 114} 115