blob: 7d23f3f4782948abe14058ceb77653b2e5078b3e [file] [log] [blame]
Javi Merino491cf732014-03-31 17:34:44 +01001#!/usr/bin/python
Javi Merino5bd3d442014-04-08 12:55:13 +01002"""Process the output of the power allocator trace in the current
3directory's trace.dat"""
Javi Merino572049d2014-03-31 16:45:23 +01004
5import os
Javi Merinoee56c362014-03-31 17:30:34 +01006import re
Javi Merinoa6399fb2014-03-31 19:17:08 +01007from matplotlib import pyplot as plt
Javi Merino572049d2014-03-31 16:45:23 +01008
Dietmar Eggemannb42a50b2014-12-11 20:28:45 +00009from base import Base
Javi Merino1a3dca32014-08-11 16:12:50 +010010from plot_utils import normalize_title, pre_plot_setup, post_plot_setup, plot_hist
Javi Merino51db3632014-06-13 11:24:51 +010011
Dietmar Eggemannb42a50b2014-12-11 20:28:45 +000012class Thermal(Base):
Javi Merino0e83b612014-06-05 11:45:23 +010013 """Process the thermal framework data in a ftrace dump"""
14 def __init__(self, path=None):
15 super(Thermal, self).__init__(
16 basepath=path,
Javi Merinoaf45d872014-07-03 09:49:40 +010017 unique_word="thermal_temperature:",
Javi Merino0e83b612014-06-05 11:45:23 +010018 )
19
Javi Merino516d5942014-06-26 15:06:04 +010020 def plot_temperature(self, control_temperature=None, title="", width=None,
Javi Merino80114162014-08-08 16:48:32 +010021 height=None, ylim="range", ax=None, legend_label=""):
Javi Merino516d5942014-06-26 15:06:04 +010022 """Plot the temperature.
23
24 If control_temp is a pd.Series() representing the (possible)
25 variation of control_temp during the run, draw it using a
26 dashed yellow line. Otherwise, only the temperature is
27 plotted.
28
29 """
Javi Merinoc68737a2014-06-10 15:21:59 +010030 title = normalize_title("Temperature", title)
31
Javi Merino49cbcfe2014-08-08 16:03:49 +010032 setup_plot = False
33 if not ax:
34 ax = pre_plot_setup(width, height)
35 setup_plot = True
36
Javi Merino80114162014-08-08 16:48:32 +010037 temp_label = normalize_title("Temperature", legend_label)
Javi Merino92f4d012014-08-08 17:55:32 +010038 (self.data_frame["temp"] / 1000).plot(ax=ax, label=temp_label)
Javi Merino516d5942014-06-26 15:06:04 +010039 if control_temperature is not None:
Javi Merino80114162014-08-08 16:48:32 +010040 ct_label = normalize_title("Control", legend_label)
Javi Merino516d5942014-06-26 15:06:04 +010041 control_temperature.plot(ax=ax, color="y", linestyle="--",
Javi Merino80114162014-08-08 16:48:32 +010042 label=ct_label)
Javi Merinoc68737a2014-06-10 15:21:59 +010043
Javi Merino49cbcfe2014-08-08 16:03:49 +010044 if setup_plot:
45 post_plot_setup(ax, title=title, ylim=ylim)
46 plt.legend()
Javi Merinoc68737a2014-06-10 15:21:59 +010047
Javi Merinoe5ea60a2014-08-12 16:41:42 +010048 def plot_temperature_hist(self, ax, title):
Javi Merino1a3dca32014-08-11 16:12:50 +010049 """Plot a temperature histogram"""
50
51 temps = self.data_frame["temp"] / 1000
52 title = normalize_title("Temperature", title)
53 xlim = (0, temps.max())
54
Javi Merinoe5ea60a2014-08-12 16:41:42 +010055 plot_hist(temps, ax, title, 30, "Temperature", xlim, "default")
Javi Merino1a3dca32014-08-11 16:12:50 +010056
Dietmar Eggemannb42a50b2014-12-11 20:28:45 +000057class ThermalGovernor(Base):
Javi Merino5bd3d442014-04-08 12:55:13 +010058 """Process the power allocator data in a ftrace dump"""
Javi Merino68461552014-04-08 11:40:09 +010059 def __init__(self, path=None):
Javi Merino1e69e2c2014-06-04 18:25:09 +010060 super(ThermalGovernor, self).__init__(
Javi Merino68461552014-04-08 11:40:09 +010061 basepath=path,
Javi Merinoa67b86f2014-07-03 15:44:19 +010062 unique_word="thermal_power_allocator:",
Javi Merinoc2ec5682014-04-01 15:16:06 +010063 )
64
Javi Merino29223812014-08-12 15:24:43 +010065 def plot_input_power(self, actor_order, title="", width=None, height=None, ax=None):
Javi Merinod6d5f892014-07-03 16:24:23 +010066 """Plot input power
67
68 actor_order is an array with the order in which the actors were registered.
69 """
70
Javi Merino92f4d012014-08-08 17:55:32 +010071 dfr = self.data_frame
Javi Merinof7968a72014-07-03 15:35:02 +010072 in_cols = [s for s in dfr.columns if re.match("req_power[0-9]+", s)]
Javi Merinoe0ddf0d2014-05-07 18:40:12 +010073
Javi Merinod6d5f892014-07-03 16:24:23 +010074 plot_dfr = dfr[in_cols]
75 # Rename the columns from "req_power0" to "A15" or whatever is
76 # in actor_order. Note that we can do it just with an
77 # assignment because the columns are already sorted (i.e.:
78 # req_power0, req_power1...)
79 plot_dfr.columns = actor_order
80
Javi Merinoc00feff2014-04-14 15:41:51 +010081 title = normalize_title("Input Power", title)
Javi Merino8ecd8172014-07-03 16:09:01 +010082
Javi Merino29223812014-08-12 15:24:43 +010083 if not ax:
84 ax = pre_plot_setup(width, height)
85
Javi Merinod6d5f892014-07-03 16:24:23 +010086 plot_dfr.plot(ax=ax)
Javi Merino8ecd8172014-07-03 16:09:01 +010087 post_plot_setup(ax, title=title)
Javi Merino9c010772014-04-02 16:54:41 +010088
Javi Merino6003b252014-08-12 15:32:17 +010089 def plot_output_power(self, actor_order, title="", width=None, height=None, ax=None):
Javi Merinod6d5f892014-07-03 16:24:23 +010090 """Plot output power
91
92 actor_order is an array with the order in which the actors were registered.
93 """
94
Javi Merino92f4d012014-08-08 17:55:32 +010095 out_cols = [s for s in self.data_frame.columns
Javi Merinof7968a72014-07-03 15:35:02 +010096 if re.match("granted_power[0-9]+", s)]
Javi Merinoe0ddf0d2014-05-07 18:40:12 +010097
Javi Merinod6d5f892014-07-03 16:24:23 +010098 # See the note in plot_input_power()
Javi Merino92f4d012014-08-08 17:55:32 +010099 plot_dfr = self.data_frame[out_cols]
Javi Merinod6d5f892014-07-03 16:24:23 +0100100 plot_dfr.columns = actor_order
101
Javi Merinoc00feff2014-04-14 15:41:51 +0100102 title = normalize_title("Output Power", title)
Javi Merino8ecd8172014-07-03 16:09:01 +0100103
Javi Merino6003b252014-08-12 15:32:17 +0100104 if not ax:
105 ax = pre_plot_setup(width, height)
106
Javi Merinod6d5f892014-07-03 16:24:23 +0100107 plot_dfr.plot(ax=ax)
Javi Merino8ecd8172014-07-03 16:09:01 +0100108 post_plot_setup(ax, title=title)
Javi Merinocd4a8272014-04-14 15:50:01 +0100109
Javi Merino9fc54852014-05-07 19:06:53 +0100110 def plot_inout_power(self, title="", width=None, height=None):
111 """Make multiple plots showing input and output power for each actor"""
Javi Merino92f4d012014-08-08 17:55:32 +0100112 dfr = self.data_frame
Javi Merino9fc54852014-05-07 19:06:53 +0100113
114 actors = []
115 for col in dfr.columns:
116 match = re.match("P(.*)_in", col)
117 if match and col != "Ptot_in":
118 actors.append(match.group(1))
119
120 for actor in actors:
121 cols = ["P" + actor + "_in", "P" + actor + "_out"]
122 this_title = normalize_title(actor, title)
123 dfr[cols].plot(title=this_title)