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

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 

10from __future__ import annotations 

11 

12from typing import TYPE_CHECKING, Any 

13 

14import yaml 

15 

16from .parser import RegisterParser 

17 

18if TYPE_CHECKING: 

19 from pathlib import Path 

20 

21 from hdl_registers.register import Register 

22 from hdl_registers.register_list import RegisterList 

23 

24 

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. 

30 

31 Arguments: 

32 name: The name of the register list. 

33 yaml_file: The YAML file path. 

34 default_registers: List of default registers. 

35 

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) 

43 

44 return parser.parse(register_data=yaml_data) 

45 

46 

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}") 

53 

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