summaryrefslogtreecommitdiff
path: root/ext/systemc/src/sysc/communication/sc_export.h
diff options
context:
space:
mode:
Diffstat (limited to 'ext/systemc/src/sysc/communication/sc_export.h')
-rw-r--r--ext/systemc/src/sysc/communication/sc_export.h299
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!