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