87 lines
3.3 KiB
Python
87 lines
3.3 KiB
Python
# 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.
|
|
#
|
|
|
|
"""
|
|
An example file for usage of Analyzer for thermal assertions
|
|
"""
|
|
from bart.common.Analyzer import Analyzer
|
|
from trappy.stats.Topology import Topology
|
|
import unittest
|
|
import trappy
|
|
|
|
|
|
class TestThermal(unittest.TestCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
# We can run a workload invocation script here
|
|
# Which then copies the required traces for analysis to
|
|
# the host.
|
|
trace_file = "update_a_trace_path_here"
|
|
ftrace = trappy.FTrace(trace_file, "test_run")
|
|
|
|
# Define the parameters that you intend to use in the grammar
|
|
config = {}
|
|
config["THERMAL"] = trappy.thermal.Thermal
|
|
config["OUT"] = trappy.cpu_power.CpuOutPower
|
|
config["IN"] = trappy.cpu_power.CpuInPower
|
|
config["PID"] = trappy.pid_controller.PIDController
|
|
config["GOVERNOR"] = trappy.thermal.ThermalGovernor
|
|
config["CONTROL_TEMP"] = 77000
|
|
config["SUSTAINABLE_POWER"] = 2500
|
|
config["EXPECTED_TEMP_QRT"] = 95
|
|
config["EXPECTED_STD_PCT"] = 5
|
|
|
|
# Define a Topology
|
|
cls.BIG = '000000f0'
|
|
cls.LITTLE = '0000000f'
|
|
cls.tz = 0
|
|
cls.analyzer = Analyzer(ftrace, config)
|
|
|
|
def test_temperature_quartile(self):
|
|
"""Assert Temperature quartile"""
|
|
|
|
self.assertTrue(self.analyzer.assertStatement(
|
|
"numpy.percentile(THERMAL:temp, EXPECTED_TEMP_QRT) < (CONTROL_TEMP + 5000)"))
|
|
|
|
def test_average_temperature(self):
|
|
"""Assert Average temperature"""
|
|
|
|
self.assertTrue(self.analyzer.assertStatement(
|
|
"numpy.mean(THERMAL:temp) < CONTROL_TEMP", select=self.tz))
|
|
|
|
def test_temp_stdev(self):
|
|
"""Assert StdDev(temp) as % of mean"""
|
|
|
|
self.assertTrue(self.analyzer.assertStatement(
|
|
"(numpy.std(THERMAL:temp) * 100.0) / numpy.mean(THERMAL:temp)\
|
|
< EXPECTED_STD_PCT", select=self.tz))
|
|
|
|
def test_zero_load_input_power(self):
|
|
"""Test power demand when load is zero"""
|
|
|
|
zero_load_power_big = self.analyzer.getStatement("((IN:load0 + IN:load1 + IN:load2 + IN:load3) == 0) \
|
|
& (IN:dynamic_power > 0)", reference=True, select=self.BIG)
|
|
self.assertEquals(len(zero_load_power_big), 0)
|
|
|
|
zero_load_power_little = self.analyzer.getStatement("((IN:load0 + IN:load1 + IN:load2 + IN:load3) == 0) \
|
|
& (IN:dynamic_power > 0)", reference=True, select=self.LITTLE)
|
|
self.assertEquals(len(zero_load_power_little), 0)
|
|
|
|
def test_sustainable_power(self):
|
|
"""temp > control_temp, allocated_power < sustainable_power"""
|
|
|
|
self.analyzer.getStatement("(GOVERNOR:current_temperature > CONTROL_TEMP) &\
|
|
(PID:output > SUSTAINABLE_POWER)", reference=True, select=0)
|