From 211c5f5294cd08ebbf61278823e5195fef181dd7 Mon Sep 17 00:00:00 2001 From: Kevin Petit Date: Wed, 26 Apr 2023 16:25:52 +0100 Subject: Generate level maximums from the XML Also make LEVEL_CHECKs unconditional in pseudocode. The various MAX_* maximums are always defined. Change-Id: Iee5d8ade5cba3b4f86cc09f8b867b59fe18f5cfe Signed-off-by: Kevin Petit --- chapters/introduction.adoc | 6 +----- tools/genspec.py | 24 ++++++++++++++++++++---- tools/tosa.py | 21 ++++++++++++++++++++- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/chapters/introduction.adoc b/chapters/introduction.adoc index eecdbc7..b1d92d9 100644 --- a/chapters/introduction.adoc +++ b/chapters/introduction.adoc @@ -120,11 +120,7 @@ The following table defines the value ranges for Level 1.0. These ranges are checked using the LEVEL_CHECK() function with the operator descriptions. .Level maximums -|=== -| Level | tosa_level_t | MAX_RANK | MAX_KERNEL | MAX_STRIDE | MAX_SCALE -| None | tosa_level_none | NA | NA | NA | NA -| 8K | tosa_level_8k | 6 | 8192 | 8192 | 64 -|=== +include::{generated}/levels.adoc[] === Status diff --git a/tools/genspec.py b/tools/genspec.py index 2bc1283..f495296 100755 --- a/tools/genspec.py +++ b/tools/genspec.py @@ -58,11 +58,9 @@ 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----\nif (level != tosa_level_none) {{\n{leveltext}}}\n----\n" - ) + file.write(f"[source,c++]\n----\n{leveltext}\n----\n") def generate(self, outdir): os.makedirs(outdir, exist_ok=True) @@ -77,6 +75,24 @@ 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) diff --git a/tools/tosa.py b/tools/tosa.py index 9af0756..265d5f6 100644 --- a/tools/tosa.py +++ b/tools/tosa.py @@ -13,6 +13,11 @@ class TOSAEnum: self.description = description self.values = values +class TOSALevel: + def __init__(self, name, desc, maximums): + self.name = name + self.desc = desc + self.maximums = maximums class TOSAOperatorArgument: def __init__(self, name, description, categories, ty, shape, levellimits): @@ -49,12 +54,15 @@ class TOSASpec: def __init__(self, xmlpath): tree = ET.parse(xmlpath) self.xmlroot = tree.getroot() + self.levels = [] self.operatorgroups = [] self.enums = [] self.__load_spec() def __load_spec(self): self.__load_version() + for level in self.xmlroot.findall("./levels/level"): + self.levels.append(self.__load_level(level)) for group in self.xmlroot.findall("./operators/operatorgroup"): self.operatorgroups.append(self.__load_operator_group(group)) for enum in self.xmlroot.findall("./enum"): @@ -70,6 +78,17 @@ class TOSASpec: else: self.version_is_draft = False + def __load_level(self, level): + name = level.get("name") + desc = level.text.strip() + maximums = { + 'MAX_RANK': level.get("max_rank"), + 'MAX_KERNEL': level.get("max_kernel"), + 'MAX_STRIDE': level.get("max_stride"), + 'MAX_SCALE': level.get("max_scale"), + } + return TOSALevel(name, desc, maximums) + def __load_operator_group(self, group): name = group.get("name") operators = [] @@ -128,4 +147,4 @@ class TOSASpec: values = [] for val in arg.findall("enumval"): values.append((val.get("name"), val.get("value"), val.get("description"))) - return TOSAEnum(name, desc, values) \ No newline at end of file + return TOSAEnum(name, desc, values) -- cgit v1.2.1