MLBEDSW-4838 Added basic TOSA support.

Added basic TOSA support, enabling Vela to
read and compile  a .tosa file corresponding to
CONV2D + Rescale + Clamp, and writing it to an
optimized .tflite file.

The optimized .tflite file, will in this case, hold
a commandstream where the Rescale and Clamp has been
fused into the CONV2D.

The optimized tflite file is not output from Vela.

  -Added support to read .tosa file into Vela
    internal structure.
      - Added tosa_reader.py, tosa_mapper.py and
        helper files stored under tosa/
      - Support for this limited to ~10 ops

    -Added reader_util.py for functions common
    for TOSA and TFLite

    -Added tosa_graph_optimiser.py
      -Added support to fuse Rescale into convolution
      -Modified handling for padding

    -Added support to fuse Clamp to previous op

    -Added graph_optimiser_util.py
      -Moved functions common for TOSA/TFLite graph
       optimization to this file.

    -Renamed graph_optimiser.py to tflite_graph_optmiser.py

    -Added separate tosa_supported_operators.py

    -Added supported_operator_util.py
       -For functions in common for TOSA/TFLite

Signed-off-by: Patrik Gustavsson <patrik.gustavsson@arm.com>
Change-Id: Ic3c540504ec8c5eb4771397fdc6882050ecf33ab
diff --git a/ethosu/vela/model_reader.py b/ethosu/vela/model_reader.py
index bb49b64..f48645d 100644
--- a/ethosu/vela/model_reader.py
+++ b/ethosu/vela/model_reader.py
@@ -16,7 +16,9 @@
 # Description:
 # Dispatcher for reading a neural network model.
 from . import tflite_reader
+from . import tosa_reader
 from .errors import InputFileError
+from .nn_graph import NetworkType
 
 
 class ModelReaderOptions:
@@ -37,12 +39,33 @@
             output_node_names = []
         if initialisation_nodes is None:
             initialisation_nodes = []
-        return tflite_reader.read_tflite(
-            fname,
-            options.batch_size,
-            feed_dict=feed_dict,
-            output_node_names=output_node_names,
-            initialisation_nodes=initialisation_nodes,
+        return (
+            tflite_reader.read_tflite(
+                fname,
+                options.batch_size,
+                feed_dict=feed_dict,
+                output_node_names=output_node_names,
+                initialisation_nodes=initialisation_nodes,
+            ),
+            NetworkType.TFLite,
+        )
+    elif fname.endswith(".tosa"):
+        if feed_dict is None:
+            feed_dict = {}
+        if output_node_names is None:
+            output_node_names = []
+        if initialisation_nodes is None:
+            initialisation_nodes = []
+
+        return (
+            tosa_reader.read_tosa(
+                fname,
+                options.batch_size,
+                feed_dict=feed_dict,
+                output_node_names=output_node_names,
+                initialisation_nodes=initialisation_nodes,
+            ),
+            NetworkType.TOSA,
         )
     else:
-        raise InputFileError(fname, "Unsupported file extension. Only .tflite files are supported")
+        raise InputFileError(fname, "Unsupported file extension. Only .tflite and .tosa files are supported")