blob: b65207bb95f1628b803b22f69075c82848be073f [file] [log] [blame]
Sadik Armagan62483be2020-10-23 17:14:43 +01001//
Ryan OShea4c231de2023-01-17 15:19:20 +00002// Copyright © 2022-2023 Arm Ltd and Contributors. All rights reserved.
Sadik Armagan62483be2020-10-23 17:14:43 +01003// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include <tensorflow/lite/builtin_ops.h>
9#include <tensorflow/lite/c/builtin_op_data.h>
10#include <tensorflow/lite/c/common.h>
11#include <tensorflow/lite/minimal_logging.h>
12
13namespace armnnDelegate
14{
15
16TfLiteStatus VisitSpaceToDepthOperator(DelegateData& delegateData,
17 TfLiteContext* tfLiteContext,
18 TfLiteNode* tfLiteNode,
19 int nodeIndex,
20 int32_t operatorCode)
21{
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000022 TF_LITE_ENSURE_STATUS(ValidateNumInputs(tfLiteContext, tfLiteNode, 1, nodeIndex));
23 TF_LITE_ENSURE_STATUS(ValidateNumOutputs(tfLiteContext, tfLiteNode, 1, nodeIndex));
Finn Williams6f9f9902020-11-13 13:23:15 +000024
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000025 const TfLiteTensor* tfLiteTensors = tfLiteContext->tensors;
26 const TfLiteTensor& tfLiteInputTensor = tfLiteTensors[tfLiteNode->inputs->data[0]];
27 if (!IsValid(tfLiteContext, tfLiteInputTensor, operatorCode, nodeIndex))
28 {
29 return kTfLiteError;
30 }
31
32 const TfLiteTensor& tfLiteOutputTensor = tfLiteTensors[tfLiteNode->outputs->data[0]];
33 if (!IsValid(tfLiteContext, tfLiteOutputTensor, operatorCode, nodeIndex))
34 {
35 return kTfLiteError;
36 }
37
38 const armnn::TensorInfo& inputTensorInfo = GetTensorInfoForTfLiteTensor(tfLiteInputTensor);
Sadik Armagan90a119b2022-08-05 16:12:49 +010039 const armnn::TensorInfo& outputTensorInfo = GetTensorInfoForTfLiteTensor(tfLiteOutputTensor, true);
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000040
41 armnn::SpaceToDepthDescriptor descriptor;
42 auto* params = reinterpret_cast<TfLiteSpaceToDepthParams*>(tfLiteNode->builtin_data);
43 descriptor.m_BlockSize = params->block_size;
44
45 bool isSupported = false;
Cathal Corbett53837672022-09-01 11:34:37 +010046 armnn::BackendId setBackend;
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000047 auto validateFunc = [&](const armnn::TensorInfo& outInfo, bool& isSupported)
48 {
Sadik Armaganbfa767c2022-02-09 14:58:03 +000049 FORWARD_LAYER_SUPPORT_FUNC("SPACE_TO_DEPTH",
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000050 tfLiteContext,
51 IsSpaceToDepthSupported,
52 delegateData.m_Backends,
53 isSupported,
Cathal Corbett53837672022-09-01 11:34:37 +010054 setBackend,
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000055 inputTensorInfo,
56 outInfo,
57 descriptor);
58 };
59
60 if (!delegateData.m_Network)
61 {
62 validateFunc(outputTensorInfo, isSupported);
63 return isSupported ? kTfLiteOk : kTfLiteError;
64 }
65
66 // Add a SpaceToDepth layer
Mike Kelly07169c82023-08-02 13:23:09 +010067 auto layerName = GetLayerName(armnn::LayerType::SpaceToDepth, nodeIndex);
68 armnn::IConnectableLayer* layer = delegateData.m_Network->AddSpaceToDepthLayer(descriptor, layerName.c_str());
Cathal Corbett53837672022-09-01 11:34:37 +010069 layer->SetBackendId(setBackend);
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000070 ARMNN_ASSERT(layer != nullptr);
71
Ryan OShea4c231de2023-01-17 15:19:20 +000072 // try to connect the Constant Inputs if there are any
Mike Kelly07169c82023-08-02 13:23:09 +010073 if (ProcessInputs(layer, delegateData, tfLiteContext, tfLiteNode, nodeIndex) != kTfLiteOk)
Ryan OShea4c231de2023-01-17 15:19:20 +000074 {
75 return kTfLiteError;
76 }
77
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000078 armnn::IOutputSlot& outputSlot = layer->GetOutputSlot(0);
79 outputSlot.SetTensorInfo(outputTensorInfo);
80
81 // Connect
82 return Connect(layer, tfLiteNode, delegateData);
Sadik Armagan62483be2020-10-23 17:14:43 +010083}
84
85TfLiteStatus VisitDepthToSpaceOperator(DelegateData& delegateData,
86 TfLiteContext* tfLiteContext,
87 TfLiteNode* tfLiteNode,
88 int nodeIndex,
89 int32_t operatorCode)
90{
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000091 TF_LITE_ENSURE_STATUS(ValidateNumInputs(tfLiteContext, tfLiteNode, 1, nodeIndex));
92 TF_LITE_ENSURE_STATUS(ValidateNumOutputs(tfLiteContext, tfLiteNode, 1, nodeIndex));
Finn Williams6f9f9902020-11-13 13:23:15 +000093
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000094 const TfLiteTensor* tfLiteTensors = tfLiteContext->tensors;
95 const TfLiteTensor& tfLiteInputTensor = tfLiteTensors[tfLiteNode->inputs->data[0]];
96 if (!IsValid(tfLiteContext, tfLiteInputTensor, operatorCode, nodeIndex))
97 {
98 return kTfLiteError;
99 }
100
101 const TfLiteTensor& tfLiteOutputTensor = tfLiteTensors[tfLiteNode->outputs->data[0]];
102 if (!IsValid(tfLiteContext, tfLiteOutputTensor, operatorCode, nodeIndex))
103 {
104 return kTfLiteError;
105 }
106
107 const armnn::TensorInfo& inputTensorInfo = GetTensorInfoForTfLiteTensor(tfLiteInputTensor);
Sadik Armagan90a119b2022-08-05 16:12:49 +0100108 const armnn::TensorInfo& outputTensorInfo = GetTensorInfoForTfLiteTensor(tfLiteOutputTensor, true);
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000109
110 armnn::DepthToSpaceDescriptor descriptor;
111 auto* params = reinterpret_cast<TfLiteDepthToSpaceParams*>(tfLiteNode->builtin_data);
112 descriptor.m_BlockSize = params->block_size;
113
114 bool isSupported = false;
Cathal Corbett53837672022-09-01 11:34:37 +0100115 armnn::BackendId setBackend;
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000116 auto validateFunc = [&](const armnn::TensorInfo& outInfo, bool& isSupported)
117 {
Sadik Armaganbfa767c2022-02-09 14:58:03 +0000118 FORWARD_LAYER_SUPPORT_FUNC("DEPTH_TO_SPACE",
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000119 tfLiteContext,
120 IsDepthToSpaceSupported,
121 delegateData.m_Backends,
122 isSupported,
Cathal Corbett53837672022-09-01 11:34:37 +0100123 setBackend,
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000124 inputTensorInfo,
125 outInfo,
126 descriptor);
127 };
128
129 if (!delegateData.m_Network)
130 {
131 validateFunc(outputTensorInfo, isSupported);
132 return isSupported ? kTfLiteOk : kTfLiteError;
133 }
134
135 // Add a DepthToSpace layer
Mike Kelly07169c82023-08-02 13:23:09 +0100136 auto layerName = GetLayerName(armnn::LayerType::DepthToSpace, nodeIndex);
137 armnn::IConnectableLayer* layer = delegateData.m_Network->AddDepthToSpaceLayer(descriptor, layerName.c_str());
Cathal Corbett53837672022-09-01 11:34:37 +0100138 layer->SetBackendId(setBackend);
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000139 ARMNN_ASSERT(layer != nullptr);
140
141 armnn::IOutputSlot& outputSlot = layer->GetOutputSlot(0);
142 outputSlot.SetTensorInfo(outputTensorInfo);
143
Ryan OShea4c231de2023-01-17 15:19:20 +0000144 // try to connect the Constant Inputs if there are any
Mike Kelly07169c82023-08-02 13:23:09 +0100145 if (ProcessInputs(layer, delegateData, tfLiteContext, tfLiteNode, nodeIndex) != kTfLiteOk)
Ryan OShea4c231de2023-01-17 15:19:20 +0000146 {
147 return kTfLiteError;
148 }
149
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000150 // Connect
151 return Connect(layer, tfLiteNode, delegateData);
Sadik Armagan62483be2020-10-23 17:14:43 +0100152}
153
154} // namespace armnnDelegate