gem5 v24.0.0.0
Loading...
Searching...
No Matches
sc_ufix.hh
Go to the documentation of this file.
1/*****************************************************************************
2
3 Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
4 more contributor license agreements. See the NOTICE file distributed
5 with this work for additional information regarding copyright ownership.
6 Accellera licenses this file to you under the Apache License, Version 2.0
7 (the "License"); you may not use this file except in compliance with the
8 License. You may obtain a copy of the License at
9
10 http://www.apache.org/licenses/LICENSE-2.0
11
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15 implied. See the License for the specific language governing
16 permissions and limitations under the License.
17
18 *****************************************************************************/
19
20/*****************************************************************************
21
22 sc_ufix.h -
23
24 Original Author: Martin Janssen, Synopsys, Inc.
25
26 *****************************************************************************/
27
28/*****************************************************************************
29
30 MODIFICATION LOG - modifiers, enter your name, affiliation, date and
31 changes you are making here.
32
33 Name, Affiliation, Date:
34 Description of Modification:
35
36 *****************************************************************************/
37
38// $Log: sc_ufix.h,v $
39// Revision 1.2 2011/01/20 22:52:30 acg
40// Andy Goodrich: Add float constructors.
41//
42// Revision 1.1.1.1 2006/12/15 20:20:04 acg
43// SystemC 2.3
44//
45// Revision 1.3 2006/01/13 18:53:58 acg
46// Andy Goodrich: added $Log command so that CVS comments are reproduced in
47// the source.
48//
49
50#ifndef __SYSTEMC_EXT_DT_FX_SC_UFIX_HH__
51#define __SYSTEMC_EXT_DT_FX_SC_UFIX_HH__
52
53#include "sc_fxnum.hh"
54
55namespace sc_dt
56{
57
58// classes defined in this module
59class sc_ufix;
60class sc_ufix_fast;
61
62
63// ----------------------------------------------------------------------------
64// CLASS : sc_ufix
65//
66// "Unconstrained" unsigned fixed-point class; arbitrary precision.
67// ----------------------------------------------------------------------------
68
69class sc_ufix : public sc_fxnum
70{
71 public:
72 // constructors
73 explicit sc_ufix(sc_fxnum_observer * =0);
74 sc_ufix(int, int, sc_fxnum_observer * =0);
78 sc_ufix(int, int, sc_q_mode, sc_o_mode, int, sc_fxnum_observer * =0);
79 explicit sc_ufix(const sc_fxcast_switch &, sc_fxnum_observer * =0);
80 sc_ufix(int, int, const sc_fxcast_switch &, sc_fxnum_observer * =0);
85 sc_ufix(int, int, sc_q_mode, sc_o_mode, const sc_fxcast_switch &,
87 sc_ufix(int, int, sc_q_mode, sc_o_mode, int, const sc_fxcast_switch &,
89 explicit sc_ufix(const sc_fxtype_params &, sc_fxnum_observer * =0);
92
93#define DECL_CTORS_T(tp) \
94 sc_ufix(tp, int, int, sc_fxnum_observer * =0); \
95 sc_ufix(tp, sc_q_mode, sc_o_mode, sc_fxnum_observer * =0); \
96 sc_ufix(tp, sc_q_mode, sc_o_mode, int, sc_fxnum_observer * =0); \
97 sc_ufix(tp, int, int, sc_q_mode, sc_o_mode, sc_fxnum_observer * =0); \
98 sc_ufix(tp, int, int, sc_q_mode, sc_o_mode, int, sc_fxnum_observer * =0); \
99 sc_ufix(tp, const sc_fxcast_switch &, sc_fxnum_observer * =0); \
100 sc_ufix(tp, int, int, const sc_fxcast_switch &, sc_fxnum_observer * =0); \
101 sc_ufix(tp, sc_q_mode, sc_o_mode, const sc_fxcast_switch &, \
102 sc_fxnum_observer * =0); \
103 sc_ufix(tp, sc_q_mode, sc_o_mode, int, const sc_fxcast_switch &, \
104 sc_fxnum_observer * =0); \
105 sc_ufix(tp, int, int, sc_q_mode, sc_o_mode, const sc_fxcast_switch &, \
106 sc_fxnum_observer * =0); \
107 sc_ufix(tp, int, int, sc_q_mode, sc_o_mode, int, \
108 const sc_fxcast_switch &, sc_fxnum_observer * =0); \
109 sc_ufix(tp, const sc_fxtype_params &, sc_fxnum_observer * =0); \
110 sc_ufix(tp, const sc_fxtype_params &, const sc_fxcast_switch &, \
111 sc_fxnum_observer * =0);
112
113#define DECL_CTORS_T_A(tp) \
114 sc_ufix(tp, sc_fxnum_observer * =0); \
115 DECL_CTORS_T(tp)
116
117#define DECL_CTORS_T_B(tp) \
118 explicit sc_ufix(tp, sc_fxnum_observer * =0); \
119 DECL_CTORS_T(tp)
120
121 DECL_CTORS_T_A(int)
122 DECL_CTORS_T_A(unsigned int)
123 DECL_CTORS_T_A(long)
124 DECL_CTORS_T_A(unsigned long)
125 DECL_CTORS_T_A(float)
126 DECL_CTORS_T_A(double)
127 DECL_CTORS_T_A(const char *)
128 DECL_CTORS_T_A(const sc_fxval &)
129 DECL_CTORS_T_A(const sc_fxval_fast &)
130 DECL_CTORS_T_A(const sc_fxnum &)
131 DECL_CTORS_T_A(const sc_fxnum_fast &)
132
133 DECL_CTORS_T_B(int64)
134 DECL_CTORS_T_B(uint64)
135 DECL_CTORS_T_B(const sc_int_base &)
136 DECL_CTORS_T_B(const sc_uint_base &)
137 DECL_CTORS_T_B(const sc_signed &)
138 DECL_CTORS_T_B(const sc_unsigned &)
139
140#undef DECL_CTORS_T
141#undef DECL_CTORS_T_A
142#undef DECL_CTORS_T_B
143
144 // copy constructor
145 sc_ufix(const sc_ufix &);
146
147 // unary bitwise operators
148 const sc_ufix operator ~ () const;
149
150 // unary bitwise functions
151 friend void b_not(sc_ufix &, const sc_ufix &);
152
153 // binary bitwise operators
154 friend const sc_ufix operator & (const sc_ufix &, const sc_ufix &);
155 friend const sc_ufix operator & (const sc_ufix &, const sc_ufix_fast &);
156 friend const sc_ufix operator & (const sc_ufix_fast &, const sc_ufix &);
157 friend const sc_ufix operator | (const sc_ufix &, const sc_ufix &);
158 friend const sc_ufix operator | (const sc_ufix &, const sc_ufix_fast &);
159 friend const sc_ufix operator | (const sc_ufix_fast &, const sc_ufix &);
160 friend const sc_ufix operator ^ (const sc_ufix &, const sc_ufix &);
161 friend const sc_ufix operator ^ (const sc_ufix &, const sc_ufix_fast &);
162 friend const sc_ufix operator ^ (const sc_ufix_fast &, const sc_ufix &);
163
164 // binary bitwise functions
165 friend void b_and(sc_ufix &, const sc_ufix &, const sc_ufix &);
166 friend void b_and(sc_ufix &, const sc_ufix &, const sc_ufix_fast &);
167 friend void b_and(sc_ufix &, const sc_ufix_fast &, const sc_ufix &);
168 friend void b_or(sc_ufix &, const sc_ufix &, const sc_ufix &);
169 friend void b_or(sc_ufix &, const sc_ufix &, const sc_ufix_fast &);
170 friend void b_or(sc_ufix &, const sc_ufix_fast &, const sc_ufix &);
171 friend void b_xor(sc_ufix &, const sc_ufix &, const sc_ufix &);
172 friend void b_xor(sc_ufix &, const sc_ufix &, const sc_ufix_fast &);
173 friend void b_xor(sc_ufix &, const sc_ufix_fast &, const sc_ufix &);
174
175 // assignment operators
176 sc_ufix &operator = (const sc_ufix &);
177
178#define DECL_ASN_OP_T(op,tp) sc_ufix &operator op (tp);
179
180#define DECL_ASN_OP_OTHER(op) \
181 DECL_ASN_OP_T(op, int64) \
182 DECL_ASN_OP_T(op, uint64) \
183 DECL_ASN_OP_T(op, const sc_int_base &) \
184 DECL_ASN_OP_T(op, const sc_uint_base &) \
185 DECL_ASN_OP_T(op, const sc_signed &) \
186 DECL_ASN_OP_T(op, const sc_unsigned &)
187
188#define DECL_ASN_OP(op) \
189 DECL_ASN_OP_T(op, int) \
190 DECL_ASN_OP_T(op, unsigned int) \
191 DECL_ASN_OP_T(op, long) \
192 DECL_ASN_OP_T(op, unsigned long) \
193 DECL_ASN_OP_T(op, float) \
194 DECL_ASN_OP_T(op, double) \
195 DECL_ASN_OP_T(op, const char *) \
196 DECL_ASN_OP_T(op, const sc_fxval &) \
197 DECL_ASN_OP_T(op, const sc_fxval_fast &) \
198 DECL_ASN_OP_T(op, const sc_fxnum &) \
199 DECL_ASN_OP_T(op, const sc_fxnum_fast &) \
200 DECL_ASN_OP_OTHER(op)
201
202 DECL_ASN_OP(=)
203
204 DECL_ASN_OP(*=)
205 DECL_ASN_OP(/=)
206 DECL_ASN_OP(+=)
207 DECL_ASN_OP(-=)
208
209 DECL_ASN_OP_T(<<=, int)
210 DECL_ASN_OP_T(>>=, int)
211
212 DECL_ASN_OP_T(&=, const sc_ufix &)
213 DECL_ASN_OP_T(&=, const sc_ufix_fast &)
214 DECL_ASN_OP_T(|=, const sc_ufix &)
215 DECL_ASN_OP_T(|=, const sc_ufix_fast &)
216 DECL_ASN_OP_T(^=, const sc_ufix &)
217 DECL_ASN_OP_T(^=, const sc_ufix_fast &)
218
219#undef DECL_ASN_OP_T
220#undef DECL_ASN_OP_OTHER
221#undef DECL_ASN_OP
222
223 // auto-increment and auto-decrement
224 const sc_fxval operator ++ (int);
225 const sc_fxval operator -- (int);
226
229};
230
231
232// ----------------------------------------------------------------------------
233// CLASS : sc_ufix_fast
234//
235// "Unconstrained" unsigned fixed-point class; limited precision.
236// ----------------------------------------------------------------------------
237
239{
240 public:
241 // constructors
243 sc_ufix_fast(int, int, sc_fxnum_fast_observer * =0);
247 sc_ufix_fast(int, int, sc_q_mode, sc_o_mode, int,
249 explicit sc_ufix_fast(const sc_fxcast_switch &,
251 sc_ufix_fast(int, int, const sc_fxcast_switch &,
259 sc_ufix_fast(int, int, sc_q_mode, sc_o_mode, int, const sc_fxcast_switch &,
261 explicit sc_ufix_fast(const sc_fxtype_params &,
265
266#define DECL_CTORS_T(tp) \
267 sc_ufix_fast(tp, int, int, sc_fxnum_fast_observer * =0); \
268 sc_ufix_fast(tp, sc_q_mode, sc_o_mode, sc_fxnum_fast_observer * =0); \
269 sc_ufix_fast(tp, sc_q_mode, sc_o_mode, int, sc_fxnum_fast_observer * =0); \
270 sc_ufix_fast(tp, int, int, sc_q_mode, sc_o_mode, \
271 sc_fxnum_fast_observer * =0); \
272 sc_ufix_fast(tp, int, int, sc_q_mode, sc_o_mode, int, \
273 sc_fxnum_fast_observer * =0); \
274 sc_ufix_fast(tp, const sc_fxcast_switch &, sc_fxnum_fast_observer * =0); \
275 sc_ufix_fast(tp, int, int, const sc_fxcast_switch &, \
276 sc_fxnum_fast_observer * =0); \
277 sc_ufix_fast(tp, sc_q_mode, sc_o_mode, const sc_fxcast_switch &, \
278 sc_fxnum_fast_observer * =0); \
279 sc_ufix_fast(tp, sc_q_mode, sc_o_mode, int, const sc_fxcast_switch &, \
280 sc_fxnum_fast_observer * =0); \
281 sc_ufix_fast(tp, int, int, sc_q_mode, sc_o_mode, \
282 const sc_fxcast_switch &, sc_fxnum_fast_observer * =0); \
283 sc_ufix_fast(tp, int, int, sc_q_mode, sc_o_mode, int, \
284 const sc_fxcast_switch &, sc_fxnum_fast_observer * =0); \
285 sc_ufix_fast(tp, const sc_fxtype_params &, sc_fxnum_fast_observer * =0); \
286 sc_ufix_fast(tp, const sc_fxtype_params &, const sc_fxcast_switch &, \
287 sc_fxnum_fast_observer * =0);
288
289#define DECL_CTORS_T_A(tp) \
290 sc_ufix_fast(tp, sc_fxnum_fast_observer * =0); \
291 DECL_CTORS_T(tp)
292
293#define DECL_CTORS_T_B(tp) \
294 explicit sc_ufix_fast(tp, sc_fxnum_fast_observer * =0); \
295 DECL_CTORS_T(tp)
296
297 DECL_CTORS_T_A(int)
298 DECL_CTORS_T_A(unsigned int)
299 DECL_CTORS_T_A(long)
300 DECL_CTORS_T_A(unsigned long)
301 DECL_CTORS_T_A(float)
302 DECL_CTORS_T_A(double)
303 DECL_CTORS_T_A(const char *)
304 DECL_CTORS_T_A(const sc_fxval &)
306 DECL_CTORS_T_A(const sc_fxnum &)
308
315
316#undef DECL_CTORS_T
317#undef DECL_CTORS_T_A
318#undef DECL_CTORS_T_B
319
320 // copy constructor
321 sc_ufix_fast(const sc_ufix_fast &);
322
323 // unary bitwise operators
324 const sc_ufix_fast operator ~ () const;
325
326 // unary bitwise functions
327 friend void b_not(sc_ufix_fast &, const sc_ufix_fast &);
328
329
330 // binary bitwise operators
331
333 const sc_ufix_fast &);
335 const sc_ufix_fast &);
337 const sc_ufix_fast &);
338
339
340 // binary bitwise functions
341
342 friend void b_and(sc_ufix_fast &, const sc_ufix_fast &,
343 const sc_ufix_fast &);
344 friend void b_or(sc_ufix_fast &, const sc_ufix_fast &,
345 const sc_ufix_fast &);
346 friend void b_xor(sc_ufix_fast &, const sc_ufix_fast &,
347 const sc_ufix_fast &);
348
349 // assignment operators
351
352#define DECL_ASN_OP_T(op,tp) sc_ufix_fast &operator op (tp);
353
354#define DECL_ASN_OP_OTHER(op) \
355 DECL_ASN_OP_T(op, int64) \
356 DECL_ASN_OP_T(op, uint64) \
357 DECL_ASN_OP_T(op, const sc_int_base &) \
358 DECL_ASN_OP_T(op, const sc_uint_base &) \
359 DECL_ASN_OP_T(op, const sc_signed &) \
360 DECL_ASN_OP_T(op, const sc_unsigned &)
361
362#define DECL_ASN_OP(op) \
363 DECL_ASN_OP_T(op, int) \
364 DECL_ASN_OP_T(op, unsigned int) \
365 DECL_ASN_OP_T(op, long) \
366 DECL_ASN_OP_T(op, unsigned long) \
367 DECL_ASN_OP_T(op, float) \
368 DECL_ASN_OP_T(op, double) \
369 DECL_ASN_OP_T(op, const char *) \
370 DECL_ASN_OP_T(op, const sc_fxval &) \
371 DECL_ASN_OP_T(op, const sc_fxval_fast &) \
372 DECL_ASN_OP_T(op, const sc_fxnum &) \
373 DECL_ASN_OP_T(op, const sc_fxnum_fast &) \
374 DECL_ASN_OP_OTHER(op)
375
376 DECL_ASN_OP(=)
377
378 DECL_ASN_OP(*=)
379 DECL_ASN_OP(/=)
380 DECL_ASN_OP(+=)
381 DECL_ASN_OP(-=)
382
383 DECL_ASN_OP_T(<<=, int)
384 DECL_ASN_OP_T(>>=, int)
385
386 DECL_ASN_OP_T(&=, const sc_ufix &)
387 DECL_ASN_OP_T(&=, const sc_ufix_fast &)
388 DECL_ASN_OP_T(|=, const sc_ufix &)
389 DECL_ASN_OP_T(|=, const sc_ufix_fast &)
390 DECL_ASN_OP_T(^=, const sc_ufix &)
391 DECL_ASN_OP_T(^=, const sc_ufix_fast &)
392
393#undef DECL_ASN_OP_T
394#undef DECL_ASN_OP_OTHER
395#undef DECL_ASN_OP
396
397 // auto-increment and auto-decrement
398 const sc_fxval_fast operator ++ (int);
399 const sc_fxval_fast operator -- (int);
400
403};
404
405
406// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
407
408// ----------------------------------------------------------------------------
409// CLASS : sc_ufix
410//
411// "Unconstrained" unsigned fixed-point class; arbitrary precision.
412// ----------------------------------------------------------------------------
413
414// constructors
415
419
420inline sc_ufix::sc_ufix(int wl_, int iwl_, sc_fxnum_observer *observer_ ) :
422 observer_)
423{}
424
426 sc_fxnum_observer *observer_) :
428 observer_)
429{}
430
431inline
433 sc_fxnum_observer *observer_) :
435 observer_)
436{}
437
438inline sc_ufix::sc_ufix(int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,
439 sc_fxnum_observer *observer_) :
440 sc_fxnum(sc_fxtype_params(wl_, iwl_, qm, om), SC_US_,
441 sc_fxcast_switch(), observer_)
442{}
443
444inline sc_ufix::sc_ufix(int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb,
445 sc_fxnum_observer *observer_) :
446 sc_fxnum(sc_fxtype_params(wl_, iwl_, qm, om, nb), SC_US_,
447 sc_fxcast_switch(), observer_)
448{}
449
450inline sc_ufix::sc_ufix(const sc_fxcast_switch &cast_sw,
451 sc_fxnum_observer *observer_) :
452 sc_fxnum(sc_fxtype_params(), SC_US_, cast_sw, observer_)
453{}
454
455inline sc_ufix::sc_ufix(int wl_, int iwl_, const sc_fxcast_switch &cast_sw,
456 sc_fxnum_observer *observer_) :
457 sc_fxnum(sc_fxtype_params(wl_, iwl_), SC_US_, cast_sw, observer_)
458{}
459
461 const sc_fxcast_switch &cast_sw,
462 sc_fxnum_observer *observer_) :
463 sc_fxnum(sc_fxtype_params(qm, om), SC_US_, cast_sw, observer_)
464{}
465
467 const sc_fxcast_switch &cast_sw,
468 sc_fxnum_observer *observer_ ) :
469 sc_fxnum(sc_fxtype_params(qm, om, nb), SC_US_, cast_sw, observer_)
470{}
471
472inline sc_ufix::sc_ufix(int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,
473 const sc_fxcast_switch &cast_sw,
474 sc_fxnum_observer *observer_) :
475 sc_fxnum(sc_fxtype_params(wl_, iwl_, qm, om), SC_US_, cast_sw,
476 observer_)
477{}
478
479inline sc_ufix::sc_ufix(int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb,
480 const sc_fxcast_switch &cast_sw,
481 sc_fxnum_observer *observer_) :
482 sc_fxnum(sc_fxtype_params(wl_, iwl_, qm, om, nb), SC_US_, cast_sw,
483 observer_)
484{}
485
486inline sc_ufix::sc_ufix(const sc_fxtype_params &type_params_,
487 sc_fxnum_observer *observer_) :
488 sc_fxnum(type_params_, SC_US_, sc_fxcast_switch(), observer_)
489{}
490
491inline sc_ufix::sc_ufix(const sc_fxtype_params &type_params_,
492 const sc_fxcast_switch &cast_sw,
493 sc_fxnum_observer *observer_ ) :
494 sc_fxnum(type_params_, SC_US_, cast_sw, observer_)
495{}
496
497#define DEFN_CTORS_T_A(tp) \
498inline sc_ufix::sc_ufix(tp a, sc_fxnum_observer *observer_ ) : \
499 sc_fxnum(a, sc_fxtype_params(), SC_US_, sc_fxcast_switch(), \
500 observer_) \
501{} \
502 \
503inline sc_ufix::sc_ufix(tp a, int wl_, int iwl_, \
504 sc_fxnum_observer *observer_) : \
505 sc_fxnum(a, sc_fxtype_params(wl_, iwl_), SC_US_, sc_fxcast_switch(), \
506 observer_ ) \
507{} \
508 \
509inline sc_ufix::sc_ufix(tp a, sc_q_mode qm, sc_o_mode om, \
510 sc_fxnum_observer *observer_) : \
511 sc_fxnum(a, sc_fxtype_params(qm, om), SC_US_, sc_fxcast_switch(), \
512 observer_ ) \
513{} \
514 \
515inline sc_ufix::sc_ufix(tp a, sc_q_mode qm, sc_o_mode om, int nb, \
516 sc_fxnum_observer *observer_) : \
517 sc_fxnum(a, sc_fxtype_params(qm, om, nb), SC_US_, sc_fxcast_switch(), \
518 observer_ ) \
519{} \
520 \
521inline sc_ufix::sc_ufix(tp a, int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \
522 sc_fxnum_observer *observer_) : \
523 sc_fxnum(a, sc_fxtype_params(wl_, iwl_, qm, om), SC_US_, \
524 sc_fxcast_switch(), observer_) \
525{} \
526 \
527inline sc_ufix::sc_ufix(tp a, int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \
528 int nb, sc_fxnum_observer *observer_) : \
529 sc_fxnum(a, sc_fxtype_params(wl_, iwl_, qm, om, nb), SC_US_, \
530 sc_fxcast_switch(), observer_) \
531{} \
532 \
533inline sc_ufix::sc_ufix(tp a, const sc_fxcast_switch &cast_sw, \
534 sc_fxnum_observer *observer_) : \
535 sc_fxnum(a, sc_fxtype_params(), SC_US_, cast_sw, observer_) \
536{} \
537 \
538inline sc_ufix::sc_ufix(tp a, int wl_, int iwl_, \
539 const sc_fxcast_switch &cast_sw, \
540 sc_fxnum_observer *observer_) : \
541 sc_fxnum(a, sc_fxtype_params(wl_, iwl_), SC_US_, cast_sw, observer_) \
542{} \
543 \
544inline sc_ufix::sc_ufix(tp a, sc_q_mode qm, sc_o_mode om, \
545 const sc_fxcast_switch &cast_sw, \
546 sc_fxnum_observer *observer_) : \
547 sc_fxnum(a, sc_fxtype_params(qm, om), SC_US_, cast_sw, observer_) \
548{} \
549 \
550inline sc_ufix::sc_ufix(tp a, sc_q_mode qm, sc_o_mode om, int nb, \
551 const sc_fxcast_switch &cast_sw, \
552 sc_fxnum_observer *observer_) : \
553 sc_fxnum(a, sc_fxtype_params(qm, om, nb), SC_US_, cast_sw, observer_) \
554{} \
555 \
556inline sc_ufix::sc_ufix(tp a, int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \
557 const sc_fxcast_switch &cast_sw, \
558 sc_fxnum_observer *observer_) : \
559 sc_fxnum(a, sc_fxtype_params(wl_, iwl_, qm, om), SC_US_, cast_sw, \
560 observer_) \
561{} \
562 \
563inline sc_ufix::sc_ufix(tp a, int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \
564 int nb, const sc_fxcast_switch &cast_sw, \
565 sc_fxnum_observer *observer_) : \
566 sc_fxnum(a, sc_fxtype_params(wl_, iwl_, qm, om, nb), SC_US_, cast_sw, \
567 observer_) \
568{} \
569 \
570inline sc_ufix::sc_ufix(tp a, const sc_fxtype_params &type_params_, \
571 sc_fxnum_observer * observer_) : \
572 sc_fxnum(a, type_params_, SC_US_, sc_fxcast_switch(), observer_) \
573{} \
574 \
575inline sc_ufix::sc_ufix(tp a, const sc_fxtype_params& type_params_, \
576 const sc_fxcast_switch &cast_sw, \
577 sc_fxnum_observer *observer_) : \
578 sc_fxnum(a, type_params_, SC_US_, cast_sw, observer_) \
579{}
580
581#define DEFN_CTORS_T_B(tp) \
582inline sc_ufix::sc_ufix(tp a, sc_fxnum_observer *observer_) : \
583 sc_fxnum(a, a.type_params(), SC_US_, sc_fxcast_switch(), observer_) \
584{} \
585 \
586inline sc_ufix::sc_ufix(tp a, int wl_, int iwl_, \
587 sc_fxnum_observer *observer_) : \
588 sc_fxnum(a, sc_fxtype_params(a.type_params(), wl_, iwl_), SC_US_, \
589 sc_fxcast_switch(), observer_) \
590{} \
591 \
592inline \
593sc_ufix::sc_ufix(tp a, sc_q_mode qm, sc_o_mode om, \
594 sc_fxnum_observer *observer_) : \
595 sc_fxnum(a, sc_fxtype_params(a.type_params(), qm, om), SC_US_, \
596 sc_fxcast_switch(), observer_) \
597{} \
598 \
599inline sc_ufix::sc_ufix(tp a, sc_q_mode qm, sc_o_mode om, int nb, \
600 sc_fxnum_observer *observer_) : \
601 sc_fxnum(a, sc_fxtype_params(a.type_params(), qm, om, nb), SC_US_, \
602 sc_fxcast_switch(), observer_) \
603{} \
604 \
605inline sc_ufix::sc_ufix(tp a, int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \
606 sc_fxnum_observer* observer_) : \
607 sc_fxnum(a, sc_fxtype_params(wl_, iwl_, qm, om), SC_US_, \
608 sc_fxcast_switch(), observer_) \
609{} \
610 \
611inline sc_ufix::sc_ufix(tp a, int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \
612 int nb, sc_fxnum_observer *observer_) : \
613 sc_fxnum(a, sc_fxtype_params(wl_, iwl_, qm, om, nb), SC_US_, \
614 sc_fxcast_switch(), observer_) \
615{} \
616 \
617inline sc_ufix::sc_ufix(tp a, const sc_fxcast_switch& cast_sw, \
618 sc_fxnum_observer* observer_) : \
619 sc_fxnum(a, a.type_params(), SC_US_, cast_sw, observer_) \
620{} \
621 \
622inline sc_ufix::sc_ufix(tp a, int wl_, int iwl_, \
623 const sc_fxcast_switch &cast_sw, \
624 sc_fxnum_observer *observer_) : \
625 sc_fxnum(a, sc_fxtype_params(a.type_params(), wl_, iwl_), SC_US_, \
626 cast_sw, observer_) \
627{} \
628 \
629inline sc_ufix::sc_ufix(tp a, sc_q_mode qm, sc_o_mode om, \
630 const sc_fxcast_switch &cast_sw, \
631 sc_fxnum_observer *observer_) : \
632 sc_fxnum(a, sc_fxtype_params(a.type_params(), qm, om), SC_US_, \
633 cast_sw, observer_) \
634{} \
635 \
636inline sc_ufix::sc_ufix(tp a, sc_q_mode qm, sc_o_mode om, int nb, \
637 const sc_fxcast_switch &cast_sw, \
638 sc_fxnum_observer *observer_) : \
639 sc_fxnum(a, sc_fxtype_params(a.type_params(), qm, om, nb), SC_US_, \
640 cast_sw, observer_) \
641{} \
642 \
643inline sc_ufix::sc_ufix(tp a, int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \
644 const sc_fxcast_switch &cast_sw, \
645 sc_fxnum_observer *observer_) : \
646 sc_fxnum(a, sc_fxtype_params(wl_, iwl_, qm, om), SC_US_, cast_sw, \
647 observer_) \
648{} \
649 \
650inline sc_ufix::sc_ufix(tp a, int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \
651 int nb, const sc_fxcast_switch &cast_sw, \
652 sc_fxnum_observer *observer_) : \
653 sc_fxnum(a, sc_fxtype_params(wl_, iwl_, qm, om, nb), SC_US_, cast_sw, \
654 observer_) \
655{} \
656 \
657inline sc_ufix::sc_ufix(tp a, const sc_fxtype_params &type_params_, \
658 sc_fxnum_observer *observer_) : \
659 sc_fxnum(a, type_params_, SC_US_, sc_fxcast_switch(), observer_) \
660{} \
661 \
662inline sc_ufix::sc_ufix(tp a, const sc_fxtype_params& type_params_, \
663 const sc_fxcast_switch &cast_sw, \
664 sc_fxnum_observer *observer_) : \
665 sc_fxnum(a, type_params_, SC_US_, cast_sw, observer_) \
666{}
667
669DEFN_CTORS_T_A(unsigned int)
670DEFN_CTORS_T_A(long)
671DEFN_CTORS_T_A(unsigned long)
672DEFN_CTORS_T_A(float)
673DEFN_CTORS_T_A(double)
674DEFN_CTORS_T_A(const char *)
676DEFN_CTORS_T_A(const sc_fxval_fast &)
677DEFN_CTORS_T_B(const sc_fxnum &)
678DEFN_CTORS_T_B(const sc_fxnum_fast &)
679
680DEFN_CTORS_T_A(int64)
681DEFN_CTORS_T_A(uint64)
682DEFN_CTORS_T_A(const sc_int_base &)
683DEFN_CTORS_T_A(const sc_uint_base &)
684DEFN_CTORS_T_A(const sc_signed &)
685DEFN_CTORS_T_A(const sc_unsigned &)
686
687#undef DEFN_CTORS_T_A
688#undef DEFN_CTORS_T_B
689
690// copy constructor
691
692inline sc_ufix::sc_ufix(const sc_ufix &a) :
693 sc_fxnum(a, a.type_params(), SC_US_, sc_fxcast_switch(), 0)
694{}
695
696// unary bitwise operators
697inline const sc_ufix
699{
701 int iwl_c = iwl();
702 int wl_c = wl();
703 sc_ufix c(wl_c, iwl_c);
704 for (int i = iwl_c - wl_c; i < iwl_c; ++i)
705 c.set_bit(i, !get_bit(i));
706 return sc_ufix(c, wl_c, iwl_c);
707}
708
709// unary bitwise functions
710inline void
712{
714 int iwl_c = c.iwl();
715 for (int i = iwl_c - c.wl(); i < iwl_c; ++i)
716 c.set_bit(i, !a.get_bit(i));
717 c.cast();
719}
720
721// binary bitwise operators
722#define DEFN_BIN_OP_T(op, op2, tp1, tp2) \
723inline const sc_ufix \
724operator op (const tp1 &a, const tp2 &b) \
725{ \
726 a.observer_read(); \
727 b.observer_read(); \
728 int iwl_a = a.iwl(); \
729 int iwl_b = b.iwl(); \
730 int iwl_c = sc_max(iwl_a, iwl_b); \
731 int fwl_c = sc_max(a.wl() - iwl_a, b.wl() - iwl_b); \
732 sc_ufix c(iwl_c + fwl_c, iwl_c); \
733 for (int i = -fwl_c; i < iwl_c; ++i) \
734 c.set_bit(i, a.get_bit(i) op2 b.get_bit(i)); \
735 return sc_ufix(c, iwl_c + fwl_c, iwl_c); \
736}
737
739DEFN_BIN_OP_T(&, &&, sc_ufix, sc_ufix_fast)
740DEFN_BIN_OP_T(&, &&, sc_ufix_fast, sc_ufix)
741
743DEFN_BIN_OP_T(|, ||, sc_ufix, sc_ufix_fast)
744DEFN_BIN_OP_T(|, ||, sc_ufix_fast, sc_ufix)
745
747DEFN_BIN_OP_T(^, !=, sc_ufix, sc_ufix_fast)
748DEFN_BIN_OP_T(^, !=, sc_ufix_fast, sc_ufix)
749
750#undef DEFN_BIN_OP_T
751
752// binary bitwise functions
753#define DEFN_BIN_FNC_T(fnc, op2, tp1, tp2) \
754inline void \
755fnc (sc_ufix &c, const tp1 &a, const tp2 &b) \
756{ \
757 a.observer_read(); \
758 b.observer_read(); \
759 int iwl_c = c.iwl(); \
760 for (int i = iwl_c - c.wl(); i < iwl_c; ++i) \
761 c.set_bit(i, a.get_bit(i) op2 b.get_bit(i)); \
762 c.cast(); \
763 SC_FXNUM_OBSERVER_WRITE_(c) \
764}
765
767DEFN_BIN_FNC_T(b_and, &&, sc_ufix, sc_ufix_fast)
768DEFN_BIN_FNC_T(b_and, &&, sc_ufix_fast, sc_ufix)
769
771DEFN_BIN_FNC_T(b_or, ||, sc_ufix, sc_ufix_fast)
772DEFN_BIN_FNC_T(b_or, ||, sc_ufix_fast, sc_ufix)
773
775DEFN_BIN_FNC_T(b_xor, !=, sc_ufix, sc_ufix_fast)
776DEFN_BIN_FNC_T(b_xor, !=, sc_ufix_fast, sc_ufix)
777
778#undef DEFN_BIN_FNC_T
779
780// assignment operators
781inline sc_ufix &
783{
784 sc_fxnum::operator = (a);
785 return *this;
786}
787
788#define DEFN_ASN_OP_T(op, tp) \
789inline sc_ufix & \
790sc_ufix::operator op (tp a) \
791{ \
792 sc_fxnum::operator op(a); \
793 return *this; \
794}
795
796#define DEFN_ASN_OP_OTHER(op) \
797DEFN_ASN_OP_T(op, int64) \
798DEFN_ASN_OP_T(op, uint64) \
799DEFN_ASN_OP_T(op, const sc_int_base &) \
800DEFN_ASN_OP_T(op, const sc_uint_base &) \
801DEFN_ASN_OP_T(op, const sc_signed &) \
802DEFN_ASN_OP_T(op, const sc_unsigned &)
803
804#define DEFN_ASN_OP(op) \
805DEFN_ASN_OP_T(op, int) \
806DEFN_ASN_OP_T(op, unsigned int) \
807DEFN_ASN_OP_T(op, long) \
808DEFN_ASN_OP_T(op, unsigned long) \
809DEFN_ASN_OP_T(op, float) \
810DEFN_ASN_OP_T(op, double) \
811DEFN_ASN_OP_T(op, const char *) \
812DEFN_ASN_OP_T(op, const sc_fxval &) \
813DEFN_ASN_OP_T(op, const sc_fxval_fast &) \
814DEFN_ASN_OP_T(op, const sc_fxnum &) \
815DEFN_ASN_OP_T(op, const sc_fxnum_fast &) \
816DEFN_ASN_OP_OTHER(op)
817
819
820DEFN_ASN_OP(*=)
821DEFN_ASN_OP(/=)
822DEFN_ASN_OP(+=)
823DEFN_ASN_OP(-=)
824
825DEFN_ASN_OP_T(<<=, int)
826DEFN_ASN_OP_T(>>=, int)
827
828#undef DEFN_ASN_OP_T
829#undef DEFN_ASN_OP_OTHER
830#undef DEFN_ASN_OP
831
832
833#define DEFN_ASN_OP_T(op, op2, tp) \
834inline sc_ufix & \
835sc_ufix::operator op (const tp &b) \
836{ \
837 SC_FXNUM_OBSERVER_READ_(*this) \
838 b.observer_read(); \
839 int iwl_c = iwl(); \
840 for (int i = iwl_c - wl(); i < iwl_c; ++i) \
841 set_bit(i, get_bit(i) op2 b.get_bit(i)); \
842 cast(); \
843 SC_FXNUM_OBSERVER_WRITE_(*this) \
844 return *this; \
845}
846
847DEFN_ASN_OP_T(&=, &&, sc_ufix)
848DEFN_ASN_OP_T(&=, &&, sc_ufix_fast)
849DEFN_ASN_OP_T(|=, ||, sc_ufix)
850DEFN_ASN_OP_T(|=, ||, sc_ufix_fast)
851DEFN_ASN_OP_T(^=, !=, sc_ufix)
852DEFN_ASN_OP_T(^=, !=, sc_ufix_fast)
853
854#undef DEFN_ASN_OP_T
855
856// auto-increment and auto-decrement
857inline const sc_fxval
859{
860 return sc_fxval(sc_fxnum::operator ++ (0));
861}
862
863inline const sc_fxval
865{
866 return sc_fxval(sc_fxnum::operator -- (0));
867}
868
869inline sc_ufix &
871{
873 return *this;
874}
875
876inline sc_ufix &
878{
880 return *this;
881}
882
883
884// ----------------------------------------------------------------------------
885// CLASS : sc_ufix_fast
886//
887// "Unconstrained" unsigned fixed-point class; limited precision.
888// ----------------------------------------------------------------------------
889
890// constructors
891
896
897inline sc_ufix_fast::sc_ufix_fast(int wl_, int iwl_,
898 sc_fxnum_fast_observer *observer_) :
900 observer_ )
901{}
902
908
910 sc_fxnum_fast_observer *observer_) :
912 observer_ )
913{}
914
916 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,
917 sc_fxnum_fast_observer *observer_) :
918 sc_fxnum_fast(sc_fxtype_params(wl_, iwl_, qm, om), SC_US_,
919 sc_fxcast_switch(), observer_)
920{}
921
923 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb,
924 sc_fxnum_fast_observer *observer_) :
925 sc_fxnum_fast(sc_fxtype_params(wl_, iwl_, qm, om, nb), SC_US_,
926 sc_fxcast_switch(), observer_)
927{}
928
930 sc_fxnum_fast_observer *observer_) :
931 sc_fxnum_fast(sc_fxtype_params(), SC_US_, cast_sw, observer_)
932{}
933
935 int wl_, int iwl_, const sc_fxcast_switch &cast_sw,
936 sc_fxnum_fast_observer *observer_) :
937 sc_fxnum_fast(sc_fxtype_params(wl_, iwl_), SC_US_, cast_sw, observer_)
938{}
939
941 sc_q_mode qm, sc_o_mode om, const sc_fxcast_switch &cast_sw,
942 sc_fxnum_fast_observer *observer_) :
943 sc_fxnum_fast(sc_fxtype_params(qm, om), SC_US_, cast_sw, observer_)
944{}
945
947 sc_q_mode qm, sc_o_mode om, int nb, const sc_fxcast_switch &cast_sw,
948 sc_fxnum_fast_observer *observer_) :
949 sc_fxnum_fast(sc_fxtype_params(qm, om, nb), SC_US_, cast_sw, observer_)
950{}
951
953 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,
954 const sc_fxcast_switch &cast_sw, sc_fxnum_fast_observer *observer_) :
955 sc_fxnum_fast(sc_fxtype_params(wl_, iwl_, qm, om), SC_US_, cast_sw,
956 observer_ )
957{}
958
960 int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb,
961 const sc_fxcast_switch &cast_sw, sc_fxnum_fast_observer *observer_) :
962 sc_fxnum_fast(sc_fxtype_params(wl_, iwl_, qm, om, nb), SC_US_, cast_sw,
963 observer_)
964{}
965
967 sc_fxnum_fast_observer *observer_) :
968 sc_fxnum_fast(type_params_, SC_US_, sc_fxcast_switch(), observer_)
969{}
970
972 const sc_fxcast_switch &cast_sw,
973 sc_fxnum_fast_observer *observer_) :
974 sc_fxnum_fast(type_params_, SC_US_, cast_sw, observer_)
975{}
976
977#define DEFN_CTORS_T_A(tp) \
978inline sc_ufix_fast::sc_ufix_fast(tp a, sc_fxnum_fast_observer *observer_) : \
979 sc_fxnum_fast(a, sc_fxtype_params(), SC_US_, sc_fxcast_switch(), \
980 observer_) \
981{} \
982 \
983inline sc_ufix_fast::sc_ufix_fast(tp a, int wl_, int iwl_, \
984 sc_fxnum_fast_observer *observer_) : \
985 sc_fxnum_fast(a, sc_fxtype_params(wl_, iwl_), SC_US_, sc_fxcast_switch(), \
986 observer_) \
987{} \
988 \
989inline sc_ufix_fast::sc_ufix_fast(tp a, sc_q_mode qm, sc_o_mode om, \
990 sc_fxnum_fast_observer *observer_) : \
991 sc_fxnum_fast(a, sc_fxtype_params(qm, om), SC_US_, sc_fxcast_switch(), \
992 observer_) \
993{} \
994 \
995inline sc_ufix_fast::sc_ufix_fast(tp a, sc_q_mode qm, sc_o_mode om, int nb, \
996 sc_fxnum_fast_observer *observer_) : \
997 sc_fxnum_fast(a, sc_fxtype_params(qm, om, nb), SC_US_, \
998 sc_fxcast_switch(), observer_) \
999{} \
1000 \
1001inline sc_ufix_fast::sc_ufix_fast( \
1002 tp a, int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \
1003 sc_fxnum_fast_observer* observer_) : \
1004 sc_fxnum_fast(a, sc_fxtype_params(wl_, iwl_, qm, om), SC_US_, \
1005 sc_fxcast_switch(), observer_) \
1006{} \
1007 \
1008inline sc_ufix_fast::sc_ufix_fast( \
1009 tp a, int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb, \
1010 sc_fxnum_fast_observer *observer_) : \
1011 sc_fxnum_fast(a, sc_fxtype_params(wl_, iwl_, qm, om, nb), SC_US_, \
1012 sc_fxcast_switch(), observer_) \
1013{} \
1014 \
1015inline sc_ufix_fast::sc_ufix_fast(tp a, const sc_fxcast_switch &cast_sw, \
1016 sc_fxnum_fast_observer *observer_) : \
1017 sc_fxnum_fast(a, sc_fxtype_params(), SC_US_, cast_sw, observer_) \
1018{} \
1019 \
1020inline sc_ufix_fast::sc_ufix_fast(tp a, int wl_, int iwl_, \
1021 const sc_fxcast_switch &cast_sw, \
1022 sc_fxnum_fast_observer *observer_) : \
1023 sc_fxnum_fast(a, sc_fxtype_params(wl_, iwl_), SC_US_, cast_sw, observer_) \
1024{} \
1025 \
1026inline sc_ufix_fast::sc_ufix_fast(tp a, sc_q_mode qm, sc_o_mode om, \
1027 const sc_fxcast_switch &cast_sw, \
1028 sc_fxnum_fast_observer *observer_) : \
1029 sc_fxnum_fast(a, sc_fxtype_params(qm, om), SC_US_, cast_sw, observer_) \
1030{} \
1031 \
1032inline sc_ufix_fast::sc_ufix_fast(tp a, sc_q_mode qm, sc_o_mode om, int nb, \
1033 const sc_fxcast_switch &cast_sw, \
1034 sc_fxnum_fast_observer *observer_) : \
1035 sc_fxnum_fast(a, sc_fxtype_params(qm, om, nb), SC_US_, cast_sw, \
1036 observer_) \
1037{} \
1038 \
1039inline sc_ufix_fast::sc_ufix_fast(tp a, int wl_, int iwl_, \
1040 sc_q_mode qm, sc_o_mode om, \
1041 const sc_fxcast_switch &cast_sw, \
1042 sc_fxnum_fast_observer *observer_) : \
1043 sc_fxnum_fast(a, sc_fxtype_params(wl_, iwl_, qm, om), SC_US_, cast_sw, \
1044 observer_) \
1045{} \
1046 \
1047inline sc_ufix_fast::sc_ufix_fast(tp a, int wl_, int iwl_, \
1048 sc_q_mode qm, sc_o_mode om, int nb, \
1049 const sc_fxcast_switch &cast_sw, \
1050 sc_fxnum_fast_observer *observer_) : \
1051 sc_fxnum_fast(a, sc_fxtype_params(wl_, iwl_, qm, om, nb), SC_US_, \
1052 cast_sw, observer_) \
1053{} \
1054 \
1055inline sc_ufix_fast::sc_ufix_fast( \
1056 tp a, const sc_fxtype_params &type_params_, \
1057 sc_fxnum_fast_observer *observer_) : \
1058 sc_fxnum_fast(a, type_params_, SC_US_, sc_fxcast_switch(), observer_) \
1059{} \
1060 \
1061inline sc_ufix_fast::sc_ufix_fast( \
1062 tp a, const sc_fxtype_params &type_params_, \
1063 const sc_fxcast_switch &cast_sw, sc_fxnum_fast_observer *observer_) : \
1064 sc_fxnum_fast(a, type_params_, SC_US_, cast_sw, observer_) \
1065{}
1066
1067#define DEFN_CTORS_T_B(tp) \
1068inline sc_ufix_fast::sc_ufix_fast(tp a, sc_fxnum_fast_observer *observer_) : \
1069 sc_fxnum_fast(a, a.type_params(), SC_US_, sc_fxcast_switch(), observer_) \
1070{} \
1071 \
1072inline sc_ufix_fast::sc_ufix_fast(tp a, int wl_, int iwl_, \
1073 sc_fxnum_fast_observer* observer_) : \
1074 sc_fxnum_fast(a, sc_fxtype_params(a.type_params(), wl_, iwl_), SC_US_, \
1075 sc_fxcast_switch(), observer_) \
1076{} \
1077 \
1078inline sc_ufix_fast::sc_ufix_fast(tp a, sc_q_mode qm, sc_o_mode om, \
1079 sc_fxnum_fast_observer* observer_) : \
1080 sc_fxnum_fast(a, sc_fxtype_params(a.type_params(), qm, om), SC_US_, \
1081 sc_fxcast_switch(), observer_) \
1082{} \
1083 \
1084inline sc_ufix_fast::sc_ufix_fast(tp a, sc_q_mode qm, sc_o_mode om, int nb, \
1085 sc_fxnum_fast_observer* observer_) : \
1086 sc_fxnum_fast(a, sc_fxtype_params(a.type_params(), qm, om, nb), SC_US_, \
1087 sc_fxcast_switch(), observer_) \
1088{} \
1089 \
1090inline sc_ufix_fast::sc_ufix_fast( \
1091 tp a, int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \
1092 sc_fxnum_fast_observer *observer_) : \
1093 sc_fxnum_fast(a, sc_fxtype_params(wl_, iwl_, qm, om), SC_US_, \
1094 sc_fxcast_switch(), observer_) \
1095{} \
1096 \
1097inline sc_ufix_fast::sc_ufix_fast( \
1098 tp a, int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb, \
1099 sc_fxnum_fast_observer *observer_) : \
1100 sc_fxnum_fast(a, sc_fxtype_params(wl_, iwl_, qm, om, nb), SC_US_, \
1101 sc_fxcast_switch(), observer_) \
1102{} \
1103 \
1104inline sc_ufix_fast::sc_ufix_fast(tp a, const sc_fxcast_switch &cast_sw, \
1105 sc_fxnum_fast_observer *observer_) : \
1106 sc_fxnum_fast(a, a.type_params(), SC_US_, cast_sw, observer_) \
1107{} \
1108 \
1109inline sc_ufix_fast::sc_ufix_fast( \
1110 tp a, int wl_, int iwl_, const sc_fxcast_switch &cast_sw, \
1111 sc_fxnum_fast_observer *observer_) : \
1112 sc_fxnum_fast(a, sc_fxtype_params(a.type_params(), wl_, iwl_), SC_US_, \
1113 cast_sw, observer_) \
1114{} \
1115 \
1116inline sc_ufix_fast::sc_ufix_fast(tp a, sc_q_mode qm, sc_o_mode om, \
1117 const sc_fxcast_switch &cast_sw, \
1118 sc_fxnum_fast_observer *observer_) : \
1119 sc_fxnum_fast(a, sc_fxtype_params(a.type_params(), qm, om), SC_US_, \
1120 cast_sw, observer_) \
1121{} \
1122 \
1123inline sc_ufix_fast::sc_ufix_fast(tp a, sc_q_mode qm, sc_o_mode om, int nb, \
1124 const sc_fxcast_switch &cast_sw, \
1125 sc_fxnum_fast_observer *observer_) : \
1126 sc_fxnum_fast(a, sc_fxtype_params(a.type_params(), qm, om, nb), SC_US_, \
1127 cast_sw, observer_) \
1128{} \
1129 \
1130inline sc_ufix_fast::sc_ufix_fast( \
1131 tp a, int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, \
1132 const sc_fxcast_switch &cast_sw, sc_fxnum_fast_observer *observer_) : \
1133 sc_fxnum_fast(a, sc_fxtype_params(wl_, iwl_, qm, om), SC_US_, cast_sw, \
1134 observer_) \
1135{} \
1136 \
1137inline sc_ufix_fast::sc_ufix_fast( \
1138 tp a, int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb, \
1139 const sc_fxcast_switch &cast_sw, sc_fxnum_fast_observer *observer_) : \
1140 sc_fxnum_fast(a, sc_fxtype_params(wl_, iwl_, qm, om, nb), SC_US_, \
1141 cast_sw, observer_) \
1142{} \
1143 \
1144inline sc_ufix_fast::sc_ufix_fast(tp a, const sc_fxtype_params &type_params_, \
1145 sc_fxnum_fast_observer *observer_) : \
1146 sc_fxnum_fast(a, type_params_, SC_US_, sc_fxcast_switch(), observer_) \
1147{} \
1148 \
1149inline sc_ufix_fast::sc_ufix_fast(tp a, const sc_fxtype_params &type_params_, \
1150 const sc_fxcast_switch &cast_sw, \
1151 sc_fxnum_fast_observer* observer_) : \
1152 sc_fxnum_fast(a, type_params_, SC_US_, cast_sw, observer_) \
1153{}
1154
1155DEFN_CTORS_T_A(int)
1156DEFN_CTORS_T_A(unsigned int)
1157DEFN_CTORS_T_A(long)
1158DEFN_CTORS_T_A(unsigned long)
1159DEFN_CTORS_T_A(float)
1160DEFN_CTORS_T_A(double)
1161DEFN_CTORS_T_A(const char *)
1162DEFN_CTORS_T_A(const sc_fxval &)
1164DEFN_CTORS_T_B(const sc_fxnum &)
1166
1173
1174#undef DEFN_CTORS_T_A
1175#undef DEFN_CTORS_T_B
1176
1177// copy constructor
1179 sc_fxnum_fast(a, a.type_params(), SC_US_, sc_fxcast_switch(), 0)
1180{}
1181
1182// unary bitwise operators
1183inline const sc_ufix_fast
1185{
1187 int iwl_c = iwl();
1188 int wl_c = wl();
1189 sc_ufix_fast c(wl_c, iwl_c);
1190 for (int i = iwl_c - wl_c; i < iwl_c; ++i)
1191 c.set_bit(i, !get_bit(i));
1192 return sc_ufix_fast(c, wl_c, iwl_c);
1193}
1194
1195// unary bitwise functions
1196inline void
1198{
1200 int iwl_c = c.iwl();
1201 for (int i = iwl_c - c.wl(); i < iwl_c; ++i)
1202 c.set_bit(i, !a.get_bit(i));
1203 c.cast();
1205}
1206
1207// binary bitwise operators
1208#define DEFN_BIN_OP_T(op, op2, tp1, tp2) \
1209inline const sc_ufix_fast \
1210operator op (const tp1 &a, const tp2 &b) \
1211{ \
1212 a.observer_read(); \
1213 b.observer_read(); \
1214 int iwl_a = a.iwl(); \
1215 int iwl_b = b.iwl(); \
1216 int iwl_c = sc_max(iwl_a, iwl_b); \
1217 int fwl_c = sc_max(a.wl() - iwl_a, b.wl() - iwl_b); \
1218 sc_ufix_fast c(iwl_c + fwl_c, iwl_c); \
1219 for (int i = -fwl_c; i < iwl_c; ++i) \
1220 c.set_bit(i, a.get_bit(i) op2 b.get_bit(i)); \
1221 return sc_ufix_fast(c, iwl_c + fwl_c, iwl_c); \
1222}
1223
1227
1228#undef DEFN_BIN_OP_T
1229
1230// binary bitwise functions
1231#define DEFN_BIN_FNC_T(fnc, op2, tp1, tp2) \
1232inline void \
1233fnc (sc_ufix_fast &c, const tp1 &a, const tp2 &b) \
1234{ \
1235 a.observer_read(); \
1236 b.observer_read(); \
1237 int iwl_c = c.iwl(); \
1238 for (int i = iwl_c - c.wl(); i < iwl_c; ++i) \
1239 c.set_bit(i, a.get_bit(i) op2 b.get_bit(i)); \
1240 c.cast(); \
1241 SC_FXNUM_FAST_OBSERVER_WRITE_(c) \
1242}
1243
1247
1248#undef DEFN_BIN_FNC_T
1249
1250// assignment operators
1251inline sc_ufix_fast &
1253{
1254 sc_fxnum_fast::operator = (a);
1255 return *this;
1256}
1257
1258#define DEFN_ASN_OP_T(op, tp) \
1259inline sc_ufix_fast & \
1260sc_ufix_fast::operator op (tp a) \
1261{ \
1262 sc_fxnum_fast::operator op(a); \
1263 return *this; \
1264}
1265
1266#define DEFN_ASN_OP_OTHER(op) \
1267DEFN_ASN_OP_T(op, int64) \
1268DEFN_ASN_OP_T(op, uint64) \
1269DEFN_ASN_OP_T(op, const sc_int_base &) \
1270DEFN_ASN_OP_T(op, const sc_uint_base &) \
1271DEFN_ASN_OP_T(op, const sc_signed &) \
1272DEFN_ASN_OP_T(op, const sc_unsigned &)
1273
1274#define DEFN_ASN_OP(op) \
1275DEFN_ASN_OP_T(op, int) \
1276DEFN_ASN_OP_T(op, unsigned int) \
1277DEFN_ASN_OP_T(op, long) \
1278DEFN_ASN_OP_T(op, unsigned long) \
1279DEFN_ASN_OP_T(op, float) \
1280DEFN_ASN_OP_T(op, double) \
1281DEFN_ASN_OP_T(op, const char *) \
1282DEFN_ASN_OP_T(op, const sc_fxval &) \
1283DEFN_ASN_OP_T(op, const sc_fxval_fast &) \
1284DEFN_ASN_OP_T(op, const sc_fxnum &) \
1285DEFN_ASN_OP_T(op, const sc_fxnum_fast &) \
1286DEFN_ASN_OP_OTHER(op)
1287
1288DEFN_ASN_OP(=)
1289
1290DEFN_ASN_OP(*=)
1291DEFN_ASN_OP(/=)
1292DEFN_ASN_OP(+=)
1293DEFN_ASN_OP(-=)
1294
1295DEFN_ASN_OP_T(<<=, int)
1296DEFN_ASN_OP_T(>>=, int)
1297
1298#undef DEFN_ASN_OP_T
1299#undef DEFN_ASN_OP_OTHER
1300#undef DEFN_ASN_OP
1301
1302#define DEFN_ASN_OP_T(op, op2, tp) \
1303inline sc_ufix_fast & \
1304sc_ufix_fast::operator op (const tp &b) \
1305{ \
1306 SC_FXNUM_FAST_OBSERVER_READ_(*this) \
1307 b.observer_read(); \
1308 int iwl_c = iwl(); \
1309 for (int i = iwl_c - wl(); i < iwl_c; ++i) \
1310 set_bit(i, get_bit(i) op2 b.get_bit(i)); \
1311 cast(); \
1312 SC_FXNUM_FAST_OBSERVER_WRITE_(*this) \
1313 return *this; \
1314}
1315
1316DEFN_ASN_OP_T(&=, &&, sc_ufix)
1318DEFN_ASN_OP_T(|=, ||, sc_ufix)
1320DEFN_ASN_OP_T(^=, !=, sc_ufix)
1322
1323#undef DEFN_ASN_OP_T
1324
1325// auto-increment and auto-decrement
1326inline const sc_fxval_fast
1328{
1329 return sc_fxval_fast(sc_fxnum_fast::operator ++ (0));
1330}
1331
1332inline const sc_fxval_fast
1334{
1335 return sc_fxval_fast(sc_fxnum_fast::operator -- (0));
1336}
1337
1338inline sc_ufix_fast &
1340{
1342 return *this;
1343}
1344
1345inline sc_ufix_fast &
1347{
1349 return *this;
1350}
1351
1352} // namespace sc_dt
1353
1354#endif // __SYSTEMC_EXT_DT_FX_SC_UFIX_HH__
sc_fxnum_fast & operator--()
Definition sc_fxnum.hh:3764
sc_fxnum_fast & operator++()
Definition sc_fxnum.hh:3754
friend class sc_fxval_fast
Definition sc_fxnum.hh:846
bool get_bit(int) const
Definition sc_fxnum.cc:706
int iwl() const
Definition sc_fxnum.hh:3043
bool get_bit(int) const
Definition sc_fxnum.hh:3087
int wl() const
Definition sc_fxnum.hh:3037
friend class sc_fxval
Definition sc_fxnum.hh:485
sc_fxnum & operator--()
Definition sc_fxnum.hh:2812
sc_fxnum & operator++()
Definition sc_fxnum.hh:2805
friend const sc_ufix_fast operator&(const sc_ufix_fast &, const sc_ufix_fast &)
friend void b_and(sc_ufix_fast &, const sc_ufix_fast &, const sc_ufix_fast &)
friend void b_not(sc_ufix_fast &, const sc_ufix_fast &)
Definition sc_ufix.hh:1197
sc_ufix_fast & operator--()
Definition sc_ufix.hh:1346
friend void b_xor(sc_ufix_fast &, const sc_ufix_fast &, const sc_ufix_fast &)
sc_ufix_fast(sc_fxnum_fast_observer *=0)
Definition sc_ufix.hh:892
friend void b_or(sc_ufix_fast &, const sc_ufix_fast &, const sc_ufix_fast &)
friend const sc_ufix_fast operator|(const sc_ufix_fast &, const sc_ufix_fast &)
sc_ufix_fast & operator=(const sc_ufix_fast &)
Definition sc_ufix.hh:1252
sc_ufix_fast & operator++()
Definition sc_ufix.hh:1339
const sc_ufix_fast operator~() const
Definition sc_ufix.hh:1184
friend const sc_ufix_fast operator^(const sc_ufix_fast &, const sc_ufix_fast &)
friend void b_xor(sc_ufix &, const sc_ufix_fast &, const sc_ufix &)
sc_ufix & operator--()
Definition sc_ufix.hh:877
friend void b_xor(sc_ufix &, const sc_ufix &, const sc_ufix &)
friend void b_and(sc_ufix &, const sc_ufix &, const sc_ufix &)
friend void b_and(sc_ufix &, const sc_ufix &, const sc_ufix_fast &)
friend const sc_ufix operator&(const sc_ufix &, const sc_ufix &)
friend void b_and(sc_ufix &, const sc_ufix_fast &, const sc_ufix &)
const sc_ufix operator~() const
Definition sc_ufix.hh:698
friend const sc_ufix operator^(const sc_ufix &, const sc_ufix &)
friend const sc_ufix operator|(const sc_ufix &, const sc_ufix &)
friend void b_or(sc_ufix &, const sc_ufix_fast &, const sc_ufix &)
sc_ufix & operator=(const sc_ufix &)
Definition sc_ufix.hh:782
friend void b_or(sc_ufix &, const sc_ufix &, const sc_ufix &)
friend void b_xor(sc_ufix &, const sc_ufix &, const sc_ufix_fast &)
friend void b_or(sc_ufix &, const sc_ufix &, const sc_ufix_fast &)
sc_ufix(sc_fxnum_observer *=0)
Definition sc_ufix.hh:416
sc_ufix & operator++()
Definition sc_ufix.hh:870
friend void b_not(sc_ufix &, const sc_ufix &)
Definition sc_ufix.hh:711
#define sc_fxval
Definition sc_fxnum.hh:485
#define sc_ufix
SwitchingFiber c
SwitchingFiber a
@ SC_US_
Definition sc_fxdefs.hh:73
uint64_t uint64
Definition sc_nbdefs.hh:172
const sc_bit b_xor(const sc_bit &a, const sc_bit &b)
Definition sc_bit.hh:330
const sc_bit b_and(const sc_bit &a, const sc_bit &b)
Definition sc_bit.hh:328
const sc_bit b_not(const sc_bit &a)
Definition sc_bit.hh:298
int64_t int64
Definition sc_nbdefs.hh:171
const sc_bit b_or(const sc_bit &a, const sc_bit &b)
Definition sc_bit.hh:329
#define DEFN_ASN_OP(op)
Definition sc_bit.hh:164
#define DEFN_ASN_OP_T(op, tp)
Definition sc_bit.hh:162
#define DECL_CTORS_T_A(tp)
Definition sc_fix.hh:113
#define DEFN_CTORS_T_B(tp)
Definition sc_fix.hh:572
#define DECL_CTORS_T_B(tp)
Definition sc_fix.hh:117
#define DEFN_CTORS_T_A(tp)
Definition sc_fix.hh:488
#define DEFN_BIN_FNC_T(fnc, op2, tp1, tp2)
Definition sc_fix.hh:741
#define DECL_ASN_OP_T(op, tp)
Definition sc_fix.hh:178
#define DECL_ASN_OP(op)
Definition sc_fix.hh:188
#define SC_FXNUM_OBSERVER_WRITE_(object)
#define SC_FXNUM_OBSERVER_READ_(object)
#define SC_FXNUM_FAST_OBSERVER_WRITE_(object)
#define SC_FXNUM_FAST_OBSERVER_READ_(object)
#define DEFN_BIN_OP_T(ret, op, tp)
Definition sc_logic.hh:308

Generated on Tue Jun 18 2024 16:24:06 for gem5 by doxygen 1.11.0