blob: 11a1cefa7ed359b60d9c921c2fa8f8bf130fc39b [file] [log] [blame]
Mike Kellyb5fdf382019-06-11 16:35:25 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "HalPolicy.hpp"
7
8#include "../1.0/HalPolicy.hpp"
9#include "../1.1/HalPolicy.hpp"
10
11namespace armnn_driver
12{
13namespace hal_1_2
14{
15
16bool HandledByV1_0(V1_2::OperationType operationType)
17{
18 switch (static_cast<V1_0::OperationType>(operationType))
19 {
20 case V1_0::OperationType::ADD:
21 case V1_0::OperationType::AVERAGE_POOL_2D:
22 case V1_0::OperationType::CONCATENATION:
23 case V1_0::OperationType::DEPTH_TO_SPACE:
24 case V1_0::OperationType::DEQUANTIZE:
25 case V1_0::OperationType::EMBEDDING_LOOKUP:
26 case V1_0::OperationType::FLOOR:
27 case V1_0::OperationType::FULLY_CONNECTED:
28 case V1_0::OperationType::HASHTABLE_LOOKUP:
29 case V1_0::OperationType::L2_NORMALIZATION:
30 case V1_0::OperationType::L2_POOL_2D:
31 case V1_0::OperationType::LOCAL_RESPONSE_NORMALIZATION:
32 case V1_0::OperationType::LOGISTIC:
33 case V1_0::OperationType::LSH_PROJECTION:
34 case V1_0::OperationType::LSTM:
35 case V1_0::OperationType::MAX_POOL_2D:
36 case V1_0::OperationType::MUL:
37 case V1_0::OperationType::RELU:
38 case V1_0::OperationType::RELU1:
39 case V1_0::OperationType::RELU6:
40 case V1_0::OperationType::RESHAPE:
41 case V1_0::OperationType::RESIZE_BILINEAR:
42 case V1_0::OperationType::RNN:
43 case V1_0::OperationType::SOFTMAX:
44 case V1_0::OperationType::SPACE_TO_DEPTH:
45 case V1_0::OperationType::SVDF:
46 case V1_0::OperationType::TANH:
47 case V1_0::OperationType::OEM_OPERATION:
48 return true;
49 default:
50 return false;
51 }
52}
53
54bool HandledByV1_1(V1_2::OperationType operationType)
55{
56 if (HandledByV1_0(operationType))
57 {
58 return true;
59 }
60 switch (static_cast<V1_1::OperationType>(operationType))
61 {
62 case V1_1::OperationType::BATCH_TO_SPACE_ND:
63 case V1_1::OperationType::DIV:
64 case V1_1::OperationType::MEAN:
65 case V1_1::OperationType::PAD:
66 case V1_1::OperationType::SPACE_TO_BATCH_ND:
67 case V1_1::OperationType::SQUEEZE:
68 case V1_1::OperationType::STRIDED_SLICE:
69 case V1_1::OperationType::SUB:
70 case V1_1::OperationType::TRANSPOSE:
71 return true;
72 default:
73 return false;
74 }
75}
76
77bool HandledByV1_0(const V1_2::Operation& operation)
78{
79 return HandledByV1_0(operation.type);
80}
81
82bool HandledByV1_1(const V1_2::Operation& operation)
83{
84 return HandledByV1_1(operation.type);
85}
86
87V1_0::OperationType CastToV1_0(V1_2::OperationType type)
88{
89 return static_cast<V1_0::OperationType>(type);
90}
91
92V1_1::OperationType CastToV1_1(V1_2::OperationType type)
93{
94 return static_cast<V1_1::OperationType>(type);
95}
96
97V1_0::Operation ConvertToV1_0(const V1_2::Operation& operation)
98{
99 V1_0::Operation op;
100 op.type = CastToV1_0(operation.type);
101 op.inputs = operation.inputs;
102 op.outputs = operation.outputs;
103 return op;
104}
105
106V1_1::Operation ConvertToV1_1(const V1_2::Operation& operation)
107{
108 V1_1::Operation op;
109 op.type = CastToV1_1(operation.type);
110 op.inputs = operation.inputs;
111 op.outputs = operation.outputs;
112 return op;
113}
114
115bool HalPolicy::ConvertOperation(const Operation& operation, const Model& model, ConversionData& data)
116{
117 if (HandledByV1_0(operation) && compliantWithV1_0(model))
118 {
119 hal_1_0::HalPolicy::Operation v10Operation = ConvertToV1_0(operation);
120 hal_1_0::HalPolicy::Model v10Model = convertToV1_0(model);
121
122 return hal_1_0::HalPolicy::ConvertOperation(v10Operation, v10Model, data);
123 }
124 else if (HandledByV1_1(operation) && compliantWithV1_1(model))
125 {
126 hal_1_1::HalPolicy::Operation v11Operation = ConvertToV1_1(operation);
127 hal_1_1::HalPolicy::Model v11Model = convertToV1_1(model);
128
129 return hal_1_1::HalPolicy::ConvertOperation(v11Operation, v11Model, data);
130 }
131 switch (operation.type)
132 {
133 case V1_2::OperationType::CONV_2D:
Aron Virginas-Tarcd700e42019-06-14 14:54:52 +0100134 return ConvertConv2d<hal_1_2::HalPolicy>(operation, model, data);
Mike Kellyb5fdf382019-06-11 16:35:25 +0100135 case V1_2::OperationType::DEPTHWISE_CONV_2D:
Aron Virginas-Tarcd700e42019-06-14 14:54:52 +0100136 return ConvertDepthwiseConv2d<hal_1_2::HalPolicy>(operation, model, data);
Mike Kellyb5fdf382019-06-11 16:35:25 +0100137 default:
138 return Fail("%s: Operation type %s not supported in ArmnnDriver",
139 __func__, toString(operation.type).c_str());
140 }
141}
142
143} // namespace hal_1_2
144} // namespace armnn_driver