blob: 516d6feb553612b26d796b49c8335d71c2d6a9cc [file] [log] [blame]
Javi Merino491cf732014-03-31 17:34:44 +01001#!/usr/bin/python
Javi Merino572049d2014-03-31 16:45:23 +01002"""Process the output of the power allocator trace in the current directory's trace.dat"""
3
4import os
Javi Merinoee56c362014-03-31 17:30:34 +01005import re
Javi Merino952815a2014-03-31 18:08:32 +01006from StringIO import StringIO
Javi Merinof78ea5b2014-03-31 17:51:38 +01007import pandas as pd
Javi Merinoa6399fb2014-03-31 19:17:08 +01008from matplotlib import pyplot as plt
Javi Merino572049d2014-03-31 16:45:23 +01009
Javi Merinoc2ec5682014-04-01 15:16:06 +010010class BaseThermal(object):
11 def __init__(self, unique_word):
Javi Merino572049d2014-03-31 16:45:23 +010012 if not os.path.isfile("trace.txt"):
13 self.__run_trace_cmd_report()
Javi Merinoc2ec5682014-04-01 15:16:06 +010014
15 self.unique_word = unique_word
Javi Merino952815a2014-03-31 18:08:32 +010016 self.data_csv = ""
Javi Merinof78ea5b2014-03-31 17:51:38 +010017 self.data_frame = False
Javi Merino572049d2014-03-31 16:45:23 +010018
Javi Merino572049d2014-03-31 16:45:23 +010019 def __run_trace_cmd_report(self):
20 """Run "trace-cmd report > trace.txt". Overwrites the contents of trace.txt if it exists."""
Javi Merinoee56c362014-03-31 17:30:34 +010021 from subprocess import check_output
22
Javi Merino1a3725a2014-03-31 18:35:15 +010023 if not os.path.isfile("trace.dat"):
24 raise IOError("No such file or directory: trace.dat")
25
Javi Merino572049d2014-03-31 16:45:23 +010026 with open(os.devnull) as devnull:
Javi Merinoee56c362014-03-31 17:30:34 +010027 out = check_output(["trace-cmd", "report"], stderr=devnull)
Javi Merino572049d2014-03-31 16:45:23 +010028
29 with open("trace.txt", "w") as f:
30 f.write(out)
Javi Merinoc08ca682014-03-31 17:29:27 +010031
Javi Merinoc2ec5682014-04-01 15:16:06 +010032 def parse_into_csv(self):
Javi Merino952815a2014-03-31 18:08:32 +010033 """Create a csv representation of the thermal data and store it in self.data_csv"""
Javi Merinoc08ca682014-03-31 17:29:27 +010034 pat_timestamp = re.compile(r"([0-9]+\.[0-9]+):")
Javi Merinoe4c1d452014-04-01 17:00:47 +010035 pat_data = re.compile(r"[A-Za-z0-9_]+=([a-f0-9]+) ")
36 pat_header = re.compile(r"([A-Za-z0-9_]+)=[a-f0-9]+ ")
Javi Merinoc08ca682014-03-31 17:29:27 +010037 header = ""
38
Javi Merino952815a2014-03-31 18:08:32 +010039 with open("trace.txt") as fin:
40 for line in fin:
Javi Merinoc2ec5682014-04-01 15:16:06 +010041 if not re.search(self.unique_word, line):
Javi Merino952815a2014-03-31 18:08:32 +010042 continue
43
44 line = line[:-1]
45
46 m = re.search(pat_timestamp, line)
47 timestamp = m.group(1)
48
Javi Merinoc2ec5682014-04-01 15:16:06 +010049 data_start_idx = re.search(r"[A-Za-z0-9_]+=", line).start()
50 data_str = line[data_start_idx:]
Javi Merino952815a2014-03-31 18:08:32 +010051
52 if not header:
Javi Merinoc2ec5682014-04-01 15:16:06 +010053 header = re.sub(pat_header, r"\1,", data_str)
Javi Merino952815a2014-03-31 18:08:32 +010054 header = header[:-1]
55 header = "time," + header + "\n"
56 self.data_csv = header
57
58 parsed_data = re.sub(pat_data, r"\1,", data_str)
59 # Drop the last comma
60 parsed_data = parsed_data[:-1]
61
62 parsed_data = timestamp + "," + parsed_data + "\n"
63 self.data_csv += parsed_data
64
Javi Merinof78ea5b2014-03-31 17:51:38 +010065 def get_data_frame(self):
66 """Return a pandas data frame for the run"""
67 if self.data_frame:
68 return self.data_frame
69
Javi Merino952815a2014-03-31 18:08:32 +010070 if not self.data_csv:
Javi Merinoc2ec5682014-04-01 15:16:06 +010071 self.parse_into_csv()
Javi Merinof78ea5b2014-03-31 17:51:38 +010072
Javi Merino04f27492014-04-02 09:59:23 +010073 try:
74 self.data_frame = pd.read_csv(StringIO(self.data_csv)).set_index("time")
75 except StopIteration:
76 if not self.data_frame:
77 return pd.DataFrame()
78 raise
79
Javi Merinof78ea5b2014-03-31 17:51:38 +010080 return self.data_frame
Javi Merinodf8316a2014-03-31 18:39:42 +010081
Javi Merinoc2ec5682014-04-01 15:16:06 +010082class Thermal(BaseThermal):
83 def __init__(self):
84 super(Thermal, self).__init__(
85 unique_word="Ptot_out"
86 )
87
88 def write_thermal_csv(self):
89 """Write the csv info in thermal.csv"""
90 if not self.data_csv:
91 self.parse_into_csv()
92
93 with open("thermal.csv", "w") as fout:
94 fout.write(self.data_csv)
95
Javi Merinoa6399fb2014-03-31 19:17:08 +010096 def __default_plot_settings(self, title=""):
97 plt.xlabel("Time")
98 if title:
99 plt.title(title)
100
Javi Merinodf8316a2014-03-31 18:39:42 +0100101 def plot_temperature(self):
102 """Plot the temperature"""
103 df = self.get_data_frame()
104 (df["currT"] / 1000).plot()
Javi Merinoa6399fb2014-03-31 19:17:08 +0100105 self.__default_plot_settings(title="Temperature")
Javi Merino749b26a2014-03-31 19:17:30 +0100106
107 def plot_input_power(self):
108 """Plot input power"""
109 df = self.get_data_frame()
110 df[["Pa7_in", "Pa15_in", "Pgpu_in"]].plot()
111 self.__default_plot_settings(title="Input Power")