aboutsummaryrefslogtreecommitdiff
path: root/ethosu/vela/tflite_graph_optimiser.py
diff options
context:
space:
mode:
Diffstat (limited to 'ethosu/vela/tflite_graph_optimiser.py')
-rw-r--r--ethosu/vela/tflite_graph_optimiser.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/ethosu/vela/tflite_graph_optimiser.py b/ethosu/vela/tflite_graph_optimiser.py
index b8e61f48..90b29327 100644
--- a/ethosu/vela/tflite_graph_optimiser.py
+++ b/ethosu/vela/tflite_graph_optimiser.py
@@ -48,6 +48,7 @@ from .operation import NpuBlockType
from .operation import Op
from .operation import Operation
from .operation import Padding
+from .operation_util import create_add_nop
from .operation_util import create_avgpool_nop
from .operation_util import get_pad_values_from_input
from .scaling import quantise_scale
@@ -1801,6 +1802,7 @@ def convert_shape_op_to_constant_tensor(op: Operation, arch, nng):
# Convert this SHAPE op to const
op.type = Op.Const
+ DebugDatabase.add_optimised(op, op)
# Add size calculation to shape output tensors
ofm.values = np.array(ifm.shape)
@@ -1935,4 +1937,23 @@ def tflite_optimise_graph(nng, arch):
rewrite_graph.visit_graph_post_order(sg.output_tensors, arch, [], [remove_SplitSliceRead])
sg.refresh_after_modification()
+ # Make sure that const optimisations on subgraph outputs are handled correctly
+ for sg in nng.subgraphs:
+ for ofm in sg.output_tensors:
+ if ofm.is_const and ofm.ops[0].type_changed:
+ # Subgraph output cannot be const - insert a memory copy
+ op = ofm.ops[0]
+ ofm_clone = ofm.clone()
+ ofm_clone.values = ofm.values
+ ofm.values = None
+ np_dtype = ofm.dtype.as_numpy_type()
+ zero = create_const_tensor("zero", [1], ofm.dtype, [0], np_dtype, quantization=ofm.quantization)
+ memcpy = create_add_nop(f"{ofm.name}_copy")
+ memcpy.add_input_tensor(ofm_clone)
+ memcpy.add_input_tensor(zero)
+ memcpy.set_output_tensor(ofm)
+ memcpy.set_ifm_ofm_shapes()
+ op.set_output_tensor(ofm_clone)
+ DebugDatabase.add_optimised(op, memcpy)
+
return nng