1 // 2 // Copyright © 2023 Arm Ltd and Contributors. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 6 #define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN 7 #include <doctest/doctest.h> 8 9 #include <classic/include/armnn_delegate.hpp> 10 11 #include <tensorflow/lite/kernels/builtin_op_kernels.h> 12 #include <tensorflow/lite/interpreter.h> 13 #include <tensorflow/lite/kernels/register.h> 14 15 namespace armnnDelegate 16 { 17 18 TEST_SUITE("ArmnnDelegate") 19 { 20 21 TEST_CASE ("ArmnnDelegate Registered") 22 { 23 using namespace tflite; 24 auto tfLiteInterpreter = std::make_unique<Interpreter>(); 25 26 tfLiteInterpreter->AddTensors(3); 27 tfLiteInterpreter->SetInputs({0, 1}); 28 tfLiteInterpreter->SetOutputs({2}); 29 30 tfLiteInterpreter->SetTensorParametersReadWrite(0, kTfLiteFloat32, "input1", {1,2,2,1}, TfLiteQuantization()); 31 tfLiteInterpreter->SetTensorParametersReadWrite(1, kTfLiteFloat32, "input2", {1,2,2,1}, TfLiteQuantization()); 32 tfLiteInterpreter->SetTensorParametersReadWrite(2, kTfLiteFloat32, "output", {1,2,2,1}, TfLiteQuantization()); 33 34 tflite::ops::builtin::BuiltinOpResolver opResolver; 35 const TfLiteRegistration* opRegister = opResolver.FindOp(BuiltinOperator_ADD, 1); 36 tfLiteInterpreter->AddNodeWithParameters({0, 1}, {2}, "", 0, nullptr, opRegister); 37 38 // Create the Armnn Delegate 39 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef }; 40 std::vector<armnn::BackendOptions> backendOptions; 41 backendOptions.emplace_back( 42 armnn::BackendOptions{ "BackendName", 43 { 44 { "Option1", 42 }, 45 { "Option2", true } 46 }} 47 ); 48 49 armnnDelegate::DelegateOptions delegateOptions(backends, backendOptions); 50 std::unique_ptr<TfLiteDelegate, decltype(&armnnDelegate::TfLiteArmnnDelegateDelete)> 51 theArmnnDelegate(armnnDelegate::TfLiteArmnnDelegateCreate(delegateOptions), 52 armnnDelegate::TfLiteArmnnDelegateDelete); 53 54 auto status = tfLiteInterpreter->ModifyGraphWithDelegate(std::move(theArmnnDelegate)); 55 CHECK(status == kTfLiteOk); 56 CHECK(tfLiteInterpreter != nullptr); 57 } 58 59 TEST_CASE ("ArmnnDelegateOptimizerOptionsRegistered") 60 { 61 using namespace tflite; 62 auto tfLiteInterpreter = std::make_unique<Interpreter>(); 63 64 tfLiteInterpreter->AddTensors(3); 65 tfLiteInterpreter->SetInputs({0, 1}); 66 tfLiteInterpreter->SetOutputs({2}); 67 68 tfLiteInterpreter->SetTensorParametersReadWrite(0, kTfLiteFloat32, "input1", {1,2,2,1}, TfLiteQuantization()); 69 tfLiteInterpreter->SetTensorParametersReadWrite(1, kTfLiteFloat32, "input2", {1,2,2,1}, TfLiteQuantization()); 70 tfLiteInterpreter->SetTensorParametersReadWrite(2, kTfLiteFloat32, "output", {1,2,2,1}, TfLiteQuantization()); 71 72 tflite::ops::builtin::BuiltinOpResolver opResolver; 73 const TfLiteRegistration* opRegister = opResolver.FindOp(BuiltinOperator_ADD, 1); 74 tfLiteInterpreter->AddNodeWithParameters({0, 1}, {2}, "", 0, nullptr, opRegister); 75 76 // Create the Armnn Delegate 77 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef }; 78 79 armnn::OptimizerOptionsOpaque optimizerOptions(true, true, false, true); 80 81 armnnDelegate::DelegateOptions delegateOptions(backends, optimizerOptions); 82 std::unique_ptr<TfLiteDelegate, decltype(&armnnDelegate::TfLiteArmnnDelegateDelete)> 83 theArmnnDelegate(armnnDelegate::TfLiteArmnnDelegateCreate(delegateOptions), 84 armnnDelegate::TfLiteArmnnDelegateDelete); 85 86 auto status = tfLiteInterpreter->ModifyGraphWithDelegate(std::move(theArmnnDelegate)); 87 CHECK(status == kTfLiteOk); 88 CHECK(tfLiteInterpreter != nullptr); 89 } 90 91 TEST_CASE ("DelegateOptions_ClassicDelegateDefault") 92 { 93 // Check default options can be created 94 auto options = TfLiteArmnnDelegateOptionsDefault(); 95 96 // Check Classic delegate created 97 auto classicDelegate = armnnDelegate::TfLiteArmnnDelegateCreate(options); 98 CHECK(classicDelegate); 99 100 // Check Classic Delegate can be deleted 101 CHECK(classicDelegate->data_); 102 armnnDelegate::TfLiteArmnnDelegateDelete(classicDelegate); 103 } 104 105 } 106 107 } // namespace armnnDelegate 108