sc_unsigned.h

Go to the documentation of this file.
00001 /*****************************************************************************
00002 
00003   The following code is derived, directly or indirectly, from the SystemC
00004   source code Copyright (c) 1996-2006 by all Contributors.
00005   All Rights reserved.
00006 
00007   The contents of this file are subject to the restrictions and limitations
00008   set forth in the SystemC Open Source License Version 2.4 (the "License");
00009   You may not use this file except in compliance with such restrictions and
00010   limitations. You may obtain instructions on how to receive a copy of the
00011   License at http://www.systemc.org/. Software distributed by Contributors
00012   under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
00013   ANY KIND, either express or implied. See the License for the specific
00014   language governing rights and limitations under the License.
00015 
00016  *****************************************************************************/
00017 
00018 /*****************************************************************************
00019 
00020   sc_unsigned.h -- Arbitrary precision unsigned arithmetic.
00021 
00022     This file includes the definitions of sc_unsigned_bitref,
00023     sc_unsigned_subref, and sc_unsigned classes. The first two classes
00024     are proxy classes to reference one bit and a range of bits of a
00025     sc_unsigned number, respectively.
00026 
00027     An sc_signed number has the sign-magnitude representation
00028     internally. However, its interface guarantees a 2's-complement
00029     representation. The sign-magnitude representation is chosen
00030     because of its efficiency: The sc_signed and sc_unsigned types are
00031     optimized for arithmetic rather than bitwise operations. For
00032     arithmetic operations, the sign-magnitude representation performs
00033     better.
00034 
00035     It is also important to note that an sc_unsigned number with n
00036     bits is equivalent to an sc_signed non-negative number with n + 1
00037     bits.
00038 
00039     The implementations of sc_signed and sc_unsigned classes are
00040     almost identical: Most of the member and friend functions are
00041     defined in sc_nbcommon.cpp and sc_nbfriends.cpp so that they can
00042     be shared by both of these classes. These functions are chosed by
00043     defining a few macros before including them such as IF_SC_SIGNED
00044     and CLASS_TYPE. Our implementation choices are mostly dictated by
00045     performance considerations in that we tried to provide the most
00046     efficient sc_signed and sc_unsigned types without compromising
00047     their interface.
00048 
00049     For the behavior of operators, we have two semantics: the old and
00050     new. The most important difference between these two semantics is
00051     that the old semantics is closer to C/C++ semantics in that the
00052     result type of a binary operator on unsigned and signed arguments
00053     is unsigned; the new semantics, on the other hand, requires the
00054     result type be signed. The new semantics is required by the VSIA
00055     C/C++ data types standard. We have implemented the new semantics.
00056 
00057   Original Author: Ali Dasdan, Synopsys, Inc.
00058 
00059  *****************************************************************************/
00060 
00061 /*****************************************************************************
00062 
00063   MODIFICATION LOG - modifiers, enter your name, affiliation, date and
00064   changes you are making here.
00065 
00066       Name, Affiliation, Date:
00067   Description of Modification:
00068 
00069  *****************************************************************************/
00070 
00071 // $Log: sc_unsigned.h,v $
00072 // Revision 1.1.1.1  2006/12/15 20:31:36  acg
00073 // SystemC 2.2
00074 //
00075 // Revision 1.4  2006/03/13 20:25:27  acg
00076 //  Andy Goodrich: Addition of function declarations, e.g., xor_signed_friend()
00077 //  to keep gcc 4.x happy.
00078 //
00079 // Revision 1.3  2006/01/13 18:49:32  acg
00080 // Added $Log command so that CVS check in comments are reproduced in the
00081 // source.
00082 //
00083 
00084 #ifndef SC_UNSIGNED_H
00085 #define SC_UNSIGNED_H
00086 
00087 
00088 #include "sysc/kernel/sc_object.h"
00089 #include "sysc/datatypes/misc/sc_value_base.h"
00090 #include "sysc/utils/sc_iostream.h"
00091 #include "sysc/utils/sc_temporary.h"
00092 #include "sysc/datatypes/int/sc_length_param.h"
00093 #include "sysc/datatypes/int/sc_nbdefs.h"
00094 #include "sysc/datatypes/int/sc_nbutils.h"
00095 #include "sysc/datatypes/int/sc_nbexterns.h"
00096 #include "sysc/utils/sc_temporary.h"
00097 
00098 
00099 namespace sc_dt
00100 {
00101 
00102 // classes defined in this module
00103 class sc_unsigned_bitref_r;
00104 class sc_unsigned_bitref;
00105 class sc_unsigned_subref_r;
00106 class sc_unsigned_subref;
00107 class sc_concatref;
00108 class sc_unsigned;
00109 
00110 // forward class declarations
00111 class sc_bv_base;
00112 class sc_lv_base;
00113 class sc_int_base;
00114 class sc_uint_base;
00115 class sc_int_subref_r;
00116 class sc_uint_subref_r;
00117 class sc_signed;
00118 class sc_signed_subref_r;
00119 class sc_fxval;
00120 class sc_fxval_fast;
00121 class sc_fxnum;
00122 class sc_fxnum_fast;
00123 
00124 // Helper function declarions
00125 int compare_unsigned(small_type us,
00126                               int unb,
00127                               int und,
00128                               const sc_digit *ud,
00129                               small_type vs,
00130                               int vnb,
00131                               int vnd,
00132                               const sc_digit *vd,
00133                               small_type if_u_signed,
00134                               small_type if_v_signed);
00135 
00136 sc_unsigned add_unsigned_friend(small_type us,
00137                                          int unb,
00138                                          int und,
00139                                          const sc_digit *ud,
00140                                          small_type vs,
00141                                          int vnb,
00142                                          int vnd,
00143                                          const sc_digit *vd);
00144 
00145 sc_unsigned sub_unsigned_friend(small_type us,
00146                                          int unb,
00147                                          int und,
00148                                          const sc_digit *ud,
00149                                          small_type vs,
00150                                          int vnb,
00151                                          int vnd,
00152                                          const sc_digit *vd);
00153 
00154 sc_unsigned mul_unsigned_friend(small_type s,
00155                                          int unb,
00156                                          int und,
00157                                          const sc_digit *ud,
00158                                          int vnb,
00159                                          int vnd,
00160                                          const sc_digit *vd);
00161 
00162 sc_unsigned div_unsigned_friend(small_type s,
00163                                          int unb,
00164                                          int und,
00165                                          const sc_digit *ud,
00166                                          int vnb,
00167                                          int vnd,
00168                                          const sc_digit *vd);
00169 
00170 sc_unsigned mod_unsigned_friend(small_type us,
00171                                          int unb,
00172                                          int und,
00173                                          const sc_digit *ud,
00174                                          int vnb,
00175                                          int vnd,
00176                                          const sc_digit *vd);
00177 
00178 sc_unsigned and_unsigned_friend(small_type us,
00179                                          int unb,
00180                                          int und,
00181                                          const sc_digit *ud,
00182                                          small_type vs,
00183                                          int vnb,
00184                                          int vnd,
00185                                          const sc_digit *vd);
00186 
00187 
00188 sc_unsigned or_unsigned_friend(small_type us,
00189                                         int unb,
00190                                         int und,
00191                                         const sc_digit *ud,
00192                                         small_type vs,
00193                                         int vnb,
00194                                         int vnd,
00195                                         const sc_digit *vd);
00196 
00197 sc_unsigned xor_unsigned_friend(small_type us,
00198                                          int unb,
00199                                          int und,
00200                                          const sc_digit *ud,
00201                                          small_type vs,
00202                                          int vnb,
00203                                          int vnd,
00204                                          const sc_digit *vd);
00205 
00206 // friend operator declarations
00207   // ARITHMETIC OPERATORS:
00208 
00209   // ADDition operators:
00210 
00211     sc_signed operator + (const sc_unsigned&  u, const sc_signed&    v);
00212     sc_signed operator + (const sc_signed&    u, const sc_unsigned&  v);
00213 
00214   sc_unsigned operator + (const sc_unsigned&  u, const sc_unsigned&  v);
00215     sc_signed operator + (const sc_unsigned&  u, int64               v);
00216   sc_unsigned operator + (const sc_unsigned&  u, uint64              v);
00217     sc_signed operator + (const sc_unsigned&  u, long                v);
00218   sc_unsigned operator + (const sc_unsigned&  u, unsigned long       v);
00219     sc_signed operator + (const sc_unsigned&  u, int                 v);
00220   inline sc_unsigned operator + (const sc_unsigned&  u, unsigned int        v);
00221 
00222     sc_signed operator + (int64               u, const sc_unsigned&  v);
00223   sc_unsigned operator + (uint64              u, const sc_unsigned&  v);
00224     sc_signed operator + (long                u, const sc_unsigned&  v);
00225   sc_unsigned operator + (unsigned long       u, const sc_unsigned&  v);
00226     sc_signed operator + (int                 u, const sc_unsigned&  v);
00227   inline sc_unsigned operator + (unsigned int        u, const sc_unsigned&  v);
00228 
00229   sc_unsigned operator + (const sc_unsigned&  u, const sc_uint_base& v);
00230     sc_signed operator + (const sc_unsigned&  u, const sc_int_base&  v);
00231   sc_unsigned operator + (const sc_uint_base& u, const sc_unsigned&  v);
00232     sc_signed operator + (const sc_int_base&  u, const sc_unsigned&  v);
00233 
00234   // SUBtraction operators:
00235 
00236     sc_signed operator - (const sc_unsigned&  u, const sc_signed&    v);
00237     sc_signed operator - (const sc_signed&    u, const sc_unsigned&  v);
00238 
00239     sc_signed operator - (const sc_unsigned&  u, const sc_unsigned&  v);
00240     sc_signed operator - (const sc_unsigned&  u, int64               v);
00241     sc_signed operator - (const sc_unsigned&  u, uint64              v);
00242     sc_signed operator - (const sc_unsigned&  u, long                v);
00243     sc_signed operator - (const sc_unsigned&  u, unsigned long       v);
00244     sc_signed operator - (const sc_unsigned&  u, int                 v);
00245     sc_signed operator - (const sc_unsigned&  u, unsigned int        v);
00246 
00247     sc_signed operator - (int64               u, const sc_unsigned&  v);
00248     sc_signed operator - (uint64              u, const sc_unsigned&  v);
00249     sc_signed operator - (long                u, const sc_unsigned&  v);
00250     sc_signed operator - (unsigned long       u, const sc_unsigned&  v);
00251     sc_signed operator - (int                 u, const sc_unsigned&  v);
00252     sc_signed operator - (unsigned int        u, const sc_unsigned&  v);
00253 
00254     sc_signed operator - (const sc_unsigned&  u, const sc_uint_base& v);
00255     sc_signed operator - (const sc_unsigned&  u, const sc_int_base&  v);
00256     sc_signed operator - (const sc_uint_base& u, const sc_unsigned&  v);
00257     sc_signed operator - (const sc_int_base&  u, const sc_unsigned&  v);
00258 
00259   // MULtiplication operators:
00260 
00261     sc_signed operator * (const sc_unsigned&  u, const sc_signed&    v);
00262     sc_signed operator * (const sc_signed&    u, const sc_unsigned&  v);
00263 
00264   sc_unsigned operator * (const sc_unsigned&  u, const sc_unsigned&  v);
00265     sc_signed operator * (const sc_unsigned&  u, int64               v);
00266   sc_unsigned operator * (const sc_unsigned&  u, uint64              v);
00267     sc_signed operator * (const sc_unsigned&  u, long                v);
00268   sc_unsigned operator * (const sc_unsigned&  u, unsigned long       v);
00269     sc_signed operator * (const sc_unsigned&  u, int                 v);
00270   inline sc_unsigned operator * (const sc_unsigned&  u, unsigned int        v);
00271 
00272     sc_signed operator * (int64               u, const sc_unsigned&  v);
00273   sc_unsigned operator * (uint64              u, const sc_unsigned&  v);
00274     sc_signed operator * (long                u, const sc_unsigned&  v);
00275   sc_unsigned operator * (unsigned long       u, const sc_unsigned&  v);
00276     sc_signed operator * (int                 u, const sc_unsigned&  v);
00277   inline sc_unsigned operator * (unsigned int        u, const sc_unsigned&  v);
00278 
00279   sc_unsigned operator * (const sc_unsigned&  u, const sc_uint_base& v);
00280     sc_signed operator * (const sc_unsigned&  u, const sc_int_base&  v);
00281   sc_unsigned operator * (const sc_uint_base& u, const sc_unsigned&  v);
00282     sc_signed operator * (const sc_int_base&  u, const sc_unsigned&  v);
00283 
00284   // DIVision operators:
00285 
00286     sc_signed operator / (const sc_unsigned&  u, const sc_signed&    v);
00287     sc_signed operator / (const sc_signed&    u, const sc_unsigned&  v);
00288 
00289   sc_unsigned operator / (const sc_unsigned&  u, const sc_unsigned&  v);
00290     sc_signed operator / (const sc_unsigned&  u, int64               v);
00291   sc_unsigned operator / (const sc_unsigned&  u, uint64              v);
00292     sc_signed operator / (const sc_unsigned&  u, long                v);
00293   sc_unsigned operator / (const sc_unsigned&  u, unsigned long       v);
00294     sc_signed operator / (const sc_unsigned&  u, int                 v);
00295   inline sc_unsigned operator / (const sc_unsigned&  u, unsigned int        v);
00296 
00297     sc_signed operator / (int64               u, const sc_unsigned&  v);
00298   sc_unsigned operator / (uint64              u, const sc_unsigned&  v);
00299     sc_signed operator / (long                u, const sc_unsigned&  v);
00300   sc_unsigned operator / (unsigned long       u, const sc_unsigned&  v);
00301     sc_signed operator / (int                 u, const sc_unsigned&  v);
00302   inline sc_unsigned operator / (unsigned int        u, const sc_unsigned&  v);
00303 
00304   sc_unsigned operator / (const sc_unsigned&  u, const sc_uint_base& v);
00305     sc_signed operator / (const sc_unsigned&  u, const sc_int_base&  v);
00306   sc_unsigned operator / (const sc_uint_base& u, const sc_unsigned&  v);
00307     sc_signed operator / (const sc_int_base&  u, const sc_unsigned&  v);
00308 
00309   // MODulo operators:
00310 
00311     sc_signed operator % (const sc_unsigned&  u, const sc_signed&    v);
00312     sc_signed operator % (const sc_signed&    u, const sc_unsigned&  v);
00313 
00314   sc_unsigned operator % (const sc_unsigned&  u, const sc_unsigned&  v);
00315     sc_signed operator % (const sc_unsigned&  u, int64               v);
00316   sc_unsigned operator % (const sc_unsigned&  u, uint64              v);
00317     sc_signed operator % (const sc_unsigned&  u, long                v);
00318   sc_unsigned operator % (const sc_unsigned&  u, unsigned long       v);
00319     sc_signed operator % (const sc_unsigned&  u, int                 v);
00320   inline sc_unsigned operator % (const sc_unsigned&  u, unsigned int        v);
00321 
00322     sc_signed operator % (int64               u, const sc_unsigned&  v);
00323   sc_unsigned operator % (uint64              u, const sc_unsigned&  v);
00324     sc_signed operator % (long                u, const sc_unsigned&  v);
00325   sc_unsigned operator % (unsigned long       u, const sc_unsigned&  v);
00326     sc_signed operator % (int                 u, const sc_unsigned&  v);
00327   inline sc_unsigned operator % (unsigned int        u, const sc_unsigned&  v);
00328 
00329   sc_unsigned operator % (const sc_unsigned&  u, const sc_uint_base& v);
00330     sc_signed operator % (const sc_unsigned&  u, const sc_int_base&  v);
00331   sc_unsigned operator % (const sc_uint_base& u, const sc_unsigned&  v);
00332     sc_signed operator % (const sc_int_base&  u, const sc_unsigned&  v);
00333 
00334   // BITWISE OPERATORS:
00335 
00336   // Bitwise AND operators:
00337 
00338     sc_signed operator & (const sc_unsigned&  u, const sc_signed&    v);
00339     sc_signed operator & (const sc_signed&    u, const sc_unsigned&  v);
00340 
00341   sc_unsigned operator & (const sc_unsigned&  u, const sc_unsigned&  v);
00342     sc_signed operator & (const sc_unsigned&  u, int64               v);
00343   sc_unsigned operator & (const sc_unsigned&  u, uint64              v);
00344     sc_signed operator & (const sc_unsigned&  u, long                v);
00345   sc_unsigned operator & (const sc_unsigned&  u, unsigned long       v);
00346     sc_signed operator & (const sc_unsigned&  u, int                 v);
00347   inline sc_unsigned operator & (const sc_unsigned&  u, unsigned int        v);
00348 
00349     sc_signed operator & (int64               u, const sc_unsigned&  v);
00350   sc_unsigned operator & (uint64              u, const sc_unsigned&  v);
00351     sc_signed operator & (long                u, const sc_unsigned&  v);
00352   sc_unsigned operator & (unsigned long       u, const sc_unsigned&  v);
00353     sc_signed operator & (int                 u, const sc_unsigned&  v);
00354   inline sc_unsigned operator & (unsigned int        u, const sc_unsigned&  v);
00355 
00356   sc_unsigned operator & (const sc_unsigned&  u, const sc_uint_base& v);
00357     sc_signed operator & (const sc_unsigned&  u, const sc_int_base&  v);
00358   sc_unsigned operator & (const sc_uint_base& u, const sc_unsigned&  v);
00359     sc_signed operator & (const sc_int_base&  u, const sc_unsigned&  v);
00360 
00361   // Bitwise OR operators:
00362 
00363     sc_signed operator | (const sc_unsigned&  u, const sc_signed&    v);
00364     sc_signed operator | (const sc_signed&    u, const sc_unsigned&  v);
00365 
00366   sc_unsigned operator | (const sc_unsigned&  u, const sc_unsigned&  v);
00367     sc_signed operator | (const sc_unsigned&  u, int64               v);
00368   sc_unsigned operator | (const sc_unsigned&  u, uint64              v);
00369     sc_signed operator | (const sc_unsigned&  u, long                v);
00370   sc_unsigned operator | (const sc_unsigned&  u, unsigned long       v);
00371     sc_signed operator | (const sc_unsigned&  u, int                 v);
00372   inline sc_unsigned operator | (const sc_unsigned&  u, unsigned int        v);
00373 
00374     sc_signed operator | (int64               u, const sc_unsigned&  v);
00375   sc_unsigned operator | (uint64              u, const sc_unsigned&  v);
00376     sc_signed operator | (long                u, const sc_unsigned&  v);
00377   sc_unsigned operator | (unsigned long       u, const sc_unsigned&  v);
00378     sc_signed operator | (int                 u, const sc_unsigned&  v);
00379   inline sc_unsigned operator | (unsigned int        u, const sc_unsigned&  v);
00380 
00381   sc_unsigned operator | (const sc_unsigned&  u, const sc_uint_base& v);
00382     sc_signed operator | (const sc_unsigned&  u, const sc_int_base&  v);
00383   sc_unsigned operator | (const sc_uint_base& u, const sc_unsigned&  v);
00384     sc_signed operator | (const sc_int_base&  u, const sc_unsigned&  v);
00385 
00386   // Bitwise XOR operators:
00387 
00388     sc_signed operator ^ (const sc_unsigned&  u, const sc_signed&    v);
00389     sc_signed operator ^ (const sc_signed&    u, const sc_unsigned&  v);
00390 
00391   sc_unsigned operator ^ (const sc_unsigned&  u, const sc_unsigned&  v);
00392     sc_signed operator ^ (const sc_unsigned&  u, int64               v);
00393   sc_unsigned operator ^ (const sc_unsigned&  u, uint64              v);
00394     sc_signed operator ^ (const sc_unsigned&  u, long                v);
00395   sc_unsigned operator ^ (const sc_unsigned&  u, unsigned long       v);
00396     sc_signed operator ^ (const sc_unsigned&  u, int                 v);
00397   inline sc_unsigned operator ^ (const sc_unsigned&  u, unsigned int        v);
00398 
00399     sc_signed operator ^ (int64               u, const sc_unsigned&  v);
00400   sc_unsigned operator ^ (uint64              u, const sc_unsigned&  v);
00401     sc_signed operator ^ (long                u, const sc_unsigned&  v);
00402   sc_unsigned operator ^ (unsigned long       u, const sc_unsigned&  v);
00403     sc_signed operator ^ (int                 u, const sc_unsigned&  v);
00404   inline sc_unsigned operator ^ (unsigned int        u, const sc_unsigned&  v);
00405 
00406   sc_unsigned operator ^ (const sc_unsigned&  u, const sc_uint_base& v);
00407     sc_signed operator ^ (const sc_unsigned&  u, const sc_int_base&  v);
00408   sc_unsigned operator ^ (const sc_uint_base& u, const sc_unsigned&  v);
00409     sc_signed operator ^ (const sc_int_base&  u, const sc_unsigned&  v);
00410 
00411   // SHIFT OPERATORS:
00412 
00413   // LEFT SHIFT operators:
00414 
00415   sc_unsigned operator << (const sc_unsigned&  u, const sc_signed&    v);
00416     sc_signed operator << (const sc_signed&    u, const sc_unsigned&  v);
00417 
00418   sc_unsigned operator << (const sc_unsigned&  u, const sc_unsigned&  v);
00419   sc_unsigned operator << (const sc_unsigned&  u, int64               v);
00420   sc_unsigned operator << (const sc_unsigned&  u, uint64              v);
00421   sc_unsigned operator << (const sc_unsigned&  u, long                v);
00422   sc_unsigned operator << (const sc_unsigned&  u, unsigned long       v);
00423   inline sc_unsigned operator << (const sc_unsigned&  u, int                 v);
00424   inline sc_unsigned operator << (const sc_unsigned&  u, unsigned int        v);
00425 
00426   sc_unsigned operator << (const sc_unsigned&  u, const sc_uint_base& v);
00427   sc_unsigned operator << (const sc_unsigned&  u, const sc_int_base&  v);
00428 
00429   // RIGHT SHIFT operators:
00430 
00431   sc_unsigned operator >> (const sc_unsigned&  u, const sc_signed&    v);
00432     sc_signed operator >> (const sc_signed&    u, const sc_unsigned&  v);
00433 
00434   sc_unsigned operator >> (const sc_unsigned&  u, const sc_unsigned&  v);
00435   sc_unsigned operator >> (const sc_unsigned&  u, int64               v);
00436   sc_unsigned operator >> (const sc_unsigned&  u, uint64              v);
00437   sc_unsigned operator >> (const sc_unsigned&  u, long                v);
00438   sc_unsigned operator >> (const sc_unsigned&  u, unsigned long       v);
00439   inline sc_unsigned operator >> (const sc_unsigned&  u, int                 v);
00440   inline sc_unsigned operator >> (const sc_unsigned&  u, unsigned int        v);
00441 
00442   sc_unsigned operator >> ( const sc_unsigned& , const sc_uint_base& );
00443   sc_unsigned operator >> ( const sc_unsigned&, const sc_int_base& );
00444 
00445   // Unary arithmetic operators
00446   sc_unsigned operator + (const sc_unsigned& u);
00447   sc_signed operator - (const sc_unsigned& u);
00448 
00449   // LOGICAL OPERATORS:
00450 
00451   // Logical EQUAL operators:
00452 
00453   bool operator == (const sc_unsigned&  u, const sc_signed&    v);
00454   bool operator == (const sc_signed&    u, const sc_unsigned&  v);
00455 
00456   bool operator == (const sc_unsigned&  u, const sc_unsigned&  v);
00457   bool operator == (const sc_unsigned&  u, int64               v);
00458   bool operator == (const sc_unsigned&  u, uint64              v);
00459   bool operator == (const sc_unsigned&  u, long                v);
00460   bool operator == (const sc_unsigned&  u, unsigned long       v);
00461   inline bool operator == (const sc_unsigned&  u, int                 v);
00462   inline bool operator == (const sc_unsigned&  u, unsigned int        v);
00463 
00464   bool operator == (int64               u, const sc_unsigned&  v);
00465   bool operator == (uint64              u, const sc_unsigned&  v);
00466   bool operator == (long                u, const sc_unsigned&  v);
00467   bool operator == (unsigned long       u, const sc_unsigned&  v);
00468   inline bool operator == (int                 u, const sc_unsigned&  v);
00469   inline bool operator == (unsigned int        u, const sc_unsigned&  v) ;
00470 
00471   bool operator == (const sc_unsigned&  u, const sc_uint_base& v);
00472   bool operator == (const sc_unsigned&  u, const sc_int_base&  v);
00473   bool operator == (const sc_uint_base& u, const sc_unsigned&  v);
00474   bool operator == (const sc_int_base&  u, const sc_unsigned&  v);
00475 
00476   // Logical NOT_EQUAL operators:
00477 
00478   bool operator != (const sc_unsigned&  u, const sc_signed&    v);
00479   bool operator != (const sc_signed&    u, const sc_unsigned&  v);
00480 
00481   bool operator != (const sc_unsigned&  u, const sc_unsigned&  v);
00482   bool operator != (const sc_unsigned&  u, int64               v);
00483   bool operator != (const sc_unsigned&  u, uint64              v);
00484   bool operator != (const sc_unsigned&  u, long                v);
00485   bool operator != (const sc_unsigned&  u, unsigned long       v);
00486   inline bool operator != (const sc_unsigned&  u, int                 v);
00487   inline bool operator != (const sc_unsigned&  u, unsigned int        v);
00488 
00489   bool operator != (int64               u, const sc_unsigned&  v);
00490   bool operator != (uint64              u, const sc_unsigned&  v);
00491   bool operator != (long                u, const sc_unsigned&  v);
00492   bool operator != (unsigned long       u, const sc_unsigned&  v);
00493   inline bool operator != (int                 u, const sc_unsigned&  v);
00494   inline bool operator != (unsigned int        u, const sc_unsigned&  v);
00495 
00496   bool operator != (const sc_unsigned&  u, const sc_uint_base& v);
00497   bool operator != (const sc_unsigned&  u, const sc_int_base&  v);
00498   bool operator != (const sc_uint_base& u, const sc_unsigned&  v);
00499   bool operator != (const sc_int_base&  u, const sc_unsigned&  v);
00500 
00501   // Logical LESS_THAN operators:
00502 
00503   bool operator < (const sc_unsigned&  u, const sc_signed&    v);
00504   bool operator < (const sc_signed&    u, const sc_unsigned&  v);
00505 
00506   bool operator < (const sc_unsigned&  u, const sc_unsigned&  v);
00507   bool operator < (const sc_unsigned&  u, int64               v);
00508   bool operator < (const sc_unsigned&  u, uint64              v);
00509   bool operator < (const sc_unsigned&  u, long                v);
00510   bool operator < (const sc_unsigned&  u, unsigned long       v);
00511   inline bool operator < (const sc_unsigned&  u, int                 v);
00512   inline bool operator < (const sc_unsigned&  u, unsigned int        v);
00513 
00514   bool operator < (int64               u, const sc_unsigned&  v);
00515   bool operator < (uint64              u, const sc_unsigned&  v);
00516   bool operator < (long                u, const sc_unsigned&  v);
00517   bool operator < (unsigned long       u, const sc_unsigned&  v);
00518   inline bool operator < (int                 u, const sc_unsigned&  v);
00519   inline bool operator < (unsigned int        u, const sc_unsigned&  v);
00520 
00521   bool operator < (const sc_unsigned&  u, const sc_uint_base& v);
00522   bool operator < (const sc_unsigned&  u, const sc_int_base&  v);
00523   bool operator < (const sc_uint_base& u, const sc_unsigned&  v);
00524   bool operator < (const sc_int_base&  u, const sc_unsigned&  v);
00525 
00526   // Logical LESS_THAN_AND_EQUAL operators:
00527 
00528   bool operator <= (const sc_unsigned&  u, const sc_signed&    v);
00529   bool operator <= (const sc_signed&    u, const sc_unsigned&  v);
00530 
00531   bool operator <= (const sc_unsigned&  u, const sc_unsigned&  v);
00532   bool operator <= (const sc_unsigned&  u, int64               v);
00533   bool operator <= (const sc_unsigned&  u, uint64              v);
00534   bool operator <= (const sc_unsigned&  u, long                v);
00535   bool operator <= (const sc_unsigned&  u, unsigned long       v);
00536   inline bool operator <= (const sc_unsigned&  u, int                 v);
00537   inline bool operator <= (const sc_unsigned&  u, unsigned int        v);
00538 
00539   bool operator <= (int64               u, const sc_unsigned&  v);
00540   bool operator <= (uint64              u, const sc_unsigned&  v);
00541   bool operator <= (long                u, const sc_unsigned&  v);
00542   bool operator <= (unsigned long       u, const sc_unsigned&  v);
00543   inline bool operator <= (int                 u, const sc_unsigned&  v);
00544   inline bool operator <= (unsigned int        u, const sc_unsigned&  v);
00545 
00546   bool operator <= (const sc_unsigned&  u, const sc_uint_base& v);
00547   bool operator <= (const sc_unsigned&  u, const sc_int_base&  v);
00548   bool operator <= (const sc_uint_base& u, const sc_unsigned&  v);
00549   bool operator <= (const sc_int_base&  u, const sc_unsigned&  v);
00550 
00551   // Logical GREATER_THAN operators:
00552 
00553   bool operator > (const sc_unsigned&  u, const sc_signed&    v);
00554   bool operator > (const sc_signed&    u, const sc_unsigned&  v);
00555 
00556   bool operator > (const sc_unsigned&  u, const sc_unsigned&  v);
00557   bool operator > (const sc_unsigned&  u, int64               v);
00558   bool operator > (const sc_unsigned&  u, uint64              v);
00559   bool operator > (const sc_unsigned&  u, long                v);
00560   bool operator > (const sc_unsigned&  u, unsigned long       v);
00561   inline bool operator > (const sc_unsigned&  u, int                 v);
00562   inline bool operator > (const sc_unsigned&  u, unsigned int        v);
00563 
00564   bool operator > (int64               u, const sc_unsigned&  v);
00565   bool operator > (uint64              u, const sc_unsigned&  v);
00566   bool operator > (long                u, const sc_unsigned&  v);
00567   bool operator > (unsigned long       u, const sc_unsigned&  v);
00568   inline bool operator > (int                 u, const sc_unsigned&  v);
00569   inline bool operator > (unsigned int        u, const sc_unsigned&  v);
00570 
00571   bool operator > (const sc_unsigned&  u, const sc_uint_base& v);
00572   bool operator > (const sc_unsigned&  u, const sc_int_base&  v);
00573   bool operator > (const sc_uint_base& u, const sc_unsigned&  v);
00574   bool operator > (const sc_int_base&  u, const sc_unsigned&  v);
00575 
00576   // Logical GREATER_THAN_AND_EQUAL operators:
00577 
00578   bool operator >= (const sc_unsigned&  u, const sc_signed&    v);
00579   bool operator >= (const sc_signed&    u, const sc_unsigned&  v);
00580 
00581   bool operator >= (const sc_unsigned&  u, const sc_unsigned&  v);
00582   bool operator >= (const sc_unsigned&  u, int64               v);
00583   bool operator >= (const sc_unsigned&  u, uint64              v);
00584   bool operator >= (const sc_unsigned&  u, long                v);
00585   bool operator >= (const sc_unsigned&  u, unsigned long       v);
00586   inline bool operator >= (const sc_unsigned&  u, int                 v);
00587   inline bool operator >= (const sc_unsigned&  u, unsigned int        v);
00588 
00589   bool operator >= (int64               u, const sc_unsigned&  v);
00590   bool operator >= (uint64              u, const sc_unsigned&  v);
00591   bool operator >= (long                u, const sc_unsigned&  v);
00592   bool operator >= (unsigned long       u, const sc_unsigned&  v);
00593   inline bool operator >= (int                 u, const sc_unsigned&  v);
00594   inline bool operator >= (unsigned int        u, const sc_unsigned&  v);
00595 
00596   bool operator >= (const sc_unsigned&  u, const sc_uint_base& v);
00597   bool operator >= (const sc_unsigned&  u, const sc_int_base&  v);
00598   bool operator >= (const sc_uint_base& u, const sc_unsigned&  v);
00599   bool operator >= (const sc_int_base&  u, const sc_unsigned&  v);
00600 
00601   // Bitwise NOT operator (unary).
00602   sc_unsigned operator ~ (const sc_unsigned& u);
00603 
00604 // ----------------------------------------------------------------------------
00605 //  CLASS : sc_unsigned_bitref_r
00606 //
00607 //  Proxy class for sc_unsigned bit selection (r-value only).
00608 // ----------------------------------------------------------------------------
00609 
00610 class sc_unsigned_bitref_r : public sc_value_base
00611 {
00612     friend class sc_unsigned;
00613 
00614 protected:
00615 
00616     // construction and initialization:
00617 
00618     sc_unsigned_bitref_r()
00619         {}
00620 
00621     void initialize( const sc_unsigned* obj_p, int index_ )
00622         {
00623         m_obj_p = CCAST<sc_unsigned*>( obj_p );
00624         m_index = index_;
00625     }
00626 
00627 public:
00628 
00629     // destructor
00630 
00631     virtual ~sc_unsigned_bitref_r()
00632     {}
00633 
00634     // copy constructor
00635 
00636     sc_unsigned_bitref_r( const sc_unsigned_bitref_r& a )
00637     : m_index( a.m_index ), m_obj_p( a.m_obj_p )
00638     {}
00639 
00640     // capacity
00641 
00642     int length() const
00643     { return 1; }
00644 
00645 
00646     // implicit conversion to bool
00647 
00648     operator uint64 () const;
00649     bool operator ! () const;
00650     bool operator ~ () const;
00651 
00652 
00653     // explicit conversions
00654 
00655     uint64 value() const
00656     { return operator uint64(); }
00657 
00658     bool to_bool() const
00659     { return operator uint64(); }
00660 
00661 
00662     // concatenation support
00663 
00664     virtual int concat_length(bool* xz_present_p) const
00665         { if ( xz_present_p ) *xz_present_p = false; return 1; }
00666     virtual uint64 concat_get_uint64() const
00667         { return (uint64)operator uint64(); }
00668     virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const
00669         {
00670             int  bit_mask = 1 << (low_i % BITS_PER_DIGIT);
00671             int  word_i = low_i / BITS_PER_DIGIT;
00672         dst_p[word_i] &= ~bit_mask;
00673         return false;
00674         }
00675     virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const
00676         {
00677             int  bit_mask = 1 << (low_i % BITS_PER_DIGIT);
00678         bool result;    // True if non-zero.
00679             int  word_i = low_i / BITS_PER_DIGIT;
00680             if ( operator uint64() )
00681         {
00682                 dst_p[word_i] |= bit_mask;
00683         result = true;
00684         }
00685             else
00686         {
00687                 dst_p[word_i] &= ~bit_mask;
00688         result = false;
00689         }
00690         return result;
00691         }
00692 
00693     // other methods
00694 
00695     void print( ::std::ostream& os = ::std::cout ) const
00696     { os << to_bool(); }
00697 
00698 protected:
00699 
00700     int          m_index;
00701     sc_unsigned* m_obj_p;
00702 
00703 private:
00704 
00705     // disabled
00706     const sc_unsigned_bitref_r& operator = ( const sc_unsigned_bitref_r& );
00707 };
00708 
00709 
00710 
00711 inline
00712 ::std::ostream&
00713 operator << ( ::std::ostream&, const sc_unsigned_bitref_r& );
00714 
00715 
00716 // ----------------------------------------------------------------------------
00717 //  CLASS : sc_unsigned_bitref
00718 //
00719 //  Proxy class for sc_unsigned bit selection (r-value and l-value).
00720 // ----------------------------------------------------------------------------
00721 
00722 class sc_unsigned_bitref
00723     : public sc_unsigned_bitref_r
00724 {
00725     friend class sc_unsigned;
00726     friend class sc_core::sc_vpool<sc_unsigned_bitref>;
00727 
00728 
00729 protected: // construction
00730 
00731     sc_unsigned_bitref()
00732         {}
00733 
00734 public:
00735 
00736     // copy constructor
00737 
00738     sc_unsigned_bitref( const sc_unsigned_bitref& a )
00739     : sc_unsigned_bitref_r( a )
00740     {}
00741 
00742 
00743     // assignment operators
00744 
00745     const sc_unsigned_bitref& operator = ( const sc_unsigned_bitref_r& );
00746     const sc_unsigned_bitref& operator = ( const sc_unsigned_bitref& );
00747     const sc_unsigned_bitref& operator = ( bool );
00748 
00749     const sc_unsigned_bitref& operator &= ( bool );
00750     const sc_unsigned_bitref& operator |= ( bool );
00751     const sc_unsigned_bitref& operator ^= ( bool );
00752 
00753     // concatenation methods
00754 
00755     virtual void concat_set(int64 src, int low_i);
00756     virtual void concat_set(const sc_signed& src, int low_i);
00757     virtual void concat_set(const sc_unsigned& src, int low_i);
00758     virtual void concat_set(uint64 src, int low_i);
00759 
00760 
00761     // other methods
00762 
00763     void scan( ::std::istream& is = ::std::cin );
00764 
00765 protected:
00766     static sc_core::sc_vpool<sc_unsigned_bitref> m_pool;
00767 };
00768 
00769 
00770 
00771 inline
00772 ::std::istream&
00773 operator >> ( ::std::istream&, sc_unsigned_bitref& );
00774 
00775 
00776 // ----------------------------------------------------------------------------
00777 //  CLASS : sc_unsigned_subref_r
00778 //
00779 //  Proxy class for sc_unsigned part selection (r-value only).
00780 // ----------------------------------------------------------------------------
00781 
00782 class sc_unsigned_subref_r : public sc_value_base
00783 {
00784     friend class sc_signed;
00785     friend class sc_unsigned;
00786     friend class sc_unsigned_signal;
00787 
00788 protected:
00789 
00790     // constructor
00791 
00792     sc_unsigned_subref_r()
00793     {}
00794 
00795     void initialize( const sc_unsigned* obj_p, int left_, int right_ )
00796     {
00797         m_obj_p = CCAST<sc_unsigned*>( obj_p );
00798         m_left = left_;
00799         m_right = right_;
00800     }
00801 
00802 public:
00803 
00804     // destructor
00805 
00806     virtual ~sc_unsigned_subref_r()
00807     {}
00808 
00809 
00810     // copy constructor
00811 
00812     sc_unsigned_subref_r( const sc_unsigned_subref_r& a )
00813     : m_left( a.m_left ), m_obj_p( a.m_obj_p ), m_right( a.m_right )
00814     {}
00815 
00816 
00817     // capacity
00818 
00819     int length() const
00820     { return m_left >= m_right ? (m_left-m_right+1) : (m_right-m_left+1 ); }
00821 
00822 
00823     // implicit conversion to sc_unsigned
00824 
00825     operator sc_unsigned () const;
00826 
00827 
00828     // explicit conversions
00829 
00830     int           to_int() const;
00831     unsigned int  to_uint() const;
00832     long          to_long() const;
00833     unsigned long to_ulong() const;
00834     int64         to_int64() const;
00835     uint64        to_uint64() const;
00836     double        to_double() const;
00837 
00838 
00839     // explicit conversion to character string
00840 
00841     const std::string to_string( sc_numrep numrep = SC_DEC ) const;
00842     const std::string to_string( sc_numrep numrep, bool w_prefix ) const;
00843 
00844 
00845     // concatenation support
00846 
00847     virtual int concat_length(bool* xz_present_p) const
00848     {
00849         if ( xz_present_p ) *xz_present_p = false;
00850         return m_left - m_right + 1;
00851     }
00852     virtual uint64 concat_get_uint64() const;
00853     virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const;
00854     virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const;
00855 
00856     // reduce methods
00857 
00858     bool and_reduce() const;
00859     bool nand_reduce() const;
00860     bool or_reduce() const;
00861     bool nor_reduce() const;
00862     bool xor_reduce() const ;
00863     bool xnor_reduce() const;
00864 
00865     // other methods
00866 
00867     void print( ::std::ostream& os = ::std::cout ) const
00868     { os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); }
00869 
00870 protected:
00871 
00872     int          m_left;   // Left-most bit in this part selection.
00873     sc_unsigned* m_obj_p;  // Target of this part selection.
00874     int          m_right;  // Right-most bit in this part selection.
00875 
00876 private:
00877 
00878     // disabled
00879     const sc_unsigned_subref_r& operator = ( const sc_unsigned_subref_r& );
00880 };
00881 
00882 
00883 
00884 inline
00885 ::std::ostream&
00886 operator << ( ::std::ostream&, const sc_unsigned_subref_r& );
00887 
00888 
00889 // ----------------------------------------------------------------------------
00890 //  CLASS : sc_unsigned_subref
00891 //
00892 //  Proxy class for sc_unsigned part selection (r-value and l-value).
00893 // ----------------------------------------------------------------------------
00894 
00895 class sc_unsigned_subref
00896     : public sc_unsigned_subref_r
00897 {
00898     friend class sc_unsigned;
00899     friend class sc_core::sc_vpool<sc_unsigned_subref>;
00900 
00901 
00902     // constructor
00903 
00904 protected:
00905     sc_unsigned_subref()
00906     {}
00907 
00908 public:
00909 
00910     // copy constructor
00911 
00912     sc_unsigned_subref( const sc_unsigned_subref& a )
00913     : sc_unsigned_subref_r( a )
00914     {}
00915 
00916     // assignment operators
00917 
00918     const sc_unsigned_subref& operator = ( const sc_unsigned_subref_r& a );
00919     const sc_unsigned_subref& operator = ( const sc_unsigned_subref& a );
00920     const sc_unsigned_subref& operator = ( const sc_unsigned& a );
00921 
00922     template<class T>
00923     const sc_unsigned_subref& operator = ( const sc_generic_base<T>& a );
00924     const sc_unsigned_subref& operator = ( const sc_signed_subref_r& a );
00925     const sc_unsigned_subref& operator = ( const sc_signed& a );
00926 
00927     const sc_unsigned_subref& operator = ( const char* a );
00928     const sc_unsigned_subref& operator = ( unsigned long a );
00929     const sc_unsigned_subref& operator = ( long a );
00930 
00931     const sc_unsigned_subref& operator = ( unsigned int a )
00932     { return operator = ( (unsigned long) a ); }
00933 
00934     const sc_unsigned_subref& operator = ( int a )
00935     { return operator = ( (long) a ); }
00936 
00937     const sc_unsigned_subref& operator = ( uint64 a );
00938     const sc_unsigned_subref& operator = ( int64 a );
00939     const sc_unsigned_subref& operator = ( double a );
00940     const sc_unsigned_subref& operator = ( const sc_int_base& a );
00941     const sc_unsigned_subref& operator = ( const sc_uint_base& a );
00942 
00943     // concatenation methods
00944 
00945     virtual void concat_set(int64 src, int low_i);
00946     virtual void concat_set(const sc_signed& src, int low_i);
00947     virtual void concat_set(const sc_unsigned& src, int low_i);
00948     virtual void concat_set(uint64 src, int low_i);
00949 
00950     // other methods
00951 
00952     void scan( ::std::istream& is = ::std::cin );
00953 
00954 protected:
00955     static sc_core::sc_vpool<sc_unsigned_subref> m_pool;
00956 };
00957 
00958 
00959 
00960 inline
00961 ::std::istream&
00962 operator >> ( ::std::istream&, sc_unsigned_subref& );
00963 
00964 
00965 // ----------------------------------------------------------------------------
00966 //  CLASS : sc_unsigned
00967 //
00968 //  Arbitrary precision unsigned number.
00969 // ----------------------------------------------------------------------------
00970 
00971 class sc_unsigned : public sc_value_base
00972 {
00973     friend class sc_concatref;
00974     friend class sc_unsigned_bitref_r;
00975     friend class sc_unsigned_bitref;
00976     friend class sc_unsigned_subref_r;
00977     friend class sc_unsigned_subref;
00978     friend class sc_signed;
00979     friend class sc_signed_subref;
00980     friend class sc_signed_subref_r;
00981 
00982   // Needed for types using sc_unsigned.
00983   typedef bool elemtype;
00984 
00985 public:
00986 
00987     // constructors
00988 
00989     explicit sc_unsigned( int nb = sc_length_param().len() );
00990     sc_unsigned( const sc_unsigned& v );
00991     sc_unsigned( const sc_signed&   v );
00992     template<class T>
00993     explicit sc_unsigned( const sc_generic_base<T>& v );
00994     explicit sc_unsigned( const sc_bv_base& v );
00995     explicit sc_unsigned( const sc_lv_base& v );
00996     explicit sc_unsigned( const sc_int_subref_r& v );
00997     explicit sc_unsigned( const sc_uint_subref_r& v );
00998     explicit sc_unsigned( const sc_signed_subref_r& v );
00999     explicit sc_unsigned( const sc_unsigned_subref_r& v );
01000 
01001 
01002 
01003     // assignment operators
01004 
01005     const sc_unsigned& operator = (const sc_unsigned&        v);
01006     const sc_unsigned& operator = (const sc_unsigned_subref_r& a );
01007 
01008     template<class T>
01009     const sc_unsigned& operator = ( const sc_generic_base<T>& a )
01010         { a->to_sc_unsigned(*this); return *this; }
01011 
01012     const sc_unsigned& operator = (const sc_signed&          v);
01013     const sc_unsigned& operator = (const sc_signed_subref_r& a );
01014 
01015     const sc_unsigned& operator = ( const char*               v);
01016     const sc_unsigned& operator = ( int64                     v);
01017     const sc_unsigned& operator = ( uint64                    v);
01018     const sc_unsigned& operator = ( long                      v);
01019     const sc_unsigned& operator = ( unsigned long             v);
01020 
01021     const sc_unsigned& operator = ( int                       v)
01022     { return operator=((long) v); }
01023 
01024     const sc_unsigned& operator = ( unsigned int              v)
01025     { return operator=((unsigned long) v); }
01026 
01027     const sc_unsigned& operator = ( double                    v);
01028     const sc_unsigned& operator = ( const sc_int_base&        v);
01029     const sc_unsigned& operator = ( const sc_uint_base&       v);
01030 
01031     const sc_unsigned& operator = ( const sc_bv_base& );
01032     const sc_unsigned& operator = ( const sc_lv_base& );
01033 
01034 #ifdef SC_INCLUDE_FX
01035     const sc_unsigned& operator = ( const sc_fxval& );
01036     const sc_unsigned& operator = ( const sc_fxval_fast& );
01037     const sc_unsigned& operator = ( const sc_fxnum& );
01038     const sc_unsigned& operator = ( const sc_fxnum_fast& );
01039 #endif
01040 
01041 
01042     // destructor
01043 
01044     virtual ~sc_unsigned()
01045     {
01046 #           ifndef SC_MAX_NBITS
01047             delete [] digit;
01048 #           endif
01049     }
01050 
01051     // Concatenation support:
01052 
01053     sc_digit* get_raw() const { return digit; }
01054     virtual int concat_length(bool* xz_present_p) const
01055        { if ( xz_present_p ) *xz_present_p = false; return nbits-1; }
01056     virtual bool concat_get_ctrl( sc_digit* dst_p, int low_i ) const;
01057     virtual bool concat_get_data( sc_digit* dst_p, int low_i ) const;
01058     virtual uint64 concat_get_uint64() const;
01059     virtual void concat_set(int64 src, int low_i);
01060     virtual void concat_set(const sc_signed& src, int low_i);
01061     virtual void concat_set(const sc_unsigned& src, int low_i);
01062     virtual void concat_set(uint64 src, int low_i);
01063 
01064     // Increment operators.
01065 
01066     sc_unsigned& operator ++ ();
01067     const sc_unsigned operator ++ (int);
01068 
01069     // Decrement operators.
01070 
01071     sc_unsigned& operator -- ();
01072     const sc_unsigned operator -- (int);
01073 
01074 
01075     // bit selection
01076 
01077     inline void check_index( int i ) const
01078         { if ( (i < 0) || (i >= nbits-1) ) invalid_index(i); }
01079 
01080     void invalid_index( int i ) const;
01081 
01082     sc_unsigned_bitref& operator [] ( int i )
01083         {
01084             check_index(i);
01085             sc_unsigned_bitref* result_p =
01086             sc_unsigned_bitref::m_pool.allocate();
01087             result_p->initialize( this, i );
01088             return *result_p;
01089         }
01090 
01091     const sc_unsigned_bitref_r& operator [] ( int i ) const
01092         {
01093             check_index(i);
01094             sc_unsigned_bitref* result_p =
01095             sc_unsigned_bitref::m_pool.allocate();
01096             result_p->initialize( this, i );
01097             return *result_p;
01098         }
01099 
01100     sc_unsigned_bitref& bit( int i )
01101         {
01102             check_index(i);
01103             sc_unsigned_bitref* result_p =
01104             sc_unsigned_bitref::m_pool.allocate();
01105             result_p->initialize( this, i );
01106             return *result_p;
01107         }
01108 
01109     const sc_unsigned_bitref_r& bit( int i ) const
01110         {
01111             check_index(i);
01112             sc_unsigned_bitref* result_p =
01113             sc_unsigned_bitref::m_pool.allocate();
01114             result_p->initialize( this, i );
01115             return *result_p;
01116         }
01117 
01118 
01119     // part selection
01120 
01121     // Subref operators. Help access the range of bits from the ith to
01122     // jth. These indices have arbitrary precedence with respect to each
01123     // other, i.e., we can have i <= j or i > j. Note the equivalence
01124     // between range(i, j) and operator (i, j). Also note that
01125     // operator (i, i) returns an unsigned number that corresponds to the
01126     // bit operator [i], so these two forms are not the same.
01127 
01128     inline void check_range( int l, int r ) const
01129         {
01130             if ( l < r )
01131             {
01132                 if ( (l < 0) || (r >= nbits-1) ) invalid_range(l,r);
01133             }
01134             else
01135             {
01136                 if ( (r < 0) || (l >= nbits-1) ) invalid_range(l,r);
01137             }
01138         }
01139 
01140     void invalid_range( int l, int r ) const;
01141 
01142     sc_unsigned_subref& range( int i, int j )
01143         {
01144             check_range(i,j);
01145             sc_unsigned_subref* result_p =
01146             sc_unsigned_subref::m_pool.allocate();
01147             result_p->initialize( this, i, j );
01148             return *result_p;
01149         }
01150 
01151     const sc_unsigned_subref_r& range( int i, int j ) const
01152         {
01153             check_range(i,j);
01154             sc_unsigned_subref* result_p =
01155             sc_unsigned_subref::m_pool.allocate();
01156             result_p->initialize( this, i, j );
01157             return *result_p;
01158         }
01159 
01160     sc_unsigned_subref& operator () ( int i, int j )
01161         {
01162             check_range(i,j);
01163             sc_unsigned_subref* result_p =
01164             sc_unsigned_subref::m_pool.allocate();
01165             result_p->initialize( this, i, j );
01166             return *result_p;
01167         }
01168 
01169     const sc_unsigned_subref_r& operator () ( int i, int j ) const
01170         {
01171             check_range(i,j);
01172             sc_unsigned_subref* result_p =
01173             sc_unsigned_subref::m_pool.allocate();
01174             result_p->initialize( this, i, j );
01175             return *result_p;
01176         }
01177 
01178     // explicit conversions
01179 
01180     int           to_int() const;
01181     unsigned int  to_uint() const;
01182     long          to_long() const;
01183     unsigned long to_ulong() const;
01184     int64         to_int64() const;
01185     uint64        to_uint64() const;
01186     double        to_double() const;
01187 
01188 #ifdef SC_DT_DEPRECATED
01189     int to_signed() const
01190     { return to_int(); }
01191 
01192     unsigned int to_unsigned() const
01193     { return to_uint(); }
01194 #endif
01195 
01196     // explicit conversion to character string
01197 
01198     const std::string to_string( sc_numrep numrep = SC_DEC ) const;
01199     const std::string to_string( sc_numrep numrep, bool w_prefix ) const;
01200 
01201     // Print functions. dump prints the internals of the class.
01202 
01203     void print( ::std::ostream& os = ::std::cout ) const
01204     { os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); }
01205 
01206     void scan( ::std::istream& is = ::std::cin );
01207 
01208     void dump( ::std::ostream& os = ::std::cout ) const;
01209 
01210 
01211   // Functions to find various properties.
01212   int  length() const { return nbits - 1; }  // Bit width.
01213   bool iszero() const;                       // Is the number zero?
01214   bool sign() const { return 0; }            // Sign.
01215 
01216     // reduce methods
01217 
01218     bool and_reduce() const;
01219 
01220     bool nand_reduce() const
01221         { return ( ! and_reduce() ); }
01222 
01223     bool or_reduce() const;
01224 
01225     bool nor_reduce() const
01226         { return ( ! or_reduce() ); }
01227 
01228     bool xor_reduce() const;
01229 
01230     bool xnor_reduce() const
01231         { return ( ! xor_reduce() ); }
01232 
01233 
01234   // Functions to access individual bits.
01235   bool test(int i) const;      // Is the ith bit 0 or 1?
01236   void set(int i);             // Set the ith bit to 1.
01237   void clear(int i);           // Set the ith bit to 0.
01238   void set(int i, bool v)      // Set the ith bit to v.
01239     { if (v) set(i); else clear(i);  }
01240   void invert(int i)           // Negate the ith bit.
01241     { if (test(i)) clear(i); else set(i);  }
01242 
01243   // Make the number equal to its mirror image.
01244   void reverse();
01245 
01246   // Get/set a packed bit representation of the number.
01247   void get_packed_rep(sc_digit *buf) const;
01248   void set_packed_rep(sc_digit *buf);
01249 
01250   /*
01251     The comparison of the old and new semantics are as follows:
01252 
01253     Let s = sc_signed,
01254         u = sc_unsigned,
01255         un = { uint64, unsigned long, unsigned int },
01256         sn = { int64, long, int, char* }, and
01257         OP = { +, -, *, /, % }.
01258 
01259     Old semantics:                     New semantics:
01260       u OP u -> u                        u OP u -> u
01261       s OP u -> u                        s OP u -> s
01262       u OP s -> u                        u OP s -> s
01263       s OP s -> s                        s OP s -> s
01264 
01265       u OP un = un OP u -> u             u OP un = un OP u -> u
01266       u OP sn = sn OP u -> u             u OP sn = sn OP u -> s
01267 
01268       s OP un = un OP s -> s             s OP un = un OP s -> s
01269       s OP sn = sn OP s -> s             s OP sn = sn OP s -> s
01270 
01271     In the new semantics, the result is u if both operands are u; the
01272     result is s otherwise. The only exception is subtraction. The result
01273     of a subtraction is always s.
01274 
01275     The old semantics is like C/C++ semantics on integer types; the
01276     new semantics is due to the VSIA C/C++ data types standard.
01277    */
01278 
01279   // ARITHMETIC OPERATORS:
01280 
01281   // ADDition operators:
01282 
01283   friend   sc_signed operator + (const sc_unsigned&  u, const sc_signed&    v);
01284   friend   sc_signed operator + (const sc_signed&    u, const sc_unsigned&  v);
01285 
01286   friend sc_unsigned operator + (const sc_unsigned&  u, const sc_unsigned&  v);
01287   friend   sc_signed operator + (const sc_unsigned&  u, int64               v);
01288   friend sc_unsigned operator + (const sc_unsigned&  u, uint64              v);
01289   friend   sc_signed operator + (const sc_unsigned&  u, long                v);
01290   friend sc_unsigned operator + (const sc_unsigned&  u, unsigned long       v);
01291   friend   sc_signed operator + (const sc_unsigned&  u, int                 v);
01292   friend sc_unsigned operator + (const sc_unsigned&  u, unsigned int        v)
01293     { return operator+(u, (unsigned long) v); }
01294 
01295   friend   sc_signed operator + (int64               u, const sc_unsigned&  v);
01296   friend sc_unsigned operator + (uint64              u, const sc_unsigned&  v);
01297   friend   sc_signed operator + (long                u, const sc_unsigned&  v);
01298   friend sc_unsigned operator + (unsigned long       u, const sc_unsigned&  v);
01299   friend   sc_signed operator + (int                 u, const sc_unsigned&  v);
01300   friend sc_unsigned operator + (unsigned int        u, const sc_unsigned&  v)
01301     { return operator+((unsigned long) u,  v); }
01302 
01303   const sc_unsigned& operator += (const sc_signed&    v);
01304   const sc_unsigned& operator += (const sc_unsigned&  v);
01305   const sc_unsigned& operator += (int64               v);
01306   const sc_unsigned& operator += (uint64              v);
01307   const sc_unsigned& operator += (long                v);
01308   const sc_unsigned& operator += (unsigned long       v);
01309   const sc_unsigned& operator += (int                 v)
01310     { return operator+=((long) v); }
01311   const sc_unsigned& operator += (unsigned int        v)
01312     { return operator+=((unsigned long) v); }
01313 
01314   friend sc_unsigned operator + (const sc_unsigned&  u, const sc_uint_base& v);
01315   friend   sc_signed operator + (const sc_unsigned&  u, const sc_int_base&  v);
01316   friend sc_unsigned operator + (const sc_uint_base& u, const sc_unsigned&  v);
01317   friend   sc_signed operator + (const sc_int_base&  u, const sc_unsigned&  v);
01318   const sc_unsigned& operator += (const sc_int_base&  v);
01319   const sc_unsigned& operator += (const sc_uint_base& v);
01320 
01321   // SUBtraction operators:
01322 
01323   friend   sc_signed operator - (const sc_unsigned&  u, const sc_signed&    v);
01324   friend   sc_signed operator - (const sc_signed&    u, const sc_unsigned&  v);
01325 
01326   friend   sc_signed operator - (const sc_unsigned&  u, const sc_unsigned&  v);
01327   friend   sc_signed operator - (const sc_unsigned&  u, int64               v);
01328   friend   sc_signed operator - (const sc_unsigned&  u, uint64              v);
01329   friend   sc_signed operator - (const sc_unsigned&  u, long                v);
01330   friend   sc_signed operator - (const sc_unsigned&  u, unsigned long       v);
01331   friend   sc_signed operator - (const sc_unsigned&  u, int                 v);
01332   friend   sc_signed operator - (const sc_unsigned&  u, unsigned int        v);
01333 
01334   friend   sc_signed operator - (int64               u, const sc_unsigned&  v);
01335   friend   sc_signed operator - (uint64              u, const sc_unsigned&  v);
01336   friend   sc_signed operator - (long                u, const sc_unsigned&  v);
01337   friend   sc_signed operator - (unsigned long       u, const sc_unsigned&  v);
01338   friend   sc_signed operator - (int                 u, const sc_unsigned&  v);
01339   friend   sc_signed operator - (unsigned int        u, const sc_unsigned&  v);
01340 
01341   const sc_unsigned& operator -= (const sc_signed&    v);
01342   const sc_unsigned& operator -= (const sc_unsigned&  v);
01343   const sc_unsigned& operator -= (int64               v);
01344   const sc_unsigned& operator -= (uint64              v);
01345   const sc_unsigned& operator -= (long                v);
01346   const sc_unsigned& operator -= (unsigned long       v);
01347   const sc_unsigned& operator -= (int                 v)
01348     { return operator-=((long) v); }
01349   const sc_unsigned& operator -= (unsigned int        v)
01350     { return operator-=((unsigned long) v); }
01351 
01352   friend   sc_signed operator - (const sc_unsigned&  u, const sc_uint_base& v);
01353   friend   sc_signed operator - (const sc_unsigned&  u, const sc_int_base&  v);
01354   friend   sc_signed operator - (const sc_uint_base& u, const sc_unsigned&  v);
01355   friend   sc_signed operator - (const sc_int_base&  u, const sc_unsigned&  v);
01356   const sc_unsigned& operator -= (const sc_int_base&  v);
01357   const sc_unsigned& operator -= (const sc_uint_base& v);
01358 
01359   // MULtiplication operators:
01360 
01361   friend   sc_signed operator * (const sc_unsigned&  u, const sc_signed&    v);
01362   friend   sc_signed operator * (const sc_signed&    u, const sc_unsigned&  v);
01363 
01364   friend sc_unsigned operator * (const sc_unsigned&  u, const sc_unsigned&  v);
01365   friend   sc_signed operator * (const sc_unsigned&  u, int64               v);
01366   friend sc_unsigned operator * (const sc_unsigned&  u, uint64              v);
01367   friend   sc_signed operator * (const sc_unsigned&  u, long                v);
01368   friend sc_unsigned operator * (const sc_unsigned&  u, unsigned long       v);
01369   friend   sc_signed operator * (const sc_unsigned&  u, int                 v);
01370   friend sc_unsigned operator * (const sc_unsigned&  u, unsigned int        v)
01371     { return operator*(u, (unsigned long) v); }
01372 
01373   friend   sc_signed operator * (int64               u, const sc_unsigned&  v);
01374   friend sc_unsigned operator * (uint64              u, const sc_unsigned&  v);
01375   friend   sc_signed operator * (long                u, const sc_unsigned&  v);
01376   friend sc_unsigned operator * (unsigned long       u, const sc_unsigned&  v);
01377   friend   sc_signed operator * (int                 u, const sc_unsigned&  v);
01378   friend sc_unsigned operator * (unsigned int        u, const sc_unsigned&  v)
01379     { return operator*((unsigned long) u,  v); }
01380 
01381   const sc_unsigned& operator *= (const sc_signed&    v);
01382   const sc_unsigned& operator *= (const sc_unsigned&  v);
01383   const sc_unsigned& operator *= (int64               v);
01384   const sc_unsigned& operator *= (uint64              v);
01385   const sc_unsigned& operator *= (long                v);
01386   const sc_unsigned& operator *= (unsigned long       v);
01387   const sc_unsigned& operator *= (int                 v)
01388     { return operator*=((long) v); }
01389   const sc_unsigned& operator *= (unsigned int        v)
01390     { return operator*=((unsigned long) v); }
01391 
01392   friend sc_unsigned operator * (const sc_unsigned&  u, const sc_uint_base& v);
01393   friend   sc_signed operator * (const sc_unsigned&  u, const sc_int_base&  v);
01394   friend sc_unsigned operator * (const sc_uint_base& u, const sc_unsigned&  v);
01395   friend   sc_signed operator * (const sc_int_base&  u, const sc_unsigned&  v);
01396   const sc_unsigned& operator *= (const sc_int_base&  v);
01397   const sc_unsigned& operator *= (const sc_uint_base& v);
01398 
01399   // DIVision operators:
01400 
01401   friend   sc_signed operator / (const sc_unsigned&  u, const sc_signed&    v);
01402   friend   sc_signed operator / (const sc_signed&    u, const sc_unsigned&  v);
01403 
01404   friend sc_unsigned operator / (const sc_unsigned&  u, const sc_unsigned&  v);
01405   friend   sc_signed operator / (const sc_unsigned&  u, int64               v);
01406   friend sc_unsigned operator / (const sc_unsigned&  u, uint64              v);
01407   friend   sc_signed operator / (const sc_unsigned&  u, long                v);
01408   friend sc_unsigned operator / (const sc_unsigned&  u, unsigned long       v);
01409   friend   sc_signed operator / (const sc_unsigned&  u, int                 v);
01410   friend sc_unsigned operator / (const sc_unsigned&  u, unsigned int        v)
01411     { return operator/(u, (unsigned long) v); }
01412 
01413   friend   sc_signed operator / (int64               u, const sc_unsigned&  v);
01414   friend sc_unsigned operator / (uint64              u, const sc_unsigned&  v);
01415   friend   sc_signed operator / (long                u, const sc_unsigned&  v);
01416   friend sc_unsigned operator / (unsigned long       u, const sc_unsigned&  v);
01417   friend   sc_signed operator / (int                 u, const sc_unsigned&  v);
01418   friend sc_unsigned operator / (unsigned int        u, const sc_unsigned&  v)
01419     { return operator/((unsigned long) u,  v); }
01420 
01421   const sc_unsigned& operator /= (const sc_signed&    v);
01422   const sc_unsigned& operator /= (const sc_unsigned&  v);
01423   const sc_unsigned& operator /= (int64               v);
01424   const sc_unsigned& operator /= (uint64              v);
01425   const sc_unsigned& operator /= (long                v);
01426   const sc_unsigned& operator /= (unsigned long       v);
01427   const sc_unsigned& operator /= (int                 v)
01428     { return operator/=((long) v); }
01429   const sc_unsigned& operator /= (unsigned int        v)
01430     { return operator/=((unsigned long) v); }
01431 
01432   friend sc_unsigned operator / (const sc_unsigned&  u, const sc_uint_base& v);
01433   friend   sc_signed operator / (const sc_unsigned&  u, const sc_int_base&  v);
01434   friend sc_unsigned operator / (const sc_uint_base& u, const sc_unsigned&  v);
01435   friend   sc_signed operator / (const sc_int_base&  u, const sc_unsigned&  v);
01436   const sc_unsigned& operator /= (const sc_int_base&  v);
01437   const sc_unsigned& operator /= (const sc_uint_base& v);
01438 
01439   // MODulo operators:
01440 
01441   friend   sc_signed operator % (const sc_unsigned&  u, const sc_signed&    v);
01442   friend   sc_signed operator % (const sc_signed&    u, const sc_unsigned&  v);
01443 
01444   friend sc_unsigned operator % (const sc_unsigned&  u, const sc_unsigned&  v);
01445   friend   sc_signed operator % (const sc_unsigned&  u, int64               v);
01446   friend sc_unsigned operator % (const sc_unsigned&  u, uint64              v);
01447   friend   sc_signed operator % (const sc_unsigned&  u, long                v);
01448   friend sc_unsigned operator % (const sc_unsigned&  u, unsigned long       v);
01449   friend   sc_signed operator % (const sc_unsigned&  u, int                 v);
01450   friend sc_unsigned operator % (const sc_unsigned&  u, unsigned int        v)
01451     { return operator%(u, (unsigned long) v); }
01452 
01453   friend   sc_signed operator % (int64               u, const sc_unsigned&  v);
01454   friend sc_unsigned operator % (uint64              u, const sc_unsigned&  v);
01455   friend   sc_signed operator % (long                u, const sc_unsigned&  v);
01456   friend sc_unsigned operator % (unsigned long       u, const sc_unsigned&  v);
01457   friend   sc_signed operator % (int                 u, const sc_unsigned&  v);
01458   friend sc_unsigned operator % (unsigned int        u, const sc_unsigned&  v)
01459     { return operator%((unsigned long) u,  v); }
01460 
01461   const sc_unsigned& operator %= (const sc_signed&    v);
01462   const sc_unsigned& operator %= (const sc_unsigned&  v);
01463   const sc_unsigned& operator %= (int64               v);
01464   const sc_unsigned& operator %= (uint64              v);
01465   const sc_unsigned& operator %= (long                v);
01466   const sc_unsigned& operator %= (unsigned long       v);
01467   const sc_unsigned& operator %= (int                 v)
01468     { return operator%=((long) v); }
01469   const sc_unsigned& operator %= (unsigned int        v)
01470     { return operator%=((unsigned long) v); }
01471 
01472   friend sc_unsigned operator % (const sc_unsigned&  u, const sc_uint_base& v);
01473   friend   sc_signed operator % (const sc_unsigned&  u, const sc_int_base&  v);
01474   friend sc_unsigned operator % (const sc_uint_base& u, const sc_unsigned&  v);
01475   friend   sc_signed operator % (const sc_int_base&  u, const sc_unsigned&  v);
01476   const sc_unsigned& operator %= (const sc_int_base&  v);
01477   const sc_unsigned& operator %= (const sc_uint_base& v);
01478 
01479   // BITWISE OPERATORS:
01480 
01481   // Bitwise AND operators:
01482 
01483   friend   sc_signed operator & (const sc_unsigned&  u, const sc_signed&    v);
01484   friend   sc_signed operator & (const sc_signed&    u, const sc_unsigned&  v);
01485 
01486   friend sc_unsigned operator & (const sc_unsigned&  u, const sc_unsigned&  v);
01487   friend   sc_signed operator & (const sc_unsigned&  u, int64               v);
01488   friend sc_unsigned operator & (const sc_unsigned&  u, uint64              v);
01489   friend   sc_signed operator & (const sc_unsigned&  u, long                v);
01490   friend sc_unsigned operator & (const sc_unsigned&  u, unsigned long       v);
01491   friend   sc_signed operator & (const sc_unsigned&  u, int                 v);
01492   friend sc_unsigned operator & (const sc_unsigned&  u, unsigned int        v)
01493     { return operator&(u, (unsigned long) v); }
01494 
01495   friend   sc_signed operator & (int64               u, const sc_unsigned&  v);
01496   friend sc_unsigned operator & (uint64              u, const sc_unsigned&  v);
01497   friend   sc_signed operator & (long                u, const sc_unsigned&  v);
01498   friend sc_unsigned operator & (unsigned long       u, const sc_unsigned&  v);
01499   friend   sc_signed operator & (int                 u, const sc_unsigned&  v);
01500   friend sc_unsigned operator & (unsigned int        u, const sc_unsigned&  v)
01501     { return operator&((unsigned long) u,  v); }
01502 
01503   const sc_unsigned& operator &= (const sc_signed&    v);
01504   const sc_unsigned& operator &= (const sc_unsigned&  v);
01505   const sc_unsigned& operator &= (int64               v);
01506   const sc_unsigned& operator &= (uint64              v);
01507   const sc_unsigned& operator &= (long                v);
01508   const sc_unsigned& operator &= (unsigned long       v);
01509   const sc_unsigned& operator &= (int                 v)
01510     { return operator&=((long) v); }
01511   const sc_unsigned& operator &= (unsigned int        v)
01512     { return operator&=((unsigned long) v); }
01513 
01514   friend sc_unsigned operator & (const sc_unsigned&  u, const sc_uint_base& v);
01515   friend   sc_signed operator & (const sc_unsigned&  u, const sc_int_base&  v);
01516   friend sc_unsigned operator & (const sc_uint_base& u, const sc_unsigned&  v);
01517   friend   sc_signed operator & (const sc_int_base&  u, const sc_unsigned&  v);
01518   const sc_unsigned& operator &= (const sc_int_base&  v);
01519   const sc_unsigned& operator &= (const sc_uint_base& v);
01520 
01521   // Bitwise OR operators:
01522 
01523   friend   sc_signed operator | (const sc_unsigned&  u, const sc_signed&    v);
01524   friend   sc_signed operator | (const sc_signed&    u, const sc_unsigned&  v);
01525 
01526   friend sc_unsigned operator | (const sc_unsigned&  u, const sc_unsigned&  v);
01527   friend   sc_signed operator | (const sc_unsigned&  u, int64               v);
01528   friend sc_unsigned operator | (const sc_unsigned&  u, uint64              v);
01529   friend   sc_signed operator | (const sc_unsigned&  u, long                v);
01530   friend sc_unsigned operator | (const sc_unsigned&  u, unsigned long       v);
01531   friend   sc_signed operator | (const sc_unsigned&  u, int                 v);
01532   friend sc_unsigned operator | (const sc_unsigned&  u, unsigned int        v)
01533     { return operator|(u, (unsigned long) v); }
01534 
01535   friend   sc_signed operator | (int64               u, const sc_unsigned&  v);
01536   friend sc_unsigned operator | (uint64              u, const sc_unsigned&  v);
01537   friend   sc_signed operator | (long                u, const sc_unsigned&  v);
01538   friend sc_unsigned operator | (unsigned long       u, const sc_unsigned&  v);
01539   friend   sc_signed operator | (int                 u, const sc_unsigned&  v);
01540   friend sc_unsigned operator | (unsigned int        u, const sc_unsigned&  v)
01541     { return operator|((unsigned long) u,  v); }
01542 
01543   const sc_unsigned& operator |= (const sc_signed&    v);
01544   const sc_unsigned& operator |= (const sc_unsigned&  v);
01545   const sc_unsigned& operator |= (int64               v);
01546   const sc_unsigned& operator |= (uint64              v);
01547   const sc_unsigned& operator |= (long                v);
01548   const sc_unsigned& operator |= (unsigned long       v);
01549   const sc_unsigned& operator |= (int                 v)
01550     { return operator|=((long) v); }
01551   const sc_unsigned& operator |= (unsigned int        v)
01552     { return operator|=((unsigned long) v); }
01553 
01554   friend sc_unsigned operator | (const sc_unsigned&  u, const sc_uint_base& v);
01555   friend   sc_signed operator | (const sc_unsigned&  u, const sc_int_base&  v);
01556   friend sc_unsigned operator | (const sc_uint_base& u, const sc_unsigned&  v);
01557   friend   sc_signed operator | (const sc_int_base&  u, const sc_unsigned&  v);
01558   const sc_unsigned& operator |= (const sc_int_base&  v);
01559   const sc_unsigned& operator |= (const sc_uint_base& v);
01560 
01561   // Bitwise XOR operators:
01562 
01563   friend   sc_signed operator ^ (const sc_unsigned&  u, const sc_signed&    v);
01564   friend   sc_signed operator ^ (const sc_signed&    u, const sc_unsigned&  v);
01565 
01566   friend sc_unsigned operator ^ (const sc_unsigned&  u, const sc_unsigned&  v);
01567   friend   sc_signed operator ^ (const sc_unsigned&  u, int64               v);
01568   friend sc_unsigned operator ^ (const sc_unsigned&  u, uint64              v);
01569   friend   sc_signed operator ^ (const sc_unsigned&  u, long                v);
01570   friend sc_unsigned operator ^ (const sc_unsigned&  u, unsigned long       v);
01571   friend   sc_signed operator ^ (const sc_unsigned&  u, int                 v);
01572   friend sc_unsigned operator ^ (const sc_unsigned&  u, unsigned int        v)
01573     { return operator^(u, (unsigned long) v); }
01574 
01575   friend   sc_signed operator ^ (int64               u, const sc_unsigned&  v);
01576   friend sc_unsigned operator ^ (uint64              u, const sc_unsigned&  v);
01577   friend   sc_signed operator ^ (long                u, const sc_unsigned&  v);
01578   friend sc_unsigned operator ^ (unsigned long       u, const sc_unsigned&  v);
01579   friend   sc_signed operator ^ (int                 u, const sc_unsigned&  v);
01580   friend sc_unsigned operator ^ (unsigned int        u, const sc_unsigned&  v)
01581     { return operator^((unsigned long) u,  v); }
01582 
01583   const sc_unsigned& operator ^= (const sc_signed&    v);
01584   const sc_unsigned& operator ^= (const sc_unsigned&  v);
01585   const sc_unsigned& operator ^= (int64               v);
01586   const sc_unsigned& operator ^= (uint64              v);
01587   const sc_unsigned& operator ^= (long                v);
01588   const sc_unsigned& operator ^= (unsigned long       v);
01589   const sc_unsigned& operator ^= (int                 v)
01590     { return operator^=((long) v); }
01591   const sc_unsigned& operator ^= (unsigned int        v)
01592     { return operator^=((unsigned long) v); }
01593 
01594   friend sc_unsigned operator ^ (const sc_unsigned&  u, const sc_uint_base& v);
01595   friend   sc_signed operator ^ (const sc_unsigned&  u, const sc_int_base&  v);
01596   friend sc_unsigned operator ^ (const sc_uint_base& u, const sc_unsigned&  v);
01597   friend   sc_signed operator ^ (const sc_int_base&  u, const sc_unsigned&  v);
01598   const sc_unsigned& operator ^= (const sc_int_base&  v);
01599   const sc_unsigned& operator ^= (const sc_uint_base& v);
01600 
01601   // SHIFT OPERATORS:
01602 
01603   // LEFT SHIFT operators:
01604 
01605   friend sc_unsigned operator << (const sc_unsigned&  u, const sc_signed&    v);
01606   friend   sc_signed operator << (const sc_signed&    u, const sc_unsigned&  v);
01607 
01608   friend sc_unsigned operator << (const sc_unsigned&  u, const sc_unsigned&  v);
01609   friend sc_unsigned operator << (const sc_unsigned&  u, int64               v);
01610   friend sc_unsigned operator << (const sc_unsigned&  u, uint64              v);
01611   friend sc_unsigned operator << (const sc_unsigned&  u, long                v);
01612   friend sc_unsigned operator << (const sc_unsigned&  u, unsigned long       v);
01613   friend sc_unsigned operator << (const sc_unsigned&  u, int                 v)
01614     { return operator<<(u, (long) v); }
01615   friend sc_unsigned operator << (const sc_unsigned&  u, unsigned int        v)
01616     { return operator<<(u, (unsigned long) v); }
01617 
01618   const sc_unsigned& operator <<= (const sc_signed&    v);
01619   const sc_unsigned& operator <<= (const sc_unsigned&  v);
01620   const sc_unsigned& operator <<= (int64               v);
01621   const sc_unsigned& operator <<= (uint64              v);
01622   const sc_unsigned& operator <<= (long                v);
01623   const sc_unsigned& operator <<= (unsigned long       v);
01624   const sc_unsigned& operator <<= (int                 v)
01625     { return operator<<=((long) v); }
01626   const sc_unsigned& operator <<= (unsigned int        v)
01627     { return operator<<=((unsigned long) v); }
01628 
01629   friend sc_unsigned operator << (const sc_unsigned&  u, const sc_uint_base& v);
01630   friend sc_unsigned operator << (const sc_unsigned&  u, const sc_int_base&  v);
01631   const sc_unsigned& operator <<= (const sc_int_base&  v);
01632   const sc_unsigned& operator <<= (const sc_uint_base& v);
01633 
01634   // RIGHT SHIFT operators:
01635 
01636   friend sc_unsigned operator >> (const sc_unsigned&  u, const sc_signed&    v);
01637   friend   sc_signed operator >> (const sc_signed&    u, const sc_unsigned&  v);
01638 
01639   friend sc_unsigned operator >> (const sc_unsigned&  u, const sc_unsigned&  v);
01640   friend sc_unsigned operator >> (const sc_unsigned&  u, int64               v);
01641   friend sc_unsigned operator >> (const sc_unsigned&  u, uint64              v);
01642   friend sc_unsigned operator >> (const sc_unsigned&  u, long                v);
01643   friend sc_unsigned operator >> (const sc_unsigned&  u, unsigned long       v);
01644   friend sc_unsigned operator >> (const sc_unsigned&  u, int                 v)
01645     { return operator>>(u, (long) v); }
01646   friend sc_unsigned operator >> (const sc_unsigned&  u, unsigned int        v)
01647     { return operator>>(u, (unsigned long) v); }
01648 
01649   const sc_unsigned& operator >>= (const sc_signed&    v);
01650   const sc_unsigned& operator >>= (const sc_unsigned&  v);
01651   const sc_unsigned& operator >>= (int64               v);
01652   const sc_unsigned& operator >>= (uint64              v);
01653   const sc_unsigned& operator >>= (long                v);
01654   const sc_unsigned& operator >>= (unsigned long       v);
01655   const sc_unsigned& operator >>= (int                 v)
01656     { return operator>>=((long) v); }
01657   const sc_unsigned& operator >>= (unsigned int        v)
01658     { return operator>>=((unsigned long) v); }
01659 
01660   friend sc_unsigned operator >> ( const sc_unsigned& , const sc_uint_base& );
01661   friend sc_unsigned operator >> ( const sc_unsigned&, const sc_int_base& );
01662   const sc_unsigned& operator >>= (const sc_int_base&  v);
01663   const sc_unsigned& operator >>= (const sc_uint_base& v);
01664 
01665   // Unary arithmetic operators
01666   friend sc_unsigned operator + (const sc_unsigned& u);
01667   friend   sc_signed operator - (const sc_unsigned& u);
01668 
01669   // LOGICAL OPERATORS:
01670 
01671   // Logical EQUAL operators:
01672 
01673   friend bool operator == (const sc_unsigned&  u, const sc_signed&    v);
01674   friend bool operator == (const sc_signed&    u, const sc_unsigned&  v);
01675 
01676   friend bool operator == (const sc_unsigned&  u, const sc_unsigned&  v);
01677   friend bool operator == (const sc_unsigned&  u, int64               v);
01678   friend bool operator == (const sc_unsigned&  u, uint64              v);
01679   friend bool operator == (const sc_unsigned&  u, long                v);
01680   friend bool operator == (const sc_unsigned&  u, unsigned long       v);
01681   friend bool operator == (const sc_unsigned&  u, int                 v)
01682     { return operator==(u, (long) v); }
01683   friend bool operator == (const sc_unsigned&  u, unsigned int        v)
01684     { return operator==(u, (unsigned long) v); }
01685 
01686   friend bool operator == (int64               u, const sc_unsigned&  v);
01687   friend bool operator == (uint64              u, const sc_unsigned&  v);
01688   friend bool operator == (long                u, const sc_unsigned&  v);
01689   friend bool operator == (unsigned long       u, const sc_unsigned&  v);
01690   friend bool operator == (int                 u, const sc_unsigned&  v)
01691     { return operator==((long) u,  v); }
01692   friend bool operator == (unsigned int        u, const sc_unsigned&  v)
01693     { return operator==((unsigned long) u,  v); }
01694 
01695   friend bool operator == (const sc_unsigned&  u, const sc_uint_base& v);
01696   friend bool operator == (const sc_unsigned&  u, const sc_int_base&  v);
01697   friend bool operator == (const sc_uint_base& u, const sc_unsigned&  v);
01698   friend bool operator == (const sc_int_base&  u, const sc_unsigned&  v);
01699 
01700   // Logical NOT_EQUAL operators:
01701 
01702   friend bool operator != (const sc_unsigned&  u, const sc_signed&    v);
01703   friend bool operator != (const sc_signed&    u, const sc_unsigned&  v);
01704 
01705   friend bool operator != (const sc_unsigned&  u, const sc_unsigned&  v);
01706   friend bool operator != (const sc_unsigned&  u, int64               v);
01707   friend bool operator != (const sc_unsigned&  u, uint64              v);
01708   friend bool operator != (const sc_unsigned&  u, long                v);
01709   friend bool operator != (const sc_unsigned&  u, unsigned long       v);
01710   friend bool operator != (const sc_unsigned&  u, int                 v)
01711     { return operator!=(u, (long) v); }
01712   friend bool operator != (const sc_unsigned&  u, unsigned int        v)
01713     { return operator!=(u, (unsigned long) v); }
01714 
01715   friend bool operator != (int64               u, const sc_unsigned&  v);
01716   friend bool operator != (uint64              u, const sc_unsigned&  v);
01717   friend bool operator != (long                u, const sc_unsigned&  v);
01718   friend bool operator != (unsigned long       u, const sc_unsigned&  v);
01719   friend bool operator != (int                 u, const sc_unsigned&  v)
01720     { return operator!=((long) u,  v); }
01721   friend bool operator != (unsigned int        u, const sc_unsigned&  v)
01722     { return operator!=((unsigned long) u,  v); }
01723 
01724   friend bool operator != (const sc_unsigned&  u, const sc_uint_base& v);
01725   friend bool operator != (const sc_unsigned&  u, const sc_int_base&  v);
01726   friend bool operator != (const sc_uint_base& u, const sc_unsigned&  v);
01727   friend bool operator != (const sc_int_base&  u, const sc_unsigned&  v);
01728 
01729   // Logical LESS_THAN operators:
01730 
01731   friend bool operator < (const sc_unsigned&  u, const sc_signed&    v);
01732   friend bool operator < (const sc_signed&    u, const sc_unsigned&  v);
01733 
01734   friend bool operator < (const sc_unsigned&  u, const sc_unsigned&  v);
01735   friend bool operator < (const sc_unsigned&  u, int64               v);
01736   friend bool operator < (const sc_unsigned&  u, uint64              v);
01737   friend bool operator < (const sc_unsigned&  u, long                v);
01738   friend bool operator < (const sc_unsigned&  u, unsigned long       v);
01739   friend bool operator < (const sc_unsigned&  u, int                 v)
01740     { return operator<(u, (long) v); }
01741   friend bool operator < (const sc_unsigned&  u, unsigned int        v)
01742     { return operator<(u, (unsigned long) v); }
01743 
01744   friend bool operator < (int64               u, const sc_unsigned&  v);
01745   friend bool operator < (uint64              u, const sc_unsigned&  v);
01746   friend bool operator < (long                u, const sc_unsigned&  v);
01747   friend bool operator < (unsigned long       u, const sc_unsigned&  v);
01748   friend bool operator < (int                 u, const sc_unsigned&  v)
01749     { return operator<((long) u,  v); }
01750   friend bool operator < (unsigned int        u, const sc_unsigned&  v)
01751     { return operator<((unsigned long) u,  v); }
01752 
01753   friend bool operator < (const sc_unsigned&  u, const sc_uint_base& v);
01754   friend bool operator < (const sc_unsigned&  u, const sc_int_base&  v);
01755   friend bool operator < (const sc_uint_base& u, const sc_unsigned&  v);
01756   friend bool operator < (const sc_int_base&  u, const sc_unsigned&  v);
01757 
01758   // Logical LESS_THAN_AND_EQUAL operators:
01759 
01760   friend bool operator <= (const sc_unsigned&  u, const sc_signed&    v);
01761   friend bool operator <= (const sc_signed&    u, const sc_unsigned&  v);
01762 
01763   friend bool operator <= (const sc_unsigned&  u, const sc_unsigned&  v);
01764   friend bool operator <= (const sc_unsigned&  u, int64               v);
01765   friend bool operator <= (const sc_unsigned&  u, uint64              v);
01766   friend bool operator <= (const sc_unsigned&  u, long                v);
01767   friend bool operator <= (const sc_unsigned&  u, unsigned long       v);
01768   friend bool operator <= (const sc_unsigned&  u, int                 v)
01769     { return operator<=(u, (long) v); }
01770   friend bool operator <= (const sc_unsigned&  u, unsigned int        v)
01771     { return operator<=(u, (unsigned long) v); }
01772 
01773   friend bool operator <= (int64               u, const sc_unsigned&  v);
01774   friend bool operator <= (uint64              u, const sc_unsigned&  v);
01775   friend bool operator <= (long                u, const sc_unsigned&  v);
01776   friend bool operator <= (unsigned long       u, const sc_unsigned&  v);
01777   friend bool operator <= (int                 u, const sc_unsigned&  v)
01778     { return operator<=((long) u,  v); }
01779   friend bool operator <= (unsigned int        u, const sc_unsigned&  v)
01780     { return operator<=((unsigned long) u,  v); }
01781 
01782   friend bool operator <= (const sc_unsigned&  u, const sc_uint_base& v);
01783   friend bool operator <= (const sc_unsigned&  u, const sc_int_base&  v);
01784   friend bool operator <= (const sc_uint_base& u, const sc_unsigned&  v);
01785   friend bool operator <= (const sc_int_base&  u, const sc_unsigned&  v);
01786 
01787   // Logical GREATER_THAN operators:
01788 
01789   friend bool operator > (const sc_unsigned&  u, const sc_signed&    v);
01790   friend bool operator > (const sc_signed&    u, const sc_unsigned&  v);
01791 
01792   friend bool operator > (const sc_unsigned&  u, const sc_unsigned&  v);
01793   friend bool operator > (const sc_unsigned&  u, int64               v);
01794   friend bool operator > (const sc_unsigned&  u, uint64              v);
01795   friend bool operator > (const sc_unsigned&  u, long                v);
01796   friend bool operator > (const sc_unsigned&  u, unsigned long       v);
01797   friend bool operator > (const sc_unsigned&  u, int                 v)
01798     { return operator>(u, (long) v); }
01799   friend bool operator > (const sc_unsigned&  u, unsigned int        v)
01800     { return operator>(u, (unsigned long) v); }
01801 
01802   friend bool operator > (int64               u, const sc_unsigned&  v);
01803   friend bool operator > (uint64              u, const sc_unsigned&  v);
01804   friend bool operator > (long                u, const sc_unsigned&  v);
01805   friend bool operator > (unsigned long       u, const sc_unsigned&  v);
01806   friend bool operator > (int                 u, const sc_unsigned&  v)
01807     { return operator>((long) u,  v); }
01808   friend bool operator > (unsigned int        u, const sc_unsigned&  v)
01809     { return operator>((unsigned long) u,  v); }
01810 
01811   friend bool operator > (const sc_unsigned&  u, const sc_uint_base& v);
01812   friend bool operator > (const sc_unsigned&  u, const sc_int_base&  v);
01813   friend bool operator > (const sc_uint_base& u, const sc_unsigned&  v);
01814   friend bool operator > (const sc_int_base&  u, const sc_unsigned&  v);
01815 
01816   // Logical GREATER_THAN_AND_EQUAL operators:
01817 
01818   friend bool operator >= (const sc_unsigned&  u, const sc_signed&    v);
01819   friend bool operator >= (const sc_signed&    u, const sc_unsigned&  v);
01820 
01821   friend bool operator >= (const sc_unsigned&  u, const sc_unsigned&  v);
01822   friend bool operator >= (const sc_unsigned&  u, int64               v);
01823   friend bool operator >= (const sc_unsigned&  u, uint64              v);
01824   friend bool operator >= (const sc_unsigned&  u, long                v);
01825   friend bool operator >= (const sc_unsigned&  u, unsigned long       v);
01826   friend bool operator >= (const sc_unsigned&  u, int                 v)
01827     { return operator>=(u, (long) v); }
01828   friend bool operator >= (const sc_unsigned&  u, unsigned int        v)
01829     { return operator>=(u, (unsigned long) v); }
01830 
01831   friend bool operator >= (int64               u, const sc_unsigned&  v);
01832   friend bool operator >= (uint64              u, const sc_unsigned&  v);
01833   friend bool operator >= (long                u, const sc_unsigned&  v);
01834   friend bool operator >= (unsigned long       u, const sc_unsigned&  v);
01835   friend bool operator >= (int                 u, const sc_unsigned&  v)
01836     { return operator>=((long) u,  v); }
01837   friend bool operator >= (unsigned int        u, const sc_unsigned&  v)
01838     { return operator>=((unsigned long) u,  v); }
01839 
01840   friend bool operator >= (const sc_unsigned&  u, const sc_uint_base& v);
01841   friend bool operator >= (const sc_unsigned&  u, const sc_int_base&  v);
01842   friend bool operator >= (const sc_uint_base& u, const sc_unsigned&  v);
01843   friend bool operator >= (const sc_int_base&  u, const sc_unsigned&  v);
01844 
01845   // Bitwise NOT operator (unary).
01846   friend sc_unsigned operator ~ (const sc_unsigned& u);
01847 
01848   // Helper functions.
01849   friend int compare_unsigned(small_type us,
01850                               int unb,
01851                               int und,
01852                               const sc_digit *ud,
01853                               small_type vs,
01854                               int vnb,
01855                               int vnd,
01856                               const sc_digit *vd,
01857                               small_type if_u_signed = 0,
01858                               small_type if_v_signed = 0);
01859 
01860   friend sc_unsigned add_unsigned_friend(small_type us,
01861                                          int unb,
01862                                          int und,
01863                                          const sc_digit *ud,
01864                                          small_type vs,
01865                                          int vnb,
01866                                          int vnd,
01867                                          const sc_digit *vd);
01868 
01869   friend sc_unsigned sub_unsigned_friend(small_type us,
01870                                          int unb,
01871                                          int und,
01872                                          const sc_digit *ud,
01873                                          small_type vs,
01874                                          int vnb,
01875                                          int vnd,
01876                                          const sc_digit *vd);
01877 
01878   friend sc_unsigned mul_unsigned_friend(small_type s,
01879                                          int unb,
01880                                          int und,
01881                                          const sc_digit *ud,
01882                                          int vnb,
01883                                          int vnd,
01884                                          const sc_digit *vd);
01885 
01886   friend sc_unsigned div_unsigned_friend(small_type s,
01887                                          int unb,
01888                                          int und,
01889                                          const sc_digit *ud,
01890                                          int vnb,
01891                                          int vnd,
01892                                          const sc_digit *vd);
01893 
01894   friend sc_unsigned mod_unsigned_friend(small_type us,
01895                                          int unb,
01896                                          int und,
01897                                          const sc_digit *ud,
01898                                          int vnb,
01899                                          int vnd,
01900                                          const sc_digit *vd);
01901 
01902   friend sc_unsigned and_unsigned_friend(small_type us,
01903                                          int unb,
01904                                          int und,
01905                                          const sc_digit *ud,
01906                                          small_type vs,
01907                                          int vnb,
01908                                          int vnd,
01909                                          const sc_digit *vd);
01910 
01911   friend sc_unsigned or_unsigned_friend(small_type us,
01912                                         int unb,
01913                                         int und,
01914                                         const sc_digit *ud,
01915                                         small_type vs,
01916                                         int vnb,
01917                                         int vnd,
01918                                         const sc_digit *vd);
01919 
01920   friend sc_unsigned xor_unsigned_friend(small_type us,
01921                                          int unb,
01922                                          int und,
01923                                          const sc_digit *ud,
01924                                          small_type vs,
01925                                          int vnb,
01926                                          int vnd,
01927                                          const sc_digit *vd);
01928 
01929 public:
01930   static sc_core::sc_vpool<sc_unsigned> m_pool;
01931 
01932 private:
01933 
01934   small_type  sgn;         // Shortened as s.
01935   int nbits;       // Shortened as nb.
01936   int ndigits;     // Shortened as nd.
01937 
01938 #ifdef SC_MAX_NBITS
01939   sc_digit digit[DIV_CEIL(SC_MAX_NBITS)];   // Shortened as d.
01940 #else
01941   sc_digit *digit;                       // Shortened as d.
01942 #endif
01943 
01944   // Private constructors:
01945 
01946   // Create a copy of v with sign s.
01947   sc_unsigned(const sc_unsigned& v, small_type s);
01948   sc_unsigned(const sc_signed&   v, small_type s);
01949 
01950   // Create an unsigned number with the given attributes.
01951   sc_unsigned(small_type s, int nb, int nd,
01952               sc_digit *d, bool alloc = true);
01953 
01954   // Create an unsigned number using the bits u[l..r].
01955   sc_unsigned(const sc_signed* u, int l, int r);
01956   sc_unsigned(const sc_unsigned* u, int l, int r);
01957 
01958   // Private member functions. The called functions are inline functions.
01959 
01960   small_type default_sign() const
01961     { return SC_POS; }
01962 
01963   int num_bits(int nb) const { return nb + 1; }
01964 
01965   bool check_if_outside(int bit_num) const;
01966 
01967   void copy_digits(int nb, int nd, const sc_digit *d)
01968     { copy_digits_unsigned(sgn, nbits, ndigits, digit, nb, nd, d); }
01969 
01970   void makezero()
01971     { sgn = make_zero(ndigits, digit); }
01972 
01973   // Conversion functions between 2's complement (2C) and
01974   // sign-magnitude (SM):
01975   void convert_2C_to_SM()
01976     { sgn = convert_unsigned_2C_to_SM(nbits, ndigits, digit); }
01977 
01978   void convert_SM_to_2C_to_SM()
01979     { sgn = convert_unsigned_SM_to_2C_to_SM(sgn, nbits, ndigits, digit); }
01980 
01981   void convert_SM_to_2C()
01982     { convert_unsigned_SM_to_2C(sgn, ndigits, digit); }
01983 
01984 };
01985 
01986 
01987 
01988 inline
01989 ::std::ostream&
01990 operator << ( ::std::ostream&, const sc_unsigned& );
01991 
01992 inline
01993 ::std::istream&
01994 operator >> ( ::std::istream&, sc_unsigned& );
01995 
01996 
01997 // IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
01998 
01999 // ----------------------------------------------------------------------------
02000 //  CLASS : sc_unsigned_bitref_r
02001 //
02002 //  Proxy class for sc_unsigned bit selection (r-value only).
02003 // ----------------------------------------------------------------------------
02004 
02005 
02006 inline
02007 ::std::ostream&
02008 operator << ( ::std::ostream& os, const sc_unsigned_bitref_r& a )
02009 {
02010     a.print( os );
02011     return os;
02012 }
02013 
02014 
02015 // ----------------------------------------------------------------------------
02016 //  CLASS : sc_unsigned_bitref
02017 //
02018 //  Proxy class for sc_unsigned bit selection (r-value and l-value).
02019 // ----------------------------------------------------------------------------
02020 
02021 template<class T>
02022 inline const sc_unsigned_subref& sc_unsigned_subref::operator = (
02023     const sc_generic_base<T>& a )
02024 {
02025     sc_unsigned temp( length() );
02026     a->to_sc_unsigned(temp);
02027     return *this = temp;
02028 }
02029 
02030 inline
02031 ::std::istream&
02032 operator >> ( ::std::istream& is, sc_unsigned_bitref& a )
02033 {
02034     a.scan( is );
02035     return is;
02036 }
02037 
02038 
02039 // ----------------------------------------------------------------------------
02040 //  CLASS : sc_unsigned_subref_r
02041 //
02042 //  Proxy class for sc_unsigned part selection (r-value only).
02043 // ----------------------------------------------------------------------------
02044 
02045 // reduce methods
02046 
02047 inline bool sc_unsigned_subref_r::and_reduce() const
02048 {
02049    const sc_unsigned* target_p = m_obj_p;
02050    for ( int i = m_right; i <= m_left; i++ )
02051     if ( !target_p->test(i) ) return false;
02052    return true;
02053 }
02054 
02055 inline bool sc_unsigned_subref_r::nand_reduce() const
02056 {
02057     return !and_reduce();
02058 }
02059 
02060 inline bool sc_unsigned_subref_r::or_reduce() const
02061 {
02062    const sc_unsigned* target_p = m_obj_p;
02063    for ( int i = m_right; i <= m_left; i++ )
02064     if ( target_p->test(i) ) return true;
02065    return false;
02066 }
02067 
02068 inline bool sc_unsigned_subref_r::nor_reduce() const
02069 {
02070     return !or_reduce();
02071 }
02072 
02073 inline bool sc_unsigned_subref_r::xor_reduce() const
02074 {
02075    int                odd;
02076    const sc_unsigned* target_p = m_obj_p;
02077    odd = 0;
02078    for ( int i = m_right; i <= m_left; i++ )
02079     if ( target_p->test(i) ) odd = ~odd;
02080    return odd ? true : false;
02081 }
02082 
02083 inline bool sc_unsigned_subref_r::xnor_reduce() const
02084 {
02085     return !xor_reduce();
02086 }
02087 
02088 
02089 inline
02090 ::std::ostream&
02091 operator << ( ::std::ostream& os, const sc_unsigned_subref_r& a )
02092 {
02093     a.print( os );
02094     return os;
02095 }
02096 
02097 
02098 // ----------------------------------------------------------------------------
02099 //  CLASS : sc_unsigned_subref
02100 //
02101 //  Proxy class for sc_unsigned part selection (r-value and l-value).
02102 // ----------------------------------------------------------------------------
02103 
02104 // assignment operators
02105 
02106 inline
02107 const sc_unsigned_subref&
02108 sc_unsigned_subref::operator = ( const char* a )
02109 {
02110     sc_unsigned aa( length() );
02111     return ( *this = aa = a );
02112 }
02113 
02114 
02115 inline
02116 ::std::istream&
02117 operator >> ( ::std::istream& is, sc_unsigned_subref& a )
02118 {
02119     a.scan( is );
02120     return is;
02121 }
02122 
02123 
02124 
02125 // ----------------------------------------------------------------------------
02126 //  CLASS : sc_unsigned
02127 //
02128 //  Arbitrary precision signed number.
02129 // ----------------------------------------------------------------------------
02130 
02131 template<class T>
02132 sc_unsigned::sc_unsigned( const sc_generic_base<T>& v )
02133 {
02134     int nb = v->length();
02135     sgn = default_sign();
02136     if( nb > 0 ) {
02137         nbits = num_bits( nb );
02138     } else {
02139         char msg[BUFSIZ];
02140         std::sprintf( msg,
02141             "sc_unsigned( sc_generic_base<T> ) : nb = %d is not valid", nb);
02142         SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg );
02143     }
02144     ndigits = DIV_CEIL(nbits);
02145 #   ifdef SC_MAX_NBITS
02146         test_bound(nb);
02147 #    else
02148         digit = new sc_digit[ndigits];
02149 #    endif
02150     makezero();
02151     v->to_sc_unsigned(*this);
02152 }
02153 
02154 
02155 inline
02156 ::std::ostream&
02157 operator << ( ::std::ostream& os, const sc_unsigned& a )
02158 {
02159     a.print( os );
02160     return os;
02161 }
02162 
02163 inline
02164 ::std::istream&
02165 operator >> ( ::std::istream& is, sc_unsigned& a )
02166 {
02167     a.scan( is );
02168     return is;
02169 }
02170 
02171 
02172 } // namespace sc_dt
02173 
02174 
02175 #endif

Generated on Wed Jan 21 15:32:09 2009 for SystemC by  doxygen 1.5.5