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