LDMX Software
ap_fixed.h
1/*
2 * Copyright 2011-2019 Xilinx, Inc.
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
17#ifndef __AP_FIXED_H__
18#define __AP_FIXED_H__
19
20#include <ap_fixed_base.h>
21#include <ap_impl/ap_common.h>
22#include <ap_impl/ap_fixed_ref.h>
23
24//---------------------------------------------------------------
25
27// default for _AP_Q, _AP_O and _AP_N set in ap_decl.h
28template <int _AP_W, int _AP_I, ap_q_mode _AP_Q, ap_o_mode _AP_O, int _AP_N>
29struct ap_fixed : ap_fixed_base<_AP_W, _AP_I, true, _AP_Q, _AP_O, _AP_N> {
31 // Constructor
33 INLINE ap_fixed() : Base() {}
34
36 INLINE ap_fixed(const ap_fixed& op) { Base::V = op.V; }
37
39 template <int _AP_W2, int _AP_I2, bool _AP_S2, ap_q_mode _AP_Q2,
40 ap_o_mode _AP_O2, int _AP_N2>
44
45 template <int _AP_W2, int _AP_I2, bool _AP_S2, ap_q_mode _AP_Q2,
46 ap_o_mode _AP_O2, int _AP_N2>
47 INLINE ap_fixed(const volatile ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, _AP_Q2,
48 _AP_O2, _AP_N2>& op)
49 : Base(op) {}
50
52 // template <int _AP_W2, int _AP_I2, ap_q_mode _AP_Q2, ap_o_mode _AP_O2,
53 // int _AP_N2>
54 // INLINE ap_fixed(
55 // const ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op)
56 // : Base(ap_fixed_base<_AP_W2, _AP_I2, true, _AP_Q2, _AP_O2, _AP_N2>(op))
57 // {}
58
59 // template <int _AP_W2, int _AP_I2, ap_q_mode _AP_Q2, ap_o_mode _AP_O2,
60 // int _AP_N2>
61 // INLINE ap_fixed(
62 // const volatile ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op)
63 // : Base(ap_fixed_base<_AP_W2, _AP_I2, true, _AP_Q2, _AP_O2, _AP_N2>(op))
64 // {}
65
67 // template <int _AP_W2, int _AP_I2, ap_q_mode _AP_Q2, ap_o_mode _AP_O2,
68 // int _AP_N2>
69 // INLINE ap_fixed(
70 // const ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op)
71 // : Base(ap_fixed_base<_AP_W2, _AP_I2, false, _AP_Q2, _AP_O2,
72 // _AP_N2>(op)) {
73 // }
74
75 // template <int _AP_W2, int _AP_I2, ap_q_mode _AP_Q2, ap_o_mode _AP_O2,
76 // int _AP_N2>
77 // INLINE ap_fixed(
78 // const volatile ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op)
79 // : Base(ap_fixed_base<_AP_W2, _AP_I2, false, _AP_Q2, _AP_O2,
80 // _AP_N2>(op)) {
81 // }
82
84 template <int _AP_W2, bool _AP_S2>
85 INLINE ap_fixed(const ap_int_base<_AP_W2, _AP_S2>& op) : Base(op) {}
86
87 template <int _AP_W2, bool _AP_S2>
88 INLINE ap_fixed(const volatile ap_int_base<_AP_W2, _AP_S2>& op) : Base(op) {}
89
91 // template <int _AP_W2>
92 // INLINE ap_fixed(const ap_int<_AP_W2>& op)
93 // : Base(ap_int_base<_AP_W2, true>(op)) {}
94
95 // template <int _AP_W2>
96 // INLINE ap_fixed(const volatile ap_int<_AP_W2>& op)
97 // : Base(ap_int_base<_AP_W2, true>(op)) {}
98
100 // template <int _AP_W2>
101 // INLINE ap_fixed(const ap_uint<_AP_W2>& op)
102 // : Base(ap_int_base<_AP_W2, false>(op)) {}
103
104 // template <int _AP_W2>
105 // INLINE ap_fixed(const volatile ap_uint<_AP_W2>& op)
106 // : Base(ap_int_base<_AP_W2, false>(op)) {}
107
108 // from ap_bit_ref.
109 template <int _AP_W2, bool _AP_S2>
110 INLINE ap_fixed(const ap_bit_ref<_AP_W2, _AP_S2>& op) : Base(op) {}
111
112 // from ap_range_ref.
113 template <int _AP_W2, bool _AP_S2>
114 INLINE ap_fixed(const ap_range_ref<_AP_W2, _AP_S2>& op) : Base(op) {}
115
116 // from ap_concat_ref.
117 template <int _AP_W2, typename _AP_T2, int _AP_W3, typename _AP_T3>
119 : Base(op) {}
120
121 // from af_bit_ref.
122 template <int _AP_W2, int _AP_I2, bool _AP_S2, ap_q_mode _AP_Q2,
123 ap_o_mode _AP_O2, int _AP_N2>
124 INLINE ap_fixed(
126 : Base(op) {}
127
128 // from af_range_ref.
129 template <int _AP_W2, int _AP_I2, bool _AP_S2, ap_q_mode _AP_Q2,
130 ap_o_mode _AP_O2, int _AP_N2>
131 INLINE ap_fixed(
133 : Base(op) {}
134
135// from c types.
136#define CTOR(TYPE) \
137 INLINE ap_fixed(TYPE v) : Base(v) {}
138
139 CTOR(bool)
140 CTOR(char)
141 CTOR(signed char)
142 CTOR(unsigned char)
143 CTOR(short)
144 CTOR(unsigned short)
145 CTOR(int)
146 CTOR(unsigned int)
147 CTOR(long)
148 CTOR(unsigned long)
149 CTOR(ap_slong)
150 CTOR(ap_ulong)
151#if _AP_ENABLE_HALF_ == 1
152 CTOR(half)
153#endif
154 CTOR(float)
155 CTOR(double)
156#undef CTOR
157
158 INLINE ap_fixed(const char* s) : Base(s) {}
159
160 INLINE ap_fixed(const char* s, signed char rd) : Base(s, rd) {}
161
162 // Assignment
163 // The assignment operator is technically inherited; however, it is always
164 // hidden by an explicitly or implicitly defined assignment operator for the
165 // derived class.
166 /* XXX ctor will be used when right is not of proper type. */
167 INLINE ap_fixed& operator=(
169 Base::V = op.V;
170 return *this;
171 }
172
173 INLINE void operator=(
175 Base::V = op.V;
176 }
177
178 INLINE ap_fixed& operator=(
180 Base::V = op.V;
181 return *this;
182 }
183
184 INLINE void operator=(
185 const volatile ap_fixed<_AP_W, _AP_I, _AP_Q, _AP_O, _AP_N>& op) volatile {
186 Base::V = op.V;
187 }
188}; // struct ap_fixed.
189
190//-------------------------------------------------------------------
191
192// Unsigned Arbitrary Precision Fixed-Point Type.
193// default for _AP_Q, _AP_O and _AP_N set in ap_decl.h
194template <int _AP_W, int _AP_I, ap_q_mode _AP_Q, ap_o_mode _AP_O, int _AP_N>
195struct ap_ufixed : ap_fixed_base<_AP_W, _AP_I, false, _AP_Q, _AP_O, _AP_N> {
197 // Constructor
199 INLINE ap_ufixed() : Base() {}
200
202 INLINE ap_ufixed(const ap_ufixed& op) { Base::V = op.V; }
203
205 template <int _AP_W2, int _AP_I2, bool _AP_S2, ap_q_mode _AP_Q2,
206 ap_o_mode _AP_O2, int _AP_N2>
210
212 template <int _AP_W2, int _AP_I2, bool _AP_S2, ap_q_mode _AP_Q2,
213 ap_o_mode _AP_O2, int _AP_N2>
214 INLINE ap_ufixed(const volatile ap_fixed_base<_AP_W2, _AP_I2, _AP_S2, _AP_Q2,
215 _AP_O2, _AP_N2>& op)
216 : Base(op) {}
217
218 // template <int _AP_W2, int _AP_I2, ap_q_mode _AP_Q2, ap_o_mode _AP_O2,
219 // int _AP_N2>
220 // INLINE ap_ufixed(
221 // const ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op)
222 // : Base(ap_fixed_base<_AP_W2, _AP_I2, true, _AP_Q2, _AP_O2, _AP_N2>(op))
223 // {}
224
225 // template <int _AP_W2, int _AP_I2, ap_q_mode _AP_Q2, ap_o_mode _AP_O2,
226 // int _AP_N2>
227 // INLINE ap_ufixed(
228 // const volatile ap_fixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op)
229 // : Base(ap_fixed_base<_AP_W2, _AP_I2, true, _AP_Q2, _AP_O2, _AP_N2>(op))
230 // {}
231
232 // template <int _AP_W2, int _AP_I2, ap_q_mode _AP_Q2, ap_o_mode _AP_O2,
233 // int _AP_N2>
234 // INLINE ap_ufixed(
235 // const ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op)
236 // : Base(ap_fixed_base<_AP_W2, _AP_I2, false, _AP_Q2, _AP_O2,
237 // _AP_N2>(op)) {
238 // }
239
240 // template <int _AP_W2, int _AP_I2, ap_q_mode _AP_Q2, ap_o_mode _AP_O2,
241 // int _AP_N2>
242 // INLINE ap_ufixed(
243 // const volatile ap_ufixed<_AP_W2, _AP_I2, _AP_Q2, _AP_O2, _AP_N2>& op)
244 // : Base(ap_fixed_base<_AP_W2, _AP_I2, false, _AP_Q2, _AP_O2,
245 // _AP_N2>(op)) {
246 // }
247
249 template <int _AP_W2, bool _AP_S2>
250 INLINE ap_ufixed(const ap_int_base<_AP_W2, _AP_S2>& op) : Base(op) {}
251
252 template <int _AP_W2, bool _AP_S2>
253 INLINE ap_ufixed(const volatile ap_int_base<_AP_W2, _AP_S2>& op) : Base(op) {}
254
255 // template <int _AP_W2>
256 // INLINE ap_ufixed(const ap_int<_AP_W2>& op)
257 // : Base(ap_int_base<_AP_W2, true>(op)) {}
258
259 // template <int _AP_W2>
260 // INLINE ap_ufixed(const volatile ap_int<_AP_W2>& op)
261 // : Base(ap_int_base<_AP_W2, true>(op)) {}
262
263 // template <int _AP_W2>
264 // INLINE ap_ufixed(const ap_uint<_AP_W2>& op)
265 // : Base(ap_int_base<_AP_W2, false>(op)) {}
266
267 // template <int _AP_W2>
268 // INLINE ap_ufixed(const volatile ap_uint<_AP_W2>& op)
269 // : Base(ap_int_base<_AP_W2, false>(op)) {}
270
271 template <int _AP_W2, bool _AP_S2>
272 INLINE ap_ufixed(const ap_bit_ref<_AP_W2, _AP_S2>& op) : Base(op) {}
273
274 template <int _AP_W2, bool _AP_S2>
275 INLINE ap_ufixed(const ap_range_ref<_AP_W2, _AP_S2>& op) : Base(op) {}
276
277 template <int _AP_W2, typename _AP_T2, int _AP_W3, typename _AP_T3>
279 : Base(op) {}
280
281 template <int _AP_W2, int _AP_I2, bool _AP_S2, ap_q_mode _AP_Q2,
282 ap_o_mode _AP_O2, int _AP_N2>
283 INLINE ap_ufixed(
285 : Base(op) {}
286
287 template <int _AP_W2, int _AP_I2, bool _AP_S2, ap_q_mode _AP_Q2,
288 ap_o_mode _AP_O2, int _AP_N2>
289 INLINE ap_ufixed(
291 : Base(op) {}
292
293#define CTOR(TYPE) \
294 INLINE ap_ufixed(TYPE v) : Base(v) {}
295
296 CTOR(bool)
297 CTOR(char)
298 CTOR(signed char)
299 CTOR(unsigned char)
300 CTOR(short)
301 CTOR(unsigned short)
302 CTOR(int)
303 CTOR(unsigned int)
304 CTOR(long)
305 CTOR(unsigned long)
306 CTOR(ap_slong)
307 CTOR(ap_ulong)
308#if _AP_ENABLE_HALF_ == 1
309 CTOR(half)
310#endif
311 CTOR(float)
312 CTOR(double)
313#undef CTOR
314
315 INLINE ap_ufixed(const char* s) : Base(s) {}
316
317 INLINE ap_ufixed(const char* s, signed char rd) : Base(s, rd) {}
318
319 // Assignment
320 INLINE ap_ufixed& operator=(
322 Base::V = op.V;
323 return *this;
324 }
325
326 INLINE void operator=(
328 Base::V = op.V;
329 }
330
331 INLINE ap_ufixed& operator=(
333 Base::V = op.V;
334 return *this;
335 }
336
337 INLINE void operator=(const volatile ap_ufixed<_AP_W, _AP_I, _AP_Q, _AP_O,
338 _AP_N>& op) volatile {
339 Base::V = op.V;
340 }
341}; // struct ap_ufixed
342
343#if !defined(__SYNTHESIS__) && (defined(SYSTEMC_H) || defined(SYSTEMC_INCLUDED))
344// XXX sc_trace overload for ap_fixed is already included in
345// "ap_sysc/ap_sc_extras.h", so do not define in synthesis.
346template <int _AP_W, int _AP_I, ap_q_mode _AP_Q, ap_o_mode _AP_O, int _AP_N>
347INLINE void sc_trace(sc_core::sc_trace_file* tf,
349 const std::string& name) {
350 tf->trace(sc_dt::sc_lv<_AP_W>(op.to_string(2).c_str()), name);
351}
352
353template <int _AP_W, int _AP_I, ap_q_mode _AP_Q, ap_o_mode _AP_O, int _AP_N>
354INLINE void sc_trace(sc_core::sc_trace_file* tf,
356 const std::string& name) {
357 tf->trace(sc_dt::sc_lv<_AP_W>(op.to_string(2).c_str()), name);
358}
359#endif // System C sim
360
361// Specialization of std containers, so that std::complex<ap_fixed> can have its
362// image part automatically zero-initialized when only real part is provided.
363#include <ap_impl/ap_fixed_special.h>
364
365#endif // ifndef __AP_FIXED_H__
366
367// -*- cpp -*-
conditions objects which are tables indexed by raw detector id values
Signed Arbitrary Precision Fixed-Point Type.
Definition ap_fixed.h:29
INLINE ap_fixed(const ap_fixed_base< _AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2 > &op)
copy ctor from ap_fixed_base.
Definition ap_fixed.h:41
INLINE ap_fixed()
default ctor
Definition ap_fixed.h:33
INLINE ap_fixed(const ap_fixed &op)
default copy ctor
Definition ap_fixed.h:36
INLINE ap_fixed(const ap_int_base< _AP_W2, _AP_S2 > &op)
copy ctor from ap_int_base.
Definition ap_fixed.h:85
INLINE ap_ufixed(const ap_ufixed &op)
default copy ctor
Definition ap_fixed.h:202
INLINE ap_ufixed(const ap_int_base< _AP_W2, _AP_S2 > &op)
copy ctor from ap_int_base.
Definition ap_fixed.h:250
INLINE ap_ufixed()
default ctor
Definition ap_fixed.h:199
INLINE ap_ufixed(const volatile ap_fixed_base< _AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2 > &op)
copy ctor from ap_fixed_base
Definition ap_fixed.h:214
INLINE ap_ufixed(const ap_fixed_base< _AP_W2, _AP_I2, _AP_S2, _AP_Q2, _AP_O2, _AP_N2 > &op)
copy ctor from ap_fixed_base
Definition ap_fixed.h:207