xref: /aosp_15_r20/external/armnn/src/armnn/LayerSupportCommon.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6 
7 #include <armnn/utility/IgnoreUnused.hpp>
8 #include <armnn/DescriptorsFwd.hpp>
9 #include <armnn/Types.hpp>
10 #include <armnn/Tensor.hpp>
11 #include <armnn/Optional.hpp>
12 
13 namespace armnn
14 {
15 
16 template<typename T, typename V>
SetValueChecked(Optional<T &> optionalRef,V && val)17 void SetValueChecked(Optional<T&> optionalRef, V&& val)
18 {
19     if (optionalRef)
20     {
21         optionalRef.value() = val;
22     }
23 }
24 
25 template<typename Float16Func, typename Float32Func, typename Uint8Func, typename Int32Func, typename BooleanFunc,
26          typename ... Params>
IsSupportedForDataTypeGeneric(Optional<std::string &> reasonIfUnsupported,DataType dataType,Float16Func float16FuncPtr,Float32Func float32FuncPtr,Uint8Func uint8FuncPtr,Int32Func int32FuncPtr,BooleanFunc booleanFuncPtr,Params &&...params)27 bool IsSupportedForDataTypeGeneric(Optional<std::string&> reasonIfUnsupported,
28                                    DataType dataType,
29                                    Float16Func float16FuncPtr,
30                                    Float32Func float32FuncPtr,
31                                    Uint8Func uint8FuncPtr,
32                                    Int32Func int32FuncPtr,
33                                    BooleanFunc booleanFuncPtr,
34                                    Params&&... params)
35 {
36     switch(dataType)
37     {
38         case DataType::Float16:
39             return float16FuncPtr(reasonIfUnsupported, std::forward<Params>(params)...);
40         case DataType::Float32:
41             return float32FuncPtr(reasonIfUnsupported, std::forward<Params>(params)...);
42         case DataType::QAsymmU8:
43             return uint8FuncPtr(reasonIfUnsupported, std::forward<Params>(params)...);
44         case DataType::Signed32:
45             return int32FuncPtr(reasonIfUnsupported, std::forward<Params>(params)...);
46         case DataType::Boolean:
47             return booleanFuncPtr(reasonIfUnsupported, std::forward<Params>(params)...);
48         default:
49             return false;
50     }
51 }
52 
53 template<typename ... Params>
TrueFunc(Optional<std::string &> reasonIfUnsupported,Params &&...params)54 bool TrueFunc(Optional<std::string&> reasonIfUnsupported, Params&&... params)
55 {
56     IgnoreUnused(reasonIfUnsupported);
57     IgnoreUnused(params...);
58     return true;
59 }
60 
61 template<typename ... Params>
FalseFunc(Optional<std::string &> reasonIfUnsupported,Params &&...params)62 bool FalseFunc(Optional<std::string&> reasonIfUnsupported, Params&&... params)
63 {
64     IgnoreUnused(reasonIfUnsupported);
65     IgnoreUnused(params...);
66     return false;
67 }
68 
69 template<typename ... Params>
FalseFuncF16(Optional<std::string &> reasonIfUnsupported,Params &&...params)70 bool FalseFuncF16(Optional<std::string&> reasonIfUnsupported, Params&&... params)
71 {
72     IgnoreUnused(params...);
73     SetValueChecked(reasonIfUnsupported, "Layer is not supported with float16 data type");
74     return false;
75 }
76 
77 template<typename ... Params>
FalseFuncF32(Optional<std::string &> reasonIfUnsupported,Params &&...params)78 bool FalseFuncF32(Optional<std::string&> reasonIfUnsupported, Params&&... params)
79 {
80     IgnoreUnused(params...);
81     SetValueChecked(reasonIfUnsupported, "Layer is not supported with float32 data type");
82     return false;
83 }
84 
85 template<typename ... Params>
FalseFuncU8(Optional<std::string &> reasonIfUnsupported,Params &&...params)86 bool FalseFuncU8(Optional<std::string&> reasonIfUnsupported, Params&&... params)
87 {
88     IgnoreUnused(params...);
89     SetValueChecked(reasonIfUnsupported, "Layer is not supported with 8-bit data type");
90     return false;
91 }
92 
93 template<typename ... Params>
FalseFuncI32(Optional<std::string &> reasonIfUnsupported,Params &&...params)94 bool FalseFuncI32(Optional<std::string&> reasonIfUnsupported, Params&&... params)
95 {
96     IgnoreUnused(params...);
97     SetValueChecked(reasonIfUnsupported, "Layer is not supported with int32 data type");
98     return false;
99 }
100 
101 template<typename ... Params>
FalseInputFuncF32(Optional<std::string &> reasonIfUnsupported,Params &&...params)102 bool FalseInputFuncF32(Optional<std::string&> reasonIfUnsupported, Params&&... params)
103 {
104     IgnoreUnused(params...);
105     SetValueChecked(reasonIfUnsupported, "Layer is not supported with float32 data type input");
106     return false;
107 }
108 
109 template<typename ... Params>
FalseInputFuncF16(Optional<std::string &> reasonIfUnsupported,Params &&...params)110 bool FalseInputFuncF16(Optional<std::string&> reasonIfUnsupported, Params&&... params)
111 {
112     IgnoreUnused(params...);
113     SetValueChecked(reasonIfUnsupported, "Layer is not supported with float16 data type input");
114     return false;
115 }
116 
117 template<typename ... Params>
FalseOutputFuncF32(Optional<std::string &> reasonIfUnsupported,Params &&...params)118 bool FalseOutputFuncF32(Optional<std::string&> reasonIfUnsupported, Params&&... params)
119 {
120     IgnoreUnused(params...);
121     SetValueChecked(reasonIfUnsupported, "Layer is not supported with float32 data type output");
122     return false;
123 }
124 
125 template<typename ... Params>
FalseOutputFuncF16(Optional<std::string &> reasonIfUnsupported,Params &&...params)126 bool FalseOutputFuncF16(Optional<std::string&> reasonIfUnsupported, Params&&... params)
127 {
128     IgnoreUnused(params...);
129     SetValueChecked(reasonIfUnsupported, "Layer is not supported with float16 data type output");
130     return false;
131 }
132 
133 }
134