blob: aa650e90aaab88cbfade891bf121726ad6787801 [file] [log] [blame]
arovir01b0717b52018-09-05 17:03:25 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "HalPolicy.hpp"
7
Aron Virginas-Tar573a8fa2019-07-23 14:01:37 +01008#include "Utils.hpp"
Aron Virginas-Tar366e0a62019-07-10 13:01:41 +01009
arovir01b0717b52018-09-05 17:03:25 +010010#include "../1.0/HalPolicy.hpp"
11
Éanna Ó Catháin2fc21f72019-05-13 11:01:33 +010012namespace
13{
14static 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::DEPTHWISE_CONV_2D,
David Monahand5bfae12019-05-30 12:07:44 +010020 V1_0::OperationType::DEQUANTIZE,
Éanna Ó Catháin2fc21f72019-05-13 11:01:33 +010021 V1_0::OperationType::FLOOR,
22 V1_0::OperationType::FULLY_CONNECTED,
23 V1_0::OperationType::LOCAL_RESPONSE_NORMALIZATION,
24 V1_0::OperationType::LOGISTIC,
25 V1_0::OperationType::LSTM,
26 V1_0::OperationType::L2_NORMALIZATION,
27 V1_0::OperationType::L2_POOL_2D,
28 V1_0::OperationType::MAX_POOL_2D,
29 V1_0::OperationType::MUL,
30 V1_0::OperationType::RELU,
31 V1_0::OperationType::RELU1,
32 V1_0::OperationType::RELU6,
33 V1_0::OperationType::SOFTMAX,
Keith Davisa6bc52f2019-06-26 09:39:49 +010034 V1_0::OperationType::SPACE_TO_DEPTH,
Éanna Ó Catháin2fc21f72019-05-13 11:01:33 +010035 V1_0::OperationType::TANH,
36 V1_0::OperationType::RESHAPE,
37 V1_0::OperationType::RESIZE_BILINEAR,
38});
39
40bool CompliantWithVersion10(const V1_1::Operation & operation)
41{
42 std::vector<V1_0::OperationType>::iterator it;
43 it = std::find(opsEquivalentInV10.begin(), opsEquivalentInV10.end(),
44 static_cast<V1_0::OperationType>(operation.type));
45
46 if(it != opsEquivalentInV10.end())
47 {
48 return true;
49 }
50 return false;
51}
52
53V1_0::Operation ConvertOperationToVersion10(const V1_1::Operation & operation)
54{
55 V1_0::Operation v10Operation;
56 v10Operation.type = static_cast<V1_0::OperationType>(operation.type);
57 v10Operation.inputs = operation.inputs;
58 v10Operation.outputs = operation.outputs;
59 return v10Operation;
60}
61}
62
arovir01b0717b52018-09-05 17:03:25 +010063namespace armnn_driver
64{
65namespace hal_1_1
66{
67
68bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, ConversionData& data)
69{
Éanna Ó Catháin2fc21f72019-05-13 11:01:33 +010070 if (CompliantWithVersion10(operation))
arovir01b0717b52018-09-05 17:03:25 +010071 {
Éanna Ó Catháin2fc21f72019-05-13 11:01:33 +010072 hal_1_0::HalPolicy::Operation v10Operation = ConvertOperationToVersion10(operation);
arovir01b0717b52018-09-05 17:03:25 +010073 hal_1_0::HalPolicy::Model v10Model = convertToV1_0(model);
74
75 return hal_1_0::HalPolicy::ConvertOperation(v10Operation, v10Model, data);
76 }
77 else
78 {
79 switch (operation.type)
80 {
81 case V1_1::OperationType::DIV:
82 return ConvertDiv(operation, model, data);
David Beck38e12942018-09-12 16:02:24 +010083 case V1_1::OperationType::SUB:
84 return ConvertSub(operation, model, data);
narpra013c052562018-09-17 14:25:04 +010085 case V1_1::OperationType::MEAN:
86 return ConvertMean(operation, model, data);
Nina Drozd62a4a9f2018-10-01 14:20:25 +010087 case V1_1::OperationType::PAD:
Aron Virginas-Tarc921f6b2019-07-25 10:14:33 +010088 return ConvertPad(operation, model, data);
Nattapat Chaimanowong81a68342018-11-05 14:04:47 +000089 case V1_1::OperationType::SPACE_TO_BATCH_ND:
90 return ConvertSpaceToBatchNd(operation, model, data);
saoste01b8471482018-10-10 09:44:51 +010091 case V1_1::OperationType::SQUEEZE:
92 return ConvertSqueeze(operation, model, data);
Sadik Armagan758eee82018-11-15 15:34:49 +000093 case V1_1::OperationType::STRIDED_SLICE:
94 return ConvertStridedSlice(operation, model, data);
saoste01fe463152018-10-18 17:49:56 +010095 case V1_1::OperationType::TRANSPOSE:
96 return ConvertTranspose(operation, model, data);
Éanna Ó Catháin2cd99b92018-11-14 14:33:52 +000097 case V1_1::OperationType::BATCH_TO_SPACE_ND:
98 return ConvertBatchToSpaceNd(operation, model, data);
arovir01b0717b52018-09-05 17:03:25 +010099 default:
100 return Fail("%s: Operation type %s not supported in ArmnnDriver",
101 __func__, toString(operation.type).c_str());
102 }
103 }
104}
105
106bool HalPolicy::ConvertDiv(const Operation& operation, const Model& model, ConversionData& data)
107{
Aron Virginas-Tar29404fb2019-07-24 13:55:31 +0100108 ALOGV("hal_1_1::HalPolicy::ConvertDiv()");
Mike Kelly46272802019-08-14 17:00:48 +0100109 return ::ConvertDiv<hal_1_1::HalPolicy>(operation, model, data);
arovir01b0717b52018-09-05 17:03:25 +0100110}
111
David Beck38e12942018-09-12 16:02:24 +0100112bool HalPolicy::ConvertSub(const Operation& operation, const Model& model, ConversionData& data)
113{
Aron Virginas-Tar29404fb2019-07-24 13:55:31 +0100114 ALOGV("hal_1_1::HalPolicy::ConvertSub()");
Mike Kelly0a879362019-07-29 16:56:31 +0100115 return ::ConvertSub<hal_1_1::HalPolicy>(operation, model, data);
David Beck38e12942018-09-12 16:02:24 +0100116}
117
narpra013c052562018-09-17 14:25:04 +0100118bool HalPolicy::ConvertMean(const Operation& operation, const Model& model, ConversionData& data)
119{
Aron Virginas-Tar29404fb2019-07-24 13:55:31 +0100120 ALOGV("hal_1_1::HalPolicy::ConvertMean()");
Mike Kelly46272802019-08-14 17:00:48 +0100121 return ::ConvertMean<hal_1_1::HalPolicy>(operation, model, data);
narpra013c052562018-09-17 14:25:04 +0100122}
123
Aron Virginas-Tarc921f6b2019-07-25 10:14:33 +0100124bool HalPolicy::ConvertPad(const Operation& operation, const Model& model, ConversionData& data)
125{
126 ALOGV("hal_1_1::HalPolicy::ConvertPad()");
127 return ::ConvertPad<hal_1_1::HalPolicy>(operation, model, data);
128}
129
Nattapat Chaimanowong81a68342018-11-05 14:04:47 +0000130bool HalPolicy::ConvertSpaceToBatchNd(const Operation& operation, const Model& model, ConversionData& data)
131{
Aron Virginas-Tar29404fb2019-07-24 13:55:31 +0100132 ALOGV("hal_1_1::HalPolicy::ConvertSpaceToBatchNd()");
Finn Williamsd74c5052019-07-30 17:06:00 +0100133 return ::ConvertSpaceToBatchNd<hal_1_1::HalPolicy>(operation, model, data);
Nattapat Chaimanowong81a68342018-11-05 14:04:47 +0000134}
135
saoste01b8471482018-10-10 09:44:51 +0100136bool HalPolicy::ConvertSqueeze(const Operation& operation, const Model& model, ConversionData& data)
137{
Aron Virginas-Tar29404fb2019-07-24 13:55:31 +0100138 ALOGV("hal_1_1::HalPolicy::ConvertSqueeze()");
Mike Kelly46272802019-08-14 17:00:48 +0100139 return ::ConvertSqueeze<hal_1_1::HalPolicy>(operation, model, data);
saoste01fe463152018-10-18 17:49:56 +0100140}
141
Sadik Armagan758eee82018-11-15 15:34:49 +0000142bool HalPolicy::ConvertStridedSlice(const Operation& operation, const Model& model, ConversionData& data)
143{
Aron Virginas-Tar29404fb2019-07-24 13:55:31 +0100144 ALOGV("hal_1_1::HalPolicy::ConvertStridedSlice()");
Mike Kelly46272802019-08-14 17:00:48 +0100145 return ::ConvertStridedSlice<hal_1_1::HalPolicy>(operation, model, data);
Sadik Armagan758eee82018-11-15 15:34:49 +0000146}
147
saoste01fe463152018-10-18 17:49:56 +0100148bool HalPolicy::ConvertTranspose(const Operation& operation, const Model& model, ConversionData& data)
149{
Aron Virginas-Tar29404fb2019-07-24 13:55:31 +0100150 ALOGV("hal_1_1::HalPolicy::ConvertTranspose()");
Mike Kelly46272802019-08-14 17:00:48 +0100151 return ::ConvertTranspose<hal_1_1::HalPolicy>(operation, model, data);
saoste01b8471482018-10-10 09:44:51 +0100152}
153
Éanna Ó Catháin2cd99b92018-11-14 14:33:52 +0000154bool HalPolicy::ConvertBatchToSpaceNd(const Operation& operation, const Model& model, ConversionData& data)
155{
Aron Virginas-Tar29404fb2019-07-24 13:55:31 +0100156 ALOGV("hal_1_1::HalPolicy::ConvertBatchToSpaceNd()");
Finn Williams23b87b32019-07-30 11:44:05 +0100157 return ::ConvertBatchToSpaceNd<hal_1_1::HalPolicy>(operation, model, data);
Éanna Ó Catháin2cd99b92018-11-14 14:33:52 +0000158}
159
arovir01b0717b52018-09-05 17:03:25 +0100160} // namespace hal_1_1
Ferran Balaguerd30093c2019-07-09 17:04:47 +0100161} // namespace armnn_driver