| #!/usr/bin/env python3 |
| import os |
| |
| import tosa |
| |
| |
| class TOSASpecAsciidocGenerator: |
| def __init__(self, spec): |
| self.spec = spec |
| |
| def generate_operator(self, op, file): |
| file.write("\n*Arguments:*\n") |
| file.write("\n|===\n") |
| file.write("|Argument|Type|Name|Shape|Description\n\n") |
| for arg in op.arguments: |
| cats = arg.categories |
| if len(cats) > 1: |
| cattext = "" |
| sep = "" |
| for cat in cats: |
| proflist = "/".join(cat.profiles) |
| profcaption = "profiles" if len(cat.profiles) > 1 else "profile" |
| cattext += sep + cat.name.title() + f" ({proflist} {profcaption})" |
| sep = " " |
| else: |
| cattext = cats[0].name.title() |
| file.write( |
| f"|{cattext}|{arg.type}|{arg.name}|{arg.shape}|{arg.description}\n" |
| ) |
| file.write("|===\n") |
| if op.typesupports: |
| file.write("\n*Supported Data Types:*\n\n") |
| file.write("|===\n") |
| header = "|Profile|Mode" |
| for ty in op.types: |
| header += f"|{ty}" |
| file.write(header) |
| file.write("\n\n") |
| for tysup in op.typesupports: |
| profile = ", ".join(tysup.profiles) if tysup.profiles else "Any" |
| entry = f"|{profile}|{tysup.mode}" |
| for ty in op.types: |
| entry += f"|{tysup.tymap[ty]}" |
| entry += "\n" |
| file.write(entry) |
| file.write("|===\n") |
| file.write("\n*Operation Function:*\n\n") |
| leveltext = "" |
| for arg in op.arguments: |
| if (len(arg.levellimits) > 0): |
| for limit in arg.levellimits: |
| leveltext += " LEVEL_CHECK(" + limit[0] + " <= " + limit[1] + ");\n" |
| if (len(leveltext) > 0): |
| file.write( |
| f"[source,c++]\n----\nif (level != tosa_level_none) {{\n{leveltext}}}\n----\n" |
| ) |
| |
| def generate(self, outdir): |
| opdir = os.path.join(outdir, "operators") |
| os.makedirs(opdir, exist_ok=True) |
| for group in self.spec.operatorgroups: |
| for op in group.operators: |
| with open(os.path.join(opdir, op.name + ".adoc"), "w") as f: |
| self.generate_operator(op, f) |
| |
| |
| if __name__ == "__main__": |
| import argparse |
| |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--xml", required=True, help="Path to specification XML") |
| parser.add_argument("--outdir", required=True, help="Output directory") |
| args = parser.parse_args() |
| |
| spec = tosa.TOSASpec(args.xml) |
| |
| generator = TOSASpecAsciidocGenerator(spec) |
| generator.generate(args.outdir) |