| # Copyright lowRISC contributors. | |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| # SPDX-License-Identifier: Apache-2.0 | |
| r''' | |
| Message bucket class that encapsulates information such as bucket | |
| category, bucket severity, the associated label for the results table, and | |
| a list with message signatures. | |
| ''' | |
| import copy | |
| class MsgBucket(): | |
| # Known severity levels and color map for Dvsim summary tables. | |
| SEVERITIES = { | |
| 'info': 'I', | |
| 'review': 'W', | |
| 'warning': 'W', | |
| 'error': 'E', | |
| 'fatal': 'E' | |
| } | |
| @classmethod | |
| def severity_is_known(cls, severity: str) -> bool: | |
| '''Returns true if the severity is known''' | |
| return severity in cls.SEVERITIES | |
| def __init__(self, | |
| category: str, | |
| severity: str, | |
| label: str = None) -> None: | |
| if not MsgBucket.severity_is_known(severity): | |
| RuntimeError(f'Unknown severity {severity}') | |
| self.category = category | |
| self.severity = severity | |
| self.label = f'{category} {severity}s'.title() if not label else label | |
| self.signatures = [] | |
| def clear(self) -> None: | |
| '''Clears the signatures list''' | |
| self.signatures = [] | |
| def count(self) -> int: | |
| '''Return number of signatures''' | |
| return len(self.signatures) | |
| def count_md(self, colmap: bool = True) -> str: | |
| '''Return count string with optional colormap applied''' | |
| countstr = str(self.count()) | |
| if colmap: | |
| countstr += ' ' + self.SEVERITIES[self.severity] | |
| return countstr | |
| def merge(self, other) -> None: | |
| '''Merge other bucket into this one''' | |
| if self.category != other.category: | |
| raise RuntimeError(f'Category {other.category} does not match ' | |
| f'{self.category} for bucket {self.label}') | |
| elif self.severity != other.severity: | |
| raise RuntimeError(f'Severity {other.severity} does not match ' | |
| f'{self.severity} for bucket {self.label}') | |
| else: | |
| self.signatures.extend(copy.deepcopy(other.signatures)) | |
| def __add__(self, other): | |
| '''Merges two message buckets into one''' | |
| mb = copy.deepcopy(self) | |
| mb.merge(other) | |
| return mb |