IVGCVSW-6630 Add new method AddPrecompiledLayer() to INetwork

  * Add new method AddPrecompiledLayer() to INetwork
    with Comments noting it is for backend users.
  * Added unit test to SubgraphViewTests.cpp.
  * Bug fix and code refactor in Graph.cpp specifically around
    Graph::SubstituteSubgraph(SubgraphView& subgraph,
                              IConnectableLayer* substituteLayer)

Change-Id: If2d816e5109e48ce920bf92d8823b39130c23a16
Signed-off-by: Cathal Corbett <cathal.corbett@arm.com>
diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp
index 54d9ae2..c6f3f91 100644
--- a/src/armnn/Network.cpp
+++ b/src/armnn/Network.cpp
@@ -214,6 +214,13 @@
     return pNetworkImpl->AddPooling3dLayer(pooling3dDescriptor, name);
 }
 
+IConnectableLayer* INetwork::AddPrecompiledLayer(const PreCompiledDescriptor& preCompiledDescriptor,
+                                                    CompiledBlobPtr& compiledBlobPtr,
+                                                    const Optional<BackendId>& backend)
+{
+    return pNetworkImpl->AddPrecompiledLayer(preCompiledDescriptor, compiledBlobPtr, backend);
+}
+
 IConnectableLayer* INetwork::AddActivationLayer(const ActivationDescriptor& activationDescriptor,
                                                 const char* name)
 {
@@ -2763,6 +2770,30 @@
     return layer;
 }
 
+IConnectableLayer* NetworkImpl::AddPrecompiledLayer(const PreCompiledDescriptor& preCompiledDescriptor,
+                                                    CompiledBlobPtr& compiledBlobPtr,
+                                                    const Optional<BackendId>& backend)
+{
+    // Method use is for backend users.
+    const auto layer = m_Graph->AddLayer<PreCompiledLayer>(preCompiledDescriptor, "pre-compiled");
+
+    // Assign the pre-compiled object to layer
+    // Pass only one compiled network, Arm NN does not handle multiple
+    // pre-compiled objects in a single pre-compiled layer currently
+    layer->SetPreCompiledObject(std::move(compiledBlobPtr));
+
+    if (backend.has_value())
+    {
+        layer->SetBackendId(backend.value());
+    }
+    else
+    {
+        layer->SetBackendId(layer->GetBackendHint().value());
+    }
+
+    return layer;
+}
+
 ARMNN_NO_DEPRECATE_WARN_BEGIN
 void NetworkImpl::Accept(ILayerVisitor& visitor) const
 {