Coverage for hdl_registers/parser/yaml.py: 86%
21 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# --------------------------------------------------------------------------------------------------
10from __future__ import annotations
12from typing import TYPE_CHECKING, Any
14import yaml
16from .parser import RegisterParser
18if TYPE_CHECKING:
19 from pathlib import Path
21 from hdl_registers.register import Register
22 from hdl_registers.register_list import RegisterList
25def from_yaml(
26 name: str, yaml_file: Path, default_registers: list[Register] | None = None
27) -> RegisterList:
28 """
29 Parse a YAML file with register data.
31 Arguments:
32 name: The name of the register list.
33 yaml_file: The YAML file path.
34 default_registers: List of default registers.
36 Return:
37 The resulting register list.
38 """
39 parser = RegisterParser(
40 name=name, source_definition_file=yaml_file, default_registers=default_registers
41 )
42 yaml_data = _load_yaml_file(file_path=yaml_file)
44 return parser.parse(register_data=yaml_data)
47def _load_yaml_file(file_path: Path) -> dict[str, Any]:
48 """
49 Load and parse the YAML data into a dictionary. Raise exceptions if things dont work.
50 """
51 if not file_path.exists():
52 raise FileNotFoundError(f"Requested YAML file does not exist: {file_path}")
54 with file_path.open(encoding="utf-8") as file_handle:
55 try:
56 return yaml.safe_load(file_handle)
57 except Exception as exception_info:
58 message = f"Error while parsing YAML file {file_path}:\n{exception_info}"
59 raise ValueError(message) from exception_info