IVGCVSW-2771 Fix SubTensor error in vgg16 ExecuteNetwork NEON

 * Add check if Sub-tensors cannot be used, call ACL function
 * Add computation of SplitAxis from SplitterDescriptor
 * Add NeonSplitterWorkload functions
 * Modify IsSplitterSupported to call ACL validate function
if sub-tensor cannot be used
 * Also check if quantization parameters match when using sub-tensors
 * Add more unit tests for Splitter in TfParser and TfLiteParser

Signed-off-by: Narumol Prangnawarat <narumol.prangnawarat@arm.com>
Change-Id: I31e4c7d055117c83c65b598c4125442173242226
diff --git a/src/backends/aclCommon/ArmComputeUtils.hpp b/src/backends/aclCommon/ArmComputeUtils.hpp
index b4673f7..5b8f983 100644
--- a/src/backends/aclCommon/ArmComputeUtils.hpp
+++ b/src/backends/aclCommon/ArmComputeUtils.hpp
@@ -9,6 +9,8 @@
 
 #include <arm_compute/core/Types.h>
 
+#include <boost/assert.hpp>
+
 namespace armnn
 {
 
@@ -130,4 +132,23 @@
     return dim - 1;
 }
 
+inline std::set<unsigned int> ComputeSplitAxis(const armnn::SplitterDescriptor& desc, const TensorShape& input)
+{
+    unsigned int numSplit = desc.GetNumViews();
+    unsigned int numDimensions = desc.GetNumDimensions();
+    std::set<unsigned int> splitAxis;
+
+    for (unsigned int i = 0; i < numSplit; ++i)
+    {
+        for (unsigned int dimIdx = 0; dimIdx < numDimensions; ++dimIdx)
+        {
+            if (desc.GetViewSizes(i)[dimIdx] != input[dimIdx])
+            {
+                splitAxis.insert(dimIdx);
+            }
+        }
+    }
+    return splitAxis;
+}
+
 } // namespace armnn