Coverage for hdl_registers/parser/json.py: 86%

22 statements  

« prev     ^ index     » next       coverage.py v7.9.1, created at 2025-06-30 20:52 +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 

12import json 

13from typing import TYPE_CHECKING, Any 

14 

15from tsfpga.system_utils import read_file 

16 

17from .parser import RegisterParser 

18 

19if TYPE_CHECKING: 

20 from pathlib import Path 

21 

22 from hdl_registers.register import Register 

23 from hdl_registers.register_list import RegisterList 

24 

25 

26def from_json( 

27 name: str, json_file: Path, default_registers: list[Register] | None = None 

28) -> RegisterList: 

29 """ 

30 Parse a JSON file with register data. 

31 

32 Arguments: 

33 name: The name of the register list. 

34 json_file: The JSON file path. 

35 default_registers: List of default registers. 

36 

37 Return: 

38 The resulting register list. 

39 """ 

40 parser = RegisterParser( 

41 name=name, source_definition_file=json_file, default_registers=default_registers 

42 ) 

43 json_data = _load_json_file(file_path=json_file) 

44 

45 return parser.parse(register_data=json_data) 

46 

47 

48def _load_json_file(file_path: Path) -> dict[str, Any]: 

49 """ 

50 Load and parse the JSON data into a dictionary. Raise exceptions if things dont work. 

51 """ 

52 if not file_path.exists(): 

53 raise FileNotFoundError(f"Requested JSON file does not exist: {file_path}") 

54 

55 raw_json = read_file(file_path) 

56 try: 

57 return json.loads(raw_json) 

58 except Exception as exception_info: 

59 message = f"Error while parsing JSON file {file_path}:\n{exception_info}" 

60 raise ValueError(message) from exception_info