diff --git a/kernel/register.cc b/kernel/register.cc index fe3495dad..99225ba51 100644 --- a/kernel/register.cc +++ b/kernel/register.cc @@ -757,6 +757,7 @@ struct SimHelper { } string title; string ports; + string source; string desc; string code; string ver; @@ -901,7 +902,8 @@ struct HelpPass : public Pass { // source code fprintf(f, "Simulation model (Verilog)\n"); fprintf(f, "--------------------------\n\n"); - fprintf(f, ".. code:: verilog\n\n"); + fprintf(f, ".. code-block:: verilog\n"); + fprintf(f, " :caption: %s\n\n", cell.source.c_str()); std::stringstream ss; ss << cell.code; for (std::string line; std::getline(ss, line, '\n');) { diff --git a/techlibs/common/cellhelp.py b/techlibs/common/cellhelp.py index 312446ad4..1d55d17f5 100644 --- a/techlibs/common/cellhelp.py +++ b/techlibs/common/cellhelp.py @@ -3,11 +3,13 @@ from __future__ import annotations import fileinput import json +from pathlib import Path class SimHelper: name: str = "" title: str = "" ports: str = "" + source: str = "" desc: list[str] code: list[str] ver: str = "1" @@ -16,14 +18,19 @@ class SimHelper: self.desc = [] def __str__(self) -> str: + printed_fields = [ + "name", "title", "ports", "source", "desc", "code", "ver", + ] + # generate C++ struct val = "tempCell = {\n" - val += f' {json.dumps(self.name)},\n' - val += f' {json.dumps(self.title)},\n' - val += f' {json.dumps(self.ports)},\n' - val += ' ' + json.dumps("\n".join(self.desc)) + ',\n' - val += ' ' + json.dumps("\n".join(self.code)) + ',\n' - val += f' {json.dumps(self.ver)},\n' + for field in printed_fields: + field_val = getattr(self, field) + if isinstance(field_val, list): + field_val = "\n".join(field_val) + val += f' {json.dumps(field_val)},\n' val += "};\n" + + # map name to struct val += f'cell_help[{json.dumps(self.name)}] = tempCell;' val += "\n" val += f'cell_code[{json.dumps(self.name + "+")}] = tempCell;' @@ -45,6 +52,8 @@ for line in fileinput.input(): clean_line = line[7:].replace("\\", "").replace(";", "") simHelper.name, simHelper.ports = clean_line.split(maxsplit=1) simHelper.code = [] + short_filename = Path(fileinput.filename()).name + simHelper.source = f'{short_filename}:{fileinput.filelineno()}' elif not line.startswith("endmodule"): line = " " + line try: