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

Generated on Wed Jan 21 15:32:07 2009 for SystemC by  doxygen 1.5.5