sc_ufix.h revision 12027
12155SN/A/*****************************************************************************
22155SN/A
32155SN/A  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
42155SN/A  more contributor license agreements.  See the NOTICE file distributed
52155SN/A  with this work for additional information regarding copyright ownership.
62155SN/A  Accellera licenses this file to you under the Apache License, Version 2.0
72155SN/A  (the "License"); you may not use this file except in compliance with the
82155SN/A  License.  You may obtain a copy of the License at
92155SN/A
102155SN/A    http://www.apache.org/licenses/LICENSE-2.0
112155SN/A
122155SN/A  Unless required by applicable law or agreed to in writing, software
132155SN/A  distributed under the License is distributed on an "AS IS" BASIS,
142155SN/A  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
152155SN/A  implied.  See the License for the specific language governing
162155SN/A  permissions and limitations under the License.
172155SN/A
182155SN/A *****************************************************************************/
192155SN/A
202155SN/A/*****************************************************************************
212155SN/A
222155SN/A  sc_ufix.h -
232155SN/A
242155SN/A  Original Author: Martin Janssen, Synopsys, Inc.
252155SN/A
262155SN/A *****************************************************************************/
272155SN/A
282665Ssaidi@eecs.umich.edu/*****************************************************************************
292665Ssaidi@eecs.umich.edu
302155SN/A  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
314202Sbinkertn@umich.edu  changes you are making here.
322155SN/A
337768SAli.Saidi@ARM.com      Name, Affiliation, Date:
347768SAli.Saidi@ARM.com  Description of Modification:
357768SAli.Saidi@ARM.com
362178SN/A *****************************************************************************/
372178SN/A
382178SN/A// $Log: sc_ufix.h,v $
392178SN/A// Revision 1.2  2011/01/20 22:52:30  acg
402178SN/A//  Andy Goodrich: Add float constructors.
412178SN/A//
422178SN/A// Revision 1.1.1.1  2006/12/15 20:20:04  acg
432178SN/A// SystemC 2.3
442178SN/A//
452178SN/A// Revision 1.3  2006/01/13 18:53:58  acg
462178SN/A// Andy Goodrich: added $Log command so that CVS comments are reproduced in
472155SN/A// the source.
485865Sksewell@umich.edu//
496181Sksewell@umich.edu
506181Sksewell@umich.edu#ifndef SC_UFIX_H
515865Sksewell@umich.edu#define SC_UFIX_H
523918Ssaidi@eecs.umich.edu
535865Sksewell@umich.edu
542623SN/A#include "sysc/datatypes/fx/sc_fxnum.h"
553918Ssaidi@eecs.umich.edu
562155SN/A
572155SN/Anamespace sc_dt
582292SN/A{
596181Sksewell@umich.edu
606181Sksewell@umich.edu// classes defined in this module
613918Ssaidi@eecs.umich.educlass sc_ufix;
622292SN/Aclass sc_ufix_fast;
632292SN/A
642292SN/A
653918Ssaidi@eecs.umich.edu// ----------------------------------------------------------------------------
662292SN/A//  CLASS : sc_ufix
672292SN/A//
682766Sktlim@umich.edu//  "Unconstrained" unsigned fixed-point class; arbitrary precision.
692766Sktlim@umich.edu// ----------------------------------------------------------------------------
702766Sktlim@umich.edu
712921Sktlim@umich.educlass sc_ufix : public sc_fxnum
722921Sktlim@umich.edu{
732766Sktlim@umich.edu
742766Sktlim@umich.edupublic:
755529Snate@binkert.org
762766Sktlim@umich.edu    // constructors
774762Snate@binkert.org
782155SN/A    explicit sc_ufix( sc_fxnum_observer* = 0 );
792155SN/A             sc_ufix( int, int,
802155SN/A		      sc_fxnum_observer* = 0 );
812155SN/A             sc_ufix( sc_q_mode, sc_o_mode,
822155SN/A		      sc_fxnum_observer* = 0 );
832155SN/A             sc_ufix( sc_q_mode, sc_o_mode, int,
842766Sktlim@umich.edu		      sc_fxnum_observer* = 0 );
852155SN/A             sc_ufix( int, int, sc_q_mode, sc_o_mode,
865865Sksewell@umich.edu		      sc_fxnum_observer* = 0 );
872155SN/A             sc_ufix( int, int, sc_q_mode, sc_o_mode, int,
882155SN/A		      sc_fxnum_observer* = 0 );
892155SN/A    explicit sc_ufix( const sc_fxcast_switch&,
902155SN/A		      sc_fxnum_observer* = 0 );
912178SN/A             sc_ufix( int, int,
922178SN/A		      const sc_fxcast_switch&,
937756SAli.Saidi@ARM.com		      sc_fxnum_observer* = 0 );
942766Sktlim@umich.edu             sc_ufix( sc_q_mode, sc_o_mode,
952178SN/A		      const sc_fxcast_switch&,
962178SN/A		      sc_fxnum_observer* = 0 );
976994Snate@binkert.org             sc_ufix( sc_q_mode, sc_o_mode, int,
982178SN/A		      const sc_fxcast_switch&,
992766Sktlim@umich.edu		      sc_fxnum_observer* = 0 );
1002766Sktlim@umich.edu             sc_ufix( int, int, sc_q_mode, sc_o_mode,
1012766Sktlim@umich.edu		      const sc_fxcast_switch&,
1022788Sktlim@umich.edu		      sc_fxnum_observer* = 0 );
1032178SN/A             sc_ufix( int, int, sc_q_mode, sc_o_mode, int,
1042733Sktlim@umich.edu		      const sc_fxcast_switch&,
1052733Sktlim@umich.edu		      sc_fxnum_observer* = 0 );
1062817Sksewell@umich.edu    explicit sc_ufix( const sc_fxtype_params&,
1072733Sktlim@umich.edu		      sc_fxnum_observer* = 0 );
1084486Sbinkertn@umich.edu             sc_ufix( const sc_fxtype_params&,
1094486Sbinkertn@umich.edu		      const sc_fxcast_switch&,
1104776Sgblack@eecs.umich.edu		      sc_fxnum_observer* = 0 );
1114776Sgblack@eecs.umich.edu
1128739Sgblack@eecs.umich.edu#define DECL_CTORS_T(tp)                                                      \
1136365Sgblack@eecs.umich.edu             sc_ufix( tp,                                                     \
1144486Sbinkertn@umich.edu		      int, int,                                               \
1154202Sbinkertn@umich.edu		      sc_fxnum_observer* = 0 );                               \
1164202Sbinkertn@umich.edu             sc_ufix( tp,                                                     \
1174202Sbinkertn@umich.edu		      sc_q_mode, sc_o_mode,                                   \
1188541Sgblack@eecs.umich.edu		      sc_fxnum_observer* = 0 );                               \
1194202Sbinkertn@umich.edu             sc_ufix( tp,                                                     \
1204202Sbinkertn@umich.edu		      sc_q_mode, sc_o_mode, int,                              \
1214776Sgblack@eecs.umich.edu		      sc_fxnum_observer* = 0 );                               \
1228739Sgblack@eecs.umich.edu             sc_ufix( tp,                                                     \
1236365Sgblack@eecs.umich.edu		      int, int, sc_q_mode, sc_o_mode,                         \
1244202Sbinkertn@umich.edu		      sc_fxnum_observer* = 0 );                               \
1258777Sgblack@eecs.umich.edu             sc_ufix( tp,                                                     \
1264202Sbinkertn@umich.edu		      int, int, sc_q_mode, sc_o_mode, int,                    \
1274202Sbinkertn@umich.edu		      sc_fxnum_observer* = 0 );                               \
1284202Sbinkertn@umich.edu             sc_ufix( tp,                                                     \
1295217Ssaidi@eecs.umich.edu		      const sc_fxcast_switch&,                                \
1304202Sbinkertn@umich.edu		      sc_fxnum_observer* = 0 );                               \
1312155SN/A             sc_ufix( tp,                                                     \
1328793Sgblack@eecs.umich.edu		      int, int,                                               \
1338793Sgblack@eecs.umich.edu		      const sc_fxcast_switch&,                                \
1348793Sgblack@eecs.umich.edu		      sc_fxnum_observer* = 0 );                               \
1354776Sgblack@eecs.umich.edu             sc_ufix( tp,                                                     \
1362766Sktlim@umich.edu		      sc_q_mode, sc_o_mode,                                   \
1374202Sbinkertn@umich.edu		      const sc_fxcast_switch&,                                \
1388335Snate@binkert.org		      sc_fxnum_observer* = 0 );                               \
1392733Sktlim@umich.edu             sc_ufix( tp,                                                     \
1402733Sktlim@umich.edu		      sc_q_mode, sc_o_mode, int,                              \
1412733Sktlim@umich.edu		      const sc_fxcast_switch&,                                \
1422733Sktlim@umich.edu		      sc_fxnum_observer* = 0 );                               \
1432733Sktlim@umich.edu             sc_ufix( tp,                                                     \
1442874Sktlim@umich.edu		      int, int, sc_q_mode, sc_o_mode,                         \
1452874Sktlim@umich.edu		      const sc_fxcast_switch&,                                \
1462874Sktlim@umich.edu		      sc_fxnum_observer* = 0 );                               \
1474202Sbinkertn@umich.edu             sc_ufix( tp,                                                     \
1482733Sktlim@umich.edu		      int, int, sc_q_mode, sc_o_mode, int,                    \
1495192Ssaidi@eecs.umich.edu		      const sc_fxcast_switch&,                                \
1508335Snate@binkert.org		      sc_fxnum_observer* = 0 );                               \
1518335Snate@binkert.org             sc_ufix( tp,                                                     \
1528335Snate@binkert.org		      const sc_fxtype_params&,                                \
1538335Snate@binkert.org		      sc_fxnum_observer* = 0 );                               \
1548335Snate@binkert.org             sc_ufix( tp,                                                     \
1558335Snate@binkert.org		      const sc_fxtype_params&,                                \
1568335Snate@binkert.org		      const sc_fxcast_switch&,                                \
1578335Snate@binkert.org		      sc_fxnum_observer* = 0 );
1588335Snate@binkert.org
1598335Snate@binkert.org#define DECL_CTORS_T_A(tp)                                                    \
1608335Snate@binkert.org             sc_ufix( tp,                                                     \
1618335Snate@binkert.org	              sc_fxnum_observer* = 0 );                               \
1628335Snate@binkert.org    DECL_CTORS_T(tp)
1638335Snate@binkert.org
1648335Snate@binkert.org#define DECL_CTORS_T_B(tp)                                                    \
1658335Snate@binkert.org    explicit sc_ufix( tp,                                                     \
1668335Snate@binkert.org	              sc_fxnum_observer* = 0 );                               \
1678335Snate@binkert.org    DECL_CTORS_T(tp)
1688335Snate@binkert.org
1698335Snate@binkert.org    DECL_CTORS_T_A(int)
1708335Snate@binkert.org    DECL_CTORS_T_A(unsigned int)
1718335Snate@binkert.org    DECL_CTORS_T_A(long)
1728335Snate@binkert.org    DECL_CTORS_T_A(unsigned long)
1738335Snate@binkert.org    DECL_CTORS_T_A(float)
1748471SGiacomo.Gabrielli@arm.com    DECL_CTORS_T_A(double)
1758335Snate@binkert.org    DECL_CTORS_T_A(const char*)
1768335Snate@binkert.org    DECL_CTORS_T_A(const sc_fxval&)
1775192Ssaidi@eecs.umich.edu    DECL_CTORS_T_A(const sc_fxval_fast&)
1788232Snate@binkert.org    DECL_CTORS_T_A(const sc_fxnum&)
1798232Snate@binkert.org    DECL_CTORS_T_A(const sc_fxnum_fast&)
1808232Snate@binkert.org#ifndef SC_FX_EXCLUDE_OTHER
1818300Schander.sudanthi@arm.com    DECL_CTORS_T_B(int64)
1828300Schander.sudanthi@arm.com    DECL_CTORS_T_B(uint64)
1835192Ssaidi@eecs.umich.edu    DECL_CTORS_T_B(const sc_int_base&)
1848300Schander.sudanthi@arm.com    DECL_CTORS_T_B(const sc_uint_base&)
1858300Schander.sudanthi@arm.com    DECL_CTORS_T_B(const sc_signed&)
1866036Sksewell@umich.edu    DECL_CTORS_T_B(const sc_unsigned&)
1878300Schander.sudanthi@arm.com#endif
1888300Schander.sudanthi@arm.com
189#undef DECL_CTORS_T
190#undef DECL_CTORS_T_A
191#undef DECL_CTORS_T_B
192
193    // copy constructor
194
195    sc_ufix( const sc_ufix& );
196
197
198    // unary bitwise operators
199
200    const sc_ufix operator ~ () const;
201
202
203    // unary bitwise functions
204
205    friend void b_not( sc_ufix&, const sc_ufix& );
206
207
208    // binary bitwise operators
209
210    friend const sc_ufix operator & ( const sc_ufix&, const sc_ufix& );
211    friend const sc_ufix operator & ( const sc_ufix&, const sc_ufix_fast& );
212    friend const sc_ufix operator & ( const sc_ufix_fast&, const sc_ufix& );
213    friend const sc_ufix operator | ( const sc_ufix&, const sc_ufix& );
214    friend const sc_ufix operator | ( const sc_ufix&, const sc_ufix_fast& );
215    friend const sc_ufix operator | ( const sc_ufix_fast&, const sc_ufix& );
216    friend const sc_ufix operator ^ ( const sc_ufix&, const sc_ufix& );
217    friend const sc_ufix operator ^ ( const sc_ufix&, const sc_ufix_fast& );
218    friend const sc_ufix operator ^ ( const sc_ufix_fast&, const sc_ufix& );
219
220
221    // binary bitwise functions
222
223    friend void b_and( sc_ufix&, const sc_ufix&, const sc_ufix& );
224    friend void b_and( sc_ufix&, const sc_ufix&, const sc_ufix_fast& );
225    friend void b_and( sc_ufix&, const sc_ufix_fast&, const sc_ufix& );
226    friend void b_or ( sc_ufix&, const sc_ufix&, const sc_ufix& );
227    friend void b_or ( sc_ufix&, const sc_ufix&, const sc_ufix_fast& );
228    friend void b_or ( sc_ufix&, const sc_ufix_fast&, const sc_ufix& );
229    friend void b_xor( sc_ufix&, const sc_ufix&, const sc_ufix& );
230    friend void b_xor( sc_ufix&, const sc_ufix&, const sc_ufix_fast& );
231    friend void b_xor( sc_ufix&, const sc_ufix_fast&, const sc_ufix& );
232
233
234    // assignment operators
235
236    sc_ufix& operator = ( const sc_ufix& );
237
238#define DECL_ASN_OP_T(op,tp)                                                  \
239    sc_ufix& operator op ( tp );
240
241#ifndef SC_FX_EXCLUDE_OTHER
242#define DECL_ASN_OP_OTHER(op)                                                 \
243    DECL_ASN_OP_T(op,int64)                                                   \
244    DECL_ASN_OP_T(op,uint64)                                                  \
245    DECL_ASN_OP_T(op,const sc_int_base&)                                      \
246    DECL_ASN_OP_T(op,const sc_uint_base&)                                     \
247    DECL_ASN_OP_T(op,const sc_signed&)                                        \
248    DECL_ASN_OP_T(op,const sc_unsigned&)
249#else
250#define DECL_ASN_OP_OTHER(op)
251#endif
252
253#define DECL_ASN_OP(op)                                                       \
254    DECL_ASN_OP_T(op,int)                                                     \
255    DECL_ASN_OP_T(op,unsigned int)                                            \
256    DECL_ASN_OP_T(op,long)                                                    \
257    DECL_ASN_OP_T(op,unsigned long)                                           \
258    DECL_ASN_OP_T(op,float)                                                  \
259    DECL_ASN_OP_T(op,double)                                                  \
260    DECL_ASN_OP_T(op,const char*)                                             \
261    DECL_ASN_OP_T(op,const sc_fxval&)                                         \
262    DECL_ASN_OP_T(op,const sc_fxval_fast&)                                    \
263    DECL_ASN_OP_T(op,const sc_fxnum&)                                         \
264    DECL_ASN_OP_T(op,const sc_fxnum_fast&)                                    \
265    DECL_ASN_OP_OTHER(op)
266
267    DECL_ASN_OP(=)
268
269    DECL_ASN_OP(*=)
270    DECL_ASN_OP(/=)
271    DECL_ASN_OP(+=)
272    DECL_ASN_OP(-=)
273
274    DECL_ASN_OP_T(<<=,int)
275    DECL_ASN_OP_T(>>=,int)
276
277    DECL_ASN_OP_T(&=,const sc_ufix&)
278    DECL_ASN_OP_T(&=,const sc_ufix_fast&)
279    DECL_ASN_OP_T(|=,const sc_ufix&)
280    DECL_ASN_OP_T(|=,const sc_ufix_fast&)
281    DECL_ASN_OP_T(^=,const sc_ufix&)
282    DECL_ASN_OP_T(^=,const sc_ufix_fast&)
283
284#undef DECL_ASN_OP_T
285#undef DECL_ASN_OP_OTHER
286#undef DECL_ASN_OP
287
288
289    // auto-increment and auto-decrement
290
291    const sc_fxval operator ++ ( int );
292    const sc_fxval operator -- ( int );
293
294    sc_ufix& operator ++ ();
295    sc_ufix& operator -- ();
296
297};
298
299
300// ----------------------------------------------------------------------------
301//  CLASS : sc_ufix_fast
302//
303//  "Unconstrained" unsigned fixed-point class; limited precision.
304// ----------------------------------------------------------------------------
305
306class sc_ufix_fast : public sc_fxnum_fast
307{
308
309public:
310
311    // constructors
312
313    explicit sc_ufix_fast( sc_fxnum_fast_observer* = 0 );
314             sc_ufix_fast( int, int,
315			   sc_fxnum_fast_observer* = 0 );
316             sc_ufix_fast( sc_q_mode, sc_o_mode,
317			   sc_fxnum_fast_observer* = 0 );
318             sc_ufix_fast( sc_q_mode, sc_o_mode, int,
319			   sc_fxnum_fast_observer* = 0 );
320             sc_ufix_fast( int, int, sc_q_mode, sc_o_mode,
321			   sc_fxnum_fast_observer* = 0 );
322             sc_ufix_fast( int, int, sc_q_mode, sc_o_mode, int,
323			   sc_fxnum_fast_observer* = 0 );
324    explicit sc_ufix_fast( const sc_fxcast_switch&,
325			   sc_fxnum_fast_observer* = 0 );
326             sc_ufix_fast( int, int,
327			   const sc_fxcast_switch&,
328			   sc_fxnum_fast_observer* = 0 );
329             sc_ufix_fast( sc_q_mode, sc_o_mode,
330			   const sc_fxcast_switch&,
331			   sc_fxnum_fast_observer* = 0 );
332             sc_ufix_fast( sc_q_mode, sc_o_mode, int,
333			   const sc_fxcast_switch&,
334			   sc_fxnum_fast_observer* = 0 );
335             sc_ufix_fast( int, int, sc_q_mode, sc_o_mode,
336			   const sc_fxcast_switch&,
337			   sc_fxnum_fast_observer* = 0 );
338             sc_ufix_fast( int, int, sc_q_mode, sc_o_mode, int,
339			   const sc_fxcast_switch&,
340			   sc_fxnum_fast_observer* = 0 );
341    explicit sc_ufix_fast( const sc_fxtype_params&,
342			   sc_fxnum_fast_observer* = 0 );
343             sc_ufix_fast( const sc_fxtype_params&,
344			   const sc_fxcast_switch&,
345			   sc_fxnum_fast_observer* = 0 );
346
347#define DECL_CTORS_T(tp)                                                      \
348             sc_ufix_fast( tp,                                                \
349			   int, int,                                          \
350			   sc_fxnum_fast_observer* = 0 );                     \
351             sc_ufix_fast( tp,                                                \
352			   sc_q_mode, sc_o_mode,                              \
353			   sc_fxnum_fast_observer* = 0 );                     \
354             sc_ufix_fast( tp,                                                \
355			   sc_q_mode, sc_o_mode, int,                         \
356			   sc_fxnum_fast_observer* = 0 );                     \
357             sc_ufix_fast( tp,                                                \
358			   int, int, sc_q_mode, sc_o_mode,                    \
359			   sc_fxnum_fast_observer* = 0 );                     \
360             sc_ufix_fast( tp,                                                \
361			   int, int, sc_q_mode, sc_o_mode, int,               \
362			   sc_fxnum_fast_observer* = 0 );                     \
363             sc_ufix_fast( tp,                                                \
364			   const sc_fxcast_switch&,                           \
365			   sc_fxnum_fast_observer* = 0 );                     \
366             sc_ufix_fast( tp,                                                \
367			   int, int,                                          \
368			   const sc_fxcast_switch&,                           \
369			   sc_fxnum_fast_observer* = 0 );                     \
370             sc_ufix_fast( tp,                                                \
371			   sc_q_mode, sc_o_mode,                              \
372			   const sc_fxcast_switch&,                           \
373			   sc_fxnum_fast_observer* = 0 );                     \
374             sc_ufix_fast( tp,                                                \
375			   sc_q_mode, sc_o_mode, int,                         \
376			   const sc_fxcast_switch&,                           \
377			   sc_fxnum_fast_observer* = 0 );                     \
378             sc_ufix_fast( tp,                                                \
379			   int, int, sc_q_mode, sc_o_mode,                    \
380			   const sc_fxcast_switch&,                           \
381			   sc_fxnum_fast_observer* = 0 );                     \
382             sc_ufix_fast( tp,                                                \
383			   int, int, sc_q_mode, sc_o_mode, int,               \
384			   const sc_fxcast_switch&,                           \
385			   sc_fxnum_fast_observer* = 0 );                     \
386             sc_ufix_fast( tp,                                                \
387			   const sc_fxtype_params&,                           \
388			   sc_fxnum_fast_observer* = 0 );                     \
389             sc_ufix_fast( tp,                                                \
390			   const sc_fxtype_params&,                           \
391			   const sc_fxcast_switch&,                           \
392			   sc_fxnum_fast_observer* = 0 );
393
394#define DECL_CTORS_T_A(tp)                                                    \
395             sc_ufix_fast( tp,                                                \
396		           sc_fxnum_fast_observer* = 0 );                     \
397    DECL_CTORS_T(tp)
398
399#define DECL_CTORS_T_B(tp)                                                    \
400    explicit sc_ufix_fast( tp,                                                \
401		           sc_fxnum_fast_observer* = 0 );                     \
402    DECL_CTORS_T(tp)
403
404    DECL_CTORS_T_A(int)
405    DECL_CTORS_T_A(unsigned int)
406    DECL_CTORS_T_A(long)
407    DECL_CTORS_T_A(unsigned long)
408    DECL_CTORS_T_A(float)
409    DECL_CTORS_T_A(double)
410    DECL_CTORS_T_A(const char*)
411    DECL_CTORS_T_A(const sc_fxval&)
412    DECL_CTORS_T_A(const sc_fxval_fast&)
413    DECL_CTORS_T_A(const sc_fxnum&)
414    DECL_CTORS_T_A(const sc_fxnum_fast&)
415#ifndef SC_FX_EXCLUDE_OTHER
416    DECL_CTORS_T_B(int64)
417    DECL_CTORS_T_B(uint64)
418    DECL_CTORS_T_B(const sc_int_base&)
419    DECL_CTORS_T_B(const sc_uint_base&)
420    DECL_CTORS_T_B(const sc_signed&)
421    DECL_CTORS_T_B(const sc_unsigned&)
422#endif
423
424#undef DECL_CTORS_T
425#undef DECL_CTORS_T_A
426#undef DECL_CTORS_T_B
427
428    // copy constructor
429
430    sc_ufix_fast( const sc_ufix_fast& );
431
432
433    // unary bitwise operators
434
435    const sc_ufix_fast operator ~ () const;
436
437
438    // unary bitwise functions
439
440    friend void b_not( sc_ufix_fast&, const sc_ufix_fast& );
441
442
443    // binary bitwise operators
444
445    friend const sc_ufix_fast operator & ( const sc_ufix_fast&,
446					   const sc_ufix_fast& );
447    friend const sc_ufix_fast operator ^ ( const sc_ufix_fast&,
448					   const sc_ufix_fast& );
449    friend const sc_ufix_fast operator | ( const sc_ufix_fast&,
450					   const sc_ufix_fast& );
451
452
453    // binary bitwise functions
454
455    friend void b_and( sc_ufix_fast&, const sc_ufix_fast&,
456		                      const sc_ufix_fast& );
457    friend void b_or ( sc_ufix_fast&, const sc_ufix_fast&,
458		                      const sc_ufix_fast& );
459    friend void b_xor( sc_ufix_fast&, const sc_ufix_fast&,
460		                      const sc_ufix_fast& );
461
462
463    // assignment operators
464
465    sc_ufix_fast& operator = ( const sc_ufix_fast& );
466
467#define DECL_ASN_OP_T(op,tp)                                                  \
468    sc_ufix_fast& operator op ( tp );
469
470#ifndef SC_FX_EXCLUDE_OTHER
471#define DECL_ASN_OP_OTHER(op)                                                 \
472    DECL_ASN_OP_T(op,int64)                                                   \
473    DECL_ASN_OP_T(op,uint64)                                                  \
474    DECL_ASN_OP_T(op,const sc_int_base&)                                      \
475    DECL_ASN_OP_T(op,const sc_uint_base&)                                     \
476    DECL_ASN_OP_T(op,const sc_signed&)                                        \
477    DECL_ASN_OP_T(op,const sc_unsigned&)
478#else
479#define DECL_ASN_OP_OTHER(op)
480#endif
481
482#define DECL_ASN_OP(op)                                                       \
483    DECL_ASN_OP_T(op,int)                                                     \
484    DECL_ASN_OP_T(op,unsigned int)                                            \
485    DECL_ASN_OP_T(op,long)                                                    \
486    DECL_ASN_OP_T(op,unsigned long)                                           \
487    DECL_ASN_OP_T(op,float)                                                  \
488    DECL_ASN_OP_T(op,double)                                                  \
489    DECL_ASN_OP_T(op,const char*)                                             \
490    DECL_ASN_OP_T(op,const sc_fxval&)                                         \
491    DECL_ASN_OP_T(op,const sc_fxval_fast&)                                    \
492    DECL_ASN_OP_T(op,const sc_fxnum&)                                         \
493    DECL_ASN_OP_T(op,const sc_fxnum_fast&)                                    \
494    DECL_ASN_OP_OTHER(op)
495
496    DECL_ASN_OP(=)
497
498    DECL_ASN_OP(*=)
499    DECL_ASN_OP(/=)
500    DECL_ASN_OP(+=)
501    DECL_ASN_OP(-=)
502
503    DECL_ASN_OP_T(<<=,int)
504    DECL_ASN_OP_T(>>=,int)
505
506    DECL_ASN_OP_T(&=,const sc_ufix&)
507    DECL_ASN_OP_T(&=,const sc_ufix_fast&)
508    DECL_ASN_OP_T(|=,const sc_ufix&)
509    DECL_ASN_OP_T(|=,const sc_ufix_fast&)
510    DECL_ASN_OP_T(^=,const sc_ufix&)
511    DECL_ASN_OP_T(^=,const sc_ufix_fast&)
512
513#undef DECL_ASN_OP_T
514#undef DECL_ASN_OP_OTHER
515#undef DECL_ASN_OP
516
517
518    // auto-increment and auto-decrement
519
520    const sc_fxval_fast operator ++ ( int );
521    const sc_fxval_fast operator -- ( int );
522
523    sc_ufix_fast& operator ++ ();
524    sc_ufix_fast& operator -- ();
525
526};
527
528
529// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
530
531// ----------------------------------------------------------------------------
532//  CLASS : sc_ufix
533//
534//  "Unconstrained" unsigned fixed-point class; arbitrary precision.
535// ----------------------------------------------------------------------------
536
537// constructors
538
539inline
540sc_ufix::sc_ufix( sc_fxnum_observer* observer_ )
541: sc_fxnum( sc_fxtype_params(),
542	    SC_US_,
543	    sc_fxcast_switch(),
544	    observer_ )
545{}
546
547inline
548sc_ufix::sc_ufix( int wl_, int iwl_,
549		  sc_fxnum_observer* observer_ )
550: sc_fxnum( sc_fxtype_params( wl_, iwl_ ),
551	    SC_US_,
552	    sc_fxcast_switch(),
553	    observer_ )
554{}
555
556inline
557sc_ufix::sc_ufix( sc_q_mode qm, sc_o_mode om,
558		  sc_fxnum_observer* observer_ )
559: sc_fxnum( sc_fxtype_params( qm, om ),
560	    SC_US_,
561	    sc_fxcast_switch(),
562	    observer_ )
563{}
564
565inline
566sc_ufix::sc_ufix( sc_q_mode qm, sc_o_mode om, int nb,
567		  sc_fxnum_observer* observer_ )
568: sc_fxnum( sc_fxtype_params( qm, om, nb ),
569	    SC_US_,
570	    sc_fxcast_switch(),
571	    observer_ )
572{}
573
574inline
575sc_ufix::sc_ufix( int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,
576		  sc_fxnum_observer* observer_ )
577: sc_fxnum( sc_fxtype_params( wl_, iwl_, qm, om ),
578	    SC_US_,
579	    sc_fxcast_switch(),
580	    observer_ )
581{}
582
583inline
584sc_ufix::sc_ufix( int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb,
585		  sc_fxnum_observer* observer_ )
586: sc_fxnum( sc_fxtype_params( wl_, iwl_, qm, om, nb ),
587	    SC_US_,
588	    sc_fxcast_switch(),
589	    observer_ )
590{}
591
592inline
593sc_ufix::sc_ufix( const sc_fxcast_switch& cast_sw,
594		  sc_fxnum_observer* observer_ )
595: sc_fxnum( sc_fxtype_params(),
596	    SC_US_,
597	    cast_sw,
598	    observer_ )
599{}
600
601inline
602sc_ufix::sc_ufix( int wl_, int iwl_,
603		  const sc_fxcast_switch& cast_sw,
604		  sc_fxnum_observer* observer_ )
605: sc_fxnum( sc_fxtype_params( wl_, iwl_ ),
606	    SC_US_,
607	    cast_sw,
608	    observer_ )
609{}
610
611inline
612sc_ufix::sc_ufix( sc_q_mode qm, sc_o_mode om,
613		  const sc_fxcast_switch& cast_sw,
614		  sc_fxnum_observer* observer_ )
615: sc_fxnum( sc_fxtype_params( qm, om ),
616	    SC_US_,
617	    cast_sw,
618	    observer_ )
619{}
620
621inline
622sc_ufix::sc_ufix( sc_q_mode qm, sc_o_mode om, int nb,
623		  const sc_fxcast_switch& cast_sw,
624		  sc_fxnum_observer* observer_ )
625: sc_fxnum( sc_fxtype_params( qm, om, nb ),
626	    SC_US_,
627	    cast_sw,
628	    observer_ )
629{}
630
631inline
632sc_ufix::sc_ufix( int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,
633		  const sc_fxcast_switch& cast_sw,
634		  sc_fxnum_observer* observer_ )
635: sc_fxnum( sc_fxtype_params( wl_, iwl_, qm, om ),
636	    SC_US_,
637	    cast_sw,
638	    observer_ )
639{}
640
641inline
642sc_ufix::sc_ufix( int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb,
643		  const sc_fxcast_switch& cast_sw,
644		  sc_fxnum_observer* observer_ )
645: sc_fxnum( sc_fxtype_params( wl_, iwl_, qm, om, nb ),
646	    SC_US_,
647	    cast_sw,
648	    observer_ )
649{}
650
651inline
652sc_ufix::sc_ufix( const sc_fxtype_params& type_params,
653		  sc_fxnum_observer* observer_ )
654: sc_fxnum( type_params,
655	    SC_US_,
656	    sc_fxcast_switch(),
657	    observer_ )
658{}
659
660inline
661sc_ufix::sc_ufix( const sc_fxtype_params& type_params,
662		  const sc_fxcast_switch& cast_sw,
663		  sc_fxnum_observer* observer_ )
664: sc_fxnum( type_params,
665	    SC_US_,
666	    cast_sw,
667	    observer_ )
668{}
669
670#define DEFN_CTORS_T_A(tp)                                                    \
671inline                                                                        \
672sc_ufix::sc_ufix( tp a,                                                       \
673		  sc_fxnum_observer* observer_ )                              \
674: sc_fxnum( a,                                                                \
675	    sc_fxtype_params(),                                               \
676	    SC_US_,                                                           \
677	    sc_fxcast_switch(),                                               \
678	    observer_ )                                                       \
679{}                                                                            \
680                                                                              \
681inline                                                                        \
682sc_ufix::sc_ufix( tp a,                                                       \
683		  int wl_, int iwl_,                                          \
684		  sc_fxnum_observer* observer_ )                              \
685: sc_fxnum( a,                                                                \
686	    sc_fxtype_params( wl_, iwl_ ),                                    \
687	    SC_US_,                                                           \
688	    sc_fxcast_switch(),                                               \
689	    observer_ )                                                       \
690{}                                                                            \
691                                                                              \
692inline                                                                        \
693sc_ufix::sc_ufix( tp a,                                                       \
694		  sc_q_mode qm, sc_o_mode om,                                 \
695		  sc_fxnum_observer* observer_ )                              \
696: sc_fxnum( a,                                                                \
697	    sc_fxtype_params( qm, om ),                                       \
698	    SC_US_,                                                           \
699	    sc_fxcast_switch(),                                               \
700	    observer_ )                                                       \
701{}                                                                            \
702                                                                              \
703inline                                                                        \
704sc_ufix::sc_ufix( tp a,                                                       \
705		  sc_q_mode qm, sc_o_mode om, int nb,                         \
706		  sc_fxnum_observer* observer_ )                              \
707: sc_fxnum( a,                                                                \
708	    sc_fxtype_params( qm, om, nb ),                                   \
709	    SC_US_,                                                           \
710	    sc_fxcast_switch(),                                               \
711	    observer_ )                                                       \
712{}                                                                            \
713                                                                              \
714inline                                                                        \
715sc_ufix::sc_ufix( tp a,                                                       \
716		  int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,              \
717		  sc_fxnum_observer* observer_ )                              \
718: sc_fxnum( a,                                                                \
719	    sc_fxtype_params( wl_, iwl_, qm, om ),                            \
720	    SC_US_,                                                           \
721	    sc_fxcast_switch(),                                               \
722	    observer_ )                                                       \
723{}                                                                            \
724                                                                              \
725inline                                                                        \
726sc_ufix::sc_ufix( tp a,                                                       \
727		  int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb,      \
728		  sc_fxnum_observer* observer_ )                              \
729: sc_fxnum( a,                                                                \
730	    sc_fxtype_params( wl_, iwl_, qm, om, nb ),                        \
731	    SC_US_,                                                           \
732	    sc_fxcast_switch(),                                               \
733	    observer_ )                                                       \
734{}                                                                            \
735                                                                              \
736inline                                                                        \
737sc_ufix::sc_ufix( tp a,                                                       \
738		  const sc_fxcast_switch& cast_sw,                            \
739		  sc_fxnum_observer* observer_ )                              \
740: sc_fxnum( a,                                                                \
741	    sc_fxtype_params(),                                               \
742	    SC_US_,                                                           \
743	    cast_sw,                                                          \
744	    observer_ )                                                       \
745{}                                                                            \
746                                                                              \
747inline                                                                        \
748sc_ufix::sc_ufix( tp a,                                                       \
749		  int wl_, int iwl_,                                          \
750		  const sc_fxcast_switch& cast_sw,                            \
751		  sc_fxnum_observer* observer_ )                              \
752: sc_fxnum( a,                                                                \
753	    sc_fxtype_params( wl_, iwl_ ),                                    \
754	    SC_US_,                                                           \
755	    cast_sw,                                                          \
756	    observer_ )                                                       \
757{}                                                                            \
758                                                                              \
759inline                                                                        \
760sc_ufix::sc_ufix( tp a,                                                       \
761		  sc_q_mode qm, sc_o_mode om,                                 \
762		  const sc_fxcast_switch& cast_sw,                            \
763		  sc_fxnum_observer* observer_ )                              \
764: sc_fxnum( a,                                                                \
765	    sc_fxtype_params( qm, om ),                                       \
766	    SC_US_,                                                           \
767	    cast_sw,                                                          \
768	    observer_ )                                                       \
769{}                                                                            \
770                                                                              \
771inline                                                                        \
772sc_ufix::sc_ufix( tp a,                                                       \
773		  sc_q_mode qm, sc_o_mode om, int nb,                         \
774		  const sc_fxcast_switch& cast_sw,                            \
775		  sc_fxnum_observer* observer_ )                              \
776: sc_fxnum( a,                                                                \
777	    sc_fxtype_params( qm, om, nb ),                                   \
778	    SC_US_,                                                           \
779	    cast_sw,                                                          \
780	    observer_ )                                                       \
781{}                                                                            \
782                                                                              \
783inline                                                                        \
784sc_ufix::sc_ufix( tp a,                                                       \
785		  int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,              \
786		  const sc_fxcast_switch& cast_sw,                            \
787		  sc_fxnum_observer* observer_ )                              \
788: sc_fxnum( a,                                                                \
789	    sc_fxtype_params( wl_, iwl_, qm, om ),                            \
790	    SC_US_,                                                           \
791	    cast_sw,                                                          \
792	    observer_ )                                                       \
793{}                                                                            \
794                                                                              \
795inline                                                                        \
796sc_ufix::sc_ufix( tp a,                                                       \
797		  int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb,      \
798		  const sc_fxcast_switch& cast_sw,                            \
799		  sc_fxnum_observer* observer_ )                              \
800: sc_fxnum( a,                                                                \
801	    sc_fxtype_params( wl_, iwl_, qm, om, nb ),                        \
802	    SC_US_,                                                           \
803	    cast_sw,                                                          \
804	    observer_ )                                                       \
805{}                                                                            \
806                                                                              \
807inline                                                                        \
808sc_ufix::sc_ufix( tp a,                                                       \
809		  const sc_fxtype_params& type_params,                        \
810		  sc_fxnum_observer* observer_ )                              \
811: sc_fxnum( a,                                                                \
812	    type_params,                                                      \
813	    SC_US_,                                                           \
814	    sc_fxcast_switch(),                                               \
815	    observer_ )                                                       \
816{}                                                                            \
817                                                                              \
818inline                                                                        \
819sc_ufix::sc_ufix( tp a,                                                       \
820		  const sc_fxtype_params& type_params,                        \
821		  const sc_fxcast_switch& cast_sw,                            \
822		  sc_fxnum_observer* observer_ )                              \
823: sc_fxnum( a,                                                                \
824	    type_params,                                                      \
825	    SC_US_,                                                           \
826	    cast_sw,                                                          \
827	    observer_ )                                                       \
828{}
829
830#define DEFN_CTORS_T_B(tp)                                                    \
831inline                                                                        \
832sc_ufix::sc_ufix( tp a,                                                       \
833		  sc_fxnum_observer* observer_ )                              \
834: sc_fxnum( a,                                                                \
835	    a.type_params(),                                                  \
836	    SC_US_,                                                           \
837	    sc_fxcast_switch(),                                               \
838	    observer_ )                                                       \
839{}                                                                            \
840                                                                              \
841inline                                                                        \
842sc_ufix::sc_ufix( tp a,                                                       \
843		  int wl_, int iwl_,                                          \
844		  sc_fxnum_observer* observer_ )                              \
845: sc_fxnum( a,                                                                \
846	    sc_fxtype_params( a.type_params(), wl_, iwl_ ),                   \
847	    SC_US_,                                                           \
848	    sc_fxcast_switch(),                                               \
849	    observer_ )                                                       \
850{}                                                                            \
851                                                                              \
852inline                                                                        \
853sc_ufix::sc_ufix( tp a,                                                       \
854		  sc_q_mode qm, sc_o_mode om,                                 \
855		  sc_fxnum_observer* observer_ )                              \
856: sc_fxnum( a,                                                                \
857	    sc_fxtype_params( a.type_params(), qm, om ),                      \
858	    SC_US_,                                                           \
859	    sc_fxcast_switch(),                                               \
860	    observer_ )                                                       \
861{}                                                                            \
862                                                                              \
863inline                                                                        \
864sc_ufix::sc_ufix( tp a,                                                       \
865		  sc_q_mode qm, sc_o_mode om, int nb,                         \
866		  sc_fxnum_observer* observer_ )                              \
867: sc_fxnum( a,                                                                \
868	    sc_fxtype_params( a.type_params(), qm, om, nb ),                  \
869	    SC_US_,                                                           \
870	    sc_fxcast_switch(),                                               \
871	    observer_ )                                                       \
872{}                                                                            \
873                                                                              \
874inline                                                                        \
875sc_ufix::sc_ufix( tp a,                                                       \
876		  int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,              \
877		  sc_fxnum_observer* observer_ )                              \
878: sc_fxnum( a,                                                                \
879	    sc_fxtype_params( wl_, iwl_, qm, om ),                            \
880	    SC_US_,                                                           \
881	    sc_fxcast_switch(),                                               \
882	    observer_ )                                                       \
883{}                                                                            \
884                                                                              \
885inline                                                                        \
886sc_ufix::sc_ufix( tp a,                                                       \
887		  int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb,      \
888		  sc_fxnum_observer* observer_ )                              \
889: sc_fxnum( a,                                                                \
890	    sc_fxtype_params( wl_, iwl_, qm, om, nb ),                        \
891	    SC_US_,                                                           \
892	    sc_fxcast_switch(),                                               \
893	    observer_ )                                                       \
894{}                                                                            \
895                                                                              \
896inline                                                                        \
897sc_ufix::sc_ufix( tp a,                                                       \
898		  const sc_fxcast_switch& cast_sw,                            \
899		  sc_fxnum_observer* observer_ )                              \
900: sc_fxnum( a,                                                                \
901	    a.type_params(),                                                  \
902	    SC_US_,                                                           \
903	    cast_sw,                                                          \
904	    observer_ )                                                       \
905{}                                                                            \
906                                                                              \
907inline                                                                        \
908sc_ufix::sc_ufix( tp a,                                                       \
909		  int wl_, int iwl_,                                          \
910		  const sc_fxcast_switch& cast_sw,                            \
911		  sc_fxnum_observer* observer_ )                              \
912: sc_fxnum( a,                                                                \
913	    sc_fxtype_params( a.type_params(), wl_, iwl_ ),                   \
914	    SC_US_,                                                           \
915	    cast_sw,                                                          \
916	    observer_ )                                                       \
917{}                                                                            \
918                                                                              \
919inline                                                                        \
920sc_ufix::sc_ufix( tp a,                                                       \
921		  sc_q_mode qm, sc_o_mode om,                                 \
922		  const sc_fxcast_switch& cast_sw,                            \
923		  sc_fxnum_observer* observer_ )                              \
924: sc_fxnum( a,                                                                \
925	    sc_fxtype_params( a.type_params(), qm, om ),                      \
926	    SC_US_,                                                           \
927	    cast_sw,                                                          \
928	    observer_ )                                                       \
929{}                                                                            \
930                                                                              \
931inline                                                                        \
932sc_ufix::sc_ufix( tp a,                                                       \
933		  sc_q_mode qm, sc_o_mode om, int nb,                         \
934		  const sc_fxcast_switch& cast_sw,                            \
935		  sc_fxnum_observer* observer_ )                              \
936: sc_fxnum( a,                                                                \
937	    sc_fxtype_params( a.type_params(), qm, om, nb ),                  \
938	    SC_US_,                                                           \
939	    cast_sw,                                                          \
940	    observer_ )                                                       \
941{}                                                                            \
942                                                                              \
943inline                                                                        \
944sc_ufix::sc_ufix( tp a,                                                       \
945		  int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,              \
946		  const sc_fxcast_switch& cast_sw,                            \
947		  sc_fxnum_observer* observer_ )                              \
948: sc_fxnum( a,                                                                \
949	    sc_fxtype_params( wl_, iwl_, qm, om ),                            \
950	    SC_US_,                                                           \
951	    cast_sw,                                                          \
952	    observer_ )                                                       \
953{}                                                                            \
954                                                                              \
955inline                                                                        \
956sc_ufix::sc_ufix( tp a,                                                       \
957		  int wl_, int iwl_, sc_q_mode qm, sc_o_mode om, int nb,      \
958		  const sc_fxcast_switch& cast_sw,                            \
959		  sc_fxnum_observer* observer_ )                              \
960: sc_fxnum( a,                                                                \
961	    sc_fxtype_params( wl_, iwl_, qm, om, nb ),                        \
962	    SC_US_,                                                           \
963	    cast_sw,                                                          \
964	    observer_ )                                                       \
965{}                                                                            \
966                                                                              \
967inline                                                                        \
968sc_ufix::sc_ufix( tp a,                                                       \
969		  const sc_fxtype_params& type_params,                        \
970		  sc_fxnum_observer* observer_ )                              \
971: sc_fxnum( a,                                                                \
972	    type_params,                                                      \
973	    SC_US_,                                                           \
974	    sc_fxcast_switch(),                                               \
975	    observer_ )                                                       \
976{}                                                                            \
977                                                                              \
978inline                                                                        \
979sc_ufix::sc_ufix( tp a,                                                       \
980		  const sc_fxtype_params& type_params,                        \
981		  const sc_fxcast_switch& cast_sw,                            \
982		  sc_fxnum_observer* observer_ )                              \
983: sc_fxnum( a,                                                                \
984	    type_params,                                                      \
985	    SC_US_,                                                           \
986	    cast_sw,                                                          \
987	    observer_ )                                                       \
988{}
989
990DEFN_CTORS_T_A(int)
991DEFN_CTORS_T_A(unsigned int)
992DEFN_CTORS_T_A(long)
993DEFN_CTORS_T_A(unsigned long)
994DEFN_CTORS_T_A(float)
995DEFN_CTORS_T_A(double)
996DEFN_CTORS_T_A(const char*)
997DEFN_CTORS_T_A(const sc_fxval&)
998DEFN_CTORS_T_A(const sc_fxval_fast&)
999DEFN_CTORS_T_B(const sc_fxnum&)
1000DEFN_CTORS_T_B(const sc_fxnum_fast&)
1001#ifndef SC_FX_EXCLUDE_OTHER
1002DEFN_CTORS_T_A(int64)
1003DEFN_CTORS_T_A(uint64)
1004DEFN_CTORS_T_A(const sc_int_base&)
1005DEFN_CTORS_T_A(const sc_uint_base&)
1006DEFN_CTORS_T_A(const sc_signed&)
1007DEFN_CTORS_T_A(const sc_unsigned&)
1008#endif
1009
1010#undef DEFN_CTORS_T_A
1011#undef DEFN_CTORS_T_B
1012
1013// copy constructor
1014
1015inline
1016sc_ufix::sc_ufix( const sc_ufix& a )
1017: sc_fxnum( a,
1018	    a.type_params(),
1019	    SC_US_,
1020	    sc_fxcast_switch(),
1021	    0 )
1022{}
1023
1024
1025// unary bitwise operators
1026
1027inline
1028const sc_ufix
1029sc_ufix::operator ~ () const
1030{
1031    SC_FXNUM_OBSERVER_READ_( *this )
1032    int iwl_c = iwl();
1033    int wl_c = wl();
1034    sc_ufix c( wl_c, iwl_c );
1035    for( int i = iwl_c - wl_c; i < iwl_c; ++ i )
1036	c.set_bit( i, ! get_bit( i ) );
1037    return sc_ufix( c, wl_c, iwl_c );
1038}
1039
1040
1041// unary bitwise functions
1042
1043inline
1044void
1045b_not( sc_ufix& c, const sc_ufix& a )
1046{
1047    SC_FXNUM_OBSERVER_READ_( a )
1048    int iwl_c = c.iwl();
1049    for( int i = iwl_c - c.wl(); i < iwl_c; ++ i )
1050	c.set_bit( i, ! a.get_bit( i ) );
1051    c.cast();
1052    SC_FXNUM_OBSERVER_WRITE_( c )
1053}
1054
1055
1056// binary bitwise operators
1057
1058#define DEFN_BIN_OP_T(op,op2,tp1,tp2)                                         \
1059inline                                                                        \
1060const sc_ufix                                                                 \
1061operator op ( const tp1& a, const tp2& b )                                    \
1062{                                                                             \
1063    a.observer_read();                                                        \
1064    b.observer_read();                                                        \
1065    int iwl_a = a.iwl();                                                      \
1066    int iwl_b = b.iwl();                                                      \
1067    int iwl_c = sc_max( iwl_a, iwl_b );                                       \
1068    int fwl_c = sc_max( a.wl() - iwl_a, b.wl() - iwl_b );                     \
1069    sc_ufix c( iwl_c + fwl_c, iwl_c );                                        \
1070    for( int i = -fwl_c; i < iwl_c; ++ i )                                    \
1071	c.set_bit( i, a.get_bit( i ) op2 b.get_bit( i ) );                    \
1072    return sc_ufix( c, iwl_c + fwl_c, iwl_c );                                \
1073}
1074
1075DEFN_BIN_OP_T(&,&&,sc_ufix,sc_ufix)
1076DEFN_BIN_OP_T(&,&&,sc_ufix,sc_ufix_fast)
1077DEFN_BIN_OP_T(&,&&,sc_ufix_fast,sc_ufix)
1078
1079DEFN_BIN_OP_T(|,||,sc_ufix,sc_ufix)
1080DEFN_BIN_OP_T(|,||,sc_ufix,sc_ufix_fast)
1081DEFN_BIN_OP_T(|,||,sc_ufix_fast,sc_ufix)
1082
1083DEFN_BIN_OP_T(^,!=,sc_ufix,sc_ufix)
1084DEFN_BIN_OP_T(^,!=,sc_ufix,sc_ufix_fast)
1085DEFN_BIN_OP_T(^,!=,sc_ufix_fast,sc_ufix)
1086
1087#undef DEFN_BIN_OP_T
1088
1089
1090// binary bitwise functions
1091
1092#define DEFN_BIN_FNC_T(fnc,op2,tp1,tp2)                                       \
1093inline                                                                        \
1094void                                                                          \
1095fnc ( sc_ufix& c, const tp1& a, const tp2& b )                                \
1096{                                                                             \
1097    a.observer_read();                                                        \
1098    b.observer_read();                                                        \
1099    int iwl_c = c.iwl();                                                      \
1100    for( int i = iwl_c - c.wl(); i < iwl_c; ++ i )                            \
1101	c.set_bit( i, a.get_bit( i ) op2 b.get_bit( i ) );                    \
1102    c.cast();                                                                 \
1103    SC_FXNUM_OBSERVER_WRITE_( c )                                             \
1104}
1105
1106DEFN_BIN_FNC_T(b_and,&&,sc_ufix,sc_ufix)
1107DEFN_BIN_FNC_T(b_and,&&,sc_ufix,sc_ufix_fast)
1108DEFN_BIN_FNC_T(b_and,&&,sc_ufix_fast,sc_ufix)
1109
1110DEFN_BIN_FNC_T(b_or,||,sc_ufix,sc_ufix)
1111DEFN_BIN_FNC_T(b_or,||,sc_ufix,sc_ufix_fast)
1112DEFN_BIN_FNC_T(b_or,||,sc_ufix_fast,sc_ufix)
1113
1114DEFN_BIN_FNC_T(b_xor,!=,sc_ufix,sc_ufix)
1115DEFN_BIN_FNC_T(b_xor,!=,sc_ufix,sc_ufix_fast)
1116DEFN_BIN_FNC_T(b_xor,!=,sc_ufix_fast,sc_ufix)
1117
1118#undef DEFN_BIN_FNC_T
1119
1120
1121// assignment operators
1122
1123inline
1124sc_ufix&
1125sc_ufix::operator = ( const sc_ufix& a )
1126{
1127    sc_fxnum::operator = ( a );
1128    return *this;
1129}
1130
1131#define DEFN_ASN_OP_T(op,tp)                                                  \
1132inline                                                                        \
1133sc_ufix&                                                                      \
1134sc_ufix::operator op ( tp a )                                                 \
1135{                                                                             \
1136    sc_fxnum::operator op( a );                                               \
1137    return *this;                                                             \
1138}
1139
1140#ifndef SC_FX_EXCLUDE_OTHER
1141#define DEFN_ASN_OP_OTHER(op)                                                 \
1142DEFN_ASN_OP_T(op,int64)                                                       \
1143DEFN_ASN_OP_T(op,uint64)                                                      \
1144DEFN_ASN_OP_T(op,const sc_int_base&)                                          \
1145DEFN_ASN_OP_T(op,const sc_uint_base&)                                         \
1146DEFN_ASN_OP_T(op,const sc_signed&)                                            \
1147DEFN_ASN_OP_T(op,const sc_unsigned&)
1148#else
1149#define DEFN_ASN_OP_OTHER(op)
1150#endif
1151
1152#define DEFN_ASN_OP(op)                                                       \
1153DEFN_ASN_OP_T(op,int)                                                         \
1154DEFN_ASN_OP_T(op,unsigned int)                                                \
1155DEFN_ASN_OP_T(op,long)                                                        \
1156DEFN_ASN_OP_T(op,unsigned long)                                               \
1157DEFN_ASN_OP_T(op,float)                                                      \
1158DEFN_ASN_OP_T(op,double)                                                      \
1159DEFN_ASN_OP_T(op,const char*)                                                 \
1160DEFN_ASN_OP_T(op,const sc_fxval&)                                             \
1161DEFN_ASN_OP_T(op,const sc_fxval_fast&)                                        \
1162DEFN_ASN_OP_T(op,const sc_fxnum&)                                             \
1163DEFN_ASN_OP_T(op,const sc_fxnum_fast&)                                        \
1164DEFN_ASN_OP_OTHER(op)
1165
1166DEFN_ASN_OP(=)
1167
1168DEFN_ASN_OP(*=)
1169DEFN_ASN_OP(/=)
1170DEFN_ASN_OP(+=)
1171DEFN_ASN_OP(-=)
1172
1173DEFN_ASN_OP_T(<<=,int)
1174DEFN_ASN_OP_T(>>=,int)
1175
1176#undef DEFN_ASN_OP_T
1177#undef DEFN_ASN_OP_OTHER
1178#undef DEFN_ASN_OP
1179
1180
1181#define DEFN_ASN_OP_T(op,op2,tp)                                              \
1182inline                                                                        \
1183sc_ufix&                                                                      \
1184sc_ufix::operator op ( const tp& b )                                          \
1185{                                                                             \
1186    SC_FXNUM_OBSERVER_READ_( *this )                                          \
1187    b.observer_read();                                                        \
1188    int iwl_c = iwl();                                                        \
1189    for( int i = iwl_c - wl(); i < iwl_c; ++ i )                              \
1190	set_bit( i, get_bit( i ) op2 b.get_bit( i ) );                        \
1191    cast();                                                                   \
1192    SC_FXNUM_OBSERVER_WRITE_( *this )                                         \
1193    return *this;                                                             \
1194}
1195
1196DEFN_ASN_OP_T(&=,&&,sc_ufix)
1197DEFN_ASN_OP_T(&=,&&,sc_ufix_fast)
1198DEFN_ASN_OP_T(|=,||,sc_ufix)
1199DEFN_ASN_OP_T(|=,||,sc_ufix_fast)
1200DEFN_ASN_OP_T(^=,!=,sc_ufix)
1201DEFN_ASN_OP_T(^=,!=,sc_ufix_fast)
1202
1203#undef DEFN_ASN_OP_T
1204
1205
1206// auto-increment and auto-decrement
1207
1208inline
1209const sc_fxval
1210sc_ufix::operator ++ ( int )
1211{
1212    return sc_fxval( sc_fxnum::operator ++ ( 0 ) );
1213}
1214
1215inline
1216const sc_fxval
1217sc_ufix::operator -- ( int )
1218{
1219    return sc_fxval( sc_fxnum::operator -- ( 0 ) );
1220}
1221
1222inline
1223sc_ufix&
1224sc_ufix::operator ++ ()
1225{
1226    sc_fxnum::operator ++ ();
1227    return *this;
1228}
1229
1230inline
1231sc_ufix&
1232sc_ufix::operator -- ()
1233{
1234    sc_fxnum::operator -- ();
1235    return *this;
1236}
1237
1238
1239// ----------------------------------------------------------------------------
1240//  CLASS : sc_ufix_fast
1241//
1242//  "Unconstrained" unsigned fixed-point class; limited precision.
1243// ----------------------------------------------------------------------------
1244
1245// constructors
1246
1247inline
1248sc_ufix_fast::sc_ufix_fast( sc_fxnum_fast_observer* observer_ )
1249: sc_fxnum_fast( sc_fxtype_params(),
1250		 SC_US_,
1251		 sc_fxcast_switch(),
1252		 observer_ )
1253{}
1254
1255inline
1256sc_ufix_fast::sc_ufix_fast( int wl_, int iwl_,
1257			    sc_fxnum_fast_observer* observer_ )
1258: sc_fxnum_fast( sc_fxtype_params( wl_, iwl_ ),
1259		 SC_US_,
1260		 sc_fxcast_switch(),
1261		 observer_ )
1262{}
1263
1264inline
1265sc_ufix_fast::sc_ufix_fast( sc_q_mode qm, sc_o_mode om,
1266			    sc_fxnum_fast_observer* observer_ )
1267: sc_fxnum_fast( sc_fxtype_params( qm, om ),
1268		 SC_US_,
1269		 sc_fxcast_switch(),
1270		 observer_ )
1271{}
1272
1273inline
1274sc_ufix_fast::sc_ufix_fast( sc_q_mode qm, sc_o_mode om, int nb,
1275			    sc_fxnum_fast_observer* observer_ )
1276: sc_fxnum_fast( sc_fxtype_params( qm, om, nb ),
1277		 SC_US_,
1278		 sc_fxcast_switch(),
1279		 observer_ )
1280{}
1281
1282inline
1283sc_ufix_fast::sc_ufix_fast( int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,
1284			    sc_fxnum_fast_observer* observer_ )
1285: sc_fxnum_fast( sc_fxtype_params( wl_, iwl_, qm, om ),
1286		 SC_US_,
1287		 sc_fxcast_switch(),
1288		 observer_ )
1289{}
1290
1291inline
1292sc_ufix_fast::sc_ufix_fast( int wl_, int iwl_,
1293			    sc_q_mode qm, sc_o_mode om, int nb,
1294			    sc_fxnum_fast_observer* observer_ )
1295: sc_fxnum_fast( sc_fxtype_params( wl_, iwl_, qm, om, nb ),
1296		 SC_US_,
1297		 sc_fxcast_switch(),
1298		 observer_ )
1299{}
1300
1301inline
1302sc_ufix_fast::sc_ufix_fast( const sc_fxcast_switch& cast_sw,
1303			    sc_fxnum_fast_observer* observer_ )
1304: sc_fxnum_fast( sc_fxtype_params(),
1305		 SC_US_,
1306		 cast_sw,
1307		 observer_ )
1308{}
1309
1310inline
1311sc_ufix_fast::sc_ufix_fast( int wl_, int iwl_,
1312			    const sc_fxcast_switch& cast_sw,
1313			    sc_fxnum_fast_observer* observer_ )
1314: sc_fxnum_fast( sc_fxtype_params( wl_, iwl_ ),
1315		 SC_US_,
1316		 cast_sw,
1317		 observer_ )
1318{}
1319
1320inline
1321sc_ufix_fast::sc_ufix_fast( sc_q_mode qm, sc_o_mode om,
1322			    const sc_fxcast_switch& cast_sw,
1323			    sc_fxnum_fast_observer* observer_ )
1324: sc_fxnum_fast( sc_fxtype_params( qm, om ),
1325		 SC_US_,
1326		 cast_sw,
1327		 observer_ )
1328{}
1329
1330inline
1331sc_ufix_fast::sc_ufix_fast( sc_q_mode qm, sc_o_mode om, int nb,
1332			    const sc_fxcast_switch& cast_sw,
1333			    sc_fxnum_fast_observer* observer_ )
1334: sc_fxnum_fast( sc_fxtype_params( qm, om, nb ),
1335		 SC_US_,
1336		 cast_sw,
1337		 observer_ )
1338{}
1339
1340inline
1341sc_ufix_fast::sc_ufix_fast( int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,
1342			    const sc_fxcast_switch& cast_sw,
1343			    sc_fxnum_fast_observer* observer_ )
1344: sc_fxnum_fast( sc_fxtype_params( wl_, iwl_, qm, om ),
1345		 SC_US_,
1346		 cast_sw,
1347		 observer_ )
1348{}
1349
1350inline
1351sc_ufix_fast::sc_ufix_fast( int wl_, int iwl_,
1352			    sc_q_mode qm, sc_o_mode om, int nb,
1353			    const sc_fxcast_switch& cast_sw,
1354			    sc_fxnum_fast_observer* observer_ )
1355: sc_fxnum_fast( sc_fxtype_params( wl_, iwl_, qm, om, nb ),
1356		 SC_US_,
1357		 cast_sw,
1358		 observer_ )
1359{}
1360
1361inline
1362sc_ufix_fast::sc_ufix_fast( const sc_fxtype_params& type_params,
1363			    sc_fxnum_fast_observer* observer_ )
1364: sc_fxnum_fast( type_params,
1365		 SC_US_,
1366		 sc_fxcast_switch(),
1367		 observer_ )
1368{}
1369
1370inline
1371sc_ufix_fast::sc_ufix_fast( const sc_fxtype_params& type_params,
1372			    const sc_fxcast_switch& cast_sw,
1373			    sc_fxnum_fast_observer* observer_ )
1374: sc_fxnum_fast( type_params,
1375		 SC_US_,
1376		 cast_sw,
1377		 observer_ )
1378{}
1379
1380#define DEFN_CTORS_T_A(tp)                                                    \
1381inline                                                                        \
1382sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1383			    sc_fxnum_fast_observer* observer_ )               \
1384: sc_fxnum_fast( a,                                                           \
1385		 sc_fxtype_params(),                                          \
1386		 SC_US_,                                                      \
1387		 sc_fxcast_switch(),                                          \
1388		 observer_ )                                                  \
1389{}                                                                            \
1390                                                                              \
1391inline                                                                        \
1392sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1393			    int wl_, int iwl_,                                \
1394			    sc_fxnum_fast_observer* observer_ )               \
1395: sc_fxnum_fast( a,                                                           \
1396		 sc_fxtype_params( wl_, iwl_ ),                               \
1397		 SC_US_,                                                      \
1398		 sc_fxcast_switch(),                                          \
1399		 observer_ )                                                  \
1400{}                                                                            \
1401                                                                              \
1402inline                                                                        \
1403sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1404			    sc_q_mode qm, sc_o_mode om,                       \
1405			    sc_fxnum_fast_observer* observer_ )               \
1406: sc_fxnum_fast( a,                                                           \
1407		 sc_fxtype_params( qm, om ),                                  \
1408		 SC_US_,                                                      \
1409		 sc_fxcast_switch(),                                          \
1410		 observer_ )                                                  \
1411{}                                                                            \
1412                                                                              \
1413inline                                                                        \
1414sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1415			    sc_q_mode qm, sc_o_mode om, int nb,               \
1416			    sc_fxnum_fast_observer* observer_ )               \
1417: sc_fxnum_fast( a,                                                           \
1418		 sc_fxtype_params( qm, om, nb ),                              \
1419		 SC_US_,                                                      \
1420		 sc_fxcast_switch(),                                          \
1421		 observer_ )                                                  \
1422{}                                                                            \
1423                                                                              \
1424inline                                                                        \
1425sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1426			    int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,    \
1427			    sc_fxnum_fast_observer* observer_ )               \
1428: sc_fxnum_fast( a,                                                           \
1429		 sc_fxtype_params( wl_, iwl_, qm, om ),                       \
1430		 SC_US_,                                                      \
1431		 sc_fxcast_switch(),                                          \
1432		 observer_ )                                                  \
1433{}                                                                            \
1434                                                                              \
1435inline                                                                        \
1436sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1437			    int wl_, int iwl_,                                \
1438			    sc_q_mode qm, sc_o_mode om, int nb,               \
1439			    sc_fxnum_fast_observer* observer_ )               \
1440: sc_fxnum_fast( a,                                                           \
1441		 sc_fxtype_params( wl_, iwl_, qm, om, nb ),                   \
1442		 SC_US_,                                                      \
1443		 sc_fxcast_switch(),                                          \
1444		 observer_ )                                                  \
1445{}                                                                            \
1446                                                                              \
1447inline                                                                        \
1448sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1449			    const sc_fxcast_switch& cast_sw,                  \
1450			    sc_fxnum_fast_observer* observer_ )               \
1451: sc_fxnum_fast( a,                                                           \
1452		 sc_fxtype_params(),                                          \
1453		 SC_US_,                                                      \
1454		 cast_sw,                                                     \
1455		 observer_ )                                                  \
1456{}                                                                            \
1457                                                                              \
1458inline                                                                        \
1459sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1460			    int wl_, int iwl_,                                \
1461			    const sc_fxcast_switch& cast_sw,                  \
1462			    sc_fxnum_fast_observer* observer_ )               \
1463: sc_fxnum_fast( a,                                                           \
1464		 sc_fxtype_params( wl_, iwl_ ),                               \
1465		 SC_US_,                                                      \
1466		 cast_sw,                                                     \
1467		 observer_ )                                                  \
1468{}                                                                            \
1469                                                                              \
1470inline                                                                        \
1471sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1472			    sc_q_mode qm, sc_o_mode om,                       \
1473			    const sc_fxcast_switch& cast_sw,                  \
1474			    sc_fxnum_fast_observer* observer_ )               \
1475: sc_fxnum_fast( a,                                                           \
1476		 sc_fxtype_params( qm, om ),                                  \
1477		 SC_US_,                                                      \
1478		 cast_sw,                                                     \
1479		 observer_ )                                                  \
1480{}                                                                            \
1481                                                                              \
1482inline                                                                        \
1483sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1484			    sc_q_mode qm, sc_o_mode om, int nb,               \
1485			    const sc_fxcast_switch& cast_sw,                  \
1486			    sc_fxnum_fast_observer* observer_ )               \
1487: sc_fxnum_fast( a,                                                           \
1488		 sc_fxtype_params( qm, om, nb ),                              \
1489		 SC_US_,                                                      \
1490		 cast_sw,                                                     \
1491		 observer_ )                                                  \
1492{}                                                                            \
1493                                                                              \
1494inline                                                                        \
1495sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1496			    int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,    \
1497			    const sc_fxcast_switch& cast_sw,                  \
1498			    sc_fxnum_fast_observer* observer_ )               \
1499: sc_fxnum_fast( a,                                                           \
1500		 sc_fxtype_params( wl_, iwl_, qm, om ),                       \
1501		 SC_US_,                                                      \
1502		 cast_sw,                                                     \
1503		 observer_ )                                                  \
1504{}                                                                            \
1505                                                                              \
1506inline                                                                        \
1507sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1508			    int wl_, int iwl_,                                \
1509			    sc_q_mode qm, sc_o_mode om, int nb,               \
1510			    const sc_fxcast_switch& cast_sw,                  \
1511			    sc_fxnum_fast_observer* observer_ )               \
1512: sc_fxnum_fast( a,                                                           \
1513		 sc_fxtype_params( wl_, iwl_, qm, om, nb ),                   \
1514		 SC_US_,                                                      \
1515		 cast_sw,                                                     \
1516		 observer_ )                                                  \
1517{}                                                                            \
1518                                                                              \
1519inline                                                                        \
1520sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1521			    const sc_fxtype_params& type_params,              \
1522			    sc_fxnum_fast_observer* observer_ )               \
1523: sc_fxnum_fast( a,                                                           \
1524		 type_params,                                                 \
1525		 SC_US_,                                                      \
1526		 sc_fxcast_switch(),                                          \
1527		 observer_ )                                                  \
1528{}                                                                            \
1529                                                                              \
1530inline                                                                        \
1531sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1532			    const sc_fxtype_params& type_params,              \
1533			    const sc_fxcast_switch& cast_sw,                  \
1534			    sc_fxnum_fast_observer* observer_ )               \
1535: sc_fxnum_fast( a,                                                           \
1536		 type_params,                                                 \
1537		 SC_US_,                                                      \
1538		 cast_sw,                                                     \
1539		 observer_ )                                                  \
1540{}
1541
1542#define DEFN_CTORS_T_B(tp)                                                    \
1543inline                                                                        \
1544sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1545			    sc_fxnum_fast_observer* observer_ )               \
1546: sc_fxnum_fast( a,                                                           \
1547		 a.type_params(),                                             \
1548		 SC_US_,                                                      \
1549		 sc_fxcast_switch(),                                          \
1550		 observer_ )                                                  \
1551{}                                                                            \
1552                                                                              \
1553inline                                                                        \
1554sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1555			    int wl_, int iwl_,                                \
1556			    sc_fxnum_fast_observer* observer_ )               \
1557: sc_fxnum_fast( a,                                                           \
1558		 sc_fxtype_params( a.type_params(), wl_, iwl_ ),              \
1559		 SC_US_,                                                      \
1560		 sc_fxcast_switch(),                                          \
1561		 observer_ )                                                  \
1562{}                                                                            \
1563                                                                              \
1564inline                                                                        \
1565sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1566			    sc_q_mode qm, sc_o_mode om,                       \
1567			    sc_fxnum_fast_observer* observer_ )               \
1568: sc_fxnum_fast( a,                                                           \
1569		 sc_fxtype_params( a.type_params(), qm, om ),                 \
1570		 SC_US_,                                                      \
1571		 sc_fxcast_switch(),                                          \
1572		 observer_ )                                                  \
1573{}                                                                            \
1574                                                                              \
1575inline                                                                        \
1576sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1577			    sc_q_mode qm, sc_o_mode om, int nb,               \
1578			    sc_fxnum_fast_observer* observer_ )               \
1579: sc_fxnum_fast( a,                                                           \
1580		 sc_fxtype_params( a.type_params(), qm, om, nb ),             \
1581		 SC_US_,                                                      \
1582		 sc_fxcast_switch(),                                          \
1583		 observer_ )                                                  \
1584{}                                                                            \
1585                                                                              \
1586inline                                                                        \
1587sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1588			    int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,    \
1589			    sc_fxnum_fast_observer* observer_ )               \
1590: sc_fxnum_fast( a,                                                           \
1591		 sc_fxtype_params( wl_, iwl_, qm, om ),                       \
1592		 SC_US_,                                                      \
1593		 sc_fxcast_switch(),                                          \
1594		 observer_ )                                                  \
1595{}                                                                            \
1596                                                                              \
1597inline                                                                        \
1598sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1599			    int wl_, int iwl_,                                \
1600			    sc_q_mode qm, sc_o_mode om, int nb,               \
1601			    sc_fxnum_fast_observer* observer_ )               \
1602: sc_fxnum_fast( a,                                                           \
1603		 sc_fxtype_params( wl_, iwl_, qm, om, nb ),                   \
1604		 SC_US_,                                                      \
1605		 sc_fxcast_switch(),                                          \
1606		 observer_ )                                                  \
1607{}                                                                            \
1608                                                                              \
1609inline                                                                        \
1610sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1611			    const sc_fxcast_switch& cast_sw,                  \
1612			    sc_fxnum_fast_observer* observer_ )               \
1613: sc_fxnum_fast( a,                                                           \
1614		 a.type_params(),                                             \
1615		 SC_US_,                                                      \
1616		 cast_sw,                                                     \
1617		 observer_ )                                                  \
1618{}                                                                            \
1619                                                                              \
1620inline                                                                        \
1621sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1622			    int wl_, int iwl_,                                \
1623			    const sc_fxcast_switch& cast_sw,                  \
1624			    sc_fxnum_fast_observer* observer_ )               \
1625: sc_fxnum_fast( a,                                                           \
1626		 sc_fxtype_params( a.type_params(), wl_, iwl_ ),              \
1627		 SC_US_,                                                      \
1628		 cast_sw,                                                     \
1629		 observer_ )                                                  \
1630{}                                                                            \
1631                                                                              \
1632inline                                                                        \
1633sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1634			    sc_q_mode qm, sc_o_mode om,                       \
1635			    const sc_fxcast_switch& cast_sw,                  \
1636			    sc_fxnum_fast_observer* observer_ )               \
1637: sc_fxnum_fast( a,                                                           \
1638		 sc_fxtype_params( a.type_params(), qm, om ),                 \
1639		 SC_US_,                                                      \
1640		 cast_sw,                                                     \
1641		 observer_ )                                                  \
1642{}                                                                            \
1643                                                                              \
1644inline                                                                        \
1645sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1646			    sc_q_mode qm, sc_o_mode om, int nb,               \
1647			    const sc_fxcast_switch& cast_sw,                  \
1648			    sc_fxnum_fast_observer* observer_ )               \
1649: sc_fxnum_fast( a,                                                           \
1650		 sc_fxtype_params( a.type_params(), qm, om, nb ),             \
1651		 SC_US_,                                                      \
1652		 cast_sw,                                                     \
1653		 observer_ )                                                  \
1654{}                                                                            \
1655                                                                              \
1656inline                                                                        \
1657sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1658			    int wl_, int iwl_, sc_q_mode qm, sc_o_mode om,    \
1659			    const sc_fxcast_switch& cast_sw,                  \
1660			    sc_fxnum_fast_observer* observer_ )               \
1661: sc_fxnum_fast( a,                                                           \
1662		 sc_fxtype_params( wl_, iwl_, qm, om ),                       \
1663		 SC_US_,                                                      \
1664		 cast_sw,                                                     \
1665		 observer_ )                                                  \
1666{}                                                                            \
1667                                                                              \
1668inline                                                                        \
1669sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1670			    int wl_, int iwl_,                                \
1671			    sc_q_mode qm, sc_o_mode om, int nb,               \
1672			    const sc_fxcast_switch& cast_sw,                  \
1673			    sc_fxnum_fast_observer* observer_ )               \
1674: sc_fxnum_fast( a,                                                           \
1675		 sc_fxtype_params( wl_, iwl_, qm, om, nb ),                   \
1676		 SC_US_,                                                      \
1677		 cast_sw,                                                     \
1678		 observer_ )                                                  \
1679{}                                                                            \
1680                                                                              \
1681inline                                                                        \
1682sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1683			    const sc_fxtype_params& type_params,              \
1684			    sc_fxnum_fast_observer* observer_ )               \
1685: sc_fxnum_fast( a,                                                           \
1686		 type_params,                                                 \
1687		 SC_US_,                                                      \
1688		 sc_fxcast_switch(),                                          \
1689		 observer_ )                                                  \
1690{}                                                                            \
1691                                                                              \
1692inline                                                                        \
1693sc_ufix_fast::sc_ufix_fast( tp a,                                             \
1694			    const sc_fxtype_params& type_params,              \
1695			    const sc_fxcast_switch& cast_sw,                  \
1696			    sc_fxnum_fast_observer* observer_ )               \
1697: sc_fxnum_fast( a,                                                           \
1698		 type_params,                                                 \
1699		 SC_US_,                                                      \
1700		 cast_sw,                                                     \
1701		 observer_ )                                                  \
1702{}
1703
1704DEFN_CTORS_T_A(int)
1705DEFN_CTORS_T_A(unsigned int)
1706DEFN_CTORS_T_A(long)
1707DEFN_CTORS_T_A(unsigned long)
1708DEFN_CTORS_T_A(float)
1709DEFN_CTORS_T_A(double)
1710DEFN_CTORS_T_A(const char*)
1711DEFN_CTORS_T_A(const sc_fxval&)
1712DEFN_CTORS_T_A(const sc_fxval_fast&)
1713DEFN_CTORS_T_B(const sc_fxnum&)
1714DEFN_CTORS_T_B(const sc_fxnum_fast&)
1715#ifndef SC_FX_EXCLUDE_OTHER
1716DEFN_CTORS_T_A(int64)
1717DEFN_CTORS_T_A(uint64)
1718DEFN_CTORS_T_A(const sc_int_base&)
1719DEFN_CTORS_T_A(const sc_uint_base&)
1720DEFN_CTORS_T_A(const sc_signed&)
1721DEFN_CTORS_T_A(const sc_unsigned&)
1722#endif
1723
1724#undef DEFN_CTORS_T_A
1725#undef DEFN_CTORS_T_B
1726
1727// copy constructor
1728
1729inline
1730sc_ufix_fast::sc_ufix_fast( const sc_ufix_fast& a )
1731: sc_fxnum_fast( a,
1732		 a.type_params(),
1733		 SC_US_,
1734		 sc_fxcast_switch(),
1735		 0 )
1736{}
1737
1738
1739// unary bitwise operators
1740
1741inline
1742const sc_ufix_fast
1743sc_ufix_fast::operator ~ () const
1744{
1745    SC_FXNUM_FAST_OBSERVER_READ_( *this )
1746    int iwl_c = iwl();
1747    int wl_c = wl();
1748    sc_ufix_fast c( wl_c, iwl_c );
1749    for( int i = iwl_c - wl_c; i < iwl_c; ++ i )
1750	c.set_bit( i, ! get_bit( i ) );
1751    return sc_ufix_fast( c, wl_c, iwl_c );
1752}
1753
1754
1755// unary bitwise functions
1756
1757inline
1758void
1759b_not( sc_ufix_fast& c, const sc_ufix_fast& a )
1760{
1761    SC_FXNUM_FAST_OBSERVER_READ_( a )
1762    int iwl_c = c.iwl();
1763    for( int i = iwl_c - c.wl(); i < iwl_c; ++ i )
1764	c.set_bit( i, ! a.get_bit( i ) );
1765    c.cast();
1766    SC_FXNUM_FAST_OBSERVER_WRITE_( c )
1767}
1768
1769
1770// binary bitwise operators
1771
1772#define DEFN_BIN_OP_T(op,op2,tp1,tp2)                                         \
1773inline                                                                        \
1774const sc_ufix_fast                                                            \
1775operator op ( const tp1& a, const tp2& b )                                    \
1776{                                                                             \
1777    a.observer_read();                                                        \
1778    b.observer_read();                                                        \
1779    int iwl_a = a.iwl();                                                      \
1780    int iwl_b = b.iwl();                                                      \
1781    int iwl_c = sc_max( iwl_a, iwl_b );                                       \
1782    int fwl_c = sc_max( a.wl() - iwl_a, b.wl() - iwl_b );                     \
1783    sc_ufix_fast c( iwl_c + fwl_c, iwl_c );                                   \
1784    for( int i = -fwl_c; i < iwl_c; ++ i )                                    \
1785	c.set_bit( i, a.get_bit( i ) op2 b.get_bit( i ) );                    \
1786    return sc_ufix_fast( c, iwl_c + fwl_c, iwl_c );                           \
1787}
1788
1789DEFN_BIN_OP_T(&,&&,sc_ufix_fast,sc_ufix_fast)
1790DEFN_BIN_OP_T(|,||,sc_ufix_fast,sc_ufix_fast)
1791DEFN_BIN_OP_T(^,!=,sc_ufix_fast,sc_ufix_fast)
1792
1793#undef DEFN_BIN_OP_T
1794
1795
1796// binary bitwise functions
1797
1798#define DEFN_BIN_FNC_T(fnc,op2,tp1,tp2)                                       \
1799inline                                                                        \
1800void                                                                          \
1801fnc ( sc_ufix_fast& c, const tp1& a, const tp2& b )                           \
1802{                                                                             \
1803    a.observer_read();                                                        \
1804    b.observer_read();                                                        \
1805    int iwl_c = c.iwl();                                                      \
1806    for( int i = iwl_c - c.wl(); i < iwl_c; ++ i )                            \
1807	c.set_bit( i, a.get_bit( i ) op2 b.get_bit( i ) );                    \
1808    c.cast();                                                                 \
1809    SC_FXNUM_FAST_OBSERVER_WRITE_( c )                                        \
1810}
1811
1812DEFN_BIN_FNC_T(b_and,&&,sc_ufix_fast,sc_ufix_fast)
1813DEFN_BIN_FNC_T(b_or,||,sc_ufix_fast,sc_ufix_fast)
1814DEFN_BIN_FNC_T(b_xor,!=,sc_ufix_fast,sc_ufix_fast)
1815
1816#undef DEFN_BIN_FNC_T
1817
1818
1819// assignment operators
1820
1821inline
1822sc_ufix_fast&
1823sc_ufix_fast::operator = ( const sc_ufix_fast& a )
1824{
1825    sc_fxnum_fast::operator = ( a );
1826    return *this;
1827}
1828
1829#define DEFN_ASN_OP_T(op,tp)                                                  \
1830inline                                                                        \
1831sc_ufix_fast&                                                                 \
1832sc_ufix_fast::operator op ( tp a )                                            \
1833{                                                                             \
1834    sc_fxnum_fast::operator op( a );                                          \
1835    return *this;                                                             \
1836}
1837
1838#ifndef SC_FX_EXCLUDE_OTHER
1839#define DEFN_ASN_OP_OTHER(op)                                                 \
1840DEFN_ASN_OP_T(op,int64)                                                       \
1841DEFN_ASN_OP_T(op,uint64)                                                      \
1842DEFN_ASN_OP_T(op,const sc_int_base&)                                          \
1843DEFN_ASN_OP_T(op,const sc_uint_base&)                                         \
1844DEFN_ASN_OP_T(op,const sc_signed&)                                            \
1845DEFN_ASN_OP_T(op,const sc_unsigned&)
1846#else
1847#define DEFN_ASN_OP_OTHER(op)
1848#endif
1849
1850#define DEFN_ASN_OP(op)                                                       \
1851DEFN_ASN_OP_T(op,int)                                                         \
1852DEFN_ASN_OP_T(op,unsigned int)                                                \
1853DEFN_ASN_OP_T(op,long)                                                        \
1854DEFN_ASN_OP_T(op,unsigned long)                                               \
1855DEFN_ASN_OP_T(op,float)                                                      \
1856DEFN_ASN_OP_T(op,double)                                                      \
1857DEFN_ASN_OP_T(op,const char*)                                                 \
1858DEFN_ASN_OP_T(op,const sc_fxval&)                                             \
1859DEFN_ASN_OP_T(op,const sc_fxval_fast&)                                        \
1860DEFN_ASN_OP_T(op,const sc_fxnum&)                                             \
1861DEFN_ASN_OP_T(op,const sc_fxnum_fast&)                                        \
1862DEFN_ASN_OP_OTHER(op)
1863
1864DEFN_ASN_OP(=)
1865
1866DEFN_ASN_OP(*=)
1867DEFN_ASN_OP(/=)
1868DEFN_ASN_OP(+=)
1869DEFN_ASN_OP(-=)
1870
1871DEFN_ASN_OP_T(<<=,int)
1872DEFN_ASN_OP_T(>>=,int)
1873
1874#undef DEFN_ASN_OP_T
1875#undef DEFN_ASN_OP_OTHER
1876#undef DEFN_ASN_OP
1877
1878
1879#define DEFN_ASN_OP_T(op,op2,tp)                                              \
1880inline                                                                        \
1881sc_ufix_fast&                                                                 \
1882sc_ufix_fast::operator op ( const tp& b )                                     \
1883{                                                                             \
1884    SC_FXNUM_FAST_OBSERVER_READ_( *this )                                     \
1885    b.observer_read();                                                        \
1886    int iwl_c = iwl();                                                        \
1887    for( int i = iwl_c - wl(); i < iwl_c; ++ i )                              \
1888	set_bit( i, get_bit( i ) op2 b.get_bit( i ) );                        \
1889    cast();                                                                   \
1890    SC_FXNUM_FAST_OBSERVER_WRITE_( *this )                                    \
1891    return *this;                                                             \
1892}
1893
1894DEFN_ASN_OP_T(&=,&&,sc_ufix)
1895DEFN_ASN_OP_T(&=,&&,sc_ufix_fast)
1896DEFN_ASN_OP_T(|=,||,sc_ufix)
1897DEFN_ASN_OP_T(|=,||,sc_ufix_fast)
1898DEFN_ASN_OP_T(^=,!=,sc_ufix)
1899DEFN_ASN_OP_T(^=,!=,sc_ufix_fast)
1900
1901#undef DEFN_ASN_OP_T
1902
1903
1904// auto-increment and auto-decrement
1905
1906inline
1907const sc_fxval_fast
1908sc_ufix_fast::operator ++ ( int )
1909{
1910    return sc_fxval_fast( sc_fxnum_fast::operator ++ ( 0 ) );
1911}
1912
1913inline
1914const sc_fxval_fast
1915sc_ufix_fast::operator -- ( int )
1916{
1917    return sc_fxval_fast( sc_fxnum_fast::operator -- ( 0 ) );
1918}
1919
1920inline
1921sc_ufix_fast&
1922sc_ufix_fast::operator ++ ()
1923{
1924    sc_fxnum_fast::operator ++ ();
1925    return *this;
1926}
1927
1928inline
1929sc_ufix_fast&
1930sc_ufix_fast::operator -- ()
1931{
1932    sc_fxnum_fast::operator -- ();
1933    return *this;
1934}
1935
1936} // namespace sc_dt
1937
1938
1939#endif
1940
1941// Taf!
1942