sc_bit_proxies.h

Go to the documentation of this file.
00001 /*****************************************************************************
00002 
00003   The following code is derived, directly or indirectly, from the SystemC
00004   source code Copyright (c) 1996-2005 by all Contributors.
00005   All Rights reserved.
00006 
00007   The contents of this file are subject to the restrictions and limitations
00008   set forth in the SystemC Open Source License Version 2.4 (the "License");
00009   You may not use this file except in compliance with such restrictions and
00010   limitations. You may obtain instructions on how to receive a copy of the
00011   License at http://www.systemc.org/. Software distributed by Contributors
00012   under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
00013   ANY KIND, either express or implied. See the License for the specific
00014   language governing rights and limitations under the License.
00015 
00016  *****************************************************************************/
00017 
00018 /*****************************************************************************
00019 
00020   sc_bit_proxies.h -- Proxy classes for vector data types.
00021 
00022   Original Author: Gene Bushuyev, Synopsys, Inc.
00023 
00024  *****************************************************************************/
00025 
00026 /*****************************************************************************
00027 
00028   MODIFICATION LOG - modifiers, enter your name, affiliation, date and
00029   changes you are making here.
00030 
00031       Name, Affiliation, Date:
00032   Description of Modification:
00033 
00034  *****************************************************************************/
00035 
00036 #ifndef SC_BIT_PROXIES_H
00037 #define SC_BIT_PROXIES_H
00038 
00039 
00040 #include "sysc/datatypes/bit/sc_bit_ids.h"
00041 #include "sysc/datatypes/bit/sc_proxy.h"
00042 
00043 
00044 namespace sc_dt
00045 {
00046 
00047 // classes defined in this module
00048 template <class X> class sc_bitref_r;
00049 template <class X> class sc_bitref;
00050 template <class X> class sc_subref_r;
00051 template <class X> class sc_subref;
00052 template <class X, class Y> class sc_concref_r;
00053 template <class X, class Y> class sc_concref;
00054 
00055 
00056 // ----------------------------------------------------------------------------
00057 //  CLASS TEMPLATE : sc_bitref_r<T>
00058 //
00059 //  Proxy class for sc_proxy bit selection (r-value only).
00060 // ----------------------------------------------------------------------------
00061 
00062 template <class T>
00063 class sc_bitref_r
00064 {
00065     friend class sc_bv_base;
00066     friend class sc_lv_base;
00067 
00068 public:
00069 
00070     // constructor
00071 
00072     sc_bitref_r( const T& obj_, int index_ )
00073         : m_obj( CCAST<T&>( obj_ ) ), m_index( index_ )
00074         {}
00075 
00076 
00077     // copy constructor
00078 
00079     sc_bitref_r( const sc_bitref_r<T>& a )
00080         : m_obj( a.m_obj ), m_index( a.m_index )
00081         {}
00082 
00083 
00084     // cloning
00085 
00086     sc_bitref_r<T>* clone() const
00087         { return new sc_bitref_r<T>( *this ); }
00088 
00089 
00090     // bitwise operators and functions
00091 
00092     // bitwise complement
00093 
00094     const sc_logic operator ~ () const
00095         { return sc_logic( sc_logic::not_table[value()] ); }
00096 
00097 
00098     // implicit conversion to sc_logic
00099 
00100     operator const sc_logic() const
00101         { return sc_logic( m_obj.get_bit( m_index ) ); }
00102 
00103 
00104     // explicit conversions
00105 
00106     sc_logic_value_t value() const
00107         { return m_obj.get_bit( m_index ); }
00108 
00109 
00110     bool is_01() const
00111         { return sc_logic( value() ).is_01(); }
00112 
00113     bool to_bool() const
00114         { return sc_logic( value() ).to_bool(); }
00115 
00116     char to_char() const
00117         { return sc_logic( value() ).to_char(); }
00118 
00119 
00120     // common methods
00121 
00122     int length() const
00123         { return 1; }
00124 
00125     int size() const
00126         { return ( (length() - 1) / UL_SIZE + 1 ); }
00127 
00128     sc_logic_value_t get_bit( int n ) const;
00129 
00130     unsigned long get_word( int i ) const;
00131     unsigned long get_cword( int i ) const;
00132 
00133 
00134     // other methods
00135 
00136     void print( ::std::ostream& os = ::std::cout ) const
00137         { os << to_char(); }
00138 
00139 protected:
00140 
00141     T&  m_obj;
00142     int m_index;
00143 
00144 private:
00145 
00146     // disabled
00147     sc_bitref_r();
00148     sc_bitref_r<T>& operator = ( const sc_bitref_r<T>& );
00149 };
00150 
00151 
00152 // bitwise operators and functions
00153 
00154 // bitwise and
00155 
00156 template <class T1, class T2>
00157 inline
00158 const sc_logic
00159 operator & ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );
00160 
00161 
00162 // bitwise or
00163 
00164 template <class T1, class T2>
00165 inline
00166 const sc_logic
00167 operator | ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );
00168 
00169 
00170 // bitwise xor
00171 
00172 template <class T1, class T2>
00173 inline
00174 const sc_logic
00175 operator ^ ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );
00176 
00177 
00178 // relational operators and functions
00179 
00180 template <class T1, class T2>
00181 inline
00182 bool
00183 operator == ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );
00184 
00185 template <class T1, class T2>
00186 inline
00187 bool
00188 operator != ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );
00189 
00190 
00191 // r-value concatenation operators and functions
00192 
00193 template <class T1, class T2>
00194 inline
00195 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
00196 operator , ( sc_bitref_r<T1>, sc_bitref_r<T2> );
00197 
00198 template <class T1, class T2>
00199 inline
00200 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
00201 operator , ( sc_bitref_r<T1>, sc_subref_r<T2> );
00202 
00203 template <class T1, class T2, class T3>
00204 inline
00205 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
00206 operator , ( sc_bitref_r<T1>, sc_concref_r<T2,T3> );
00207 
00208 template <class T1, class T2>
00209 inline
00210 sc_concref_r<sc_bitref_r<T1>,T2>
00211 operator , ( sc_bitref_r<T1>, const sc_proxy<T2>& );
00212 
00213 template <class T>
00214 inline
00215 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00216 operator , ( sc_bitref_r<T>, const char* );
00217 
00218 template <class T>
00219 inline
00220 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00221 operator , ( const char*, sc_bitref_r<T> );
00222 
00223 template <class T>
00224 inline
00225 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00226 operator , ( sc_bitref_r<T>, const sc_logic& );
00227 
00228 template <class T>
00229 inline
00230 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00231 operator , ( const sc_logic&, sc_bitref_r<T> );
00232 
00233 template <class T>
00234 inline
00235 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00236 operator , ( sc_bitref_r<T>, bool );
00237 
00238 template <class T>
00239 inline
00240 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00241 operator , ( bool, sc_bitref_r<T> );
00242 
00243 
00244 template <class T1, class T2>
00245 inline
00246 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
00247 concat( sc_bitref_r<T1>, sc_bitref_r<T2> );
00248 
00249 template <class T1, class T2>
00250 inline
00251 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
00252 concat( sc_bitref_r<T1>, sc_subref_r<T2> );
00253 
00254 template <class T1, class T2, class T3>
00255 inline
00256 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
00257 concat( sc_bitref_r<T1>, sc_concref_r<T2,T3> );
00258 
00259 template <class T1, class T2>
00260 inline
00261 sc_concref_r<sc_bitref_r<T1>,T2>
00262 concat( sc_bitref_r<T1>, const sc_proxy<T2>& );
00263 
00264 template <class T>
00265 inline
00266 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00267 concat( sc_bitref_r<T>, const char* );
00268 
00269 template <class T>
00270 inline
00271 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00272 concat( const char*, sc_bitref_r<T> );
00273 
00274 template <class T>
00275 inline
00276 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00277 concat( sc_bitref_r<T>, const sc_logic& );
00278 
00279 template <class T>
00280 inline
00281 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00282 concat( const sc_logic&, sc_bitref_r<T> );
00283 
00284 template <class T>
00285 inline
00286 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00287 concat( sc_bitref_r<T>, bool );
00288 
00289 template <class T>
00290 inline
00291 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00292 concat( bool, sc_bitref_r<T> );
00293 
00294 
00295 #ifdef SC_DT_MIXED_COMMA_OPERATORS
00296 
00297 template <class T1, class T2>
00298 inline
00299 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
00300 operator , ( sc_bitref_r<T1>, sc_bitref<T2> );
00301 
00302 template <class T1, class T2>
00303 inline
00304 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
00305 operator , ( sc_bitref<T1>, sc_bitref_r<T2> );
00306 
00307 template <class T1, class T2>
00308 inline
00309 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
00310 operator , ( sc_bitref_r<T1>, sc_subref<T2> );
00311 
00312 template <class T1, class T2>
00313 inline
00314 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
00315 operator , ( sc_bitref<T1>, sc_subref_r<T2> );
00316 
00317 template <class T1, class T2, class T3>
00318 inline
00319 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
00320 operator , ( sc_bitref_r<T1>, sc_concref<T2,T3> );
00321 
00322 template <class T1, class T2, class T3>
00323 inline
00324 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
00325 operator , ( sc_bitref<T1>, sc_concref_r<T2,T3> );
00326 
00327 template <class T1, class T2>
00328 inline
00329 sc_concref_r<sc_bitref_r<T1>,T2>
00330 operator , ( sc_bitref<T1>, const sc_proxy<T2>& );
00331 
00332 template <class T1, class T2>
00333 inline
00334 sc_concref_r<sc_bitref_r<T1>,T2>
00335 operator , ( sc_bitref_r<T1>, sc_proxy<T2>& );
00336 
00337 template <class T>
00338 inline
00339 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00340 operator , ( sc_bitref<T>, const char* );
00341 
00342 template <class T>
00343 inline
00344 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00345 operator , ( const char*, sc_bitref<T> );
00346 
00347 template <class T>
00348 inline
00349 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00350 operator , ( sc_bitref<T>, const sc_logic& );
00351 
00352 template <class T>
00353 inline
00354 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00355 operator , ( const sc_logic&, sc_bitref<T> );
00356 
00357 template <class T>
00358 inline
00359 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00360 operator , ( sc_bitref<T>, bool );
00361 
00362 template <class T>
00363 inline
00364 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00365 operator , ( bool, sc_bitref<T> );
00366 
00367 
00368 template <class T1, class T2>
00369 inline
00370 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
00371 concat( sc_bitref_r<T1>, sc_bitref<T2> );
00372 
00373 template <class T1, class T2>
00374 inline
00375 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
00376 concat( sc_bitref<T1>, sc_bitref_r<T2> );
00377 
00378 template <class T1, class T2>
00379 inline
00380 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
00381 concat( sc_bitref_r<T1>, sc_subref<T2> );
00382 
00383 template <class T1, class T2>
00384 inline
00385 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
00386 concat( sc_bitref<T1>, sc_subref_r<T2> );
00387 
00388 template <class T1, class T2, class T3>
00389 inline
00390 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
00391 concat( sc_bitref_r<T1>, sc_concref<T2,T3> );
00392 
00393 template <class T1, class T2, class T3>
00394 inline
00395 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
00396 concat( sc_bitref<T1>, sc_concref_r<T2,T3> );
00397 
00398 template <class T1, class T2>
00399 inline
00400 sc_concref_r<sc_bitref_r<T1>,T2>
00401 concat( sc_bitref<T1>, const sc_proxy<T2>& );
00402 
00403 template <class T1, class T2>
00404 inline
00405 sc_concref_r<sc_bitref_r<T1>,T2>
00406 concat( sc_bitref_r<T1>, sc_proxy<T2>& );
00407 
00408 template <class T>
00409 inline
00410 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00411 concat( sc_bitref<T>, const char* );
00412 
00413 template <class T>
00414 inline
00415 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00416 concat( const char*, sc_bitref<T> );
00417 
00418 template <class T>
00419 inline
00420 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00421 concat( sc_bitref<T>, const sc_logic& );
00422 
00423 template <class T>
00424 inline
00425 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00426 concat( const sc_logic&, sc_bitref<T> );
00427 
00428 template <class T>
00429 inline
00430 sc_concref_r<sc_bitref_r<T>,sc_lv_base>
00431 concat( sc_bitref<T>, bool );
00432 
00433 template <class T>
00434 inline
00435 sc_concref_r<sc_lv_base,sc_bitref_r<T> >
00436 concat( bool, sc_bitref<T> );
00437 
00438 #endif
00439 
00440 
00441 // ----------------------------------------------------------------------------
00442 //  CLASS TEMPLATE : sc_bitref<X>
00443 //
00444 //  Proxy class for sc_proxy bit selection (r-value and l-value).
00445 // ----------------------------------------------------------------------------
00446 
00447 template <class X>
00448 class sc_bitref
00449     : public sc_bitref_r<X>
00450 {
00451     friend class sc_bv_base;
00452     friend class sc_lv_base;
00453 
00454 public:
00455 
00456     // constructor
00457 
00458     sc_bitref( X& obj_, int index_ )
00459         : sc_bitref_r<X>( obj_, index_ )
00460         {}
00461 
00462 
00463     // copy constructor
00464 
00465     sc_bitref( const sc_bitref<X>& a )
00466         : sc_bitref_r<X>( a )
00467         {}
00468 
00469 
00470     // cloning
00471 
00472     sc_bitref<X>* clone() const
00473         { return new sc_bitref<X>( *this ); }
00474 
00475 
00476     // assignment operators
00477 
00478     sc_bitref<X>& operator = ( const sc_bitref_r<X>& a );
00479     sc_bitref<X>& operator = ( const sc_bitref<X>& a );
00480 
00481     sc_bitref<X>& operator = ( const sc_logic& a )
00482         { this->m_obj.set_bit( this->m_index, a.value() ); return *this; }
00483 
00484     sc_bitref<X>& operator = ( sc_logic_value_t v )
00485         { *this = sc_logic( v ); return *this; }
00486 
00487     sc_bitref<X>& operator = ( bool a )
00488         { *this = sc_logic( a ); return *this; }
00489 
00490     sc_bitref<X>& operator = ( char a )
00491         { *this = sc_logic( a ); return *this; }
00492 
00493     sc_bitref<X>& operator = ( int a )
00494         { *this = sc_logic( a ); return *this; }
00495 
00496     sc_bitref<X>& operator = ( const sc_bit& a )
00497         { *this = sc_logic( a ); return *this; }
00498 
00499 
00500     // bitwise assignment operators
00501 
00502     sc_bitref<X>& operator &= ( const sc_bitref_r<X>& a );
00503     sc_bitref<X>& operator &= ( const sc_logic& a );
00504 
00505     sc_bitref<X>& operator &= ( sc_logic_value_t v )
00506         { *this &= sc_logic( v ); return *this; }
00507 
00508     sc_bitref<X>& operator &= ( bool a )
00509         { *this &= sc_logic( a ); return *this; }
00510 
00511     sc_bitref<X>& operator &= ( char a )
00512         { *this &= sc_logic( a ); return *this; }
00513 
00514     sc_bitref<X>& operator &= ( int a )
00515         { *this &= sc_logic( a ); return *this; }
00516 
00517 
00518     sc_bitref<X>& operator |= ( const sc_bitref_r<X>& a );
00519     sc_bitref<X>& operator |= ( const sc_logic& a );
00520 
00521     sc_bitref<X>& operator |= ( sc_logic_value_t v )
00522         { *this |= sc_logic( v ); return *this; }
00523 
00524     sc_bitref<X>& operator |= ( bool a )
00525         { *this |= sc_logic( a ); return *this; }
00526 
00527     sc_bitref<X>& operator |= ( char a )
00528         { *this |= sc_logic( a ); return *this; }
00529 
00530     sc_bitref<X>& operator |= ( int a )
00531         { *this |= sc_logic( a ); return *this; }
00532 
00533 
00534     sc_bitref<X>& operator ^= ( const sc_bitref_r<X>& a );
00535     sc_bitref<X>& operator ^= ( const sc_logic& a );
00536 
00537     sc_bitref<X>& operator ^= ( sc_logic_value_t v )
00538         { *this ^= sc_logic( v ); return *this; }
00539 
00540     sc_bitref<X>& operator ^= ( bool a )
00541         { *this ^= sc_logic( a ); return *this; }
00542 
00543     sc_bitref<X>& operator ^= ( char a )
00544         { *this ^= sc_logic( a ); return *this; }
00545 
00546     sc_bitref<X>& operator ^= ( int a )
00547         { *this ^= sc_logic( a ); return *this; }
00548 
00549 
00550     // bitwise operators and functions
00551 
00552     // bitwise complement
00553 
00554     sc_bitref<X>& b_not();
00555 
00556 
00557     // common methods
00558 
00559     void set_bit( int n, sc_logic_value_t value );
00560 
00561     void set_word( int i, unsigned long w );
00562     void set_cword( int i, unsigned long w );
00563 
00564     void clean_tail()
00565         { this->m_obj.clean_tail(); }
00566 
00567 
00568     // other methods
00569 
00570     void scan( ::std::istream& is = ::std::cin );
00571 
00572 private:
00573 
00574     // disabled
00575     sc_bitref();
00576 };
00577 
00578 
00579 // l-value concatenation operators and functions
00580 
00581 template <class T1, class T2>
00582 inline
00583 sc_concref<sc_bitref<T1>,sc_bitref<T2> >
00584 operator , ( sc_bitref<T1>, sc_bitref<T2> );
00585 
00586 template <class T1, class T2>
00587 inline
00588 sc_concref<sc_bitref<T1>,sc_subref<T2> >
00589 operator , ( sc_bitref<T1>, sc_subref<T2> );
00590 
00591 template <class T1, class T2, class T3>
00592 inline
00593 sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >
00594 operator , ( sc_bitref<T1>, sc_concref<T2,T3> );
00595 
00596 template <class T1, class T2>
00597 inline
00598 sc_concref<sc_bitref<T1>,T2>
00599 operator , ( sc_bitref<T1>, sc_proxy<T2>& );
00600 
00601 
00602 template <class T1, class T2>
00603 inline
00604 sc_concref<sc_bitref<T1>,sc_bitref<T2> >
00605 concat( sc_bitref<T1>, sc_bitref<T2> );
00606 
00607 template <class T1, class T2>
00608 inline
00609 sc_concref<sc_bitref<T1>,sc_subref<T2> >
00610 concat( sc_bitref<T1>, sc_subref<T2> );
00611 
00612 template <class T1, class T2, class T3>
00613 inline
00614 sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >
00615 concat( sc_bitref<T1>, sc_concref<T2,T3> );
00616 
00617 template <class T1, class T2>
00618 inline
00619 sc_concref<sc_bitref<T1>,T2>
00620 concat( sc_bitref<T1>, sc_proxy<T2>& );
00621 
00622 
00623 template <class T>
00624 ::std::istream&
00625 operator >> ( ::std::istream&, sc_bitref<T> );
00626 
00627 
00628 // ----------------------------------------------------------------------------
00629 //  CLASS TEMPLATE : sc_subref_r<X>
00630 //
00631 //  Proxy class for sc_proxy part selection (r-value only).
00632 // ----------------------------------------------------------------------------
00633 
00634 template <class X>
00635 class sc_subref_r
00636     : public sc_proxy<sc_subref_r<X> >
00637 {
00638     void check_bounds();
00639 
00640 public:
00641 
00642     // constructor
00643 
00644     sc_subref_r( const X& obj_, int hi_, int lo_ )
00645         : m_obj( CCAST<X&>( obj_ ) ), m_hi( hi_ ), m_lo( lo_ ), m_len( 0 )
00646         { check_bounds(); }
00647 
00648 
00649     // copy constructor
00650 
00651     sc_subref_r( const sc_subref_r<X>& a )
00652         : m_obj( a.m_obj ), m_hi( a.m_hi ), m_lo( a.m_lo ), m_len( a.m_len )
00653         {}
00654 
00655 
00656     // cloning
00657 
00658     sc_subref_r<X>* clone() const
00659         { return new sc_subref_r<X>( *this ); }
00660 
00661 
00662     // common methods
00663 
00664     int length() const
00665         { return m_len; }
00666 
00667     int size() const
00668         { return ( (length() - 1) / UL_SIZE + 1 ); }
00669 
00670     sc_logic_value_t get_bit( int n ) const;
00671     void set_bit( int n, sc_logic_value_t value );
00672 
00673     unsigned long get_word( int i )const;
00674     void set_word( int i, unsigned long w );
00675 
00676     unsigned long get_cword( int i ) const;
00677     void set_cword( int i, unsigned long w );
00678 
00679     void clean_tail()
00680         { m_obj.clean_tail(); }
00681 
00682 
00683     // other methods
00684 
00685     bool is_01() const;
00686 
00687     bool reversed() const
00688         { return m_lo > m_hi; }
00689 
00690 protected:
00691 
00692     mutable X& m_obj;
00693     int        m_hi;
00694     int        m_lo;
00695     int        m_len;
00696 
00697 private:
00698 
00699     // disabled
00700     sc_subref_r();
00701     sc_subref_r<X>& operator = ( const sc_subref_r<X>& );
00702 };
00703 
00704 
00705 // r-value concatenation operators and functions
00706 
00707 template <class T1, class T2>
00708 inline
00709 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
00710 operator , ( sc_subref_r<T1>, sc_bitref_r<T2> );
00711 
00712 template <class T1, class T2>
00713 inline
00714 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
00715 operator , ( sc_subref_r<T1>, sc_subref_r<T2> );
00716 
00717 template <class T1, class T2, class T3>
00718 inline
00719 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
00720 operator , ( sc_subref_r<T1>, sc_concref_r<T2,T3> );
00721 
00722 template <class T1, class T2>
00723 inline
00724 sc_concref_r<sc_subref_r<T1>,T2>
00725 operator , ( sc_subref_r<T1>, const sc_proxy<T2>& );
00726 
00727 template <class T>
00728 inline
00729 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00730 operator , ( sc_subref_r<T>, const char* );
00731 
00732 template <class T>
00733 inline
00734 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00735 operator , ( const char*, sc_subref_r<T> );
00736 
00737 template <class T>
00738 inline
00739 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00740 operator , ( sc_subref_r<T>, const sc_logic& );
00741 
00742 template <class T>
00743 inline
00744 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00745 operator , ( const sc_logic&, sc_subref_r<T> );
00746 
00747 template <class T>
00748 inline
00749 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00750 operator , ( sc_subref_r<T>, bool );
00751 
00752 template <class T>
00753 inline
00754 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00755 operator , ( bool, sc_subref_r<T> );
00756 
00757 
00758 template <class T1, class T2>
00759 inline
00760 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
00761 concat( sc_subref_r<T1>, sc_bitref_r<T2> );
00762 
00763 template <class T1, class T2>
00764 inline
00765 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
00766 concat( sc_subref_r<T1>, sc_subref_r<T2> );
00767 
00768 template <class T1, class T2, class T3>
00769 inline
00770 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
00771 concat( sc_subref_r<T1>, sc_concref_r<T2,T3> );
00772 
00773 template <class T1, class T2>
00774 inline
00775 sc_concref_r<sc_subref_r<T1>,T2>
00776 concat( sc_subref_r<T1>, const sc_proxy<T2>& );
00777 
00778 template <class T>
00779 inline
00780 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00781 concat( sc_subref_r<T>, const char* );
00782 
00783 template <class T>
00784 inline
00785 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00786 concat( const char*, sc_subref_r<T> );
00787 
00788 template <class T>
00789 inline
00790 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00791 concat( sc_subref_r<T>, const sc_logic& );
00792 
00793 template <class T>
00794 inline
00795 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00796 concat( const sc_logic&, sc_subref_r<T> );
00797 
00798 template <class T>
00799 inline
00800 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00801 concat( sc_subref_r<T>, bool );
00802 
00803 template <class T>
00804 inline
00805 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00806 concat( bool, sc_subref_r<T> );
00807 
00808 
00809 #ifdef SC_DT_MIXED_COMMA_OPERATORS
00810 
00811 template <class T1, class T2>
00812 inline
00813 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
00814 operator , ( sc_subref_r<T1>, sc_bitref<T2> );
00815 
00816 template <class T1, class T2>
00817 inline
00818 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
00819 operator , ( sc_subref<T1>, sc_bitref_r<T2> );
00820 
00821 template <class T1, class T2>
00822 inline
00823 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
00824 operator , ( sc_subref_r<T1>, sc_subref<T2> );
00825 
00826 template <class T1, class T2>
00827 inline
00828 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
00829 operator , ( sc_subref<T1>, sc_subref_r<T2> );
00830 
00831 template <class T1, class T2, class T3>
00832 inline
00833 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
00834 operator , ( sc_subref_r<T1>, sc_concref<T2,T3> );
00835 
00836 template <class T1, class T2, class T3>
00837 inline
00838 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
00839 operator , ( sc_subref<T1>, sc_concref_r<T2,T3> );
00840 
00841 template <class T1, class T2>
00842 inline
00843 sc_concref_r<sc_subref_r<T1>,T2>
00844 operator , ( sc_subref<T1>, const sc_proxy<T2>& );
00845 
00846 template <class T1, class T2>
00847 inline
00848 sc_concref_r<sc_subref_r<T1>,T2>
00849 operator , ( sc_subref_r<T1>, sc_proxy<T2>& );
00850 
00851 template <class T>
00852 inline
00853 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00854 operator , ( sc_subref<T>, const char* );
00855 
00856 template <class T>
00857 inline
00858 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00859 operator , ( const char*, sc_subref<T> );
00860 
00861 template <class T>
00862 inline
00863 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00864 operator , ( sc_subref<T>, const sc_logic& );
00865 
00866 template <class T>
00867 inline
00868 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00869 operator , ( const sc_logic&, sc_subref<T> );
00870 
00871 template <class T>
00872 inline
00873 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00874 operator , ( sc_subref<T>, bool );
00875 
00876 template <class T>
00877 inline
00878 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00879 operator , ( bool, sc_subref<T> );
00880 
00881 
00882 template <class T1, class T2>
00883 inline
00884 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
00885 concat( sc_subref_r<T1>, sc_bitref<T2> );
00886 
00887 template <class T1, class T2>
00888 inline
00889 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
00890 concat( sc_subref<T1>, sc_bitref_r<T2> );
00891 
00892 template <class T1, class T2>
00893 inline
00894 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
00895 concat( sc_subref_r<T1>, sc_subref<T2> );
00896 
00897 template <class T1, class T2>
00898 inline
00899 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
00900 concat( sc_subref<T1>, sc_subref_r<T2> );
00901 
00902 template <class T1, class T2, class T3>
00903 inline
00904 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
00905 concat( sc_subref_r<T1>, sc_concref<T2,T3> );
00906 
00907 template <class T1, class T2, class T3>
00908 inline
00909 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
00910 concat( sc_subref<T1>, sc_concref_r<T2,T3> );
00911 
00912 template <class T1, class T2>
00913 inline
00914 sc_concref_r<sc_subref_r<T1>,T2>
00915 concat( sc_subref<T1>, const sc_proxy<T2>& );
00916 
00917 template <class T1, class T2>
00918 inline
00919 sc_concref_r<sc_subref_r<T1>,T2>
00920 concat( sc_subref_r<T1>, sc_proxy<T2>& );
00921 
00922 template <class T>
00923 inline
00924 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00925 concat( sc_subref<T>, const char* );
00926 
00927 template <class T>
00928 inline
00929 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00930 concat( const char*, sc_subref<T> );
00931 
00932 template <class T>
00933 inline
00934 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00935 concat( sc_subref<T>, const sc_logic& );
00936 
00937 template <class T>
00938 inline
00939 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00940 concat( const sc_logic&, sc_subref<T> );
00941 
00942 template <class T>
00943 inline
00944 sc_concref_r<sc_subref_r<T>,sc_lv_base>
00945 concat( sc_subref<T>, bool );
00946 
00947 template <class T>
00948 inline
00949 sc_concref_r<sc_lv_base,sc_subref_r<T> >
00950 concat( bool, sc_subref<T> );
00951 
00952 #endif
00953 
00954 
00955 // ----------------------------------------------------------------------------
00956 //  CLASS TEMPLATE : sc_subref<X>
00957 //
00958 //  Proxy class for sc_proxy part selection (r-value and l-value).
00959 // ----------------------------------------------------------------------------
00960 
00961 template <class X>
00962 class sc_subref
00963     : public sc_subref_r<X>
00964 {
00965 public:
00966 
00967     // typedefs
00968 
00969     typedef sc_subref_r<X> base_type;
00970 
00971 
00972     // constructor
00973 
00974     sc_subref( X& obj_, int hi_, int lo_ )
00975         : sc_subref_r<X>( obj_, hi_, lo_ )
00976         {}
00977 
00978 
00979     // copy constructor
00980