📄 sc_bit_proxies.h
字号:
/***************************************************************************** The following code is derived, directly or indirectly, from the SystemC source code Copyright (c) 1996-2006 by all Contributors. All Rights reserved. The contents of this file are subject to the restrictions and limitations set forth in the SystemC Open Source License Version 2.4 (the "License"); You may not use this file except in compliance with such restrictions and limitations. You may obtain instructions on how to receive a copy of the License at http://www.systemc.org/. Software distributed by Contributors under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. *****************************************************************************//***************************************************************************** sc_bit_proxies.h -- Proxy classes for vector data types. Original Author: Gene Bushuyev, Synopsys, Inc. *****************************************************************************//***************************************************************************** MODIFICATION LOG - modifiers, enter your name, affiliation, date and changes you are making here. Name, Affiliation, Date: Description of Modification: *****************************************************************************/// $Log: sc_bit_proxies.h,v $// Revision 1.4 2007/03/14 17:47:49 acg// Andy Goodrich: Formatting.//// Revision 1.3 2007/01/18 19:29:18 acg// Andy Goodrich: fixed bug in concatenations of bit selects on sc_lv and// sc_bv types. The offending code was in sc_bitref<X>::set_word and// sc_bitref<X>::get_word. These methods were not writing the bit they// represented, but rather writing an entire word whose index was the// index of the bit they represented. This not only did not write the// correct bit, but clobbered a word that might not even be in the// variable the reference was for.//// Revision 1.2 2007/01/17 22:45:08 acg// Andy Goodrich: fixed sc_bitref<X>::set_bit().//// Revision 1.1.1.1 2006/12/15 20:31:36 acg// SystemC 2.2//// Revision 1.3 2006/01/13 18:53:53 acg// Andy Goodrich: added $Log command so that CVS comments are reproduced in// the source.//#ifndef SC_BIT_PROXIES_H#define SC_BIT_PROXIES_H#include "sysc/datatypes/bit/sc_bit_ids.h"#include "sysc/datatypes/bit/sc_proxy.h"namespace sc_dt{// classes defined in this moduletemplate <class X> class sc_bitref_r;template <class X> class sc_bitref;template <class X> class sc_subref_r;template <class X> class sc_subref;template <class X, class Y> class sc_concref_r;template <class X, class Y> class sc_concref;// ----------------------------------------------------------------------------// CLASS TEMPLATE : sc_bitref_r<T>//// Proxy class for sc_proxy bit selection (r-value only).// ----------------------------------------------------------------------------template <class T>class sc_bitref_r{ friend class sc_bv_base; friend class sc_lv_base;public: // constructor sc_bitref_r( const T& obj_, int index_ ) : m_obj( CCAST<T&>( obj_ ) ), m_index( index_ ) {} // copy constructor sc_bitref_r( const sc_bitref_r<T>& a ) : m_obj( a.m_obj ), m_index( a.m_index ) {} // cloning sc_bitref_r<T>* clone() const { return new sc_bitref_r<T>( *this ); } // bitwise operators and functions // bitwise complement const sc_logic operator ~ () const { return sc_logic( sc_logic::not_table[value()] ); } // implicit conversion to sc_logic operator const sc_logic() const { return sc_logic( m_obj.get_bit( m_index ) ); } // explicit conversions sc_logic_value_t value() const { return m_obj.get_bit( m_index ); } bool is_01() const { return sc_logic( value() ).is_01(); } bool to_bool() const { return sc_logic( value() ).to_bool(); } char to_char() const { return sc_logic( value() ).to_char(); } // common methods int length() const { return 1; } int size() const { return ( (length() - 1) / SC_DIGIT_SIZE + 1 ); } sc_logic_value_t get_bit( int n ) const; sc_digit get_word( int i ) const; sc_digit get_cword( int i ) const; // other methods void print( ::std::ostream& os = ::std::cout ) const { os << to_char(); }protected: T& m_obj; int m_index;private: // disabled sc_bitref_r(); sc_bitref_r<T>& operator = ( const sc_bitref_r<T>& );};// bitwise operators and functions// bitwise andtemplate <class T1, class T2>inlineconst sc_logicoperator & ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );// bitwise ortemplate <class T1, class T2>inlineconst sc_logicoperator | ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );// bitwise xortemplate <class T1, class T2>inlineconst sc_logicoperator ^ ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );// relational operators and functionstemplate <class T1, class T2>inlinebooloperator == ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );template <class T1, class T2>inlinebooloperator != ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b );// r-value concatenation operators and functionstemplate <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >operator , ( sc_bitref_r<T1>, sc_bitref_r<T2> );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >operator , ( sc_bitref_r<T1>, sc_subref_r<T2> );template <class T1, class T2, class T3>inlinesc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >operator , ( sc_bitref_r<T1>, sc_concref_r<T2,T3> );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,T2>operator , ( sc_bitref_r<T1>, const sc_proxy<T2>& );template <class T>inlinesc_concref_r<sc_bitref_r<T>,sc_lv_base>operator , ( sc_bitref_r<T>, const char* );template <class T>inlinesc_concref_r<sc_lv_base,sc_bitref_r<T> >operator , ( const char*, sc_bitref_r<T> );template <class T>inlinesc_concref_r<sc_bitref_r<T>,sc_lv_base>operator , ( sc_bitref_r<T>, const sc_logic& );template <class T>inlinesc_concref_r<sc_lv_base,sc_bitref_r<T> >operator , ( const sc_logic&, sc_bitref_r<T> );template <class T>inlinesc_concref_r<sc_bitref_r<T>,sc_lv_base>operator , ( sc_bitref_r<T>, bool );template <class T>inlinesc_concref_r<sc_lv_base,sc_bitref_r<T> >operator , ( bool, sc_bitref_r<T> );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >concat( sc_bitref_r<T1>, sc_bitref_r<T2> );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >concat( sc_bitref_r<T1>, sc_subref_r<T2> );template <class T1, class T2, class T3>inlinesc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >concat( sc_bitref_r<T1>, sc_concref_r<T2,T3> );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,T2>concat( sc_bitref_r<T1>, const sc_proxy<T2>& );template <class T>inlinesc_concref_r<sc_bitref_r<T>,sc_lv_base>concat( sc_bitref_r<T>, const char* );template <class T>inlinesc_concref_r<sc_lv_base,sc_bitref_r<T> >concat( const char*, sc_bitref_r<T> );template <class T>inlinesc_concref_r<sc_bitref_r<T>,sc_lv_base>concat( sc_bitref_r<T>, const sc_logic& );template <class T>inlinesc_concref_r<sc_lv_base,sc_bitref_r<T> >concat( const sc_logic&, sc_bitref_r<T> );template <class T>inlinesc_concref_r<sc_bitref_r<T>,sc_lv_base>concat( sc_bitref_r<T>, bool );template <class T>inlinesc_concref_r<sc_lv_base,sc_bitref_r<T> >concat( bool, sc_bitref_r<T> );#ifdef SC_DT_MIXED_COMMA_OPERATORStemplate <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >operator , ( sc_bitref_r<T1>, sc_bitref<T2> );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >operator , ( sc_bitref<T1>, sc_bitref_r<T2> );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >operator , ( sc_bitref_r<T1>, sc_subref<T2> );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >operator , ( sc_bitref<T1>, sc_subref_r<T2> );template <class T1, class T2, class T3>inlinesc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >operator , ( sc_bitref_r<T1>, sc_concref<T2,T3> );template <class T1, class T2, class T3>inlinesc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >operator , ( sc_bitref<T1>, sc_concref_r<T2,T3> );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,T2>operator , ( sc_bitref<T1>, const sc_proxy<T2>& );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,T2>operator , ( sc_bitref_r<T1>, sc_proxy<T2>& );template <class T>inlinesc_concref_r<sc_bitref_r<T>,sc_lv_base>operator , ( sc_bitref<T>, const char* );template <class T>inlinesc_concref_r<sc_lv_base,sc_bitref_r<T> >operator , ( const char*, sc_bitref<T> );template <class T>inlinesc_concref_r<sc_bitref_r<T>,sc_lv_base>operator , ( sc_bitref<T>, const sc_logic& );template <class T>inlinesc_concref_r<sc_lv_base,sc_bitref_r<T> >operator , ( const sc_logic&, sc_bitref<T> );template <class T>inlinesc_concref_r<sc_bitref_r<T>,sc_lv_base>operator , ( sc_bitref<T>, bool );template <class T>inlinesc_concref_r<sc_lv_base,sc_bitref_r<T> >operator , ( bool, sc_bitref<T> );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >concat( sc_bitref_r<T1>, sc_bitref<T2> );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >concat( sc_bitref<T1>, sc_bitref_r<T2> );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >concat( sc_bitref_r<T1>, sc_subref<T2> );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >concat( sc_bitref<T1>, sc_subref_r<T2> );template <class T1, class T2, class T3>inlinesc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >concat( sc_bitref_r<T1>, sc_concref<T2,T3> );template <class T1, class T2, class T3>inlinesc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >concat( sc_bitref<T1>, sc_concref_r<T2,T3> );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,T2>concat( sc_bitref<T1>, const sc_proxy<T2>& );template <class T1, class T2>inlinesc_concref_r<sc_bitref_r<T1>,T2>concat( sc_bitref_r<T1>, sc_proxy<T2>& );template <class T>inlinesc_concref_r<sc_bitref_r<T>,sc_lv_base>concat( sc_bitref<T>, const char* );template <class T>inlinesc_concref_r<sc_lv_base,sc_bitref_r<T> >concat( const char*, sc_bitref<T> );template <class T>inlinesc_concref_r<sc_bitref_r<T>,sc_lv_base>concat( sc_bitref<T>, const sc_logic& );template <class T>inlinesc_concref_r<sc_lv_base,sc_bitref_r<T> >concat( const sc_logic&, sc_bitref<T> );template <class T>inlinesc_concref_r<sc_bitref_r<T>,sc_lv_base>concat( sc_bitref<T>, bool );template <class T>inlinesc_concref_r<sc_lv_base,sc_bitref_r<T> >concat( bool, sc_bitref<T> );#endif// ----------------------------------------------------------------------------// CLASS TEMPLATE : sc_bitref<X>//// Proxy class for sc_proxy bit selection (r-value and l-value).// ----------------------------------------------------------------------------template <class X>class sc_bitref : public sc_bitref_r<X>{ friend class sc_bv_base; friend class sc_lv_base;public: // constructor sc_bitref( X& obj_, int index_ ) : sc_bitref_r<X>( obj_, index_ ) {} // copy constructor sc_bitref( const sc_bitref<X>& a ) : sc_bitref_r<X>( a ) {} // cloning sc_bitref<X>* clone() const { return new sc_bitref<X>( *this ); } // assignment operators sc_bitref<X>& operator = ( const sc_bitref_r<X>& a ); sc_bitref<X>& operator = ( const sc_bitref<X>& a ); sc_bitref<X>& operator = ( const sc_logic& a ) { this->m_obj.set_bit( this->m_index, a.value() ); return *this; } sc_bitref<X>& operator = ( sc_logic_value_t v ) { *this = sc_logic( v ); return *this; } sc_bitref<X>& operator = ( bool a ) { *this = sc_logic( a ); return *this; } sc_bitref<X>& operator = ( char a ) { *this = sc_logic( a ); return *this; } sc_bitref<X>& operator = ( int a ) { *this = sc_logic( a ); return *this; } sc_bitref<X>& operator = ( const sc_bit& a ) { *this = sc_logic( a ); return *this; } // bitwise assignment operators sc_bitref<X>& operator &= ( const sc_bitref_r<X>& a ); sc_bitref<X>& operator &= ( const sc_logic& a ); sc_bitref<X>& operator &= ( sc_logic_value_t v ) { *this &= sc_logic( v ); return *this; } sc_bitref<X>& operator &= ( bool a ) { *this &= sc_logic( a ); return *this; } sc_bitref<X>& operator &= ( char a ) { *this &= sc_logic( a ); return *this; } sc_bitref<X>& operator &= ( int a ) { *this &= sc_logic( a ); return *this; } sc_bitref<X>& operator |= ( const sc_bitref_r<X>& a ); sc_bitref<X>& operator |= ( const sc_logic& a ); sc_bitref<X>& operator |= ( sc_logic_value_t v ) { *this |= sc_logic( v ); return *this; } sc_bitref<X>& operator |= ( bool a ) { *this |= sc_logic( a ); return *this; } sc_bitref<X>& operator |= ( char a ) { *this |= sc_logic( a ); return *this; } sc_bitref<X>& operator |= ( int a ) { *this |= sc_logic( a ); return *this; } sc_bitref<X>& operator ^= ( const sc_bitref_r<X>& a ); sc_bitref<X>& operator ^= ( const sc_logic& a ); sc_bitref<X>& operator ^= ( sc_logic_value_t v ) { *this ^= sc_logic( v ); return *this; } sc_bitref<X>& operator ^= ( bool a ) { *this ^= sc_logic( a ); return *this; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -