| #!/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() |