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 "sysc/datatypes/int/sc_nbdefs.h"
00041 #include "sysc/utils/sc_iostream.h"
00042
00043
00044 namespace sc_dt
00045 {
00046
00047
00048 class sc_bit;
00049
00050
00051 class sc_logic;
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 class sc_bit
00062 {
00063
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
00087
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 );
00110
00111
00112
00113
00114
00115 sc_bit( const sc_bit& a )
00116 : m_val( a.m_val )
00117 {}
00118
00119
00120
00121
00122
00123 ~sc_bit()
00124 {}
00125
00126
00127
00128
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 );
00155
00156
00157
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
00199
00200
00201
00202
00203 operator bool () const
00204 { return m_val; }
00205
00206 bool operator ! () const
00207 { return ! m_val; }
00208
00209
00210
00211
00212 bool to_bool() const
00213 { return m_val; }
00214
00215 char to_char() const
00216 { return ( m_val ? '1' : '0' ); }
00217
00218
00219
00220
00221
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
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
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
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
00315
00316
00317
00318
00319
00320 friend const sc_bit operator ~ ( const sc_bit& a )
00321 { return sc_bit( ! a.m_val ); }
00322
00323
00324
00325 sc_bit& b_not()
00326 { m_val = ( ! m_val ); return *this; }
00327
00328
00329
00330 friend const sc_bit b_not( const sc_bit& a )
00331 { return ( ~ a ); }
00332
00333
00334
00335 friend void b_not( sc_bit& r, const sc_bit& a )
00336 { r = ( ~ a ); }
00337
00338
00339
00340
00341
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
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
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
00412
00413
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
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
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
00484
00485
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
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
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
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 }
00587
00588
00589 #endif
00590
00591