Coverage for hdl_registers/register_array.py: 100%
27 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-04 10:42 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-04 10:42 +0000
1# --------------------------------------------------------------------------------------------------
2# Copyright (c) Lukas Vik. All rights reserved.
3#
4# This file is part of the hdl-registers project, an HDL register generator fast enough to run
5# in real time.
6# https://hdl-registers.com
7# https://github.com/hdl-registers/hdl-registers
8# --------------------------------------------------------------------------------------------------
10# Local folder libraries
11from .register import Register
14class RegisterArray:
16 """
17 Represent an array of registers. That is, a sequence of registers that shall be repeated a
18 number of times in a register list.
19 """
21 def __init__(self, name: str, base_index: int, length: int, description: str):
22 """
23 Arguments:
24 name: The name of this register array.
25 base_index: The zero-based index of the first register of this array in the
26 register list.
27 length: The number of times the register sequence shall be repeated.
28 description: Textual register array description.
29 """
30 self.name = name
31 self.base_index = base_index
32 self.length = length
33 self.description = description
35 self.registers: list[Register] = []
37 def append_register(self, name: str, mode: str, description: str) -> Register:
38 """
39 Append a register to this array.
41 Arguments:
42 name: The name of the register.
43 mode: A valid register mode.
44 description: Textual register description.
46 Return:
47 The register object that was created.
48 """
49 index = len(self.registers)
50 register = Register(name, index, mode, description)
52 self.registers.append(register)
53 return register
55 def get_register(self, name: str) -> Register:
56 """
57 Get a register from this array. Will raise exception if no register matches.
59 Arguments:
60 name: The name of the register.
61 Return:
62 The register.
63 """
64 for register in self.registers:
65 if register.name == name:
66 return register
68 raise ValueError(f'Could not find register "{name}" within register array "{self.name}"')
70 @property
71 def index(self) -> int:
72 """
73 Property exists to be used analogously with ``Register.index``.
75 Return:
76 The highest index occupied by this array.
77 """
78 return self.base_index + self.length * len(self.registers) - 1
80 def get_start_index(self, array_index: int) -> int:
81 """
82 The index within the register list where array iteration number ``array_index`` starts.
84 Arguments:
85 array_index: The array iteration index.
86 Shall be less than or equal to the array ``length``.
87 """
88 if array_index >= self.length:
89 raise ValueError(
90 f'Index {array_index} out of range for register array "{self.name}" '
91 f"of length {self.length}."
92 )
94 return self.base_index + array_index * len(self.registers)
96 def __repr__(self) -> str:
97 return f"""{self.__class__.__name__}(\
98name={self.name},\
99base_index={self.base_index},\
100length={self.length},\
101description={self.description},\
102registers={','.join([repr(register) for register in self.registers])},\
103)"""