sc_signal_ports.h
来自「基于4个mips核的noc设计」· C头文件 代码 · 共 1,744 行 · 第 1/3 页
H
1,744 行
/***************************************************************************** The following code is derived, directly or indirectly, from the SystemC source code Copyright (c) 1996-2002 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.3 (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_signal_ports.h -- The sc_signal<T> port classes. Original Author: Martin Janssen, Synopsys, Inc., 2001-05-21 *****************************************************************************//***************************************************************************** MODIFICATION LOG - modifiers, enter your name, affiliation, date and changes you are making here. Name, Affiliation, Date: Jason Elbaum, Motorola, Inc., 2001-11-12 Description of Modification: Added a static, private, otherwise unused data member to the sc_in and sc_inout classes to address a bug in the GNU compiler *only*. This works around a bug in g++ 2.95.2 regarding implicit casting from a templated class to a C++ intrinsic type. *****************************************************************************/#ifndef SC_SIGNAL_PORTS_H#define SC_SIGNAL_PORTS_H#include "systemc/communication/sc_event_finder.h"#include "systemc/communication/sc_port.h"#include "systemc/communication/sc_signal_ifs.h"#include "systemc/datatypes/bit/sc_logic.h"#include "systemc/tracing/sc_trace.h"using sc_dt::sc_logic;// ----------------------------------------------------------------------------// STRUCT : sc_trace_params//// Struct for storing the trace file and object name of an sc_trace call.// FOR INTERNAL USE ONLY!// ----------------------------------------------------------------------------struct sc_trace_params{ sc_trace_file* tf; sc_string name; sc_trace_params( sc_trace_file* tf_, const sc_string& name_ ) : tf( tf_ ), name( name_ ) {}};typedef sc_pvector<sc_trace_params*> sc_trace_params_vec;// ----------------------------------------------------------------------------// CLASS : sc_in<T>//// The sc_signal<T> input port class.// ----------------------------------------------------------------------------template <class T>class sc_in: public sc_port<sc_signal_in_if<T>,1>{public: // typedefs typedef T data_type; typedef sc_signal_in_if<data_type> if_type; typedef sc_port<if_type,1> base_type; typedef sc_in<data_type> this_type; typedef if_type in_if_type; typedef base_type in_port_type; typedef sc_signal_inout_if<data_type> inout_if_type; typedef sc_port<inout_if_type,1> inout_port_type;public: // constructors sc_in() : base_type(), m_traces( 0 ) {} explicit sc_in( const char* name_ ) : base_type( name_ ), m_traces( 0 ) {} explicit sc_in( const in_if_type& interface_ ) : base_type( CCAST<in_if_type&>( interface_ ) ), m_traces( 0 ) {} sc_in( const char* name_, const in_if_type& interface_ ) : base_type( name_, CCAST<in_if_type&>( interface_ ) ), m_traces( 0 ) {} explicit sc_in( in_port_type& parent_ ) : base_type( parent_ ), m_traces( 0 ) {} sc_in( const char* name_, in_port_type& parent_ ) : base_type( name_, parent_ ), m_traces( 0 ) {} explicit sc_in( inout_port_type& parent_ ) : base_type(), m_traces( 0 ) { sc_port_base::bind( parent_ ); } sc_in( const char* name_, inout_port_type& parent_ ) : base_type( name_ ), m_traces( 0 ) { sc_port_base::bind( parent_ ); } sc_in( this_type& parent_ ) : base_type( parent_ ), m_traces( 0 ) {} sc_in( const char* name_, this_type& parent_ ) : base_type( name_, parent_ ), m_traces( 0 ) {} // destructor virtual ~sc_in() { remove_traces(); } // bind to in interface void bind( const in_if_type& interface_ ) { sc_port_base::bind( CCAST<in_if_type&>( interface_ ) ); } void operator () ( const in_if_type& interface_ ) { sc_port_base::bind( CCAST<in_if_type&>( interface_ ) ); } // bind to parent in port void bind( in_port_type& parent_ ) { sc_port_base::bind( parent_ ); } void operator () ( in_port_type& parent_ ) { sc_port_base::bind( parent_ ); } // bind to parent inout port void bind( inout_port_type& parent_ ) { sc_port_base::bind( parent_ ); } void operator () ( inout_port_type& parent_ ) { sc_port_base::bind( parent_ ); } // interface access shortcut methods // get the default event const sc_event& default_event() const { return (*this)->default_event(); } // get the value changed event const sc_event& value_changed_event() const { return (*this)->value_changed_event(); } // read the current value const data_type& read() const { return (*this)->read(); } operator const data_type& () const { return (*this)->read(); } // was there a value changed event? bool event() const { return (*this)->event(); } // (other) event finder method(s) sc_event_finder& value_changed() const { return *new sc_event_finder_t<in_if_type>( *this, &in_if_type::value_changed_event ); } // called when elaboration is done /* WHEN DEFINING THIS METHOD IN A DERIVED CLASS, */ /* MAKE SURE THAT THIS METHOD IS CALLED AS WELL. */ virtual void end_of_elaboration(); static const char* const kind_string; virtual const char* kind() const { return kind_string; } // called by sc_trace void add_trace( sc_trace_file*, const sc_string& ) const;protected: void remove_traces() const; mutable sc_trace_params_vec* m_traces;protected: // called by pbind (for internal use only) virtual int vbind( sc_interface& ); virtual int vbind( sc_port_base& );private: // disabled sc_in( const this_type& ); this_type& operator = ( const this_type& );#ifdef __GNUC__ // Needed to circumvent a problem in the g++-2.95.2 compiler: // This unused variable forces the compiler to instantiate // an object of T template so an implicit conversion from // read() to a C++ intrinsic data type will work. static data_type dummy;#endif};// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIItemplate <class T>const char* const sc_in<T>::kind_string = "sc_in";// called when elaboration is donetemplate <class T>inlinevoidsc_in<T>::end_of_elaboration(){ if( m_traces != 0 ) { for( int i = 0; i < m_traces->size(); ++ i ) { sc_trace_params* p = (*m_traces)[i]; in_if_type* iface = DCAST<in_if_type*>( this->get_interface() ); sc_trace( p->tf, iface->get_data_ref(), p->name ); } remove_traces(); }}// called by sc_tracetemplate <class T>inlinevoidsc_in<T>::add_trace( sc_trace_file* tf_, const sc_string& name_ ) const{ if( tf_ != 0 ) { if( m_traces == 0 ) { m_traces = new sc_trace_params_vec; } m_traces->push_back( new sc_trace_params( tf_, name_ ) ); }}template <class T>inlinevoidsc_in<T>::remove_traces() const{ if( m_traces != 0 ) { for( int i = m_traces->size() - 1; i >= 0; -- i ) { delete (*m_traces)[i]; } delete m_traces; m_traces = 0; }}// called by pbind (for internal use only)template <class T>inlineintsc_in<T>::vbind( sc_interface& interface_ ){ return sc_port_b<if_type>::vbind( interface_ );}template <class T>inlineintsc_in<T>::vbind( sc_port_base& parent_ ){ in_port_type* in_parent = DCAST<in_port_type*>( &parent_ ); if( in_parent != 0 ) { sc_port_base::bind( *in_parent ); return 0; } inout_port_type* inout_parent = DCAST<inout_port_type*>( &parent_ ); if( inout_parent != 0 ) { sc_port_base::bind( *inout_parent ); return 0; } // type mismatch return 2;}// ----------------------------------------------------------------------------// CLASS : sc_in<bool>//// Specialization of sc_in<T> for type bool.// ----------------------------------------------------------------------------template <>class sc_in<bool>: public sc_port<sc_signal_in_if<bool>,1>{public: // typedefs typedef bool data_type; typedef sc_signal_in_if<data_type> if_type; typedef sc_port<if_type,1> base_type; typedef sc_in<data_type> this_type; typedef if_type in_if_type; typedef base_type in_port_type; typedef sc_signal_inout_if<data_type> inout_if_type; typedef sc_port<inout_if_type,1> inout_port_type;public: // constructors sc_in() : base_type(), m_traces( 0 ) {} explicit sc_in( const char* name_ ) : base_type( name_ ), m_traces( 0 ) {} explicit sc_in( const in_if_type& interface_ ) : base_type( CCAST<in_if_type&>( interface_ ) ), m_traces( 0 ) {} sc_in( const char* name_, const in_if_type& interface_ ) : base_type( name_, CCAST<in_if_type&>( interface_ ) ), m_traces( 0 ) {} explicit sc_in( in_port_type& parent_ ) : base_type( parent_ ), m_traces( 0 ) {} sc_in( const char* name_, in_port_type& parent_ ) : base_type( name_, parent_ ), m_traces( 0 ) {} explicit sc_in( inout_port_type& parent_ ) : base_type(), m_traces( 0 ) { sc_port_base::bind( parent_ ); } sc_in( const char* name_, inout_port_type& parent_ ) : base_type( name_ ), m_traces( 0 ) { sc_port_base::bind( parent_ ); } sc_in( this_type& parent_ ) : base_type( parent_ ), m_traces( 0 ) {} sc_in( const char* name_, this_type& parent_ ) : base_type( name_, parent_ ), m_traces( 0 ) {} // destructor virtual ~sc_in() { remove_traces(); } // bind to in interface void bind( const in_if_type& interface_ ) { sc_port_base::bind( CCAST<in_if_type&>( interface_ ) ); } void operator () ( const in_if_type& interface_ ) { sc_port_base::bind( CCAST<in_if_type&>( interface_ ) ); } // bind to parent in port void bind( in_port_type& parent_ ) { sc_port_base::bind( parent_ ); } void operator () ( in_port_type& parent_ ) { sc_port_base::bind( parent_ ); } // bind to parent inout port void bind( inout_port_type& parent_ ) { sc_port_base::bind( parent_ ); } void operator () ( inout_port_type& parent_ ) { sc_port_base::bind( parent_ ); } // interface access shortcut methods // get the default event const sc_event& default_event() const { return (*this)->default_event(); } // get the value changed event const sc_event& value_changed_event() const { return (*this)->value_changed_event(); } // get the positive edge event const sc_event& posedge_event() const { return (*this)->posedge_event(); } // get the negative edge event const sc_event& negedge_event() const { return (*this)->negedge_event(); } // read the current value const data_type& read() const { return (*this)->read(); } operator const data_type& () const { return (*this)->read(); } // use for positive edge sensitivity sc_event_finder& pos() const { return *new sc_event_finder_t<in_if_type>( *this, &in_if_type::posedge_event ); } // use for negative edge sensitivity sc_event_finder& neg() const { return *new sc_event_finder_t<in_if_type>( *this, &in_if_type::negedge_event ); } // was there a value changed event? bool event() const { return (*this)->event(); } // was there a positive edge event? bool posedge() const { return (*this)->posedge(); } // was there a negative edge event? bool negedge() const { return (*this)->negedge(); } // delayed evaluation const sc_signal_bool_deval& delayed() const; // (other) event finder method(s) sc_event_finder& value_changed() const { return *new sc_event_finder_t<in_if_type>( *this, &in_if_type::value_changed_event ); } // called when elaboration is done /* WHEN DEFINING THIS METHOD IN A DERIVED CLASS, */ /* MAKE SURE THAT THIS METHOD IS CALLED AS WELL. */ virtual void end_of_elaboration(); static const char* const kind_string; virtual const char* kind() const { return kind_string; } // called by sc_trace void add_trace( sc_trace_file*, const sc_string& ) const;protected: void remove_traces() const; mutable sc_trace_params_vec* m_traces;protected: // called by pbind (for internal use only) virtual int vbind( sc_interface& ); virtual int vbind( sc_port_base& );private: // disabled sc_in( const this_type& ); this_type& operator = ( const this_type& );#ifdef __GNUC__ // Needed to circumvent a problem in the g++-2.95.2 compiler: // This unused variable forces the compiler to instantiate // an object of T template so an implicit conversion from // read() to a C++ intrinsic data type will work. static data_type dummy;#endif};// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII// delayed evaluationinlineconst sc_signal_bool_deval&sc_in<bool>::delayed() const{ const in_if_type* iface = DCAST<const in_if_type*>( get_interface() ); if( iface != 0 ) { return RCAST<const sc_signal_bool_deval&>( *iface ); } else {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?