| /***************************************************************************** |
| |
| 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! |