Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

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

Generated on Fri Jan 14 08:28:59 2005 for SystemC2.1beta11(excludingMSLib)(IncludingSCV)\nProvidedby:www.openverificationfoundation.org by doxygen1.2.18