IVGCVSW-7168 Add Conv2d and Constant support to TOSA Reference Backend

 * Added TOSA Conv2d and Constant mappings.
 * Added unique naming to mappings based on previous and following
   layers, so they are connected correctly.
 * Updated existing mappings with new naming convention.
 * Added all mappings to one main block in OptimizeSubgraphView.
 * Removed isMain from mapping functions.
 * Added Conv2d EndToEnd test.

Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com>
Change-Id: I27c3e238407c32379ce25a1f01dad11523ef5d2b
diff --git a/src/backends/tosaCommon/operatorMappings/TosaOperatorUtils.hpp b/src/backends/tosaCommon/operatorMappings/TosaOperatorUtils.hpp
index f51b210..176e4e1 100644
--- a/src/backends/tosaCommon/operatorMappings/TosaOperatorUtils.hpp
+++ b/src/backends/tosaCommon/operatorMappings/TosaOperatorUtils.hpp
@@ -5,10 +5,13 @@
 
 #pragma once
 
+#include <Layer.hpp>
 #include <armnn/Tensor.hpp>
 #include <armnn/Types.hpp>
 
-#include <tosa_generated.h>
+#include "common/include/ProfilingGuid.hpp"
+
+#include <tosa_serialization_handler.h>
 
 using namespace armnn;
 using namespace tosa;
@@ -53,6 +56,33 @@
     return returnShape;
 }
 
+// Function that generates unique name using the layer type, input slot and layer guid.
+inline std::string GenerateUniqueName(const Layer& layer, uint32_t layerSlot)
+{
+    std::string name;
+    std::string guid        = std::to_string(layer.GetGuid());
+    std::string slotAndGuid = std::to_string(layerSlot) + "_" + guid;
+    LayerType layerType = layer.GetType();
+
+    if (layerType == LayerType::Input)
+    {
+        name = "input" + slotAndGuid;
+    }
+    else if (layerType == LayerType::Output)
+    {
+        name = "output" + slotAndGuid;
+    }
+    else if (layerType == LayerType::Constant)
+    {
+        name = "constant_" + guid;
+    }
+    else
+    {
+        name = "intermediate" + slotAndGuid;
+    }
+    return name;
+}
+
 // Function to return unique int as a string to ensure uniqueness between all input, output and block names.
 static int uniqueTosaMappingID = 0;
 inline std::string GetUniqueTosaMappingID()
@@ -206,3 +236,72 @@
     }
     return "";
 }
+
+inline std::vector<uint8_t> ConvertConstantTensorDataToBuffer(const std::shared_ptr<ConstTensorHandle>& tensorHandle)
+{
+    tosa_err_t error;
+    std::vector<uint8_t> uint8Data;
+    auto tensorInfo = tensorHandle->GetTensorInfo();
+
+    switch (tensorInfo.GetDataType())
+    {
+        case DataType::Float32:
+        {
+            std::vector<float> data(tensorInfo.GetNumElements());
+            memcpy(data.data(), tensorHandle->Map(true), tensorInfo.GetNumBytes());
+
+            error = TosaSerializationHandler::ConvertF32toU8(data, uint8Data);
+            break;
+        }
+        case DataType::Float16:
+        {
+            std::vector<float> data(tensorInfo.GetNumElements());
+            memcpy(data.data(), tensorHandle->Map(true), tensorInfo.GetNumBytes());
+
+            error = TosaSerializationHandler::ConvertF16toU8(data, uint8Data);
+            break;
+        }
+        case DataType::QSymmS8:
+        case DataType::QAsymmS8:
+        {
+            std::vector<int8_t> data(tensorInfo.GetNumElements());
+            memcpy(data.data(), tensorHandle->Map(true), tensorInfo.GetNumBytes());
+
+            error = TosaSerializationHandler::ConvertI8toU8(data, uint8Data);
+            break;
+        }
+        case DataType::QAsymmU8:
+        {
+            memcpy(uint8Data.data(), tensorHandle->Map(true), tensorInfo.GetNumBytes());
+            break;
+        }
+        case DataType::QSymmS16:
+        {
+            std::vector<int16_t> data(tensorInfo.GetNumElements());
+            memcpy(data.data(), tensorHandle->Map(true), tensorInfo.GetNumBytes());
+
+            error = TosaSerializationHandler::ConvertI16toU8(data, uint8Data);
+            break;
+        }
+        case DataType::Signed32:
+        {
+            std::vector<int32_t> data(tensorInfo.GetNumElements());
+            memcpy(data.data(), tensorHandle->Map(true), tensorInfo.GetNumBytes());
+
+            error = TosaSerializationHandler::ConvertI32toU8(data, uint8Data);
+            break;
+        }
+        default:
+        {
+            throw armnn::Exception("SetConstantTensorData: An unsupported data type was encountered.");
+        }
+    }
+
+    if(error != tosa_err_t::TOSA_OK)
+    {
+        throw armnn::Exception("SetConstantTensorData: An error occurred when converting constant data");
+    }
+
+    tensorHandle->Unmap();
+    return uint8Data;
+}