Coverage for hdl_registers/generator/test/test_register_code_generator_helpers.py: 100%

51 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-29 06:41 +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.generator.register_code_generator_helpers import RegisterCodeGeneratorHelpers 

13from hdl_registers.register import Register 

14from hdl_registers.register_modes import REGISTER_MODES 

15 

16 

17def test_register_utilized_width(): 

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

19 

20 assert RegisterCodeGeneratorHelpers.register_utilized_width(register) == 32 

21 

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

23 assert RegisterCodeGeneratorHelpers.register_utilized_width(register) == 1 

24 

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

26 assert RegisterCodeGeneratorHelpers.register_utilized_width(register) == 3 

27 

28 register.append_enumeration( 

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

30 ) 

31 assert RegisterCodeGeneratorHelpers.register_utilized_width(register) == 5 

32 

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

34 assert RegisterCodeGeneratorHelpers.register_utilized_width(register) == 9 

35 

36 

37def test_register_default_value_uint(): 

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

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

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

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

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

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

44 

45 assert ( 

46 RegisterCodeGeneratorHelpers.register_default_value_uint(register) 

47 == 1 * 2**0 + 1 * 2**2 + 6 * 2**3 + 5 * 2**7 

48 ) 

49 

50 

51def test_default_value_can_be_updated(): 

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

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

54 

55 assert RegisterCodeGeneratorHelpers.register_default_value_uint(register) == 1 

56 

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

58 assert RegisterCodeGeneratorHelpers.register_default_value_uint(register) == 0 

59 

60 

61def test_field_setter_should_read_modify_write(): 

62 register = Register(name="", index=0, mode=REGISTER_MODES["r_w"], description="") 

63 

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

65 assert not RegisterCodeGeneratorHelpers.field_setter_should_read_modify_write(register) 

66 

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

68 assert RegisterCodeGeneratorHelpers.field_setter_should_read_modify_write(register) 

69 

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

71 assert RegisterCodeGeneratorHelpers.field_setter_should_read_modify_write(register) 

72 

73 

74def test_field_setter_should_read_modify_write_should_raise_exception_if_there_are_no_fields(): 

75 register = Register(name="", index=0, mode=REGISTER_MODES["r_w"], description="") 

76 

77 with pytest.raises(ValueError) as exception_info: 

78 RegisterCodeGeneratorHelpers.field_setter_should_read_modify_write(register) 

79 assert str(exception_info.value) == "Should not end up here if the register has no fields." 

80 

81 

82def test_field_setter_should_read_modify_write_raise_exception_if_the_register_is_not_writable(): 

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

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

85 

86 with pytest.raises(ValueError) as exception_info: 

87 RegisterCodeGeneratorHelpers.field_setter_should_read_modify_write(register) 

88 assert str(exception_info.value).startswith("Got non-writeable register:") 

89 

90 

91def test_to_pascal_case(): 

92 assert RegisterCodeGeneratorHelpers.to_pascal_case("test") == "Test" 

93 assert RegisterCodeGeneratorHelpers.to_pascal_case("test_two") == "TestTwo"