blob: cc7f03413dc9c22f82c68d47b512687fc8fe43ee [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
67 armnn::IConnectableLayer* layer = delegateData.m_Network->AddSpaceToDepthLayer(descriptor);
Cathal Corbett53837672022-09-01 11:34:37 +010068 layer->SetBackendId(setBackend);
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000069 ARMNN_ASSERT(layer != nullptr);
70
Ryan OShea4c231de2023-01-17 15:19:20 +000071 // try to connect the Constant Inputs if there are any
72 if(ProcessInputs(layer,delegateData, tfLiteContext, tfLiteNode) != kTfLiteOk )
73 {
74 return kTfLiteError;
75 }
76
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000077 armnn::IOutputSlot& outputSlot = layer->GetOutputSlot(0);
78 outputSlot.SetTensorInfo(outputTensorInfo);
79
80 // Connect
81 return Connect(layer, tfLiteNode, delegateData);
Sadik Armagan62483be2020-10-23 17:14:43 +010082}
83
84TfLiteStatus VisitDepthToSpaceOperator(DelegateData& delegateData,
85 TfLiteContext* tfLiteContext,
86 TfLiteNode* tfLiteNode,
87 int nodeIndex,
88 int32_t operatorCode)
89{
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000090 TF_LITE_ENSURE_STATUS(ValidateNumInputs(tfLiteContext, tfLiteNode, 1, nodeIndex));
91 TF_LITE_ENSURE_STATUS(ValidateNumOutputs(tfLiteContext, tfLiteNode, 1, nodeIndex));
Finn Williams6f9f9902020-11-13 13:23:15 +000092
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000093 const TfLiteTensor* tfLiteTensors = tfLiteContext->tensors;
94 const TfLiteTensor& tfLiteInputTensor = tfLiteTensors[tfLiteNode->inputs->data[0]];
95 if (!IsValid(tfLiteContext, tfLiteInputTensor, operatorCode, nodeIndex))
96 {
97 return kTfLiteError;
98 }
99
100 const TfLiteTensor& tfLiteOutputTensor = tfLiteTensors[tfLiteNode->outputs->data[0]];
101 if (!IsValid(tfLiteContext, tfLiteOutputTensor, operatorCode, nodeIndex))
102 {
103 return kTfLiteError;
104 }
105
106 const armnn::TensorInfo& inputTensorInfo = GetTensorInfoForTfLiteTensor(tfLiteInputTensor);
Sadik Armagan90a119b2022-08-05 16:12:49 +0100107 const armnn::TensorInfo& outputTensorInfo = GetTensorInfoForTfLiteTensor(tfLiteOutputTensor, true);
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000108
109 armnn::DepthToSpaceDescriptor descriptor;
110 auto* params = reinterpret_cast<TfLiteDepthToSpaceParams*>(tfLiteNode->builtin_data);
111 descriptor.m_BlockSize = params->block_size;
112
113 bool isSupported = false;
Cathal Corbett53837672022-09-01 11:34:37 +0100114 armnn::BackendId setBackend;
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000115 auto validateFunc = [&](const armnn::TensorInfo& outInfo, bool& isSupported)
116 {
Sadik Armaganbfa767c2022-02-09 14:58:03 +0000117 FORWARD_LAYER_SUPPORT_FUNC("DEPTH_TO_SPACE",
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000118 tfLiteContext,
119 IsDepthToSpaceSupported,
120 delegateData.m_Backends,
121 isSupported,
Cathal Corbett53837672022-09-01 11:34:37 +0100122 setBackend,
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000123 inputTensorInfo,
124 outInfo,
125 descriptor);
126 };
127
128 if (!delegateData.m_Network)
129 {
130 validateFunc(outputTensorInfo, isSupported);
131 return isSupported ? kTfLiteOk : kTfLiteError;
132 }
133
134 // Add a DepthToSpace layer
135 armnn::IConnectableLayer* layer = delegateData.m_Network->AddDepthToSpaceLayer(descriptor);
Cathal Corbett53837672022-09-01 11:34:37 +0100136 layer->SetBackendId(setBackend);
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000137 ARMNN_ASSERT(layer != nullptr);
138
139 armnn::IOutputSlot& outputSlot = layer->GetOutputSlot(0);
140 outputSlot.SetTensorInfo(outputTensorInfo);
141
Ryan OShea4c231de2023-01-17 15:19:20 +0000142 // try to connect the Constant Inputs if there are any
143 if(ProcessInputs(layer,delegateData, tfLiteContext, tfLiteNode) != kTfLiteOk )
144 {
145 return kTfLiteError;
146 }
147
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000148 // Connect
149 return Connect(layer, tfLiteNode, delegateData);
Sadik Armagan62483be2020-10-23 17:14:43 +0100150}
151
152} // namespace armnnDelegate