blob: d0ffa78c12697f1da460fda4fe1e4a9ffdaa7d38 [file] [log] [blame]
# Copyright 2015-2016 ARM Limited
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""A thermal specific library to assert certain thermal
behaviours
"""
from bart.common import Utils
from bart.common.Analyzer import Analyzer
import numpy as np
# pylint: disable=invalid-name
# pylint: disable=too-many-arguments
class ThermalAssert(object):
"""A class that accepts a TRAPpy FTrace object and
provides assertions for thermal behaviours
:param ftrace: A path to the trace file or a TRAPpy FTrace object
:type ftrace: str, :mod:`trappy.ftrace.FTrace`
"""
def __init__(self, ftrace, config=None):
self._ftrace = Utils.init_ftrace(ftrace)
self._analyzer = Analyzer(self._ftrace, config)
def getThermalResidency(self, temp_range, window, percent=False):
"""Return the total time spent in a given temperature range
:param temp_range: A tuple of (low_temp, high_temp)
which specifies the range of temperature that
one intends to calculate the residency for.
:type temp_range: tuple
:param window: A (start, end) tuple to limit the scope of the
residency calculation.
:type window: tuple
:param percent: Returns the residency as a percentage of the total
duration of the trace
:type percent: bool
.. seealso:
:mod:`bart.thermal.ThermalAssert.ThermalAssert.assertThermalResidency`
"""
# Get a pivoted thermal temperature data using the grammar
data = self._analyzer.getStatement("trappy.thermal.Thermal:temp")
result = {}
for pivot, data_frame in data.groupby(axis=1, level=0):
series = data_frame[pivot]
series = Utils.select_window(series, window)
mask = (series >= temp_range[0]) & (series <= temp_range[1])
index = series.index.values
# pylint fails to recognize numpy members.
# pylint: disable=no-member
shift_index = np.roll(index, 1)
# pylint: enable=no-member
shift_index[0] = 0
result[pivot] = sum((index - shift_index)[mask.values])
if percent:
result[pivot] = (
result[pivot] * 100.0) / self._ftrace.get_duration()
return result
def assertThermalResidency(
self,
expected_value,
operator,
temp_range,
window,
percent=False):
"""
:param expected_value: The expected value of the residency
:type expected_value: double
:param operator: A binary operator function that returns
a boolean. For example:
::
import operator
op = operator.ge
assertThermalResidency(temp_range, expected_value, op)
Will do the following check:
::
getThermalResidency(temp_range) >= expected_value
A custom function can also be passed:
::
THRESHOLD=5
def between_threshold(a, expected):
return abs(a - expected) <= THRESHOLD
:param temp_range: A tuple of (low_temp, high_temp)
which specifies the range of temperature that
one intends to calculate the residency for.
:type temp_range: tuple
:param window: A (start, end) tuple to limit the scope of the
residency calculation.
:type window: tuple
:param percent: Returns the residency as a percentage of the total
duration of the trace
:type percent: bool
.. seealso:
:mod:`bart.thermal.ThermalAssert.ThermalAssert.assertThermalResidency`
"""
residency = self.getThermalResidency(temp_range, window, percent)
return operator(residency, expected_value)