sc_bit.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_bit.h -- Bit class.
00021 
00022   Original Author: Stan Y. Liao, Synopsys, Inc.
00023 
00024  *****************************************************************************/
00025 
00026 /*****************************************************************************
00027 
00028   MODIFICATION LOG - modifiers, enter your name, affiliation, date and
00029   changes you are making here.
00030 
00031       Name, Affiliation, Date:
00032   Description of Modification:
00033 
00034  *****************************************************************************/
00035 
00036 #ifndef SC_BIT_H
00037 #define SC_BIT_H
00038 
00039 
00040 #include "sysc/datatypes/int/sc_nbdefs.h"
00041 #include "sysc/utils/sc_iostream.h"
00042 
00043 
00044 namespace sc_dt
00045 {
00046 
00047 // classes defined in this module
00048 class sc_bit;
00049 
00050 // forward class declarations
00051 class sc_logic;
00052 
00053 
00054 // ----------------------------------------------------------------------------
00055 //  CLASS : sc_bit
00056 //
00057 //  Bit class.
00058 //  Note: VSIA compatibility indicated.
00059 // ----------------------------------------------------------------------------
00060 
00061 class sc_bit
00062 {
00063     // support methods
00064 
00065     static void invalid_value( char );
00066     static void invalid_value( int );
00067 
00068     static bool to_value( char c )
00069         {
00070             if( c != '0' && c != '1' ) {
00071                 invalid_value( c );
00072             }
00073             return ( c == '0' ? false : true );
00074         }
00075 
00076     static bool to_value( int i )
00077         {
00078             if( i != 0 && i != 1 ) {
00079                 invalid_value( i );
00080             }
00081             return ( i == 0 ? false : true );
00082         }
00083 
00084 public:
00085 
00086     // constructors
00087     // MANDATORY
00088 
00089     sc_bit()
00090         : m_val( false )
00091         {}
00092 
00093     explicit sc_bit( uint64 a )
00094         : m_val( a )
00095         {}
00096 
00097     explicit sc_bit( bool a )
00098         : m_val( a )
00099         {}
00100 
00101     explicit sc_bit( int a )
00102         : m_val( to_value( a ) )
00103         {}
00104 
00105     explicit sc_bit( char a )
00106         : m_val( to_value( a ) )
00107         {}
00108 
00109     explicit sc_bit( const sc_logic& a );  // non-VSIA
00110 
00111 
00112     // copy constructor
00113     // MANDATORY
00114 
00115     sc_bit( const sc_bit& a )
00116         : m_val( a.m_val )
00117         {}
00118 
00119 
00120     // destructor
00121     // MANDATORY
00122 
00123     ~sc_bit()
00124         {}
00125 
00126 
00127     // assignment operators
00128     // MANDATORY
00129 
00130     sc_bit& operator = ( const sc_bit& b )
00131         { m_val = b.m_val; return *this; }
00132 
00133     sc_bit& operator = ( int64 b )
00134         { return ( *this = sc_bit( (int)b ) ); }
00135 
00136     sc_bit& operator = ( uint64 b )
00137         { return ( *this = sc_bit( (int)b ) ); }
00138 
00139     sc_bit& operator = ( long b )
00140         { return ( *this = sc_bit( (int)b ) ); }
00141 
00142     sc_bit& operator = ( unsigned long b )
00143         { return ( *this = sc_bit( (int)b ) ); }
00144 
00145     sc_bit& operator = ( int b )
00146         { return ( *this = sc_bit( b ) ); }
00147 
00148     sc_bit& operator = ( bool b )
00149         { return ( *this = sc_bit( b ) ); }
00150 
00151     sc_bit& operator = ( char b )
00152         { return ( *this = sc_bit( b ) ); }
00153 
00154     sc_bit& operator = ( const sc_logic& b );  // non-VSIA
00155 
00156 
00157     // bitwise assignment operators
00158 
00159     sc_bit& operator &= ( const sc_bit& b )
00160         { m_val = ( m_val && b.m_val ); return *this; }
00161 
00162     sc_bit& operator &= ( int b )
00163         { return ( *this &= sc_bit( b ) ); }
00164 
00165     sc_bit& operator &= ( bool b )
00166         { return ( *this &= sc_bit( b ) ); }
00167 
00168     sc_bit& operator &= ( char b )
00169         { return ( *this &= sc_bit( b ) ); }
00170 
00171 
00172     sc_bit& operator |= ( const sc_bit& b )
00173         { m_val = ( m_val || b.m_val ); return *this; }
00174 
00175     sc_bit& operator |= ( int b )
00176         { return ( *this |= sc_bit( b ) ); }
00177 
00178     sc_bit& operator |= ( bool b )
00179         { return ( *this |= sc_bit( b ) ); }
00180 
00181     sc_bit& operator |= ( char b )
00182         { return ( *this |= sc_bit( b ) ); }
00183 
00184 
00185     sc_bit& operator ^= ( const sc_bit& b )
00186         { m_val = ( m_val != b.m_val ); return *this; }
00187 
00188     sc_bit& operator ^= ( int b )
00189         { return ( *this ^= sc_bit( b ) ); }
00190 
00191     sc_bit& operator ^= ( bool b )
00192         { return ( *this ^= sc_bit( b ) ); }
00193 
00194     sc_bit& operator ^= ( char b )
00195         { return ( *this ^= sc_bit( b ) ); }
00196 
00197 
00198     // conversions
00199     // MANDATORY
00200 
00201     // implicit conversion to bool
00202 
00203     operator bool () const
00204         { return m_val; }
00205 
00206     bool operator ! () const  // non-VSIA
00207         { return ! m_val; }
00208 
00209 
00210     // explicit conversions
00211 
00212     bool to_bool() const  // non-VSIA
00213         { return m_val; }
00214 
00215     char to_char() const
00216         { return ( m_val ? '1' : '0' ); }
00217 
00218 
00219     // relational operators and functions
00220 
00221     // MANDATORY
00222 
00223     friend bool operator == ( const sc_bit& a, const sc_bit& b )
00224         { return ( a.m_val == b.m_val ); }
00225 
00226     friend bool operator == ( const sc_bit& a, int b )
00227         { return ( a == sc_bit( b ) ); }
00228 
00229     friend bool operator == ( const sc_bit& a, bool b )
00230         { return ( a == sc_bit( b ) ); }
00231 
00232     friend bool operator == ( const sc_bit& a, char b )
00233         { return ( a == sc_bit( b ) ); }
00234 
00235     friend bool operator == ( int a, const sc_bit& b )
00236         { return ( sc_bit( a ) == b ); }
00237 
00238     friend bool operator == ( bool a, const sc_bit& b )
00239         { return ( sc_bit( a ) == b ); }
00240 
00241     friend bool operator == ( char a, const sc_bit& b )
00242         { return ( sc_bit( a ) == b ); }
00243 
00244     // OPTIONAL
00245 
00246     friend bool equal( const sc_bit& a, const sc_bit& b )
00247         { return ( a == b ); }
00248 
00249     friend bool equal( const sc_bit& a, int b )
00250         { return ( a == b ); }
00251 
00252     friend bool equal( const sc_bit& a, bool b )
00253         { return ( a == b ); }
00254 
00255     friend bool equal( const sc_bit& a, char b )
00256         { return ( a == b ); }
00257 
00258     friend bool equal( int a, const sc_bit& b )
00259         { return ( a == b ); }
00260 
00261     friend bool equal( bool a, const sc_bit& b )
00262         { return ( a == b ); }
00263 
00264     friend bool equal( char a, const sc_bit& b )
00265         { return ( a == b ); }
00266 
00267     // MANDATORY
00268 
00269     friend bool operator != ( const sc_bit& a, const sc_bit& b )
00270         { return ( a.m_val != b.m_val ); }
00271 
00272     friend bool operator != ( const sc_bit& a, int b )
00273         { return ( a != sc_bit( b ) ); }
00274 
00275     friend bool operator != ( const sc_bit& a, bool b )
00276         { return ( a != sc_bit( b ) ); }
00277 
00278     friend bool operator != ( const sc_bit& a, char b )
00279         { return ( a != sc_bit( b ) ); }
00280 
00281     friend bool operator != ( int a, const sc_bit& b )
00282         { return ( sc_bit( a ) != b ); }
00283 
00284     friend bool operator != ( bool a, const sc_bit& b )
00285         { return ( sc_bit( a ) != b ); }
00286 
00287     friend bool operator != ( char a, const sc_bit& b )
00288         { return ( sc_bit( a ) != b ); }
00289 
00290     // OPTIONAL
00291 
00292     friend bool not_equal( const sc_bit& a, const sc_bit& b )
00293         { return ( a != b ); }
00294 
00295     friend bool not_equal( const sc_bit& a, int b )
00296         { return ( a != b ); }
00297 
00298     friend bool not_equal( const sc_bit& a, bool b )
00299         { return ( a != b ); }
00300 
00301     friend bool not_equal( const sc_bit& a, char b )
00302         { return ( a != b ); }
00303 
00304     friend bool not_equal( int a, const sc_bit& b )
00305         { return ( a != b ); }
00306 
00307     friend bool not_equal( bool a, const sc_bit& b )
00308         { return ( a != b ); }
00309 
00310     friend bool not_equal( char a, const sc_bit& b )
00311         { return ( a != b ); }
00312 
00313 
00314     // bitwise operators and functions
00315 
00316     // bitwise complement
00317 
00318     // MANDATORY
00319 
00320     friend const sc_bit operator ~ ( const sc_bit& a )
00321         { return sc_bit( ! a.m_val ); }
00322 
00323     // RECOMMENDED
00324 
00325     sc_bit& b_not()
00326         { m_val = ( ! m_val ); return *this; }
00327 
00328     // OPTIONAL
00329 
00330     friend const sc_bit b_not( const sc_bit& a )
00331         { return ( ~ a ); }
00332 
00333     // RECOMMENDED
00334 
00335     friend void b_not( sc_bit& r, const sc_bit& a )
00336         { r = ( ~ a ); }
00337 
00338 
00339     // bitwise or
00340 
00341     // MANDATORY
00342 
00343     friend const sc_bit operator | ( const sc_bit& a, const sc_bit& b )
00344         { return sc_bit( a.m_val || b.m_val ); }
00345 
00346     friend const sc_bit operator | ( const sc_bit& a, int b )
00347         { return ( a | sc_bit( b ) ); }
00348 
00349     friend const sc_bit operator | ( const sc_bit& a, bool b )
00350         { return ( a | sc_bit( b ) ); }
00351 
00352     friend const sc_bit operator | ( const sc_bit& a, char b )
00353         { return ( a | sc_bit( b ) ); }
00354 
00355     friend const sc_bit operator | ( int a, const sc_bit& b )
00356         { return ( sc_bit( a ) | b ); }
00357 
00358     friend const sc_bit operator | ( bool a, const sc_bit& b )
00359         { return ( sc_bit( a ) | b ); }
00360 
00361     friend const sc_bit operator | ( char a, const sc_bit& b )
00362         { return ( sc_bit( a ) | b ); }
00363 
00364     // OPTIONAL
00365 
00366     friend const sc_bit b_or( const sc_bit& a, const sc_bit& b )
00367         { return ( a | b ); }
00368 
00369     friend const sc_bit b_or( const sc_bit& a, int b )
00370         { return ( a | b ); }
00371 
00372     friend const sc_bit b_or( const sc_bit& a, bool b )
00373         { return ( a | b ); }
00374 
00375     friend const sc_bit b_or( const sc_bit& a, char b )
00376         { return ( a | b ); }
00377 
00378     friend const sc_bit b_or( int a, const sc_bit& b )
00379         { return ( a | b ); }
00380 
00381     friend const sc_bit b_or( bool a, const sc_bit& b )
00382         { return ( a | b ); }
00383 
00384     friend const sc_bit b_or( char a, const sc_bit& b )
00385         { return ( a | b ); }
00386 
00387     // RECOMMENDED
00388 
00389     friend void b_or( sc_bit& r, const sc_bit& a, const sc_bit& b )
00390         { r = ( a | b ); }
00391 
00392     friend void b_or( sc_bit& r, const sc_bit& a, int b )
00393         { r = ( a | b ); }
00394 
00395     friend void b_or( sc_bit& r, const sc_bit& a, bool b )
00396         { r = ( a | b ); }
00397 
00398     friend void b_or( sc_bit& r, const sc_bit& a, char b )
00399         { r = ( a | b ); }
00400 
00401     friend void b_or( sc_bit& r, int a, const sc_bit& b )
00402         { r = ( a | b ); }
00403 
00404     friend void b_or( sc_bit& r, bool a, const sc_bit& b )
00405         { r = ( a | b ); }
00406 
00407     friend void b_or( sc_bit& r, char a, const sc_bit& b )
00408         { r = ( a | b ); }
00409 
00410 
00411     // bitwise and
00412 
00413     // MANDATORY
00414 
00415     friend const sc_bit operator & ( const sc_bit& a, const sc_bit& b )
00416         { return sc_bit( a.m_val && b.m_val ); }
00417 
00418     friend const sc_bit operator & ( const sc_bit& a, int b )
00419         { return ( a & sc_bit( b ) ); }
00420 
00421     friend const sc_bit operator & ( const sc_bit& a, bool b )
00422         { return ( a & sc_bit( b ) ); }
00423 
00424     friend const sc_bit operator & ( const sc_bit& a, char b )
00425         { return ( a & sc_bit( b ) ); }
00426 
00427     friend const sc_bit operator & ( int a, const sc_bit& b )
00428         { return ( sc_bit( a ) & b ); }
00429 
00430     friend const sc_bit operator & ( bool a, const sc_bit& b )
00431         { return ( sc_bit( a ) & b ); }
00432 
00433     friend const sc_bit operator & ( char a, const sc_bit& b )
00434         { return ( sc_bit( a ) & b ); }
00435 
00436     // OPTIONAL
00437 
00438     friend const sc_bit b_and( const sc_bit& a, const sc_bit& b )
00439         { return ( a & b ); }
00440 
00441     friend const sc_bit b_and( const sc_bit& a, int b )
00442         { return ( a & b ); }
00443 
00444     friend const sc_bit b_and( const sc_bit& a, bool b )
00445         { return ( a & b ); }
00446 
00447     friend const sc_bit b_and( const sc_bit& a, char b )
00448         { return ( a & b ); }
00449 
00450     friend const sc_bit b_and( int a, const sc_bit& b )
00451         { return ( a & b ); }
00452 
00453     friend const sc_bit b_and( bool a, const sc_bit& b )
00454         { return ( a & b ); }
00455 
00456     friend const sc_bit b_and( char a, const sc_bit& b )
00457         { return ( a & b ); }
00458 
00459     // RECOMMENDED
00460 
00461     friend void b_and( sc_bit& r, const sc_bit& a, const sc_bit& b )
00462         { r = ( a & b ); }
00463 
00464     friend void b_and( sc_bit& r, const sc_bit& a, int b )
00465         { r = ( a & b ); }
00466 
00467     friend void b_and( sc_bit& r, const sc_bit& a, bool b )
00468         { r = ( a & b ); }
00469 
00470     friend void b_and( sc_bit& r, const sc_bit& a, char b )
00471         { r = ( a & b ); }
00472 
00473     friend void b_and( sc_bit& r, int a, const sc_bit& b )
00474         { r = ( a & b ); }
00475 
00476     friend void b_and( sc_bit& r, bool a, const sc_bit& b )
00477         { r = ( a & b ); }
00478 
00479     friend void b_and( sc_bit& r, char a, const sc_bit& b )
00480         { r = ( a & b ); }
00481 
00482 
00483     // bitwise exor
00484 
00485     // MANDATORY
00486 
00487     friend const sc_bit operator ^ ( const sc_bit& a, const sc_bit& b )
00488         { return sc_bit( a.m_val != b.m_val ); }
00489 
00490     friend const sc_bit operator ^ ( const sc_bit& a, int b )
00491         { return ( a ^ sc_bit( b ) ); }
00492 
00493     friend const sc_bit operator ^ ( const sc_bit& a, bool b )
00494         { return ( a ^ sc_bit( b ) ); }
00495 
00496     friend const sc_bit operator ^ ( const sc_bit& a, char b )
00497         { return ( a ^ sc_bit( b ) ); }
00498 
00499     friend const sc_bit operator ^ ( int a, const sc_bit& b )
00500         { return ( sc_bit( a ) ^ b ); }
00501 
00502     friend const sc_bit operator ^ ( bool a, const sc_bit& b )
00503         { return ( sc_bit( a ) ^ b ); }
00504 
00505     friend const sc_bit operator ^ ( char a, const sc_bit& b )
00506         { return ( sc_bit( a ) ^ b ); }
00507 
00508     // OPTIONAL
00509 
00510     friend const sc_bit b_xor( const sc_bit& a, const sc_bit& b )
00511         { return ( a ^ b ); }
00512 
00513     friend const sc_bit b_xor( const sc_bit& a, int b )
00514         { return ( a ^ b ); }
00515 
00516     friend const sc_bit b_xor( const sc_bit& a, bool b )
00517         { return ( a ^ b ); }
00518 
00519     friend const sc_bit b_xor( const sc_bit& a, char b )
00520         { return ( a ^ b ); }
00521 
00522     friend const sc_bit b_xor( int a, const sc_bit& b )
00523         { return ( a ^ b ); }
00524 
00525     friend const sc_bit b_xor( bool a, const sc_bit& b )
00526         { return ( a ^ b ); }
00527 
00528     friend const sc_bit b_xor( char a, const sc_bit& b )
00529         { return ( a ^ b ); }
00530 
00531     // RECOMMENDED
00532 
00533     friend void b_xor( sc_bit& r, const sc_bit& a, const sc_bit& b )
00534         { r = ( a ^ b ); }
00535 
00536     friend void b_xor( sc_bit& r, const sc_bit& a, int b )
00537         { r = ( a ^ b ); }
00538 
00539     friend void b_xor( sc_bit& r, const sc_bit& a, bool b )
00540         { r = ( a ^ b ); }
00541 
00542     friend void b_xor( sc_bit& r, const sc_bit& a, char b )
00543         { r = ( a ^ b ); }
00544 
00545     friend void b_xor( sc_bit& r, int a, const sc_bit& b )
00546         { r = ( a ^ b ); }
00547 
00548     friend void b_xor( sc_bit& r, bool a, const sc_bit& b )
00549         { r = ( a ^ b ); }
00550 
00551     friend void b_xor( sc_bit& r, char a, const sc_bit& b )
00552         { r = ( a ^ b ); }
00553 
00554 
00555     // other methods
00556 
00557     void print( ::std::ostream& os = ::std::cout ) const
00558         { os << to_bool(); }
00559 
00560     void scan( ::std::istream& = ::std::cin );
00561 
00562 private:
00563 
00564     bool m_val;
00565 };
00566 
00567 
00568 // ----------------------------------------------------------------------------
00569 
00570 inline
00571 ::std::ostream&
00572 operator << ( ::std::ostream& os, const sc_bit& a )
00573 {
00574     a.print( os );
00575     return os;
00576 }
00577 
00578 inline
00579 ::std::istream&
00580 operator >> ( ::std::istream& is, sc_bit& a )
00581 {
00582     a.scan( is );
00583     return is;
00584 }
00585 
00586 } // namespace sc_dt
00587 
00588 
00589 #endif
00590 
00591 // Taf!
Generated by
Matthieu Moy <Matthieu.Moy@st.com>
Back to Pinapa Home Page