summaryrefslogtreecommitdiff
path: root/ext/systemc/src/sysc/communication/sc_prim_channel.h
diff options
context:
space:
mode:
Diffstat (limited to 'ext/systemc/src/sysc/communication/sc_prim_channel.h')
-rw-r--r--ext/systemc/src/sysc/communication/sc_prim_channel.h420
1 files changed, 420 insertions, 0 deletions
diff --git a/ext/systemc/src/sysc/communication/sc_prim_channel.h b/ext/systemc/src/sysc/communication/sc_prim_channel.h
new file mode 100644
index 000000000..4a52fe7cb
--- /dev/null
+++ b/ext/systemc/src/sysc/communication/sc_prim_channel.h
@@ -0,0 +1,420 @@
+/*****************************************************************************
+
+ 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_prim_channel.h -- Abstract base class of all primitive channel classes.
+
+ Original Author: Martin Janssen, Synopsys, Inc., 2001-05-21
+
+ CHANGE LOG AT THE END OF THE FILE
+ *****************************************************************************/
+
+#ifndef SC_PRIM_CHANNEL_H
+#define SC_PRIM_CHANNEL_H
+
+#include "sysc/kernel/sc_object.h"
+#include "sysc/kernel/sc_wait.h"
+#include "sysc/kernel/sc_wait_cthread.h"
+
+namespace sc_core {
+
+// ----------------------------------------------------------------------------
+// CLASS : sc_prim_channel
+//
+// Abstract base class of all primitive channel classes.
+// ----------------------------------------------------------------------------
+
+class sc_prim_channel
+: public sc_object
+{
+ friend class sc_prim_channel_registry;
+
+public:
+ enum { list_end = 0xdb };
+public:
+ virtual const char* kind() const
+ { return "sc_prim_channel"; }
+
+ inline bool update_requested()
+ { return m_update_next_p != (sc_prim_channel*)list_end; }
+
+ // request the update method to be executed during the update phase
+ inline void request_update();
+
+ // request the update method to be executed during the update phase
+ // from a process external to the simulator.
+ void async_request_update();
+
+protected:
+
+ // constructors
+ sc_prim_channel();
+ explicit sc_prim_channel( const char* );
+
+ // destructor
+ virtual ~sc_prim_channel();
+
+ // the update method (does nothing by default)
+ virtual void update();
+
+ // called by construction_done (does nothing by default)
+ virtual void before_end_of_elaboration();
+
+ // called by elaboration_done (does nothing by default)
+ virtual void end_of_elaboration();
+
+ // called by start_simulation (does nothing by default)
+ virtual void start_of_simulation();
+
+ // called by simulation_done (does nothing by default)
+ virtual void end_of_simulation();
+
+protected:
+
+ // to avoid calling sc_get_curr_simcontext()
+
+ // static sensitivity for SC_THREADs and SC_CTHREADs
+
+ void wait()
+ { sc_core::wait( simcontext() ); }
+
+
+ // dynamic sensitivity for SC_THREADs and SC_CTHREADs
+
+ void wait( const sc_event& e )
+ { sc_core::wait( e, simcontext() ); }
+
+ void wait( const sc_event_or_list& el )
+ { sc_core::wait( el, simcontext() ); }
+
+ void wait( const sc_event_and_list& el )
+ { sc_core::wait( el, simcontext() ); }
+
+ void wait( const sc_time& t )
+ { sc_core::wait( t, simcontext() ); }
+
+ void wait( double v, sc_time_unit tu )
+ { sc_core::wait( sc_time( v, tu, simcontext() ), simcontext() ); }
+
+ void wait( const sc_time& t, const sc_event& e )
+ { sc_core::wait( t, e, simcontext() ); }
+
+ void wait( double v, sc_time_unit tu, const sc_event& e )
+ { sc_core::wait( sc_time( v, tu, simcontext() ), e, simcontext() ); }
+
+ void wait( const sc_time& t, const sc_event_or_list& el )
+ { sc_core::wait( t, el, simcontext() ); }
+
+ void wait( double v, sc_time_unit tu, const sc_event_or_list& el )
+ { sc_core::wait( sc_time( v, tu, simcontext() ), el, simcontext() ); }
+
+ void wait( const sc_time& t, const sc_event_and_list& el )
+ { sc_core::wait( t, el, simcontext() ); }
+
+ void wait( double v, sc_time_unit tu, const sc_event_and_list& el )
+ { sc_core::wait( sc_time( v, tu, simcontext() ), el, simcontext() ); }
+
+ void wait( int n )
+ { sc_core::wait( n, simcontext() ); }
+
+
+ // static sensitivity for SC_METHODs
+
+ void next_trigger()
+ { sc_core::next_trigger( simcontext() ); }
+
+
+ // dynamic sensitivity for SC_METHODs
+
+ void next_trigger( const sc_event& e )
+ { sc_core::next_trigger( e, simcontext() ); }
+
+ void next_trigger( const sc_event_or_list& el )
+ { sc_core::next_trigger( el, simcontext() ); }
+
+ void next_trigger( const sc_event_and_list& el )
+ { sc_core::next_trigger( el, simcontext() ); }
+
+ void next_trigger( const sc_time& t )
+ { sc_core::next_trigger( t, simcontext() ); }
+
+ void next_trigger( double v, sc_time_unit tu )
+ {sc_core::next_trigger( sc_time( v, tu, simcontext() ), simcontext() );}
+
+ void next_trigger( const sc_time& t, const sc_event& e )
+ { sc_core::next_trigger( t, e, simcontext() ); }
+
+ void next_trigger( double v, sc_time_unit tu, const sc_event& e )
+ { sc_core::next_trigger(
+ sc_time( v, tu, simcontext() ), e, simcontext() ); }
+
+ void next_trigger( const sc_time& t, const sc_event_or_list& el )
+ { sc_core::next_trigger( t, el, simcontext() ); }
+
+ void next_trigger( double v, sc_time_unit tu, const sc_event_or_list& el )
+ { sc_core::next_trigger(
+ sc_time( v, tu, simcontext() ), el, simcontext() ); }
+
+ void next_trigger( const sc_time& t, const sc_event_and_list& el )
+ { sc_core::next_trigger( t, el, simcontext() ); }
+
+ void next_trigger( double v, sc_time_unit tu, const sc_event_and_list& el )
+ { sc_core::next_trigger(
+ sc_time( v, tu, simcontext() ), el, simcontext() ); }
+
+
+ // for SC_METHODs and SC_THREADs and SC_CTHREADs
+
+ bool timed_out()
+ { return sc_core::timed_out( simcontext() ); }
+
+
+#if 0 // @@@@####
+ // delta count maintenance
+ sc_dt::uint64 delta_count()
+ { return simcontext()->m_delta_count; }
+#endif
+
+private:
+
+ // called during the update phase of a delta cycle (if requested)
+ void perform_update();
+
+ // called when construction is done
+ void construction_done();
+
+ // called when elaboration is done
+ void elaboration_done();
+
+ // called before simulation starts
+ void start_simulation();
+
+ // called after simulation ends
+ void simulation_done();
+
+ // disabled
+ sc_prim_channel( const sc_prim_channel& );
+ sc_prim_channel& operator = ( const sc_prim_channel& );
+
+private:
+
+ sc_prim_channel_registry* m_registry; // Update list manager.
+ sc_prim_channel* m_update_next_p; // Next entry in update list.
+};
+
+
+// ----------------------------------------------------------------------------
+// CLASS : sc_prim_channel_registry
+//
+// Registry for all primitive channels.
+// FOR INTERNAL USE ONLY!
+// ----------------------------------------------------------------------------
+
+class sc_prim_channel_registry
+{
+ friend class sc_simcontext;
+
+public:
+
+ void insert( sc_prim_channel& );
+ void remove( sc_prim_channel& );
+
+
+ int size() const
+ { return m_prim_channel_vec.size(); }
+
+ inline void request_update( sc_prim_channel& );
+ void async_request_update( sc_prim_channel& );
+
+ bool pending_updates() const
+ {
+ return m_update_list_p != (sc_prim_channel*)sc_prim_channel::list_end
+ || pending_async_updates();
+ }
+
+ bool pending_async_updates() const;
+
+private:
+
+ // constructor
+ explicit sc_prim_channel_registry( sc_simcontext& simc_ );
+
+ // destructor
+ ~sc_prim_channel_registry();
+
+ // called during the update phase of a delta cycle
+ void perform_update();
+
+ // 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();
+
+ // disabled
+ sc_prim_channel_registry();
+ sc_prim_channel_registry( const sc_prim_channel_registry& );
+ sc_prim_channel_registry& operator = ( const sc_prim_channel_registry& );
+
+private:
+ class async_update_list;
+
+ async_update_list* m_async_update_list_p; // external updates.
+ int m_construction_done; // # of constructs.
+ std::vector<sc_prim_channel*> m_prim_channel_vec; // existing channels.
+ sc_simcontext* m_simc; // simulator context.
+ sc_prim_channel* m_update_list_p; // internal updates.
+};
+
+
+// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
+
+// ----------------------------------------------------------------------------
+// CLASS : sc_prim_channel_registry
+//
+// Registry for all primitive channels.
+// FOR INTERNAL USE ONLY!
+// ----------------------------------------------------------------------------
+
+inline
+void
+sc_prim_channel_registry::request_update( sc_prim_channel& prim_channel_ )
+{
+ prim_channel_.m_update_next_p = m_update_list_p;
+ m_update_list_p = &prim_channel_;
+}
+
+// ----------------------------------------------------------------------------
+// CLASS : sc_prim_channel
+//
+// Abstract base class of all primitive channel classes.
+// ----------------------------------------------------------------------------
+
+// request the update method (to be executed during the update phase)
+
+inline
+void
+sc_prim_channel::request_update()
+{
+ if( ! m_update_next_p ) {
+ m_registry->request_update( *this );
+ }
+}
+
+// request the update method from external to the simulator (to be executed
+// during the update phase)
+
+inline
+void
+sc_prim_channel::async_request_update()
+{
+ m_registry->async_request_update(*this);
+}
+
+
+// called during the update phase of a delta cycle (if requested)
+
+inline
+void
+sc_prim_channel::perform_update()
+{
+ update();
+ m_update_next_p = 0;
+}
+
+
+} // namespace sc_core
+
+
+/*****************************************************************************
+
+ MODIFICATION LOG - modifiers, enter your name, affiliation, date and
+ changes you are making here.
+
+ Name, Affiliation, Date: Andy Goodrich, Forte,
+ Bishnupriya Bhattacharya, Cadence Design Systems,
+ 25 August, 2003
+ Description of Modification: phase callbacks
+
+ *****************************************************************************/
+//$Log: sc_prim_channel.h,v $
+//Revision 1.10 2011/08/26 21:38:32 acg
+// Philipp A. Hartmann: removed unused switch m_construction_done.
+//
+//Revision 1.9 2011/08/07 19:08:01 acg
+// Andy Goodrich: moved logs to end of file so line number synching works
+// better between versions.
+//
+//Revision 1.8 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.7 2011/05/05 17:44:01 acg
+// Philip A. Hartmann: change in the name of pending_async_updates.
+//
+//Revision 1.6 2011/04/19 15:03:48 acg
+// Philipp A. Hartmann: remove ASYNC_UPDATE preprocessor check from header.
+//
+//Revision 1.5 2011/04/19 02:36:26 acg
+// Philipp A. Hartmann: new aysnc_update and mutex support.
+//
+//Revision 1.4 2011/04/05 20:48:09 acg
+// Andy Goodrich: changes to make sure that event(), posedge() and negedge()
+// only return true if the clock has not moved.
+//
+//Revision 1.3 2011/02/18 20:23:45 acg
+// Andy Goodrich: Copyright update.
+//
+//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/05/08 17:52:47 acg
+// Andy Goodrich:
+// (1) added David Long's forward declarations for friend functions,
+// methods, and operators to keep the Microsoft compiler happy.
+// (2) Added delta_count() method to sc_prim_channel for use by
+// sc_signal so that the friend declaration in sc_simcontext.h
+// can be for a non-templated class (i.e., sc_prim_channel.)
+//
+//Revision 1.2 2006/01/03 23:18:26 acg
+//Changed copyright to include 2006.
+//
+//Revision 1.1.1.1 2005/12/19 23:16:43 acg
+//First check in of SystemC 2.1 into its own archive.
+//
+//Revision 1.10 2005/07/30 03:44:11 acg
+//Changes from 2.1.
+//
+//Revision 1.9 2005/06/10 22:43:55 acg
+//Added CVS change log annotation.
+
+#endif
+
+// Taf!