sc_ufixed.hh revision 12853:e23d6f09069a
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_ufixed.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_ufixed.h,v $
39// Revision 1.2  2011/01/19 18:57:40  acg
40//  Andy Goodrich: changes for IEEE_1666_2011.
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_UFIXED_HH__
51#define __SYSTEMC_EXT_DT_FX_SC_UFIXED_HH__
52
53#include "sc_ufix.hh"
54
55namespace sc_dt
56{
57
58// classes defined in this module
59template <int W, int I, sc_q_mode Q, sc_o_mode O, int N>
60class sc_ufixed;
61template <int W, int I, sc_q_mode Q, sc_o_mode O, int N>
62class sc_ufixed_fast;
63
64
65// ----------------------------------------------------------------------------
66//  TEMPLATE CLASS : sc_ufixed
67//
68//  "Constrained" unsigned fixed-point class; arbitrary precision.
69// ----------------------------------------------------------------------------
70
71template <int W, int I,
72          sc_q_mode Q=SC_DEFAULT_Q_MODE_,
73          sc_o_mode O=SC_DEFAULT_O_MODE_, int N=SC_DEFAULT_N_BITS_>
74class sc_ufixed : public sc_ufix
75{
76  public:
77    // constructors
78    explicit sc_ufixed(sc_fxnum_observer * =0);
79    explicit sc_ufixed(const sc_fxcast_switch &, sc_fxnum_observer * =0);
80
81#define DECL_CTORS_T_A(tp) \
82    sc_ufixed(tp, sc_fxnum_observer * =0); \
83    sc_ufixed(tp, const sc_fxcast_switch &, sc_fxnum_observer * =0);
84
85#define DECL_CTORS_T_B(tp) \
86    explicit sc_ufixed(tp, sc_fxnum_observer * =0); \
87    sc_ufixed(tp, const sc_fxcast_switch &, sc_fxnum_observer * =0);
88
89    DECL_CTORS_T_A(int)
90    DECL_CTORS_T_A(unsigned int)
91    DECL_CTORS_T_A(long)
92    DECL_CTORS_T_A(unsigned long)
93    DECL_CTORS_T_A(float)
94    DECL_CTORS_T_A(double)
95    DECL_CTORS_T_A(const char *)
96    DECL_CTORS_T_A(const sc_fxval &)
97    DECL_CTORS_T_A(const sc_fxval_fast &)
98    DECL_CTORS_T_A(const sc_fxnum &)
99    DECL_CTORS_T_A(const sc_fxnum_fast &)
100
101    DECL_CTORS_T_B(int64)
102    DECL_CTORS_T_B(uint64)
103    DECL_CTORS_T_B(const sc_int_base &)
104    DECL_CTORS_T_B(const sc_uint_base &)
105    DECL_CTORS_T_B(const sc_signed &)
106    DECL_CTORS_T_B(const sc_unsigned &)
107
108#undef DECL_CTORS_T_A
109#undef DECL_CTORS_T_B
110    // copy constructor
111    sc_ufixed(const sc_ufixed<W, I, Q, O, N> &);
112
113    // assignment operators
114    sc_ufixed &operator = (const sc_ufixed<W, I, Q, O, N> &);
115
116#define DECL_ASN_OP_T(op,tp) sc_ufixed &operator op (tp);
117
118#define DECL_ASN_OP_OTHER(op) \
119    DECL_ASN_OP_T(op, int64) \
120    DECL_ASN_OP_T(op, uint64) \
121    DECL_ASN_OP_T(op, const sc_int_base &) \
122    DECL_ASN_OP_T(op, const sc_uint_base &) \
123    DECL_ASN_OP_T(op, const sc_signed &) \
124    DECL_ASN_OP_T(op, const sc_unsigned &)
125
126#define DECL_ASN_OP(op) \
127    DECL_ASN_OP_T(op, int) \
128    DECL_ASN_OP_T(op, unsigned int) \
129    DECL_ASN_OP_T(op, long) \
130    DECL_ASN_OP_T(op, unsigned long) \
131    DECL_ASN_OP_T(op, float) \
132    DECL_ASN_OP_T(op, double) \
133    DECL_ASN_OP_T(op, const char *) \
134    DECL_ASN_OP_T(op, const sc_fxval &) \
135    DECL_ASN_OP_T(op, const sc_fxval_fast &) \
136    DECL_ASN_OP_T(op, const sc_fxnum &) \
137    DECL_ASN_OP_T(op, const sc_fxnum_fast &) \
138    DECL_ASN_OP_OTHER(op)
139
140    DECL_ASN_OP(=)
141
142    DECL_ASN_OP(*=)
143    DECL_ASN_OP(/=)
144    DECL_ASN_OP(+=)
145    DECL_ASN_OP(-=)
146
147    DECL_ASN_OP_T(<<=, int)
148    DECL_ASN_OP_T(>>=, int)
149
150    DECL_ASN_OP_T(&=, const sc_ufix &)
151    DECL_ASN_OP_T(&=, const sc_ufix_fast &)
152    DECL_ASN_OP_T(|=, const sc_ufix &)
153    DECL_ASN_OP_T(|=, const sc_ufix_fast &)
154    DECL_ASN_OP_T(^=, const sc_ufix &)
155    DECL_ASN_OP_T(^=, const sc_ufix_fast &)
156
157#undef DECL_ASN_OP_T
158#undef DECL_ASN_OP_OTHER
159#undef DECL_ASN_OP
160
161    // auto-increment and auto-decrement
162    const sc_fxval operator ++ (int);
163    const sc_fxval operator -- (int);
164
165    sc_ufixed &operator ++ ();
166    sc_ufixed &operator -- ();
167};
168
169
170// ----------------------------------------------------------------------------
171//  TEMPLATE CLASS : sc_ufixed_fast
172//
173//  "Constrained" unsigned fixed-point class; limited precision.
174// ----------------------------------------------------------------------------
175
176template <int W, int I,
177          sc_q_mode Q=SC_DEFAULT_Q_MODE_,
178          sc_o_mode O=SC_DEFAULT_O_MODE_, int N=SC_DEFAULT_N_BITS_>
179class sc_ufixed_fast : public sc_ufix_fast
180{
181  public:
182    // constructors
183    explicit sc_ufixed_fast(sc_fxnum_fast_observer * =0);
184    explicit sc_ufixed_fast(const sc_fxcast_switch &,
185                             sc_fxnum_fast_observer * =0);
186
187#define DECL_CTORS_T_A(tp) \
188    sc_ufixed_fast(tp, sc_fxnum_fast_observer * =0); \
189    sc_ufixed_fast(tp, const sc_fxcast_switch &, sc_fxnum_fast_observer * =0);
190
191#define DECL_CTORS_T_B(tp) \
192    explicit sc_ufixed_fast(tp, sc_fxnum_fast_observer * =0); \
193    sc_ufixed_fast(tp, const sc_fxcast_switch &, sc_fxnum_fast_observer * =0);
194
195    DECL_CTORS_T_A(int)
196    DECL_CTORS_T_A(unsigned int)
197    DECL_CTORS_T_A(long)
198    DECL_CTORS_T_A(unsigned long)
199    DECL_CTORS_T_A(float)
200    DECL_CTORS_T_A(double)
201    DECL_CTORS_T_A(const char *)
202    DECL_CTORS_T_A(const sc_fxval &)
203    DECL_CTORS_T_A(const sc_fxval_fast &)
204    DECL_CTORS_T_A(const sc_fxnum &)
205    DECL_CTORS_T_A(const sc_fxnum_fast &)
206
207    DECL_CTORS_T_B(int64)
208    DECL_CTORS_T_B(uint64)
209    DECL_CTORS_T_B(const sc_int_base &)
210    DECL_CTORS_T_B(const sc_uint_base &)
211    DECL_CTORS_T_B(const sc_signed &)
212    DECL_CTORS_T_B(const sc_unsigned &)
213
214#undef DECL_CTORS_T_A
215#undef DECL_CTORS_T_B
216    // copy constructor
217    sc_ufixed_fast(const sc_ufixed_fast<W, I, Q, O, N> &);
218
219    // assignment operators
220    sc_ufixed_fast &operator = (const sc_ufixed_fast<W, I, Q, O, N> &);
221
222#define DECL_ASN_OP_T(op,tp) sc_ufixed_fast &operator op (tp);
223
224#define DECL_ASN_OP_OTHER(op) \
225    DECL_ASN_OP_T(op, int64) \
226    DECL_ASN_OP_T(op, uint64) \
227    DECL_ASN_OP_T(op, const sc_int_base &) \
228    DECL_ASN_OP_T(op, const sc_uint_base &) \
229    DECL_ASN_OP_T(op, const sc_signed &) \
230    DECL_ASN_OP_T(op, const sc_unsigned &)
231
232#define DECL_ASN_OP(op) \
233    DECL_ASN_OP_T(op, int) \
234    DECL_ASN_OP_T(op, unsigned int) \
235    DECL_ASN_OP_T(op, long) \
236    DECL_ASN_OP_T(op, unsigned long) \
237    DECL_ASN_OP_T(op, float) \
238    DECL_ASN_OP_T(op, double) \
239    DECL_ASN_OP_T(op, const char *) \
240    DECL_ASN_OP_T(op, const sc_fxval &) \
241    DECL_ASN_OP_T(op, const sc_fxval_fast &) \
242    DECL_ASN_OP_T(op, const sc_fxnum &) \
243    DECL_ASN_OP_T(op, const sc_fxnum_fast &) \
244    DECL_ASN_OP_OTHER(op)
245
246    DECL_ASN_OP(=)
247
248    DECL_ASN_OP(*=)
249    DECL_ASN_OP(/=)
250    DECL_ASN_OP(+=)
251    DECL_ASN_OP(-=)
252
253    DECL_ASN_OP_T(<<=, int)
254    DECL_ASN_OP_T(>>=, int)
255
256    DECL_ASN_OP_T(&=, const sc_ufix &)
257    DECL_ASN_OP_T(&=, const sc_ufix_fast &)
258    DECL_ASN_OP_T(|=, const sc_ufix &)
259    DECL_ASN_OP_T(|=, const sc_ufix_fast &)
260    DECL_ASN_OP_T(^=, const sc_ufix &)
261    DECL_ASN_OP_T(^=, const sc_ufix_fast &)
262
263#undef DECL_ASN_OP_T
264#undef DECL_ASN_OP_OTHER
265#undef DECL_ASN_OP
266
267    // auto-increment and auto-decrement
268    const sc_fxval_fast operator ++ (int);
269    const sc_fxval_fast operator -- (int);
270
271    sc_ufixed_fast& operator ++ ();
272    sc_ufixed_fast& operator -- ();
273};
274
275
276// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
277
278// ----------------------------------------------------------------------------
279//  TEMPLATE CLASS : sc_ufixed
280//
281//  "Constrained" unsigned fixed-point class; arbitrary precision.
282// ----------------------------------------------------------------------------
283
284template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
285inline sc_ufixed<W, I, Q, O, N>::sc_ufixed(sc_fxnum_observer *observer_) :
286        sc_ufix(W, I, Q, O, N, observer_)
287{}
288
289template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
290inline sc_ufixed<W, I, Q, O, N>::sc_ufixed(const sc_fxcast_switch &cast_sw,
291                                           sc_fxnum_observer *observer_) :
292        sc_ufix(W, I, Q, O, N, cast_sw, observer_)
293{}
294
295#define DEFN_CTORS_T(tp) \
296template<int W, int I, sc_q_mode Q, sc_o_mode O, int N> \
297inline sc_ufixed<W, I, Q, O, N>::sc_ufixed( \
298        tp a, sc_fxnum_observer *observer_) :\
299    sc_ufix(a, W, I, Q, O, N, observer_) \
300{} \
301 \
302template<int W, int I, sc_q_mode Q, sc_o_mode O, int N> \
303inline sc_ufixed<W, I, Q, O, N>::sc_ufixed( \
304        tp a, const sc_fxcast_switch &cast_sw, \
305        sc_fxnum_observer *observer_) : \
306    sc_ufix(a, W, I, Q, O, N, cast_sw, observer_) \
307{}
308
309DEFN_CTORS_T(int)
310DEFN_CTORS_T(unsigned int)
311DEFN_CTORS_T(long)
312DEFN_CTORS_T(unsigned long)
313DEFN_CTORS_T(float)
314DEFN_CTORS_T(double)
315DEFN_CTORS_T(const char *)
316DEFN_CTORS_T(const sc_fxval &)
317DEFN_CTORS_T(const sc_fxval_fast &)
318DEFN_CTORS_T(const sc_fxnum &)
319DEFN_CTORS_T(const sc_fxnum_fast &)
320
321DEFN_CTORS_T(int64)
322DEFN_CTORS_T(uint64)
323DEFN_CTORS_T(const sc_int_base &)
324DEFN_CTORS_T(const sc_uint_base &)
325DEFN_CTORS_T(const sc_signed &)
326DEFN_CTORS_T(const sc_unsigned &)
327
328#undef DEFN_CTORS_T
329
330// copy constructor
331template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
332inline sc_ufixed<W, I, Q, O, N>::sc_ufixed(const sc_ufixed<W, I, Q, O, N> &a) :
333        sc_ufix(a, W, I, Q, O, N)
334{}
335
336// assignment operators
337template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
338inline sc_ufixed<W, I, Q, O, N> &
339sc_ufixed<W, I, Q, O, N>::operator = (const sc_ufixed<W, I, Q, O, N> &a)
340{
341    sc_ufix::operator = (a);
342    return *this;
343}
344
345#define DEFN_ASN_OP_T(op,tp) \
346template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>                       \
347inline sc_ufixed<W, I, Q, O, N> & \
348sc_ufixed<W, I, Q, O, N>::operator op (tp a) \
349{ \
350    sc_ufix::operator op (a); \
351    return *this; \
352}
353
354#define DEFN_ASN_OP_OTHER(op) \
355DEFN_ASN_OP_T(op, int64) \
356DEFN_ASN_OP_T(op, uint64) \
357DEFN_ASN_OP_T(op, const sc_int_base &) \
358DEFN_ASN_OP_T(op, const sc_uint_base &) \
359DEFN_ASN_OP_T(op, const sc_signed &) \
360DEFN_ASN_OP_T(op, const sc_unsigned &)
361
362#define DEFN_ASN_OP(op) \
363DEFN_ASN_OP_T(op, int) \
364DEFN_ASN_OP_T(op, unsigned int) \
365DEFN_ASN_OP_T(op, long) \
366DEFN_ASN_OP_T(op, unsigned long) \
367DEFN_ASN_OP_T(op, float) \
368DEFN_ASN_OP_T(op, double) \
369DEFN_ASN_OP_T(op, const char *) \
370DEFN_ASN_OP_T(op, const sc_fxval &) \
371DEFN_ASN_OP_T(op, const sc_fxval_fast &) \
372DEFN_ASN_OP_T(op, const sc_fxnum &) \
373DEFN_ASN_OP_T(op, const sc_fxnum_fast &) \
374DEFN_ASN_OP_OTHER(op)
375
376DEFN_ASN_OP(=)
377
378DEFN_ASN_OP(*=)
379DEFN_ASN_OP(/=)
380DEFN_ASN_OP(+=)
381DEFN_ASN_OP(-=)
382
383DEFN_ASN_OP_T(<<=, int)
384DEFN_ASN_OP_T(>>=, int)
385
386DEFN_ASN_OP_T(&=, const sc_ufix &)
387DEFN_ASN_OP_T(&=, const sc_ufix_fast &)
388DEFN_ASN_OP_T(|=, const sc_ufix &)
389DEFN_ASN_OP_T(|=, const sc_ufix_fast &)
390DEFN_ASN_OP_T(^=, const sc_ufix &)
391DEFN_ASN_OP_T(^=, const sc_ufix_fast &)
392
393#undef DEFN_ASN_OP_T
394#undef DEFN_ASN_OP_OTHER
395#undef DEFN_ASN_OP
396
397// auto-increment and auto-decrement
398template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
399inline const sc_fxval
400sc_ufixed<W, I, Q, O, N>::operator ++ (int)
401{
402    return sc_fxval(sc_ufix::operator ++ (0));
403}
404
405template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
406inline const sc_fxval
407sc_ufixed<W, I, Q, O, N>::operator -- (int)
408{
409    return sc_fxval(sc_ufix::operator -- (0));
410}
411
412template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
413inline sc_ufixed<W, I, Q, O, N> &
414sc_ufixed<W, I, Q, O, N>::operator ++ ()
415{
416    sc_ufix::operator ++ ();
417    return *this;
418}
419
420template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
421inline sc_ufixed<W, I, Q, O, N> &
422sc_ufixed<W, I, Q, O, N>::operator -- ()
423{
424    sc_ufix::operator -- ();
425    return *this;
426}
427
428
429// ----------------------------------------------------------------------------
430//  TEMPLATE CLASS : sc_ufixed_fast
431//
432//  "Constrained" unsigned fixed-point class; limited precision.
433// ----------------------------------------------------------------------------
434
435template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
436inline sc_ufixed_fast<W, I, Q, O, N>::sc_ufixed_fast(
437        sc_fxnum_fast_observer *observer_) :
438    sc_ufix_fast(W, I, Q, O, N, observer_)
439{}
440
441template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
442inline sc_ufixed_fast<W, I, Q, O, N>::sc_ufixed_fast(
443        const sc_fxcast_switch &cast_sw,
444        sc_fxnum_fast_observer *observer_) :
445    sc_ufix_fast(W, I, Q, O, N, cast_sw, observer_)
446{}
447
448#define DEFN_CTORS_T(tp) \
449template<int W, int I, sc_q_mode Q, sc_o_mode O, int N> \
450inline sc_ufixed_fast<W, I, Q, O, N>::sc_ufixed_fast( \
451        tp a, sc_fxnum_fast_observer *observer_ ) : \
452    sc_ufix_fast(a, W, I, Q, O, N, observer_) \
453{} \
454 \
455template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>                       \
456inline sc_ufixed_fast<W, I, Q, O, N>::sc_ufixed_fast( \
457        tp a, const sc_fxcast_switch &cast_sw, \
458        sc_fxnum_fast_observer *observer_) : \
459    sc_ufix_fast(a, W, I, Q, O, N, cast_sw, observer_) \
460{}
461
462DEFN_CTORS_T(int)
463DEFN_CTORS_T(unsigned int)
464DEFN_CTORS_T(long)
465DEFN_CTORS_T(unsigned long)
466DEFN_CTORS_T(float)
467DEFN_CTORS_T(double)
468DEFN_CTORS_T(const char *)
469DEFN_CTORS_T(const sc_fxval &)
470DEFN_CTORS_T(const sc_fxval_fast &)
471DEFN_CTORS_T(const sc_fxnum &)
472DEFN_CTORS_T(const sc_fxnum_fast &)
473
474DEFN_CTORS_T(int64)
475DEFN_CTORS_T(uint64)
476DEFN_CTORS_T(const sc_int_base &)
477DEFN_CTORS_T(const sc_uint_base &)
478DEFN_CTORS_T(const sc_signed &)
479DEFN_CTORS_T(const sc_unsigned &)
480
481#undef DEFN_CTORS_T
482
483// copy constructor
484template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
485inline sc_ufixed_fast<W, I, Q, O, N>::sc_ufixed_fast(
486        const sc_ufixed_fast<W, I, Q, O, N> &a) :
487    sc_ufix_fast(a, W, I, Q, O, N)
488{}
489
490// assignment operators
491template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
492inline sc_ufixed_fast<W, I, Q, O, N> &
493sc_ufixed_fast<W, I, Q, O, N>::operator = (
494        const sc_ufixed_fast<W, I, Q, O, N> &a)
495{
496    sc_ufix_fast::operator = (a);
497    return *this;
498}
499
500#define DEFN_ASN_OP_T(op, tp) \
501template<int W, int I, sc_q_mode Q, sc_o_mode O, int N> \
502inline sc_ufixed_fast<W, I, Q, O, N> & \
503sc_ufixed_fast<W, I, Q, O, N>::operator op (tp a) \
504{ \
505    sc_ufix_fast::operator op (a); \
506    return *this; \
507}
508
509#define DEFN_ASN_OP_OTHER(op) \
510DEFN_ASN_OP_T(op, int64) \
511DEFN_ASN_OP_T(op, uint64) \
512DEFN_ASN_OP_T(op, const sc_int_base &) \
513DEFN_ASN_OP_T(op, const sc_uint_base &) \
514DEFN_ASN_OP_T(op, const sc_signed &) \
515DEFN_ASN_OP_T(op, const sc_unsigned &)
516
517#define DEFN_ASN_OP(op) \
518DEFN_ASN_OP_T(op, int) \
519DEFN_ASN_OP_T(op, unsigned int) \
520DEFN_ASN_OP_T(op, long) \
521DEFN_ASN_OP_T(op, unsigned long) \
522DEFN_ASN_OP_T(op, float) \
523DEFN_ASN_OP_T(op, double) \
524DEFN_ASN_OP_T(op, const char *) \
525DEFN_ASN_OP_T(op, const sc_fxval &) \
526DEFN_ASN_OP_T(op, const sc_fxval_fast &) \
527DEFN_ASN_OP_T(op, const sc_fxnum &) \
528DEFN_ASN_OP_T(op, const sc_fxnum_fast &) \
529DEFN_ASN_OP_OTHER(op)
530
531DEFN_ASN_OP(=)
532
533DEFN_ASN_OP(*=)
534DEFN_ASN_OP(/=)
535DEFN_ASN_OP(+=)
536DEFN_ASN_OP(-=)
537
538DEFN_ASN_OP_T(<<=, int)
539DEFN_ASN_OP_T(>>=, int)
540
541DEFN_ASN_OP_T(&=, const sc_ufix &)
542DEFN_ASN_OP_T(&=, const sc_ufix_fast &)
543DEFN_ASN_OP_T(|=, const sc_ufix &)
544DEFN_ASN_OP_T(|=, const sc_ufix_fast &)
545DEFN_ASN_OP_T(^=, const sc_ufix &)
546DEFN_ASN_OP_T(^=, const sc_ufix_fast &)
547
548#undef DEFN_ASN_OP_T
549#undef DEFN_ASN_OP_OTHER
550#undef DEFN_ASN_OP
551
552// auto-increment and auto-decrement
553template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
554inline const sc_fxval_fast
555sc_ufixed_fast<W, I, Q, O, N>::operator ++ (int)
556{
557    return sc_fxval_fast( sc_ufix_fast::operator ++ (0));
558}
559
560template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
561inline const sc_fxval_fast
562sc_ufixed_fast<W, I, Q, O, N>::operator -- (int)
563{
564    return sc_fxval_fast( sc_ufix_fast::operator -- (0));
565}
566
567template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
568inline sc_ufixed_fast<W, I, Q, O, N> &
569sc_ufixed_fast<W, I, Q, O, N>::operator ++ ()
570{
571    sc_ufix_fast::operator ++ ();
572    return *this;
573}
574
575template<int W, int I, sc_q_mode Q, sc_o_mode O, int N>
576inline sc_ufixed_fast<W, I, Q, O, N> &
577sc_ufixed_fast<W,I,Q,O,N>::operator -- ()
578{
579    sc_ufix_fast::operator -- ();
580    return *this;
581}
582
583} // namespace sc_dt
584
585#endif // __SYSTEMC_EXT_DT_FX_SC_UFIXED_HH__
586