1 //
2 // Copyright © 2017-2019,2023 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include "HalPolicy.hpp"
7
8 #include "Utils.hpp"
9
10 #include "../1.0/HalPolicy.hpp"
11
12 namespace
13 {
14 static std::vector<V1_0::OperationType> opsEquivalentInV10({
15 V1_0::OperationType::ADD,
16 V1_0::OperationType::AVERAGE_POOL_2D,
17 V1_0::OperationType::CONCATENATION,
18 V1_0::OperationType::CONV_2D,
19 V1_0::OperationType::DEPTH_TO_SPACE,
20 V1_0::OperationType::DEPTHWISE_CONV_2D,
21 V1_0::OperationType::DEQUANTIZE,
22 V1_0::OperationType::FLOOR,
23 V1_0::OperationType::FULLY_CONNECTED,
24 V1_0::OperationType::LOCAL_RESPONSE_NORMALIZATION,
25 V1_0::OperationType::LOGISTIC,
26 V1_0::OperationType::LSTM,
27 V1_0::OperationType::L2_NORMALIZATION,
28 V1_0::OperationType::L2_POOL_2D,
29 V1_0::OperationType::MAX_POOL_2D,
30 V1_0::OperationType::MUL,
31 V1_0::OperationType::RELU,
32 V1_0::OperationType::RELU1,
33 V1_0::OperationType::RELU6,
34 V1_0::OperationType::SOFTMAX,
35 V1_0::OperationType::SPACE_TO_DEPTH,
36 V1_0::OperationType::TANH,
37 V1_0::OperationType::RESHAPE,
38 V1_0::OperationType::RESIZE_BILINEAR,
39 });
40
CompliantWithVersion10(const V1_1::Operation & operation)41 bool CompliantWithVersion10(const V1_1::Operation & operation)
42 {
43 std::vector<V1_0::OperationType>::iterator it;
44 it = std::find(opsEquivalentInV10.begin(), opsEquivalentInV10.end(),
45 static_cast<V1_0::OperationType>(operation.type));
46
47 if(it != opsEquivalentInV10.end())
48 {
49 return true;
50 }
51 return false;
52 }
53
ConvertOperationToVersion10(const V1_1::Operation & operation)54 V1_0::Operation ConvertOperationToVersion10(const V1_1::Operation & operation)
55 {
56 V1_0::Operation v10Operation;
57 v10Operation.type = static_cast<V1_0::OperationType>(operation.type);
58 v10Operation.inputs = operation.inputs;
59 v10Operation.outputs = operation.outputs;
60 return v10Operation;
61 }
62 }
63
64 namespace armnn_driver
65 {
66 namespace hal_1_1
67 {
68
ConvertOperation(const Operation & operation,const Model & model,ConversionData & data)69 bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, ConversionData& data)
70 {
71 if (CompliantWithVersion10(operation))
72 {
73 hal_1_0::HalPolicy::Operation v10Operation = ConvertOperationToVersion10(operation);
74 hal_1_0::HalPolicy::Model v10Model = convertToV1_0(model);
75
76 return hal_1_0::HalPolicy::ConvertOperation(v10Operation, v10Model, data);
77 }
78 else
79 {
80 switch (operation.type)
81 {
82 case V1_1::OperationType::DIV:
83 return ConvertElementwiseBinary(operation, model, data, armnn::BinaryOperation::Div);
84 case V1_1::OperationType::SUB:
85 return ConvertElementwiseBinary(operation, model, data, armnn::BinaryOperation::Sub);
86 case V1_1::OperationType::MEAN:
87 return ConvertMean(operation, model, data);
88 case V1_1::OperationType::PAD:
89 return ConvertPad(operation, model, data);
90 case V1_1::OperationType::SPACE_TO_BATCH_ND:
91 return ConvertSpaceToBatchNd(operation, model, data);
92 case V1_1::OperationType::SQUEEZE:
93 return ConvertSqueeze(operation, model, data);
94 case V1_1::OperationType::STRIDED_SLICE:
95 return ConvertStridedSlice(operation, model, data);
96 case V1_1::OperationType::TRANSPOSE:
97 return ConvertTranspose(operation, model, data);
98 case V1_1::OperationType::BATCH_TO_SPACE_ND:
99 return ConvertBatchToSpaceNd(operation, model, data);
100 default:
101 return Fail("%s: Operation type %s not supported in ArmnnDriver",
102 __func__, toString(operation.type).c_str());
103 }
104 }
105 }
106
ConvertElementwiseBinary(const Operation & operation,const Model & model,ConversionData & data,armnn::BinaryOperation binaryOperation)107 bool HalPolicy::ConvertElementwiseBinary(const Operation& operation,
108 const Model& model,
109 ConversionData& data,
110 armnn::BinaryOperation binaryOperation)
111 {
112 ALOGV("hal_1_1::HalPolicy::ConvertElementwiseBinary()");
113 return ::ConvertElementwiseBinary<hal_1_1::HalPolicy>(operation, model, data, binaryOperation);
114 }
115
ConvertMean(const Operation & operation,const Model & model,ConversionData & data)116 bool HalPolicy::ConvertMean(const Operation& operation, const Model& model, ConversionData& data)
117 {
118 ALOGV("hal_1_1::HalPolicy::ConvertMean()");
119 return ::ConvertMean<hal_1_1::HalPolicy>(operation, model, data);
120 }
121
ConvertPad(const Operation & operation,const Model & model,ConversionData & data)122 bool HalPolicy::ConvertPad(const Operation& operation, const Model& model, ConversionData& data)
123 {
124 ALOGV("hal_1_1::HalPolicy::ConvertPad()");
125 return ::ConvertPad<hal_1_1::HalPolicy>(operation, model, data);
126 }
127
ConvertSpaceToBatchNd(const Operation & operation,const Model & model,ConversionData & data)128 bool HalPolicy::ConvertSpaceToBatchNd(const Operation& operation, const Model& model, ConversionData& data)
129 {
130 ALOGV("hal_1_1::HalPolicy::ConvertSpaceToBatchNd()");
131 return ::ConvertSpaceToBatchNd<hal_1_1::HalPolicy>(operation, model, data);
132 }
133
ConvertSqueeze(const Operation & operation,const Model & model,ConversionData & data)134 bool HalPolicy::ConvertSqueeze(const Operation& operation, const Model& model, ConversionData& data)
135 {
136 ALOGV("hal_1_1::HalPolicy::ConvertSqueeze()");
137 return ::ConvertSqueeze<hal_1_1::HalPolicy>(operation, model, data);
138 }
139
ConvertStridedSlice(const Operation & operation,const Model & model,ConversionData & data)140 bool HalPolicy::ConvertStridedSlice(const Operation& operation, const Model& model, ConversionData& data)
141 {
142 ALOGV("hal_1_1::HalPolicy::ConvertStridedSlice()");
143 return ::ConvertStridedSlice<hal_1_1::HalPolicy>(operation, model, data);
144 }
145
ConvertTranspose(const Operation & operation,const Model & model,ConversionData & data)146 bool HalPolicy::ConvertTranspose(const Operation& operation, const Model& model, ConversionData& data)
147 {
148 ALOGV("hal_1_1::HalPolicy::ConvertTranspose()");
149 return ::ConvertTranspose<hal_1_1::HalPolicy>(operation, model, data);
150 }
151
ConvertBatchToSpaceNd(const Operation & operation,const Model & model,ConversionData & data)152 bool HalPolicy::ConvertBatchToSpaceNd(const Operation& operation, const Model& model, ConversionData& data)
153 {
154 ALOGV("hal_1_1::HalPolicy::ConvertBatchToSpaceNd()");
155 return ::ConvertBatchToSpaceNd<hal_1_1::HalPolicy>(operation, model, data);
156 }
157
158 } // namespace hal_1_1
159 } // namespace armnn_driver
160