sc_ufix.hh revision 12853
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);
75    sc_ufix(sc_q_mode, sc_o_mode, sc_fxnum_observer * =0);
76    sc_ufix(sc_q_mode, sc_o_mode, int, sc_fxnum_observer * =0);
77    sc_ufix(int, int, sc_q_mode, sc_o_mode, 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);
81    sc_ufix(sc_q_mode, sc_o_mode, const sc_fxcast_switch &,
82            sc_fxnum_observer * =0);
83    sc_ufix(sc_q_mode, sc_o_mode, int, const sc_fxcast_switch &,
84            sc_fxnum_observer * =0);
85    sc_ufix(int, int, sc_q_mode, sc_o_mode, const sc_fxcast_switch &,
86            sc_fxnum_observer * =0);
87    sc_ufix(int, int, sc_q_mode, sc_o_mode, int, const sc_fxcast_switch &,
88            sc_fxnum_observer * =0);
89    explicit sc_ufix(const sc_fxtype_params &, sc_fxnum_observer * =0);
90    sc_ufix(const sc_fxtype_params &, const sc_fxcast_switch &,
91            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
227    sc_ufix& operator ++ ();
228    sc_ufix& operator -- ();
229};
230
231
232// ----------------------------------------------------------------------------
233//  CLASS : sc_ufix_fast
234//
235//  "Unconstrained" unsigned fixed-point class; limited precision.
236// ----------------------------------------------------------------------------
237
238class sc_ufix_fast : public sc_fxnum_fast
239{
240  public:
241    // constructors
242    explicit sc_ufix_fast(sc_fxnum_fast_observer * =0);
243    sc_ufix_fast(int, int, sc_fxnum_fast_observer * =0);
244    sc_ufix_fast(sc_q_mode, sc_o_mode, sc_fxnum_fast_observer * =0);
245    sc_ufix_fast(sc_q_mode, sc_o_mode, int, sc_fxnum_fast_observer * =0);
246    sc_ufix_fast(int, int, sc_q_mode, sc_o_mode, sc_fxnum_fast_observer * =0);
247    sc_ufix_fast(int, int, sc_q_mode, sc_o_mode, int,
248                 sc_fxnum_fast_observer * =0);
249    explicit sc_ufix_fast(const sc_fxcast_switch &,
250                          sc_fxnum_fast_observer * =0);
251    sc_ufix_fast(int, int, const sc_fxcast_switch &,
252                 sc_fxnum_fast_observer * =0);
253    sc_ufix_fast(sc_q_mode, sc_o_mode, const sc_fxcast_switch &,
254                 sc_fxnum_fast_observer * =0);
255    sc_ufix_fast(sc_q_mode, sc_o_mode, int, const sc_fxcast_switch&,
256                 sc_fxnum_fast_observer * =0);
257    sc_ufix_fast(int, int, sc_q_mode, sc_o_mode, const sc_fxcast_switch &,
258                 sc_fxnum_fast_observer * =0);
259    sc_ufix_fast(int, int, sc_q_mode, sc_o_mode, int, const sc_fxcast_switch &,
260                 sc_fxnum_fast_observer * =0);
261    explicit sc_ufix_fast(const sc_fxtype_params &,
262                          sc_fxnum_fast_observer * =0);
263    sc_ufix_fast(const sc_fxtype_params &, const sc_fxcast_switch &,
264                 sc_fxnum_fast_observer * =0);
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 &)
305    DECL_CTORS_T_A(const sc_fxval_fast &)
306    DECL_CTORS_T_A(const sc_fxnum &)
307    DECL_CTORS_T_A(const sc_fxnum_fast &)
308
309    DECL_CTORS_T_B(int64)
310    DECL_CTORS_T_B(uint64)
311    DECL_CTORS_T_B(const sc_int_base &)
312    DECL_CTORS_T_B(const sc_uint_base &)
313    DECL_CTORS_T_B(const sc_signed &)
314    DECL_CTORS_T_B(const sc_unsigned &)
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
332    friend const sc_ufix_fast operator & (const sc_ufix_fast &,
333                                          const sc_ufix_fast &);
334    friend const sc_ufix_fast operator ^ (const sc_ufix_fast &,
335                                          const sc_ufix_fast &);
336    friend const sc_ufix_fast operator | (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
350    sc_ufix_fast &operator = (const sc_ufix_fast &);
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
401    sc_ufix_fast &operator ++ ();
402    sc_ufix_fast &operator -- ();
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
416inline sc_ufix::sc_ufix(sc_fxnum_observer *observer_) :
417        sc_fxnum(sc_fxtype_params(), SC_US_, sc_fxcast_switch(), observer_)
418{}
419
420inline sc_ufix::sc_ufix(int wl_, int iwl_, sc_fxnum_observer *observer_ ) :
421        sc_fxnum(sc_fxtype_params(wl_, iwl_), SC_US_, sc_fxcast_switch(),
422                 observer_)
423{}
424
425inline sc_ufix::sc_ufix(sc_q_mode qm, sc_o_mode om,
426                        sc_fxnum_observer *observer_) :
427        sc_fxnum(sc_fxtype_params(qm, om), SC_US_, sc_fxcast_switch(),
428                 observer_)
429{}
430
431inline
432sc_ufix::sc_ufix(sc_q_mode qm, sc_o_mode om, int nb,
433                 sc_fxnum_observer *observer_) :
434        sc_fxnum(sc_fxtype_params(qm, om, nb), SC_US_, sc_fxcast_switch(),
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
460inline sc_ufix::sc_ufix(sc_q_mode qm, sc_o_mode om,
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
466inline sc_ufix::sc_ufix(sc_q_mode qm, sc_o_mode om, int nb,
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
668DEFN_CTORS_T_A(int)
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 *)
675DEFN_CTORS_T_A(const sc_fxval &)
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
698sc_ufix::operator ~ () const
699{
700    SC_FXNUM_OBSERVER_READ_(*this)
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
711b_not(sc_ufix &c, const sc_ufix &a)
712{
713    SC_FXNUM_OBSERVER_READ_(a)
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();
718    SC_FXNUM_OBSERVER_WRITE_(c)
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
738DEFN_BIN_OP_T(&, &&, sc_ufix, sc_ufix)
739DEFN_BIN_OP_T(&, &&, sc_ufix, sc_ufix_fast)
740DEFN_BIN_OP_T(&, &&, sc_ufix_fast, sc_ufix)
741
742DEFN_BIN_OP_T(|, ||, sc_ufix, sc_ufix)
743DEFN_BIN_OP_T(|, ||, sc_ufix, sc_ufix_fast)
744DEFN_BIN_OP_T(|, ||, sc_ufix_fast, sc_ufix)
745
746DEFN_BIN_OP_T(^, !=, sc_ufix, sc_ufix)
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
766DEFN_BIN_FNC_T(b_and, &&, sc_ufix, sc_ufix)
767DEFN_BIN_FNC_T(b_and, &&, sc_ufix, sc_ufix_fast)
768DEFN_BIN_FNC_T(b_and, &&, sc_ufix_fast, sc_ufix)
769
770DEFN_BIN_FNC_T(b_or, ||, sc_ufix, sc_ufix)
771DEFN_BIN_FNC_T(b_or, ||, sc_ufix, sc_ufix_fast)
772DEFN_BIN_FNC_T(b_or, ||, sc_ufix_fast, sc_ufix)
773
774DEFN_BIN_FNC_T(b_xor, !=, sc_ufix, sc_ufix)
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 &
782sc_ufix::operator = (const sc_ufix &a)
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
818DEFN_ASN_OP(=)
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
858sc_ufix::operator ++ (int)
859{
860    return sc_fxval(sc_fxnum::operator ++ (0));
861}
862
863inline const sc_fxval
864sc_ufix::operator -- (int)
865{
866    return sc_fxval(sc_fxnum::operator -- (0));
867}
868
869inline sc_ufix &
870sc_ufix::operator ++ ()
871{
872    sc_fxnum::operator ++ ();
873    return *this;
874}
875
876inline sc_ufix &
877sc_ufix::operator -- ()
878{
879    sc_fxnum::operator -- ();
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
892inline sc_ufix_fast::sc_ufix_fast(sc_fxnum_fast_observer *observer_) :
893        sc_fxnum_fast(sc_fxtype_params(), SC_US_, sc_fxcast_switch(),
894                      observer_)
895{}
896
897inline sc_ufix_fast::sc_ufix_fast(int wl_, int iwl_,
898                                  sc_fxnum_fast_observer *observer_) :
899        sc_fxnum_fast(sc_fxtype_params(wl_, iwl_), SC_US_, sc_fxcast_switch(),
900                      observer_ )
901{}
902
903inline sc_ufix_fast::sc_ufix_fast(sc_q_mode qm, sc_o_mode om,
904                                  sc_fxnum_fast_observer *observer_) :
905        sc_fxnum_fast(sc_fxtype_params(qm, om), SC_US_, sc_fxcast_switch(),
906                      observer_ )
907{}
908
909inline sc_ufix_fast::sc_ufix_fast(sc_q_mode qm, sc_o_mode om, int nb,
910                                  sc_fxnum_fast_observer *observer_) :
911        sc_fxnum_fast(sc_fxtype_params(qm, om, nb), SC_US_, sc_fxcast_switch(),
912                      observer_ )
913{}
914
915inline sc_ufix_fast::sc_ufix_fast(
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
922inline sc_ufix_fast::sc_ufix_fast(
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
929inline sc_ufix_fast::sc_ufix_fast(const sc_fxcast_switch &cast_sw,
930                                  sc_fxnum_fast_observer *observer_) :
931        sc_fxnum_fast(sc_fxtype_params(), SC_US_, cast_sw, observer_)
932{}
933
934inline sc_ufix_fast::sc_ufix_fast(
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
940inline sc_ufix_fast::sc_ufix_fast(
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
946inline sc_ufix_fast::sc_ufix_fast(
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
952inline sc_ufix_fast::sc_ufix_fast(
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
959inline sc_ufix_fast::sc_ufix_fast(
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
966inline sc_ufix_fast::sc_ufix_fast(const sc_fxtype_params &type_params_,
967                                  sc_fxnum_fast_observer *observer_) :
968    sc_fxnum_fast(type_params_, SC_US_, sc_fxcast_switch(), observer_)
969{}
970
971inline sc_ufix_fast::sc_ufix_fast(const sc_fxtype_params &type_params_,
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 &)
1163DEFN_CTORS_T_A(const sc_fxval_fast &)
1164DEFN_CTORS_T_B(const sc_fxnum &)
1165DEFN_CTORS_T_B(const sc_fxnum_fast &)
1166
1167DEFN_CTORS_T_A(int64)
1168DEFN_CTORS_T_A(uint64)
1169DEFN_CTORS_T_A(const sc_int_base &)
1170DEFN_CTORS_T_A(const sc_uint_base &)
1171DEFN_CTORS_T_A(const sc_signed &)
1172DEFN_CTORS_T_A(const sc_unsigned &)
1173
1174#undef DEFN_CTORS_T_A
1175#undef DEFN_CTORS_T_B
1176
1177// copy constructor
1178inline sc_ufix_fast::sc_ufix_fast(const sc_ufix_fast &a) :
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
1184sc_ufix_fast::operator ~ () const
1185{
1186    SC_FXNUM_FAST_OBSERVER_READ_(*this)
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
1197b_not(sc_ufix_fast &c, const sc_ufix_fast &a)
1198{
1199    SC_FXNUM_FAST_OBSERVER_READ_(a)
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();
1204    SC_FXNUM_FAST_OBSERVER_WRITE_(c)
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
1224DEFN_BIN_OP_T(&, &&, sc_ufix_fast, sc_ufix_fast)
1225DEFN_BIN_OP_T(|, ||, sc_ufix_fast, sc_ufix_fast)
1226DEFN_BIN_OP_T(^, !=, sc_ufix_fast, sc_ufix_fast)
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
1244DEFN_BIN_FNC_T(b_and, &&, sc_ufix_fast, sc_ufix_fast)
1245DEFN_BIN_FNC_T(b_or, ||, sc_ufix_fast, sc_ufix_fast)
1246DEFN_BIN_FNC_T(b_xor, !=, sc_ufix_fast, sc_ufix_fast)
1247
1248#undef DEFN_BIN_FNC_T
1249
1250// assignment operators
1251inline sc_ufix_fast &
1252sc_ufix_fast::operator = (const sc_ufix_fast &a)
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)
1317DEFN_ASN_OP_T(&=, &&, sc_ufix_fast)
1318DEFN_ASN_OP_T(|=, ||, sc_ufix)
1319DEFN_ASN_OP_T(|=, ||, sc_ufix_fast)
1320DEFN_ASN_OP_T(^=, !=, sc_ufix)
1321DEFN_ASN_OP_T(^=, !=, sc_ufix_fast)
1322
1323#undef DEFN_ASN_OP_T
1324
1325// auto-increment and auto-decrement
1326inline const sc_fxval_fast
1327sc_ufix_fast::operator ++ (int)
1328{
1329    return sc_fxval_fast(sc_fxnum_fast::operator ++ (0));
1330}
1331
1332inline const sc_fxval_fast
1333sc_ufix_fast::operator -- (int)
1334{
1335    return sc_fxval_fast(sc_fxnum_fast::operator -- (0));
1336}
1337
1338inline sc_ufix_fast &
1339sc_ufix_fast::operator ++ ()
1340{
1341    sc_fxnum_fast::operator ++ ();
1342    return *this;
1343}
1344
1345inline sc_ufix_fast &
1346sc_ufix_fast::operator -- ()
1347{
1348    sc_fxnum_fast::operator -- ();
1349    return *this;
1350}
1351
1352} // namespace sc_dt
1353
1354#endif // __SYSTEMC_EXT_DT_FX_SC_UFIX_HH__
1355