blob: b6799e6c749f0c303760a29e2fedc46fcb68177b [file] [log] [blame]
# 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