# SPDX-License-Identifier: Apache-2.0 # # Copyright (C) 2017, Google, ARM Limited and contributors. # # 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. # """ IRQ Analysis Module""" from analysis_module import AnalysisModule import matplotlib.pyplot as plt import pylab as pl import pandas as pd import math class IRQAnalysis(AnalysisModule): """ Support for plotting IRQ Analysis data :param trace: input Trace object :type trace: :mod:`libs.utils.Trace` """ def __init__(self, trace): super(IRQAnalysis, self).__init__(trace) def plotIRQHistogram(self, title="Histogram of IRQ events", irq=None, bin_size_s=0.25): """ plot a histogram of irq events. :param title: title to afix to the plot :type title: str :param name: the irq name or number to plot :type name: str or int :param bin_size_s: the size of the bins for the histogram in seconds :type bin_size_s: float """ df = self._dfg_trace_event('irq_handler_entry') if len(df) == 0: self._log.warning('no irq events to plot') return if type(irq) is int: irqs = df[df.irq == irq] elif type(irq) is str: irqs = df[df.name == irq] else: raise TypeError('must give an irq number or name to plot') pd.options.mode.chained_assignment = None irqs['timestamp'] = irqs.index fig, axes = plt.subplots() plt.suptitle(title, y=.97, fontsize=16, horizontalalignment='center') if len(irqs) > 0: name = irqs.iloc[0]["name"] irq_number = irqs.iloc[0]["irq"] bin_range = pl.frange(self._trace.x_min, self._trace.x_max, bin_size_s) irqs.hist(ax=axes, column='timestamp', bins=bin_range, grid=True, facecolor='green', alpha=0.5, edgecolor="b", range=(self._trace.x_min, self._trace.x_max)) else: self._log.warning('no irq events to plot') return axes.set_title("irq_name = " + str(name) + ", bin size (s) " + str(bin_size_s)) axes.set_xlim(self._trace.x_min, self._trace.x_max) axes.set_ylabel('number of IRQs') axes.set_xlabel('seconds') axes.grid(True) figname = '{}/{}{}.png'\ .format(self._trace.plots_dir, self._trace.plots_prefix, "irq_" + str(irq_number) + "_" + str(name)) pl.savefig(figname, bbox_inches='tight')