00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
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
00047 class sc_bit;
00048
00049
00050 class sc_logic;
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 class sc_bit
00061 {
00062
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
00086
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 );
00109
00110
00111
00112
00113
00114 sc_bit( const sc_bit& a )
00115 : m_val( a.m_val )
00116 {}
00117
00118
00119
00120
00121
00122 ~sc_bit()
00123 {}
00124
00125
00126
00127
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 );
00154
00155
00156
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
00198
00199
00200
00201
00202 operator bool () const
00203 { return m_val; }
00204
00205 bool operator ! () const
00206 { return ! m_val; }
00207
00208
00209
00210
00211 bool to_bool() const
00212 { return m_val; }
00213
00214 char to_char() const
00215 { return ( m_val ? '1' : '0' ); }
00216
00217
00218
00219
00220
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
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
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
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
00314
00315
00316
00317
00318
00319 friend const sc_bit operator ~ ( const sc_bit& a )
00320 { return sc_bit( ! a.m_val ); }
00321
00322
00323
00324 sc_bit& b_not()
00325 { m_val = ( ! m_val ); return *this; }
00326
00327
00328
00329 friend const sc_bit b_not( const sc_bit& a )
00330 { return ( ~ a ); }
00331
00332
00333
00334 friend void b_not( sc_bit& r, const sc_bit& a )
00335 { r = ( ~ a ); }
00336
00337
00338
00339
00340
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
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
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
00411
00412
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
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
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
00483
00484
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
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
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
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 }
00586
00587
00588 #endif
00589
00590