| # Copyright lowRISC contributors. | 
 | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | # SPDX-License-Identifier: Apache-2.0 | 
 |  | 
 | from typing import Dict, Optional | 
 |  | 
 | from reggen.lib import (check_keys, check_name, | 
 |                         check_str, check_optional_str, check_int) | 
 |  | 
 |  | 
 | class InterSignal: | 
 |     def __init__(self, | 
 |                  name: str, | 
 |                  desc: Optional[str], | 
 |                  struct: str, | 
 |                  package: Optional[str], | 
 |                  signal_type: str, | 
 |                  act: str, | 
 |                  width: int, | 
 |                  default: Optional[str]): | 
 |         assert 0 < width | 
 |         self.name = name | 
 |         self.desc = desc | 
 |         self.struct = struct | 
 |         self.package = package | 
 |         self.signal_type = signal_type | 
 |         self.act = act | 
 |         self.width = width | 
 |         self.default = default | 
 |  | 
 |     @staticmethod | 
 |     def from_raw(what: str, raw: object) -> 'InterSignal': | 
 |         rd = check_keys(raw, what, | 
 |                         ['name', 'struct', 'type', 'act'], | 
 |                         ['desc', 'package', 'width', 'default']) | 
 |  | 
 |         name = check_name(rd['name'], 'name field of ' + what) | 
 |  | 
 |         r_desc = rd.get('desc') | 
 |         if r_desc is None: | 
 |             desc = None | 
 |         else: | 
 |             desc = check_str(r_desc, 'desc field of ' + what) | 
 |  | 
 |         struct = check_str(rd['struct'], 'struct field of ' + what) | 
 |  | 
 |         r_package = rd.get('package') | 
 |         if r_package is None or r_package == '': | 
 |             package = None | 
 |         else: | 
 |             package = check_name(r_package, 'package field of ' + what) | 
 |  | 
 |         signal_type = check_name(rd['type'], 'type field of ' + what) | 
 |         act = check_name(rd['act'], 'act field of ' + what) | 
 |         width = check_int(rd.get('width', 1), 'width field of ' + what) | 
 |         if width <= 0: | 
 |             raise ValueError('width field of {} is not positive.'.format(what)) | 
 |  | 
 |         default = check_optional_str(rd.get('default'), | 
 |                                      'default field of ' + what) | 
 |  | 
 |         return InterSignal(name, desc, struct, package, | 
 |                            signal_type, act, width, default) | 
 |  | 
 |     def _asdict(self) -> Dict[str, object]: | 
 |         ret = {'name': self.name}  # type: Dict[str, object] | 
 |         if self.desc is not None: | 
 |             ret['desc'] = self.desc | 
 |         ret['struct'] = self.struct | 
 |         if self.package is not None: | 
 |             ret['package'] = self.package | 
 |         ret['type'] = self.signal_type | 
 |         ret['act'] = self.act | 
 |         ret['width'] = self.width | 
 |         if self.default is not None: | 
 |             ret['default'] = self.default | 
 |  | 
 |         return ret | 
 |  | 
 |     def as_dict(self) -> Dict[str, object]: | 
 |         return self._asdict() |