aboutsummaryrefslogtreecommitdiff
path: root/tools/genspec.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/genspec.py')
-rwxr-xr-xtools/genspec.py73
1 files changed, 9 insertions, 64 deletions
diff --git a/tools/genspec.py b/tools/genspec.py
index 11a3e72..38ae6e3 100755
--- a/tools/genspec.py
+++ b/tools/genspec.py
@@ -3,26 +3,16 @@ import os
import tosa
+
class TOSASpecAsciidocGenerator:
def __init__(self, spec):
self.spec = spec
- def generate_enum(self, enum, file):
- file.write(f"\n=== {enum.name}\n")
- file.write(f"{enum.description}\n")
- file.write("|===\n")
- file.write("|Name|Value|Description\n\n")
- for val in enum.values:
- file.write(f"|{val[0]}|{val[1]}|{val[2]}\n")
- file.write("|===\n")
-
def generate_operator(self, op, file):
file.write("\n*Arguments:*\n")
- file.write("[cols='3,3,2,2,4,8']")
file.write("\n|===\n")
- file.write("|Argument|Type|Name|Shape|Rank|Description\n\n")
+ file.write("|Argument|Type|Name|Shape|Description\n\n")
for arg in op.arguments:
- # Argument
cats = arg.categories
if len(cats) > 1:
cattext = ""
@@ -34,32 +24,9 @@ class TOSASpecAsciidocGenerator:
sep = " "
else:
cattext = cats[0].name.title()
-
- # Type
- if arg.type == 'tensor_t':
- argtype = 'T<{}>'.format(arg.tensor_element_type)
- elif arg.type == 'tensor_list_t':
- if arg.tensor_element_type == '-':
- argtype = 'tensor_list_t'
- else:
- argtype = 'tensor_list_t<T<{}>>'.format(arg.tensor_element_type)
- else:
- argtype = arg.type
-
- # Rank
- if len(arg.rank) > 0:
- if (arg.rank[0] == arg.rank[1]):
- rank = f'{arg.rank[0]}'
- else:
- rank = f'{arg.rank[0]} to {arg.rank[1]}'
- else:
- rank = ""
-
- # Format and write line
file.write(
- f"|{cattext}|{argtype}|{arg.name}|{arg.shape}|{rank}|{arg.description}\n"
+ 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")
@@ -82,9 +49,11 @@ class TOSASpecAsciidocGenerator:
for arg in op.arguments:
if (len(arg.levellimits) > 0):
for limit in arg.levellimits:
- leveltext += "LEVEL_CHECK(" + limit[0] + " <= " + limit[1] + ");\n"
+ leveltext += " LEVEL_CHECK(" + limit[0] + " <= " + limit[1] + ");\n"
if (len(leveltext) > 0):
- file.write(f"[source,c++]\n----\n{leveltext}\n----\n")
+ file.write(
+ f"[source,c++]\n----\nif (level != tosa_level_none) {{\n{leveltext}}}\n----\n"
+ )
def generate(self, outdir):
os.makedirs(outdir, exist_ok=True)
@@ -99,24 +68,6 @@ class TOSASpecAsciidocGenerator:
f.write(' draft')
f.write('\n')
- # Generate level maximums table
- with open(os.path.join(outdir, "levels.adoc"), 'w') as f:
- f.write('|===\n')
- f.write('|tosa_level_t')
- for level in self.spec.levels:
- f.write('|tosa_level_{}'.format(level.name))
- f.write('\n')
- f.write('|Description')
- for level in self.spec.levels:
- f.write('|{}'.format(level.desc))
- f.write('\n')
- for param in self.spec.levels[0].maximums:
- f.write('|{}'.format(param))
- for level in self.spec.levels:
- f.write('|{}'.format(level.maximums[param]))
- f.write('\n')
- f.write('|===\n')
-
# Generator operators
opdir = os.path.join(outdir, "operators")
os.makedirs(opdir, exist_ok=True)
@@ -124,9 +75,7 @@ class TOSASpecAsciidocGenerator:
for op in group.operators:
with open(os.path.join(opdir, op.name + ".adoc"), "w") as f:
self.generate_operator(op, f)
- with open(os.path.join(outdir, "enums.adoc"), 'w') as f:
- for enum in self.spec.enums:
- self.generate_enum(enum, f)
+
if __name__ == "__main__":
import argparse
@@ -136,11 +85,7 @@ if __name__ == "__main__":
parser.add_argument("--outdir", required=True, help="Output directory")
args = parser.parse_args()
- try:
- spec = tosa.TOSASpec(args.xml)
- except RuntimeError as e:
- print(f"Failure reading/validating XML spec: {str(e)}")
- exit(1)
+ spec = tosa.TOSASpec(args.xml)
generator = TOSASpecAsciidocGenerator(spec)
generator.generate(args.outdir)