blob: 784a7128723a2f97b4efb5b792e84166bc5b0653 [file] [log] [blame]
#!/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()