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_PROXIES_H
00037 #define SC_BIT_PROXIES_H
00038
00039
00040 #include "sysc/datatypes/bit/sc_bit_ids.h"
00041 #include "sysc/datatypes/bit/sc_proxy.h"
00042
00043
00044 namespace sc_dt
00045 {
00046
00047
00048 template <class X> class sc_bitref_r;
00049 template <class X> class sc_bitref;
00050 template <class X> class sc_subref_r;
00051 template <class X> class sc_subref;
00052 template <class X, class Y> class sc_concref_r;
00053 template <class X, class Y> class sc_concref;
00054
00055
00056
00057
00058
00059
00060
00061
00062 template <class T>
00063 class sc_bitref_r
00064 {
00065 friend class sc_bv_base;
00066 friend class sc_lv_base;
00067
00068 public:
00069
00070
00071
00072 sc_bitref_r( const T& obj_, int index_ )
00073 : m_obj( CCAST<T&>( obj_ ) ), m_index( index_ )
00074 {}
00075
00076
00077
00078
00079 sc_bitref_r( const sc_bitref_r<T>& a )
00080 : m_obj( a.m_obj ), m_index( a.m_index )
00081 {}
00082
00083
00084
00085
00086 sc_bitref_r<T>* clone() const
00087 { return new sc_bitref_r<T>( *this ); }
00088
00089
00090
00091
00092
00093
00094 const sc_logic operator ~ () const
00095 { return sc_logic( sc_logic::not_table[value()] ); }
00096
00097
00098
00099
00100 operator const sc_logic() const
00101 { return sc_logic( m_obj.get_bit( m_index ) ); }
00102
00103
00104
00105
00106 sc_logic_value_t value() const
00107 { return m_obj.get_bit( m_index ); }
00108
00109
00110 bool is_01() const
00111 { return sc_logic( value() ).is_01(); }
00112
00113 bool to_bool() const
00114 { return sc_logic( value() ).to_bool(); }
00115
00116 char to_char() const
00117 { return sc_logic( value() ).to_char(); }
00118
00119
00120
00121
00122 int length() const
00123 { return 1; }
00124
00125 int size() const
00126 { return ( (length() - 1) / UL_SIZE + 1 ); }
00127
00128 sc_logic_value_t get_bit( int n ) const;
00129
00130 unsigned long get_word( int i ) const;
00131 unsigned long get_cword( int i ) const;
00132
00133
00134
00135
00136 void print( ::std::ostream& os = ::std::cout ) const
00137 { os << to_char(); }
00138
00139 protected:
00140
00141 T& m_obj;
00142 int m_index;
00143
00144 private:
00145
00146
00147 sc_bitref_r();
00148 sc_bitref_r<T>& operator = ( const sc_bitref_r<T>& );
00149 };
00150
00151
00152
00153
00154
00155
00156 template <class T1, class T2>
00157 inline
00158 const sc_logic
00159 operator & ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );
00160
00161
00162
00163
00164 template <class T1, class T2>
00165 inline
00166 const sc_logic
00167 operator | ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );
00168
00169
00170
00171
00172 template <class T1, class T2>
00173 inline
00174 const sc_logic
00175 operator ^ ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );
00176
00177
00178
00179
00180 template <class T1, class T2>
00181 inline
00182 bool
00183 operator == ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );
00184
00185 template <class T1, class T2>
00186 inline
00187 bool
00188 operator != ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );
00189
00190
00191
00192
00193 template <class T1, class T2>
00194 inline
00195 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
00196 operator , ( sc_bitref_r<T1>, sc_bitref_r<T2> );
00197
00198 template <class T1, class T2>
00199 inline
00200 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
00201 operator , ( sc_bitref_r<T1>, sc_subref_r<T2> );
00202
00203 template <class T1, class T2, class T3>
00204 inline
00205 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
00206 operator , ( sc_bitref_r<T1>, sc_concref_r<T2,T3> );
00207
00208 template <class T1, class T2>
00209 inline
00210 sc_concref_r<sc_bitref_r<T1>,T2>
00211 operator , ( sc_bitref_r<T1>, const sc_proxy<T2>& );
00212
00213 template <class T>
00214 inline
00215 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00216 operator , ( sc_bitref_r<T>, const char* );
00217
00218 template <class T>
00219 inline
00220 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00221 operator , ( const char*, sc_bitref_r<T> );
00222
00223 template <class T>
00224 inline
00225 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00226 operator , ( sc_bitref_r<T>, const sc_logic& );
00227
00228 template <class T>
00229 inline
00230 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00231 operator , ( const sc_logic&, sc_bitref_r<T> );
00232
00233 template <class T>
00234 inline
00235 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00236 operator , ( sc_bitref_r<T>, bool );
00237
00238 template <class T>
00239 inline
00240 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00241 operator , ( bool, sc_bitref_r<T> );
00242
00243
00244 template <class T1, class T2>
00245 inline
00246 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
00247 concat( sc_bitref_r<T1>, sc_bitref_r<T2> );
00248
00249 template <class T1, class T2>
00250 inline
00251 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
00252 concat( sc_bitref_r<T1>, sc_subref_r<T2> );
00253
00254 template <class T1, class T2, class T3>
00255 inline
00256 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
00257 concat( sc_bitref_r<T1>, sc_concref_r<T2,T3> );
00258
00259 template <class T1, class T2>
00260 inline
00261 sc_concref_r<sc_bitref_r<T1>,T2>
00262 concat( sc_bitref_r<T1>, const sc_proxy<T2>& );
00263
00264 template <class T>
00265 inline
00266 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00267 concat( sc_bitref_r<T>, const char* );
00268
00269 template <class T>
00270 inline
00271 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00272 concat( const char*, sc_bitref_r<T> );
00273
00274 template <class T>
00275 inline
00276 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00277 concat( sc_bitref_r<T>, const sc_logic& );
00278
00279 template <class T>
00280 inline
00281 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00282 concat( const sc_logic&, sc_bitref_r<T> );
00283
00284 template <class T>
00285 inline
00286 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00287 concat( sc_bitref_r<T>, bool );
00288
00289 template <class T>
00290 inline
00291 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00292 concat( bool, sc_bitref_r<T> );
00293
00294
00295 #ifdef SC_DT_MIXED_COMMA_OPERATORS
00296
00297 template <class T1, class T2>
00298 inline
00299 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
00300 operator , ( sc_bitref_r<T1>, sc_bitref<T2> );
00301
00302 template <class T1, class T2>
00303 inline
00304 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
00305 operator , ( sc_bitref<T1>, sc_bitref_r<T2> );
00306
00307 template <class T1, class T2>
00308 inline
00309 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
00310 operator , ( sc_bitref_r<T1>, sc_subref<T2> );
00311
00312 template <class T1, class T2>
00313 inline
00314 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
00315 operator , ( sc_bitref<T1>, sc_subref_r<T2> );
00316
00317 template <class T1, class T2, class T3>
00318 inline
00319 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
00320 operator , ( sc_bitref_r<T1>, sc_concref<T2,T3> );
00321
00322 template <class T1, class T2, class T3>
00323 inline
00324 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
00325 operator , ( sc_bitref<T1>, sc_concref_r<T2,T3> );
00326
00327 template <class T1, class T2>
00328 inline
00329 sc_concref_r<sc_bitref_r<T1>,T2>
00330 operator , ( sc_bitref<T1>, const sc_proxy<T2>& );
00331
00332 template <class T1, class T2>
00333 inline
00334 sc_concref_r<sc_bitref_r<T1>,T2>
00335 operator , ( sc_bitref_r<T1>, sc_proxy<T2>& );
00336
00337 template <class T>
00338 inline
00339 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00340 operator , ( sc_bitref<T>, const char* );
00341
00342 template <class T>
00343 inline
00344 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00345 operator , ( const char*, sc_bitref<T> );
00346
00347 template <class T>
00348 inline
00349 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00350 operator , ( sc_bitref<T>, const sc_logic& );
00351
00352 template <class T>
00353 inline
00354 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00355 operator , ( const sc_logic&, sc_bitref<T> );
00356
00357 template <class T>
00358 inline
00359 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00360 operator , ( sc_bitref<T>, bool );
00361
00362 template <class T>
00363 inline
00364 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00365 operator , ( bool, sc_bitref<T> );
00366
00367
00368 template <class T1, class T2>
00369 inline
00370 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
00371 concat( sc_bitref_r<T1>, sc_bitref<T2> );
00372
00373 template <class T1, class T2>
00374 inline
00375 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
00376 concat( sc_bitref<T1>, sc_bitref_r<T2> );
00377
00378 template <class T1, class T2>
00379 inline
00380 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
00381 concat( sc_bitref_r<T1>, sc_subref<T2> );
00382
00383 template <class T1, class T2>
00384 inline
00385 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
00386 concat( sc_bitref<T1>, sc_subref_r<T2> );
00387
00388 template <class T1, class T2, class T3>
00389 inline
00390 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
00391 concat( sc_bitref_r<T1>, sc_concref<T2,T3> );
00392
00393 template <class T1, class T2, class T3>
00394 inline
00395 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
00396 concat( sc_bitref<T1>, sc_concref_r<T2,T3> );
00397
00398 template <class T1, class T2>
00399 inline
00400 sc_concref_r<sc_bitref_r<T1>,T2>
00401 concat( sc_bitref<T1>, const sc_proxy<T2>& );
00402
00403 template <class T1, class T2>
00404 inline
00405 sc_concref_r<sc_bitref_r<T1>,T2>
00406 concat( sc_bitref_r<T1>, sc_proxy<T2>& );
00407
00408 template <class T>
00409 inline
00410 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00411 concat( sc_bitref<T>, const char* );
00412
00413 template <class T>
00414 inline
00415 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00416 concat( const char*, sc_bitref<T> );
00417
00418 template <class T>
00419 inline
00420 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00421 concat( sc_bitref<T>, const sc_logic& );
00422
00423 template <class T>
00424 inline
00425 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00426 concat( const sc_logic&, sc_bitref<T> );
00427
00428 template <class T>
00429 inline
00430 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00431 concat( sc_bitref<T>, bool );
00432
00433 template <class T>
00434 inline
00435 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00436 concat( bool, sc_bitref<T> );
00437
00438 #endif
00439
00440
00441
00442
00443
00444
00445
00446
00447 template <class X>
00448 class sc_bitref
00449 : public sc_bitref_r<X>
00450 {
00451 friend class sc_bv_base;
00452 friend class sc_lv_base;
00453
00454 public:
00455
00456
00457
00458 sc_bitref( X& obj_, int index_ )
00459 : sc_bitref_r<X>( obj_, index_ )
00460 {}
00461
00462
00463
00464
00465 sc_bitref( const sc_bitref<X>& a )
00466 : sc_bitref_r<X>( a )
00467 {}
00468
00469
00470
00471
00472 sc_bitref<X>* clone() const
00473 { return new sc_bitref<X>( *this ); }
00474
00475
00476
00477
00478 sc_bitref<X>& operator = ( const sc_bitref_r<X>& a );
00479 sc_bitref<X>& operator = ( const sc_bitref<X>& a );
00480
00481 sc_bitref<X>& operator = ( const sc_logic& a )
00482 { this->m_obj.set_bit( this->m_index, a.value() ); return *this; }
00483
00484 sc_bitref<X>& operator = ( sc_logic_value_t v )
00485 { *this = sc_logic( v ); return *this; }
00486
00487 sc_bitref<X>& operator = ( bool a )
00488 { *this = sc_logic( a ); return *this; }
00489
00490 sc_bitref<X>& operator = ( char a )
00491 { *this = sc_logic( a ); return *this; }
00492
00493 sc_bitref<X>& operator = ( int a )
00494 { *this = sc_logic( a ); return *this; }
00495
00496 sc_bitref<X>& operator = ( const sc_bit& a )
00497 { *this = sc_logic( a ); return *this; }
00498
00499
00500
00501
00502 sc_bitref<X>& operator &= ( const sc_bitref_r<X>& a );
00503 sc_bitref<X>& operator &= ( const sc_logic& a );
00504
00505 sc_bitref<X>& operator &= ( sc_logic_value_t v )
00506 { *this &= sc_logic( v ); return *this; }
00507
00508 sc_bitref<X>& operator &= ( bool a )
00509 { *this &= sc_logic( a ); return *this; }
00510
00511 sc_bitref<X>& operator &= ( char a )
00512 { *this &= sc_logic( a ); return *this; }
00513
00514 sc_bitref<X>& operator &= ( int a )
00515 { *this &= sc_logic( a ); return *this; }
00516
00517
00518 sc_bitref<X>& operator |= ( const sc_bitref_r<X>& a );
00519 sc_bitref<X>& operator |= ( const sc_logic& a );
00520
00521 sc_bitref<X>& operator |= ( sc_logic_value_t v )
00522 { *this |= sc_logic( v ); return *this; }
00523
00524 sc_bitref<X>& operator |= ( bool a )
00525 { *this |= sc_logic( a ); return *this; }
00526
00527 sc_bitref<X>& operator |= ( char a )
00528 { *this |= sc_logic( a ); return *this; }
00529
00530 sc_bitref<X>& operator |= ( int a )
00531 { *this |= sc_logic( a ); return *this; }
00532
00533
00534 sc_bitref<X>& operator ^= ( const sc_bitref_r<X>& a );
00535 sc_bitref<X>& operator ^= ( const sc_logic& a );
00536
00537 sc_bitref<X>& operator ^= ( sc_logic_value_t v )
00538 { *this ^= sc_logic( v ); return *this; }
00539
00540 sc_bitref<X>& operator ^= ( bool a )
00541 { *this ^= sc_logic( a ); return *this; }
00542
00543 sc_bitref<X>& operator ^= ( char a )
00544 { *this ^= sc_logic( a ); return *this; }
00545
00546 sc_bitref<X>& operator ^= ( int a )
00547 { *this ^= sc_logic( a ); return *this; }
00548
00549
00550
00551
00552
00553
00554 sc_bitref<X>& b_not();
00555
00556
00557
00558
00559 void set_bit( int n, sc_logic_value_t value );
00560
00561 void set_word( int i, unsigned long w );
00562 void set_cword( int i, unsigned long w );
00563
00564 void clean_tail()
00565 { this->m_obj.clean_tail(); }
00566
00567
00568
00569
00570 void scan( ::std::istream& is = ::std::cin );
00571
00572 private:
00573
00574
00575 sc_bitref();
00576 };
00577
00578
00579
00580
00581 template <class T1, class T2>
00582 inline
00583 sc_concref<sc_bitref<T1>,sc_bitref<T2> >
00584 operator , ( sc_bitref<T1>, sc_bitref<T2> );
00585
00586 template <class T1, class T2>
00587 inline
00588 sc_concref<sc_bitref<T1>,sc_subref<T2> >
00589 operator , ( sc_bitref<T1>, sc_subref<T2> );
00590
00591 template <class T1, class T2, class T3>
00592 inline
00593 sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >
00594 operator , ( sc_bitref<T1>, sc_concref<T2,T3> );
00595
00596 template <class T1, class T2>
00597 inline
00598 sc_concref<sc_bitref<T1>,T2>
00599 operator , ( sc_bitref<T1>, sc_proxy<T2>& );
00600
00601
00602 template <class T1, class T2>
00603 inline
00604 sc_concref<sc_bitref<T1>,sc_bitref<T2> >
00605 concat( sc_bitref<T1>, sc_bitref<T2> );
00606
00607 template <class T1, class T2>
00608 inline
00609 sc_concref<sc_bitref<T1>,sc_subref<T2> >
00610 concat( sc_bitref<T1>, sc_subref<T2> );
00611
00612 template <class T1, class T2, class T3>
00613 inline
00614 sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >
00615 concat( sc_bitref<T1>, sc_concref<T2,T3> );
00616
00617 template <class T1, class T2>
00618 inline
00619 sc_concref<sc_bitref<T1>,T2>
00620 concat( sc_bitref<T1>, sc_proxy<T2>& );
00621
00622
00623 template <class T>
00624 ::std::istream&
00625 operator >> ( ::std::istream&, sc_bitref<T> );
00626
00627
00628
00629
00630
00631
00632
00633
00634 template <class X>
00635 class sc_subref_r
00636 : public sc_proxy<sc_subref_r<X> >
00637 {
00638 void check_bounds();
00639
00640 public:
00641
00642
00643
00644 sc_subref_r( const X& obj_, int hi_, int lo_ )
00645 : m_obj( CCAST<X&>( obj_ ) ), m_hi( hi_ ), m_lo( lo_ ), m_len( 0 )
00646 { check_bounds(); }
00647
00648
00649
00650
00651 sc_subref_r( const sc_subref_r<X>& a )
00652 : m_obj( a.m_obj ), m_hi( a.m_hi ), m_lo( a.m_lo ), m_len( a.m_len )
00653 {}
00654
00655
00656
00657
00658 sc_subref_r<X>* clone() const
00659 { return new sc_subref_r<X>( *this ); }
00660
00661
00662
00663
00664 int length() const
00665 { return m_len; }
00666
00667 int size() const
00668 { return ( (length() - 1) / UL_SIZE + 1 ); }
00669
00670 sc_logic_value_t get_bit( int n ) const;
00671 void set_bit( int n, sc_logic_value_t value );
00672
00673 unsigned long get_word( int i )const;
00674 void set_word( int i, unsigned long w );
00675
00676 unsigned long get_cword( int i ) const;
00677 void set_cword( int i, unsigned long w );
00678
00679 void clean_tail()
00680 { m_obj.clean_tail(); }
00681
00682
00683
00684
00685 bool is_01() const;
00686
00687 bool reversed() const
00688 { return m_lo > m_hi; }
00689
00690 protected:
00691
00692 mutable X& m_obj;
00693 int m_hi;
00694 int m_lo;
00695 int m_len;
00696
00697 private:
00698
00699
00700 sc_subref_r();
00701 sc_subref_r<X>& operator = ( const sc_subref_r<X>& );
00702 };
00703
00704
00705
00706
00707 template <class T1, class T2>
00708 inline
00709 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
00710 operator , ( sc_subref_r<T1>, sc_bitref_r<T2> );
00711
00712 template <class T1, class T2>
00713 inline
00714 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
00715 operator , ( sc_subref_r<T1>, sc_subref_r<T2> );
00716
00717 template <class T1, class T2, class T3>
00718 inline
00719 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
00720 operator , ( sc_subref_r<T1>, sc_concref_r<T2,T3> );
00721
00722 template <class T1, class T2>
00723 inline
00724 sc_concref_r<sc_subref_r<T1>,T2>
00725 operator , ( sc_subref_r<T1>, const sc_proxy<T2>& );
00726
00727 template <class T>
00728 inline
00729 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00730 operator , ( sc_subref_r<T>, const char* );
00731
00732 template <class T>
00733 inline
00734 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00735 operator , ( const char*, sc_subref_r<T> );
00736
00737 template <class T>
00738 inline
00739 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00740 operator , ( sc_subref_r<T>, const sc_logic& );
00741
00742 template <class T>
00743 inline
00744 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00745 operator , ( const sc_logic&, sc_subref_r<T> );
00746
00747 template <class T>
00748 inline
00749 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00750 operator , ( sc_subref_r<T>, bool );
00751
00752 template <class T>
00753 inline
00754 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00755 operator , ( bool, sc_subref_r<T> );
00756
00757
00758 template <class T1, class T2>
00759 inline
00760 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
00761 concat( sc_subref_r<T1>, sc_bitref_r<T2> );
00762
00763 template <class T1, class T2>
00764 inline
00765 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
00766 concat( sc_subref_r<T1>, sc_subref_r<T2> );
00767
00768 template <class T1, class T2, class T3>
00769 inline
00770 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
00771 concat( sc_subref_r<T1>, sc_concref_r<T2,T3> );
00772
00773 template <class T1, class T2>
00774 inline
00775 sc_concref_r<sc_subref_r<T1>,T2>
00776 concat( sc_subref_r<T1>, const sc_proxy<T2>& );
00777
00778 template <class T>
00779 inline
00780 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00781 concat( sc_subref_r<T>, const char* );
00782
00783 template <class T>
00784 inline
00785 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00786 concat( const char*, sc_subref_r<T> );
00787
00788 template <class T>
00789 inline
00790 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00791 concat( sc_subref_r<T>, const sc_logic& );
00792
00793 template <class T>
00794 inline
00795 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00796 concat( const sc_logic&, sc_subref_r<T> );
00797
00798 template <class T>
00799 inline
00800 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00801 concat( sc_subref_r<T>, bool );
00802
00803 template <class T>
00804 inline
00805 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00806 concat( bool, sc_subref_r<T> );
00807
00808
00809 #ifdef SC_DT_MIXED_COMMA_OPERATORS
00810
00811 template <class T1, class T2>
00812 inline
00813 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
00814 operator , ( sc_subref_r<T1>, sc_bitref<T2> );
00815
00816 template <class T1, class T2>
00817 inline
00818 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
00819 operator , ( sc_subref<T1>, sc_bitref_r<T2> );
00820
00821 template <class T1, class T2>
00822 inline
00823 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
00824 operator , ( sc_subref_r<T1>, sc_subref<T2> );
00825
00826 template <class T1, class T2>
00827 inline
00828 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
00829 operator , ( sc_subref<T1>, sc_subref_r<T2> );
00830
00831 template <class T1, class T2, class T3>
00832 inline
00833 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
00834 operator , ( sc_subref_r<T1>, sc_concref<T2,T3> );
00835
00836 template <class T1, class T2, class T3>
00837 inline
00838 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
00839 operator , ( sc_subref<T1>, sc_concref_r<T2,T3> );
00840
00841 template <class T1, class T2>
00842 inline
00843 sc_concref_r<sc_subref_r<T1>,T2>
00844 operator , ( sc_subref<T1>, const sc_proxy<T2>& );
00845
00846 template <class T1, class T2>
00847 inline
00848 sc_concref_r<sc_subref_r<T1>,T2>
00849 operator , ( sc_subref_r<T1>, sc_proxy<T2>& );
00850
00851 template <class T>
00852 inline
00853 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00854 operator , ( sc_subref<T>, const char* );
00855
00856 template <class T>
00857 inline
00858 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00859 operator , ( const char*, sc_subref<T> );
00860
00861 template <class T>
00862 inline
00863 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00864 operator , ( sc_subref<T>, const sc_logic& );
00865
00866 template <class T>
00867 inline
00868 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00869 operator , ( const sc_logic&, sc_subref<T> );
00870
00871 template <class T>
00872 inline
00873 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00874 operator , ( sc_subref<T>, bool );
00875
00876 template <class T>
00877 inline
00878 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00879 operator , ( bool, sc_subref<T> );
00880
00881
00882 template <class T1, class T2>
00883 inline
00884 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
00885 concat( sc_subref_r<T1>, sc_bitref<T2> );
00886
00887 template <class T1, class T2>
00888 inline
00889 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
00890 concat( sc_subref<T1>, sc_bitref_r<T2> );
00891
00892 template <class T1, class T2>
00893 inline
00894 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
00895 concat( sc_subref_r<T1>, sc_subref<T2> );
00896
00897 template <class T1, class T2>
00898 inline
00899 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
00900 concat( sc_subref<T1>, sc_subref_r<T2> );
00901
00902 template <class T1, class T2, class T3>
00903 inline
00904 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
00905 concat( sc_subref_r<T1>, sc_concref<T2,T3> );
00906
00907 template <class T1, class T2, class T3>
00908 inline
00909 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
00910 concat( sc_subref<T1>, sc_concref_r<T2,T3> );
00911
00912 template <class T1, class T2>
00913 inline
00914 sc_concref_r<sc_subref_r<T1>,T2>
00915 concat( sc_subref<T1>, const sc_proxy<T2>& );
00916
00917 template <class T1, class T2>
00918 inline
00919 sc_concref_r<sc_subref_r<T1>,T2>
00920 concat( sc_subref_r<T1>, sc_proxy<T2>& );
00921
00922 template <class T>
00923 inline
00924 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00925 concat( sc_subref<T>, const char* );
00926
00927 template <class T>
00928 inline
00929 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00930 concat( const char*, sc_subref<T> );
00931
00932 template <class T>
00933 inline
00934 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00935 concat( sc_subref<T>, const sc_logic& );
00936
00937 template <class T>
00938 inline
00939 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00940 concat( const sc_logic&, sc_subref<T> );
00941
00942 template <class T>
00943 inline
00944 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00945 concat( sc_subref<T>, bool );
00946
00947 template <class T>
00948 inline
00949 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00950 concat( bool, sc_subref<T> );
00951
00952 #endif
00953
00954
00955
00956
00957
00958
00959
00960
00961 template <class X>
00962 class sc_subref
00963 : public sc_subref_r<X>
00964 {
00965 public:
00966
00967
00968
00969 typedef sc_subref_r<X> base_type;
00970
00971
00972
00973
00974 sc_subref( X& obj_, int hi_, int lo_ )
00975 : sc_subref_r<X>( obj_, hi_, lo_ )
00976 {}
00977
00978
00979
00980
00981 sc_subref( const sc_subref<X>& a )
00982 : sc_subref_r<X>( a )
00983 {}
00984
00985
00986
00987
00988 sc_subref<X>* clone() const
00989 { return new sc_subref<X>( *this ); }
00990
00991
00992
00993
00994 template <class Y>
00995 sc_subref<X>& operator = ( const sc_proxy<Y>& a )
00996 { base_type::assign_( a ); return *this; }
00997
00998 sc_subref<X>& operator = ( const sc_subref_r<X>& a );
00999 sc_subref<X>& operator = ( const sc_subref<X>& a );
01000
01001 sc_subref<X>& operator = ( const char* a )
01002 { base_type::assign_( a ); return *this; }
01003
01004 sc_subref<X>& operator = ( const bool* a )
01005 { base_type::assign_( a ); return *this; }
01006
01007 sc_subref<X>& operator = ( const sc_logic* a )
01008 { base_type::assign_( a ); return *this; }
01009
01010 sc_subref<X>& operator = ( const sc_unsigned& a )
01011 { base_type::assign_( a ); return *this; }
01012
01013 sc_subref<X>& operator = ( const sc_signed& a )
01014 { base_type::assign_( a ); return *this; }
01015
01016 sc_subref<X>& operator = ( const sc_uint_base& a )
01017 { base_type::assign_( a ); return *this; }
01018
01019 sc_subref<X>& operator = ( const sc_int_base& a )
01020 { base_type::assign_( a ); return *this; }
01021
01022 sc_subref<X>& operator = ( unsigned long a )
01023 { base_type::assign_( a ); return *this; }
01024
01025 sc_subref<X>& operator = ( long a )
01026 { base_type::assign_( a ); return *this; }
01027
01028 sc_subref<X>& operator = ( unsigned int a )
01029 { base_type::assign_( a ); return *this; }
01030
01031 sc_subref<X>& operator = ( int a )
01032 { base_type::assign_( a ); return *this; }
01033
01034 sc_subref<X>& operator = ( uint64 a )
01035 { base_type::assign_( a ); return *this; }
01036
01037 sc_subref<X>& operator = ( int64 a )
01038 { base_type::assign_( a ); return *this; }
01039
01040
01041
01042
01043 void scan( ::std::istream& = ::std::cin );
01044
01045 private:
01046
01047
01048 sc_subref();
01049 };
01050
01051
01052
01053
01054 template <class T1, class T2>
01055 inline
01056 sc_concref<sc_subref<T1>,sc_bitref<T2> >
01057 operator , ( sc_subref<T1>, sc_bitref<T2> );
01058
01059 template <class T1, class T2>
01060 inline
01061 sc_concref<sc_subref<T1>,sc_subref<T2> >
01062 operator , ( sc_subref<T1>, sc_subref<T2> );
01063
01064 template <class T1, class T2, class T3>
01065 inline
01066 sc_concref<sc_subref<T1>,sc_concref<T2,T3> >
01067 operator , ( sc_subref<T1>, sc_concref<T2,T3> );
01068
01069 template <class T1, class T2>
01070 inline
01071 sc_concref<sc_subref<T1>,T2>
01072 operator , ( sc_subref<T1>, sc_proxy<T2>& );
01073
01074
01075 template <class T1, class T2>
01076 inline
01077 sc_concref<sc_subref<T1>,sc_bitref<T2> >
01078 concat( sc_subref<T1>, sc_bitref<T2> );
01079
01080 template <class T1, class T2>
01081 inline
01082 sc_concref<sc_subref<T1>,sc_subref<T2> >
01083 concat( sc_subref<T1>, sc_subref<T2> );
01084
01085 template <class T1, class T2, class T3>
01086 inline
01087 sc_concref<sc_subref<T1>,sc_concref<T2,T3> >
01088 concat( sc_subref<T1>, sc_concref<T2,T3> );
01089
01090 template <class T1, class T2>
01091 inline
01092 sc_concref<sc_subref<T1>,T2>
01093 concat( sc_subref<T1>, sc_proxy<T2>& );
01094
01095
01096 template <class T>
01097 inline
01098 ::std::istream&
01099 operator >> ( ::std::istream&, sc_subref<T> );
01100
01101
01102
01103
01104
01105
01106
01107
01108 template <class X, class Y>
01109 class sc_concref_r
01110 : public sc_proxy<sc_concref_r<X,Y> >
01111 {
01112 public:
01113
01114
01115
01116 sc_concref_r( const X& left_, const Y& right_, int delete_ = 0 )
01117 : m_left( CCAST<X&>( left_ ) ), m_right( CCAST<Y&>( right_ ) ),
01118 m_delete( delete_ ), m_refs( *new int( 1 ) )
01119 {}
01120
01121
01122
01123
01124 sc_concref_r( const sc_concref_r<X,Y>& a )
01125 : m_left( a.m_left ), m_right( a.m_right ),
01126 m_delete( a.m_delete ), m_refs( a.m_refs )
01127 { ++ m_refs; }
01128
01129
01130
01131
01132 virtual ~sc_concref_r();
01133
01134
01135
01136
01137 sc_concref_r<X,Y>* clone() const
01138 { return new sc_concref_r<X,Y>( *this ); }
01139
01140
01141
01142
01143 int length() const
01144 { return ( m_left.length() + m_right.length() ); }
01145
01146 int size() const
01147 { return ( (length() - 1) / UL_SIZE + 1 ); }
01148
01149 sc_logic_value_t get_bit( int n ) const;
01150 void set_bit( int n, sc_logic_value_t value );
01151
01152 unsigned long get_word( int i ) const;
01153 void set_word( int i, unsigned long w );
01154
01155 unsigned long get_cword( int i ) const;
01156 void set_cword( int i, unsigned long w );
01157
01158 void clean_tail()
01159 { m_left.clean_tail(); m_right.clean_tail(); }
01160
01161
01162
01163
01164 bool is_01() const
01165 { return ( m_left.is_01() && m_right.is_01() ); }
01166
01167 protected:
01168
01169 mutable X& m_left;
01170 mutable Y& m_right;
01171 mutable int m_delete;
01172 mutable int& m_refs;
01173
01174 private:
01175
01176
01177 sc_concref_r();
01178 sc_concref_r<X,Y>& operator = ( const sc_concref_r<X,Y>& );
01179 };
01180
01181
01182
01183
01184 template <class T1, class T2, class T3>
01185 inline
01186 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
01187 operator , ( sc_concref_r<T1,T2>, sc_bitref_r<T3> );
01188
01189 template <class T1, class T2, class T3>
01190 inline
01191 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
01192 operator , ( sc_concref_r<T1,T2>, sc_subref_r<T3> );
01193
01194 template <class T1, class T2, class T3, class T4>
01195 inline
01196 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
01197 operator , ( sc_concref_r<T1,T2>, sc_concref_r<T3,T4> );
01198
01199 template <class T1, class T2, class T3>
01200 inline
01201 sc_concref_r<sc_concref_r<T1,T2>,T3>
01202 operator , ( sc_concref_r<T1,T2>, const sc_proxy<T3>& );
01203
01204 template <class T1, class T2>
01205 inline
01206 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01207 operator , ( sc_concref_r<T1,T2>, const char* );
01208
01209 template <class T1, class T2>
01210 inline
01211 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01212 operator , ( const char*, sc_concref_r<T1,T2> );
01213
01214 template <class T1, class T2>
01215 inline
01216 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01217 operator , ( sc_concref_r<T1,T2>, const sc_logic& );
01218
01219 template <class T1, class T2>
01220 inline
01221 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01222 operator , ( const sc_logic&, sc_concref_r<T1,T2> );
01223
01224 template <class T1, class T2>
01225 inline
01226 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01227 operator , ( sc_concref_r<T1,T2>, bool );
01228
01229 template <class T1, class T2>
01230 inline
01231 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01232 operator , ( bool, sc_concref_r<T1,T2> );
01233
01234
01235 template <class T1, class T2, class T3>
01236 inline
01237 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
01238 concat( sc_concref_r<T1,T2>, sc_bitref_r<T3> );
01239
01240 template <class T1, class T2, class T3>
01241 inline
01242 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
01243 concat( sc_concref_r<T1,T2>, sc_subref_r<T3> );
01244
01245 template <class T1, class T2, class T3, class T4>
01246 inline
01247 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
01248 concat( sc_concref_r<T1,T2>, sc_concref_r<T3,T4> );
01249
01250 template <class T1, class T2, class T3>
01251 inline
01252 sc_concref_r<sc_concref_r<T1,T2>,T3>
01253 concat( sc_concref_r<T1,T2>, const sc_proxy<T3>& );
01254
01255 template <class T1, class T2>
01256 inline
01257 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01258 concat( sc_concref_r<T1,T2>, const char* );
01259
01260 template <class T1, class T2>
01261 inline
01262 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01263 concat( const char*, sc_concref_r<T1,T2> );
01264
01265 template <class T1, class T2>
01266 inline
01267 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01268 concat( sc_concref_r<T1,T2>, const sc_logic& );
01269
01270 template <class T1, class T2>
01271 inline
01272 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01273 concat( const sc_logic&, sc_concref_r<T1,T2> );
01274
01275 template <class T1, class T2>
01276 inline
01277 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01278 concat( sc_concref_r<T1,T2>, bool );
01279
01280 template <class T1, class T2>
01281 inline
01282 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01283 concat( bool, sc_concref_r<T1,T2> );
01284
01285
01286 #ifdef SC_DT_MIXED_COMMA_OPERATORS
01287
01288 template <class T1, class T2, class T3>
01289 inline
01290 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
01291 operator , ( sc_concref_r<T1,T2>, sc_bitref<T3> );
01292
01293 template <class T1, class T2, class T3>
01294 inline
01295 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
01296 operator , ( sc_concref<T1,T2>, sc_bitref_r<T3> );
01297
01298 template <class T1, class T2, class T3>
01299 inline
01300 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
01301 operator , ( sc_concref_r<T1,T2>, sc_subref<T3> );
01302
01303 template <class T1, class T2, class T3>
01304 inline
01305 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
01306 operator , ( sc_concref<T1,T2>, sc_subref_r<T3> );
01307
01308 template <class T1, class T2, class T3, class T4>
01309 inline
01310 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
01311 operator , ( sc_concref_r<T1,T2>, sc_concref<T3,T4> );
01312
01313 template <class T1, class T2, class T3, class T4>
01314 inline
01315 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
01316 operator , ( sc_concref<T1,T2>, sc_concref_r<T3,T4> );
01317
01318 template <class T1, class T2, class T3>
01319 inline
01320 sc_concref_r<sc_concref_r<T1,T2>,T3>
01321 operator , ( sc_concref<T1,T2>, const sc_proxy<T3>& );
01322
01323 template <class T1, class T2, class T3>
01324 inline
01325 sc_concref_r<sc_concref_r<T1,T2>,T3>
01326 operator , ( sc_concref_r<T1,T2>, sc_proxy<T3>& );
01327
01328 template <class T1, class T2>
01329 inline
01330 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01331 operator , ( sc_concref<T1,T2>, const char* );
01332
01333 template <class T1, class T2>
01334 inline
01335 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01336 operator , ( const char*, sc_concref<T1,T2> );
01337
01338 template <class T1, class T2>
01339 inline
01340 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01341 operator , ( sc_concref<T1,T2>, const sc_logic& );
01342
01343 template <class T1, class T2>
01344 inline
01345 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01346 operator , ( const sc_logic&, sc_concref<T1,T2> );
01347
01348 template <class T1, class T2>
01349 inline
01350 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01351 operator , ( sc_concref<T1,T2>, bool );
01352
01353 template <class T1, class T2>
01354 inline
01355 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01356 operator , ( bool, sc_concref<T1,T2> );
01357
01358
01359 template <class T1, class T2, class T3>
01360 inline
01361 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
01362 concat( sc_concref_r<T1,T2>, sc_bitref<T3> );
01363
01364 template <class T1, class T2, class T3>
01365 inline
01366 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
01367 concat( sc_concref<T1,T2>, sc_bitref_r<T3> );
01368
01369 template <class T1, class T2, class T3>
01370 inline
01371 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
01372 concat( sc_concref_r<T1,T2>, sc_subref<T3> );
01373
01374 template <class T1, class T2, class T3>
01375 inline
01376 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
01377 concat( sc_concref<T1,T2>, sc_subref_r<T3> );
01378
01379 template <class T1, class T2, class T3, class T4>
01380 inline
01381 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
01382 concat( sc_concref_r<T1,T2>, sc_concref<T3,T4> );
01383
01384 template <class T1, class T2, class T3, class T4>
01385 inline
01386 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
01387 concat( sc_concref<T1,T2>, sc_concref_r<T3,T4> );
01388
01389 template <class T1, class T2, class T3>
01390 inline
01391 sc_concref_r<sc_concref_r<T1,T2>,T3>
01392 concat( sc_concref<T1,T2>, const sc_proxy<T3>& );
01393
01394 template <class T1, class T2, class T3>
01395 inline
01396 sc_concref_r<sc_concref_r<T1,T2>,T3>
01397 concat( sc_concref_r<T1,T2>, sc_proxy<T3>& );
01398
01399 template <class T1, class T2>
01400 inline
01401 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01402 concat( sc_concref<T1,T2>, const char* );
01403
01404 template <class T1, class T2>
01405 inline
01406 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01407 concat( const char*, sc_concref<T1,T2> );
01408
01409 template <class T1, class T2>
01410 inline
01411 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01412 concat( sc_concref<T1,T2>, const sc_logic& );
01413
01414 template <class T1, class T2>
01415 inline
01416 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01417 concat( const sc_logic&, sc_concref<T1,T2> );
01418
01419 template <class T1, class T2>
01420 inline
01421 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01422 concat( sc_concref<T1,T2>, bool );
01423
01424 template <class T1, class T2>
01425 inline
01426 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01427 concat( bool, sc_concref<T1,T2> );
01428
01429 #endif
01430
01431
01432
01433
01434
01435
01436
01437
01438 template <class X, class Y>
01439 class sc_concref
01440 : public sc_concref_r<X,Y>
01441 {
01442 public:
01443
01444
01445
01446 typedef sc_concref_r<X,Y> base_type;
01447
01448
01449
01450
01451 sc_concref( X& left_, Y& right_, int delete_ = 0 )
01452 : sc_concref_r<X,Y>( left_, right_, delete_ )
01453 {}
01454
01455
01456
01457
01458 sc_concref( const sc_concref<X,Y>& a )
01459 : sc_concref_r<X,Y>( a )
01460 {}
01461
01462
01463
01464
01465 sc_concref<X,Y>* clone() const
01466 { return new sc_concref<X,Y>( *this ); }
01467
01468
01469
01470
01471 template <class Z>
01472 sc_concref<X,Y>& operator = ( const sc_proxy<Z>& a )
01473 { base_type::assign_( a ); return *this; }
01474
01475 sc_concref<X,Y>& operator = ( const sc_concref<X,Y>& a )
01476 { base_type::assign_( a ); return *this; }
01477
01478 sc_concref<X,Y>& operator = ( const char* a )
01479 { base_type::assign_( a ); return *this; }
01480
01481 sc_concref<X,Y>& operator = ( const bool* a )
01482 { base_type::assign_( a ); return *this; }
01483
01484 sc_concref<X,Y>& operator = ( const sc_logic* a )
01485 { base_type::assign_( a ); return *this; }
01486
01487 sc_concref<X,Y>& operator = ( const sc_unsigned& a )
01488 { base_type::assign_( a ); return *this; }
01489
01490 sc_concref<X,Y>& operator = ( const sc_signed& a )
01491 { base_type::assign_( a ); return *this; }
01492
01493 sc_concref<X,Y>& operator = ( const sc_uint_base& a )
01494 { base_type::assign_( a ); return *this; }
01495
01496 sc_concref<X,Y>& operator = ( const sc_int_base& a )
01497 { base_type::assign_( a ); return *this; }
01498
01499 sc_concref<X,Y>& operator = ( unsigned long a )
01500 { base_type::assign_( a ); return *this; }
01501
01502 sc_concref<X,Y>& operator = ( long a )
01503 { base_type::assign_( a ); return *this; }
01504
01505 sc_concref<X,Y>& operator = ( unsigned int a )
01506 { base_type::assign_( a ); return *this; }
01507
01508 sc_concref<X,Y>& operator = ( int a )
01509 { base_type::assign_( a ); return *this; }
01510
01511 sc_concref<X,Y>& operator = ( uint64 a )
01512 { base_type::assign_( a ); return *this; }
01513
01514 sc_concref<X,Y>& operator = ( int64 a )
01515 { base_type::assign_( a ); return *this; }
01516
01517
01518
01519
01520 void scan( ::std::istream& = ::std::cin );
01521
01522 private:
01523
01524
01525 sc_concref();
01526 };
01527
01528
01529
01530
01531 template <class T1, class T2, class T3>
01532 inline
01533 sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >
01534 operator , ( sc_concref<T1,T2>, sc_bitref<T3> );
01535
01536 template <class T1, class T2, class T3>
01537 inline
01538 sc_concref<sc_concref<T1,T2>,sc_subref<T3> >
01539 operator , ( sc_concref<T1,T2>, sc_subref<T3> );
01540
01541 template <class T1, class T2, class T3, class T4>
01542 inline
01543 sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >
01544 operator , ( sc_concref<T1,T2>, sc_concref<T3,T4> );
01545
01546 template <class T1, class T2, class T3>
01547 inline
01548 sc_concref<sc_concref<T1,T2>,T3>
01549 operator , ( sc_concref<T1,T2>, sc_proxy<T3>& );
01550
01551
01552 template <class T1, class T2, class T3>
01553 inline
01554 sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >
01555 concat( sc_concref<T1,T2>, sc_bitref<T3> );
01556
01557 template <class T1, class T2, class T3>
01558 inline
01559 sc_concref<sc_concref<T1,T2>,sc_subref<T3> >
01560 concat( sc_concref<T1,T2>, sc_subref<T3> );
01561
01562 template <class T1, class T2, class T3, class T4>
01563 inline
01564 sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >
01565 concat( sc_concref<T1,T2>, sc_concref<T3,T4> );
01566
01567 template <class T1, class T2, class T3>
01568 inline
01569 sc_concref<sc_concref<T1,T2>,T3>
01570 concat( sc_concref<T1,T2>, sc_proxy<T3>& );
01571
01572
01573 template <class T1, class T2>
01574 inline
01575 ::std::istream&
01576 operator >> ( ::std::istream&, sc_concref<T1,T2> );
01577
01578
01579
01580
01581
01582
01583
01584
01585
01586
01587
01588 template <class T1, class T2>
01589 inline
01590 sc_concref_r<T1,sc_bitref_r<T2> >
01591 operator , ( const sc_proxy<T1>&, sc_bitref_r<T2> );
01592
01593 template <class T1, class T2>
01594 inline
01595 sc_concref_r<T1,sc_subref_r<T2> >
01596 operator , ( const sc_proxy<T1>&, sc_subref_r<T2> );
01597
01598 template <class T1, class T2, class T3>
01599 inline
01600 sc_concref_r<T1,sc_concref_r<T2,T3> >
01601 operator , ( const sc_proxy<T1>&, sc_concref_r<T2,T3> );
01602
01603 template <class T1, class T2>
01604 inline
01605 sc_concref_r<T1,T2>
01606 operator , ( const sc_proxy<T1>&, const sc_proxy<T2>& );
01607
01608 template <class T>
01609 inline
01610 sc_concref_r<T,sc_lv_base>
01611 operator , ( const sc_proxy<T>&, const char* );
01612
01613 template <class T>
01614 inline
01615 sc_concref_r<sc_lv_base,T>
01616 operator , ( const char*, const sc_proxy<T>& );
01617
01618 template <class T>
01619 inline
01620 sc_concref_r<T,sc_lv_base>
01621 operator , ( const sc_proxy<T>&, const sc_logic& );
01622
01623 template <class T>
01624 inline
01625 sc_concref_r<sc_lv_base,T>
01626 operator , ( const sc_logic&, const sc_proxy<T>& );
01627
01628 template <class T>
01629 inline
01630 sc_concref_r<T,sc_lv_base>
01631 operator , ( const sc_proxy<T>&, bool );
01632
01633 template <class T>
01634 inline
01635 sc_concref_r<sc_lv_base,T>
01636 operator , ( bool, const sc_proxy<T>& );
01637
01638
01639 template <class T1, class T2>
01640 inline
01641 sc_concref_r<T1,sc_bitref_r<T2> >
01642 concat( const sc_proxy<T1>&, sc_bitref_r<T2> );
01643
01644 template <class T1, class T2>
01645 inline
01646 sc_concref_r<T1,sc_subref_r<T2> >
01647 concat( const sc_proxy<T1>&, sc_subref_r<T2> );
01648
01649 template <class T1, class T2, class T3>
01650 inline
01651 sc_concref_r<T1,sc_concref_r<T2,T3> >
01652 concat( const sc_proxy<T1>&, sc_concref_r<T2,T3> );
01653
01654 template <class T1, class T2>
01655 inline
01656 sc_concref_r<T1,T2>
01657 concat( const sc_proxy<T1>&, const sc_proxy<T2>& );
01658
01659 template <class T>
01660 inline
01661 sc_concref_r<T,sc_lv_base>
01662 concat( const sc_proxy<T>&, const char* );
01663
01664 template <class T>
01665 inline
01666 sc_concref_r<sc_lv_base,T>
01667 concat( const char*, const sc_proxy<T>& );
01668
01669 template <class T>
01670 inline
01671 sc_concref_r<T,sc_lv_base>
01672 concat( const sc_proxy<T>&, const sc_logic& );
01673
01674 template <class T>
01675 inline
01676 sc_concref_r<sc_lv_base,T>
01677 concat( const sc_logic&, const sc_proxy<T>& );
01678
01679 template <class T>
01680 inline
01681 sc_concref_r<T,sc_lv_base>
01682 concat( const sc_proxy<T>&, bool );
01683
01684 template <class T>
01685 inline
01686 sc_concref_r<sc_lv_base,T>
01687 concat( bool, const sc_proxy<T>& );
01688
01689
01690 #ifdef SC_DT_MIXED_COMMA_OPERATORS
01691
01692 template <class T1, class T2>
01693 inline
01694 sc_concref_r<T1,sc_bitref_r<T2> >
01695 operator , ( const sc_proxy<T1>&, sc_bitref<T2> );
01696
01697 template <class T1, class T2>
01698 inline
01699 sc_concref_r<T1,sc_bitref_r<T2> >
01700 operator , ( sc_proxy<T1>&, sc_bitref_r<T2> );
01701
01702 template <class T1, class T2>
01703 inline
01704 sc_concref_r<T1,sc_subref_r<T2> >
01705 operator , ( const sc_proxy<T1>&, sc_subref<T2> );
01706
01707 template <class T1, class T2>
01708 inline
01709 sc_concref_r<T1,sc_subref_r<T2> >
01710 operator , ( sc_proxy<T1>&, sc_subref_r<T2> );
01711
01712 template <class T1, class T2, class T3>
01713 inline
01714 sc_concref_r<T1,sc_concref_r<T2,T3> >
01715 operator , ( const sc_proxy<T1>&, sc_concref<T2,T3> );
01716
01717 template <class T1, class T2, class T3>
01718 inline
01719 sc_concref_r<T1,sc_concref_r<T2,T3> >
01720 operator , ( sc_proxy<T1>&, sc_concref_r<T2,T3> );
01721
01722 template <class T1, class T2>
01723 inline
01724 sc_concref_r<T1,T2>
01725 operator , ( const sc_proxy<T1>&, sc_proxy<T2>& );
01726
01727 template <class T1, class T2>
01728 inline
01729 sc_concref_r<T1,T2>
01730 operator , ( sc_proxy<T1>&, const sc_proxy<T2>& );
01731
01732 template <class T>
01733 inline
01734 sc_concref_r<T,sc_lv_base>
01735 operator , ( sc_proxy<T>&, const char* );
01736
01737 template <class T>
01738 inline
01739 sc_concref_r<sc_lv_base,T>
01740 operator , ( const char*, sc_proxy<T>& );
01741
01742 template <class T>
01743 inline
01744 sc_concref_r<T,sc_lv_base>
01745 operator , ( sc_proxy<T>&, const sc_logic& );
01746
01747 template <class T>
01748 inline
01749 sc_concref_r<sc_lv_base,T>
01750 operator , ( const sc_logic&, sc_proxy<T>& );
01751
01752 template <class T>
01753 inline
01754 sc_concref_r<T,sc_lv_base>
01755 operator , ( sc_proxy<T>&, bool );
01756
01757 template <class T>
01758 inline
01759 sc_concref_r<sc_lv_base,T>
01760 operator , ( bool, sc_proxy<T>& );
01761
01762
01763 template <class T1, class T2>
01764 inline
01765 sc_concref_r<T1,sc_bitref_r<T2> >
01766 concat( const sc_proxy<T1>&, sc_bitref<T2> );
01767
01768 template <class T1, class T2>
01769 inline
01770 sc_concref_r<T1,sc_bitref_r<T2> >
01771 concat( sc_proxy<T1>&, sc_bitref_r<T2> );
01772
01773 template <class T1, class T2>
01774 inline
01775 sc_concref_r<T1,sc_subref_r<T2> >
01776 concat( const sc_proxy<T1>&, sc_subref<T2> );
01777
01778 template <class T1, class T2>
01779 inline
01780 sc_concref_r<T1,sc_subref_r<T2> >
01781 concat( sc_proxy<T1>&, sc_subref_r<T2> );
01782
01783 template <class T1, class T2, class T3>
01784 inline
01785 sc_concref_r<T1,sc_concref_r<T2,T3> >
01786 concat( const sc_proxy<T1>&, sc_concref<T2,T3> );
01787
01788 template <class T1, class T2, class T3>
01789 inline
01790 sc_concref_r<T1,sc_concref_r<T2,T3> >
01791 concat( sc_proxy<T1>&, sc_concref_r<T2,T3> );
01792
01793 template <class T1, class T2>
01794 inline
01795 sc_concref_r<T1,T2>
01796 concat( const sc_proxy<T1>&, sc_proxy<T2>& );
01797
01798 template <class T1, class T2>
01799 inline
01800 sc_concref_r<T1,T2>
01801 concat( sc_proxy<T1>&, const sc_proxy<T2>& );
01802
01803 template <class T>
01804 inline
01805 sc_concref_r<T,sc_lv_base>
01806 concat( sc_proxy<T>&, const char* );
01807
01808 template <class T>
01809 inline
01810 sc_concref_r<sc_lv_base,T>
01811 concat( const char*, sc_proxy<T>& );
01812
01813 template <class T>
01814 inline
01815 sc_concref_r<T,sc_lv_base>
01816 concat( sc_proxy<T>&, const sc_logic& );
01817
01818 template <class T>
01819 inline
01820 sc_concref_r<sc_lv_base,T>
01821 concat( const sc_logic&, sc_proxy<T>& );
01822
01823 template <class T>
01824 inline
01825 sc_concref_r<T,sc_lv_base>
01826 concat( sc_proxy<T>&, bool );
01827
01828 template <class T>
01829 inline
01830 sc_concref_r<sc_lv_base,T>
01831 concat( bool, sc_proxy<T>& );
01832
01833 #endif
01834
01835
01836
01837
01838 template <class T1, class T2>
01839 inline
01840 sc_concref<T1,sc_bitref<T2> >
01841 operator , ( sc_proxy<T1>&, sc_bitref<T2> );
01842
01843 template <class T1, class T2>
01844 inline
01845 sc_concref<T1,sc_subref<T2> >
01846 operator , ( sc_proxy<T1>&, sc_subref<T2> );
01847
01848 template <class T1, class T2, class T3>
01849 inline
01850 sc_concref<T1,sc_concref<T2,T3> >
01851 operator , ( sc_proxy<T1>&, sc_concref<T2,T3> );
01852
01853 template <class T1, class T2>
01854 inline
01855 sc_concref<T1,T2>
01856 operator , ( sc_proxy<T1>&, sc_proxy<T2>& );
01857
01858
01859 template <class T1, class T2>
01860 inline
01861 sc_concref<T1,sc_bitref<T2> >
01862 concat( sc_proxy<T1>&, sc_bitref<T2> );
01863
01864 template <class T1, class T2>
01865 inline
01866 sc_concref<T1,sc_subref<T2> >
01867 concat( sc_proxy<T1>&, sc_subref<T2> );
01868
01869 template <class T1, class T2, class T3>
01870 inline
01871 sc_concref<T1,sc_concref<T2,T3> >
01872 concat( sc_proxy<T1>&, sc_concref<T2,T3> );
01873
01874 template <class T1, class T2>
01875 inline
01876 sc_concref<T1,T2>
01877 concat( sc_proxy<T1>&, sc_proxy<T2>& );
01878
01879
01880
01881
01882
01883
01884
01885
01886
01887
01888
01889
01890
01891
01892 template <class T1, class T2>
01893 inline
01894 const sc_logic
01895 operator & ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b )
01896 {
01897 return sc_logic( sc_logic::and_table[a.value()][b.value()] );
01898 }
01899
01900
01901
01902
01903 template <class T1, class T2>
01904 inline
01905 const sc_logic
01906 operator | ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b )
01907 {
01908 return sc_logic( sc_logic::or_table[a.value()][b.value()] );
01909 }
01910
01911
01912
01913
01914 template <class T1, class T2>
01915 inline
01916 const sc_logic
01917 operator ^ ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b )
01918 {
01919 return sc_logic( sc_logic::xor_table[a.value()][b.value()] );
01920 }
01921
01922
01923
01924
01925 template <class T1, class T2>
01926 inline
01927 bool
01928 operator == ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b )
01929 {
01930 return ( (int) a.value() == b.value() );
01931 }
01932
01933 template <class T1, class T2>
01934 inline
01935 bool
01936 operator != ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b )
01937 {
01938 return ( (int) a.value() != b.value() );
01939 }
01940
01941
01942
01943
01944 template <class T>
01945 inline
01946 sc_logic_value_t
01947 sc_bitref_r<T>::get_bit( int n ) const
01948 {
01949 if( n == 0 ) {
01950 return m_obj.get_bit( m_index );
01951 } else {
01952 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_ , 0 );
01953
01954 return Log_0;
01955 }
01956 }
01957
01958
01959 template <class T>
01960 inline
01961 unsigned long
01962 sc_bitref_r<T>::get_word( int n ) const
01963 {
01964 if( n == 0 ) {
01965 return ( get_bit( n ) & UL_ONE );
01966 } else {
01967 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 );
01968
01969 return 0;
01970 }
01971 }
01972
01973 template <class T>
01974 inline
01975 unsigned long
01976 sc_bitref_r<T>::get_cword( int n ) const
01977 {
01978 if( n == 0 ) {
01979 return ( get_bit( n ) & UL_TWO );
01980 } else {
01981 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 );
01982
01983 return 0;
01984 }
01985 }
01986
01987
01988
01989
01990 template <class T1, class T2>
01991 inline
01992 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
01993 operator , ( sc_bitref_r<T1> a, sc_bitref_r<T2> b )
01994 {
01995 return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >(
01996 *a.clone(), *b.clone(), 3 );
01997 }
01998
01999 template <class T1, class T2>
02000 inline
02001 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
02002 operator , ( sc_bitref_r<T1> a, sc_subref_r<T2> b )
02003 {
02004 return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >(
02005 *a.clone(), *b.clone(), 3 );
02006 }
02007
02008 template <class T1, class T2, class T3>
02009 inline
02010 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
02011 operator , ( sc_bitref_r<T1> a, sc_concref_r<T2,T3> b )
02012 {
02013 return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >(
02014 *a.clone(), *b.clone(), 3 );
02015 }
02016
02017 template <class T1, class T2>
02018 inline
02019 sc_concref_r<sc_bitref_r<T1>,T2>
02020 operator , ( sc_bitref_r<T1> a, const sc_proxy<T2>& b )
02021 {
02022 return sc_concref_r<sc_bitref_r<T1>,T2>(
02023 *a.clone(), b.back_cast(), 1 );
02024 }
02025
02026
02027 template <class T1, class T2>
02028 inline
02029 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
02030 concat( sc_bitref_r<T1> a, sc_bitref_r<T2> b )
02031 {
02032 return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >(
02033 *a.clone(), *b.clone(), 3 );
02034 }
02035
02036 template <class T1, class T2>
02037 inline
02038 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
02039 concat( sc_bitref_r<T1> a, sc_subref_r<T2> b )
02040 {
02041 return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >(
02042 *a.clone(), *b.clone(), 3 );
02043 }
02044
02045 template <class T1, class T2, class T3>
02046 inline
02047 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
02048 concat( sc_bitref_r<T1> a, sc_concref_r<T2,T3> b )
02049 {
02050 return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >(
02051 *a.clone(), *b.clone(), 3 );
02052 }
02053
02054 template <class T1, class T2>
02055 inline
02056 sc_concref_r<sc_bitref_r<T1>,T2>
02057 concat( sc_bitref_r<T1> a, const sc_proxy<T2>& b )
02058 {
02059 return sc_concref_r<sc_bitref_r<T1>,T2>(
02060 *a.clone(), b.back_cast(), 1 );
02061 }
02062
02063
02064 #ifdef SC_DT_MIXED_COMMA_OPERATORS
02065
02066 template <class T1, class T2>
02067 inline
02068 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
02069 operator , ( sc_bitref_r<T1> a, sc_bitref<T2> b )
02070 {
02071 return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >(
02072 *a.clone(), *b.clone(), 3 );
02073 }
02074
02075 template <class T1, class T2>
02076 inline
02077 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
02078 operator , ( sc_bitref<T1> a, sc_bitref_r<T2> b )
02079 {
02080 return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >(
02081 *a.clone(), *b.clone(), 3 );
02082 }
02083
02084 template <class T1, class T2>
02085 inline
02086 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
02087 operator , ( sc_bitref_r<T1> a, sc_subref<T2> b )
02088 {
02089 return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >(
02090 *a.clone(), *b.clone(), 3 );
02091 }
02092
02093 template <class T1, class T2>
02094 inline
02095 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
02096 operator , ( sc_bitref<T1> a, sc_subref_r<T2> b )
02097 {
02098 return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >(
02099 *a.clone(), *b.clone(), 3 );
02100 }
02101
02102 template <class T1, class T2, class T3>
02103 inline
02104 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
02105 operator , ( sc_bitref_r<T1> a, sc_concref<T2,T3> b )
02106 {
02107 return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >(
02108 *a.clone(), *b.clone(), 3 );
02109 }
02110
02111 template <class T1, class T2, class T3>
02112 inline
02113 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
02114 operator , ( sc_bitref<T1> a, sc_concref_r<T2,T3> b )
02115 {
02116 return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >(
02117 *a.clone(), *b.clone(), 3 );
02118 }
02119
02120 template <class T1, class T2>
02121 inline
02122 sc_concref_r<sc_bitref_r<T1>,T2>
02123 operator , ( sc_bitref<T1> a, const sc_proxy<T2>& b )
02124 {
02125 return sc_concref_r<sc_bitref_r<T1>,T2>(
02126 *a.clone(), b.back_cast(), 1 );
02127 }
02128
02129 template <class T1, class T2>
02130 inline
02131 sc_concref_r<sc_bitref_r<T1>,T2>
02132 operator , ( sc_bitref_r<T1> a, sc_proxy<T2>& b )
02133 {
02134 return sc_concref_r<sc_bitref_r<T1>,T2>(
02135 *a.clone(), b.back_cast(), 1 );
02136 }
02137
02138
02139 template <class T1, class T2>
02140 inline
02141 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
02142 concat( sc_bitref_r<T1> a, sc_bitref<T2> b )
02143 {
02144 return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >(
02145 *a.clone(), *b.clone(), 3 );
02146 }
02147
02148 template <class T1, class T2>
02149 inline
02150 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
02151 concat( sc_bitref<T1> a, sc_bitref_r<T2> b )
02152 {
02153 return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >(
02154 *a.clone(), *b.clone(), 3 );
02155 }
02156
02157 template <class T1, class T2>
02158 inline
02159 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
02160 concat( sc_bitref_r<T1> a, sc_subref<T2> b )
02161 {
02162 return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >(
02163 *a.clone(), *b.clone(), 3 );
02164 }
02165
02166 template <class T1, class T2>
02167 inline
02168 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
02169 concat( sc_bitref<T1> a, sc_subref_r<T2> b )
02170 {
02171 return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >(
02172 *a.clone(), *b.clone(), 3 );
02173 }
02174
02175 template <class T1, class T2, class T3>
02176 inline
02177 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
02178 concat( sc_bitref_r<T1> a, sc_concref<T2,T3> b )
02179 {
02180 return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >(
02181 *a.clone(), *b.clone(), 3 );
02182 }
02183
02184 template <class T1, class T2, class T3>
02185 inline
02186 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
02187 concat( sc_bitref<T1> a, sc_concref_r<T2,T3> b )
02188 {
02189 return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >(
02190 *a.clone(), *b.clone(), 3 );
02191 }
02192
02193 template <class T1, class T2>
02194 inline
02195 sc_concref_r<sc_bitref_r<T1>,T2>
02196 concat( sc_bitref<T1> a, const sc_proxy<T2>& b )
02197 {
02198 return sc_concref_r<sc_bitref_r<T1>,T2>(
02199 *a.clone(), b.back_cast(), 1 );
02200 }
02201
02202 template <class T1, class T2>
02203 inline
02204 sc_concref_r<sc_bitref_r<T1>,T2>
02205 concat( sc_bitref_r<T1> a, sc_proxy<T2>& b )
02206 {
02207 return sc_concref_r<sc_bitref_r<T1>,T2>(
02208 *a.clone(), b.back_cast(), 1 );
02209 }
02210
02211 #endif
02212
02213
02214
02215
02216
02217
02218
02219
02220
02221
02222 template <class X>
02223 inline
02224 sc_bitref<X>&
02225 sc_bitref<X>::operator = ( const sc_bitref_r<X>& a )
02226 {
02227 this->m_obj.set_bit( this->m_index, a.value() );
02228 return *this;
02229 }
02230
02231 template <class X>
02232 inline
02233 sc_bitref<X>&
02234 sc_bitref<X>::operator = ( const sc_bitref<X>& a )
02235 {
02236 if( &a != this ) {
02237 this->m_obj.set_bit( this->m_index, a.value() );
02238 }
02239 return *this;
02240 }
02241
02242
02243
02244
02245 template <class X>
02246 inline
02247 sc_bitref<X>&
02248 sc_bitref<X>::operator &= ( const sc_bitref_r<X>& a )
02249 {
02250 if( &a != this ) {
02251 this->m_obj.set_bit( this->m_index,
02252 sc_logic::and_table[this->value()][a.value()] );
02253 }
02254 return *this;
02255 }
02256
02257 template <class X>
02258 inline
02259 sc_bitref<X>&
02260 sc_bitref<X>::operator &= ( const sc_logic& a )
02261 {
02262 this->m_obj.set_bit( this->m_index,
02263 sc_logic::and_table[this->value()][a.value()] );
02264 return *this;
02265 }
02266
02267
02268 template <class X>
02269 inline
02270 sc_bitref<X>&
02271 sc_bitref<X>::operator |= ( const sc_bitref_r<X>& a )
02272 {
02273 if( &a != this ) {
02274 this->m_obj.set_bit( this->m_index,
02275 sc_logic::or_table[this->value()][a.value()] );
02276 }
02277 return *this;
02278 }
02279
02280 template <class X>
02281 inline
02282 sc_bitref<X>&
02283 sc_bitref<X>::operator |= ( const sc_logic& a )
02284 {
02285 this->m_obj.set_bit( this->m_index,
02286 sc_logic::or_table[this->value()][a.value()] );
02287 return *this;
02288 }
02289
02290
02291 template <class X>
02292 inline
02293 sc_bitref<X>&
02294 sc_bitref<X>::operator ^= ( const sc_bitref_r<X>& a )
02295 {
02296 if( &a != this ) {
02297 this->m_obj.set_bit( this->m_index,
02298 sc_logic::xor_table[this->value()][a.value()] );
02299 }
02300 return *this;
02301 }
02302
02303 template <class X>
02304 inline
02305 sc_bitref<X>&
02306 sc_bitref<X>::operator ^= ( const sc_logic& a )
02307 {
02308 this->m_obj.set_bit( this->m_index,
02309 sc_logic::xor_table[this->value()][a.value()] );
02310 return *this;
02311 }
02312
02313
02314
02315
02316
02317
02318 template <class X>
02319 inline
02320 sc_bitref<X>&
02321 sc_bitref<X>::b_not()
02322 {
02323 this->m_obj.set_bit( this->m_index,
02324 sc_logic::not_table[this->value()] );
02325 return *this;
02326 }
02327
02328
02329
02330
02331 template <class X>
02332 inline
02333 void
02334 sc_bitref<X>::set_bit( int n, sc_logic_value_t value )
02335 {
02336 if( n == 0 ) {
02337 this->m_obj.set_bit( this->m_index, value );
02338 } else {
02339 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 );
02340 }
02341 }
02342
02343
02344 template <class X>
02345 inline
02346 void
02347 sc_bitref<X>::set_word( int n, unsigned long w )
02348 {
02349 if( n == 0 ) {
02350 this->m_obj.set_word( this->m_index, w );
02351 } else {
02352 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 );
02353 }
02354 }
02355
02356 template <class X>
02357 inline
02358 void
02359 sc_bitref<X>::set_cword( int n, unsigned long w )
02360 {
02361 if( n == 0 ) {
02362 this->m_obj.set_cword( this->m_index, w );
02363 } else {
02364 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 );
02365 }
02366 }
02367
02368
02369
02370
02371 template <class X>
02372 inline
02373 void
02374 sc_bitref<X>::scan( ::std::istream& is )
02375 {
02376 char c;
02377 is >> c;
02378 *this = c;
02379 }
02380
02381
02382
02383
02384 template <class T1, class T2>
02385 inline
02386 sc_concref<sc_bitref<T1>,sc_bitref<T2> >
02387 operator , ( sc_bitref<T1> a, sc_bitref<T2> b )
02388 {
02389 return sc_concref<sc_bitref<T1>,sc_bitref<T2> >(
02390 *a.clone(), *b.clone(), 3 );
02391 }
02392
02393 template <class T1, class T2>
02394 inline
02395 sc_concref<sc_bitref<T1>,sc_subref<T2> >
02396 operator , ( sc_bitref<T1> a, sc_subref<T2> b )
02397 {
02398 return sc_concref<sc_bitref<T1>,sc_subref<T2> >(
02399 *a.clone(), *b.clone(), 3 );
02400 }
02401
02402 template <class T1, class T2, class T3>
02403 inline
02404 sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >
02405 operator , ( sc_bitref<T1> a, sc_concref<T2,T3> b )
02406 {
02407 return sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >(
02408 *a.clone(), *b.clone(), 3 );
02409 }
02410
02411 template <class T1, class T2>
02412 inline
02413 sc_concref<sc_bitref<T1>,T2>
02414 operator , ( sc_bitref<T1> a, sc_proxy<T2>& b )
02415 {
02416 return sc_concref<sc_bitref<T1>,T2>(
02417 *a.clone(), b.back_cast(), 1 );
02418 }
02419
02420
02421 template <class T1, class T2>
02422 inline
02423 sc_concref<sc_bitref<T1>,sc_bitref<T2> >
02424 concat( sc_bitref<T1> a, sc_bitref<T2> b )
02425 {
02426 return sc_concref<sc_bitref<T1>,sc_bitref<T2> >(
02427 *a.clone(), *b.clone(), 3 );
02428 }
02429
02430 template <class T1, class T2>
02431 inline
02432 sc_concref<sc_bitref<T1>,sc_subref<T2> >
02433 concat( sc_bitref<T1> a, sc_subref<T2> b )
02434 {
02435 return sc_concref<sc_bitref<T1>,sc_subref<T2> >(
02436 *a.clone(), *b.clone(), 3 );
02437 }
02438
02439 template <class T1, class T2, class T3>
02440 inline
02441 sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >
02442 concat( sc_bitref<T1> a, sc_concref<T2,T3> b )
02443 {
02444 return sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >(
02445 *a.clone(), *b.clone(), 3 );
02446 }
02447
02448 template <class T1, class T2>
02449 inline
02450 sc_concref<sc_bitref<T1>,T2>
02451 concat( sc_bitref<T1> a, sc_proxy<T2>& b )
02452 {
02453 return sc_concref<sc_bitref<T1>,T2>(
02454 *a.clone(), b.back_cast(), 1 );
02455 }
02456
02457
02458 template <class X>
02459 inline
02460 ::std::istream&
02461 operator >> ( ::std::istream& is, sc_bitref<X> a )
02462 {
02463 a.scan( is );
02464 return is;
02465 }
02466
02467
02468
02469
02470
02471
02472
02473
02474 template <class X>
02475 inline
02476 void
02477 sc_subref_r<X>::check_bounds()
02478 {
02479 int len = m_obj.length();
02480 if( m_hi < 0 || m_hi >= len || m_lo < 0 || m_lo >= len ) {
02481 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 );
02482 }
02483 if( reversed() ) {
02484 m_len = m_lo - m_hi + 1;
02485 } else {
02486 m_len = m_hi - m_lo + 1;
02487 }
02488 }
02489
02490
02491
02492
02493 template <class X>
02494 inline
02495 sc_logic_value_t
02496 sc_subref_r<X>::get_bit( int n ) const
02497 {
02498 if( reversed() ) {
02499 return m_obj.get_bit( m_lo - n );
02500 } else {
02501 return m_obj.get_bit( m_lo + n );
02502 }
02503 }
02504
02505 template <class X>
02506 inline
02507 void
02508 sc_subref_r<X>::set_bit( int n, sc_logic_value_t value )
02509 {
02510 if( reversed() ) {
02511 m_obj.set_bit( m_lo - n, value );
02512 } else {
02513 m_obj.set_bit( m_lo + n, value );
02514 }
02515 }
02516
02517
02518 template <class X>
02519 inline
02520 unsigned long
02521 sc_subref_r<X>::get_word( int i ) const
02522 {
02523 int n1 = 0;
02524 int n2 = 0;
02525 unsigned long result = 0;
02526 int k = 0;
02527 if( reversed() ) {
02528 n1 = m_lo - i * UL_SIZE;
02529 n2 = sc_max( n1 - UL_SIZE, m_hi - 1 );
02530 for( int n = n1; n > n2; n -- ) {
02531 result |= (m_obj[n].value() & UL_ONE) << k ++;
02532 }
02533 } else {
02534 n1 = m_lo + i * UL_SIZE;
02535 n2 = sc_min( n1 + UL_SIZE, m_hi + 1 );
02536 for( int n = n1; n < n2; n ++ ) {
02537 result |= (m_obj[n].value() & UL_ONE) << k ++;
02538 }
02539 }
02540 return result;
02541 }
02542
02543 template <class X>
02544 inline
02545 void
02546 sc_subref_r<X>::set_word( int i, unsigned long w )
02547 {
02548 int n1 = 0;
02549 int n2 = 0;
02550 int k = 0;
02551 if( reversed() ) {
02552 n1 = m_lo - i * UL_SIZE;
02553 n2 = sc_max( n1 - UL_SIZE, m_hi - 1 );
02554 for( int n = n1; n > n2; n -- ) {
02555 m_obj.set_bit( n, sc_logic_value_t( (w >> k ++) & UL_ONE |
02556 m_obj[n].value() & UL_TWO ) );
02557 }
02558 } else {
02559 n1 = m_lo + i * UL_SIZE;
02560 n2 = sc_min( n1 + UL_SIZE, m_hi + 1 );
02561 for( int n = n1; n < n2; n ++ ) {
02562 m_obj.set_bit( n, sc_logic_value_t( (w >> k ++) & UL_ONE |
02563 m_obj[n].value() & UL_TWO ) );
02564 }
02565 }
02566 }
02567
02568
02569 template <class X>
02570 inline
02571 unsigned long
02572 sc_subref_r<X>::get_cword( int i ) const
02573 {
02574 int n1 = 0;
02575 int n2 = 0;
02576 unsigned long result = 0;
02577 int k = 0;
02578 if( reversed() ) {
02579 n1 = m_lo - i * UL_SIZE;
02580 n2 = sc_max( n1 - UL_SIZE, m_hi - 1 );
02581 for( int n = n1; n > n2; n -- ) {
02582 result |= ((m_obj[n].value() & UL_TWO) >> 1) << k ++;
02583 }
02584 } else {
02585 n1 = m_lo + i * UL_SIZE;
02586 n2 = sc_min( n1 + UL_SIZE, m_hi + 1 );
02587 for( int n = n1; n < n2; n ++ ) {
02588 result |= ((m_obj[n].value() & UL_TWO) >> 1) << k ++;
02589 }
02590 }
02591 return result;
02592 }
02593
02594 template <class X>
02595 inline
02596 void
02597 sc_subref_r<X>::set_cword( int i, unsigned long w )
02598 {
02599 int n1 = 0;
02600 int n2 = 0;
02601 int k = 0;
02602 if( reversed() ) {
02603 n1 = m_lo - i * UL_SIZE;
02604 n2 = sc_max( n1 - UL_SIZE, m_hi - 1 );
02605 for( int n = n1; n > n2; n -- ) {
02606 m_obj.set_bit( n, sc_logic_value_t( ((w >> k ++) & UL_ONE) << 1 |
02607 m_obj[n].value() & UL_ONE ) );
02608 }
02609 } else {
02610 n1 = m_lo + i * UL_SIZE;
02611 n2 = sc_min( n1 + UL_SIZE, m_hi + 1 );
02612 for( int n = n1; n < n2; n ++ ) {
02613 m_obj.set_bit( n, sc_logic_value_t( ((w >> k ++) & UL_ONE) << 1 |
02614 m_obj[n].value() & UL_ONE ) );
02615 }
02616 }
02617 }
02618
02619
02620
02621
02622 template <class X>
02623 inline
02624 bool
02625 sc_subref_r<X>::is_01() const
02626 {
02627 int sz = size();
02628 for( int i = 0; i < sz; ++ i ) {
02629 if( get_cword( i ) != UL_ZERO ) {
02630 return false;
02631 }
02632 }
02633 return true;
02634 }
02635
02636
02637
02638
02639 template <class T1, class T2>
02640 inline
02641 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
02642 operator , ( sc_subref_r<T1> a, sc_bitref_r<T2> b )
02643 {
02644 return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >(
02645 *a.clone(), *b.clone(), 3 );
02646 }
02647
02648 template <class T1, class T2>
02649 inline
02650 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
02651 operator , ( sc_subref_r<T1> a, sc_subref_r<T2> b )
02652 {
02653 return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >(
02654 *a.clone(), *b.clone(), 3 );
02655 }
02656
02657 template <class T1, class T2, class T3>
02658 inline
02659 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
02660 operator , ( sc_subref_r<T1> a, sc_concref_r<T2,T3> b )
02661 {
02662 return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >(
02663 *a.clone(), *b.clone(), 3 );
02664 }
02665
02666 template <class T1, class T2>
02667 inline
02668 sc_concref_r<sc_subref_r<T1>,T2>
02669 operator , ( sc_subref_r<T1> a, const sc_proxy<T2>& b )
02670 {
02671 return sc_concref_r<sc_subref_r<T1>,T2>(
02672 *a.clone(), b.back_cast(), 1 );
02673 }
02674
02675
02676 template <class T1, class T2>
02677 inline
02678 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
02679 concat( sc_subref_r<T1> a, sc_bitref_r<T2> b )
02680 {
02681 return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >(
02682 *a.clone(), *b.clone(), 3 );
02683 }
02684
02685 template <class T1, class T2>
02686 inline
02687 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
02688 concat( sc_subref_r<T1> a, sc_subref_r<T2> b )
02689 {
02690 return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >(
02691 *a.clone(), *b.clone(), 3 );
02692 }
02693
02694 template <class T1, class T2, class T3>
02695 inline
02696 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
02697 concat( sc_subref_r<T1> a, sc_concref_r<T2,T3> b )
02698 {
02699 return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >(
02700 *a.clone(), *b.clone(), 3 );
02701 }
02702
02703 template <class T1, class T2>
02704 inline
02705 sc_concref_r<sc_subref_r<T1>,T2>
02706 concat( sc_subref_r<T1> a, const sc_proxy<T2>& b )
02707 {
02708 return sc_concref_r<sc_subref_r<T1>,T2>(
02709 *a.clone(), b.back_cast(), 1 );
02710 }
02711
02712
02713 #ifdef SC_DT_MIXED_COMMA_OPERATORS
02714
02715 template <class T1, class T2>
02716 inline
02717 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
02718 operator , ( sc_subref_r<T1> a, sc_bitref<T2> b )
02719 {
02720 return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >(
02721 *a.clone(), *b.clone(), 3 );
02722 }
02723
02724 template <class T1, class T2>
02725 inline
02726 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
02727 operator , ( sc_subref<T1> a, sc_bitref_r<T2> b )
02728 {
02729 return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >(
02730 *a.clone(), *b.clone(), 3 );
02731 }
02732
02733 template <class T1, class T2>
02734 inline
02735 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
02736 operator , ( sc_subref_r<T1> a, sc_subref<T2> b )
02737 {
02738 return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >(
02739 *a.clone(), *b.clone(), 3 );
02740 }
02741
02742 template <class T1, class T2>
02743 inline
02744 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
02745 operator , ( sc_subref<T1> a, sc_subref_r<T2> b )
02746 {
02747 return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >(
02748 *a.clone(), *b.clone(), 3 );
02749 }
02750
02751 template <class T1, class T2, class T3>
02752 inline
02753 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
02754 operator , ( sc_subref_r<T1> a, sc_concref<T2,T3> b )
02755 {
02756 return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >(
02757 *a.clone(), *b.clone(), 3 );
02758 }
02759
02760 template <class T1, class T2, class T3>
02761 inline
02762 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
02763 operator , ( sc_subref<T1> a, sc_concref_r<T2,T3> b )
02764 {
02765 return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >(
02766 *a.clone(), *b.clone(), 3 );
02767 }
02768
02769 template <class T1, class T2>
02770 inline
02771 sc_concref_r<sc_subref_r<T1>,T2>
02772 operator , ( sc_subref<T1> a, const sc_proxy<T2>& b )
02773 {
02774 return sc_concref_r<sc_subref_r<T1>,T2>(
02775 *a.clone(), b.back_cast(), 1 );
02776 }
02777
02778 template <class T1, class T2>
02779 inline
02780 sc_concref_r<sc_subref_r<T1>,T2>
02781 operator , ( sc_subref_r<T1> a, sc_proxy<T2>& b )
02782 {
02783 return sc_concref_r<sc_subref_r<T1>,T2>(
02784 *a.clone(), b.back_cast(), 1 );
02785 }
02786
02787
02788 template <class T1, class T2>
02789 inline
02790 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
02791 concat( sc_subref_r<T1> a, sc_bitref<T2> b )
02792 {
02793 return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >(
02794 *a.clone(), *b.clone(), 3 );
02795 }
02796
02797 template <class T1, class T2>
02798 inline
02799 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
02800 concat( sc_subref<T1> a, sc_bitref_r<T2> b )
02801 {
02802 return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >(
02803 *a.clone(), *b.clone(), 3 );
02804 }
02805
02806 template <class T1, class T2>
02807 inline
02808 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
02809 concat( sc_subref_r<T1> a, sc_subref<T2> b )
02810 {
02811 return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >(
02812 *a.clone(), *b.clone(), 3 );
02813 }
02814
02815 template <class T1, class T2>
02816 inline
02817 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
02818 concat( sc_subref<T1> a, sc_subref_r<T2> b )
02819 {
02820 return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >(
02821 *a.clone(), *b.clone(), 3 );
02822 }
02823
02824 template <class T1, class T2, class T3>
02825 inline
02826 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
02827 concat( sc_subref_r<T1> a, sc_concref<T2,T3> b )
02828 {
02829 return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >(
02830 *a.clone(), *b.clone(), 3 );
02831 }
02832
02833 template <class T1, class T2, class T3>
02834 inline
02835 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
02836 concat( sc_subref<T1> a, sc_concref_r<T2,T3> b )
02837 {
02838 return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >(
02839 *a.clone(), *b.clone(), 3 );
02840 }
02841
02842 template <class T1, class T2>
02843 inline
02844 sc_concref_r<sc_subref_r<T1>,T2>
02845 concat( sc_subref<T1> a, const sc_proxy<T2>& b )
02846 {
02847 return sc_concref_r<sc_subref_r<T1>,T2>(
02848 *a.clone(), b.back_cast(), 1 );
02849 }
02850
02851 template <class T1, class T2>
02852 inline
02853 sc_concref_r<sc_subref_r<T1>,T2>
02854 concat( sc_subref_r<T1> a, sc_proxy<T2>& b )
02855 {
02856 return sc_concref_r<sc_subref_r<T1>,T2>(
02857 *a.clone(), b.back_cast(), 1 );
02858 }
02859
02860 #endif
02861
02862
02863
02864
02865
02866
02867
02868
02869
02870
02871
02872
02873
02874
02875
02876
02877 template <class T>
02878 inline
02879 void
02880 sc_subref<T>::scan( ::std::istream& is )
02881 {
02882 std::string s;
02883 is >> s;
02884 *this = s.c_str();
02885 }
02886
02887
02888
02889
02890 template <class T1, class T2>
02891 inline
02892 sc_concref<sc_subref<T1>,sc_bitref<T2> >
02893 operator , ( sc_subref<T1> a, sc_bitref<T2> b )
02894 {
02895 return sc_concref<sc_subref<T1>,sc_bitref<T2> >(
02896 *a.clone(), *b.clone(), 3 );
02897 }
02898
02899 template <class T1, class T2>
02900 inline
02901 sc_concref<sc_subref<T1>,sc_subref<T2> >
02902 operator , ( sc_subref<T1> a, sc_subref<T2> b )
02903 {
02904 return sc_concref<sc_subref<T1>,sc_subref<T2> >(
02905 *a.clone(), *b.clone(), 3 );
02906 }
02907
02908 template <class T1, class T2, class T3>
02909 inline
02910 sc_concref<sc_subref<T1>,sc_concref<T2,T3> >
02911 operator , ( sc_subref<T1> a, sc_concref<T2,T3> b )
02912 {
02913 return sc_concref<sc_subref<T1>,sc_concref<T2,T3> >(
02914 *a.clone(), *b.clone(), 3 );
02915 }
02916
02917 template <class T1, class T2>
02918 inline
02919 sc_concref<sc_subref<T1>,T2>
02920 operator , ( sc_subref<T1> a, sc_proxy<T2>& b )
02921 {
02922 return sc_concref<sc_subref<T1>,T2>(
02923 *a.clone(), b.back_cast(), 1 );
02924 }
02925
02926
02927 template <class T1, class T2>
02928 inline
02929 sc_concref<sc_subref<T1>,sc_bitref<T2> >
02930 concat( sc_subref<T1> a, sc_bitref<T2> b )
02931 {
02932 return sc_concref<sc_subref<T1>,sc_bitref<T2> >(
02933 *a.clone(), *b.clone(), 3 );
02934 }
02935
02936 template <class T1, class T2>
02937 inline
02938 sc_concref<sc_subref<T1>,sc_subref<T2> >
02939 concat( sc_subref<T1> a, sc_subref<T2> b )
02940 {
02941 return sc_concref<sc_subref<T1>,sc_subref<T2> >(
02942 *a.clone(), *b.clone(), 3 );
02943 }
02944
02945 template <class T1, class T2, class T3>
02946 inline
02947 sc_concref<sc_subref<T1>,sc_concref<T2,T3> >
02948 concat( sc_subref<T1> a, sc_concref<T2,T3> b )
02949 {
02950 return sc_concref<sc_subref<T1>,sc_concref<T2,T3> >(
02951 *a.clone(), *b.clone(), 3 );
02952 }
02953
02954 template <class T1, class T2>
02955 inline
02956 sc_concref<sc_subref<T1>,T2>
02957 concat( sc_subref<T1> a, sc_proxy<T2>& b )
02958 {
02959 return sc_concref<sc_subref<T1>,T2>(
02960 *a.clone(), b.back_cast(), 1 );
02961 }
02962
02963
02964 template <class X>
02965 inline
02966 ::std::istream&
02967 operator >> ( ::std::istream& is, sc_subref<X> a )
02968 {
02969 a.scan( is );
02970 return is;
02971 }
02972
02973
02974
02975
02976
02977
02978
02979
02980
02981
02982 template <class X, class Y>
02983 inline
02984 sc_concref_r<X,Y>::~sc_concref_r()
02985 {
02986 if( -- m_refs == 0 ) {
02987 delete &m_refs;
02988 if( m_delete == 0 ) {
02989 return;
02990 }
02991 if( m_delete & 1 ) {
02992 delete &m_left;
02993 }
02994 if( m_delete & 2 ) {
02995 delete &m_right;
02996 }
02997 }
02998 }
02999
03000
03001
03002
03003 template <class X, class Y>
03004 inline
03005 sc_logic_value_t
03006 sc_concref_r<X,Y>::get_bit( int n ) const
03007 {
03008 int r_len = m_right.length();
03009 if( n < r_len ) {
03010 return m_right.get_bit( n );
03011 } else if( n < r_len + m_left.length() ) {
03012 return m_left.get_bit( n - r_len );
03013 } else {
03014 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 );
03015
03016 return Log_0;
03017 }
03018 }
03019
03020 template <class X, class Y>
03021 inline
03022 void
03023 sc_concref_r<X,Y>::set_bit( int n, sc_logic_value_t v )
03024 {
03025 int r_len = m_right.length();
03026 if( n < r_len ) {
03027 m_right.set_bit( n, v );
03028 } else if( n < r_len + m_left.length() ) {
03029 m_left.set_bit( n - r_len, v );
03030 } else {
03031 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 );
03032 }
03033 }
03034
03035
03036 template <class X, class Y>
03037 inline
03038 unsigned long
03039 sc_concref_r<X,Y>::get_word( int i ) const
03040 {
03041 if( i < 0 || i >= size() ) {
03042 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 );
03043 }
03044
03045 Y& r = m_right;
03046 int r_len = r.length();
03047 int border = r_len / UL_SIZE;
03048 if( i < border ) {
03049 return r.get_word( i );
03050 }
03051
03052 X& l = m_left;
03053 int shift = r_len % UL_SIZE;
03054 int j = i - border;
03055 if( shift == 0 ) {
03056 return l.get_word( j );
03057 }
03058
03059 int nshift = UL_SIZE - shift;
03060 if( i == border ) {
03061 unsigned long rl_mask = ~UL_ZERO >> nshift;
03062 return ( (r.get_word( i ) & rl_mask) | (l.get_word( 0 ) << shift) );
03063 }
03064
03065 if ( j < l.size() )
03066 return ( (l.get_word( j - 1 ) >> nshift) | (l.get_word( j ) << shift) );
03067 else
03068 return (l.get_word( j - 1 ) >> nshift);
03069 }
03070
03071 template <class X, class Y>
03072 inline
03073 void
03074 sc_concref_r<X,Y>::set_word( int i, unsigned long w )
03075 {
03076 if( i < 0 || i >= size() ) {
03077 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 );
03078 }
03079
03080 Y& r = m_right;
03081 int r_len = r.length();
03082 int border = r_len / UL_SIZE;
03083 if( i < border ) {
03084 r.set_word( i, w );
03085 return;
03086 }
03087
03088 X& l = m_left;
03089 int shift = r_len % UL_SIZE;
03090 int j = i - border;
03091 if( shift == 0 ) {
03092 l.set_word( j, w );
03093 return;
03094 }
03095
03096 int nshift = UL_SIZE - shift;
03097 unsigned long lh_mask = ~UL_ZERO << nshift;
03098 if( i == border ) {
03099 unsigned long rl_mask = ~UL_ZERO >> nshift;
03100 r.set_word( i, w & rl_mask );
03101 l.set_word( 0, (l.get_word( 0 ) & lh_mask) | (w >> shift) );
03102 return;
03103 }
03104
03105 unsigned long ll_mask = ~UL_ZERO >> shift;
03106 l.set_word( j - 1, (l.get_word( j - 1 ) & ll_mask) | (w << nshift) );
03107 l.set_word( j, (l.get_word( j ) & lh_mask) | (w >> shift) );
03108 }
03109
03110
03111 template <class X, class Y>
03112 inline
03113 unsigned long
03114 sc_concref_r<X,Y>::get_cword( int i ) const
03115 {
03116 if( i < 0 || i >= size() ) {
03117 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 );
03118 }
03119
03120 Y& r = m_right;
03121 int r_len = r.length();
03122 int border = r_len / UL_SIZE;
03123 if( i < border ) {
03124 return r.get_cword( i );
03125 }
03126
03127 X& l = m_left;
03128 int shift = r_len % UL_SIZE;
03129 int j = i - border;
03130 if( shift == 0 ) {
03131 return l.get_cword( j );
03132 }
03133
03134 int nshift = UL_SIZE - shift;
03135 if( i == border ) {
03136 unsigned long rl_mask = ~UL_ZERO >> nshift;
03137 return ( (r.get_cword( i ) & rl_mask) | (l.get_cword( 0 ) << shift) );
03138 }
03139
03140 if ( j < l.size() )
03141 return ( (l.get_cword(j - 1) >> nshift) | (l.get_cword(j) << shift) );
03142 else
03143 return (l.get_cword( j - 1 ) >> nshift);
03144 }
03145
03146 template <class X, class Y>
03147 inline
03148 void
03149 sc_concref_r<X,Y>::set_cword( int i, unsigned long w )
03150 {
03151 if( i < 0 || i >= size() ) {
03152 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 );
03153 }
03154
03155 Y& r = m_right;
03156 int r_len = r.length();
03157 int border = r_len / UL_SIZE;
03158 if( i < border ) {
03159 r.set_cword( i, w );
03160 return;
03161 }
03162
03163 X& l = m_left;
03164 int shift = r_len % UL_SIZE;
03165 int j = i - border;
03166 if( shift == 0 ) {
03167 l.set_cword( j, w );
03168 return;
03169 }
03170
03171 int nshift = UL_SIZE - shift;
03172 unsigned long lh_mask = ~UL_ZERO << nshift;
03173 if( i == border ) {
03174 unsigned long rl_mask = ~UL_ZERO >> nshift;
03175 r.set_cword( i, w & rl_mask );
03176 l.set_cword( 0, (l.get_cword( 0 ) & lh_mask) | (w >> shift) );
03177 return;
03178 }
03179
03180 unsigned long ll_mask = ~UL_ZERO >> shift;
03181 l.set_cword( j - 1, (l.get_cword( j - 1 ) & ll_mask) | (w << nshift) );
03182 l.set_cword( j, (l.get_cword( j ) & lh_mask) | (w >> shift) );
03183 }
03184
03185
03186
03187
03188 template <class T1, class T2, class T3>
03189 inline
03190 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
03191 operator , ( sc_concref_r<T1,T2> a, sc_bitref_r<T3> b )
03192 {
03193 return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >(
03194 *a.clone(), *b.clone(), 3 );
03195 }
03196
03197 template <class T1, class T2, class T3>
03198 inline
03199 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
03200 operator , ( sc_concref_r<T1,T2> a, sc_subref_r<T3> b )
03201 {
03202 return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >(
03203 *a.clone(), *b.clone(), 3 );
03204 }
03205
03206 template <class T1, class T2, class T3, class T4>
03207 inline
03208 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
03209 operator , ( sc_concref_r<T1,T2> a, sc_concref_r<T3,T4> b )
03210 {
03211 return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >(
03212 *a.clone(), *b.clone(), 3 );
03213 }
03214
03215 template <class T1, class T2, class T3>
03216 inline
03217 sc_concref_r<sc_concref_r<T1,T2>,T3>
03218 operator , ( sc_concref_r<T1,T2> a, const sc_proxy<T3>& b )
03219 {
03220 return sc_concref_r<sc_concref_r<T1,T2>,T3>(
03221 *a.clone(), b.back_cast(), 1 );
03222 }
03223
03224
03225 template <class T1, class T2, class T3>
03226 inline
03227 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
03228 concat( sc_concref_r<T1,T2> a, sc_bitref_r<T3> b )
03229 {
03230 return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >(
03231 *a.clone(), *b.clone(), 3 );
03232 }
03233
03234 template <class T1, class T2, class T3>
03235 inline
03236 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
03237 concat( sc_concref_r<T1,T2> a, sc_subref_r<T3> b )
03238 {
03239 return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >(
03240 *a.clone(), *b.clone(), 3 );
03241 }
03242
03243 template <class T1, class T2, class T3, class T4>
03244 inline
03245 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
03246 concat( sc_concref_r<T1,T2> a, sc_concref_r<T3,T4> b )
03247 {
03248 return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >(
03249 *a.clone(), *b.clone(), 3 );
03250 }
03251
03252 template <class T1, class T2, class T3>
03253 inline
03254 sc_concref_r<sc_concref_r<T1,T2>,T3>
03255 concat( sc_concref_r<T1,T2> a, const sc_proxy<T3>& b )
03256 {
03257 return sc_concref_r<sc_concref_r<T1,T2>,T3>(
03258 *a.clone(), b.back_cast(), 1 );
03259 }
03260
03261
03262 #ifdef SC_DT_MIXED_COMMA_OPERATORS
03263
03264 template <class T1, class T2, class T3>
03265 inline
03266 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
03267 operator , ( sc_concref_r<T1,T2> a, sc_bitref<T3> b )
03268 {
03269 return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >(
03270 *a.clone(), *b.clone(), 3 );
03271 }
03272
03273 template <class T1, class T2, class T3>
03274 inline
03275 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
03276 operator , ( sc_concref<T1,T2> a, sc_bitref_r<T3> b )
03277 {
03278 return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >(
03279 *a.clone(), *b.clone(), 3 );
03280 }
03281
03282 template <class T1, class T2, class T3>
03283 inline
03284 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
03285 operator , ( sc_concref_r<T1,T2> a, sc_subref<T3> b )
03286 {
03287 return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >(
03288 *a.clone(), *b.clone(), 3 );
03289 }
03290
03291 template <class T1, class T2, class T3>
03292 inline
03293 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
03294 operator , ( sc_concref<T1,T2> a, sc_subref_r<T3> b )
03295 {
03296 return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >(
03297 *a.clone(), *b.clone(), 3 );
03298 }
03299
03300 template <class T1, class T2, class T3, class T4>
03301 inline
03302 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
03303 operator , ( sc_concref_r<T1,T2> a, sc_concref<T3,T4> b )
03304 {
03305 return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >(
03306 *a.clone(), *b.clone(), 3 );
03307 }
03308
03309 template <class T1, class T2, class T3, class T4>
03310 inline
03311 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
03312 operator , ( sc_concref<T1,T2> a, sc_concref_r<T3,T4> b )
03313 {
03314 return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >(
03315 *a.clone(), *b.clone(), 3 );
03316 }
03317
03318 template <class T1, class T2, class T3>
03319 inline
03320 sc_concref_r<sc_concref_r<T1,T2>,T3>
03321 operator , ( sc_concref<T1,T2> a, const sc_proxy<T3>& b )
03322 {
03323 return sc_concref_r<sc_concref_r<T1,T2>,T3>(
03324 *a.clone(), b.back_cast(), 1 );
03325 }
03326
03327 template <class T1, class T2, class T3>
03328 inline
03329 sc_concref_r<sc_concref_r<T1,T2>,T3>
03330 operator , ( sc_concref_r<T1,T2> a, sc_proxy<T3>& b )
03331 {
03332 return sc_concref_r<sc_concref_r<T1,T2>,T3>(
03333 *a.clone(), b.back_cast(), 1 );
03334 }
03335
03336
03337 template <class T1, class T2, class T3>
03338 inline
03339 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
03340 concat( sc_concref_r<T1,T2> a, sc_bitref<T3> b )
03341 {
03342 return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >(
03343 *a.clone(), *b.clone(), 3 );
03344 }
03345
03346 template <class T1, class T2, class T3>
03347 inline
03348 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
03349 concat( sc_concref<T1,T2> a, sc_bitref_r<T3> b )
03350 {
03351 return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >(
03352 *a.clone(), *b.clone(), 3 );
03353 }
03354
03355 template <class T1, class T2, class T3>
03356 inline
03357 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
03358 concat( sc_concref_r<T1,T2> a, sc_subref<T3> b )
03359 {
03360 return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >(
03361 *a.clone(), *b.clone(), 3 );
03362 }
03363
03364 template <class T1, class T2, class T3>
03365 inline
03366 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
03367 concat( sc_concref<T1,T2> a, sc_subref_r<T3> b )
03368 {
03369 return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >(
03370 *a.clone(), *b.clone(), 3 );
03371 }
03372
03373 template <class T1, class T2, class T3, class T4>
03374 inline
03375 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
03376 concat( sc_concref_r<T1,T2> a, sc_concref<T3,T4> b )
03377 {
03378 return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >(
03379 *a.clone(), *b.clone(), 3 );
03380 }
03381
03382 template <class T1, class T2, class T3, class T4>
03383 inline
03384 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
03385 concat( sc_concref<T1,T2> a, sc_concref_r<T3,T4> b )
03386 {
03387 return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >(
03388 *a.clone(), *b.clone(), 3 );
03389 }
03390
03391 template <class T1, class T2, class T3>
03392 inline
03393 sc_concref_r<sc_concref_r<T1,T2>,T3>
03394 concat( sc_concref<T1,T2> a, const sc_proxy<T3>& b )
03395 {
03396 return sc_concref_r<sc_concref_r<T1,T2>,T3>(
03397 *a.clone(), b.back_cast(), 1 );
03398 }
03399
03400 template <class T1, class T2, class T3>
03401 inline
03402 sc_concref_r<sc_concref_r<T1,T2>,T3>
03403 concat( sc_concref_r<T1,T2> a, sc_proxy<T3>& b )
03404 {
03405 return sc_concref_r<sc_concref_r<T1,T2>,T3>(
03406 *a.clone(), b.back_cast(), 1 );
03407 }
03408
03409 #endif
03410
03411
03412
03413
03414
03415
03416
03417
03418
03419
03420 template <class T1, class T2>
03421 inline
03422 void
03423 sc_concref<T1,T2>::scan( ::std::istream& is )
03424 {
03425 std::string s;
03426 is >> s;
03427 *this = s.c_str();
03428 }
03429
03430
03431
03432
03433 template <class T1, class T2, class T3>
03434 inline
03435 sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >
03436 operator , ( sc_concref<T1,T2> a, sc_bitref<T3> b )
03437 {
03438 return sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >(
03439 *a.clone(), *b.clone(), 3 );
03440 }
03441
03442 template <class T1, class T2, class T3>
03443 inline
03444 sc_concref<sc_concref<T1,T2>,sc_subref<T3> >
03445 operator , ( sc_concref<T1,T2> a, sc_subref<T3> b )
03446 {
03447 return sc_concref<sc_concref<T1,T2>,sc_subref<T3> >(
03448 *a.clone(), *b.clone(), 3 );
03449 }
03450
03451 template <class T1, class T2, class T3, class T4>
03452 inline
03453 sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >
03454 operator , ( sc_concref<T1,T2> a, sc_concref<T3,T4> b )
03455 {
03456 return sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >(
03457 *a.clone(), *b.clone(), 3 );
03458 }
03459
03460 template <class T1, class T2, class T3>
03461 inline
03462 sc_concref<sc_concref<T1,T2>,T3>
03463 operator , ( sc_concref<T1,T2> a, sc_proxy<T3>& b )
03464 {
03465 return sc_concref<sc_concref<T1,T2>,T3>(
03466 *a.clone(), b.back_cast(), 1 );
03467 }
03468
03469
03470 template <class T1, class T2, class T3>
03471 inline
03472 sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >
03473 concat( sc_concref<T1,T2> a, sc_bitref<T3> b )
03474 {
03475 return sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >(
03476 *a.clone(), *b.clone(), 3 );
03477 }
03478
03479 template <class T1, class T2, class T3>
03480 inline
03481 sc_concref<sc_concref<T1,T2>,sc_subref<T3> >
03482 concat( sc_concref<T1,T2> a, sc_subref<T3> b )
03483 {
03484 return sc_concref<sc_concref<T1,T2>,sc_subref<T3> >(
03485 *a.clone(), *b.clone(), 3 );
03486 }
03487
03488 template <class T1, class T2, class T3, class T4>
03489 inline
03490 sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >
03491 concat( sc_concref<T1,T2> a, sc_concref<T3,T4> b )
03492 {
03493 return sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >(
03494 *a.clone(), *b.clone(), 3 );
03495 }
03496
03497 template <class T1, class T2, class T3>
03498 inline
03499 sc_concref<sc_concref<T1,T2>,T3>
03500 concat( sc_concref<T1,T2> a, sc_proxy<T3>& b )
03501 {
03502 return sc_concref<sc_concref<T1,T2>,T3>(
03503 *a.clone(), b.back_cast(), 1 );
03504 }
03505
03506
03507 template <class X, class Y>
03508 inline
03509 ::std::istream&
03510 operator >> ( ::std::istream& is, sc_concref<X,Y> a )
03511 {
03512 a.scan( is );
03513 return is;
03514 }
03515
03516
03517
03518
03519
03520
03521
03522
03523
03524
03525
03526 template <class T1, class T2>
03527 inline
03528 sc_concref_r<T1,sc_bitref_r<T2> >
03529 operator , ( const sc_proxy<T1>& a, sc_bitref_r<T2> b )
03530 {
03531 return sc_concref_r<T1,sc_bitref_r<T2> >(
03532 a.back_cast(), *b.clone(), 2 );
03533 }
03534
03535 template <class T1, class T2>
03536 inline
03537 sc_concref_r<T1,sc_subref_r<T2> >
03538 operator , ( const sc_proxy<T1>& a, sc_subref_r<T2> b )
03539 {
03540 return sc_concref_r<T1,sc_subref_r<T2> >(
03541 a.back_cast(), *b.clone(), 2 );
03542 }
03543
03544 template <class T1, class T2, class T3>
03545 inline
03546 sc_concref_r<T1,sc_concref_r<T2,T3> >
03547 operator , ( const sc_proxy<T1>& a, sc_concref_r<T2,T3> b )
03548 {
03549 return sc_concref_r<T1,sc_concref_r<T2,T3> >(
03550 a.back_cast(), *b.clone(), 2 );
03551 }
03552
03553 template <class T1, class T2>
03554 inline
03555 sc_concref_r<T1,T2>
03556 operator , ( const sc_proxy<T1>& a, const sc_proxy<T2>& b )
03557 {
03558 return sc_concref_r<T1,T2>(
03559 a.back_cast(), b.back_cast() );
03560 }
03561
03562
03563 template <class T1, class T2>
03564 inline
03565 sc_concref_r<T1,sc_bitref_r<T2> >
03566 concat( const sc_proxy<T1>& a, sc_bitref_r<T2> b )
03567 {
03568 return sc_concref_r<T1,sc_bitref_r<T2> >(
03569 a.back_cast(), *b.clone(), 2 );
03570 }
03571
03572 template <class T1, class T2>
03573 inline
03574 sc_concref_r<T1,sc_subref_r<T2> >
03575 concat( const sc_proxy<T1>& a, sc_subref_r<T2> b )
03576 {
03577 return sc_concref_r<T1,sc_subref_r<T2> >(
03578 a.back_cast(), *b.clone(), 2 );
03579 }
03580
03581 template <class T1, class T2, class T3>
03582 inline
03583 sc_concref_r<T1,sc_concref_r<T2,T3> >
03584 concat( const sc_proxy<T1>& a, sc_concref_r<T2,T3> b )
03585 {
03586 return sc_concref_r<T1,sc_concref_r<T2,T3> >(
03587 a.back_cast(), *b.clone(), 2 );
03588 }
03589
03590 template <class T1, class T2>
03591 inline
03592 sc_concref_r<T1,T2>
03593 concat( const sc_proxy<T1>& a, const sc_proxy<T2>& b )
03594 {
03595 return sc_concref_r<T1,T2>(
03596 a.back_cast(), b.back_cast() );
03597 }
03598
03599
03600 #ifdef SC_DT_MIXED_COMMA_OPERATORS
03601
03602 template <class T1, class T2>
03603 inline
03604 sc_concref_r<T1,sc_bitref_r<T2> >
03605 operator , ( const sc_proxy<T1>& a, sc_bitref<T2> b )
03606 {
03607 return sc_concref_r<T1,sc_bitref_r<T2> >(
03608 a.back_cast(), *b.clone(), 2 );
03609 }
03610
03611 template <class T1, class T2>
03612 inline
03613 sc_concref_r<T1,sc_bitref_r<T2> >
03614 operator , ( sc_proxy<T1>& a, sc_bitref_r<T2> b )
03615 {
03616 return sc_concref_r<T1,sc_bitref_r<T2> >(
03617 a.back_cast(), *b.clone(), 2 );
03618 }
03619
03620 template <class T1, class T2>
03621 inline
03622 sc_concref_r<T1,sc_subref_r<T2> >
03623 operator , ( const sc_proxy<T1>& a, sc_subref<T2> b )
03624 {
03625 return sc_concref_r<T1,sc_subref_r<T2> >(
03626 a.back_cast(), *b.clone(), 2 );
03627 }
03628
03629 template <class T1, class T2>
03630 inline
03631 sc_concref_r<T1,sc_subref_r<T2> >
03632 operator , ( sc_proxy<T1>& a, sc_subref_r<T2> b )
03633 {
03634 return sc_concref_r<T1,sc_subref_r<T2> >(
03635 a.back_cast(), *b.clone(), 2 );
03636 }
03637
03638 template <class T1, class T2, class T3>
03639 inline
03640 sc_concref_r<T1,sc_concref_r<T2,T3> >
03641 operator , ( const sc_proxy<T1>& a, sc_concref<T2,T3> b )
03642 {
03643 return sc_concref_r<T1,sc_concref_r<T2,T3> >(
03644 a.back_cast(), *b.clone(), 2 );
03645 }
03646
03647 template <class T1, class T2, class T3>
03648 inline
03649 sc_concref_r<T1,sc_concref_r<T2,T3> >
03650 operator , ( sc_proxy<T1>& a, sc_concref_r<T2,T3> b )
03651 {
03652 return sc_concref_r<T1,sc_concref_r<T2,T3> >(
03653 a.back_cast(), *b.clone(), 2 );
03654 }
03655
03656 template <class T1, class T2>
03657 inline
03658 sc_concref_r<T1,T2>
03659 operator , ( const sc_proxy<T1>& a, sc_proxy<T2>& b )
03660 {
03661 return sc_concref_r<T1,T2>(
03662 a.back_cast(), b.back_cast() );
03663 }
03664
03665 template <class T1, class T2>
03666 inline
03667 sc_concref_r<T1,T2>
03668 operator , ( sc_proxy<T1>& a, const sc_proxy<T2>& b )
03669 {
03670 return sc_concref_r<T1,T2>(
03671 a.back_cast(), b.back_cast() );
03672 }
03673
03674
03675 template <class T1, class T2>
03676 inline
03677 sc_concref_r<T1,sc_bitref_r<T2> >
03678 concat( const sc_proxy<T1>& a, sc_bitref<T2> b )
03679 {
03680 return sc_concref_r<T1,sc_bitref_r<T2> >(
03681 a.back_cast(), *b.clone(), 2 );
03682 }
03683
03684 template <class T1, class T2>
03685 inline
03686 sc_concref_r<T1,sc_bitref_r<T2> >
03687 concat( sc_proxy<T1>& a, sc_bitref_r<T2> b )
03688 {
03689 return sc_concref_r<T1,sc_bitref_r<T2> >(
03690 a.back_cast(), *b.clone(), 2 );
03691 }
03692
03693 template <class T1, class T2>
03694 inline
03695 sc_concref_r<T1,sc_subref_r<T2> >
03696 concat( const sc_proxy<T1>& a, sc_subref<T2> b )
03697 {
03698 return sc_concref_r<T1,sc_subref_r<T2> >(
03699 a.back_cast(), *b.clone(), 2 );
03700 }
03701
03702 template <class T1, class T2>
03703 inline
03704 sc_concref_r<T1,sc_subref_r<T2> >
03705 concat( sc_proxy<T1>& a, sc_subref_r<T2> b )
03706 {
03707 return sc_concref_r<T1,sc_subref_r<T2> >(
03708 a.back_cast(), *b.clone(), 2 );
03709 }
03710
03711 template <class T1, class T2, class T3>
03712 inline
03713 sc_concref_r<T1,sc_concref_r<T2,T3> >
03714 concat( const sc_proxy<T1>& a, sc_concref<T2,T3> b )
03715 {
03716 return sc_concref_r<T1,sc_concref_r<T2,T3> >(
03717 a.back_cast(), *b.clone(), 2 );
03718 }
03719
03720 template <class T1, class T2, class T3>
03721 inline
03722 sc_concref_r<T1,sc_concref_r<T2,T3> >
03723 concat( sc_proxy<T1>& a, sc_concref_r<T2,T3> b )
03724 {
03725 return sc_concref_r<T1,sc_concref_r<T2,T3> >(
03726 a.back_cast(), *b.clone(), 2 );
03727 }
03728
03729 template <class T1, class T2>
03730 inline
03731 sc_concref_r<T1,T2>
03732 concat( const sc_proxy<T1>& a, sc_proxy<T2>& b )
03733 {
03734 return sc_concref_r<T1,T2>(
03735 a.back_cast(), b.back_cast() );
03736 }
03737
03738 template <class T1, class T2>
03739 inline
03740 sc_concref_r<T1,T2>
03741 concat( sc_proxy<T1>& a, const sc_proxy<T2>& b )
03742 {
03743 return sc_concref_r<T1,T2>(
03744 a.back_cast(), b.back_cast() );
03745 }
03746
03747 #endif
03748
03749
03750
03751
03752 template <class T1, class T2>
03753 inline
03754 sc_concref<T1,sc_bitref<T2> >
03755 operator , ( sc_proxy<T1>& a, sc_bitref<T2> b )
03756 {
03757 return sc_concref<T1,sc_bitref<T2> >(
03758 a.back_cast(), *b.clone(), 2 );
03759 }
03760
03761 template <class T1, class T2>
03762 inline
03763 sc_concref<T1,sc_subref<T2> >
03764 operator , ( sc_proxy<T1>& a, sc_subref<T2> b )
03765 {
03766 return sc_concref<T1,sc_subref<T2> >(
03767 a.back_cast(), *b.clone(), 2 );
03768 }
03769
03770 template <class T1, class T2, class T3>
03771 inline
03772 sc_concref<T1,sc_concref<T2,T3> >
03773 operator , ( sc_proxy<T1>& a, sc_concref<T2,T3> b )
03774 {
03775 return sc_concref<T1,sc_concref<T2,T3> >(
03776 a.back_cast(), *b.clone(), 2 );
03777 }
03778
03779 template <class T1, class T2>
03780 inline
03781 sc_concref<T1,T2>
03782 operator , ( sc_proxy<T1>& a, sc_proxy<T2>& b )
03783 {
03784 return sc_concref<T1,T2>(
03785 a.back_cast(), b.back_cast() );
03786 }
03787
03788
03789 template <class T1, class T2>
03790 inline
03791 sc_concref<T1,sc_bitref<T2> >
03792 concat( sc_proxy<T1>& a, sc_bitref<T2> b )
03793 {
03794 return sc_concref<T1,sc_bitref<T2> >(
03795 a.back_cast(), *b.clone(), 2 );
03796 }
03797
03798 template <class T1, class T2>
03799 inline
03800 sc_concref<T1,sc_subref<T2> >
03801 concat( sc_proxy<T1>& a, sc_subref<T2> b )
03802 {
03803 return sc_concref<T1,sc_subref<T2> >(
03804 a.back_cast(), *b.clone(), 2 );
03805 }
03806
03807 template <class T1, class T2, class T3>
03808 inline
03809 sc_concref<T1,sc_concref<T2,T3> >
03810 concat( sc_proxy<T1>& a, sc_concref<T2,T3> b )
03811 {
03812 return sc_concref<T1,sc_concref<T2,T3> >(
03813 a.back_cast(), *b.clone(), 2 );
03814 }
03815
03816 template <class T1, class T2>
03817 inline
03818 sc_concref<T1,T2>
03819 concat( sc_proxy<T1>& a, sc_proxy<T2>& b )
03820 {
03821 return sc_concref<T1,T2>(
03822 a.back_cast(), b.back_cast() );
03823 }
03824
03825 }
03826
03827
03828 #endif