blob: 2172d8678b258d7fe2a11eba30702a689292a96e [file] [log] [blame]
Sadik Armagan62483be2020-10-23 17:14:43 +01001//
Sadik Armagan90a119b2022-08-05 16:12:49 +01002// Copyright © 2022 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
71 armnn::IOutputSlot& outputSlot = layer->GetOutputSlot(0);
72 outputSlot.SetTensorInfo(outputTensorInfo);
73
74 // Connect
75 return Connect(layer, tfLiteNode, delegateData);
Sadik Armagan62483be2020-10-23 17:14:43 +010076}
77
78TfLiteStatus VisitDepthToSpaceOperator(DelegateData& delegateData,
79 TfLiteContext* tfLiteContext,
80 TfLiteNode* tfLiteNode,
81 int nodeIndex,
82 int32_t operatorCode)
83{
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000084 TF_LITE_ENSURE_STATUS(ValidateNumInputs(tfLiteContext, tfLiteNode, 1, nodeIndex));
85 TF_LITE_ENSURE_STATUS(ValidateNumOutputs(tfLiteContext, tfLiteNode, 1, nodeIndex));
Finn Williams6f9f9902020-11-13 13:23:15 +000086
Sadik Armagan89c5a9e2021-01-20 17:48:07 +000087 const TfLiteTensor* tfLiteTensors = tfLiteContext->tensors;
88 const TfLiteTensor& tfLiteInputTensor = tfLiteTensors[tfLiteNode->inputs->data[0]];
89 if (!IsValid(tfLiteContext, tfLiteInputTensor, operatorCode, nodeIndex))
90 {
91 return kTfLiteError;
92 }
93
94 const TfLiteTensor& tfLiteOutputTensor = tfLiteTensors[tfLiteNode->outputs->data[0]];
95 if (!IsValid(tfLiteContext, tfLiteOutputTensor, operatorCode, nodeIndex))
96 {
97 return kTfLiteError;
98 }
99
100 const armnn::TensorInfo& inputTensorInfo = GetTensorInfoForTfLiteTensor(tfLiteInputTensor);
Sadik Armagan90a119b2022-08-05 16:12:49 +0100101 const armnn::TensorInfo& outputTensorInfo = GetTensorInfoForTfLiteTensor(tfLiteOutputTensor, true);
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000102
103 armnn::DepthToSpaceDescriptor descriptor;
104 auto* params = reinterpret_cast<TfLiteDepthToSpaceParams*>(tfLiteNode->builtin_data);
105 descriptor.m_BlockSize = params->block_size;
106
107 bool isSupported = false;
Cathal Corbett53837672022-09-01 11:34:37 +0100108 armnn::BackendId setBackend;
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000109 auto validateFunc = [&](const armnn::TensorInfo& outInfo, bool& isSupported)
110 {
Sadik Armaganbfa767c2022-02-09 14:58:03 +0000111 FORWARD_LAYER_SUPPORT_FUNC("DEPTH_TO_SPACE",
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000112 tfLiteContext,
113 IsDepthToSpaceSupported,
114 delegateData.m_Backends,
115 isSupported,
Cathal Corbett53837672022-09-01 11:34:37 +0100116 setBackend,
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000117 inputTensorInfo,
118 outInfo,
119 descriptor);
120 };
121
122 if (!delegateData.m_Network)
123 {
124 validateFunc(outputTensorInfo, isSupported);
125 return isSupported ? kTfLiteOk : kTfLiteError;
126 }
127
128 // Add a DepthToSpace layer
129 armnn::IConnectableLayer* layer = delegateData.m_Network->AddDepthToSpaceLayer(descriptor);
Cathal Corbett53837672022-09-01 11:34:37 +0100130 layer->SetBackendId(setBackend);
Sadik Armagan89c5a9e2021-01-20 17:48:07 +0000131 ARMNN_ASSERT(layer != nullptr);
132
133 armnn::IOutputSlot& outputSlot = layer->GetOutputSlot(0);
134 outputSlot.SetTensorInfo(outputTensorInfo);
135
136 // Connect
137 return Connect(layer, tfLiteNode, delegateData);
Sadik Armagan62483be2020-10-23 17:14:43 +0100138}
139
140} // namespace armnnDelegate