|  | #!/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 sys | 
|  | import argparse | 
|  | import logging as log | 
|  |  | 
|  | 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( | 
|  | "--generator", | 
|  | "-g", | 
|  | help="Select generator", | 
|  | ) | 
|  | args = parser.parse_args() | 
|  | gen = args.generator | 
|  |  | 
|  | doc_generators = { | 
|  | "mmap": generate_mmap_table, | 
|  | "pinout": generate_pinout_table, | 
|  | } | 
|  | with open(args.topcfg, 'r') as infile: | 
|  | top_level = hjson.load(infile) | 
|  | if gen not in doc_generators: | 
|  | sys.exit(f"Unknown generator {gen}") | 
|  |  | 
|  | print(doc_generators[gen](top_level)) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main() |