Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

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-2004 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.3 (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 "systemc/datatypes/bit/sc_bit_ids.h"
00041 #include "systemc/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( ostream& os = 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( istream& is = 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 istream&
00625 operator >> ( 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 
00981     sc_subref( const sc_subref<X>& a )
00982   : sc_subref_r<X>( a )
00983   {}
00984 
00985 
00986     // cloning
00987 
00988     sc_subref<X>* clone() const
00989   { return new sc_subref<X>( *this ); }
00990 
00991 
00992     // assignment operators
00993 
00994     template <class Y>
00995     sc_subref<X>& operator = ( const sc_proxy<Y>& a )
00996   { base_type::assign_( a ); return *this; }
00997 
00998     sc_subref<X>& operator = ( const sc_subref_r<X>& a );
00999     sc_subref<X>& operator = ( const sc_subref<X>& a );
01000 
01001     sc_subref<X>& operator = ( const char* a )
01002   { base_type::assign_( a ); return *this; }
01003 
01004     sc_subref<X>& operator = ( const bool* a )
01005   { base_type::assign_( a ); return *this; }
01006 
01007     sc_subref<X>& operator = ( const sc_logic* a )
01008   { base_type::assign_( a ); return *this; }
01009 
01010     sc_subref<X>& operator = ( const sc_unsigned& a )
01011   { base_type::assign_( a ); return *this; }
01012 
01013     sc_subref<X>& operator = ( const sc_signed& a )
01014   { base_type::assign_( a ); return *this; }
01015 
01016     sc_subref<X>& operator = ( const sc_uint_base& a )
01017   { base_type::assign_( a ); return *this; }
01018 
01019     sc_subref<X>& operator = ( const sc_int_base& a )
01020   { base_type::assign_( a ); return *this; }
01021 
01022     sc_subref<X>& operator = ( unsigned long a )
01023   { base_type::assign_( a ); return *this; }
01024 
01025     sc_subref<X>& operator = ( long a )
01026   { base_type::assign_( a ); return *this; }
01027 
01028     sc_subref<X>& operator = ( unsigned int a )
01029   { base_type::assign_( a ); return *this; }
01030 
01031     sc_subref<X>& operator = ( int a )
01032   { base_type::assign_( a ); return *this; }
01033 
01034     sc_subref<X>& operator = ( uint64 a )
01035   { base_type::assign_( a ); return *this; }
01036 
01037     sc_subref<X>& operator = ( int64 a )
01038   { base_type::assign_( a ); return *this; }
01039 
01040 
01041     // other methods
01042 
01043     void scan( istream& = cin );
01044 
01045 private:
01046 
01047     // disabled
01048     sc_subref();
01049 };
01050 
01051 
01052 // l-value concatenation operators and functions
01053 
01054 template <class T1, class T2>
01055 inline
01056 sc_concref<sc_subref<T1>,sc_bitref<T2> >
01057 operator , ( sc_subref<T1>, sc_bitref<T2> );
01058 
01059 template <class T1, class T2>
01060 inline
01061 sc_concref<sc_subref<T1>,sc_subref<T2> >
01062 operator , ( sc_subref<T1>, sc_subref<T2> );
01063 
01064 template <class T1, class T2, class T3>
01065 inline
01066 sc_concref<sc_subref<T1>,sc_concref<T2,T3> >
01067 operator , ( sc_subref<T1>, sc_concref<T2,T3> );
01068 
01069 template <class T1, class T2>
01070 inline
01071 sc_concref<sc_subref<T1>,T2>
01072 operator , ( sc_subref<T1>, sc_proxy<T2>& );
01073 
01074 
01075 template <class T1, class T2>
01076 inline
01077 sc_concref<sc_subref<T1>,sc_bitref<T2> >
01078 concat( sc_subref<T1>, sc_bitref<T2> );
01079 
01080 template <class T1, class T2>
01081 inline
01082 sc_concref<sc_subref<T1>,sc_subref<T2> >
01083 concat( sc_subref<T1>, sc_subref<T2> );
01084 
01085 template <class T1, class T2, class T3>
01086 inline
01087 sc_concref<sc_subref<T1>,sc_concref<T2,T3> >
01088 concat( sc_subref<T1>, sc_concref<T2,T3> );
01089 
01090 template <class T1, class T2>
01091 inline
01092 sc_concref<sc_subref<T1>,T2>
01093 concat( sc_subref<T1>, sc_proxy<T2>& );
01094 
01095 
01096 template <class T>
01097 inline
01098 istream&
01099 operator >> ( istream&, sc_subref<T> );
01100 
01101 
01102 // ----------------------------------------------------------------------------
01103 //  CLASS TEMPLATE : sc_concref_r<X,Y>
01104 //
01105 //  Proxy class for sc_proxy concatenation (r-value only).
01106 // ----------------------------------------------------------------------------
01107 
01108 template <class X, class Y>
01109 class sc_concref_r
01110     : public sc_proxy<sc_concref_r<X,Y> >
01111 {
01112 public:
01113 
01114     // constructor
01115 
01116     sc_concref_r( const X& left_, const Y& right_, int delete_ = 0 )
01117   : m_left( CCAST<X&>( left_ ) ), m_right( CCAST<Y&>( right_ ) ),
01118     m_delete( delete_ ), m_refs( *new int( 1 ) )
01119   {}
01120 
01121 
01122     // copy constructor
01123 
01124     sc_concref_r( const sc_concref_r<X,Y>& a )
01125   : m_left( a.m_left ), m_right( a.m_right ),
01126     m_delete( a.m_delete ), m_refs( a.m_refs )
01127   { ++ m_refs; }
01128 
01129 
01130     // destructor
01131 
01132     virtual ~sc_concref_r();
01133 
01134 
01135     // cloning
01136 
01137     sc_concref_r<X,Y>* clone() const
01138   { return new sc_concref_r<X,Y>( *this ); }
01139 
01140 
01141     // common methods
01142 
01143     int length() const
01144   { return ( m_left.length() + m_right.length() ); }
01145 
01146     int size() const
01147   { return ( (length() - 1) / UL_SIZE + 1 ); }
01148 
01149     sc_logic_value_t get_bit( int n ) const;
01150     void set_bit( int n, sc_logic_value_t value );
01151 
01152     unsigned long get_word( int i ) const;
01153     void set_word( int i, unsigned long w );
01154 
01155     unsigned long get_cword( int i ) const;
01156     void set_cword( int i, unsigned long w );
01157 
01158     void clean_tail()
01159   { m_left.clean_tail(); m_right.clean_tail(); }
01160 
01161 
01162     // other methods
01163 
01164     bool is_01() const
01165   { return ( m_left.is_01() && m_right.is_01() ); }
01166 
01167 protected:
01168 
01169     mutable X&   m_left;
01170     mutable Y&   m_right;
01171     mutable int  m_delete;
01172     mutable int& m_refs;
01173 
01174 private:
01175 
01176     // disabled
01177     sc_concref_r();
01178     sc_concref_r<X,Y>& operator = ( const sc_concref_r<X,Y>& );
01179 };
01180 
01181 
01182 // r-value concatenation operators and functions
01183 
01184 template <class T1, class T2, class T3>
01185 inline
01186 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
01187 operator , ( sc_concref_r<T1,T2>, sc_bitref_r<T3> );
01188 
01189 template <class T1, class T2, class T3>
01190 inline
01191 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
01192 operator , ( sc_concref_r<T1,T2>, sc_subref_r<T3> );
01193 
01194 template <class T1, class T2, class T3, class T4>
01195 inline
01196 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
01197 operator , ( sc_concref_r<T1,T2>, sc_concref_r<T3,T4> );
01198 
01199 template <class T1, class T2, class T3>
01200 inline
01201 sc_concref_r<sc_concref_r<T1,T2>,T3>
01202 operator , ( sc_concref_r<T1,T2>, const sc_proxy<T3>& );
01203 
01204 template <class T1, class T2>
01205 inline
01206 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01207 operator , ( sc_concref_r<T1,T2>, const char* );
01208 
01209 template <class T1, class T2>
01210 inline
01211 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01212 operator , ( const char*, sc_concref_r<T1,T2> );
01213 
01214 template <class T1, class T2>
01215 inline
01216 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01217 operator , ( sc_concref_r<T1,T2>, const sc_logic& );
01218 
01219 template <class T1, class T2>
01220 inline
01221 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01222 operator , ( const sc_logic&, sc_concref_r<T1,T2> );
01223 
01224 template <class T1, class T2>
01225 inline
01226 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01227 operator , ( sc_concref_r<T1,T2>, bool );
01228 
01229 template <class T1, class T2>
01230 inline
01231 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01232 operator , ( bool, sc_concref_r<T1,T2> );
01233 
01234 
01235 template <class T1, class T2, class T3>
01236 inline
01237 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
01238 concat( sc_concref_r<T1,T2>, sc_bitref_r<T3> );
01239 
01240 template <class T1, class T2, class T3>
01241 inline
01242 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
01243 concat( sc_concref_r<T1,T2>, sc_subref_r<T3> );
01244 
01245 template <class T1, class T2, class T3, class T4>
01246 inline
01247 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
01248 concat( sc_concref_r<T1,T2>, sc_concref_r<T3,T4> );
01249 
01250 template <class T1, class T2, class T3>
01251 inline
01252 sc_concref_r<sc_concref_r<T1,T2>,T3>
01253 concat( sc_concref_r<T1,T2>, const sc_proxy<T3>& );
01254 
01255 template <class T1, class T2>
01256 inline
01257 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01258 concat( sc_concref_r<T1,T2>, const char* );
01259 
01260 template <class T1, class T2>
01261 inline
01262 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01263 concat( const char*, sc_concref_r<T1,T2> );
01264 
01265 template <class T1, class T2>
01266 inline
01267 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01268 concat( sc_concref_r<T1,T2>, const sc_logic& );
01269 
01270 template <class T1, class T2>
01271 inline
01272 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01273 concat( const sc_logic&, sc_concref_r<T1,T2> );
01274 
01275 template <class T1, class T2>
01276 inline
01277 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01278 concat( sc_concref_r<T1,T2>, bool );
01279 
01280 template <class T1, class T2>
01281 inline
01282 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01283 concat( bool, sc_concref_r<T1,T2> );
01284 
01285 
01286 #ifdef SC_DT_MIXED_COMMA_OPERATORS
01287 
01288 template <class T1, class T2, class T3>
01289 inline
01290 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
01291 operator , ( sc_concref_r<T1,T2>, sc_bitref<T3> );
01292 
01293 template <class T1, class T2, class T3>
01294 inline
01295 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
01296 operator , ( sc_concref<T1,T2>, sc_bitref_r<T3> );
01297 
01298 template <class T1, class T2, class T3>
01299 inline
01300 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
01301 operator , ( sc_concref_r<T1,T2>, sc_subref<T3> );
01302 
01303 template <class T1, class T2, class T3>
01304 inline
01305 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
01306 operator , ( sc_concref<T1,T2>, sc_subref_r<T3> );
01307 
01308 template <class T1, class T2, class T3, class T4>
01309 inline
01310 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
01311 operator , ( sc_concref_r<T1,T2>, sc_concref<T3,T4> );
01312 
01313 template <class T1, class T2, class T3, class T4>
01314 inline
01315 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
01316 operator , ( sc_concref<T1,T2>, sc_concref_r<T3,T4> );
01317 
01318 template <class T1, class T2, class T3>
01319 inline
01320 sc_concref_r<sc_concref_r<T1,T2>,T3>
01321 operator , ( sc_concref<T1,T2>, const sc_proxy<T3>& );
01322 
01323 template <class T1, class T2, class T3>
01324 inline
01325 sc_concref_r<sc_concref_r<T1,T2>,T3>
01326 operator , ( sc_concref_r<T1,T2>, sc_proxy<T3>& );
01327 
01328 template <class T1, class T2>
01329 inline
01330 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01331 operator , ( sc_concref<T1,T2>, const char* );
01332 
01333 template <class T1, class T2>
01334 inline
01335 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01336 operator , ( const char*, sc_concref<T1,T2> );
01337 
01338 template <class T1, class T2>
01339 inline
01340 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01341 operator , ( sc_concref<T1,T2>, const sc_logic& );
01342 
01343 template <class T1, class T2>
01344 inline
01345 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01346 operator , ( const sc_logic&, sc_concref<T1,T2> );
01347 
01348 template <class T1, class T2>
01349 inline
01350 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01351 operator , ( sc_concref<T1,T2>, bool );
01352 
01353 template <class T1, class T2>
01354 inline
01355 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01356 operator , ( bool, sc_concref<T1,T2> );
01357 
01358 
01359 template <class T1, class T2, class T3>
01360 inline
01361 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
01362 concat( sc_concref_r<T1,T2>, sc_bitref<T3> );
01363 
01364 template <class T1, class T2, class T3>
01365 inline
01366 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
01367 concat( sc_concref<T1,T2>, sc_bitref_r<T3> );
01368 
01369 template <class T1, class T2, class T3>
01370 inline
01371 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
01372 concat( sc_concref_r<T1,T2>, sc_subref<T3> );
01373 
01374 template <class T1, class T2, class T3>
01375 inline
01376 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
01377 concat( sc_concref<T1,T2>, sc_subref_r<T3> );
01378 
01379 template <class T1, class T2, class T3, class T4>
01380 inline
01381 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
01382 concat( sc_concref_r<T1,T2>, sc_concref<T3,T4> );
01383 
01384 template <class T1, class T2, class T3, class T4>
01385 inline
01386 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
01387 concat( sc_concref<T1,T2>, sc_concref_r<T3,T4> );
01388 
01389 template <class T1, class T2, class T3>
01390 inline
01391 sc_concref_r<sc_concref_r<T1,T2>,T3>
01392 concat( sc_concref<T1,T2>, const sc_proxy<T3>& );
01393 
01394 template <class T1, class T2, class T3>
01395 inline
01396 sc_concref_r<sc_concref_r<T1,T2>,T3>
01397 concat( sc_concref_r<T1,T2>, sc_proxy<T3>& );
01398 
01399 template <class T1, class T2>
01400 inline
01401 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01402 concat( sc_concref<T1,T2>, const char* );
01403 
01404 template <class T1, class T2>
01405 inline
01406 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01407 concat( const char*, sc_concref<T1,T2> );
01408 
01409 template <class T1, class T2>
01410 inline
01411 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01412 concat( sc_concref<T1,T2>, const sc_logic& );
01413 
01414 template <class T1, class T2>
01415 inline
01416 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01417 concat( const sc_logic&, sc_concref<T1,T2> );
01418 
01419 template <class T1, class T2>
01420 inline
01421 sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base>
01422 concat( sc_concref<T1,T2>, bool );
01423 
01424 template <class T1, class T2>
01425 inline
01426 sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> >
01427 concat( bool, sc_concref<T1,T2> );
01428 
01429 #endif
01430 
01431 
01432 // ----------------------------------------------------------------------------
01433 //  CLASS TEMPLATE : sc_concref<X,Y>
01434 //
01435 //  Proxy class for sc_proxy concatenation (r-value and l-value).
01436 // ----------------------------------------------------------------------------
01437 
01438 template <class X, class Y>
01439 class sc_concref
01440     : public sc_concref_r<X,Y>
01441 {
01442 public:
01443 
01444     // typedefs
01445 
01446     typedef sc_concref_r<X,Y> base_type;
01447 
01448 
01449     // constructor
01450 
01451     sc_concref( X& left_, Y& right_, int delete_ = 0 )
01452   : sc_concref_r<X,Y>( left_, right_, delete_ )
01453   {}
01454 
01455 
01456     // copy constructor
01457 
01458     sc_concref( const sc_concref<X,Y>& a )
01459   : sc_concref_r<X,Y>( a )
01460   {}
01461 
01462 
01463     // cloning
01464 
01465     sc_concref<X,Y>* clone() const
01466   { return new sc_concref<X,Y>( *this ); }
01467 
01468 
01469     // assignment operators
01470 
01471     template <class Z>
01472     sc_concref<X,Y>& operator = ( const sc_proxy<Z>& a )
01473         { base_type::assign_( a ); return *this; }
01474 
01475     sc_concref<X,Y>& operator = ( const sc_concref<X,Y>& a )
01476   { base_type::assign_( a ); return *this; }
01477 
01478     sc_concref<X,Y>& operator = ( const char* a )
01479   { base_type::assign_( a ); return *this; }
01480 
01481     sc_concref<X,Y>& operator = ( const bool* a )
01482   { base_type::assign_( a ); return *this; }
01483 
01484     sc_concref<X,Y>& operator = ( const sc_logic* a )
01485   { base_type::assign_( a ); return *this; }
01486 
01487     sc_concref<X,Y>& operator = ( const sc_unsigned& a )
01488   { base_type::assign_( a ); return *this; }
01489 
01490     sc_concref<X,Y>& operator = ( const sc_signed& a )
01491   { base_type::assign_( a ); return *this; }
01492 
01493     sc_concref<X,Y>& operator = ( const sc_uint_base& a )
01494   { base_type::assign_( a ); return *this; }
01495 
01496     sc_concref<X,Y>& operator = ( const sc_int_base& a )
01497   { base_type::assign_( a ); return *this; }
01498 
01499     sc_concref<X,Y>& operator = ( unsigned long a )
01500   { base_type::assign_( a ); return *this; }
01501 
01502     sc_concref<X,Y>& operator = ( long a )
01503   { base_type::assign_( a ); return *this; }
01504 
01505     sc_concref<X,Y>& operator = ( unsigned int a )
01506   { base_type::assign_( a ); return *this; }
01507 
01508     sc_concref<X,Y>& operator = ( int a )
01509   { base_type::assign_( a ); return *this; }
01510 
01511     sc_concref<X,Y>& operator = ( uint64 a )
01512   { base_type::assign_( a ); return *this; }
01513 
01514     sc_concref<X,Y>& operator = ( int64 a )
01515   { base_type::assign_( a ); return *this; }
01516 
01517 
01518     // other methods
01519 
01520     void scan( istream& = cin );
01521 
01522 private:
01523 
01524     // disabled
01525     sc_concref();
01526 };
01527 
01528 
01529 // l-value concatenation operators and functions
01530 
01531 template <class T1, class T2, class T3>
01532 inline
01533 sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >
01534 operator , ( sc_concref<T1,T2>, sc_bitref<T3> );
01535 
01536 template <class T1, class T2, class T3>
01537 inline
01538 sc_concref<sc_concref<T1,T2>,sc_subref<T3> >
01539 operator , ( sc_concref<T1,T2>, sc_subref<T3> );
01540 
01541 template <class T1, class T2, class T3, class T4>
01542 inline
01543 sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >
01544 operator , ( sc_concref<T1,T2>, sc_concref<T3,T4> );
01545 
01546 template <class T1, class T2, class T3>
01547 inline
01548 sc_concref<sc_concref<T1,T2>,T3>
01549 operator , ( sc_concref<T1,T2>, sc_proxy<T3>& );
01550 
01551 
01552 template <class T1, class T2, class T3>
01553 inline
01554 sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >
01555 concat( sc_concref<T1,T2>, sc_bitref<T3> );
01556 
01557 template <class T1, class T2, class T3>
01558 inline
01559 sc_concref<sc_concref<T1,T2>,sc_subref<T3> >
01560 concat( sc_concref<T1,T2>, sc_subref<T3> );
01561 
01562 template <class T1, class T2, class T3, class T4>
01563 inline
01564 sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >
01565 concat( sc_concref<T1,T2>, sc_concref<T3,T4> );
01566 
01567 template <class T1, class T2, class T3>
01568 inline
01569 sc_concref<sc_concref<T1,T2>,T3>
01570 concat( sc_concref<T1,T2>, sc_proxy<T3>& );
01571 
01572 
01573 template <class T1, class T2>
01574 inline
01575 istream&
01576 operator >> ( istream&, sc_concref<T1,T2> );
01577 
01578 
01579 // ----------------------------------------------------------------------------
01580 //  CLASS TEMPLATE : sc_proxy<T>
01581 //
01582 //  Base class template for bit/logic vector classes.
01583 //  (Barton/Nackmann implementation)
01584 // ----------------------------------------------------------------------------
01585 
01586 // r-value concatenation operators and functions
01587 
01588 template <class T1, class T2>
01589 inline
01590 sc_concref_r<T1,sc_bitref_r<T2> >
01591 operator , ( const sc_proxy<T1>&, sc_bitref_r<T2> );
01592 
01593 template <class T1, class T2>
01594 inline
01595 sc_concref_r<T1,sc_subref_r<T2> >
01596 operator , ( const sc_proxy<T1>&, sc_subref_r<T2> );
01597 
01598 template <class T1, class T2, class T3>
01599 inline
01600 sc_concref_r<T1,sc_concref_r<T2,T3> >
01601 operator , ( const sc_proxy<T1>&, sc_concref_r<T2,T3> );
01602 
01603 template <class T1, class T2>
01604 inline
01605 sc_concref_r<T1,T2>
01606 operator , ( const sc_proxy<T1>&, const sc_proxy<T2>& );
01607 
01608 template <class T>
01609 inline
01610 sc_concref_r<T,sc_lv_base>
01611 operator , ( const sc_proxy<T>&, const char* );
01612 
01613 template <class T>
01614 inline
01615 sc_concref_r<sc_lv_base,T>
01616 operator , ( const char*, const sc_proxy<T>& );
01617 
01618 template <class T>
01619 inline
01620 sc_concref_r<T,sc_lv_base>
01621 operator , ( const sc_proxy<T>&, const sc_logic& );
01622 
01623 template <class T>
01624 inline
01625 sc_concref_r<sc_lv_base,T>
01626 operator , ( const sc_logic&, const sc_proxy<T>& );
01627 
01628 template <class T>
01629 inline
01630 sc_concref_r<T,sc_lv_base>
01631 operator , ( const sc_proxy<T>&, bool );
01632 
01633 template <class T>
01634 inline
01635 sc_concref_r<sc_lv_base,T>
01636 operator , ( bool, const sc_proxy<T>& );
01637 
01638 
01639 template <class T1, class T2>
01640 inline
01641 sc_concref_r<T1,sc_bitref_r<T2> >
01642 concat( const sc_proxy<T1>&, sc_bitref_r<T2> );
01643 
01644 template <class T1, class T2>
01645 inline
01646 sc_concref_r<T1,sc_subref_r<T2> >
01647 concat( const sc_proxy<T1>&, sc_subref_r<T2> );
01648 
01649 template <class T1, class T2, class T3>
01650 inline
01651 sc_concref_r<T1,sc_concref_r<T2,T3> >
01652 concat( const sc_proxy<T1>&, sc_concref_r<T2,T3> );
01653 
01654 template <class T1, class T2>
01655 inline
01656 sc_concref_r<T1,T2>
01657 concat( const sc_proxy<T1>&, const sc_proxy<T2>& );
01658 
01659 template <class T>
01660 inline
01661 sc_concref_r<T,sc_lv_base>
01662 concat( const sc_proxy<T>&, const char* );
01663 
01664 template <class T>
01665 inline
01666 sc_concref_r<sc_lv_base,T>
01667 concat( const char*, const sc_proxy<T>& );
01668 
01669 template <class T>
01670 inline
01671 sc_concref_r<T,sc_lv_base>
01672 concat( const sc_proxy<T>&, const sc_logic& );
01673 
01674 template <class T>
01675 inline
01676 sc_concref_r<sc_lv_base,T>
01677 concat( const sc_logic&, const sc_proxy<T>& );
01678 
01679 template <class T>
01680 inline
01681 sc_concref_r<T,sc_lv_base>
01682 concat( const sc_proxy<T>&, bool );
01683 
01684 template <class T>
01685 inline
01686 sc_concref_r<sc_lv_base,T>
01687 concat( bool, const sc_proxy<T>& );
01688 
01689 
01690 #ifdef SC_DT_MIXED_COMMA_OPERATORS
01691 
01692 template <class T1, class T2>
01693 inline
01694 sc_concref_r<T1,sc_bitref_r<T2> >
01695 operator , ( const sc_proxy<T1>&, sc_bitref<T2> );
01696 
01697 template <class T1, class T2>
01698 inline
01699 sc_concref_r<T1,sc_bitref_r<T2> >
01700 operator , ( sc_proxy<T1>&, sc_bitref_r<T2> );
01701 
01702 template <class T1, class T2>
01703 inline
01704 sc_concref_r<T1,sc_subref_r<T2> >
01705 operator , ( const sc_proxy<T1>&, sc_subref<T2> );
01706 
01707 template <class T1, class T2>
01708 inline
01709 sc_concref_r<T1,sc_subref_r<T2> >
01710 operator , ( sc_proxy<T1>&, sc_subref_r<T2> );
01711 
01712 template <class T1, class T2, class T3>
01713 inline
01714 sc_concref_r<T1,sc_concref_r<T2,T3> >
01715 operator , ( const sc_proxy<T1>&, sc_concref<T2,T3> );
01716 
01717 template <class T1, class T2, class T3>
01718 inline
01719 sc_concref_r<T1,sc_concref_r<T2,T3> >
01720 operator , ( sc_proxy<T1>&, sc_concref_r<T2,T3> );
01721 
01722 template <class T1, class T2>
01723 inline
01724 sc_concref_r<T1,T2>
01725 operator , ( const sc_proxy<T1>&, sc_proxy<T2>& );
01726 
01727 template <class T1, class T2>
01728 inline
01729 sc_concref_r<T1,T2>
01730 operator , ( sc_proxy<T1>&, const sc_proxy<T2>& );
01731 
01732 template <class T>
01733 inline
01734 sc_concref_r<T,sc_lv_base>
01735 operator , ( sc_proxy<T>&, const char* );
01736 
01737 template <class T>
01738 inline
01739 sc_concref_r<sc_lv_base,T>
01740 operator , ( const char*, sc_proxy<T>& );
01741 
01742 template <class T>
01743 inline
01744 sc_concref_r<T,sc_lv_base>
01745 operator , ( sc_proxy<T>&, const sc_logic& );
01746 
01747 template <class T>
01748 inline
01749 sc_concref_r<sc_lv_base,T>
01750 operator , ( const sc_logic&, sc_proxy<T>& );
01751 
01752 template <class T>
01753 inline
01754 sc_concref_r<T,sc_lv_base>
01755 operator , ( sc_proxy<T>&, bool );
01756 
01757 template <class T>
01758 inline
01759 sc_concref_r<sc_lv_base,T>
01760 operator , ( bool, sc_proxy<T>& );
01761 
01762 
01763 template <class T1, class T2>
01764 inline
01765 sc_concref_r<T1,sc_bitref_r<T2> >
01766 concat( const sc_proxy<T1>&, sc_bitref<T2> );
01767 
01768 template <class T1, class T2>
01769 inline
01770 sc_concref_r<T1,sc_bitref_r<T2> >
01771 concat( sc_proxy<T1>&, sc_bitref_r<T2> );
01772 
01773 template <class T1, class T2>
01774 inline
01775 sc_concref_r<T1,sc_subref_r<T2> >
01776 concat( const sc_proxy<T1>&, sc_subref<T2> );
01777 
01778 template <class T1, class T2>
01779 inline
01780 sc_concref_r<T1,sc_subref_r<T2> >
01781 concat( sc_proxy<T1>&, sc_subref_r<T2> );
01782 
01783 template <class T1, class T2, class T3>
01784 inline
01785 sc_concref_r<T1,sc_concref_r<T2,T3> >
01786 concat( const sc_proxy<T1>&, sc_concref<T2,T3> );
01787 
01788 template <class T1, class T2, class T3>
01789 inline
01790 sc_concref_r<T1,sc_concref_r<T2,T3> >
01791 concat( sc_proxy<T1>&, sc_concref_r<T2,T3> );
01792 
01793 template <class T1, class T2>
01794 inline
01795 sc_concref_r<T1,T2>
01796 concat( const sc_proxy<T1>&, sc_proxy<T2>& );
01797 
01798 template <class T1, class T2>
01799 inline
01800 sc_concref_r<T1,T2>
01801 concat( sc_proxy<T1>&, const sc_proxy<T2>& );
01802 
01803 template <class T>
01804 inline
01805 sc_concref_r<T,sc_lv_base>
01806 concat( sc_proxy<T>&, const char* );
01807 
01808 template <class T>
01809 inline
01810 sc_concref_r<sc_lv_base,T>
01811 concat( const char*, sc_proxy<T>& );
01812 
01813 template <class T>
01814 inline
01815 sc_concref_r<T,sc_lv_base>
01816 concat( sc_proxy<T>&, const sc_logic& );
01817 
01818 template <class T>
01819 inline
01820 sc_concref_r<sc_lv_base,T>
01821 concat( const sc_logic&, sc_proxy<T>& );
01822 
01823 template <class T>
01824 inline
01825 sc_concref_r<T,sc_lv_base>
01826 concat( sc_proxy<T>&, bool );
01827 
01828 template <class T>
01829 inline
01830 sc_concref_r<sc_lv_base,T>
01831 concat( bool, sc_proxy<T>& );
01832 
01833 #endif
01834 
01835 
01836 // l-value concatenation operators and functions
01837 
01838 template <class T1, class T2>
01839 inline
01840 sc_concref<T1,sc_bitref<T2> >
01841 operator , ( sc_proxy<T1>&, sc_bitref<T2> );
01842 
01843 template <class T1, class T2>
01844 inline
01845 sc_concref<T1,sc_subref<T2> >
01846 operator , ( sc_proxy<T1>&, sc_subref<T2> );
01847 
01848 template <class T1, class T2, class T3>
01849 inline
01850 sc_concref<T1,sc_concref<T2,T3> >
01851 operator , ( sc_proxy<T1>&, sc_concref<T2,T3> );
01852 
01853 template <class T1, class T2>
01854 inline
01855 sc_concref<T1,T2>
01856 operator , ( sc_proxy<T1>&, sc_proxy<T2>& );
01857 
01858 
01859 template <class T1, class T2>
01860 inline
01861 sc_concref<T1,sc_bitref<T2> >
01862 concat( sc_proxy<T1>&, sc_bitref<T2> );
01863 
01864 template <class T1, class T2>
01865 inline
01866 sc_concref<T1,sc_subref<T2> >
01867 concat( sc_proxy<T1>&, sc_subref<T2> );
01868 
01869 template <class T1, class T2, class T3>
01870 inline
01871 sc_concref<T1,sc_concref<T2,T3> >
01872 concat( sc_proxy<T1>&, sc_concref<T2,T3> );
01873 
01874 template <class T1, class T2>
01875 inline
01876 sc_concref<T1,T2>
01877 concat( sc_proxy<T1>&, sc_proxy<T2>& );
01878 
01879 
01880 // IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
01881 
01882 // ----------------------------------------------------------------------------
01883 //  CLASS TEMPLATE : sc_bitref_r<T>
01884 //
01885 //  Proxy class for sc_proxy bit selection (r-value only).
01886 // ----------------------------------------------------------------------------
01887 
01888 // bitwise operators and functions
01889 
01890 // bitwise and
01891 
01892 template <class T1, class T2>
01893 inline
01894 const sc_logic
01895 operator & ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b )
01896 {
01897     return sc_logic( sc_logic::and_table[a.value()][b.value()] );
01898 }
01899 
01900 
01901 // bitwise or
01902 
01903 template <class T1, class T2>
01904 inline
01905 const sc_logic
01906 operator | ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b )
01907 {
01908     return sc_logic( sc_logic::or_table[a.value()][b.value()] );
01909 }
01910 
01911 
01912 // bitwise xor
01913 
01914 template <class T1, class T2>
01915 inline
01916 const sc_logic
01917 operator ^ ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b )
01918 {
01919     return sc_logic( sc_logic::xor_table[a.value()][b.value()] );
01920 }
01921 
01922 
01923 // relational operators and functions
01924 
01925 template <class T1, class T2>
01926 inline
01927 bool
01928 operator == ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b )
01929 {
01930     return ( (int) a.value() == b.value() );
01931 }
01932 
01933 template <class T1, class T2>
01934 inline
01935 bool
01936 operator != ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b )
01937 {
01938     return ( (int) a.value() != b.value() );
01939 }
01940 
01941 
01942 // common methods
01943 
01944 template <class T>
01945 inline
01946 sc_logic_value_t
01947 sc_bitref_r<T>::get_bit( int n ) const
01948 {
01949     if( n == 0 ) {
01950   return m_obj.get_bit( m_index );
01951     } else {
01952   SC_REPORT_ERROR( SC_ID_OUT_OF_BOUNDS_ , 0 );
01953         // never reached
01954   return Log_0;
01955     }
01956 }
01957 
01958 
01959 template <class T>
01960 inline
01961 unsigned long
01962 sc_bitref_r<T>::get_word( int n ) const
01963 {
01964     if( n == 0 ) {
01965   return ( get_bit( n ) & UL_ONE );
01966     } else {
01967   SC_REPORT_ERROR( SC_ID_OUT_OF_BOUNDS_, 0 );
01968   // never reached
01969   return 0;
01970     }
01971 }
01972 
01973 template <class T>
01974 inline
01975 unsigned long
01976 sc_bitref_r<T>::get_cword( int n ) const
01977 {
01978     if( n == 0 ) {
01979   return ( get_bit( n ) & UL_TWO );
01980     } else {
01981   SC_REPORT_ERROR( SC_ID_OUT_OF_BOUNDS_, 0 );
01982   // never reached
01983   return 0;
01984     }
01985 }
01986 
01987 
01988 // r-value concatenation operators and functions
01989 
01990 template <class T1, class T2>
01991 inline
01992 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
01993 operator , ( sc_bitref_r<T1> a, sc_bitref_r<T2> b )
01994 {
01995     return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >(
01996   *a.clone(), *b.clone(), 3 );
01997 }
01998 
01999 template <class T1, class T2>
02000 inline
02001 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
02002 operator , ( sc_bitref_r<T1> a, sc_subref_r<T2> b )
02003 {
02004     return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >(
02005   *a.clone(), *b.clone(), 3 );
02006 }
02007 
02008 template <class T1, class T2, class T3>
02009 inline
02010 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
02011 operator , ( sc_bitref_r<T1> a, sc_concref_r<T2,T3> b )
02012 {
02013     return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >(
02014   *a.clone(), *b.clone(), 3 );
02015 }
02016 
02017 template <class T1, class T2>
02018 inline
02019 sc_concref_r<sc_bitref_r<T1>,T2>
02020 operator , ( sc_bitref_r<T1> a, const sc_proxy<T2>& b )
02021 {
02022     return sc_concref_r<sc_bitref_r<T1>,T2>(
02023   *a.clone(), b.back_cast(), 1 );
02024 }
02025 
02026 
02027 template <class T1, class T2>
02028 inline
02029 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
02030 concat( sc_bitref_r<T1> a, sc_bitref_r<T2> b )
02031 {
02032     return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >(
02033   *a.clone(), *b.clone(), 3 );
02034 }
02035 
02036 template <class T1, class T2>
02037 inline
02038 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
02039 concat( sc_bitref_r<T1> a, sc_subref_r<T2> b )
02040 {
02041     return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >(
02042   *a.clone(), *b.clone(), 3 );
02043 }
02044 
02045 template <class T1, class T2, class T3>
02046 inline
02047 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
02048 concat( sc_bitref_r<T1> a, sc_concref_r<T2,T3> b )
02049 {
02050     return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >(
02051   *a.clone(), *b.clone(), 3 );
02052 }
02053 
02054 template <class T1, class T2>
02055 inline
02056 sc_concref_r<sc_bitref_r<T1>,T2>
02057 concat( sc_bitref_r<T1> a, const sc_proxy<T2>& b )
02058 {
02059     return sc_concref_r<sc_bitref_r<T1>,T2>(
02060   *a.clone(), b.back_cast(), 1 );
02061 }
02062 
02063 
02064 #ifdef SC_DT_MIXED_COMMA_OPERATORS
02065 
02066 template <class T1, class T2>
02067 inline
02068 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
02069 operator , ( sc_bitref_r<T1> a, sc_bitref<T2> b )
02070 {
02071     return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >(
02072   *a.clone(), *b.clone(), 3 );
02073 }
02074 
02075 template <class T1, class T2>
02076 inline
02077 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
02078 operator , ( sc_bitref<T1> a, sc_bitref_r<T2> b )
02079 {
02080     return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >(
02081   *a.clone(), *b.clone(), 3 );
02082 }
02083 
02084 template <class T1, class T2>
02085 inline
02086 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
02087 operator , ( sc_bitref_r<T1> a, sc_subref<T2> b )
02088 {
02089     return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >(
02090   *a.clone(), *b.clone(), 3 );
02091 }
02092 
02093 template <class T1, class T2>
02094 inline
02095 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
02096 operator , ( sc_bitref<T1> a, sc_subref_r<T2> b )
02097 {
02098     return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >(
02099   *a.clone(), *b.clone(), 3 );
02100 }
02101 
02102 template <class T1, class T2, class T3>
02103 inline
02104 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
02105 operator , ( sc_bitref_r<T1> a, sc_concref<T2,T3> b )
02106 {
02107     return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >(
02108   *a.clone(), *b.clone(), 3 );
02109 }
02110 
02111 template <class T1, class T2, class T3>
02112 inline
02113 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
02114 operator , ( sc_bitref<T1> a, sc_concref_r<T2,T3> b )
02115 {
02116     return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >(
02117   *a.clone(), *b.clone(), 3 );
02118 }
02119 
02120 template <class T1, class T2>
02121 inline
02122 sc_concref_r<sc_bitref_r<T1>,T2>
02123 operator , ( sc_bitref<T1> a, const sc_proxy<T2>& b )
02124 {
02125     return sc_concref_r<sc_bitref_r<T1>,T2>(
02126   *a.clone(), b.back_cast(), 1 );
02127 }
02128 
02129 template <class T1, class T2>
02130 inline
02131 sc_concref_r<sc_bitref_r<T1>,T2>
02132 operator , ( sc_bitref_r<T1> a, sc_proxy<T2>& b )
02133 {
02134     return sc_concref_r<sc_bitref_r<T1>,T2>(
02135   *a.clone(), b.back_cast(), 1 );
02136 }
02137 
02138 
02139 template <class T1, class T2>
02140 inline
02141 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
02142 concat( sc_bitref_r<T1> a, sc_bitref<T2> b )
02143 {
02144     return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >(
02145   *a.clone(), *b.clone(), 3 );
02146 }
02147 
02148 template <class T1, class T2>
02149 inline
02150 sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >
02151 concat( sc_bitref<T1> a, sc_bitref_r<T2> b )
02152 {
02153     return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >(
02154   *a.clone(), *b.clone(), 3 );
02155 }
02156 
02157 template <class T1, class T2>
02158 inline
02159 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
02160 concat( sc_bitref_r<T1> a, sc_subref<T2> b )
02161 {
02162     return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >(
02163   *a.clone(), *b.clone(), 3 );
02164 }
02165 
02166 template <class T1, class T2>
02167 inline
02168 sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >
02169 concat( sc_bitref<T1> a, sc_subref_r<T2> b )
02170 {
02171     return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >(
02172   *a.clone(), *b.clone(), 3 );
02173 }
02174 
02175 template <class T1, class T2, class T3>
02176 inline
02177 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
02178 concat( sc_bitref_r<T1> a, sc_concref<T2,T3> b )
02179 {
02180     return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >(
02181   *a.clone(), *b.clone(), 3 );
02182 }
02183 
02184 template <class T1, class T2, class T3>
02185 inline
02186 sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >
02187 concat( sc_bitref<T1> a, sc_concref_r<T2,T3> b )
02188 {
02189     return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >(
02190   *a.clone(), *b.clone(), 3 );
02191 }
02192 
02193 template <class T1, class T2>
02194 inline
02195 sc_concref_r<sc_bitref_r<T1>,T2>
02196 concat( sc_bitref<T1> a, const sc_proxy<T2>& b )
02197 {
02198     return sc_concref_r<sc_bitref_r<T1>,T2>(
02199   *a.clone(), b.back_cast(), 1 );
02200 }
02201 
02202 template <class T1, class T2>
02203 inline
02204 sc_concref_r<sc_bitref_r<T1>,T2>
02205 concat( sc_bitref_r<T1> a, sc_proxy<T2>& b )
02206 {
02207     return sc_concref_r<sc_bitref_r<T1>,T2>(
02208   *a.clone(), b.back_cast(), 1 );
02209 }
02210 
02211 #endif
02212 
02213 
02214 // ----------------------------------------------------------------------------
02215 //  CLASS TEMPLATE : sc_bitref<X>
02216 //
02217 //  Proxy class for sc_proxy bit selection (r-value and l-value).
02218 // ----------------------------------------------------------------------------
02219 
02220 // assignment operators
02221 
02222 template <class X>
02223 inline
02224 sc_bitref<X>&
02225 sc_bitref<X>::operator = ( const sc_bitref_r<X>& a )
02226 {
02227     this->m_obj.set_bit( this->m_index, a.value() );
02228   return *this;
02229 }
02230 
02231 template <class X>
02232 inline
02233 sc_bitref<X>&
02234 sc_bitref<X>::operator = ( const sc_bitref<X>& a )
02235 {
02236     if( &a != this ) {
02237   this->m_obj.set_bit( this->m_index, a.value() );
02238     }
02239     return *this;
02240 }
02241 
02242 
02243 // bitwise assignment operators
02244 
02245 template <class X>
02246 inline
02247 sc_bitref<X>&
02248 sc_bitref<X>::operator &= ( const sc_bitref_r<X>& a )
02249 {
02250     if( &a != this ) {
02251   this->m_obj.set_bit( this->m_index,
02252            sc_logic::and_table[this->value()][a.value()] );
02253     }
02254     return *this;
02255 }
02256 
02257 template <class X>
02258 inline
02259 sc_bitref<X>&
02260 sc_bitref<X>::operator &= ( const sc_logic& a )
02261 {
02262     this->m_obj.set_bit( this->m_index,
02263        sc_logic::and_table[this->value()][a.value()] );
02264     return *this;
02265 }
02266 
02267 
02268 template <class X>
02269 inline
02270 sc_bitref<X>&
02271 sc_bitref<X>::operator |= ( const sc_bitref_r<X>& a )
02272 {
02273     if( &a != this ) {
02274   this->m_obj.set_bit( this->m_index,
02275            sc_logic::or_table[this->value()][a.value()] );
02276     }
02277     return *this;
02278 }
02279 
02280 template <class X>
02281 inline
02282 sc_bitref<X>&
02283 sc_bitref<X>::operator |= ( const sc_logic& a )
02284 {
02285     this->m_obj.set_bit( this->m_index,
02286        sc_logic::or_table[this->value()][a.value()] );
02287     return *this;
02288 }
02289 
02290 
02291 template <class X>
02292 inline
02293 sc_bitref<X>&
02294 sc_bitref<X>::operator ^= ( const sc_bitref_r<X>& a )
02295 {
02296     if( &a != this ) {
02297   this->m_obj.set_bit( this->m_index,
02298            sc_logic::xor_table[this->value()][a.value()] );
02299     }
02300     return *this;
02301 }
02302 
02303 template <class X>
02304 inline
02305 sc_bitref<X>&
02306 sc_bitref<X>::operator ^= ( const sc_logic& a )
02307 {
02308     this->m_obj.set_bit( this->m_index,
02309        sc_logic::xor_table[this->value()][a.value()] );
02310     return *this;
02311 }
02312 
02313 
02314 // bitwise operators and functions
02315 
02316 // bitwise complement
02317 
02318 template <class X>
02319 inline
02320 sc_bitref<X>&
02321 sc_bitref<X>::b_not()
02322 {
02323     this->m_obj.set_bit( this->m_index,
02324        sc_logic::not_table[this->value()] );
02325     return *this;
02326 }
02327 
02328 
02329 // common methods
02330 
02331 template <class X>
02332 inline
02333 void
02334 sc_bitref<X>::set_bit( int n, sc_logic_value_t value )
02335 {
02336     if( n == 0 ) {
02337   this->m_obj.set_bit( this->m_index, value );
02338     } else {
02339   SC_REPORT_ERROR( SC_ID_OUT_OF_BOUNDS_, 0 );
02340     }
02341 }
02342 
02343 
02344 template <class X>
02345 inline
02346 void
02347 sc_bitref<X>::set_word( int n, unsigned long w )
02348 {
02349     if( n == 0 ) {
02350   this->m_obj.set_word( this->m_index, w );
02351     } else {
02352   SC_REPORT_ERROR( SC_ID_OUT_OF_BOUNDS_, 0 );
02353     }
02354 }
02355 
02356 template <class X>
02357 inline
02358 void
02359 sc_bitref<X>::set_cword( int n, unsigned long w )
02360 {
02361     if( n == 0 ) {
02362   this->m_obj.set_cword( this->m_index, w );
02363     } else {
02364   SC_REPORT_ERROR( SC_ID_OUT_OF_BOUNDS_, 0 );
02365     }
02366 }
02367 
02368 
02369 // other methods
02370 
02371 template <class X>
02372 inline
02373 void
02374 sc_bitref<X>::scan( istream& is )
02375 {
02376     char c;
02377     is >> c;
02378     *this = c;
02379 }
02380 
02381 
02382 // l-value concatenation operators and functions
02383 
02384 template <class T1, class T2>
02385 inline
02386 sc_concref<sc_bitref<T1>,sc_bitref<T2> >
02387 operator , ( sc_bitref<T1> a, sc_bitref<T2> b )
02388 {
02389     return sc_concref<sc_bitref<T1>,sc_bitref<T2> >(
02390   *a.clone(), *b.clone(), 3 );
02391 }
02392 
02393 template <class T1, class T2>
02394 inline
02395 sc_concref<sc_bitref<T1>,sc_subref<T2> >
02396 operator , ( sc_bitref<T1> a, sc_subref<T2> b )
02397 {
02398     return sc_concref<sc_bitref<T1>,sc_subref<T2> >(
02399   *a.clone(), *b.clone(), 3 );
02400 }
02401 
02402 template <class T1, class T2, class T3>
02403 inline
02404 sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >
02405 operator , ( sc_bitref<T1> a, sc_concref<T2,T3> b )
02406 {
02407     return sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >(
02408   *a.clone(), *b.clone(), 3 );
02409 }
02410 
02411 template <class T1, class T2>
02412 inline
02413 sc_concref<sc_bitref<T1>,T2>
02414 operator , ( sc_bitref<T1> a, sc_proxy<T2>& b )
02415 {
02416     return sc_concref<sc_bitref<T1>,T2>(
02417   *a.clone(), b.back_cast(), 1 );
02418 }
02419 
02420 
02421 template <class T1, class T2>
02422 inline
02423 sc_concref<sc_bitref<T1>,sc_bitref<T2> >
02424 concat( sc_bitref<T1> a, sc_bitref<T2> b )
02425 {
02426     return sc_concref<sc_bitref<T1>,sc_bitref<T2> >(
02427   *a.clone(), *b.clone(), 3 );
02428 }
02429 
02430 template <class T1, class T2>
02431 inline
02432 sc_concref<sc_bitref<T1>,sc_subref<T2> >
02433 concat( sc_bitref<T1> a, sc_subref<T2> b )
02434 {
02435     return sc_concref<sc_bitref<T1>,sc_subref<T2> >(
02436   *a.clone(), *b.clone(), 3 );
02437 }
02438 
02439 template <class T1, class T2, class T3>
02440 inline
02441 sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >
02442 concat( sc_bitref<T1> a, sc_concref<T2,T3> b )
02443 {
02444     return sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >(
02445   *a.clone(), *b.clone(), 3 );
02446 }
02447 
02448 template <class T1, class T2>
02449 inline
02450 sc_concref<sc_bitref<T1>,T2>
02451 concat( sc_bitref<T1> a, sc_proxy<T2>& b )
02452 {
02453     return sc_concref<sc_bitref<T1>,T2>(
02454   *a.clone(), b.back_cast(), 1 );
02455 }
02456 
02457 
02458 template <class X>
02459 inline
02460 istream&
02461 operator >> ( istream& is, sc_bitref<X> a )
02462 {
02463     a.scan( is );
02464     return is;
02465 }
02466 
02467 
02468 // ----------------------------------------------------------------------------
02469 //  CLASS TEMPLATE : sc_subref_r<X>
02470 //
02471 //  Proxy class for sc_proxy part selection (r-value only).
02472 // ----------------------------------------------------------------------------
02473 
02474 template <class X>
02475 inline
02476 void
02477 sc_subref_r<X>::check_bounds()
02478 {
02479     int len = m_obj.length();
02480     if( m_hi < 0 || m_hi >= len || m_lo < 0 || m_lo >= len ) {
02481   SC_REPORT_ERROR( SC_ID_OUT_OF_BOUNDS_, 0 );
02482     }
02483     if( reversed() ) {
02484   m_len = m_lo - m_hi + 1;
02485     } else {
02486   m_len = m_hi - m_lo + 1;
02487     }
02488 }
02489 
02490 
02491 // common methods
02492 
02493 template <class X>
02494 inline
02495 sc_logic_value_t
02496 sc_subref_r<X>::get_bit( int n ) const
02497 {
02498     if( reversed() ) {
02499   return m_obj.get_bit( m_lo - n );
02500     } else {
02501   return m_obj.get_bit( m_lo + n );
02502     }
02503 }
02504 
02505 template <class X>
02506 inline
02507 void
02508 sc_subref_r<X>::set_bit( int n, sc_logic_value_t value )
02509 {
02510     if( reversed() ) {
02511   m_obj.set_bit( m_lo - n, value );
02512     } else {
02513   m_obj.set_bit( m_lo + n, value );
02514     }
02515 }
02516 
02517 
02518 template <class X>
02519 inline
02520 unsigned long
02521 sc_subref_r<X>::get_word( int i ) const
02522 {
02523     int n1 = 0;
02524     int n2 = 0;
02525     unsigned long result = 0;
02526     int k = 0;
02527     if( reversed() ) {
02528   n1 = m_lo - i * UL_SIZE;
02529   n2 = sc_max( n1 - UL_SIZE, m_hi - 1 );
02530   for( int n = n1; n > n2; n -- ) {
02531       result |= (m_obj[n].value() & UL_ONE) << k ++;
02532   }
02533     } else {
02534   n1 = m_lo + i * UL_SIZE;
02535   n2 = sc_min( n1 + UL_SIZE, m_hi + 1 );
02536   for( int n = n1; n < n2; n ++ ) {
02537       result |= (m_obj[n].value() & UL_ONE) << k ++;
02538   }
02539     }
02540     return result;
02541 }
02542 
02543 template <class X>
02544 inline
02545 void
02546 sc_subref_r<X>::set_word( int i, unsigned long w )
02547 {
02548     int n1 = 0;
02549     int n2 = 0;
02550     int k = 0;
02551     if( reversed() ) {
02552   n1 = m_lo - i * UL_SIZE;
02553   n2 = sc_max( n1 - UL_SIZE, m_hi - 1 );
02554   for( int n = n1; n > n2; n -- ) {
02555       m_obj.set_bit( n, sc_logic_value_t( (w >> k ++) & UL_ONE |
02556             m_obj[n].value() & UL_TWO ) );
02557   }
02558     } else {
02559   n1 = m_lo + i * UL_SIZE;
02560   n2 = sc_min( n1 + UL_SIZE, m_hi + 1 );
02561   for( int n = n1; n < n2; n ++ ) {
02562       m_obj.set_bit( n, sc_logic_value_t( (w >> k ++) & UL_ONE |
02563             m_obj[n].value() & UL_TWO ) );
02564   }
02565     }
02566 }
02567 
02568 
02569 template <class X>
02570 inline
02571 unsigned long
02572 sc_subref_r<X>::get_cword( int i ) const
02573 {
02574     int n1 = 0;
02575     int n2 = 0;
02576     unsigned long result = 0;
02577     int k = 0;
02578     if( reversed() ) {
02579   n1 = m_lo - i * UL_SIZE;
02580   n2 = sc_max( n1 - UL_SIZE, m_hi - 1 );
02581   for( int n = n1; n > n2; n -- ) {
02582       result |= ((m_obj[n].value() & UL_TWO) >> 1) << k ++;
02583   }
02584     } else {
02585   n1 = m_lo + i * UL_SIZE;
02586   n2 = sc_min( n1 + UL_SIZE, m_hi + 1 );
02587   for( int n = n1; n < n2; n ++ ) {
02588       result |= ((m_obj[n].value() & UL_TWO) >> 1) << k ++;
02589   }
02590     }
02591     return result;
02592 }
02593 
02594 template <class X>
02595 inline
02596 void
02597 sc_subref_r<X>::set_cword( int i, unsigned long w )
02598 {
02599     int n1 = 0;
02600     int n2 = 0;
02601     int k = 0;
02602     if( reversed() ) {
02603   n1 = m_lo - i * UL_SIZE;
02604   n2 = sc_max( n1 - UL_SIZE, m_hi - 1 );
02605   for( int n = n1; n > n2; n -- ) {
02606       m_obj.set_bit( n, sc_logic_value_t( ((w >> k ++) & UL_ONE) << 1 |
02607             m_obj[n].value() & UL_ONE ) );
02608   }
02609     } else {
02610   n1 = m_lo + i * UL_SIZE;
02611   n2 = sc_min( n1 + UL_SIZE, m_hi + 1 );
02612   for( int n = n1; n < n2; n ++ ) {
02613       m_obj.set_bit( n, sc_logic_value_t( ((w >> k ++) & UL_ONE) << 1 |
02614             m_obj[n].value() & UL_ONE ) );
02615   }
02616     }
02617 }
02618 
02619 
02620 // other methods
02621 
02622 template <class X>
02623 inline
02624 bool
02625 sc_subref_r<X>::is_01() const
02626 {
02627     int sz = size();
02628     for( int i = 0; i < sz; ++ i ) {
02629   if( get_cword( i ) != UL_ZERO ) {
02630       return false;
02631   }
02632     }
02633     return true;
02634 }
02635 
02636 
02637 // r-value concatenation operators and functions
02638 
02639 template <class T1, class T2>
02640 inline
02641 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
02642 operator , ( sc_subref_r<T1> a, sc_bitref_r<T2> b )
02643 {
02644     return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >(
02645   *a.clone(), *b.clone(), 3 );
02646 }
02647 
02648 template <class T1, class T2>
02649 inline
02650 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
02651 operator , ( sc_subref_r<T1> a, sc_subref_r<T2> b )
02652 {
02653     return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >(
02654   *a.clone(), *b.clone(), 3 );
02655 }
02656 
02657 template <class T1, class T2, class T3>
02658 inline
02659 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
02660 operator , ( sc_subref_r<T1> a, sc_concref_r<T2,T3> b )
02661 {
02662     return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >(
02663   *a.clone(), *b.clone(), 3 );
02664 }
02665 
02666 template <class T1, class T2>
02667 inline
02668 sc_concref_r<sc_subref_r<T1>,T2>
02669 operator , ( sc_subref_r<T1> a, const sc_proxy<T2>& b )
02670 {
02671     return sc_concref_r<sc_subref_r<T1>,T2>(
02672   *a.clone(), b.back_cast(), 1 );
02673 }
02674 
02675 
02676 template <class T1, class T2>
02677 inline
02678 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
02679 concat( sc_subref_r<T1> a, sc_bitref_r<T2> b )
02680 {
02681     return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >(
02682   *a.clone(), *b.clone(), 3 );
02683 }
02684 
02685 template <class T1, class T2>
02686 inline
02687 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
02688 concat( sc_subref_r<T1> a, sc_subref_r<T2> b )
02689 {
02690     return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >(
02691   *a.clone(), *b.clone(), 3 );
02692 }
02693 
02694 template <class T1, class T2, class T3>
02695 inline
02696 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
02697 concat( sc_subref_r<T1> a, sc_concref_r<T2,T3> b )
02698 {
02699     return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >(
02700   *a.clone(), *b.clone(), 3 );
02701 }
02702 
02703 template <class T1, class T2>
02704 inline
02705 sc_concref_r<sc_subref_r<T1>,T2>
02706 concat( sc_subref_r<T1> a, const sc_proxy<T2>& b )
02707 {
02708     return sc_concref_r<sc_subref_r<T1>,T2>(
02709   *a.clone(), b.back_cast(), 1 );
02710 }
02711 
02712 
02713 #ifdef SC_DT_MIXED_COMMA_OPERATORS
02714 
02715 template <class T1, class T2>
02716 inline
02717 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
02718 operator , ( sc_subref_r<T1> a, sc_bitref<T2> b )
02719 {
02720     return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >(
02721   *a.clone(), *b.clone(), 3 );
02722 }
02723 
02724 template <class T1, class T2>
02725 inline
02726 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
02727 operator , ( sc_subref<T1> a, sc_bitref_r<T2> b )
02728 {
02729     return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >(
02730   *a.clone(), *b.clone(), 3 );
02731 }
02732 
02733 template <class T1, class T2>
02734 inline
02735 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
02736 operator , ( sc_subref_r<T1> a, sc_subref<T2> b )
02737 {
02738     return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >(
02739   *a.clone(), *b.clone(), 3 );
02740 }
02741 
02742 template <class T1, class T2>
02743 inline
02744 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
02745 operator , ( sc_subref<T1> a, sc_subref_r<T2> b )
02746 {
02747     return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >(
02748   *a.clone(), *b.clone(), 3 );
02749 }
02750 
02751 template <class T1, class T2, class T3>
02752 inline
02753 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
02754 operator , ( sc_subref_r<T1> a, sc_concref<T2,T3> b )
02755 {
02756     return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >(
02757   *a.clone(), *b.clone(), 3 );
02758 }
02759 
02760 template <class T1, class T2, class T3>
02761 inline
02762 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
02763 operator , ( sc_subref<T1> a, sc_concref_r<T2,T3> b )
02764 {
02765     return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >(
02766   *a.clone(), *b.clone(), 3 );
02767 }
02768 
02769 template <class T1, class T2>
02770 inline
02771 sc_concref_r<sc_subref_r<T1>,T2>
02772 operator , ( sc_subref<T1> a, const sc_proxy<T2>& b )
02773 {
02774     return sc_concref_r<sc_subref_r<T1>,T2>(
02775   *a.clone(), b.back_cast(), 1 );
02776 }
02777 
02778 template <class T1, class T2>
02779 inline
02780 sc_concref_r<sc_subref_r<T1>,T2>
02781 operator , ( sc_subref_r<T1> a, sc_proxy<T2>& b )
02782 {
02783     return sc_concref_r<sc_subref_r<T1>,T2>(
02784   *a.clone(), b.back_cast(), 1 );
02785 }
02786 
02787 
02788 template <class T1, class T2>
02789 inline
02790 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
02791 concat( sc_subref_r<T1> a, sc_bitref<T2> b )
02792 {
02793     return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >(
02794   *a.clone(), *b.clone(), 3 );
02795 }
02796 
02797 template <class T1, class T2>
02798 inline
02799 sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >
02800 concat( sc_subref<T1> a, sc_bitref_r<T2> b )
02801 {
02802     return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >(
02803   *a.clone(), *b.clone(), 3 );
02804 }
02805 
02806 template <class T1, class T2>
02807 inline
02808 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
02809 concat( sc_subref_r<T1> a, sc_subref<T2> b )
02810 {
02811     return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >(
02812   *a.clone(), *b.clone(), 3 );
02813 }
02814 
02815 template <class T1, class T2>
02816 inline
02817 sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >
02818 concat( sc_subref<T1> a, sc_subref_r<T2> b )
02819 {
02820     return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >(
02821   *a.clone(), *b.clone(), 3 );
02822 }
02823 
02824 template <class T1, class T2, class T3>
02825 inline
02826 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
02827 concat( sc_subref_r<T1> a, sc_concref<T2,T3> b )
02828 {
02829     return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >(
02830   *a.clone(), *b.clone(), 3 );
02831 }
02832 
02833 template <class T1, class T2, class T3>
02834 inline
02835 sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >
02836 concat( sc_subref<T1> a, sc_concref_r<T2,T3> b )
02837 {
02838     return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >(
02839   *a.clone(), *b.clone(), 3 );
02840 }
02841 
02842 template <class T1, class T2>
02843 inline
02844 sc_concref_r<sc_subref_r<T1>,T2>
02845 concat( sc_subref<T1> a, const sc_proxy<T2>& b )
02846 {
02847     return sc_concref_r<sc_subref_r<T1>,T2>(
02848   *a.clone(), b.back_cast(), 1 );
02849 }
02850 
02851 template <class T1, class T2>
02852 inline
02853 sc_concref_r<sc_subref_r<T1>,T2>
02854 concat( sc_subref_r<T1> a, sc_proxy<T2>& b )
02855 {
02856     return sc_concref_r<sc_subref_r<T1>,T2>(
02857   *a.clone(), b.back_cast(), 1 );
02858 }
02859 
02860 #endif
02861 
02862 
02863 // ----------------------------------------------------------------------------
02864 //  CLASS TEMPLATE : sc_subref<X>
02865 //
02866 //  Proxy class for sc_proxy part selection (r-value and l-value).
02867 // ----------------------------------------------------------------------------
02868 
02869 // assignment operators
02870 
02871 // sc_subref<X>::operator = ( const sc_subref_r<X>& ) in sc_lv_base.h
02872 // sc_subref<X>::operator = ( const sc_subref<X>& )   in sc_lv_base.h
02873 
02874 
02875 // other methods
02876 
02877 template <class T>
02878 inline
02879 void
02880 sc_subref<T>::scan( istream& is )
02881 {
02882     sc_string s;
02883     is >> s;
02884     *this = s.c_str();
02885 }
02886 
02887 
02888 // l-value concatenation operators and functions
02889 
02890 template <class T1, class T2>
02891 inline
02892 sc_concref<sc_subref<T1>,sc_bitref<T2> >
02893 operator , ( sc_subref<T1> a, sc_bitref<T2> b )
02894 {
02895     return sc_concref<sc_subref<T1>,sc_bitref<T2> >(
02896   *a.clone(), *b.clone(), 3 );
02897 }
02898 
02899 template <class T1, class T2>
02900 inline
02901 sc_concref<sc_subref<T1>,sc_subref<T2> >
02902 operator , ( sc_subref<T1> a, sc_subref<T2> b )
02903 {
02904     return sc_concref<sc_subref<T1>,sc_subref<T2> >(
02905   *a.clone(), *b.clone(), 3 );
02906 }
02907 
02908 template <class T1, class T2, class T3>
02909 inline
02910 sc_concref<sc_subref<T1>,sc_concref<T2,T3> >
02911 operator , ( sc_subref<T1> a, sc_concref<T2,T3> b )
02912 {
02913     return sc_concref<sc_subref<T1>,sc_concref<T2,T3> >(
02914   *a.clone(), *b.clone(), 3 );
02915 }
02916 
02917 template <class T1, class T2>
02918 inline
02919 sc_concref<sc_subref<T1>,T2>
02920 operator , ( sc_subref<T1> a, sc_proxy<T2>& b )
02921 {
02922     return sc_concref<sc_subref<T1>,T2>(
02923   *a.clone(), b.back_cast(), 1 );
02924 }
02925 
02926 
02927 template <class T1, class T2>
02928 inline
02929 sc_concref<sc_subref<T1>,sc_bitref<T2> >
02930 concat( sc_subref<T1> a, sc_bitref<T2> b )
02931 {
02932     return sc_concref<sc_subref<T1>,sc_bitref<T2> >(
02933   *a.clone(), *b.clone(), 3 );
02934 }
02935 
02936 template <class T1, class T2>
02937 inline
02938 sc_concref<sc_subref<T1>,sc_subref<T2> >
02939 concat( sc_subref<T1> a, sc_subref<T2> b )
02940 {
02941     return sc_concref<sc_subref<T1>,sc_subref<T2> >(
02942   *a.clone(), *b.clone(), 3 );
02943 }
02944 
02945 template <class T1, class T2, class T3>
02946 inline
02947 sc_concref<sc_subref<T1>,sc_concref<T2,T3> >
02948 concat( sc_subref<T1> a, sc_concref<T2,T3> b )
02949 {
02950     return sc_concref<sc_subref<T1>,sc_concref<T2,T3> >(
02951   *a.clone(), *b.clone(), 3 );
02952 }
02953 
02954 template <class T1, class T2>
02955 inline
02956 sc_concref<sc_subref<T1>,T2>
02957 concat( sc_subref<T1> a, sc_proxy<T2>& b )
02958 {
02959     return sc_concref<sc_subref<T1>,T2>(
02960   *a.clone(), b.back_cast(), 1 );
02961 }
02962 
02963 
02964 template <class X>
02965 inline
02966 istream&
02967 operator >> ( istream& is, sc_subref<X> a )
02968 {
02969     a.scan( is );
02970     return is;
02971 }
02972 
02973 
02974 // ----------------------------------------------------------------------------
02975 //  CLASS TEMPLATE : sc_concref_r<X,Y>
02976 //
02977 //  Proxy class for sc_proxy concatenation (r-value only).
02978 // ----------------------------------------------------------------------------
02979 
02980 // destructor
02981 
02982 template <class X, class Y>
02983 inline
02984 sc_concref_r<X,Y>::~sc_concref_r()
02985 {
02986     if( -- m_refs == 0 ) {
02987   delete &m_refs;
02988   if( m_delete == 0 ) {
02989       return;
02990   }
02991   if( m_delete & 1 ) {
02992       delete &m_left;
02993   }
02994   if( m_delete & 2 ) {
02995       delete &m_right;
02996   }
02997     }
02998 }
02999 
03000 
03001 // common methods
03002 
03003 template <class X, class Y>
03004 inline
03005 sc_logic_value_t
03006 sc_concref_r<X,Y>::get_bit( int n ) const
03007 {
03008     int r_len = m_right.length();
03009     if( n < r_len ) {
03010   return m_right.get_bit( n );
03011     } else if( n < r_len + m_left.length() ) {
03012   return m_left.get_bit( n - r_len );
03013     } else {
03014   SC_REPORT_ERROR( SC_ID_OUT_OF_BOUNDS_, 0 );
03015   // never reached
03016   return Log_0;
03017     }
03018 }
03019 
03020 template <class X, class Y>
03021 inline
03022 void
03023 sc_concref_r<X,Y>::set_bit( int n, sc_logic_value_t v )
03024 {
03025     int r_len = m_right.length();
03026     if( n < r_len ) {
03027   m_right.set_bit( n, v );
03028     } else if( n < r_len + m_left.length() ) {
03029   m_left.set_bit( n - r_len, v );
03030     } else {
03031   SC_REPORT_ERROR( SC_ID_OUT_OF_BOUNDS_, 0 );
03032     }
03033 }
03034 
03035 
03036 template <class X, class Y>
03037 inline
03038 unsigned long
03039 sc_concref_r<X,Y>::get_word( int i ) const
03040 {
03041     if( i < 0 || i >= size() ) {
03042   SC_REPORT_ERROR( SC_ID_OUT_OF_BOUNDS_, 0 );
03043     }
03044     // 0 <= i < size()
03045     Y& r = m_right;
03046     int r_len = r.length();
03047     int border = r_len / UL_SIZE;
03048     if( i < border ) {
03049   return r.get_word( i );
03050     }
03051     // border <= i < size()
03052     X& l = m_left;
03053     int shift = r_len % UL_SIZE;
03054     int j = i - border;
03055     if( shift == 0 ) {
03056   return l.get_word( j );
03057     }
03058     // border <= i < size() && shift != 0
03059     int nshift = UL_SIZE - shift;
03060     if( i == border ) {
03061   unsigned long rl_mask = ~UL_ZERO >> nshift;
03062   return ( (r.get_word( i ) & rl_mask) | (l.get_word( 0 ) << shift) );
03063     }
03064     // border < i < size() && shift != 0
03065     return ( (l.get_word( j - 1 ) >> nshift) | (l.get_word( j ) << shift) );
03066 }
03067 
03068 template <class X, class Y>
03069 inline
03070 void
03071 sc_concref_r<X,Y>::set_word( int i, unsigned long w )
03072 {
03073     if( i < 0 || i >= size() ) {
03074   SC_REPORT_ERROR( SC_ID_OUT_OF_BOUNDS_, 0 );
03075     }
03076     // 0 <= i < size()
03077     Y& r = m_right;
03078     int r_len = r.length();
03079     int border = r_len / UL_SIZE;
03080     if( i < border ) {
03081   r.set_word( i, w );
03082   return;
03083     }
03084     // border <= i < size()
03085     X& l = m_left;
03086     int shift = r_len % UL_SIZE;
03087     int j = i - border;
03088     if( shift == 0 ) {
03089   l.set_word( j, w );
03090   return;
03091     }
03092     // border <= i < size() && shift != 0
03093     int nshift = UL_SIZE - shift;
03094     unsigned long lh_mask = ~UL_ZERO << nshift;
03095     if( i == border ) {
03096   unsigned long rl_mask = ~UL_ZERO >> nshift;
03097   r.set_word( i, w & rl_mask );
03098   l.set_word( 0, (l.get_word( 0 ) & lh_mask) | (w >> shift) );
03099   return;
03100     }
03101     // border < i < size() && shift != 0
03102     unsigned long ll_mask = ~UL_ZERO >> shift;
03103     l.set_word( j - 1, (l.get_word( j - 1 ) & ll_mask) | (w << nshift) );
03104     l.set_word( j, (l.get_word( j ) & lh_mask) | (w >> shift) );
03105 }
03106 
03107 
03108 template <class X, class Y>
03109 inline
03110 unsigned long
03111 sc_concref_r<X,Y>::get_cword( int i ) const
03112 {
03113     if( i < 0 || i >= size() ) {
03114   SC_REPORT_ERROR( SC_ID_OUT_OF_BOUNDS_, 0 );
03115     }
03116     // 0 <= i < size()
03117     Y& r = m_right;
03118     int r_len = r.length();
03119     int border = r_len / UL_SIZE;
03120     if( i < border ) {
03121   return r.get_cword( i );
03122     }
03123     // border <= i < size()
03124     X& l = m_left;
03125     int shift = r_len % UL_SIZE;
03126     int j = i - border;
03127     if( shift == 0 ) {
03128   return l.get_cword( j );
03129     }
03130     // border <= i < size() && shift != 0
03131     int nshift = UL_SIZE - shift;
03132     if( i == border ) {
03133   unsigned long rl_mask = ~UL_ZERO >> nshift;
03134   return ( (r.get_cword( i ) & rl_mask) | (l.get_cword( 0 ) << shift) );
03135     }
03136     // border < i < size() && shift != 0
03137     return ( (l.get_cword( j - 1 ) >> nshift) | (l.get_cword( j ) << shift) );
03138 }
03139 
03140 template <class X, class Y>
03141 inline
03142 void
03143 sc_concref_r<X,Y>::set_cword( int i, unsigned long w )
03144 {
03145     if( i < 0 || i >= size() ) {
03146   SC_REPORT_ERROR( SC_ID_OUT_OF_BOUNDS_, 0 );
03147     }
03148     // 0 <= i < size()
03149     Y& r = m_right;
03150     int r_len = r.length();
03151     int border = r_len / UL_SIZE;
03152     if( i < border ) {
03153   r.set_cword( i, w );
03154   return;
03155     }
03156     // border <= i < size()
03157     X& l = m_left;
03158     int shift = r_len % UL_SIZE;
03159     int j = i - border;
03160     if( shift == 0 ) {
03161   l.set_cword( j, w );
03162   return;
03163     }
03164     // border <= i < size() && shift != 0
03165     int nshift = UL_SIZE - shift;
03166     unsigned long lh_mask = ~UL_ZERO << nshift;
03167     if( i == border ) {
03168   unsigned long rl_mask = ~UL_ZERO >> nshift;
03169   r.set_cword( i, w & rl_mask );
03170   l.set_cword( 0, (l.get_cword( 0 ) & lh_mask) | (w >> shift) );
03171   return;
03172     }
03173     // border < i < size() && shift != 0
03174     unsigned long ll_mask = ~UL_ZERO >> shift;
03175     l.set_cword( j - 1, (l.get_cword( j - 1 ) & ll_mask) | (w << nshift) );
03176     l.set_cword( j, (l.get_cword( j ) & lh_mask) | (w >> shift) );
03177 }
03178 
03179 
03180 // r-value concatenation operators and functions
03181 
03182 template <class T1, class T2, class T3>
03183 inline
03184 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
03185 operator , ( sc_concref_r<T1,T2> a, sc_bitref_r<T3> b )
03186 {
03187     return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >(
03188   *a.clone(), *b.clone(), 3 );
03189 }
03190 
03191 template <class T1, class T2, class T3>
03192 inline
03193 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
03194 operator , ( sc_concref_r<T1,T2> a, sc_subref_r<T3> b )
03195 {
03196     return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >(
03197   *a.clone(), *b.clone(), 3 );
03198 }
03199 
03200 template <class T1, class T2, class T3, class T4>
03201 inline
03202 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
03203 operator , ( sc_concref_r<T1,T2> a, sc_concref_r<T3,T4> b )
03204 {
03205     return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >(
03206   *a.clone(), *b.clone(), 3 );
03207 }
03208 
03209 template <class T1, class T2, class T3>
03210 inline
03211 sc_concref_r<sc_concref_r<T1,T2>,T3>
03212 operator , ( sc_concref_r<T1,T2> a, const sc_proxy<T3>& b )
03213 {
03214     return sc_concref_r<sc_concref_r<T1,T2>,T3>(
03215   *a.clone(), b.back_cast(), 1 );
03216 }
03217 
03218 
03219 template <class T1, class T2, class T3>
03220 inline
03221 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
03222 concat( sc_concref_r<T1,T2> a, sc_bitref_r<T3> b )
03223 {
03224     return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >(
03225   *a.clone(), *b.clone(), 3 );
03226 }
03227 
03228 template <class T1, class T2, class T3>
03229 inline
03230 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
03231 concat( sc_concref_r<T1,T2> a, sc_subref_r<T3> b )
03232 {
03233     return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >(
03234   *a.clone(), *b.clone(), 3 );
03235 }
03236 
03237 template <class T1, class T2, class T3, class T4>
03238 inline
03239 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
03240 concat( sc_concref_r<T1,T2> a, sc_concref_r<T3,T4> b )
03241 {
03242     return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >(
03243   *a.clone(), *b.clone(), 3 );
03244 }
03245 
03246 template <class T1, class T2, class T3>
03247 inline
03248 sc_concref_r<sc_concref_r<T1,T2>,T3>
03249 concat( sc_concref_r<T1,T2> a, const sc_proxy<T3>& b )
03250 {
03251     return sc_concref_r<sc_concref_r<T1,T2>,T3>(
03252   *a.clone(), b.back_cast(), 1 );
03253 }
03254 
03255 
03256 #ifdef SC_DT_MIXED_COMMA_OPERATORS
03257 
03258 template <class T1, class T2, class T3>
03259 inline
03260 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
03261 operator , ( sc_concref_r<T1,T2> a, sc_bitref<T3> b )
03262 {
03263     return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >(
03264   *a.clone(), *b.clone(), 3 );
03265 }
03266 
03267 template <class T1, class T2, class T3>
03268 inline
03269 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
03270 operator , ( sc_concref<T1,T2> a, sc_bitref_r<T3> b )
03271 {
03272     return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >(
03273   *a.clone(), *b.clone(), 3 );
03274 }
03275 
03276 template <class T1, class T2, class T3>
03277 inline
03278 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
03279 operator , ( sc_concref_r<T1,T2> a, sc_subref<T3> b )
03280 {
03281     return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >(
03282   *a.clone(), *b.clone(), 3 );
03283 }
03284 
03285 template <class T1, class T2, class T3>
03286 inline
03287 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
03288 operator , ( sc_concref<T1,T2> a, sc_subref_r<T3> b )
03289 {
03290     return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >(
03291   *a.clone(), *b.clone(), 3 );
03292 }
03293 
03294 template <class T1, class T2, class T3, class T4>
03295 inline
03296 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
03297 operator , ( sc_concref_r<T1,T2> a, sc_concref<T3,T4> b )
03298 {
03299     return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >(
03300   *a.clone(), *b.clone(), 3 );
03301 }
03302 
03303 template <class T1, class T2, class T3, class T4>
03304 inline
03305 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
03306 operator , ( sc_concref<T1,T2> a, sc_concref_r<T3,T4> b )
03307 {
03308     return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >(
03309   *a.clone(), *b.clone(), 3 );
03310 }
03311 
03312 template <class T1, class T2, class T3>
03313 inline
03314 sc_concref_r<sc_concref_r<T1,T2>,T3>
03315 operator , ( sc_concref<T1,T2> a, const sc_proxy<T3>& b )
03316 {
03317     return sc_concref_r<sc_concref_r<T1,T2>,T3>(
03318   *a.clone(), b.back_cast(), 1 );
03319 }
03320 
03321 template <class T1, class T2, class T3>
03322 inline
03323 sc_concref_r<sc_concref_r<T1,T2>,T3>
03324 operator , ( sc_concref_r<T1,T2> a, sc_proxy<T3>& b )
03325 {
03326     return sc_concref_r<sc_concref_r<T1,T2>,T3>(
03327   *a.clone(), b.back_cast(), 1 );
03328 }
03329 
03330 
03331 template <class T1, class T2, class T3>
03332 inline
03333 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
03334 concat( sc_concref_r<T1,T2> a, sc_bitref<T3> b )
03335 {
03336     return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >(
03337   *a.clone(), *b.clone(), 3 );
03338 }
03339 
03340 template <class T1, class T2, class T3>
03341 inline
03342 sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >
03343 concat( sc_concref<T1,T2> a, sc_bitref_r<T3> b )
03344 {
03345     return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >(
03346   *a.clone(), *b.clone(), 3 );
03347 }
03348 
03349 template <class T1, class T2, class T3>
03350 inline
03351 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
03352 concat( sc_concref_r<T1,T2> a, sc_subref<T3> b )
03353 {
03354     return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >(
03355   *a.clone(), *b.clone(), 3 );
03356 }
03357 
03358 template <class T1, class T2, class T3>
03359 inline
03360 sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >
03361 concat( sc_concref<T1,T2> a, sc_subref_r<T3> b )
03362 {
03363     return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >(
03364   *a.clone(), *b.clone(), 3 );
03365 }
03366 
03367 template <class T1, class T2, class T3, class T4>
03368 inline
03369 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
03370 concat( sc_concref_r<T1,T2> a, sc_concref<T3,T4> b )
03371 {
03372     return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >(
03373   *a.clone(), *b.clone(), 3 );
03374 }
03375 
03376 template <class T1, class T2, class T3, class T4>
03377 inline
03378 sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >
03379 concat( sc_concref<T1,T2> a, sc_concref_r<T3,T4> b )
03380 {
03381     return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >(
03382   *a.clone(), *b.clone(), 3 );
03383 }
03384 
03385 template <class T1, class T2, class T3>
03386 inline
03387 sc_concref_r<sc_concref_r<T1,T2>,T3>
03388 concat( sc_concref<T1,T2> a, const sc_proxy<T3>& b )
03389 {
03390     return sc_concref_r<sc_concref_r<T1,T2>,T3>(
03391   *a.clone(), b.back_cast(), 1 );
03392 }
03393 
03394 template <class T1, class T2, class T3>
03395 inline
03396 sc_concref_r<sc_concref_r<T1,T2>,T3>
03397 concat( sc_concref_r<T1,T2> a, sc_proxy<T3>& b )
03398 {
03399     return sc_concref_r<sc_concref_r<T1,T2>,T3>(
03400   *a.clone(), b.back_cast(), 1 );
03401 }
03402 
03403 #endif
03404 
03405 
03406 // ----------------------------------------------------------------------------
03407 //  CLASS TEMPLATE : sc_concref<X,Y>
03408 //
03409 //  Proxy class for sc_proxy concatenation (r-value and l-value).
03410 // ----------------------------------------------------------------------------
03411 
03412 // other methods
03413 
03414 template <class T1, class T2>
03415 inline
03416 void
03417 sc_concref<T1,T2>::scan( istream& is )
03418 {
03419     sc_string s;
03420     is >> s;
03421     *this = s.c_str();
03422 }
03423 
03424 
03425 // l-value concatenation operators and functions
03426 
03427 template <class T1, class T2, class T3>
03428 inline
03429 sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >
03430 operator , ( sc_concref<T1,T2> a, sc_bitref<T3> b )
03431 {
03432     return sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >(
03433   *a.clone(), *b.clone(), 3 );
03434 }
03435 
03436 template <class T1, class T2, class T3>
03437 inline
03438 sc_concref<sc_concref<T1,T2>,sc_subref<T3> >
03439 operator , ( sc_concref<T1,T2> a, sc_subref<T3> b )
03440 {
03441     return sc_concref<sc_concref<T1,T2>,sc_subref<T3> >(
03442   *a.clone(), *b.clone(), 3 );
03443 }
03444 
03445 template <class T1, class T2, class T3, class T4>
03446 inline
03447 sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >
03448 operator , ( sc_concref<T1,T2> a, sc_concref<T3,T4> b )
03449 {
03450     return sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >(
03451   *a.clone(), *b.clone(), 3 );
03452 }
03453 
03454 template <class T1, class T2, class T3>
03455 inline
03456 sc_concref<sc_concref<T1,T2>,T3>
03457 operator , ( sc_concref<T1,T2> a, sc_proxy<T3>& b )
03458 {
03459     return sc_concref<sc_concref<T1,T2>,T3>(
03460   *a.clone(), b.back_cast(), 1 );
03461 }
03462 
03463 
03464 template <class T1, class T2, class T3>
03465 inline
03466 sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >
03467 concat( sc_concref<T1,T2> a, sc_bitref<T3> b )
03468 {
03469     return sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >(
03470   *a.clone(), *b.clone(), 3 );
03471 }
03472 
03473 template <class T1, class T2, class T3>
03474 inline
03475 sc_concref<sc_concref<T1,T2>,sc_subref<T3> >
03476 concat( sc_concref<T1,T2> a, sc_subref<T3> b )
03477 {
03478     return sc_concref<sc_concref<T1,T2>,sc_subref<T3> >(
03479   *a.clone(), *b.clone(), 3 );
03480 }
03481 
03482 template <class T1, class T2, class T3, class T4>
03483 inline
03484 sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >
03485 concat( sc_concref<T1,T2> a, sc_concref<T3,T4> b )
03486 {
03487     return sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >(
03488   *a.clone(), *b.clone(), 3 );
03489 }
03490 
03491 template <class T1, class T2, class T3>
03492 inline
03493 sc_concref<sc_concref<T1,T2>,T3>
03494 concat( sc_concref<T1,T2> a, sc_proxy<T3>& b )
03495 {
03496     return sc_concref<sc_concref<T1,T2>,T3>(
03497   *a.clone(), b.back_cast(), 1 );
03498 }
03499 
03500 
03501 template <class X, class Y>
03502 inline
03503 istream&
03504 operator >> ( istream& is, sc_concref<X,Y> a )
03505 {
03506     a.scan( is );
03507     return is;
03508 }
03509 
03510 
03511 // ----------------------------------------------------------------------------
03512 //  CLASS TEMPLATE : sc_proxy<T>
03513 //
03514 //  Base class template for bit/logic vector classes.
03515 //  (Barton/Nackmann implementation)
03516 // ----------------------------------------------------------------------------
03517 
03518 // r-value concatenation operators and functions
03519 
03520 template <class T1, class T2>
03521 inline
03522 sc_concref_r<T1,sc_bitref_r<T2> >
03523 operator , ( const sc_proxy<T1>& a, sc_bitref_r<T2> b )
03524 {
03525     return sc_concref_r<T1,sc_bitref_r<T2> >(
03526   a.back_cast(), *b.clone(), 2 );
03527 }
03528 
03529 template <class T1, class T2>
03530 inline
03531 sc_concref_r<T1,sc_subref_r<T2> >
03532 operator , ( const sc_proxy<T1>& a, sc_subref_r<T2> b )
03533 {
03534     return sc_concref_r<T1,sc_subref_r<T2> >(
03535   a.back_cast(), *b.clone(), 2 );
03536 }
03537 
03538 template <class T1, class T2, class T3>
03539 inline
03540 sc_concref_r<T1,sc_concref_r<T2,T3> >
03541 operator , ( const sc_proxy<T1>& a, sc_concref_r<T2,T3> b )
03542 {
03543     return sc_concref_r<T1,sc_concref_r<T2,T3> >(
03544   a.back_cast(), *b.clone(), 2 );
03545 }
03546 
03547 template <class T1, class T2>
03548 inline
03549 sc_concref_r<T1,T2>
03550 operator , ( const sc_proxy<T1>& a, const sc_proxy<T2>& b )
03551 {
03552     return sc_concref_r<T1,T2>(
03553   a.back_cast(), b.back_cast() );
03554 }
03555 
03556 
03557 template <class T1, class T2>
03558 inline
03559 sc_concref_r<T1,sc_bitref_r<T2> >
03560 concat( const sc_proxy<T1>& a, sc_bitref_r<T2> b )
03561 {
03562     return sc_concref_r<T1,sc_bitref_r<T2> >(
03563   a.back_cast(), *b.clone(), 2 );
03564 }
03565 
03566 template <class T1, class T2>
03567 inline
03568 sc_concref_r<T1,sc_subref_r<T2> >
03569 concat( const sc_proxy<T1>& a, sc_subref_r<T2> b )
03570 {
03571     return sc_concref_r<T1,sc_subref_r<T2> >(
03572   a.back_cast(), *b.clone(), 2 );
03573 }
03574 
03575 template <class T1, class T2, class T3>
03576 inline
03577 sc_concref_r<T1,sc_concref_r<T2,T3> >
03578 concat( const sc_proxy<T1>& a, sc_concref_r<T2,T3> b )
03579 {
03580     return sc_concref_r<T1,sc_concref_r<T2,T3> >(
03581   a.back_cast(), *b.clone(), 2 );
03582 }
03583 
03584 template <class T1, class T2>
03585 inline
03586 sc_concref_r<T1,T2>
03587 concat( const sc_proxy<T1>& a, const sc_proxy<T2>& b )
03588 {
03589     return sc_concref_r<T1,T2>(
03590   a.back_cast(), b.back_cast() );
03591 }
03592 
03593 
03594 #ifdef SC_DT_MIXED_COMMA_OPERATORS
03595 
03596 template <class T1, class T2>
03597 inline
03598 sc_concref_r<T1,sc_bitref_r<T2> >
03599 operator , ( const sc_proxy<T1>& a, sc_bitref<T2> b )
03600 {
03601     return sc_concref_r<T1,sc_bitref_r<T2> >(
03602   a.back_cast(), *b.clone(), 2 );
03603 }
03604 
03605 template <class T1, class T2>
03606 inline
03607 sc_concref_r<T1,sc_bitref_r<T2> >
03608 operator , ( sc_proxy<T1>& a, sc_bitref_r<T2> b )
03609 {
03610     return sc_concref_r<T1,sc_bitref_r<T2> >(
03611   a.back_cast(), *b.clone(), 2 );
03612 }
03613 
03614 template <class T1, class T2>
03615 inline
03616 sc_concref_r<T1,sc_subref_r<T2> >
03617 operator , ( const sc_proxy<T1>& a, sc_subref<T2> b )
03618 {
03619     return sc_concref_r<T1,sc_subref_r<T2> >(
03620   a.back_cast(), *b.clone(), 2 );
03621 }
03622 
03623 template <class T1, class T2>
03624 inline
03625 sc_concref_r<T1,sc_subref_r<T2> >
03626 operator , ( sc_proxy<T1>& a, sc_subref_r<T2> b )
03627 {
03628     return sc_concref_r<T1,sc_subref_r<T2> >(
03629   a.back_cast(), *b.clone(), 2 );
03630 }
03631 
03632 template <class T1, class T2, class T3>
03633 inline
03634 sc_concref_r<T1,sc_concref_r<T2,T3> >
03635 operator , ( const sc_proxy<T1>& a, sc_concref<T2,T3> b )
03636 {
03637     return sc_concref_r<T1,sc_concref_r<T2,T3> >(
03638   a.back_cast(), *b.clone(), 2 );
03639 }
03640 
03641 template <class T1, class T2, class T3>
03642 inline
03643 sc_concref_r<T1,sc_concref_r<T2,T3> >
03644 operator , ( sc_proxy<T1>& a, sc_concref_r<T2,T3> b )
03645 {
03646     return sc_concref_r<T1,sc_concref_r<T2,T3> >(
03647   a.back_cast(), *b.clone(), 2 );
03648 }
03649 
03650 template <class T1, class T2>
03651 inline
03652 sc_concref_r<T1,T2>
03653 operator , ( const sc_proxy<T1>& a, sc_proxy<T2>& b )
03654 {
03655     return sc_concref_r<T1,T2>(
03656   a.back_cast(), b.back_cast() );
03657 }
03658 
03659 template <class T1, class T2>
03660 inline
03661 sc_concref_r<T1,T2>
03662 operator , ( sc_proxy<T1>& a, const sc_proxy<T2>& b )
03663 {
03664     return sc_concref_r<T1,T2>(
03665   a.back_cast(), b.back_cast() );
03666 }
03667 
03668 
03669 template <class T1, class T2>
03670 inline
03671 sc_concref_r<T1,sc_bitref_r<T2> >
03672 concat( const sc_proxy<T1>& a, sc_bitref<T2> b )
03673 {
03674     return sc_concref_r<T1,sc_bitref_r<T2> >(
03675   a.back_cast(), *b.clone(), 2 );
03676 }
03677 
03678 template <class T1, class T2>
03679 inline
03680 sc_concref_r<T1,sc_bitref_r<T2> >
03681 concat( sc_proxy<T1>& a, sc_bitref_r<T2> b )
03682 {
03683     return sc_concref_r<T1,sc_bitref_r<T2> >(
03684   a.back_cast(), *b.clone(), 2 );
03685 }
03686 
03687 template <class T1, class T2>
03688 inline
03689 sc_concref_r<T1,sc_subref_r<T2> >
03690 concat( const sc_proxy<T1>& a, sc_subref<T2> b )
03691 {
03692     return sc_concref_r<T1,sc_subref_r<T2> >(
03693   a.back_cast(), *b.clone(), 2 );
03694 }
03695 
03696 template <class T1, class T2>
03697 inline
03698 sc_concref_r<T1,sc_subref_r<T2> >
03699 concat( sc_proxy<T1>& a, sc_subref_r<T2> b )
03700 {
03701     return sc_concref_r<T1,sc_subref_r<T2> >(
03702   a.back_cast(), *b.clone(), 2 );
03703 }
03704 
03705 template <class T1, class T2, class T3>
03706 inline
03707 sc_concref_r<T1,sc_concref_r<T2,T3> >
03708 concat( const sc_proxy<T1>& a, sc_concref<T2,T3> b )
03709 {
03710     return sc_concref_r<T1,sc_concref_r<T2,T3> >(
03711   a.back_cast(), *b.clone(), 2 );
03712 }
03713 
03714 template <class T1, class T2, class T3>
03715 inline
03716 sc_concref_r<T1,sc_concref_r<T2,T3> >
03717 concat( sc_proxy<T1>& a, sc_concref_r<T2,T3> b )
03718 {
03719     return sc_concref_r<T1,sc_concref_r<T2,T3> >(
03720   a.back_cast(), *b.clone(), 2 );
03721 }
03722 
03723 template <class T1, class T2>
03724 inline
03725 sc_concref_r<T1,T2>
03726 concat( const sc_proxy<T1>& a, sc_proxy<T2>& b )
03727 {
03728     return sc_concref_r<T1,T2>(
03729   a.back_cast(), b.back_cast() );
03730 }
03731 
03732 template <class T1, class T2>
03733 inline
03734 sc_concref_r<T1,T2>
03735 concat( sc_proxy<T1>& a, const sc_proxy<T2>& b )
03736 {
03737     return sc_concref_r<T1,T2>(
03738   a.back_cast(), b.back_cast() );
03739 }
03740 
03741 #endif
03742 
03743 
03744 // l-value concatenation operators and functions
03745 
03746 template <class T1, class T2>
03747 inline
03748 sc_concref<T1,sc_bitref<T2> >
03749 operator , ( sc_proxy<T1>& a, sc_bitref<T2> b )
03750 {
03751     return sc_concref<T1,sc_bitref<T2> >(
03752   a.back_cast(), *b.clone(), 2 );
03753 }
03754 
03755 template <class T1, class T2>
03756 inline
03757 sc_concref<T1,sc_subref<T2> >
03758 operator , ( sc_proxy<T1>& a, sc_subref<T2> b )
03759 {
03760     return sc_concref<T1,sc_subref<T2> >(
03761   a.back_cast(), *b.clone(), 2 );
03762 }
03763 
03764 template <class T1, class T2, class T3>
03765 inline
03766 sc_concref<T1,sc_concref<T2,T3> >
03767 operator , ( sc_proxy<T1>& a, sc_concref<T2,T3> b )
03768 {
03769     return sc_concref<T1,sc_concref<T2,T3> >(
03770   a.back_cast(), *b.clone(), 2 );
03771 }
03772 
03773 template <class T1, class T2>
03774 inline
03775 sc_concref<T1,T2>
03776 operator , ( sc_proxy<T1>& a, sc_proxy<T2>& b )
03777 {
03778     return sc_concref<T1,T2>(
03779   a.back_cast(), b.back_cast() );
03780 }
03781 
03782 
03783 template <class T1, class T2>
03784 inline
03785 sc_concref<T1,sc_bitref<T2> >
03786 concat( sc_proxy<T1>& a, sc_bitref<T2> b )
03787 {
03788     return sc_concref<T1,sc_bitref<T2> >(
03789   a.back_cast(), *b.clone(), 2 );
03790 }
03791 
03792 template <class T1, class T2>
03793 inline
03794 sc_concref<T1,sc_subref<T2> >
03795 concat( sc_proxy<T1>& a, sc_subref<T2> b )
03796 {
03797     return sc_concref<T1,sc_subref<T2> >(
03798   a.back_cast(), *b.clone(), 2 );
03799 }
03800 
03801 template <class T1, class T2, class T3>
03802 inline
03803 sc_concref<T1,sc_concref<T2,T3> >
03804 concat( sc_proxy<T1>& a, sc_concref<T2,T3> b )
03805 {
03806     return sc_concref<T1,sc_concref<T2,T3> >(
03807   a.back_cast(), *b.clone(), 2 );
03808 }
03809 
03810 template <class T1, class T2>
03811 inline
03812 sc_concref<T1,T2>
03813 concat( sc_proxy<T1>& a, sc_proxy<T2>& b )
03814 {
03815     return sc_concref<T1,T2>(
03816   a.back_cast(), b.back_cast() );
03817 }
03818 
03819 } // namespace sc_dt
03820 
03821 
03822 #endif

Generated on Fri Jan 14 08:29:00 2005 for SystemC2.1beta11(excludingMSLib)(IncludingSCV)\nProvidedby:www.openverificationfoundation.org by doxygen1.2.18