blob: 9cfc397550bde0a6a2406d913c64649f4e839db4 [file] [log] [blame]
Sadik Armagan3c24f432020-10-19 17:35:30 +01001//
Mike Kelly5446a4d2023-01-20 15:51:05 +00002// Copyright © 2020-2023 Arm Ltd and Contributors. All rights reserved.
Sadik Armagan3c24f432020-10-19 17:35:30 +01003// SPDX-License-Identifier: MIT
4//
5
Sadik Armagan5d03e312020-11-17 16:43:56 +00006#pragma once
Sadik Armagan3c24f432020-10-19 17:35:30 +01007
8#include "DelegateOptions.hpp"
9
10#include <tensorflow/lite/builtin_ops.h>
11#include <tensorflow/lite/c/builtin_op_data.h>
12#include <tensorflow/lite/c/common.h>
13#include <tensorflow/lite/minimal_logging.h>
Matthew Sloyan81ec9942021-10-12 10:26:30 +010014#include <tensorflow/lite/version.h>
15
16#if TF_MAJOR_VERSION > 2 || (TF_MAJOR_VERSION == 2 && TF_MINOR_VERSION > 3)
17#define ARMNN_POST_TFLITE_2_3
18#endif
19
Cathal Corbett80b4ef02022-05-25 11:21:11 +010020#if TF_MAJOR_VERSION > 2 || (TF_MAJOR_VERSION == 2 && TF_MINOR_VERSION > 4)
21#define ARMNN_POST_TFLITE_2_4
22#endif
23
Matthew Sloyan81ec9942021-10-12 10:26:30 +010024#if TF_MAJOR_VERSION > 2 || (TF_MAJOR_VERSION == 2 && TF_MINOR_VERSION > 5)
25#define ARMNN_POST_TFLITE_2_5
26#endif
Sadik Armagan3c24f432020-10-19 17:35:30 +010027
28namespace armnnDelegate
29{
30
Sadik Armagan62483be2020-10-23 17:14:43 +010031struct DelegateData
32{
33 DelegateData(const std::vector<armnn::BackendId>& backends)
34 : m_Backends(backends)
35 , m_Network(nullptr, nullptr)
36 {}
Sadik Armagan3c24f432020-10-19 17:35:30 +010037
Sadik Armagan62483be2020-10-23 17:14:43 +010038 const std::vector<armnn::BackendId> m_Backends;
39 armnn::INetworkPtr m_Network;
40 std::vector<armnn::IOutputSlot*> m_OutputSlotForNode;
41};
42
43// Forward decleration for functions initializing the ArmNN Delegate
44DelegateOptions TfLiteArmnnDelegateOptionsDefault();
45
46TfLiteDelegate* TfLiteArmnnDelegateCreate(armnnDelegate::DelegateOptions options);
47
48void TfLiteArmnnDelegateDelete(TfLiteDelegate* tfLiteDelegate);
49
50TfLiteStatus DoPrepare(TfLiteContext* context, TfLiteDelegate* delegate);
51
52/// ArmNN Delegate
Sadik Armagan3c24f432020-10-19 17:35:30 +010053class Delegate
54{
55 friend class ArmnnSubgraph;
56public:
57 explicit Delegate(armnnDelegate::DelegateOptions options);
58
Sadik Armagan62483be2020-10-23 17:14:43 +010059 TfLiteIntArray* IdentifyOperatorsToDelegate(TfLiteContext* context);
Sadik Armagan3c24f432020-10-19 17:35:30 +010060
61 TfLiteDelegate* GetDelegate();
62
Matthew Sloyanac001ee2021-02-03 10:43:04 +000063 /// Retrieve version in X.Y.Z form
64 static const std::string GetVersion();
65
Sadik Armagan3c24f432020-10-19 17:35:30 +010066private:
Mike Kelly5446a4d2023-01-20 15:51:05 +000067 /**
68 * Returns a pointer to the armnn::IRuntime* this will be shared by all armnn_delegates.
69 */
70 armnn::IRuntime* GetRuntime(const armnn::IRuntime::CreationOptions& options)
71 {
72 static armnn::IRuntimePtr instance = armnn::IRuntime::Create(options);
73 // Instantiated on first use.
74 return instance.get();
75 }
76
Sadik Armagan3c24f432020-10-19 17:35:30 +010077 TfLiteDelegate m_Delegate = {
78 reinterpret_cast<void*>(this), // .data_
Sadik Armagan62483be2020-10-23 17:14:43 +010079 DoPrepare, // .Prepare
Sadik Armagan3c24f432020-10-19 17:35:30 +010080 nullptr, // .CopyFromBufferHandle
81 nullptr, // .CopyToBufferHandle
82 nullptr, // .FreeBufferHandle
83 kTfLiteDelegateFlagsNone, // .flags
Ryan OShea238ecd92023-03-07 11:44:23 +000084 nullptr, // .opaque_delegate_builder
Sadik Armagan3c24f432020-10-19 17:35:30 +010085 };
86
Sadik Armagan62483be2020-10-23 17:14:43 +010087 /// ArmNN Runtime pointer
Mike Kelly5446a4d2023-01-20 15:51:05 +000088 armnn::IRuntime* m_Runtime;
Sadik Armagan62483be2020-10-23 17:14:43 +010089 /// ArmNN Delegate Options
Sadik Armagan3c24f432020-10-19 17:35:30 +010090 armnnDelegate::DelegateOptions m_Options;
91};
92
93/// ArmnnSubgraph class where parsing the nodes to ArmNN format and creating the ArmNN Graph
94class ArmnnSubgraph
95{
96public:
97 static ArmnnSubgraph* Create(TfLiteContext* tfLiteContext,
98 const TfLiteDelegateParams* parameters,
99 const Delegate* delegate);
100
101 TfLiteStatus Prepare(TfLiteContext* tfLiteContext);
102
Sadik Armagan62483be2020-10-23 17:14:43 +0100103 TfLiteStatus Invoke(TfLiteContext* tfLiteContext, TfLiteNode* tfLiteNode);
Sadik Armagan3c24f432020-10-19 17:35:30 +0100104
Sadik Armagan62483be2020-10-23 17:14:43 +0100105 static TfLiteStatus VisitNode(DelegateData& delegateData,
Sadik Armagan3c24f432020-10-19 17:35:30 +0100106 TfLiteContext* tfLiteContext,
107 TfLiteRegistration* tfLiteRegistration,
108 TfLiteNode* tfLiteNode,
109 int nodeIndex);
110
111private:
Sadik Armagan62483be2020-10-23 17:14:43 +0100112 ArmnnSubgraph(armnn::NetworkId networkId,
113 armnn::IRuntime* runtime,
114 std::vector<armnn::BindingPointInfo>& inputBindings,
115 std::vector<armnn::BindingPointInfo>& outputBindings)
116 : m_NetworkId(networkId), m_Runtime(runtime), m_InputBindings(inputBindings), m_OutputBindings(outputBindings)
Sadik Armagan3c24f432020-10-19 17:35:30 +0100117 {}
118
Sadik Armagan62483be2020-10-23 17:14:43 +0100119 static TfLiteStatus AddInputLayer(DelegateData& delegateData,
120 TfLiteContext* tfLiteContext,
121 const TfLiteIntArray* inputs,
122 std::vector<armnn::BindingPointInfo>& inputBindings);
123
124 static TfLiteStatus AddOutputLayer(DelegateData& delegateData,
125 TfLiteContext* tfLiteContext,
126 const TfLiteIntArray* outputs,
127 std::vector<armnn::BindingPointInfo>& outputBindings);
128
129
Sadik Armagan3c24f432020-10-19 17:35:30 +0100130 /// The Network Id
131 armnn::NetworkId m_NetworkId;
132 /// ArmNN Rumtime
133 armnn::IRuntime* m_Runtime;
Sadik Armagan62483be2020-10-23 17:14:43 +0100134
135 // Binding information for inputs and outputs
136 std::vector<armnn::BindingPointInfo> m_InputBindings;
137 std::vector<armnn::BindingPointInfo> m_OutputBindings;
138
Sadik Armagan3c24f432020-10-19 17:35:30 +0100139};
140
Sadik Armagan3c24f432020-10-19 17:35:30 +0100141} // armnnDelegate namespace
142
Sadik Armagan3c24f432020-10-19 17:35:30 +0100143