Coverage for hdl_registers/generator/html/constant_table.py: 92%

38 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2024-09-07 20:51 +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 

10# Standard libraries 

11from pathlib import Path 

12from typing import TYPE_CHECKING, Any 

13 

14# First party libraries 

15from hdl_registers.constant.bit_vector_constant import UnsignedVectorConstant 

16from hdl_registers.constant.boolean_constant import BooleanConstant 

17from hdl_registers.constant.float_constant import FloatConstant 

18from hdl_registers.constant.integer_constant import IntegerConstant 

19from hdl_registers.constant.string_constant import StringConstant 

20 

21# Local folder libraries 

22from .html_generator_common import HtmlGeneratorCommon 

23from .html_translator import HtmlTranslator 

24 

25if TYPE_CHECKING: 

26 # First party libraries 

27 from hdl_registers.constant.constant import Constant 

28 from hdl_registers.register_list import RegisterList 

29 

30 

31class HtmlConstantTableGenerator(HtmlGeneratorCommon): 

32 """ 

33 Generate HTML code with register constant information in a table. 

34 See the :ref:`generator_html` article for usage details. 

35 """ 

36 

37 __version__ = "1.0.0" 

38 

39 SHORT_DESCRIPTION = "HTML constant table" 

40 

41 @property 

42 def output_file(self) -> Path: 

43 """ 

44 Result will be placed in this file. 

45 """ 

46 return self.output_folder / f"{self.name}_constant_table.html" 

47 

48 def __init__(self, register_list: "RegisterList", output_folder: Path): 

49 super().__init__(register_list=register_list, output_folder=output_folder) 

50 

51 self._html_translator = HtmlTranslator() 

52 

53 def get_code(self, **kwargs: Any) -> str: 

54 """ 

55 Get a HTML table with information about register constants. 

56 """ 

57 if not self.register_list.constants: 

58 return "" 

59 

60 html = f"""\ 

61{self.header} 

62<table> 

63<thead> 

64 <tr> 

65 <th>Name</th> 

66 <th>Value</th> 

67 <th>Description</th> 

68 </tr> 

69</thead> 

70<tbody>""" 

71 

72 for constant in self.iterate_constants(): 

73 description = self._html_translator.translate(constant.description) 

74 html += f""" 

75 <tr> 

76 <td><strong>{constant.name}</strong></td> 

77 <td>{self._format_constant_value(constant=constant)}</td> 

78 <td>{description}</td> 

79 </tr>""" 

80 

81 html += """ 

82</tbody> 

83</table>""" 

84 return html 

85 

86 def _format_constant_value(self, constant: "Constant") -> str: 

87 if isinstance(constant, UnsignedVectorConstant): 

88 return f"{constant.prefix}{constant.value}" 

89 

90 if isinstance(constant, StringConstant): 

91 return f'"{constant.value}"' 

92 

93 # For others, just cast to string. 

94 if isinstance(constant, (BooleanConstant, IntegerConstant, FloatConstant)): 

95 return str(constant.value) 

96 

97 raise ValueError(f'Got unexpected constant type. "{constant}".')