blob: 03939f6725ba8f6d9e42f0ebc885301f3141e6fa [file] [log] [blame]
Javi Merino491cf732014-03-31 17:34:44 +01001#!/usr/bin/python
Javi Merinoc47d2df2015-02-06 16:04:03 +00002# $Copyright:
3# ----------------------------------------------------------------
4# This confidential and proprietary software may be used only as
5# authorised by a licensing agreement from ARM Limited
6# (C) COPYRIGHT 2015 ARM Limited
7# ALL RIGHTS RESERVED
8# The entire notice above must be reproduced on all authorised
9# copies and copies may only be made to the extent permitted
10# by a licensing agreement from ARM Limited.
11# ----------------------------------------------------------------
12# File: thermal.py
13# ----------------------------------------------------------------
14# $
15#
Javi Merino5bd3d442014-04-08 12:55:13 +010016"""Process the output of the power allocator trace in the current
17directory's trace.dat"""
Javi Merino572049d2014-03-31 16:45:23 +010018
19import os
Javi Merinoee56c362014-03-31 17:30:34 +010020import re
Javi Merinoa6399fb2014-03-31 19:17:08 +010021from matplotlib import pyplot as plt
Javi Merino572049d2014-03-31 16:45:23 +010022
Dietmar Eggemannb42a50b2014-12-11 20:28:45 +000023from base import Base
Javi Merino323bb8d2015-04-20 17:09:15 +010024from cr2.run import Run
Javi Merino1a3dca32014-08-11 16:12:50 +010025from plot_utils import normalize_title, pre_plot_setup, post_plot_setup, plot_hist
Javi Merino51db3632014-06-13 11:24:51 +010026
Dietmar Eggemannb42a50b2014-12-11 20:28:45 +000027class Thermal(Base):
Javi Merino0e83b612014-06-05 11:45:23 +010028 """Process the thermal framework data in a ftrace dump"""
KP Singh7319a882014-12-24 18:18:01 +000029
30 unique_word="thermal_temperature:"
31 name="thermal"
32
Javi Merino6f34d902015-02-21 11:39:09 +000033 def __init__(self):
Javi Merino0e83b612014-06-05 11:45:23 +010034 super(Thermal, self).__init__(
KP Singh7319a882014-12-24 18:18:01 +000035 unique_word=self.unique_word,
Javi Merino0e83b612014-06-05 11:45:23 +010036 )
37
Javi Merino516d5942014-06-26 15:06:04 +010038 def plot_temperature(self, control_temperature=None, title="", width=None,
Javi Merino80114162014-08-08 16:48:32 +010039 height=None, ylim="range", ax=None, legend_label=""):
Javi Merino516d5942014-06-26 15:06:04 +010040 """Plot the temperature.
41
42 If control_temp is a pd.Series() representing the (possible)
43 variation of control_temp during the run, draw it using a
44 dashed yellow line. Otherwise, only the temperature is
45 plotted.
46
47 """
Javi Merinoc68737a2014-06-10 15:21:59 +010048 title = normalize_title("Temperature", title)
49
Javi Merino7e924022015-02-06 17:58:46 +000050 if len(self.data_frame) == 0:
51 raise ValueError("Empty DataFrame")
52
Javi Merino49cbcfe2014-08-08 16:03:49 +010053 setup_plot = False
54 if not ax:
55 ax = pre_plot_setup(width, height)
56 setup_plot = True
57
Javi Merino80114162014-08-08 16:48:32 +010058 temp_label = normalize_title("Temperature", legend_label)
Javi Merino92f4d012014-08-08 17:55:32 +010059 (self.data_frame["temp"] / 1000).plot(ax=ax, label=temp_label)
Javi Merino516d5942014-06-26 15:06:04 +010060 if control_temperature is not None:
Javi Merino80114162014-08-08 16:48:32 +010061 ct_label = normalize_title("Control", legend_label)
Javi Merino516d5942014-06-26 15:06:04 +010062 control_temperature.plot(ax=ax, color="y", linestyle="--",
Javi Merino80114162014-08-08 16:48:32 +010063 label=ct_label)
Javi Merinoc68737a2014-06-10 15:21:59 +010064
Javi Merino49cbcfe2014-08-08 16:03:49 +010065 if setup_plot:
66 post_plot_setup(ax, title=title, ylim=ylim)
67 plt.legend()
Javi Merinoc68737a2014-06-10 15:21:59 +010068
Javi Merinoe5ea60a2014-08-12 16:41:42 +010069 def plot_temperature_hist(self, ax, title):
Javi Merino1a3dca32014-08-11 16:12:50 +010070 """Plot a temperature histogram"""
71
72 temps = self.data_frame["temp"] / 1000
73 title = normalize_title("Temperature", title)
74 xlim = (0, temps.max())
75
Javi Merino23dff5d2015-03-09 19:05:46 +000076 plot_hist(temps, ax, title, "C", 30, "Temperature", xlim, "default")
Javi Merino1a3dca32014-08-11 16:12:50 +010077
Javi Merino323bb8d2015-04-20 17:09:15 +010078Run.register_class(Thermal, "thermal")
79
Dietmar Eggemannb42a50b2014-12-11 20:28:45 +000080class ThermalGovernor(Base):
Javi Merino5bd3d442014-04-08 12:55:13 +010081 """Process the power allocator data in a ftrace dump"""
KP Singh7319a882014-12-24 18:18:01 +000082
83 unique_word="thermal_power_allocator:"
84 name="thermal_governor"
Javi Merino6f34d902015-02-21 11:39:09 +000085 def __init__(self):
Javi Merino1e69e2c2014-06-04 18:25:09 +010086 super(ThermalGovernor, self).__init__(
KP Singh7319a882014-12-24 18:18:01 +000087 unique_word=self.unique_word,
Javi Merinoc2ec5682014-04-01 15:16:06 +010088 )
89
Javi Merinof521fba2015-02-06 18:22:09 +000090 def plot_temperature(self, title="", width=None, height=None, ylim="range",
91 ax=None, legend_label=""):
92 """Plot the temperature"""
93 dfr = self.data_frame
94 curr_temp = dfr["current_temperature"]
95 control_temp_series = (curr_temp + dfr["delta_temperature"]) / 1000
96 title = normalize_title("Temperature", title)
97
98 setup_plot = False
99 if not ax:
100 ax = pre_plot_setup(width, height)
101 setup_plot = True
102
103 temp_label = normalize_title("Temperature", legend_label)
104 (curr_temp / 1000).plot(ax=ax, label=temp_label)
105 control_temp_series.plot(ax=ax, color="y", linestyle="--",
106 label="control temperature")
107
108 if setup_plot:
109 post_plot_setup(ax, title=title, ylim=ylim)
110 plt.legend()
111
Javi Merino29223812014-08-12 15:24:43 +0100112 def plot_input_power(self, actor_order, title="", width=None, height=None, ax=None):
Javi Merinod6d5f892014-07-03 16:24:23 +0100113 """Plot input power
114
115 actor_order is an array with the order in which the actors were registered.
116 """
117
Javi Merino92f4d012014-08-08 17:55:32 +0100118 dfr = self.data_frame
Javi Merinof7968a72014-07-03 15:35:02 +0100119 in_cols = [s for s in dfr.columns if re.match("req_power[0-9]+", s)]
Javi Merinoe0ddf0d2014-05-07 18:40:12 +0100120
Javi Merinod6d5f892014-07-03 16:24:23 +0100121 plot_dfr = dfr[in_cols]
122 # Rename the columns from "req_power0" to "A15" or whatever is
123 # in actor_order. Note that we can do it just with an
124 # assignment because the columns are already sorted (i.e.:
125 # req_power0, req_power1...)
126 plot_dfr.columns = actor_order
127
Javi Merinoc00feff2014-04-14 15:41:51 +0100128 title = normalize_title("Input Power", title)
Javi Merino8ecd8172014-07-03 16:09:01 +0100129
Javi Merino29223812014-08-12 15:24:43 +0100130 if not ax:
131 ax = pre_plot_setup(width, height)
132
Javi Merinod6d5f892014-07-03 16:24:23 +0100133 plot_dfr.plot(ax=ax)
Javi Merino8ecd8172014-07-03 16:09:01 +0100134 post_plot_setup(ax, title=title)
Javi Merino9c010772014-04-02 16:54:41 +0100135
Javi Merino6003b252014-08-12 15:32:17 +0100136 def plot_output_power(self, actor_order, title="", width=None, height=None, ax=None):
Javi Merinod6d5f892014-07-03 16:24:23 +0100137 """Plot output power
138
139 actor_order is an array with the order in which the actors were registered.
140 """
141
Javi Merino92f4d012014-08-08 17:55:32 +0100142 out_cols = [s for s in self.data_frame.columns
Javi Merinof7968a72014-07-03 15:35:02 +0100143 if re.match("granted_power[0-9]+", s)]
Javi Merinoe0ddf0d2014-05-07 18:40:12 +0100144
Javi Merinod6d5f892014-07-03 16:24:23 +0100145 # See the note in plot_input_power()
Javi Merino92f4d012014-08-08 17:55:32 +0100146 plot_dfr = self.data_frame[out_cols]
Javi Merinod6d5f892014-07-03 16:24:23 +0100147 plot_dfr.columns = actor_order
148
Javi Merinoc00feff2014-04-14 15:41:51 +0100149 title = normalize_title("Output Power", title)
Javi Merino8ecd8172014-07-03 16:09:01 +0100150
Javi Merino6003b252014-08-12 15:32:17 +0100151 if not ax:
152 ax = pre_plot_setup(width, height)
153
Javi Merinod6d5f892014-07-03 16:24:23 +0100154 plot_dfr.plot(ax=ax)
Javi Merino8ecd8172014-07-03 16:09:01 +0100155 post_plot_setup(ax, title=title)
Javi Merinocd4a8272014-04-14 15:50:01 +0100156
Javi Merino9fc54852014-05-07 19:06:53 +0100157 def plot_inout_power(self, title="", width=None, height=None):
158 """Make multiple plots showing input and output power for each actor"""
Javi Merino92f4d012014-08-08 17:55:32 +0100159 dfr = self.data_frame
Javi Merino9fc54852014-05-07 19:06:53 +0100160
161 actors = []
162 for col in dfr.columns:
163 match = re.match("P(.*)_in", col)
164 if match and col != "Ptot_in":
165 actors.append(match.group(1))
166
167 for actor in actors:
168 cols = ["P" + actor + "_in", "P" + actor + "_out"]
169 this_title = normalize_title(actor, title)
170 dfr[cols].plot(title=this_title)
Javi Merino323bb8d2015-04-20 17:09:15 +0100171
172Run.register_class(ThermalGovernor, "thermal")