aboutsummaryrefslogtreecommitdiff
path: root/ethosu/vela/vela.py
diff options
context:
space:
mode:
authorJonas Ohlsson <jonas.ohlsson@arm.com>2021-07-26 16:13:12 +0200
committerJonas Ohlsson <jonas.ohlsson@arm.com>2021-07-27 11:06:27 +0200
commit45e653dbd81633b8d78215b16a9b2205e39dd8e2 (patch)
tree18b3073eac45e9e8d69a616ae96d7a3fbdef9663 /ethosu/vela/vela.py
parentc2449827ec55f49b6087e3e385fb3c4f6776dc6a (diff)
downloadethos-u-vela-45e653dbd81633b8d78215b16a9b2205e39dd8e2.tar.gz
MLBEDSW-4853: Refactor supported operators
Refactor supported operators by breaking out model semantics into its own class. Model semantics checked right after model read. Signed-off-by: Jonas Ohlsson <jonas.ohlsson@arm.com> Change-Id: If442b189efcd91dda01af60b2b3adedfacdf2fad
Diffstat (limited to 'ethosu/vela/vela.py')
-rw-r--r--ethosu/vela/vela.py117
1 files changed, 81 insertions, 36 deletions
diff --git a/ethosu/vela/vela.py b/ethosu/vela/vela.py
index ecdc7aa7..b8a3b9f2 100644
--- a/ethosu/vela/vela.py
+++ b/ethosu/vela/vela.py
@@ -35,14 +35,18 @@ from .api import API_VERSION
from .debug_database import DebugDatabase
from .errors import InputFileError
from .errors import VelaError
+from .nn_graph import NetworkType
from .nn_graph import PassPlacement
from .nn_graph import TensorAllocator
-from .supported_operators import SupportedOperators
from .tensor import MemArea
from .tensor import Tensor
from .tflite.Model import Model
from .tflite_mapping import builtin_operator_map
from .tflite_mapping import builtin_type_name
+from .tflite_model_semantic import TFLiteSemantic
+from .tflite_supported_operators import TFLiteSupportedOperators
+from .tosa_model_semantic import TosaSemantic
+from .tosa_supported_operators import TosaSupportedOperators
from ethosu.vela.architecture_features import ArchitectureFeatures
@@ -169,50 +173,91 @@ def generate_supported_ops():
"This file complies with",
"[**Gitiles Markdown syntax**](https://github.com/google/gitiles/blob/master/Documentation/markdown.md)",
"",
- "## Summary Table",
- "",
- "The table below contains TFLite operators that can be placed on the Ethos-U NPU. ",
- "If the constraints are not met, then that operator will be scheduled on the CPU instead. ",
- "For any other TFLite operator not listed, will be left untouched and scheduled on the CPU. ",
- "Please check the supported operator list for your chosen runtime for further information.",
- "",
- "| Operator | Constraints |",
- "| --- | --- |",
+ "Summary table of constraints for:",
]
- supported = SupportedOperators()
- op_constraint_links = []
- op_list = sorted(((op, builtin_type_name(op)) for op in builtin_operator_map), key=lambda x: x[1])
- for op, name in op_list:
- internal_op = builtin_operator_map[op][0]
- if internal_op in SupportedOperators.supported_operators:
- links = "[Generic](#generic-constraints)"
- if internal_op in supported.specific_constraints:
- links += f", [Specific](#{name.lower()}-constraints)"
- op_constraint_links.append((internal_op, name))
- lines.append(f"| {name} | {links} |")
- lines += [
- "",
- "## Generic Constraints",
- "",
- "This is a list of constraints that all NPU operators must satisfy in order to be scheduled on the NPU.",
- "",
- ]
- for constraint in supported.generic_constraints:
- # Markdown needs two spaces at the end of a line to render it as a separate line
- reason = constraint.__doc__.replace("\n", " \n")
- lines.append(f"- {reason}")
- for op, name in op_constraint_links:
+
+ for network_type in NetworkType:
+ lines += [
+ f"- [{network_type.name}](#{network_type.name.lower()}-summary-table)",
+ ]
+
+ for network_type in NetworkType:
+ lines += [
+ "",
+ f"## {network_type.name} Summary Table",
+ "",
+ ]
+ if network_type == NetworkType.TFLite:
+ lines += [
+ "The table below contains TFLite operators that can be placed on the Ethos-U NPU. ",
+ "If the constraints are not met, then that operator will be scheduled on the CPU instead. ",
+ "For any other TFLite operator not listed, will be left untouched and scheduled on the CPU. ",
+ "Please check the supported operator list for your chosen runtime for further information.",
+ "",
+ "| Operator | TFLite Constraints |",
+ "| --- | --- |",
+ ]
+ semantic_checker = TFLiteSemantic()
+ supported = TFLiteSupportedOperators()
+ elif network_type == NetworkType.TOSA:
+ lines += [
+ "The table below contains TOSA operators that can be placed on the Ethos-U NPU. ",
+ "Note: There is limited support for compiling a TOSA neural network (EXPERIMENTAL). ",
+ "The related constraints have not yet been populated in the list.",
+ "",
+ "| Operator | TOSA Constraints |",
+ "| --- | --- |",
+ ]
+ semantic_checker = TosaSemantic()
+ supported = TosaSupportedOperators()
+ else:
+ raise ValueError
+
+ op_constraint_links = []
+ op_list = sorted(((op, builtin_type_name(op)) for op in builtin_operator_map), key=lambda x: x[1])
+ for op, name in op_list:
+ internal_op = builtin_operator_map[op][0]
+ if internal_op in TFLiteSupportedOperators.supported_operators:
+ links = f"[Generic](#{network_type.name.lower()}-generic-constraints)"
+ if (
+ internal_op in supported.specific_constraints
+ or internal_op in semantic_checker.specific_constraints
+ ):
+ links += f", [Specific](#{network_type.name.lower()}-{name.lower()}-constraints)"
+ op_constraint_links.append((internal_op, name))
+ lines.append(f"| {name} | {links} |")
lines += [
"",
- f"## {name} Constraints",
+ f"### {network_type.name} Generic Constraints",
"",
- f"This is a list of constraints that the {name} operator must satisfy in order to be scheduled on the NPU.",
+ "This is a list of constraints that all NPU operators must satisfy in order to be scheduled on the NPU.",
"",
]
- for constraint in supported.specific_constraints[op]:
+ for constraint in semantic_checker.generic_constraints:
+ # Markdown needs two spaces at the end of a line to render it as a separate line
+ reason = constraint.__doc__.replace("\n", " \n")
+ lines.append(f"- {reason}")
+ for constraint in supported.generic_constraints:
# Markdown needs two spaces at the end of a line to render it as a separate line
reason = constraint.__doc__.replace("\n", " \n")
lines.append(f"- {reason}")
+ for op, name in op_constraint_links:
+ lines += [
+ "",
+ f"### {network_type.name} {name} Constraints",
+ "",
+ f"This is a list of constraints that the {name} operator must satisfy in order to be scheduled on the"
+ " NPU.",
+ "",
+ ]
+ for constraint in semantic_checker.specific_constraints[op]:
+ # Markdown needs two spaces at the end of a line to render it as a separate line
+ reason = constraint.__doc__.replace("\n", " \n")
+ lines.append(f"- {reason}")
+ for constraint in supported.specific_constraints[op]:
+ # Markdown needs two spaces at the end of a line to render it as a separate line
+ reason = constraint.__doc__.replace("\n", " \n")
+ lines.append(f"- {reason}")
# Note. this will generate the file in the CWD
filepath = os.path.join(os.getcwd(), "SUPPORTED_OPS.md")