Coverage for hdl_registers/parser/test/test_yaml.py: 100%
42 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
11from tsfpga.system_utils import create_file
13from hdl_registers.parser.yaml import from_yaml
14from hdl_registers.register import Register
15from hdl_registers.register_modes import REGISTER_MODES
18def test_load_nonexistent_yaml_file_should_raise_exception(tmp_path):
19 yaml_path = tmp_path / "apa.yaml"
20 with pytest.raises(FileNotFoundError) as exception_info:
21 from_yaml(name="", yaml_file=yaml_path)
22 assert str(exception_info.value) == f"Requested YAML file does not exist: {yaml_path}"
25def test_load_dirty_yaml_file_should_raise_exception(tmp_path):
26 yaml = """
27apa:
28 mode: r_w
29"""
30 yaml_path = create_file(tmp_path / "apa.yaml", yaml)
31 from_yaml(name="", yaml_file=yaml_path)
33 yaml_path = create_file(tmp_path / "hest.yaml", yaml + "garbage")
34 with pytest.raises(ValueError) as exception_info:
35 from_yaml(name="", yaml_file=yaml_path)
36 assert str(exception_info.value).startswith(
37 f"Error while parsing YAML file {yaml_path}:\nwhile scanning a simple key\n"
38 )
41def test_default_registers(tmp_path):
42 yaml_path = create_file(
43 file=tmp_path / "regs.yaml",
44 contents="""
45apa:
46 mode: r_w
47 description: Apa.
48 enable:
49 type: bit
50 default_value: '1'
51 description: Enable.
53hest:
54 mode: r
55 description: Hest.
56 disable:
57 type: bit
58 description: Disable.
59""",
60 )
61 register_list = from_yaml(
62 name="",
63 yaml_file=yaml_path,
64 default_registers=[
65 Register(name="config", index=0, mode=REGISTER_MODES["r_w"], description=""),
66 Register(name="status", index=1, mode=REGISTER_MODES["r"], description=""),
67 ],
68 )
70 # Default registers.
71 assert register_list.get_register("config").index == 0
72 assert register_list.get_register("status").index == 1
74 # yaml registers.
75 assert register_list.get_register("apa").index == 2
76 assert register_list.get_register("apa").mode == REGISTER_MODES["r_w"]
77 assert register_list.get_register("apa").description == "Apa."
78 assert len(register_list.get_register("apa").fields) == 1
79 assert register_list.get_register("apa").fields[0].name == "enable"
80 assert register_list.get_register("apa").fields[0].description == "Enable."
81 assert register_list.get_register("apa").fields[0].default_value == "1"
83 assert register_list.get_register("hest").index == 3
84 assert register_list.get_register("hest").mode == REGISTER_MODES["r"]
85 assert register_list.get_register("hest").description == "Hest."
86 assert len(register_list.get_register("hest").fields) == 1
87 assert register_list.get_register("hest").fields[0].name == "disable"
88 assert register_list.get_register("hest").fields[0].description == "Disable."
89 assert register_list.get_register("hest").fields[0].default_value == "0"
92def test_two_registers_with_same_name_does_not_raise_exception(tmp_path):
93 # Limitation in the YAML Python parser: https://github.com/yaml/pyyaml/issues/165
94 # This is not a problem for TOML.
95 # We would highly prefer if this raised exception.
96 yaml_path = create_file(
97 file=tmp_path / "regs.yaml",
98 contents="""
99apa:
100 mode: r_w
102apa:
103 mode: r
104""",
105 )
107 register_list = from_yaml(name="", yaml_file=yaml_path)
108 assert len(register_list.register_objects) == 1
109 assert register_list.register_objects[0].mode == REGISTER_MODES["r"]