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