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

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# -------------------------------------------------------------------------------------------------- 

9 

10# Local folder libraries 

11from .register import Register 

12 

13 

14class RegisterArray: 

15 

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 """ 

20 

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 

34 

35 self.registers: list[Register] = [] 

36 

37 def append_register(self, name: str, mode: str, description: str) -> Register: 

38 """ 

39 Append a register to this array. 

40 

41 Arguments: 

42 name: The name of the register. 

43 mode: A valid register mode. 

44 description: Textual register description. 

45 

46 Return: 

47 The register object that was created. 

48 """ 

49 index = len(self.registers) 

50 register = Register(name, index, mode, description) 

51 

52 self.registers.append(register) 

53 return register 

54 

55 def get_register(self, name: str) -> Register: 

56 """ 

57 Get a register from this array. Will raise exception if no register matches. 

58 

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 

67 

68 raise ValueError(f'Could not find register "{name}" within register array "{self.name}"') 

69 

70 @property 

71 def index(self) -> int: 

72 """ 

73 Property exists to be used analogously with ``Register.index``. 

74 

75 Return: 

76 The highest index occupied by this array. 

77 """ 

78 return self.base_index + self.length * len(self.registers) - 1 

79 

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. 

83 

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 ) 

93 

94 return self.base_index + array_index * len(self.registers) 

95 

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)"""