Coverage for hdl_registers/test/test_register.py: 100%

94 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-03-12 11:11 +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 

10import pytest 

11 

12from hdl_registers.register import Register 

13from hdl_registers.register_modes import REGISTER_MODES 

14 

15 

16def test_repr_basic(): 

17 # Check that repr is an actual representation, not just "X object at 0xABCDEF" 

18 assert "apa" in repr(Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="")) 

19 

20 # Different name 

21 assert repr(Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="")) != repr( 

22 Register(name="hest", index=0, mode=REGISTER_MODES["r"], description="") 

23 ) 

24 

25 # Different index 

26 assert repr(Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="")) != repr( 

27 Register(name="apa", index=1, mode=REGISTER_MODES["r"], description="") 

28 ) 

29 

30 # Different mode 

31 assert repr(Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="")) != repr( 

32 Register(name="apa", index=0, mode=REGISTER_MODES["w"], description="") 

33 ) 

34 

35 # Different description 

36 assert repr( 

37 Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="Blah") 

38 ) != repr(Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="Gah")) 

39 

40 

41def test_repr_with_bits_appended(): 

42 """ 

43 Shows that the ``fields`` impact the repr. Do not need to test with other fields than bits. 

44 """ 

45 register_a = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="") 

46 register_a.append_bit(name="hest", description="", default_value="0") 

47 

48 register_b = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="") 

49 register_b.append_bit(name="hest", description="", default_value="0") 

50 

51 assert repr(register_a) == repr(register_b) 

52 

53 register_a.append_bit(name="zebra", description="", default_value="0") 

54 register_b.append_bit(name="foo", description="", default_value="0") 

55 

56 assert repr(register_a) != repr(register_b) 

57 

58 

59def test_bits_are_appended_properly_and_can_be_edited_in_place(): 

60 register = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="") 

61 

62 bit_hest = register.append_bit(name="hest", description="abc", default_value="0") 

63 assert bit_hest.base_index == 0 

64 

65 bit_zebra = register.append_bit(name="zebra", description="def", default_value="0") 

66 assert bit_zebra.base_index == 1 

67 

68 bit_hest.description = "new desc" 

69 assert register.fields[0].description == "new desc" 

70 

71 

72def test_bit_vectors_are_appended_properly_and_can_be_edited_in_place(): 

73 register = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="") 

74 

75 bit_vector_hest = register.append_bit_vector( 

76 name="hest", description="abc", width=3, default_value="000" 

77 ) 

78 assert bit_vector_hest.base_index == 0 

79 

80 bit_vector_zebra = register.append_bit_vector( 

81 name="zebra", description="def", width=5, default_value="00000" 

82 ) 

83 assert bit_vector_zebra.base_index == 3 

84 

85 bit_vector_hest.description = "new desc" 

86 assert register.fields[0].description == "new desc" 

87 

88 

89def test_integers_are_appended_properly_and_can_be_edited_in_place(): 

90 register = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="") 

91 

92 integer_hest = register.append_integer( 

93 name="hest", 

94 description="", 

95 min_value=0, 

96 max_value=10, 

97 default_value=0, 

98 ) 

99 assert integer_hest.base_index == 0 

100 

101 integer_zebra = register.append_integer( 

102 name="zebra", 

103 description="", 

104 min_value=0, 

105 max_value=20, 

106 default_value=0, 

107 ) 

108 assert integer_zebra.base_index == 4 

109 

110 integer_hest.description = "new desc" 

111 assert register.fields[0].description == "new desc" 

112 

113 

114def test_appending_bit_to_full_register(): 

115 register = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="") 

116 register.append_bit_vector(name="foo", width=32, description="", default_value="0" * 32) 

117 

118 with pytest.raises(ValueError) as exception_info: 

119 register.append_bit(name="bar", description="", default_value="0") 

120 assert str(exception_info.value) == 'Maximum width exceeded for register "apa".' 

121 

122 

123def test_appending_bit_vector_to_full_register(): 

124 register = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="") 

125 register.append_bit_vector(name="foo", width=30, description="", default_value="0" * 30) 

126 

127 with pytest.raises(ValueError) as exception_info: 

128 register.append_bit_vector(name="bar", description="", width=3, default_value="000") 

129 assert str(exception_info.value) == 'Maximum width exceeded for register "apa".' 

130 

131 

132def test_appending_integer_to_full_register(): 

133 register = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="") 

134 register.append_bit_vector(name="foo", width=30, description="", default_value="0" * 30) 

135 

136 with pytest.raises(ValueError) as exception_info: 

137 register.append_integer( 

138 name="zebra", 

139 description="", 

140 min_value=0, 

141 max_value=4, 

142 default_value=0, 

143 ) 

144 assert str(exception_info.value) == 'Maximum width exceeded for register "apa".' 

145 

146 

147def test_default_value(): 

148 register = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="") 

149 register.append_bit(name="foo", description="", default_value="1") 

150 register.append_bit(name="foo", description="", default_value="0") 

151 register.append_bit(name="foo", description="", default_value="1") 

152 register.append_bit_vector(name="foo", description="", width=4, default_value="0110") 

153 register.append_bit_vector(name="foo", description="", width=4, default_value="0101") 

154 

155 assert register.default_value == 1 * 2**0 + 1 * 2**2 + 6 * 2**3 + 5 * 2**7 

156 

157 

158def test_default_value_can_be_updated(): 

159 register = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="") 

160 register.append_bit(name="foo", description="", default_value="1") 

161 

162 assert register.default_value == 1 

163 

164 register.fields[0].default_value = "0" 

165 assert register.default_value == 0 

166 

167 

168def test_get_field(): 

169 register = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="") 

170 hest = register.append_bit(name="hest", description="", default_value="1") 

171 zebra = register.append_bit(name="zebra", description="", default_value="1") 

172 

173 assert register.get_field("hest") is hest 

174 assert register.get_field("zebra") is zebra 

175 

176 with pytest.raises(ValueError) as exception_info: 

177 assert register.get_field("non existing") is None 

178 assert str(exception_info.value) == 'Could not find field "non existing" within register "apa"' 

179 

180 

181def test_utilized_width(): 

182 register = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="") 

183 

184 assert register.utilized_width == 32 

185 

186 register.append_bit(name="a", description="", default_value="1") 

187 assert register.utilized_width == 1 

188 

189 register.append_bit_vector(name="b", description="", width=2, default_value="11") 

190 assert register.utilized_width == 3 

191 

192 register.append_enumeration( 

193 name="c", description="", elements={"d": "", "e": "", "f": ""}, default_value="d" 

194 ) 

195 assert register.utilized_width == 5 

196 

197 register.append_integer(name="g", description="", min_value=0, max_value=10, default_value=0) 

198 assert register.utilized_width == 9