MLBEDSW-5844: Inconsistent calculation of read shapes

 - This bug causes a regression in the use of unpack and split operators
 - The bug is due to the read_shapes attribute being an absolute calculation
for slice and strided_slice, but a relative one for unpack and split
 - The fix is to consistently treat the attribute as a shape relative to the
read_offset

Signed-off-by: Tim Hall <tim.hall@arm.com>
Change-Id: I4504b161be507ea22ca6ee40fbe7808bfe049405
diff --git a/ethosu/vela/high_level_command_stream.py b/ethosu/vela/high_level_command_stream.py
index abf6d83..cf31aa5 100644
--- a/ethosu/vela/high_level_command_stream.py
+++ b/ethosu/vela/high_level_command_stream.py
@@ -79,13 +79,13 @@
             if len(new_start_coord) >= 2:
                 stride = strides[2]
                 # if the current op was combined with a split slice read then the valid ifm range is given by the output
-                # of the split op
+                # of the split op (which is defined by the read offset and the read shape)
                 if split_offset is None:
                     new_start_coord[-2] = max(new_start_coord[-2] * stride - skirt[1], 0)
                     new_end_coord[-2] = min(new_end_coord[-2] * stride + skirt[3], ifm_shape.width)
                 else:
                     new_start_coord[-2] = max(new_start_coord[-2] * stride - skirt[1], split_offset[-2])
-                    new_end_coord[-2] = min(new_end_coord[-2] * stride + skirt[3], split_shape[-2])
+                    new_end_coord[-2] = min(new_end_coord[-2] * stride + skirt[3], split_offset[-2] + split_shape[-2])
 
             if len(new_start_coord) >= 3:
                 stride = strides[1]
diff --git a/ethosu/vela/tflite_graph_optimiser.py b/ethosu/vela/tflite_graph_optimiser.py
index 7b10f86..8cfc373 100644
--- a/ethosu/vela/tflite_graph_optimiser.py
+++ b/ethosu/vela/tflite_graph_optimiser.py
@@ -146,7 +146,11 @@
         new_op = Operation(Op.SplitSliceRead, split_op.name)
         new_op.inputs = [inp]
         ofm_shape_idx = 0
-        read_shape = offset_end
+        if None in (offset_end, offset_start):
+            read_shape = None
+        else:
+            # the read shape is relative to each start offset
+            read_shape = [oe - os for oe, os in zip(offset_end, offset_start)]
 
         # For Split the offset cannot be extracted from the tensor so it has to
         # be calculated from the index of the output tensor