blob: c7daeb2bacac3e95c13d23e262da7c880b1abe34 [file] [log] [blame]
Eric Kunze2364dcd2021-04-26 11:06:57 -07001
2// Copyright (c) 2020-2021, ARM Limited.
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16#ifndef _TOSA_SERIALIZATION_QUANT_INFO_H
17#define _TOSA_SERIALIZATION_QUANT_INFO_H
18#include "flatbuffers/idl.h"
19#include "flatbuffers/util.h"
20#include "tosa_generated.h"
21
22namespace tosa
23{
24
25class TosaQuantInfoBase
26{
27public:
28 virtual ~TosaQuantInfoBase()
29 {}
30};
31
32class TosaNoneQuantInfo : public TosaQuantInfoBase
33{
34public:
35 TosaNoneQuantInfo()
36 {}
37 TosaNoneQuantInfo(TosaNoneQuantInfo* p)
38 {}
39};
40
41#define DEF_ARGS_VER0_S(T, V) _##V = p->V();
42#define DEF_ARGS_VER0_V(T, V) _##V = std::vector<T>(p->V()->begin(), p->V()->end());
43#define DEF_ARGS_VER1_S(T, V) const T& V
44#define DEF_ARGS_VER1_V(T, V) const std::vector<T>& V
45#define DEF_ARGS_VER2_S(T, V) _##V = V;
46#define DEF_ARGS_VER2_V(T, V) _##V = V;
47#define DEF_ARGS_VER3_S(T, V) \
48 T V() const \
49 { \
50 return _##V; \
51 }
52#define DEF_ARGS_VER3_V(T, V) \
53 std::vector<T> V() const \
54 { \
55 return _##V; \
56 }
57#define DEF_ARGS_VER4_S(T, V) T _##V;
58#define DEF_ARGS_VER4_V(T, V) std::vector<T> _##V;
59
60// another level of preprocessor indirection to handle ", " as function's input argument
61#define DEF_ARGS_VER1_TRUE(T, F, V) DEF_ARGS_VER1_##F(T, V)
62#define DEF_ARGS_VER1_FALSE(T, F, V) , DEF_ARGS_VER1_##F(T, V)
63
64#define DEF_ARGS_VER0(FIRST, T, F, V) DEF_ARGS_VER0_##F(T, V)
65#define DEF_ARGS_VER1(FIRST, T, F, V) DEF_ARGS_VER1_##FIRST(T, F, V)
66#define DEF_ARGS_VER2(FIRST, T, F, V) DEF_ARGS_VER2_##F(T, V)
67#define DEF_ARGS_VER3(FIRST, T, F, V) DEF_ARGS_VER3_##F(T, V)
68#define DEF_ARGS_VER4(FIRST, T, F, V) DEF_ARGS_VER4_##F(T, V)
69
70#define DEF_ARGS_1(VER, T0, F0, V0) DEF_ARGS_##VER(TRUE, T0, F0, V0)
71#define DEF_ARGS_2(VER, T0, F0, V0, T1, F1, V1) DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1)
72#define DEF_ARGS_3(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2) \
73 DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2)
74#define DEF_ARGS_4(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2, T3, F3, V3) \
75 DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2) \
76 DEF_ARGS_##VER(FALSE, T3, F3, V3)
77#define DEF_ARGS_5(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2, T3, F3, V3, T4, F4, V4) \
78 DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2) \
79 DEF_ARGS_##VER(FALSE, T3, F3, V3) DEF_ARGS_##VER(FALSE, T4, F4, V4)
80#define DEF_ARGS_6(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2, T3, F3, V3, T4, F4, V4, T5, F5, V5) \
81 DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2) \
82 DEF_ARGS_##VER(FALSE, T3, F3, V3) DEF_ARGS_##VER(FALSE, T4, F4, V4) DEF_ARGS_##VER(FALSE, T5, F5, V5)
83#define DEF_ARGS_7(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2, T3, F3, V3, T4, F4, V4, T5, F5, V5, T6, F6, V6) \
84 DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2) \
85 DEF_ARGS_##VER(FALSE, T3, F3, V3) DEF_ARGS_##VER(FALSE, T4, F4, V4) DEF_ARGS_##VER(FALSE, T5, F5, V5) \
86 DEF_ARGS_##VER(FALSE, T6, F6, V6)
87#define DEF_ARGS_8(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2, T3, F3, V3, T4, F4, V4, T5, F5, V5, T6, F6, V6, T7, F7, \
88 V7) \
89 DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2) \
90 DEF_ARGS_##VER(FALSE, T3, F3, V3) DEF_ARGS_##VER(FALSE, T4, F4, V4) DEF_ARGS_##VER(FALSE, T5, F5, V5) \
91 DEF_ARGS_##VER(FALSE, T6, F6, V6) DEF_ARGS_##VER(FALSE, T7, F7, V7)
92#define DEF_ARGS_9(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2, T3, F3, V3, T4, F4, V4, T5, F5, V5, T6, F6, V6, T7, F7, \
93 V7, T8, F8, V8) \
94 DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2) \
95 DEF_ARGS_##VER(FALSE, T3, F3, V3) DEF_ARGS_##VER(FALSE, T4, F4, V4) DEF_ARGS_##VER(FALSE, T5, F5, V5) \
96 DEF_ARGS_##VER(FALSE, T6, F6, V6) DEF_ARGS_##VER(FALSE, T7, F7, V7) DEF_ARGS_##VER(FALSE, T8, F8, V8)
97#define DEF_ARGS_10(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2, T3, F3, V3, T4, F4, V4, T5, F5, V5, T6, F6, V6, T7, F7, \
98 V7, T8, F8, V8, T9, F9, V9) \
99 DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2) \
100 DEF_ARGS_##VER(FALSE, T3, F3, V3) DEF_ARGS_##VER(FALSE, T4, F4, V4) DEF_ARGS_##VER(FALSE, T5, F5, V5) \
101 DEF_ARGS_##VER(FALSE, T6, F6, V6) DEF_ARGS_##VER(FALSE, T7, F7, V7) DEF_ARGS_##VER(FALSE, T8, F8, V8) \
102 DEF_ARGS_##VER(FALSE, T9, F9, V9)
103
104#define DEF_QUANTIZATION_INFO(NAME, NUM_ARGS, ...) \
105 class Tosa##NAME##QuantInfo : public TosaQuantInfoBase \
106 { \
107 public: \
108 Tosa##NAME##QuantInfo(const TosaQuantInfoBase* qinfo) \
109 { \
Kevin Cheng55b363b2021-11-06 01:24:24 +0000110 const Tosa##NAME##QuantInfo* p = static_cast<const Tosa##NAME##QuantInfo*>(qinfo); \
111 *this = *p; \
Eric Kunze2364dcd2021-04-26 11:06:57 -0700112 } \
113 Tosa##NAME##QuantInfo(const Tosa##NAME##QuantInfo* p) \
114 { \
115 *this = *p; \
116 } \
117 Tosa##NAME##QuantInfo(const void* qinfo) \
118 { \
119 const NAME##QuantInfo* p = static_cast<const NAME##QuantInfo*>(qinfo); \
120 DEF_ARGS_##NUM_ARGS(VER0, __VA_ARGS__) \
121 } \
122 Tosa##NAME##QuantInfo(DEF_ARGS_##NUM_ARGS(VER1, __VA_ARGS__)) \
123 { \
124 DEF_ARGS_##NUM_ARGS(VER2, __VA_ARGS__) \
125 } \
126 virtual ~Tosa##NAME##QuantInfo() \
127 {} \
128 DEF_ARGS_##NUM_ARGS(VER3, __VA_ARGS__) private : DEF_ARGS_##NUM_ARGS(VER4, __VA_ARGS__) \
129 };
130
131#include "quant_info.def"
132#undef DEF_QUANTIZATION_INFO
133#undef DEF_ARGS_1
134#undef DEF_ARGS_2
135#undef DEF_ARGS_3
136#undef DEF_ARGS_4
137#undef DEF_ARGS_5
138#undef DEF_ARGS_6
139#undef DEF_ARGS_7
140#undef DEF_ARGS_8
141#undef DEF_ARGS_9
142#undef DEF_ARGS_10
143#undef DEF_ARGS_VER0
144#undef DEF_ARGS_VER1
145#undef DEF_ARGS_VER2
146#undef DEF_ARGS_VER3
147#undef DEF_ARGS_VER4
148#undef DEF_ARGS_VER1_TRUE
149#undef DEF_ARGS_VER1_FALSE
150#undef DEF_ARGS_VER0_S
151#undef DEF_ARGS_VER0_V
152#undef DEF_ARGS_VER1_S
153#undef DEF_ARGS_VER1_V
154#undef DEF_ARGS_VER2_S
155#undef DEF_ARGS_VER2_V
156#undef DEF_ARGS_VER3_S
157#undef DEF_ARGS_VER3_V
158#undef DEF_ARGS_VER4_S
159#undef DEF_ARGS_VER4_V
160
161} // namespace tosa
162
163#endif