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