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