diff options
Diffstat (limited to 'ext/systemc/src/sysc/communication/sc_export.h')
-rw-r--r-- | ext/systemc/src/sysc/communication/sc_export.h | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/ext/systemc/src/sysc/communication/sc_export.h b/ext/systemc/src/sysc/communication/sc_export.h new file mode 100644 index 000000000..81edc8cc2 --- /dev/null +++ b/ext/systemc/src/sysc/communication/sc_export.h @@ -0,0 +1,299 @@ +/***************************************************************************** + + Licensed to Accellera Systems Initiative Inc. (Accellera) under one or + more contributor license agreements. See the NOTICE file distributed + with this work for additional information regarding copyright ownership. + Accellera licenses this file to you under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with the + License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied. See the License for the specific language governing + permissions and limitations under the License. + + *****************************************************************************/ + +/***************************************************************************** + + sc_export.h -- Base classes of all export classes. + + Original Author: Andy Goodrich, Forte Design Systems + Bishnupriya Bhattacharya, Cadence Design Systems + + CHANGE LOG IS AT THE END OF THE FILE + *****************************************************************************/ + +#ifndef SC_EXPORT_H +#define SC_EXPORT_H +#include <typeinfo> + +#include "sysc/communication/sc_communication_ids.h" +#include "sysc/communication/sc_interface.h" +#include "sysc/kernel/sc_object.h" + +#if ! defined( SC_DISABLE_VIRTUAL_BIND ) +# define SC_VIRTUAL_ virtual +#else +# define SC_VIRTUAL_ /* non-virtual */ +#endif + +namespace sc_core { + +//============================================================================= +// CLASS : sc_export_base +// +// Abstract base class for class sc_export<IF>. +//============================================================================= + +class sc_export_base : public sc_object +{ + friend class sc_export_registry; +public: + + // typedefs + + typedef sc_export_base this_type; + +public: + + virtual sc_interface* get_interface() = 0; + virtual const sc_interface* get_interface() const = 0; + +protected: + + // constructors + + sc_export_base(); + sc_export_base(const char* name); + + // destructor + + virtual ~sc_export_base(); + +protected: + + // called when construction is done + virtual void before_end_of_elaboration(); + + // called when elaboration is done (does nothing by default) + virtual void end_of_elaboration(); + + // called before simulation starts (does nothing by default) + virtual void start_of_simulation(); + + // called after simulation ends (does nothing) + virtual void end_of_simulation(); + + virtual const char* if_typename() const = 0; + + // error reporting + void report_error( const char* id, const char* add_msg = 0) const; + +private: + + void construction_done(); + void elaboration_done(); + void start_simulation(); + void simulation_done(); + + // disabled + sc_export_base(const this_type&); + this_type& operator = (const this_type& ); + +}; + +//============================================================================= +// CLASS : sc_export +// +// Generic export class for other export classes. This +// class provides a binding point for access to an interface. +//============================================================================= +template<class IF> +class sc_export : public sc_export_base +{ + typedef sc_export<IF> this_type; + +public: // constructors: + sc_export() : sc_export_base() + { + m_interface_p = 0; + } + + explicit sc_export( const char* name_ ) : sc_export_base(name_) + { + m_interface_p = 0; + } + +public: // destructor: + virtual ~sc_export() + { + } + +public: // interface access: + + virtual sc_interface* get_interface() + { + return m_interface_p; + } + + virtual const sc_interface* get_interface() const + { + return m_interface_p; + } + + const IF* operator -> () const { + if ( m_interface_p == 0 ) + { + SC_REPORT_ERROR(SC_ID_SC_EXPORT_HAS_NO_INTERFACE_,name()); + } + return m_interface_p; + } + + IF* operator -> () { + if ( m_interface_p == 0 ) + { + SC_REPORT_ERROR(SC_ID_SC_EXPORT_HAS_NO_INTERFACE_,name()); + } + return m_interface_p; + } + + operator IF& () + { + if ( m_interface_p == 0 ) + { + SC_REPORT_ERROR(SC_ID_SC_EXPORT_HAS_NO_INTERFACE_,name()); + } + return *m_interface_p; + } + operator const IF&() const + { return *const_cast<this_type*>(this); } + + +public: // binding: + SC_VIRTUAL_ void bind( IF& interface_ ) + { + if ( m_interface_p ) + { + SC_REPORT_ERROR(SC_ID_SC_EXPORT_ALREADY_BOUND_,name()); + } + else + { + m_interface_p = &interface_; + } + } + + void operator () ( IF& interface_ ) + { + this->bind(interface_); + } + +public: // identification: + virtual const char* kind() const { return "sc_export"; } + +protected: + const char* if_typename() const { + return typeid( IF ).name(); + } + +private: // disabled + sc_export( const this_type& ); + this_type& operator = ( const this_type& ); + +protected: // data fields: + IF* m_interface_p; // Interface this port provides. +}; + +// ---------------------------------------------------------------------------- +// CLASS : sc_export_registry +// +// Registry for all exports. +// FOR INTERNAL USE ONLY! +// ---------------------------------------------------------------------------- + +class sc_export_registry +{ + friend class sc_simcontext; + +public: + + void insert( sc_export_base* ); + void remove( sc_export_base* ); + + int size() const + { return m_export_vec.size(); } + +private: + + // constructor + explicit sc_export_registry( sc_simcontext& simc_ ); + + // destructor + ~sc_export_registry(); + + // called when construction is done + bool construction_done(); + + // called when elaboration is done + void elaboration_done(); + + // called before simulation starts + void start_simulation(); + + // called after simulation ends + void simulation_done(); + +private: + + int m_construction_done; + std::vector<sc_export_base*> m_export_vec; + sc_simcontext* m_simc; + +private: + + // disabled + sc_export_registry(); + sc_export_registry( const sc_export_registry& ); + sc_export_registry& operator = ( const sc_export_registry& ); +}; + +} // namespace sc_core + +#undef SC_VIRTUAL_ + +// $Log: sc_export.h,v $ +// Revision 1.7 2011/08/26 20:45:40 acg +// Andy Goodrich: moved the modification log to the end of the file to +// eliminate source line number skew when check-ins are done. +// +// Revision 1.6 2011/05/09 04:07:37 acg +// Philipp A. Hartmann: +// (1) Restore hierarchy in all phase callbacks. +// (2) Ensure calls to before_end_of_elaboration. +// +// Revision 1.5 2011/04/02 00:02:14 acg +// Philipp A. Hartmann: add const overload for sc_export::operator IF& +// +// Revision 1.4 2011/02/18 20:23:45 acg +// Andy Goodrich: Copyright update. +// +// Revision 1.3 2011/02/14 17:50:16 acg +// Andy Goodrich: testing for sc_port and sc_export instantiations during +// end of elaboration and issuing appropriate error messages. +// +// Revision 1.2 2011/01/20 16:52:15 acg +// Andy Goodrich: changes for IEEE 1666 2011. +// +// Revision 1.1.1.1 2006/12/15 20:20:04 acg +// SystemC 2.3 +// +// Revision 1.3 2006/01/13 18:47:42 acg +// Added $Log command so that CVS comments are reproduced in the source. +// + +#endif + +// Taf! |