blob: a23ff491d910da8f97c3f31c690f49d9ede88075 [file] [log] [blame]
Rupert Swarbrickaae67c92021-02-18 16:00:56 +00001# Copyright lowRISC contributors.
2# Licensed under the Apache License, Version 2.0, see LICENSE for details.
3# SPDX-License-Identifier: Apache-2.0
4
5from typing import Dict, List
6
7from .bits import Bits
8from .signal import Signal
9from .lib import check_keys, check_name, check_str, check_list
10
11
12class Alert(Signal):
Rupert Swarbrick269bb3d2021-02-23 15:41:56 +000013 def __init__(self, name: str, desc: str, bit: int, fatal: bool):
Rupert Swarbrickaae67c92021-02-18 16:00:56 +000014 super().__init__(name, desc, Bits(bit, bit))
15 self.bit = bit
Rupert Swarbrick269bb3d2021-02-23 15:41:56 +000016 self.fatal = fatal
Rupert Swarbrickaae67c92021-02-18 16:00:56 +000017
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 Swarbrick269bb3d2021-02-23 15:41:56 +000026
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 Swarbrickaae67c92021-02-18 16:00:56 +000040
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 }