aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Petit <kevin.petit@arm.com>2023-04-26 16:25:52 +0100
committerKevin Petit <kevin.petit@arm.com>2023-04-26 16:57:32 +0100
commit211c5f5294cd08ebbf61278823e5195fef181dd7 (patch)
tree14cae4ec82883302b9966b28ef2330798f8e4987
parente0fee3d30085a6d07b104447f5b128e81126445e (diff)
downloadspecification-211c5f5294cd08ebbf61278823e5195fef181dd7.tar.gz
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 <kevin.petit@arm.com>
-rw-r--r--chapters/introduction.adoc6
-rwxr-xr-xtools/genspec.py24
-rw-r--r--tools/tosa.py21
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)