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
« 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# --------------------------------------------------------------------------------------------------
10from pathlib import Path
11from typing import TYPE_CHECKING, Any
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
19from .html_generator_common import HtmlGeneratorCommon
20from .html_translator import HtmlTranslator
22if TYPE_CHECKING:
23 from hdl_registers.constant.constant import Constant
24 from hdl_registers.register_list import RegisterList
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 """
33 __version__ = "1.0.0"
35 SHORT_DESCRIPTION = "HTML constant table"
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"
44 def __init__(self, register_list: "RegisterList", output_folder: Path) -> None:
45 super().__init__(register_list=register_list, output_folder=output_folder)
47 self._html_translator = HtmlTranslator()
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 ""
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>"""
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>"""
81 html += """
82</tbody>
83</table>"""
84 return html
86 def _format_constant_value(self, constant: "Constant") -> str:
87 if isinstance(constant, UnsignedVectorConstant):
88 return f"{constant.prefix}{constant.value}"
90 if isinstance(constant, StringConstant):
91 return f'"{constant.value}"'
93 # For others, just cast to string.
94 if isinstance(constant, (BooleanConstant, IntegerConstant, FloatConstant)):
95 return str(constant.value)
97 raise ValueError(f'Got unexpected constant type. "{constant}".')