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

60 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 

10""" 

11Some happy path tests to show that all register code generation can run without error. 

12""" 

13 

14import pytest 

15import tsfpga 

16from tsfpga.examples.example_env import get_default_registers 

17 

18from hdl_registers import HDL_REGISTERS_DOC, HDL_REGISTERS_TESTS 

19from hdl_registers.generator.c.header import CHeaderGenerator 

20from hdl_registers.generator.cpp.header import CppHeaderGenerator 

21from hdl_registers.generator.cpp.implementation import CppImplementationGenerator 

22from hdl_registers.generator.cpp.interface import CppInterfaceGenerator 

23from hdl_registers.generator.html.constant_table import HtmlConstantTableGenerator 

24from hdl_registers.generator.html.page import HtmlPageGenerator 

25from hdl_registers.generator.html.register_table import HtmlRegisterTableGenerator 

26from hdl_registers.generator.python.accessor import PythonAccessorGenerator 

27from hdl_registers.generator.python.pickle import PythonPickleGenerator 

28from hdl_registers.generator.vhdl.axi_lite.wrapper import VhdlAxiLiteWrapperGenerator 

29from hdl_registers.generator.vhdl.record_package import VhdlRecordPackageGenerator 

30from hdl_registers.generator.vhdl.register_package import VhdlRegisterPackageGenerator 

31from hdl_registers.generator.vhdl.simulation.read_write_package import ( 

32 VhdlSimulationReadWritePackageGenerator, 

33) 

34from hdl_registers.generator.vhdl.simulation.wait_until_package import ( 

35 VhdlSimulationWaitUntilPackageGenerator, 

36) 

37from hdl_registers.parser.toml import from_toml 

38 

39# Test with all the example TOML files that we have available 

40REGISTER_LISTS = [ 

41 from_toml( 

42 name="ddr_buffer", 

43 toml_file=tsfpga.TSFPGA_EXAMPLE_MODULES / "ddr_buffer" / "regs_ddr_buffer.toml", 

44 default_registers=get_default_registers(), 

45 ), 

46 from_toml(name="caesar", toml_file=HDL_REGISTERS_TESTS / "regs_test.toml"), 

47 from_toml( 

48 name="example", 

49 toml_file=HDL_REGISTERS_DOC / "sphinx" / "rst" / "user_guide" / "toml" / "toml_format.toml", 

50 ), 

51] 

52 

53 

54@pytest.mark.parametrize("register_list", REGISTER_LISTS) 

55def test_can_generate_vhdl_without_error(tmp_path, register_list): 

56 VhdlRegisterPackageGenerator(register_list, tmp_path).create() 

57 assert (tmp_path / f"{register_list.name}_regs_pkg.vhd").exists() 

58 

59 VhdlRecordPackageGenerator(register_list, tmp_path).create() 

60 assert (tmp_path / f"{register_list.name}_register_record_pkg.vhd").exists() 

61 

62 VhdlSimulationReadWritePackageGenerator(register_list, tmp_path).create() 

63 assert (tmp_path / f"{register_list.name}_register_read_write_pkg.vhd").exists() 

64 

65 VhdlSimulationWaitUntilPackageGenerator(register_list, tmp_path).create() 

66 assert (tmp_path / f"{register_list.name}_register_wait_until_pkg.vhd").exists() 

67 

68 VhdlAxiLiteWrapperGenerator(register_list, tmp_path).create() 

69 assert (tmp_path / f"{register_list.name}_register_file_axi_lite.vhd").exists() 

70 

71 

72@pytest.mark.parametrize("register_list", REGISTER_LISTS) 

73def test_can_generate_c_without_error(tmp_path, register_list): 

74 CHeaderGenerator(register_list, tmp_path).create() 

75 assert (tmp_path / f"{register_list.name}_regs.h").exists() 

76 

77 CHeaderGenerator(register_list, tmp_path, file_name="apa.h").create() 

78 assert (tmp_path / "apa.h").exists() 

79 

80 

81@pytest.mark.parametrize("register_list", REGISTER_LISTS) 

82def test_can_generate_cpp_without_error(tmp_path, register_list): 

83 CppInterfaceGenerator(register_list, tmp_path).create() 

84 assert (tmp_path / f"i_{register_list.name}.h").exists() 

85 

86 CppHeaderGenerator(register_list, tmp_path).create() 

87 assert (tmp_path / f"{register_list.name}.h").exists() 

88 

89 CppImplementationGenerator(register_list, tmp_path).create() 

90 assert (tmp_path / f"{register_list.name}.cpp").exists() 

91 

92 

93@pytest.mark.parametrize("register_list", REGISTER_LISTS) 

94def test_can_generate_html_without_error(tmp_path, register_list): 

95 HtmlRegisterTableGenerator(register_list, tmp_path).create() 

96 assert (tmp_path / f"{register_list.name}_register_table.html").exists() 

97 

98 HtmlConstantTableGenerator(register_list, tmp_path).create() 

99 assert (tmp_path / f"{register_list.name}_constant_table.html").exists() 

100 

101 HtmlPageGenerator(register_list, tmp_path).create() 

102 assert (tmp_path / f"{register_list.name}_regs.html").exists() 

103 

104 

105@pytest.mark.parametrize("register_list", REGISTER_LISTS) 

106def test_can_generate_python_without_error(tmp_path, register_list): 

107 PythonPickleGenerator(register_list, tmp_path).create() 

108 assert (tmp_path / f"{register_list.name}.py").exists() 

109 

110 PythonAccessorGenerator(register_list, tmp_path).create() 

111 assert (tmp_path / f"{register_list.name}_accessor.py").exists()