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

38 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 pathlib import Path 

11from typing import TYPE_CHECKING, Any 

12 

13from hdl_registers.constant.bit_vector_constant import UnsignedVectorConstant 

14from hdl_registers.constant.boolean_constant import BooleanConstant 

15from hdl_registers.constant.float_constant import FloatConstant 

16from hdl_registers.constant.integer_constant import IntegerConstant 

17from hdl_registers.constant.string_constant import StringConstant 

18 

19from .html_generator_common import HtmlGeneratorCommon 

20from .html_translator import HtmlTranslator 

21 

22if TYPE_CHECKING: 

23 from hdl_registers.constant.constant import Constant 

24 from hdl_registers.register_list import RegisterList 

25 

26 

27class HtmlConstantTableGenerator(HtmlGeneratorCommon): 

28 """ 

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

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

31 """ 

32 

33 __version__ = "1.0.0" 

34 

35 SHORT_DESCRIPTION = "HTML constant table" 

36 

37 @property 

38 def output_file(self) -> Path: 

39 """ 

40 Result will be placed in this file. 

41 """ 

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

43 

44 def __init__(self, register_list: "RegisterList", output_folder: Path) -> None: 

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

46 

47 self._html_translator = HtmlTranslator() 

48 

49 def get_code( 

50 self, 

51 **kwargs: Any, # noqa: ANN401, ARG002 

52 ) -> str: 

53 """ 

54 Get a HTML table with information about register constants. 

55 """ 

56 if not self.register_list.constants: 

57 return "" 

58 

59 html = """\ 

60<table> 

61<thead> 

62 <tr> 

63 <th>Name</th> 

64 <th>Value</th> 

65 <th>Description</th> 

66 </tr> 

67</thead> 

68<tbody>""" 

69 

70 for constant in self.iterate_constants(): 

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

72 html += f""" 

73 <tr> 

74 <td><p><strong>{constant.name}</strong></p></td> 

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

76 <td> 

77{description} 

78 </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}".')