Coverage for hdl_registers/parser/json.py: 86%
22 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# --------------------------------------------------------------------------------------------------
10# ruff: noqa: A005
12from __future__ import annotations
14import json
15from typing import TYPE_CHECKING, Any
17from tsfpga.system_utils import read_file
19from .parser import RegisterParser
21if TYPE_CHECKING:
22 from pathlib import Path
24 from hdl_registers.register import Register
25 from hdl_registers.register_list import RegisterList
28def from_json(
29 name: str, json_file: Path, default_registers: list[Register] | None = None
30) -> RegisterList:
31 """
32 Parse a JSON file with register data.
34 Arguments:
35 name: The name of the register list.
36 json_file: The JSON file path.
37 default_registers: List of default registers.
39 Return:
40 The resulting register list.
41 """
42 parser = RegisterParser(
43 name=name, source_definition_file=json_file, default_registers=default_registers
44 )
45 json_data = _load_json_file(file_path=json_file)
47 return parser.parse(register_data=json_data)
50def _load_json_file(file_path: Path) -> dict[str, Any]:
51 """
52 Load and parse the JSON data into a dictionary. Raise exceptions if things dont work.
53 """
54 if not file_path.exists():
55 raise FileNotFoundError(f"Requested JSON file does not exist: {file_path}")
57 raw_json = read_file(file_path)
58 try:
59 return json.loads(raw_json)
60 except Exception as exception_info:
61 message = f"Error while parsing JSON file {file_path}:\n{exception_info}"
62 raise ValueError(message) from exception_info