|  | # 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 |