Rupert Swarbrick | aae67c9 | 2021-02-18 16:00:56 +0000 | [diff] [blame] | 1 | # Copyright lowRISC contributors. |
| 2 | # Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| 3 | # SPDX-License-Identifier: Apache-2.0 |
| 4 | |
| 5 | from typing import Dict, List |
| 6 | |
| 7 | from .bits import Bits |
| 8 | from .signal import Signal |
| 9 | from .lib import check_keys, check_name, check_str, check_list |
| 10 | |
| 11 | |
| 12 | class Alert(Signal): |
Rupert Swarbrick | 269bb3d | 2021-02-23 15:41:56 +0000 | [diff] [blame] | 13 | def __init__(self, name: str, desc: str, bit: int, fatal: bool): |
Rupert Swarbrick | aae67c9 | 2021-02-18 16:00:56 +0000 | [diff] [blame] | 14 | super().__init__(name, desc, Bits(bit, bit)) |
| 15 | self.bit = bit |
Rupert Swarbrick | 269bb3d | 2021-02-23 15:41:56 +0000 | [diff] [blame] | 16 | self.fatal = fatal |
Rupert Swarbrick | aae67c9 | 2021-02-18 16:00:56 +0000 | [diff] [blame] | 17 | |
| 18 | @staticmethod |
| 19 | def from_raw(what: str, |
| 20 | lsb: int, |
| 21 | raw: object) -> 'Alert': |
| 22 | rd = check_keys(raw, what, ['name', 'desc'], []) |
| 23 | |
| 24 | name = check_name(rd['name'], 'name field of ' + what) |
| 25 | desc = check_str(rd['desc'], 'desc field of ' + what) |
Rupert Swarbrick | 269bb3d | 2021-02-23 15:41:56 +0000 | [diff] [blame] | 26 | |
| 27 | # Make sense of the alert name, which should be prefixed with recov_ or |
| 28 | # fatal_. |
| 29 | pfx = name.split('_')[0] |
| 30 | if pfx == 'recov': |
| 31 | fatal = False |
| 32 | elif pfx == 'fatal': |
| 33 | fatal = True |
| 34 | else: |
| 35 | raise ValueError('Invalid name field of {}: alert names must be ' |
| 36 | 'prefixed with "recov_" or "fatal_". Saw {!r}.' |
| 37 | .format(what, name)) |
| 38 | |
| 39 | return Alert(name, desc, lsb, fatal) |
Rupert Swarbrick | aae67c9 | 2021-02-18 16:00:56 +0000 | [diff] [blame] | 40 | |
| 41 | @staticmethod |
| 42 | def from_raw_list(what: str, raw: object) -> List['Alert']: |
| 43 | ret = [] |
| 44 | for idx, entry in enumerate(check_list(raw, what)): |
| 45 | entry_what = 'entry {} of {}'.format(idx, what) |
| 46 | alert = Alert.from_raw(entry_what, idx, entry) |
| 47 | ret.append(alert) |
| 48 | return ret |
| 49 | |
| 50 | def _asdict(self) -> Dict[str, object]: |
| 51 | return { |
| 52 | 'name': self.name, |
| 53 | 'desc': self.desc, |
| 54 | } |