diff options
author | Sadik Armagan <sadik.armagan@arm.com> | 2021-02-22 18:09:07 +0000 |
---|---|---|
committer | Jim Flynn <jim.flynn@arm.com> | 2021-02-25 11:25:27 +0000 |
commit | 29b49cf1771620233f9c16dfa0214e6d8a64c4d7 (patch) | |
tree | 111ac8261a8ad97e01915d99fce80717facd1b3f /delegate/src/Fill.hpp | |
parent | 4018b21cd41437f1e1b2e528d5521136f39ff2b1 (diff) | |
download | armnn-29b49cf1771620233f9c16dfa0214e6d8a64c4d7.tar.gz |
IVGCVSW-5401 Implement the FILL operator
* Added FILL operator to TfLite ArmNN Delegate
* Added unit tests
Signed-off-by: David Monahan <david.monahan@arm.com>
Signed-off-by: Sadik Armagan <sadik.armagan@arm.com>
Change-Id: I335ef469ff773fa4305eb87f6e93ae9c03fc6997
Diffstat (limited to 'delegate/src/Fill.hpp')
-rw-r--r-- | delegate/src/Fill.hpp | 98 |
1 files changed, 91 insertions, 7 deletions
diff --git a/delegate/src/Fill.hpp b/delegate/src/Fill.hpp index 99c3c625c2..c9fd159b3e 100644 --- a/delegate/src/Fill.hpp +++ b/delegate/src/Fill.hpp @@ -19,15 +19,99 @@ TfLiteStatus VisitFillOperator(DelegateData& delegateData, TfLiteContext* tfLiteContext, TfLiteNode* tfLiteNode, int nodeIndex, - int32_t operatorCode) + int32_t tfLiteFillOperatorCode) { - armnn::IgnoreUnused(delegateData, - tfLiteContext, - tfLiteNode, - nodeIndex, - operatorCode); + TF_LITE_ENSURE_STATUS(ValidateNumOutputs(tfLiteContext, tfLiteNode, 1, nodeIndex)); - return kTfLiteError; + switch(tfLiteFillOperatorCode) + { + case kTfLiteBuiltinFill: + TF_LITE_ENSURE_STATUS(ValidateNumInputs(tfLiteContext, tfLiteNode, 2, nodeIndex)); + break; + default: + return kTfLiteError; + } + + const TfLiteTensor* tfLiteTensors = tfLiteContext->tensors; + const TfLiteTensor& tfLiteInputTensor = tfLiteTensors[tfLiteNode->inputs->data[0]]; + if (!IsValid(tfLiteContext, tfLiteInputTensor, tfLiteFillOperatorCode, nodeIndex)) + { + return kTfLiteError; + } + + const TfLiteTensor& tfLiteFillTensor = tfLiteTensors[tfLiteNode->inputs->data[1]]; + if (!IsValid(tfLiteContext, tfLiteFillTensor, tfLiteFillOperatorCode, nodeIndex)) + { + return kTfLiteError; + } + + const TfLiteTensor& tfLiteOutputTensor = tfLiteTensors[tfLiteNode->outputs->data[0]]; + if (!IsValid(tfLiteContext, tfLiteOutputTensor, tfLiteFillOperatorCode, nodeIndex)) + { + return kTfLiteError; + } + + armnn::TensorInfo inputTensorInfo = GetTensorInfoForTfLiteTensor(tfLiteInputTensor); + const armnn::TensorInfo& fillTensorInfo = GetTensorInfoForTfLiteTensor(tfLiteFillTensor); + const armnn::TensorInfo& outputTensorInfo = GetTensorInfoForTfLiteTensor(tfLiteOutputTensor); + + armnn::FillDescriptor descriptor; + switch (tfLiteFillTensor.type) + { + case kTfLiteFloat32: + descriptor.m_Value = tflite::GetTensorData<float>(&tfLiteFillTensor)[0]; + break; + case kTfLiteInt32: + descriptor.m_Value = tflite::GetTensorData<int32_t>(&tfLiteFillTensor)[0]; + break; + default: + TF_LITE_MAYBE_KERNEL_LOG( + tfLiteContext, + "TfLiteArmnnDelegate: FILL value data type is not supported in operator #%d node #%d: ", + tfLiteFillOperatorCode, nodeIndex); + return kTfLiteError; + } + + bool isSupported = false; + auto validateFunc = [&](const armnn::TensorInfo& outInfo, bool& isSupported) + { + FORWARD_LAYER_SUPPORT_FUNC(__func__, + tfLiteContext, + IsFillSupported, + delegateData.m_Backends, + isSupported, + inputTensorInfo, + outInfo, + descriptor); + }; + + if (!delegateData.m_Network) + { + validateFunc(outputTensorInfo, isSupported); + return isSupported ? kTfLiteOk : kTfLiteError; + } + + armnn::IConnectableLayer* layer = delegateData.m_Network->AddFillLayer(descriptor); + ARMNN_ASSERT(layer != nullptr); + + armnn::IOutputSlot& outputSlot = layer->GetOutputSlot(0); + outputSlot.SetTensorInfo(outputTensorInfo); + + if(tflite::IsConstantTensor(&tfLiteInputTensor)) + { + auto status = ConnectConstant(layer, + inputTensorInfo, + tfLiteContext, + tfLiteInputTensor, + delegateData, + tfLiteNode->inputs->data[0]); + if (status == kTfLiteError) + { + return status; + } + } + + return Connect(layer, tfLiteNode, delegateData); } } // namespace armnnDelegate |