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
« 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# --------------------------------------------------------------------------------------------------
10import pytest
12from hdl_registers.register import Register
13from hdl_registers.register_modes import REGISTER_MODES
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=""))
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 )
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 )
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 )
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"))
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")
48 register_b = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="")
49 register_b.append_bit(name="hest", description="", default_value="0")
51 assert repr(register_a) == repr(register_b)
53 register_a.append_bit(name="zebra", description="", default_value="0")
54 register_b.append_bit(name="foo", description="", default_value="0")
56 assert repr(register_a) != repr(register_b)
59def test_bits_are_appended_properly_and_can_be_edited_in_place():
60 register = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="")
62 bit_hest = register.append_bit(name="hest", description="abc", default_value="0")
63 assert bit_hest.base_index == 0
65 bit_zebra = register.append_bit(name="zebra", description="def", default_value="0")
66 assert bit_zebra.base_index == 1
68 bit_hest.description = "new desc"
69 assert register.fields[0].description == "new desc"
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="")
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
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
85 bit_vector_hest.description = "new desc"
86 assert register.fields[0].description == "new desc"
89def test_integers_are_appended_properly_and_can_be_edited_in_place():
90 register = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="")
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
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
110 integer_hest.description = "new desc"
111 assert register.fields[0].description == "new desc"
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)
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".'
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)
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".'
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)
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".'
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")
155 assert register.default_value == 1 * 2**0 + 1 * 2**2 + 6 * 2**3 + 5 * 2**7
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")
162 assert register.default_value == 1
164 register.fields[0].default_value = "0"
165 assert register.default_value == 0
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")
173 assert register.get_field("hest") is hest
174 assert register.get_field("zebra") is zebra
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"'
181def test_utilized_width():
182 register = Register(name="apa", index=0, mode=REGISTER_MODES["r"], description="")
184 assert register.utilized_width == 32
186 register.append_bit(name="a", description="", default_value="1")
187 assert register.utilized_width == 1
189 register.append_bit_vector(name="b", description="", width=2, default_value="11")
190 assert register.utilized_width == 3
192 register.append_enumeration(
193 name="c", description="", elements={"d": "", "e": "", "f": ""}, default_value="d"
194 )
195 assert register.utilized_width == 5
197 register.append_integer(name="g", description="", min_value=0, max_value=10, default_value=0)
198 assert register.utilized_width == 9