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