aboutsummaryrefslogtreecommitdiff
path: root/tools/genspec.py
blob: 33e8e35ddf01ab130175267feefbfbf24d6c75c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/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)