|  | #!/usr/bin/env python3 | 
|  | # Copyright lowRISC contributors. | 
|  | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | # SPDX-License-Identifier: Apache-2.0 | 
|  | r"""Generates top level documentation from an hjson configuration file.""" | 
|  |  | 
|  | import argparse | 
|  | import logging as log | 
|  | from pathlib import Path | 
|  |  | 
|  | import hjson | 
|  | from lib import common | 
|  | from tabulate import tabulate | 
|  |  | 
|  |  | 
|  | def to_markdown(text): | 
|  | """Adds prefix and sufix newlines to 'text'.""" | 
|  | doc_text = f""" | 
|  | {text} | 
|  | """ | 
|  | return doc_text | 
|  |  | 
|  |  | 
|  | def generate_mmap_table(top_level): | 
|  | """Generates top level memory map table.""" | 
|  | header = ["Name", "Type", "Byte Address"] | 
|  | table = [header] | 
|  | colalign = ("left", ) * len(header) | 
|  |  | 
|  | for module in top_level["module"]: | 
|  | for j, (name, base) in enumerate(module["base_addrs"].items()): | 
|  |  | 
|  | base_address = f"{base} ({name})" | 
|  | if name == "null": | 
|  | base_address = f"{base} (regs)" | 
|  |  | 
|  | if j == 0: | 
|  | row = [module["name"], module["type"], base_address] | 
|  | else: | 
|  | row = ["", "", base_address] | 
|  |  | 
|  | table.append(row) | 
|  |  | 
|  | return tabulate(table, | 
|  | headers="firstrow", | 
|  | tablefmt="pipe", | 
|  | colalign=colalign) | 
|  |  | 
|  |  | 
|  | def generate_pinout_table(top_level): | 
|  | """Generates top level pinout table.""" | 
|  | header = ["ID", "Name", "Bank", "Type", "Connection Type", "Description"] | 
|  | table = [header] | 
|  | colalign = ("left", ) * len(header) | 
|  |  | 
|  | for pad in top_level["pinout"]["pads"]: | 
|  | row = [pad["idx"], pad["name"], pad["bank"], pad["type"], pad["connection"], pad["desc"]] | 
|  | table.append(row) | 
|  |  | 
|  | return tabulate(table, | 
|  | headers="firstrow", | 
|  | tablefmt="pipe", | 
|  | colalign=colalign) | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | log.basicConfig(level=log.WARNING, | 
|  | format="%(levelname)s: %(message)s") | 
|  |  | 
|  | parser = argparse.ArgumentParser( | 
|  | prog="gen-top-docs", | 
|  | description=common.wrapped_docstring(), | 
|  | formatter_class=argparse.RawDescriptionHelpFormatter) | 
|  |  | 
|  | parser.add_argument("--topcfg", | 
|  | "-t", | 
|  | required=True, | 
|  | help="Topgen generated config file `top_{name}.hjson`.") | 
|  | parser.add_argument( | 
|  | "--outdir", | 
|  | "-o", | 
|  | help="Target TOP documentation directory.") | 
|  |  | 
|  | args = parser.parse_args() | 
|  |  | 
|  | outdir = Path(args.outdir) | 
|  |  | 
|  | doc_generators = [ | 
|  | { | 
|  | "filename": "mmap.md", | 
|  | "generator": generate_mmap_table, | 
|  | }, | 
|  | { | 
|  | "filename": "pinout.md", | 
|  | "generator": generate_pinout_table, | 
|  | }, | 
|  | ] | 
|  |  | 
|  | with open(args.topcfg, 'r') as infile: | 
|  | top_level = hjson.load(infile) | 
|  | top_outdir = outdir / top_level["name"] | 
|  | top_outdir.mkdir(parents=True, exist_ok=True) | 
|  |  | 
|  | for doc in doc_generators: | 
|  | outfile = top_outdir / doc["filename"] | 
|  | table = doc["generator"](top_level) | 
|  | with open(outfile, 'w') as f: | 
|  | f.write(to_markdown(table)) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main() |