| # Copyright lowRISC contributors. |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| # SPDX-License-Identifier: Apache-2.0 |
| """Enumerated types for fields |
| Generated by validation, used by backends |
| """ |
| |
| from enum import Enum |
| |
| from reggen.lib import check_str |
| |
| |
| class JsonEnum(Enum): |
| def for_json(x) -> str: |
| return str(x) |
| |
| |
| class SwWrAccess(JsonEnum): |
| WR = 1 |
| NONE = 2 |
| |
| |
| class SwRdAccess(JsonEnum): |
| RD = 1 |
| RC = 2 # Special handling for port |
| NONE = 3 |
| |
| |
| class SwAccess(JsonEnum): |
| RO = 1 |
| RW = 2 |
| WO = 3 |
| W1C = 4 |
| W1S = 5 |
| W0C = 6 |
| RC = 7 |
| R0W1C = 8 |
| NONE = 9 |
| |
| |
| class HwAccess(JsonEnum): |
| HRO = 1 |
| HRW = 2 |
| HWO = 3 |
| NONE = 4 # No access allowed |
| |
| |
| # swaccess permitted values |
| # text description, access enum, wr access enum, rd access enum, ok in window |
| SWACCESS_PERMITTED = { |
| 'none': ("No access", # noqa: E241 |
| SwAccess.NONE, SwWrAccess.NONE, SwRdAccess.NONE, False), # noqa: E241 |
| 'ro': ("Read Only", # noqa: E241 |
| SwAccess.RO, SwWrAccess.NONE, SwRdAccess.RD, True), # noqa: E241 |
| 'rc': ("Read Only, reading clears", # noqa: E241 |
| SwAccess.RC, SwWrAccess.WR, SwRdAccess.RC, False), # noqa: E241 |
| 'rw': ("Read/Write", # noqa: E241 |
| SwAccess.RW, SwWrAccess.WR, SwRdAccess.RD, True), # noqa: E241 |
| 'r0w1c': ("Read zero, Write with 1 clears", # noqa: E241 |
| SwAccess.W1C, SwWrAccess.WR, SwRdAccess.NONE, False), # noqa: E241 |
| 'rw1s': ("Read, Write with 1 sets", # noqa: E241 |
| SwAccess.W1S, SwWrAccess.WR, SwRdAccess.RD, False), # noqa: E241 |
| 'rw1c': ("Read, Write with 1 clears", # noqa: E241 |
| SwAccess.W1C, SwWrAccess.WR, SwRdAccess.RD, False), # noqa: E241 |
| 'rw0c': ("Read, Write with 0 clears", # noqa: E241 |
| SwAccess.W0C, SwWrAccess.WR, SwRdAccess.RD, False), # noqa: E241 |
| 'wo': ("Write Only", # noqa: E241 |
| SwAccess.WO, SwWrAccess.WR, SwRdAccess.NONE, True) # noqa: E241 |
| } |
| |
| # hwaccess permitted values |
| HWACCESS_PERMITTED = { |
| 'hro': ("Read Only", HwAccess.HRO), |
| 'hrw': ("Read/Write", HwAccess.HRW), |
| 'hwo': ("Write Only", HwAccess.HWO), |
| 'none': ("No Access Needed", HwAccess.NONE) |
| } |
| |
| |
| class SWAccess: |
| def __init__(self, where: str, raw: object): |
| self.key = check_str(raw, 'swaccess for {}'.format(where)) |
| try: |
| self.value = SWACCESS_PERMITTED[self.key] |
| except KeyError: |
| raise ValueError('Unknown swaccess key, {}, for {}.' |
| .format(self.key, where)) from None |
| |
| def dv_rights(self) -> str: |
| '''Return a UVM access string as used by uvm_field::set_access().''' |
| if self.key == 'r0w1c': |
| return 'W1C' |
| return self.value[1].name |
| |
| def swrd(self) -> SwRdAccess: |
| return self.value[3] |
| |
| def allows_read(self) -> bool: |
| return self.value[3] != SwRdAccess.NONE |
| |
| def allows_write(self) -> bool: |
| return self.value[2] == SwWrAccess.WR |
| |
| def needs_we(self) -> bool: |
| '''Should the register for this field have a write-enable signal? |
| |
| This is almost the same as allows_write(), but doesn't return true for |
| RC registers, which should use a read-enable signal (connected to their |
| prim_subreg's we port). |
| |
| ''' |
| return self.value[1] != SwAccess.RC and self.allows_write() |
| |
| def __eq__(self, other: object) -> bool: |
| if not isinstance(other, SWAccess): |
| return NotImplemented |
| return (self.key == other.key) and (self.value == other.value) |
| |
| def __str__(self) -> str: |
| return '{}: {}'.format(self.key, self.value) |
| |
| |
| class HWAccess: |
| def __init__(self, where: str, raw: object): |
| self.key = check_str(raw, 'hwaccess for {}'.format(where)) |
| try: |
| self.value = HWACCESS_PERMITTED[self.key] |
| except KeyError: |
| raise ValueError('Unknown hwaccess key, {}, for {}.' |
| .format(self.key, where)) from None |
| |
| def allows_read(self) -> bool: |
| return self.key in ['hro', 'hrw'] |
| |
| def allows_write(self) -> bool: |
| return self.key in ['hrw', 'hwo'] |
| |
| def __eq__(self, other: object) -> bool: |
| if not isinstance(other, HWAccess): |
| return NotImplemented |
| return (self.key == other.key) and (self.value == other.value) |
| |
| def __str__(self) -> str: |
| return '{}: {}'.format(self.key, self.value) |