IVGCVSW-7170 Add Concat support to TOSA Reference Backend

* Change comment for the unique tensor names in all tosa common operators

Signed-off-by: Kevin May <kevin.may@arm.com>
Change-Id: I247b4b2365d5f0173218c5dfd11fba12d2399959
diff --git a/src/backends/tosaReference/TosaRefLayerSupport.cpp b/src/backends/tosaReference/TosaRefLayerSupport.cpp
index e5427eb..0d0d07a 100644
--- a/src/backends/tosaReference/TosaRefLayerSupport.cpp
+++ b/src/backends/tosaReference/TosaRefLayerSupport.cpp
@@ -43,6 +43,13 @@
             inputInfos.push_back(&infos[1]);
             outputInfos.push_back(&infos[2]);
             break;
+        case LayerType::Concat:
+            for (unsigned int i = 0; i < infos.size() - 1; ++i)
+            {
+                inputInfos.push_back(&infos[i]);
+            }
+            outputInfos.push_back(&infos.back());
+            break;
         case LayerType::Constant:
             outputInfos.push_back(&infos[0]);
             break;
diff --git a/src/backends/tosaReference/test/TosaRefEndToEndTests.cpp b/src/backends/tosaReference/test/TosaRefEndToEndTests.cpp
index 49f2cb7..a377293 100644
--- a/src/backends/tosaReference/test/TosaRefEndToEndTests.cpp
+++ b/src/backends/tosaReference/test/TosaRefEndToEndTests.cpp
@@ -7,6 +7,7 @@
 
 #include "backendsCommon/test/AdditionEndToEndTestImpl.hpp"
 #include "backendsCommon/test/Convolution2dEndToEndTestImpl.hpp"
+#include "backendsCommon/test/ConcatEndToEndTestImpl.hpp"
 #include "backendsCommon/test/Pooling2dEndToEndTestImpl.hpp"
 #include "backendsCommon/test/ReshapeEndToEndTestImpl.hpp"
 #include "backendsCommon/test/SliceEndToEndTestImpl.hpp"
@@ -34,6 +35,47 @@
     AdditionEndToEndFloat16<DataType::Float16>(tosaDefaultBackends);
 }
 
+// Concat
+TEST_CASE("TosaRefConcatEndToEndDim0TestFloat32")
+{
+    ConcatDim0EndToEnd<armnn::DataType::Float32>(tosaDefaultBackends);
+}
+
+TEST_CASE("TosaRefConcatEndToEndDim0TestInt32")
+{
+    ConcatDim0EndToEnd<armnn::DataType::Signed32>(tosaDefaultBackends);
+}
+
+TEST_CASE("TosaRefConcatEndToEndDim1TestFloat32")
+{
+    ConcatDim1EndToEnd<armnn::DataType::Float32>(tosaDefaultBackends);
+}
+
+TEST_CASE("TosaRefConcatEndToEndDim1TestInt32")
+{
+    ConcatDim1EndToEnd<armnn::DataType::Signed32>(tosaDefaultBackends);
+}
+
+TEST_CASE("TosaRefConcatEndToEndDim2TestFloat32")
+{
+    ConcatDim2EndToEnd<armnn::DataType::Float32>(tosaDefaultBackends);
+}
+
+TEST_CASE("TosaRefConcatEndToEndDim2TestInt32")
+{
+    ConcatDim2EndToEnd<armnn::DataType::Signed32>(tosaDefaultBackends);
+}
+
+TEST_CASE("TosaRefConcatEndToEndDim3TestFloat32")
+{
+    ConcatDim3EndToEnd<armnn::DataType::Float32>(tosaDefaultBackends);
+}
+
+TEST_CASE("TosaRefConcatEndToEndDim3TestInt32")
+{
+    ConcatDim3EndToEnd<armnn::DataType::Signed32>(tosaDefaultBackends);
+}
+
 // Conv2d
 TEST_CASE("TosaRefConv2dEndtoEndTestFloat32")
 {
diff --git a/src/backends/tosaReference/test/TosaRefLayerSupportTests.cpp b/src/backends/tosaReference/test/TosaRefLayerSupportTests.cpp
index 3c3abc2..051965f 100644
--- a/src/backends/tosaReference/test/TosaRefLayerSupportTests.cpp
+++ b/src/backends/tosaReference/test/TosaRefLayerSupportTests.cpp
@@ -61,6 +61,58 @@
     CHECK(!supported);
 }
 
+TEST_CASE("IsLayerSupportedTosaReferenceConcat")
+{
+    TensorShape input0Shape = { 2, 3, 2, 2 };
+    TensorShape input1Shape = { 2, 3, 2, 2 };
+    TensorShape outputShape = { 2, 6, 2, 2 };
+    TensorInfo input0Info(input0Shape, DataType::Float32);
+    TensorInfo input1Info(input1Shape, DataType::Float32);
+    TensorInfo outputInfo(outputShape, DataType::Float32);
+
+    OriginsDescriptor descriptor;
+    std::vector<TensorShape> shapes = {input0Shape, input1Shape} ;
+    unsigned int concatAxis = 1;
+    descriptor = CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), concatAxis);
+
+    TosaRefLayerSupport supportChecker;
+    std::string reasonIfNotSupported;
+    auto supported = supportChecker.IsLayerSupported(LayerType::Concat,
+                                                     {input0Info, input1Info, outputInfo},
+                                                     descriptor,
+                                                     EmptyOptional(),
+                                                     EmptyOptional(),
+                                                     reasonIfNotSupported);
+
+    CHECK(supported);
+}
+
+TEST_CASE("IsLayerSupportedTosaReferenceConcatUnsupported")
+{
+    TensorShape input0Shape = { 2, 3, 2, 2 };
+    TensorShape input1Shape = { 2, 3, 2, 2 };
+    TensorShape outputShape = { 2, 6, 2, 2 };
+    TensorInfo input0Info(input0Shape, armnn::DataType::QAsymmU8);
+    TensorInfo input1Info(input1Shape, armnn::DataType::QAsymmU8);
+    TensorInfo outputInfo(outputShape, armnn::DataType::QAsymmU8);
+
+    OriginsDescriptor descriptor;
+    std::vector<armnn::TensorShape> shapes = {input0Shape, input1Shape} ;
+    unsigned int concatAxis = 1;
+    descriptor = armnn::CreateDescriptorForConcatenation(shapes.begin(), shapes.end(), concatAxis);
+
+    TosaRefLayerSupport supportChecker;
+    std::string reasonIfNotSupported;
+    auto supported = supportChecker.IsLayerSupported(LayerType::Concat,
+                                                     {input0Info, input1Info, outputInfo},
+                                                     descriptor,
+                                                     EmptyOptional(),
+                                                     EmptyOptional(),
+                                                     reasonIfNotSupported);
+
+    CHECK(!supported);
+}
+
 TEST_CASE("IsLayerSupportedTosaReferenceConstant")
 {
     TensorInfo outputInfo({1,1,3,4}, DataType::Float32);