src/sysc/datatypes/int/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-2005 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 #ifndef SC_UNSIGNED_H
00072 #define SC_UNSIGNED_H
00073 
00074 
00075 #include "sysc/kernel/sc_object.h"
00076 #include "sysc/datatypes/misc/sc_value_base.h"
00077 #include "sysc/utils/sc_iostream.h"
00078 #include "sysc/utils/sc_temporary.h"
00079 #include "sysc/datatypes/int/sc_length_param.h"
00080 #include "sysc/datatypes/int/sc_nbdefs.h"
00081 #include "sysc/datatypes/int/sc_nbutils.h"
00082 #include "sysc/datatypes/int/sc_nbexterns.h"
00083 #include "sysc/utils/sc_temporary.h"
00084 
00085 
00086 namespace sc_dt
00087 {
00088 
00089 // classes defined in this module
00090 class sc_unsigned_bitref_r;
00091 class sc_unsigned_bitref;
00092 class sc_unsigned_subref_r;
00093 class sc_unsigned_subref;
00094 class sc_concatref; 
00095 class sc_unsigned;
00096 
00097 // forward class declarations
00098 class sc_bv_base;
00099 class sc_lv_base;
00100 class sc_int_base;
00101 class sc_uint_base;
00102 class sc_int_subref_r;
00103 class sc_uint_subref_r;
00104 class sc_signed;
00105 class sc_signed_subref_r;
00106 class sc_fxval;
00107 class sc_fxval_fast;
00108 class sc_fxnum;
00109 class sc_fxnum_fast;
00110 
00111 
00112 // ----------------------------------------------------------------------------
00113 //  CLASS : sc_unsigned_bitref_r
00114 //
00115 //  Proxy class for sc_unsigned bit selection (r-value only).
00116 // ----------------------------------------------------------------------------
00117 
00118 class sc_unsigned_bitref_r : public sc_value_base
00119 {
00120     friend class sc_unsigned;
00121 
00122 protected:
00123 
00124     // construction and initialization:
00125 
00126     sc_unsigned_bitref_r()
00127         {}
00128 
00129     void initialize( const sc_unsigned* obj_p, int index_ )
00130         {
00131             m_obj_p = CCAST<sc_unsigned*>( obj_p );
00132             m_index = index_;
00133         }
00134 
00135 public:
00136 
00137     // destructor
00138 
00139     virtual ~sc_unsigned_bitref_r()
00140         {}
00141 
00142     // copy constructor
00143 
00144     sc_unsigned_bitref_r( const sc_unsigned_bitref_r& a )
00145         : m_index( a.m_index ), m_obj_p( a.m_obj_p )
00146         {}
00147 
00148     // capacity
00149 
00150     int length() const
00151         { return 1; }
00152 
00153 
00154     // implicit conversion to bool
00155 
00156     operator uint64 () const;
00157     bool operator ! () const;
00158     bool operator ~ () const;
00159 
00160 
00161     // explicit conversions
00162 
00163     uint64 value() const
00164         { return operator uint64(); }
00165 
00166     bool to_bool() const
00167         { return operator uint64(); }
00168 
00169 
00170     // concatenation support
00171 
00172     virtual int concat_length(bool* xz_present_p) const
00173         { if ( xz_present_p ) *xz_present_p = false; return 1; }
00174     virtual uint64 concat_get_uint64() const 
00175         { return (uint64)operator uint64(); }
00176     virtual bool concat_get_ctrl( unsigned long* dst_p, int low_i ) const 
00177         {
00178             int  bit_mask = 1 << (low_i % BITS_PER_DIGIT);  
00179             int  word_i = low_i / BITS_PER_DIGIT;
00180             dst_p[word_i] &= ~bit_mask;
00181             return false;
00182         }
00183     virtual bool concat_get_data( unsigned long* dst_p, int low_i ) const 
00184         {
00185             int  bit_mask = 1 << (low_i % BITS_PER_DIGIT);  
00186             bool result;        // True if non-zero.
00187             int  word_i = low_i / BITS_PER_DIGIT;
00188             if ( operator uint64() )
00189             {
00190                 dst_p[word_i] |= bit_mask;
00191                 result = true;
00192             }
00193             else
00194             {
00195                 dst_p[word_i] &= ~bit_mask;
00196                 result = false;
00197             }
00198             return result;
00199         }
00200 
00201     // other methods
00202 
00203     void print( ::std::ostream& os = ::std::cout ) const
00204         { os << to_bool(); }
00205 
00206 protected:
00207 
00208     int          m_index;
00209     sc_unsigned* m_obj_p;
00210 
00211 private:
00212 
00213     // disabled
00214     const sc_unsigned_bitref_r& operator = ( const sc_unsigned_bitref_r& );
00215 };
00216 
00217 
00218 
00219 inline
00220 ::std::ostream&
00221 operator << ( ::std::ostream&, const sc_unsigned_bitref_r& );
00222 
00223 
00224 // ----------------------------------------------------------------------------
00225 //  CLASS : sc_unsigned_bitref
00226 //
00227 //  Proxy class for sc_unsigned bit selection (r-value and l-value).
00228 // ----------------------------------------------------------------------------
00229 
00230 class sc_unsigned_bitref
00231     : public sc_unsigned_bitref_r
00232 {
00233     friend class sc_unsigned;
00234     friend class sc_core::sc_vpool<sc_unsigned_bitref>;
00235 
00236 
00237 protected: // construction 
00238 
00239     sc_unsigned_bitref()
00240         {}
00241 
00242 public: 
00243 
00244     // copy constructor
00245 
00246     sc_unsigned_bitref( const sc_unsigned_bitref& a )
00247         : sc_unsigned_bitref_r( a )
00248         {}
00249 
00250 
00251     // assignment operators
00252 
00253     const sc_unsigned_bitref& operator = ( const sc_unsigned_bitref_r& );
00254     const sc_unsigned_bitref& operator = ( const sc_unsigned_bitref& );
00255     const sc_unsigned_bitref& operator = ( bool );
00256 
00257     const sc_unsigned_bitref& operator &= ( bool );
00258     const sc_unsigned_bitref& operator |= ( bool );
00259     const sc_unsigned_bitref& operator ^= ( bool );
00260 
00261     // concatenation methods
00262 
00263     virtual void concat_set(int64 src, int low_i);
00264     virtual void concat_set(const sc_signed& src, int low_i);
00265     virtual void concat_set(const sc_unsigned& src, int low_i);
00266     virtual void concat_set(uint64 src, int low_i);
00267 
00268 
00269     // other methods
00270 
00271     void scan( ::std::istream& is = ::std::cin );
00272 
00273 protected:
00274     static sc_core::sc_vpool<sc_unsigned_bitref> m_pool;
00275 };
00276 
00277 
00278 
00279 inline
00280 ::std::istream&
00281 operator >> ( ::std::istream&, sc_unsigned_bitref& );
00282 
00283 
00284 // ----------------------------------------------------------------------------
00285 //  CLASS : sc_unsigned_subref_r
00286 //
00287 //  Proxy class for sc_unsigned part selection (r-value only).
00288 // ----------------------------------------------------------------------------
00289 
00290 class sc_unsigned_subref_r : public sc_value_base
00291 {
00292     friend class sc_signed;
00293     friend class sc_unsigned;
00294     friend class sc_unsigned_signal;
00295 
00296 protected:
00297 
00298     // constructor
00299 
00300     sc_unsigned_subref_r()
00301         {}
00302 
00303     void initialize( const sc_unsigned* obj_p, int left_, int right_ )
00304         {
00305             m_obj_p = CCAST<sc_unsigned*>( obj_p );
00306             m_left = left_;
00307             m_right = right_;
00308         }
00309   
00310 public:
00311 
00312     // destructor
00313 
00314     virtual ~sc_unsigned_subref_r()
00315         {}
00316 
00317 
00318     // copy constructor
00319 
00320     sc_unsigned_subref_r( const sc_unsigned_subref_r& a )
00321         : m_left( a.m_left ), m_obj_p( a.m_obj_p ), m_right( a.m_right )
00322         {}
00323 
00324 
00325     // capacity
00326 
00327     int length() const
00328         { return m_left >= m_right ? (m_left-m_right+1) : (m_right-m_left+1 ); }
00329 
00330 
00331     // implicit conversion to sc_unsigned
00332 
00333     operator sc_unsigned () const;
00334 
00335 
00336     // explicit conversions
00337 
00338     int           to_int() const;
00339     unsigned int  to_uint() const;
00340     long          to_long() const;
00341     unsigned long to_ulong() const;
00342     int64         to_int64() const;
00343     uint64        to_uint64() const;
00344     double        to_double() const;
00345 
00346 
00347     // explicit conversion to character string
00348 
00349     const std::string to_string( sc_numrep numrep = SC_DEC ) const;
00350     const std::string to_string( sc_numrep numrep, bool w_prefix ) const;
00351 
00352 
00353     // concatenation support
00354 
00355     virtual int concat_length(bool* xz_present_p) const
00356         { 
00357             if ( xz_present_p ) *xz_present_p = false; 
00358             return m_left - m_right + 1; 
00359         }
00360     virtual uint64 concat_get_uint64() const;
00361     virtual bool concat_get_ctrl( unsigned long* dst_p, int low_i ) const;
00362     virtual bool concat_get_data( unsigned long* dst_p, int low_i ) const;
00363 
00364     // reduce methods
00365 
00366     bool and_reduce() const;
00367     bool nand_reduce() const;
00368     bool or_reduce() const;
00369     bool nor_reduce() const;
00370     bool xor_reduce() const ;
00371     bool xnor_reduce() const;
00372 
00373     // other methods
00374 
00375     void print( ::std::ostream& os = ::std::cout ) const
00376         { os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); }
00377 
00378 protected:
00379 
00380     int          m_left;   // Left-most bit in this part selection.
00381     sc_unsigned* m_obj_p;  // Target of this part selection. 
00382     int          m_right;  // Right-most bit in this part selection.
00383 
00384 private:
00385 
00386     // disabled
00387     const sc_unsigned_subref_r& operator = ( const sc_unsigned_subref_r& );
00388 };
00389 
00390 
00391 
00392 inline
00393 ::std::ostream&
00394 operator << ( ::std::ostream&, const sc_unsigned_subref_r& );
00395 
00396 
00397 // ----------------------------------------------------------------------------
00398 //  CLASS : sc_unsigned_subref
00399 //
00400 //  Proxy class for sc_unsigned part selection (r-value and l-value).
00401 // ----------------------------------------------------------------------------
00402 
00403 class sc_unsigned_subref
00404     : public sc_unsigned_subref_r
00405 {
00406     friend class sc_unsigned;
00407     friend class sc_core::sc_vpool<sc_unsigned_subref>;
00408 
00409 
00410     // constructor
00411 
00412 protected:
00413     sc_unsigned_subref()
00414         {}
00415   
00416 public:
00417 
00418     // copy constructor
00419 
00420     sc_unsigned_subref( const sc_unsigned_subref& a )
00421         : sc_unsigned_subref_r( a )
00422         {}
00423 
00424     // assignment operators
00425 
00426     const sc_unsigned_subref& operator = ( const sc_unsigned_subref_r& a );
00427     const sc_unsigned_subref& operator = ( const sc_unsigned_subref& a );
00428     const sc_unsigned_subref& operator = ( const sc_unsigned& a );
00429 
00430     template<class T>
00431     const sc_unsigned_subref& operator = ( const sc_generic_base<T>& a );
00432     const sc_unsigned_subref& operator = ( const sc_signed_subref_r& a );
00433     const sc_unsigned_subref& operator = ( const sc_signed& a );
00434 
00435     const sc_unsigned_subref& operator = ( const char* a );
00436     const sc_unsigned_subref& operator = ( unsigned long a );
00437     const sc_unsigned_subref& operator = ( long a );
00438 
00439     const sc_unsigned_subref& operator = ( unsigned int a )
00440         { return operator = ( (unsigned long) a ); }
00441 
00442     const sc_unsigned_subref& operator = ( int a )
00443         { return operator = ( (long) a ); }
00444 
00445     const sc_unsigned_subref& operator = ( uint64 a );
00446     const sc_unsigned_subref& operator = ( int64 a );
00447     const sc_unsigned_subref& operator = ( double a );  
00448     const sc_unsigned_subref& operator = ( const sc_int_base& a );
00449     const sc_unsigned_subref& operator = ( const sc_uint_base& a );
00450 
00451     // concatenation methods
00452 
00453     virtual void concat_set(int64 src, int low_i);
00454     virtual void concat_set(const sc_signed& src, int low_i);
00455     virtual void concat_set(const sc_unsigned& src, int low_i);
00456     virtual void concat_set(uint64 src, int low_i);
00457 
00458     // other methods
00459 
00460     void scan( ::std::istream& is = ::std::cin );
00461 
00462 protected:
00463     static sc_core::sc_vpool<sc_unsigned_subref> m_pool;
00464 };
00465 
00466 
00467 
00468 inline
00469 ::std::istream&
00470 operator >> ( ::std::istream&, sc_unsigned_subref& );
00471 
00472 
00473 // ----------------------------------------------------------------------------
00474 //  CLASS : sc_unsigned
00475 //
00476 //  Arbitrary precision unsigned number.
00477 // ----------------------------------------------------------------------------
00478 
00479 class sc_unsigned : public sc_value_base
00480 {
00481     friend class sc_concatref;
00482     friend class sc_unsigned_bitref_r;
00483     friend class sc_unsigned_bitref;
00484     friend class sc_unsigned_subref_r;
00485     friend class sc_unsigned_subref;
00486     friend class sc_signed;
00487     friend class sc_signed_subref;
00488     friend class sc_signed_subref_r;
00489 
00490   // Needed for types using sc_unsigned.
00491   typedef bool elemtype;
00492 
00493 public:
00494 
00495     // constructors
00496 
00497     explicit sc_unsigned( int nb = sc_length_param().len() );
00498     sc_unsigned( const sc_unsigned& v );
00499     sc_unsigned( const sc_signed&   v );
00500         template<class T>
00501     explicit sc_unsigned( const sc_generic_base<T>& v );
00502     explicit sc_unsigned( const sc_bv_base& v );
00503     explicit sc_unsigned( const sc_lv_base& v );
00504     explicit sc_unsigned( const sc_int_subref_r& v );
00505     explicit sc_unsigned( const sc_uint_subref_r& v );
00506     explicit sc_unsigned( const sc_signed_subref_r& v );
00507     explicit sc_unsigned( const sc_unsigned_subref_r& v );
00508 
00509 
00510 
00511     // assignment operators
00512 
00513     const sc_unsigned& operator = (const sc_unsigned&        v);
00514     const sc_unsigned& operator = (const sc_unsigned_subref_r& a );
00515 
00516     template<class T>
00517     const sc_unsigned& operator = ( const sc_generic_base<T>& a )
00518         { a->to_sc_unsigned(*this); return *this; }
00519 
00520     const sc_unsigned& operator = (const sc_signed&          v);
00521     const sc_unsigned& operator = (const sc_signed_subref_r& a );
00522 
00523     const sc_unsigned& operator = ( const char*               v);
00524     const sc_unsigned& operator = ( int64                     v);
00525     const sc_unsigned& operator = ( uint64                    v);
00526     const sc_unsigned& operator = ( long                      v);
00527     const sc_unsigned& operator = ( unsigned long             v);
00528 
00529     const sc_unsigned& operator = ( int                       v) 
00530         { return operator=((long) v); }
00531 
00532     const sc_unsigned& operator = ( unsigned int              v) 
00533         { return operator=((unsigned long) v); }
00534 
00535     const sc_unsigned& operator = ( double                    v);
00536     const sc_unsigned& operator = ( const sc_int_base&        v);
00537     const sc_unsigned& operator = ( const sc_uint_base&       v);
00538 
00539     const sc_unsigned& operator = ( const sc_bv_base& );
00540     const sc_unsigned& operator = ( const sc_lv_base& );
00541 
00542 #ifdef SC_INCLUDE_FX
00543     const sc_unsigned& operator = ( const sc_fxval& );
00544     const sc_unsigned& operator = ( const sc_fxval_fast& );
00545     const sc_unsigned& operator = ( const sc_fxnum& );
00546     const sc_unsigned& operator = ( const sc_fxnum_fast& );
00547 #endif
00548 
00549 
00550     // destructor
00551 
00552     virtual ~sc_unsigned()
00553         {
00554 #           ifndef SC_MAX_NBITS
00555                 delete [] digit;
00556 #           endif
00557         }
00558 
00559     // Concatenation support:
00560 
00561         unsigned long* get_raw() const { return digit; }
00562     virtual int concat_length(bool* xz_present_p) const
00563        { if ( xz_present_p ) *xz_present_p = false; return nbits-1; }
00564     virtual bool concat_get_ctrl( unsigned long* dst_p, int low_i ) const;
00565     virtual bool concat_get_data( unsigned long* dst_p, int low_i ) const;
00566     virtual uint64 concat_get_uint64() const;
00567     virtual void concat_set(int64 src, int low_i);
00568     virtual void concat_set(const sc_signed& src, int low_i);
00569     virtual void concat_set(const sc_unsigned& src, int low_i);
00570     virtual void concat_set(uint64 src, int low_i);
00571 
00572     // Increment operators.
00573 
00574     sc_unsigned& operator ++ ();
00575     const sc_unsigned operator ++ (int);
00576 
00577     // Decrement operators.
00578 
00579     sc_unsigned& operator -- ();
00580     const sc_unsigned operator -- (int);
00581 
00582 
00583     // bit selection
00584 
00585     inline void check_index( int i ) const
00586         { /*if ( (i < 0) || (i >= nbits-1) ) invalid_index(i);*/ }
00587 
00588     void invalid_index( int i ) const;
00589 
00590     sc_unsigned_bitref& operator [] ( int i )
00591         {
00592             check_index(i);
00593             sc_unsigned_bitref* result_p = 
00594                 sc_unsigned_bitref::m_pool.allocate();
00595             result_p->initialize( this, i );
00596             return *result_p;
00597         }
00598 
00599     const sc_unsigned_bitref_r& operator [] ( int i ) const
00600         {
00601             check_index(i);
00602             sc_unsigned_bitref* result_p = 
00603                 sc_unsigned_bitref::m_pool.allocate();
00604             result_p->initialize( this, i );
00605             return *result_p;
00606         }
00607 
00608     sc_unsigned_bitref& bit( int i )
00609         {
00610             check_index(i);
00611             sc_unsigned_bitref* result_p = 
00612                 sc_unsigned_bitref::m_pool.allocate();
00613             result_p->initialize( this, i );
00614             return *result_p;
00615         }
00616 
00617     const sc_unsigned_bitref_r& bit( int i ) const
00618         {
00619             check_index(i);
00620             sc_unsigned_bitref* result_p = 
00621                 sc_unsigned_bitref::m_pool.allocate();
00622             result_p->initialize( this, i );
00623             return *result_p;
00624         }
00625 
00626 
00627     // part selection
00628 
00629     // Subref operators. Help access the range of bits from the ith to
00630     // jth. These indices have arbitrary precedence with respect to each
00631     // other, i.e., we can have i <= j or i > j. Note the equivalence
00632     // between range(i, j) and operator (i, j). Also note that
00633     // operator (i, i) returns an unsigned number that corresponds to the
00634     // bit operator [i], so these two forms are not the same.
00635 
00636     inline void check_range( int l, int r ) const
00637         {
00638 #if 0
00639             if ( l < r )
00640             {
00641                 if ( (l < 0) || (r >= nbits-1) ) invalid_range(l,r);
00642             }
00643             else
00644             {
00645                 if ( (r < 0) || (l >= nbits-1) ) invalid_range(l,r);
00646             }
00647 #endif // 0
00648         }
00649 
00650     void invalid_range( int l, int r ) const;
00651 
00652     sc_unsigned_subref& range( int i, int j )
00653         {
00654             check_range(i,j);
00655             sc_unsigned_subref* result_p = 
00656                 sc_unsigned_subref::m_pool.allocate();
00657             result_p->initialize( this, i, j );
00658             return *result_p;
00659         }
00660 
00661     const sc_unsigned_subref_r& range( int i, int j ) const
00662         {
00663             check_range(i,j);
00664             sc_unsigned_subref* result_p = 
00665                 sc_unsigned_subref::m_pool.allocate();
00666             result_p->initialize( this, i, j );
00667             return *result_p;
00668         }
00669 
00670     sc_unsigned_subref& operator () ( int i, int j )
00671         {
00672             check_range(i,j);
00673             sc_unsigned_subref* result_p = 
00674                 sc_unsigned_subref::m_pool.allocate();
00675             result_p->initialize( this, i, j );
00676             return *result_p;
00677         }
00678 
00679     const sc_unsigned_subref_r& operator () ( int i, int j ) const
00680         {
00681             check_range(i,j);
00682             sc_unsigned_subref* result_p = 
00683                 sc_unsigned_subref::m_pool.allocate();
00684             result_p->initialize( this, i, j );
00685             return *result_p;
00686         }
00687 
00688     // explicit conversions
00689 
00690     int           to_int() const;
00691     unsigned int  to_uint() const;
00692     long          to_long() const;
00693     unsigned long to_ulong() const;
00694     int64         to_int64() const;
00695     uint64        to_uint64() const;
00696     double        to_double() const;
00697 
00698 #ifdef SC_DT_DEPRECATED
00699     int to_signed() const
00700         { return to_int(); }
00701 
00702     unsigned int to_unsigned() const
00703         { return to_uint(); }
00704 #endif
00705 
00706     // explicit conversion to character string
00707 
00708     const std::string to_string( sc_numrep numrep = SC_DEC ) const;
00709     const std::string to_string( sc_numrep numrep, bool w_prefix ) const;
00710 
00711     // Print functions. dump prints the internals of the class.
00712 
00713     void print( ::std::ostream& os = ::std::cout ) const
00714         { os << to_string(sc_io_base(os,SC_DEC),sc_io_show_base(os)); }
00715 
00716     void scan( ::std::istream& is = ::std::cin );
00717 
00718     void dump( ::std::ostream& os = ::std::cout ) const;
00719 
00720 
00721   // Functions to find various properties.    
00722   int  length() const { return nbits - 1; }  // Bit width.
00723   bool iszero() const;                       // Is the number zero?
00724   bool sign() const { return 0; }            // Sign.
00725 
00726     // reduce methods
00727 
00728     bool and_reduce() const;
00729 
00730     bool nand_reduce() const
00731         { return ( ! and_reduce() ); }
00732 
00733     bool or_reduce() const;
00734 
00735     bool nor_reduce() const
00736         { return ( ! or_reduce() ); }
00737 
00738     bool xor_reduce() const;
00739 
00740     bool xnor_reduce() const  
00741         { return ( ! xor_reduce() ); }
00742 
00743 
00744   // Functions to access individual bits.  
00745   bool test(int i) const;      // Is the ith bit 0 or 1?
00746   void set(int i);             // Set the ith bit to 1.
00747   void clear(int i);           // Set the ith bit to 0.
00748   void set(int i, bool v)      // Set the ith bit to v.
00749     { if (v) set(i); else clear(i);  }
00750   void invert(int i)           // Negate the ith bit.
00751     { if (test(i)) clear(i); else set(i);  }
00752 
00753   // Make the number equal to its mirror image.
00754   void reverse();
00755 
00756   // Get/set a packed bit representation of the number.
00757   void get_packed_rep(unsigned long *buf) const;
00758   void set_packed_rep(unsigned long *buf);
00759 
00760   /*
00761     The comparison of the old and new semantics are as follows:
00762 
00763     Let s = sc_signed, 
00764         u = sc_unsigned,
00765         un = { uint64, unsigned long, unsigned int },
00766         sn = { int64, long, int, char* }, and
00767         OP = { +, -, *, /, % }.
00768 
00769     Old semantics:                     New semantics:
00770       u OP u -> u                        u OP u -> u
00771       s OP u -> u                        s OP u -> s
00772       u OP s -> u                        u OP s -> s
00773       s OP s -> s                        s OP s -> s
00774 
00775       u OP un = un OP u -> u             u OP un = un OP u -> u
00776       u OP sn = sn OP u -> u             u OP sn = sn OP u -> s
00777 
00778       s OP un = un OP s -> s             s OP un = un OP s -> s
00779       s OP sn = sn OP s -> s             s OP sn = sn OP s -> s
00780 
00781     In the new semantics, the result is u if both operands are u; the
00782     result is s otherwise. The only exception is subtraction. The result
00783     of a subtraction is always s.
00784 
00785     The old semantics is like C/C++ semantics on integer types; the
00786     new semantics is due to the VSIA C/C++ data types standard.  
00787    */
00788 
00789   // ARITHMETIC OPERATORS:
00790 
00791   // ADDition operators:
00792    
00793   friend   sc_signed operator + (const sc_unsigned&  u, const sc_signed&    v); 
00794   friend   sc_signed operator + (const sc_signed&    u, const sc_unsigned&  v); 
00795 
00796   friend sc_unsigned operator + (const sc_unsigned&  u, const sc_unsigned&  v);
00797   friend   sc_signed operator + (const sc_unsigned&  u, int64               v); 
00798   friend sc_unsigned operator + (const sc_unsigned&  u, uint64              v); 
00799   friend   sc_signed operator + (const sc_unsigned&  u, long                v); 
00800   friend sc_unsigned operator + (const sc_unsigned&  u, unsigned long       v);
00801   friend   sc_signed operator + (const sc_unsigned&  u, int                 v);
00802   friend sc_unsigned operator + (const sc_unsigned&  u, unsigned int        v) 
00803     { return operator+(u, (unsigned long) v); }
00804 
00805   friend   sc_signed operator + (int64               u, const sc_unsigned&  v); 
00806   friend sc_unsigned operator + (uint64              u, const sc_unsigned&  v); 
00807   friend   sc_signed operator + (long                u, const sc_unsigned&  v); 
00808   friend sc_unsigned operator + (unsigned long       u, const sc_unsigned&  v);
00809   friend   sc_signed operator + (int                 u, const sc_unsigned&  v);
00810   friend sc_unsigned operator + (unsigned int        u, const sc_unsigned&  v)  
00811     { return operator+((unsigned long) u,  v); } 
00812 
00813   const sc_unsigned& operator += (const sc_signed&    v); 
00814   const sc_unsigned& operator += (const sc_unsigned&  v); 
00815   const sc_unsigned& operator += (int64               v); 
00816   const sc_unsigned& operator += (uint64              v); 
00817   const sc_unsigned& operator += (long                v); 
00818   const sc_unsigned& operator += (unsigned long       v); 
00819   const sc_unsigned& operator += (int                 v) 
00820     { return operator+=((long) v); }
00821   const sc_unsigned& operator += (unsigned int        v) 
00822     { return operator+=((unsigned long) v); }
00823 
00824   friend sc_unsigned operator + (const sc_unsigned&  u, const sc_uint_base& v);
00825   friend   sc_signed operator + (const sc_unsigned&  u, const sc_int_base&  v);
00826   friend sc_unsigned operator + (const sc_uint_base& u, const sc_unsigned&  v);
00827   friend   sc_signed operator + (const sc_int_base&  u, const sc_unsigned&  v);
00828   const sc_unsigned& operator += (const sc_int_base&  v);
00829   const sc_unsigned& operator += (const sc_uint_base& v);
00830 
00831   // SUBtraction operators:
00832    
00833   friend   sc_signed operator - (const sc_unsigned&  u, const sc_signed&    v); 
00834   friend   sc_signed operator - (const sc_signed&    u, const sc_unsigned&  v); 
00835 
00836   friend   sc_signed operator - (const sc_unsigned&  u, const sc_unsigned&  v);
00837   friend   sc_signed operator - (const sc_unsigned&  u, int64               v); 
00838   friend   sc_signed operator - (const sc_unsigned&  u, uint64              v); 
00839   friend   sc_signed operator - (const sc_unsigned&  u, long                v); 
00840   friend   sc_signed operator - (const sc_unsigned&  u, unsigned long       v);
00841   friend   sc_signed operator - (const sc_unsigned&  u, int                 v); 
00842   friend   sc_signed operator - (const sc_unsigned&  u, unsigned int        v);
00843 
00844   friend   sc_signed operator - (int64               u, const sc_unsigned&  v); 
00845   friend   sc_signed operator - (uint64              u, const sc_unsigned&  v); 
00846   friend   sc_signed operator - (long                u, const sc_unsigned&  v); 
00847   friend   sc_signed operator - (unsigned long       u, const sc_unsigned&  v);
00848   friend   sc_signed operator - (int                 u, const sc_unsigned&  v);
00849   friend   sc_signed operator - (unsigned int        u, const sc_unsigned&  v); 
00850 
00851   const sc_unsigned& operator -= (const sc_signed&    v); 
00852   const sc_unsigned& operator -= (const sc_unsigned&  v); 
00853   const sc_unsigned& operator -= (int64               v); 
00854   const sc_unsigned& operator -= (uint64              v); 
00855   const sc_unsigned& operator -= (long                v); 
00856   const sc_unsigned& operator -= (unsigned long       v); 
00857   const sc_unsigned& operator -= (int                 v) 
00858     { return operator-=((long) v); }
00859   const sc_unsigned& operator -= (unsigned int        v) 
00860     { return operator-=((unsigned long) v); }
00861 
00862   friend   sc_signed operator - (const sc_unsigned&  u, const sc_uint_base& v);
00863   friend   sc_signed operator - (const sc_unsigned&  u, const sc_int_base&  v);
00864   friend   sc_signed operator - (const sc_uint_base& u, const sc_unsigned&  v);
00865   friend   sc_signed operator - (const sc_int_base&  u, const sc_unsigned&  v);
00866   const sc_unsigned& operator -= (const sc_int_base&  v);
00867   const sc_unsigned& operator -= (const sc_uint_base& v);
00868 
00869   // MULtiplication operators:
00870    
00871   friend   sc_signed operator * (const sc_unsigned&  u, const sc_signed&    v); 
00872   friend   sc_signed operator * (const sc_signed&    u, const sc_unsigned&  v); 
00873 
00874   friend sc_unsigned operator * (const sc_unsigned&  u, const sc_unsigned&  v);
00875   friend   sc_signed operator * (const sc_unsigned&  u, int64               v); 
00876   friend sc_unsigned operator * (const sc_unsigned&  u, uint64              v); 
00877   friend   sc_signed operator * (const sc_unsigned&  u, long                v); 
00878   friend sc_unsigned operator * (const sc_unsigned&  u, unsigned long       v);
00879   friend   sc_signed operator * (const sc_unsigned&  u, int                 v);
00880   friend sc_unsigned operator * (const sc_unsigned&  u, unsigned int        v) 
00881     { return operator*(u, (unsigned long) v); }
00882 
00883   friend   sc_signed operator * (int64               u, const sc_unsigned&  v); 
00884   friend sc_unsigned operator * (uint64              u, const sc_unsigned&  v); 
00885   friend   sc_signed operator * (long                u, const sc_unsigned&  v); 
00886   friend sc_unsigned operator * (unsigned long       u, const sc_unsigned&  v);
00887   friend   sc_signed operator * (int                 u, const sc_unsigned&  v);
00888   friend sc_unsigned operator * (unsigned int        u, const sc_unsigned&  v)  
00889     { return operator*((unsigned long) u,  v); } 
00890 
00891   const sc_unsigned& operator *= (const sc_signed&    v); 
00892   const sc_unsigned& operator *= (const sc_unsigned&  v); 
00893   const sc_unsigned& operator *= (int64               v); 
00894   const sc_unsigned& operator *= (uint64              v); 
00895   const sc_unsigned& operator *= (long                v); 
00896   const sc_unsigned& operator *= (unsigned long       v); 
00897   const sc_unsigned& operator *= (int                 v) 
00898     { return operator*=((long) v); }
00899   const sc_unsigned& operator *= (unsigned int        v) 
00900     { return operator*=((unsigned long) v); }
00901 
00902   friend sc_unsigned operator * (const sc_unsigned&  u, const sc_uint_base& v);
00903   friend   sc_signed operator * (const sc_unsigned&  u, const sc_int_base&  v);
00904   friend sc_unsigned operator * (const sc_uint_base& u, const sc_unsigned&  v);
00905   friend   sc_signed operator * (const sc_int_base&  u, const sc_unsigned&  v);
00906   const sc_unsigned& operator *= (const sc_int_base&  v);
00907   const sc_unsigned& operator *= (const sc_uint_base& v);
00908 
00909   // DIVision operators:
00910    
00911   friend   sc_signed operator / (const sc_unsigned&  u, const sc_signed&    v); 
00912   friend   sc_signed operator / (const sc_signed&    u, const sc_unsigned&  v); 
00913 
00914   friend sc_unsigned operator / (const sc_unsigned&  u, const sc_unsigned&  v);
00915   friend   sc_signed operator / (const sc_unsigned&  u, int64               v); 
00916   friend sc_unsigned operator / (const sc_unsigned&  u, uint64              v); 
00917   friend   sc_signed operator / (const sc_unsigned&  u, long                v); 
00918   friend sc_unsigned operator / (const sc_unsigned&  u, unsigned long       v);
00919   friend   sc_signed operator / (const sc_unsigned&  u, int                 v);
00920   friend sc_unsigned operator / (const sc_unsigned&  u, unsigned int        v) 
00921     { return operator/(u, (unsigned long) v); }
00922 
00923   friend   sc_signed operator / (int64               u, const sc_unsigned&  v); 
00924   friend sc_unsigned operator / (uint64              u, const sc_unsigned&  v); 
00925   friend   sc_signed operator / (long                u, const sc_unsigned&  v); 
00926   friend sc_unsigned operator / (unsigned long       u, const sc_unsigned&  v);
00927   friend   sc_signed operator / (int                 u, const sc_unsigned&  v);
00928   friend sc_unsigned operator / (unsigned int        u, const sc_unsigned&  v)  
00929     { return operator/((unsigned long) u,  v); } 
00930 
00931   const sc_unsigned& operator /= (const sc_signed&    v); 
00932   const sc_unsigned& operator /= (const sc_unsigned&  v); 
00933   const sc_unsigned& operator /= (int64               v); 
00934   const sc_unsigned& operator /= (uint64              v); 
00935   const sc_unsigned& operator /= (long                v); 
00936   const sc_unsigned& operator /= (unsigned long       v); 
00937   const sc_unsigned& operator /= (int                 v) 
00938     { return operator/=((long) v); }
00939   const sc_unsigned& operator /= (unsigned int        v) 
00940     { return operator/=((unsigned long) v); }
00941 
00942   friend sc_unsigned operator / (const sc_unsigned&  u, const sc_uint_base& v);
00943   friend   sc_signed operator / (const sc_unsigned&  u, const sc_int_base&  v);
00944   friend sc_unsigned operator / (const sc_uint_base& u, const sc_unsigned&  v);
00945   friend   sc_signed operator / (const sc_int_base&  u, const sc_unsigned&  v);
00946   const sc_unsigned& operator /= (const sc_int_base&  v);
00947   const sc_unsigned& operator /= (const sc_uint_base& v);
00948 
00949   // MODulo operators:
00950    
00951   friend   sc_signed operator % (const sc_unsigned&  u, const sc_signed&    v); 
00952   friend   sc_signed operator % (const sc_signed&    u, const sc_unsigned&  v); 
00953 
00954   friend sc_unsigned operator % (const sc_unsigned&  u, const sc_unsigned&  v);
00955   friend   sc_signed operator % (const sc_unsigned&  u, int64               v); 
00956   friend sc_unsigned operator % (const sc_unsigned&  u, uint64              v); 
00957   friend   sc_signed operator % (const sc_unsigned&  u, long                v); 
00958   friend sc_unsigned operator % (const sc_unsigned&  u, unsigned long       v);
00959   friend   sc_signed operator % (const sc_unsigned&  u, int                 v);
00960   friend sc_unsigned operator % (const sc_unsigned&  u, unsigned int        v) 
00961     { return operator%(u, (unsigned long) v); }
00962 
00963   friend   sc_signed operator % (int64               u, const sc_unsigned&  v); 
00964   friend sc_unsigned operator % (uint64              u, const sc_unsigned&  v); 
00965   friend   sc_signed operator % (long                u, const sc_unsigned&  v); 
00966   friend sc_unsigned operator % (unsigned long       u, const sc_unsigned&  v);
00967   friend   sc_signed operator % (int                 u, const sc_unsigned&  v);
00968   friend sc_unsigned operator % (unsigned int        u, const sc_unsigned&  v)  
00969     { return operator%((unsigned long) u,  v); } 
00970 
00971   const sc_unsigned& operator %= (const sc_signed&    v); 
00972   const sc_unsigned& operator %= (const sc_unsigned&  v); 
00973   const sc_unsigned& operator %= (int64               v); 
00974   const sc_unsigned& operator %= (uint64              v); 
00975   const sc_unsigned& operator %= (long                v); 
00976   const sc_unsigned& operator %= (unsigned long       v); 
00977   const sc_unsigned& operator %= (int                 v) 
00978     { return operator%=((long) v); }
00979   const sc_unsigned& operator %= (unsigned int        v) 
00980     { return operator%=((unsigned long) v); }
00981 
00982   friend sc_unsigned operator % (const sc_unsigned&  u, const sc_uint_base& v);
00983   friend   sc_signed operator % (const sc_unsigned&  u, const sc_int_base&  v);
00984   friend sc_unsigned operator % (const sc_uint_base& u, const sc_unsigned&  v);
00985   friend   sc_signed operator % (const sc_int_base&  u, const sc_unsigned&  v);
00986   const sc_unsigned& operator %= (const sc_int_base&  v);
00987   const sc_unsigned& operator %= (const sc_uint_base& v);
00988 
00989   // BITWISE OPERATORS:
00990 
00991   // Bitwise AND operators:
00992    
00993   friend   sc_signed operator & (const sc_unsigned&  u, const sc_signed&    v); 
00994   friend   sc_signed operator & (const sc_signed&    u, const sc_unsigned&  v); 
00995 
00996   friend sc_unsigned operator & (const sc_unsigned&  u, const sc_unsigned&  v);
00997   friend   sc_signed operator & (const sc_unsigned&  u, int64               v); 
00998   friend sc_unsigned operator & (const sc_unsigned&  u, uint64              v); 
00999   friend   sc_signed operator & (const sc_unsigned&  u, long                v); 
01000   friend sc_unsigned operator & (const sc_unsigned&  u, unsigned long       v);
01001   friend   sc_signed operator & (const sc_unsigned&  u, int                 v);
01002   friend sc_unsigned operator & (const sc_unsigned&  u, unsigned int        v) 
01003     { return operator&(u, (unsigned long) v); }
01004 
01005   friend   sc_signed operator & (int64               u, const sc_unsigned&  v); 
01006   friend sc_unsigned operator & (uint64              u, const sc_unsigned&  v); 
01007   friend   sc_signed operator & (long                u, const sc_unsigned&  v); 
01008   friend sc_unsigned operator & (unsigned long       u, const sc_unsigned&  v);
01009   friend   sc_signed operator & (int                 u, const sc_unsigned&  v);
01010   friend sc_unsigned operator & (unsigned int        u, const sc_unsigned&  v)  
01011     { return operator&((unsigned long) u,  v); } 
01012 
01013   const sc_unsigned& operator &= (const sc_signed&    v); 
01014   const sc_unsigned& operator &= (const sc_unsigned&  v); 
01015   const sc_unsigned& operator &= (int64               v); 
01016   const sc_unsigned& operator &= (uint64              v); 
01017   const sc_unsigned& operator &= (long                v); 
01018   const sc_unsigned& operator &= (unsigned long       v); 
01019   const sc_unsigned& operator &= (int                 v) 
01020     { return operator&=((long) v); }
01021   const sc_unsigned& operator &= (unsigned int        v) 
01022     { return operator&=((unsigned long) v); }
01023 
01024   friend sc_unsigned operator & (const sc_unsigned&  u, const sc_uint_base& v);
01025   friend   sc_signed operator & (const sc_unsigned&  u, const sc_int_base&  v);
01026   friend sc_unsigned operator & (const sc_uint_base& u, const sc_unsigned&  v);
01027   friend   sc_signed operator & (const sc_int_base&  u, const sc_unsigned&  v);
01028   const sc_unsigned& operator &= (const sc_int_base&  v);
01029   const sc_unsigned& operator &= (const sc_uint_base& v);
01030 
01031   // Bitwise OR operators:
01032    
01033   friend   sc_signed operator | (const sc_unsigned&  u, const sc_signed&    v); 
01034   friend   sc_signed operator | (const sc_signed&    u, const sc_unsigned&  v); 
01035 
01036   friend sc_unsigned operator | (const sc_unsigned&  u, const sc_unsigned&  v);
01037   friend   sc_signed operator | (const sc_unsigned&  u, int64               v); 
01038   friend sc_unsigned operator | (const sc_unsigned&  u, uint64              v); 
01039   friend   sc_signed operator | (const sc_unsigned&  u, long                v); 
01040   friend sc_unsigned operator | (const sc_unsigned&  u, unsigned long       v);
01041   friend   sc_signed operator | (const sc_unsigned&  u, int                 v);
01042   friend sc_unsigned operator | (const sc_unsigned&  u, unsigned int        v) 
01043     { return operator|(u, (unsigned long) v); }
01044 
01045   friend   sc_signed operator | (int64               u, const sc_unsigned&  v); 
01046   friend sc_unsigned operator | (uint64              u, const sc_unsigned&  v); 
01047   friend   sc_signed operator | (long                u, const sc_unsigned&  v); 
01048   friend sc_unsigned operator | (unsigned long       u, const sc_unsigned&  v);
01049   friend   sc_signed operator | (int                 u, const sc_unsigned&  v);
01050   friend sc_unsigned operator | (unsigned int        u, const sc_unsigned&  v)  
01051     { return operator|((unsigned long) u,  v); } 
01052 
01053   const sc_unsigned& operator |= (const sc_signed&    v); 
01054   const sc_unsigned& operator |= (const sc_unsigned&  v); 
01055   const sc_unsigned& operator |= (int64               v); 
01056   const sc_unsigned& operator |= (uint64              v); 
01057   const sc_unsigned& operator |= (long                v); 
01058   const sc_unsigned& operator |= (unsigned long       v); 
01059   const sc_unsigned& operator |= (int                 v) 
01060     { return operator|=((long) v); }
01061   const sc_unsigned& operator |= (unsigned int        v) 
01062     { return operator|=((unsigned long) v); }
01063 
01064   friend sc_unsigned operator | (const sc_unsigned&  u, const sc_uint_base& v);
01065   friend   sc_signed operator | (const sc_unsigned&  u, const sc_int_base&  v);
01066   friend sc_unsigned operator | (const sc_uint_base& u, const sc_unsigned&  v);
01067   friend   sc_signed operator | (const sc_int_base&  u, const sc_unsigned&  v);
01068   const sc_unsigned& operator |= (const sc_int_base&  v);
01069   const sc_unsigned& operator |= (const sc_uint_base& v);
01070 
01071   // Bitwise XOR operators:
01072    
01073   friend   sc_signed operator ^ (const sc_unsigned&  u, const sc_signed&    v); 
01074   friend   sc_signed operator ^ (const sc_signed&    u, const sc_unsigned&  v); 
01075 
01076   friend sc_unsigned operator ^ (const sc_unsigned&  u, const sc_unsigned&  v);
01077   friend   sc_signed operator ^ (const sc_unsigned&  u, int64               v); 
01078   friend sc_unsigned operator ^ (const sc_unsigned&  u, uint64              v); 
01079   friend   sc_signed operator ^ (const sc_unsigned&  u, long                v); 
01080   friend sc_unsigned operator ^ (const sc_unsigned&  u, unsigned long       v);
01081   friend   sc_signed operator ^ (const sc_unsigned&  u, int                 v);
01082   friend sc_unsigned operator ^ (const sc_unsigned&  u, unsigned int        v) 
01083     { return operator^(u, (unsigned long) v); }
01084 
01085   friend   sc_signed operator ^ (int64               u, const sc_unsigned&  v); 
01086   friend sc_unsigned operator ^ (uint64              u, const sc_unsigned&  v); 
01087   friend   sc_signed operator ^ (long                u, const sc_unsigned&  v); 
01088   friend sc_unsigned operator ^ (unsigned long       u, const sc_unsigned&  v);
01089   friend   sc_signed operator ^ (int                 u, const sc_unsigned&  v);
01090   friend sc_unsigned operator ^ (unsigned int        u, const sc_unsigned&  v)  
01091     { return operator^((unsigned long) u,  v); } 
01092 
01093   const sc_unsigned& operator ^= (const sc_signed&    v); 
01094   const sc_unsigned& operator ^= (const sc_unsigned&  v); 
01095   const sc_unsigned& operator ^= (int64               v); 
01096   const sc_unsigned& operator ^= (uint64              v); 
01097   const sc_unsigned& operator ^= (long                v); 
01098   const sc_unsigned& operator ^= (unsigned long       v); 
01099   const sc_unsigned& operator ^= (int                 v) 
01100     { return operator^=((long) v); }
01101   const sc_unsigned& operator ^= (unsigned int        v) 
01102     { return operator^=((unsigned long) v); }
01103 
01104   friend sc_unsigned operator ^ (const sc_unsigned&  u, const sc_uint_base& v);
01105   friend   sc_signed operator ^ (const sc_unsigned&  u, const sc_int_base&  v);
01106   friend sc_unsigned operator ^ (const sc_uint_base& u, const sc_unsigned&  v);
01107   friend   sc_signed operator ^ (const sc_int_base&  u, const sc_unsigned&  v);
01108   const sc_unsigned& operator ^= (const sc_int_base&  v);
01109   const sc_unsigned& operator ^= (const sc_uint_base& v);
01110 
01111   // SHIFT OPERATORS:
01112 
01113   // LEFT SHIFT operators:
01114    
01115   friend sc_unsigned operator << (const sc_unsigned&  u, const sc_signed&    v); 
01116   friend   sc_signed operator << (const sc_signed&    u, const sc_unsigned&  v); 
01117 
01118   friend sc_unsigned operator << (const sc_unsigned&  u, const sc_unsigned&  v);
01119   friend sc_unsigned operator << (const sc_unsigned&  u, int64               v); 
01120   friend sc_unsigned operator << (const sc_unsigned&  u, uint64              v); 
01121   friend sc_unsigned operator << (const sc_unsigned&  u, long                v); 
01122   friend sc_unsigned operator << (const sc_unsigned&  u, unsigned long       v);
01123   friend sc_unsigned operator << (const sc_unsigned&  u, int                 v) 
01124     { return operator<<(u, (long) v); }
01125   friend sc_unsigned operator << (const sc_unsigned&  u, unsigned int        v) 
01126     { return operator<<(u, (unsigned long) v); }
01127 
01128   const sc_unsigned& operator <<= (const sc_signed&    v); 
01129   const sc_unsigned& operator <<= (const sc_unsigned&  v); 
01130   const sc_unsigned& operator <<= (int64               v); 
01131   const sc_unsigned& operator <<= (uint64              v); 
01132   const sc_unsigned& operator <<= (long                v); 
01133   const sc_unsigned& operator <<= (unsigned long       v); 
01134   const sc_unsigned& operator <<= (int                 v) 
01135     { return operator<<=((long) v); }
01136   const sc_unsigned& operator <<= (unsigned int        v) 
01137     { return operator<<=((unsigned long) v); }
01138 
01139   friend sc_unsigned operator << (const sc_unsigned&  u, const sc_uint_base& v);
01140   friend sc_unsigned operator << (const sc_unsigned&  u, const sc_int_base&  v);
01141   const sc_unsigned& operator <<= (const sc_int_base&  v);
01142   const sc_unsigned& operator <<= (const sc_uint_base& v);
01143 
01144   // RIGHT SHIFT operators:
01145    
01146   friend sc_unsigned operator >> (const sc_unsigned&  u, const sc_signed&    v); 
01147   friend   sc_signed operator >> (const sc_signed&    u, const sc_unsigned&  v); 
01148 
01149   friend sc_unsigned operator >> (const sc_unsigned&  u, const sc_unsigned&  v);
01150   friend sc_unsigned operator >> (const sc_unsigned&  u, int64               v); 
01151   friend sc_unsigned operator >> (const sc_unsigned&  u, uint64              v); 
01152   friend sc_unsigned operator >> (const sc_unsigned&  u, long                v); 
01153   friend sc_unsigned operator >> (const sc_unsigned&  u, unsigned long       v);
01154   friend sc_unsigned operator >> (const sc_unsigned&  u, int                 v) 
01155     { return operator>>(u, (long) v); }
01156   friend sc_unsigned operator >> (const sc_unsigned&  u, unsigned int        v) 
01157     { return operator>>(u, (unsigned long) v); }
01158 
01159   const sc_unsigned& operator >>= (const sc_signed&    v); 
01160   const sc_unsigned& operator >>= (const sc_unsigned&  v); 
01161   const sc_unsigned& operator >>= (int64               v); 
01162   const sc_unsigned& operator >>= (uint64              v); 
01163   const sc_unsigned& operator >>= (long                v); 
01164   const sc_unsigned& operator >>= (unsigned long       v); 
01165   const sc_unsigned& operator >>= (int                 v) 
01166     { return operator>>=((long) v); }
01167   const sc_unsigned& operator >>= (unsigned int        v) 
01168     { return operator>>=((unsigned long) v); }
01169 
01170   friend sc_unsigned operator >> ( const sc_unsigned& , const sc_uint_base& );
01171   friend sc_unsigned operator >> ( const sc_unsigned&, const sc_int_base& );
01172   const sc_unsigned& operator >>= (const sc_int_base&  v);
01173   const sc_unsigned& operator >>= (const sc_uint_base& v);
01174 
01175   // Unary arithmetic operators
01176   friend sc_unsigned operator + (const sc_unsigned& u);
01177   friend   sc_signed operator - (const sc_unsigned& u);
01178 
01179   // LOGICAL OPERATORS:
01180 
01181   // Logical EQUAL operators:
01182    
01183   friend bool operator == (const sc_unsigned&  u, const sc_signed&    v); 
01184   friend bool operator == (const sc_signed&    u, const sc_unsigned&  v); 
01185 
01186   friend bool operator == (const sc_unsigned&  u, const sc_unsigned&  v);
01187   friend bool operator == (const sc_unsigned&  u, int64               v); 
01188   friend bool operator == (const sc_unsigned&  u, uint64              v); 
01189   friend bool operator == (const sc_unsigned&  u, long                v); 
01190   friend bool operator == (const sc_unsigned&  u, unsigned long       v);
01191   friend bool operator == (const sc_unsigned&  u, int                 v) 
01192     { return operator==(u, (long) v); }
01193   friend bool operator == (const sc_unsigned&  u, unsigned int        v) 
01194     { return operator==(u, (unsigned long) v); }
01195 
01196   friend bool operator == (int64               u, const sc_unsigned&  v); 
01197   friend bool operator == (uint64              u, const sc_unsigned&  v); 
01198   friend bool operator == (long                u, const sc_unsigned&  v); 
01199   friend bool operator == (unsigned long       u, const sc_unsigned&  v);
01200   friend bool operator == (int                 u, const sc_unsigned&  v)  
01201     { return operator==((long) u,  v); } 
01202   friend bool operator == (unsigned int        u, const sc_unsigned&  v)  
01203     { return operator==((unsigned long) u,  v); } 
01204 
01205   friend bool operator == (const sc_unsigned&  u, const sc_uint_base& v);
01206   friend bool operator == (const sc_unsigned&  u, const sc_int_base&  v);
01207   friend bool operator == (const sc_uint_base& u, const sc_unsigned&  v);
01208   friend bool operator == (const sc_int_base&  u, const sc_unsigned&  v);
01209 
01210   // Logical NOT_EQUAL operators:
01211    
01212   friend bool operator != (const sc_unsigned&  u, const sc_signed&    v); 
01213   friend bool operator != (const sc_signed&    u, const sc_unsigned&  v); 
01214 
01215   friend bool operator != (const sc_unsigned&  u, const sc_unsigned&  v);
01216   friend bool operator != (const sc_unsigned&  u, int64               v); 
01217   friend bool operator != (const sc_unsigned&  u, uint64              v); 
01218   friend bool operator != (const sc_unsigned&  u, long                v); 
01219   friend bool operator != (const sc_unsigned&  u, unsigned long       v);
01220   friend bool operator != (const sc_unsigned&  u, int                 v) 
01221     { return operator!=(u, (long) v); }
01222   friend bool operator != (const sc_unsigned&  u, unsigned int        v) 
01223     { return operator!=(u, (unsigned long) v); }
01224 
01225   friend bool operator != (int64               u, const sc_unsigned&  v); 
01226   friend bool operator != (uint64              u, const sc_unsigned&  v); 
01227   friend bool operator != (long                u, const sc_unsigned&  v); 
01228   friend bool operator != (unsigned long       u, const sc_unsigned&  v);
01229   friend bool operator != (int                 u, const sc_unsigned&  v)  
01230     { return operator!=((long) u,  v); } 
01231   friend bool operator != (unsigned int        u, const sc_unsigned&  v)  
01232     { return operator!=((unsigned long) u,  v); } 
01233 
01234   friend bool operator != (const sc_unsigned&  u, const sc_uint_base& v);
01235   friend bool operator != (const sc_unsigned&  u, const sc_int_base&  v);
01236   friend bool operator != (const sc_uint_base& u, const sc_unsigned&  v);
01237   friend bool operator != (const sc_int_base&  u, const sc_unsigned&  v);
01238 
01239   // Logical LESS_THAN operators:
01240    
01241   friend bool operator < (const sc_unsigned&  u, const sc_signed&    v); 
01242   friend bool operator < (const sc_signed&    u, const sc_unsigned&  v); 
01243 
01244   friend bool operator < (const sc_unsigned&  u, const sc_unsigned&  v);
01245   friend bool operator < (const sc_unsigned&  u, int64               v); 
01246   friend bool operator < (const sc_unsigned&  u, uint64              v); 
01247   friend bool operator < (const sc_unsigned&  u, long                v); 
01248   friend bool operator < (const sc_unsigned&  u, unsigned long       v);
01249   friend bool operator < (const sc_unsigned&  u, int                 v) 
01250     { return operator<(u, (long) v); }
01251   friend bool operator < (const sc_unsigned&  u, unsigned int        v) 
01252     { return operator<(u, (unsigned long) v); }
01253 
01254   friend bool operator < (int64               u, const sc_unsigned&  v); 
01255   friend bool operator < (uint64              u, const sc_unsigned&  v); 
01256   friend bool operator < (long                u, const sc_unsigned&  v); 
01257   friend bool operator < (unsigned long       u, const sc_unsigned&  v);
01258   friend bool operator < (int                 u, const sc_unsigned&  v)  
01259     { return operator<((long) u,  v); } 
01260   friend bool operator < (unsigned int        u, const sc_unsigned&  v)  
01261     { return operator<((unsigned long) u,  v); } 
01262 
01263   friend bool operator < (const sc_unsigned&  u, const sc_uint_base& v);
01264   friend bool operator < (const sc_unsigned&  u, const sc_int_base&  v);
01265   friend bool operator < (const sc_uint_base& u, const sc_unsigned&  v);
01266   friend bool operator < (const sc_int_base&  u, const sc_unsigned&  v);
01267 
01268   // Logical LESS_THAN_AND_EQUAL operators:
01269    
01270   friend bool operator <= (const sc_unsigned&  u, const sc_signed&    v); 
01271   friend bool operator <= (const sc_signed&    u, const sc_unsigned&  v); 
01272 
01273   friend bool operator <= (const sc_unsigned&  u, const sc_unsigned&  v);
01274   friend bool operator <= (const sc_unsigned&  u, int64               v); 
01275   friend bool operator <= (const sc_unsigned&  u, uint64              v); 
01276   friend bool operator <= (const sc_unsigned&  u, long                v); 
01277   friend bool operator <= (const sc_unsigned&  u, unsigned long       v);
01278   friend bool operator <= (const sc_unsigned&  u, int                 v) 
01279     { return operator<=(u, (long) v); }
01280   friend bool operator <= (const sc_unsigned&  u, unsigned int        v) 
01281     { return operator<=(u, (unsigned long) v); }
01282 
01283   friend bool operator <= (int64               u, const sc_unsigned&  v); 
01284   friend bool operator <= (uint64              u, const sc_unsigned&  v); 
01285   friend bool operator <= (long                u, const sc_unsigned&  v); 
01286   friend bool operator <= (unsigned long       u, const sc_unsigned&  v);
01287   friend bool operator <= (int                 u, const sc_unsigned&  v)  
01288     { return operator<=((long) u,  v); } 
01289   friend bool operator <= (unsigned int        u, const sc_unsigned&  v)  
01290     { return operator<=((unsigned long) u,  v); } 
01291 
01292   friend bool operator <= (const sc_unsigned&  u, const sc_uint_base& v);
01293   friend bool operator <= (const sc_unsigned&  u, const sc_int_base&  v);
01294   friend bool operator <= (const sc_uint_base& u, const sc_unsigned&  v);
01295   friend bool operator <= (const sc_int_base&  u, const sc_unsigned&  v);
01296 
01297   // Logical GREATER_THAN operators:
01298    
01299   friend bool operator > (const sc_unsigned&  u, const sc_signed&    v); 
01300   friend bool operator > (const sc_signed&    u, const sc_unsigned&  v); 
01301 
01302   friend bool operator > (const sc_unsigned&  u, const sc_unsigned&  v);
01303   friend bool operator > (const sc_unsigned&  u, int64               v); 
01304   friend bool operator > (const sc_unsigned&  u, uint64              v); 
01305   friend bool operator > (const sc_unsigned&  u, long                v); 
01306   friend bool operator > (const sc_unsigned&  u, unsigned long       v);
01307   friend bool operator > (const sc_unsigned&  u, int                 v) 
01308     { return operator>(u, (long) v); }
01309   friend bool operator > (const sc_unsigned&  u, unsigned int        v) 
01310     { return operator>(u, (unsigned long) v); }
01311 
01312   friend bool operator > (int64               u, const sc_unsigned&  v); 
01313   friend bool operator > (uint64              u, const sc_unsigned&  v); 
01314   friend bool operator > (long                u, const sc_unsigned&  v); 
01315   friend bool operator > (unsigned long       u, const sc_unsigned&  v);
01316   friend bool operator > (int                 u, const sc_unsigned&  v)  
01317     { return operator>((long) u,  v); } 
01318   friend bool operator > (unsigned int        u, const sc_unsigned&  v)  
01319     { return operator>((unsigned long) u,  v); } 
01320 
01321   friend bool operator > (const sc_unsigned&  u, const sc_uint_base& v);
01322   friend bool operator > (const sc_unsigned&  u, const sc_int_base&  v);
01323   friend bool operator > (const sc_uint_base& u, const sc_unsigned&  v);
01324   friend bool operator > (const sc_int_base&  u, const sc_unsigned&  v);
01325 
01326   // Logical GREATER_THAN_AND_EQUAL operators:
01327    
01328   friend bool operator >= (const sc_unsigned&  u, const sc_signed&    v); 
01329   friend bool operator >= (const sc_signed&    u, const sc_unsigned&  v); 
01330 
01331   friend bool operator >= (const sc_unsigned&  u, const sc_unsigned&  v);
01332   friend bool operator >= (const sc_unsigned&  u, int64               v); 
01333   friend bool operator >= (const sc_unsigned&  u, uint64              v); 
01334   friend bool operator >= (const sc_unsigned&  u, long                v); 
01335   friend bool operator >= (const sc_unsigned&  u, unsigned long       v);
01336   friend bool operator >= (const sc_unsigned&  u, int                 v) 
01337     { return operator>=(u, (long) v); }
01338   friend bool operator >= (const sc_unsigned&  u, unsigned int        v) 
01339     { return operator>=(u, (unsigned long) v); }
01340 
01341   friend bool operator >= (int64               u, const sc_unsigned&  v); 
01342   friend bool operator >= (uint64              u, const sc_unsigned&  v); 
01343   friend bool operator >= (long                u, const sc_unsigned&  v); 
01344   friend bool operator >= (unsigned long       u, const sc_unsigned&  v);
01345   friend bool operator >= (int                 u, const sc_unsigned&  v)  
01346     { return operator>=((long) u,  v); } 
01347   friend bool operator >= (unsigned int        u, const sc_unsigned&  v)  
01348     { return operator>=((unsigned long) u,  v); } 
01349 
01350   friend bool operator >= (const sc_unsigned&  u, const sc_uint_base& v);
01351   friend bool operator >= (const sc_unsigned&  u, const sc_int_base&  v);
01352   friend bool operator >= (const sc_uint_base& u, const sc_unsigned&  v);
01353   friend bool operator >= (const sc_int_base&  u, const sc_unsigned&  v);
01354 
01355   // Bitwise NOT operator (unary).
01356   friend sc_unsigned operator ~ (const sc_unsigned& u); 
01357 
01358   // Helper functions.
01359   friend int compare_unsigned(small_type us, 
01360                               int unb,
01361                               int und, 
01362                               const unsigned long *ud, 
01363                               small_type vs, 
01364                               int vnb,
01365                               int vnd,
01366                               const unsigned long *vd,
01367                               small_type if_u_signed = 0,
01368                               small_type if_v_signed = 0);
01369   
01370   friend sc_unsigned add_unsigned_friend(small_type us, 
01371                                          int unb,
01372                                          int und, 
01373                                          const unsigned long *ud, 
01374                                          small_type vs, 
01375                                          int vnb,
01376                                          int vnd,
01377                                          const unsigned long *vd);
01378   
01379   friend sc_unsigned sub_unsigned_friend(small_type us, 
01380                                          int unb,
01381                                          int und, 
01382                                          const unsigned long *ud, 
01383                                          small_type vs, 
01384                                          int vnb,
01385                                          int vnd, 
01386                                          const unsigned long *vd);
01387   
01388   friend sc_unsigned mul_unsigned_friend(small_type s,
01389                                          int unb,
01390                                          int und, 
01391                                          const unsigned long *ud, 
01392                                          int vnb,
01393                                          int vnd,
01394                                          const unsigned long *vd);
01395   
01396   friend sc_unsigned div_unsigned_friend(small_type s,
01397                                          int unb,
01398                                          int und, 
01399                                          const unsigned long *ud, 
01400                                          int vnb,
01401                                          int vnd,
01402                                          const unsigned long *vd);
01403   
01404   friend sc_unsigned mod_unsigned_friend(small_type us,
01405                                          int unb,
01406                                          int und, 
01407                                          const unsigned long *ud, 
01408                                          int vnb,
01409                                          int vnd,
01410                                          const unsigned long *vd);
01411   
01412   friend sc_unsigned and_unsigned_friend(small_type us, 
01413                                          int unb, 
01414                                          int und, 
01415                                          const unsigned long *ud, 
01416                                          small_type vs,
01417                                          int vnb, 
01418                                          int vnd,
01419                                          const unsigned long *vd);
01420   
01421   friend sc_unsigned or_unsigned_friend(small_type us, 
01422                                         int unb, 
01423                                         int und, 
01424                                         const unsigned long *ud, 
01425                                         small_type vs,
01426                                         int vnb, 
01427                                         int vnd,
01428                                         const unsigned long *vd);
01429   
01430   friend sc_unsigned xor_unsigned_friend(small_type us, 
01431                                          int unb, 
01432                                          int und, 
01433                                          const unsigned long *ud, 
01434                                          small_type vs,
01435                                          int vnb, 
01436                                          int vnd,
01437                                          const unsigned long *vd);
01438   
01439 public:
01440   static sc_core::sc_vpool<sc_unsigned> m_pool;
01441 
01442 private:
01443 
01444   small_type  sgn;         // Shortened as s.
01445   int nbits;       // Shortened as nb.
01446   int ndigits;     // Shortened as nd.
01447 
01448 #ifdef SC_MAX_NBITS
01449   unsigned long digit[DIV_CEIL(SC_MAX_NBITS)];   // Shortened as d.
01450 #else
01451   unsigned long *digit;                       // Shortened as d.
01452 #endif
01453 
01454   // Private constructors:
01455 
01456   // Create a copy of v with sign s.
01457   sc_unsigned(const sc_unsigned& v, small_type s);
01458   sc_unsigned(const sc_signed&   v, small_type s);
01459 
01460   // Create an unsigned number with the given attributes.
01461   sc_unsigned(small_type s, int nb, int nd, 
01462               unsigned long *d, bool alloc = true);
01463 
01464   // Create an unsigned number using the bits u[l..r].
01465   sc_unsigned(const sc_signed* u, int l, int r);
01466   sc_unsigned(const sc_unsigned* u, int l, int r);
01467 
01468   // Private member functions. The called functions are inline functions.
01469 
01470   small_type default_sign() const
01471     { return SC_POS; }
01472 
01473   int num_bits(int nb) const { return nb + 1; }
01474 
01475   bool check_if_outside(int bit_num) const;
01476 
01477   void copy_digits(int nb, int nd, const unsigned long *d)
01478     { copy_digits_unsigned(sgn, nbits, ndigits, digit, nb, nd, d); }
01479   
01480   void makezero()
01481     { sgn = make_zero(ndigits, digit); }
01482 
01483   // Conversion functions between 2's complement (2C) and
01484   // sign-magnitude (SM):
01485   void convert_2C_to_SM()
01486     { sgn = convert_unsigned_2C_to_SM(nbits, ndigits, digit); }
01487 
01488   void convert_SM_to_2C_to_SM()
01489     { sgn = convert_unsigned_SM_to_2C_to_SM(sgn, nbits, ndigits, digit); }
01490 
01491   void convert_SM_to_2C()
01492     { convert_unsigned_SM_to_2C(sgn, ndigits, digit); }
01493 
01494 };
01495 
01496 
01497 
01498 inline
01499 ::std::ostream&
01500 operator << ( ::std::ostream&, const sc_unsigned& );
01501 
01502 inline
01503 ::std::istream&
01504 operator >> ( ::std::istream&, sc_unsigned& );
01505 
01506 
01507 // IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
01508 
01509 // ----------------------------------------------------------------------------
01510 //  CLASS : sc_unsigned_bitref_r
01511 //
01512 //  Proxy class for sc_unsigned bit selection (r-value only).
01513 // ----------------------------------------------------------------------------
01514 
01515 
01516 inline
01517 ::std::ostream&
01518 operator << ( ::std::ostream& os, const sc_unsigned_bitref_r& a )
01519 {
01520     a.print( os );
01521     return os;
01522 }
01523 
01524 
01525 // ----------------------------------------------------------------------------
01526 //  CLASS : sc_unsigned_bitref
01527 //
01528 //  Proxy class for sc_unsigned bit selection (r-value and l-value).
01529 // ----------------------------------------------------------------------------
01530 
01531 template<class T>
01532 inline const sc_unsigned_subref& sc_unsigned_subref::operator = ( 
01533     const sc_generic_base<T>& a )
01534 {
01535     sc_unsigned temp( length() );
01536     a->to_sc_unsigned(temp);
01537     return *this = temp;
01538 } 
01539 
01540 inline
01541 ::std::istream&
01542 operator >> ( ::std::istream& is, sc_unsigned_bitref& a )
01543 {
01544     a.scan( is );
01545     return is;
01546 }
01547 
01548 
01549 // ----------------------------------------------------------------------------
01550 //  CLASS : sc_unsigned_subref_r
01551 //
01552 //  Proxy class for sc_unsigned part selection (r-value only).
01553 // ----------------------------------------------------------------------------
01554 
01555 // reduce methods
01556 
01557 inline bool sc_unsigned_subref_r::and_reduce() const 
01558 {
01559    const sc_unsigned* target_p = m_obj_p;
01560    for ( int i = m_right; i <= m_left; i++ )
01561         if ( !target_p->test(i) ) return false;
01562    return true;
01563 }
01564 
01565 inline bool sc_unsigned_subref_r::nand_reduce() const
01566 { 
01567     return !and_reduce(); 
01568 }
01569 
01570 inline bool sc_unsigned_subref_r::or_reduce() const 
01571 {
01572    const sc_unsigned* target_p = m_obj_p;
01573    for ( int i = m_right; i <= m_left; i++ )
01574         if ( target_p->test(i) ) return true;
01575    return false;
01576 }
01577 
01578 inline bool sc_unsigned_subref_r::nor_reduce() const
01579 { 
01580     return !or_reduce(); 
01581 }
01582 
01583 inline bool sc_unsigned_subref_r::xor_reduce() const 
01584 {
01585    int                odd;
01586    const sc_unsigned* target_p = m_obj_p;
01587    odd = 0;
01588    for ( int i = m_right; i <= m_left; i++ )
01589         if ( target_p->test(i) ) odd = ~odd;
01590    return odd ? true : false;
01591 }
01592 
01593 inline bool sc_unsigned_subref_r::xnor_reduce() const
01594 { 
01595     return !xor_reduce(); 
01596 }
01597 
01598 
01599 inline
01600 ::std::ostream&
01601 operator << ( ::std::ostream& os, const sc_unsigned_subref_r& a )
01602 {
01603     a.print( os );
01604     return os;
01605 }
01606 
01607 
01608 // ----------------------------------------------------------------------------
01609 //  CLASS : sc_unsigned_subref
01610 //
01611 //  Proxy class for sc_unsigned part selection (r-value and l-value).
01612 // ----------------------------------------------------------------------------
01613 
01614 // assignment operators
01615 
01616 inline
01617 const sc_unsigned_subref&
01618 sc_unsigned_subref::operator = ( const char* a )
01619 {
01620     sc_unsigned aa( length() );
01621     return ( *this = aa = a );
01622 }
01623 
01624 
01625 inline
01626 ::std::istream&
01627 operator >> ( ::std::istream& is, sc_unsigned_subref& a )
01628 {
01629     a.scan( is );
01630     return is;
01631 }
01632 
01633 
01634 
01635 // ----------------------------------------------------------------------------
01636 //  CLASS : sc_unsigned
01637 //
01638 //  Arbitrary precision signed number.
01639 // ----------------------------------------------------------------------------
01640 
01641 template<class T> 
01642 sc_unsigned::sc_unsigned( const sc_generic_base<T>& v ) 
01643 {
01644     int nb = v->length();
01645     sgn = default_sign();
01646     if( nb > 0 ) {
01647         nbits = num_bits( nb );
01648     } else {
01649         char msg[BUFSIZ];
01650         sprintf( msg, 
01651                     "sc_unsigned( sc_generic_base<T> ) : nb = %d is not valid", nb);
01652         SC_REPORT_ERROR( sc_core::SC_ID_INIT_FAILED_, msg );
01653     }
01654     ndigits = DIV_CEIL(nbits);
01655 #   ifdef SC_MAX_NBITS
01656         test_bound(nb);
01657 #    else
01658         digit = new unsigned long[ndigits];
01659 #    endif
01660     makezero();
01661     v->to_sc_unsigned(*this);
01662 }
01663     
01664 
01665 inline
01666 ::std::ostream&
01667 operator << ( ::std::ostream& os, const sc_unsigned& a )
01668 {
01669     a.print( os );
01670     return os;
01671 }
01672 
01673 inline
01674 ::std::istream&
01675 operator >> ( ::std::istream& is, sc_unsigned& a )
01676 {
01677     a.scan( is );
01678     return is;
01679 }
01680 
01681 
01682 } // namespace sc_dt
01683 
01684 
01685 #endif

Generated on Wed Apr 25 13:53:27 2007 for SystemC by  doxygen 1.5.1