| /***************************************************************************** |
| |
| 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_spawn.h -- Process spawning support. |
| |
| Original Authors: Andy Goodrich, Forte Design Systems, 17 June 2003 |
| Stuart Swan, Cadence, |
| Bishnupriya Bhattacharya, Cadence Design Systems, |
| 25 August, 2003 |
| |
| CHANGE LOG AT THE END OF THE FILE |
| *****************************************************************************/ |
| |
| |
| #if !defined(sc_spawn_h_INCLUDED) |
| #define sc_spawn_h_INCLUDED |
| |
| #include "sysc/kernel/sc_process_handle.h" |
| #include "sysc/kernel/sc_spawn_options.h" |
| |
| namespace sc_core { |
| |
| class sc_event; |
| class sc_port_base; |
| class sc_interface; |
| class sc_event_finder; |
| class sc_process_b; |
| |
| //============================================================================= |
| // CLASS sc_spawn_object<T> |
| // |
| // This templated helper class allows an object to provide the execution |
| // semantics for a process via its () operator. An instance of the supplied |
| // execution object will be kept to provide the semantics when the process is |
| // scheduled for execution. The () operator does not return a value. An example |
| // of an object that might be used for this helper function would be void |
| // SC_BOOST bound function or method. |
| // |
| // This class is derived from sc_process_host and overloads |
| // sc_process_host::semantics to provide the actual semantic content. |
| // |
| // sc_spawn_object(T object, const char* name, const sc_spawn_options* opt_p) |
| // This is the object instance constructor for this class. It makes a |
| // copy of the supplied object. The tp_call constructor is called |
| // with an indication that this object instance should be reclaimed when |
| // execution completes. |
| // object = object whose () operator will be called to provide |
| // the process semantics. |
| // name_p = optional name for object instance, or zero. |
| // opt_p -> spawn options or zero. |
| // |
| // virtual void semantics() |
| // This virtual method provides the execution semantics for its process. |
| // It performs a () operation on m_object. |
| //============================================================================= |
| template<typename T> |
| class sc_spawn_object : public sc_process_host { |
| public: |
| sc_spawn_object( T object) : m_object(object) |
| { |
| } |
| |
| virtual void semantics() |
| { |
| m_object(); |
| } |
| |
| protected: |
| T m_object; |
| }; |
| |
| |
| //------------------------------------------------------------------------------ |
| //"sc_spawn - semantic object with no return value" |
| // |
| // This inline function spawns a process for execution. The execution semantics |
| // for the process being spawned will be provided by the supplied object |
| // instance via its () operator. (E.g., a SC_BOOST bound function) |
| // After creating the process it is registered with the simulator. |
| // object = object instance providing the execution semantics via its |
| // () operator. |
| // name_p = optional name for object instance, or zero. |
| // opt_p -> optional spawn options for process, or zero for the default. |
| //------------------------------------------------------------------------------ |
| template <typename T> |
| inline sc_process_handle sc_spawn( |
| T object, |
| const char* name_p = 0, |
| const sc_spawn_options* opt_p = 0) |
| { |
| sc_simcontext* context_p; |
| sc_spawn_object<T>* spawn_p; |
| |
| context_p = sc_get_curr_simcontext(); |
| spawn_p = new sc_spawn_object<T>(object); |
| if ( !opt_p || !opt_p->is_method() ) |
| { |
| sc_process_handle thread_handle = context_p->create_thread_process( |
| name_p, true, |
| SC_MAKE_FUNC_PTR(sc_spawn_object<T>,semantics), |
| spawn_p, opt_p |
| ); |
| return thread_handle; |
| } |
| else |
| { |
| sc_process_handle method_handle = context_p->create_method_process( |
| name_p, true, |
| SC_MAKE_FUNC_PTR(sc_spawn_object<T>,semantics), |
| spawn_p, opt_p |
| ); |
| return method_handle; |
| } |
| } |
| |
| //============================================================================= |
| // CLASS sc_spawn_object_v<T> for all compilers except HP aCC |
| // or |
| // CLASS sc_spawn_object_v<T, R> for HP aCC which tries to match this |
| // one template argument class when the sc_spawn() declared above is |
| // invoked with 3 arguments or 2 arguments, and generates compiler errors. |
| // |
| // This templated helper class allows an object to provide the execution |
| // semantics for a process via its () operator. An instance of the supplied |
| // object will be kept to provide the semantics when the process is scheduled |
| // for execution. The () operator returns a value, which will be stored at the |
| // location specified by the supplied pointer. An example of an object that |
| // might be used for this helper function would be valued SC_BOOST bound |
| // function or method. |
| // |
| // sc_spawn_object_v( typename F::result_type* r_p, T f, const char* name_p, |
| // const sc_spawn_options* opt_p ) |
| // r_p -> where to place the result of the function invocation. |
| // f = information to be executed. |
| // name_p = optional name for object instance, or zero. |
| // opt_p -> optional spawn options for process, or zero for the default |
| // This is the object instance constructor for this class. It makes a |
| // copy of the supplied object. The tp_call constructor is called |
| // with an indication that this object instance should be reclaimed when |
| // execution completes. |
| // result_p -> where to place the value of the () operator. |
| // object = object whose () operator will be called to provide |
| // the process semantics. |
| // |
| // virtual void semantics() |
| // This virtual method provides the execution semantics for its process. |
| // It performs a () operation on m_object, placing the result at m_result_p. |
| //============================================================================= |
| |
| //------------------------------------------------------------------------------ |
| //"sc_spawn_object_v - semantic object with return value" |
| // |
| // This inline function spawns a process for execution. The execution semantics |
| // for the process being spawned will be provided by the supplied object |
| // instance via its () operator. (E.g., a SC_BOOST bound function) That |
| // operator returns a value, which will be placed in the supplied return |
| // location. |
| // After creating the process it is registered with the simulator. |
| // object = object instance providing the execution semantics via its () |
| // operator. |
| // r_p -> where to place the value of the () operator. |
| // name_p = optional name for object instance, or zero. |
| // opt_p -> optional spawn options for process, or zero for the default. |
| //------------------------------------------------------------------------------ |
| |
| #if !defined (__HP_aCC) |
| |
| template<typename T> |
| class sc_spawn_object_v : public sc_process_host { |
| public: |
| sc_spawn_object_v( typename T::result_type* r_p, T object ) : |
| m_object(object), m_result_p(r_p) |
| { |
| } |
| |
| virtual void semantics() |
| { |
| *m_result_p = m_object(); |
| } |
| |
| protected: |
| T m_object; |
| typename T::result_type* m_result_p; |
| }; |
| |
| template <typename T> |
| inline sc_process_handle sc_spawn( |
| typename T::result_type* r_p, |
| T object, |
| const char* name_p = 0, |
| const sc_spawn_options* opt_p = 0) |
| { |
| sc_simcontext* context_p; |
| sc_spawn_object_v<T>* spawn_p; |
| |
| context_p = sc_get_curr_simcontext(); |
| |
| spawn_p = new sc_spawn_object_v<T>(r_p, object); |
| if ( !opt_p || !opt_p->is_method() ) |
| { |
| sc_process_handle thread_handle = context_p->create_thread_process( |
| name_p, true, |
| SC_MAKE_FUNC_PTR(sc_spawn_object_v<T>,semantics), |
| spawn_p, opt_p |
| ); |
| return thread_handle; |
| } |
| else |
| { |
| sc_process_handle method_handle = context_p->create_method_process( |
| name_p, true, |
| SC_MAKE_FUNC_PTR(sc_spawn_object_v<T>,semantics), |
| spawn_p, opt_p |
| ); |
| return method_handle; |
| } |
| } |
| |
| #else |
| // for HP aCC |
| template<typename T, typename R> |
| class sc_spawn_object_v : public sc_process_host { |
| public: |
| sc_spawn_object_v( R* r_p, T object) : |
| m_object(object), m_result_p(r_p) |
| { |
| } |
| |
| virtual void semantics() |
| { |
| *m_result_p = m_object(); |
| } |
| |
| protected: |
| T m_object; |
| R* m_result_p; |
| }; |
| |
| template <typename T, typename R> |
| inline sc_process_handle sc_spawn( |
| R* r_p, |
| T object, |
| const char* name_p = 0, |
| const sc_spawn_options* opt_p = 0) |
| { |
| sc_simcontext* context_p; |
| sc_spawn_object_v<T,R>* spawn_p; |
| |
| context_p = sc_get_curr_simcontext(); |
| |
| spawn_p = new sc_spawn_object_v<T,R>(r_p, object); |
| if ( !opt_p || !opt_p->is_method() ) |
| { |
| sc_process_handle thread_handle = context_p->create_thread_process( |
| name_p, true, |
| static_cast<sc_core::SC_ENTRY_FUNC>( |
| &sc_spawn_object_v<T,R>::semantics), |
| spawn_p, opt_p |
| ); |
| return thread_handle; |
| } |
| else |
| { |
| sc_process_handle method_handle = context_p->create_method_process( |
| name_p, true, |
| static_cast<sc_core::SC_ENTRY_FUNC>( |
| &sc_spawn_object_v<T,R>::semantics), |
| spawn_p, opt_p |
| ); |
| return method_handle; |
| } |
| } |
| |
| #endif // HP |
| |
| } // namespace sc_core |
| |
| // $Log: sc_spawn.h,v $ |
| // Revision 1.7 2011/08/26 20:46:11 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/02/18 20:27:14 acg |
| // Andy Goodrich: Updated Copyrights. |
| // |
| // Revision 1.5 2011/02/13 21:47:38 acg |
| // Andy Goodrich: update copyright notice. |
| // |
| // Revision 1.4 2011/02/01 21:14:02 acg |
| // Andy Goodrich: formatting. |
| // |
| // Revision 1.3 2009/07/28 01:10:53 acg |
| // Andy Goodrich: updates for 2.3 release candidate. |
| // |
| // Revision 1.2 2008/05/22 17:06:26 acg |
| // Andy Goodrich: updated copyright notice to include 2008. |
| // |
| // Revision 1.1.1.1 2006/12/15 20:20:05 acg |
| // SystemC 2.3 |
| // |
| // Revision 1.6 2006/05/26 20:33:16 acg |
| // Andy Goodrich: changes required by additional platform compilers (i.e., |
| // Microsoft VC++, Sun Forte, HP aCC). |
| // |
| // Revision 1.5 2006/05/08 18:01:44 acg |
| // Andy Goodrich: changed the HP-specific implementations of sc_spawn() to |
| // use a static_cast to create their entry functions rather than the |
| // SC_MAKE_FUNC_PTR macro. The HP preprocessor does not parse template |
| // arguments that contain a comma properly. |
| // |
| // Revision 1.4 2006/04/11 23:13:21 acg |
| // Andy Goodrich: Changes for reduced reset support that only includes |
| // sc_cthread, but has preliminary hooks for expanding to method and thread |
| // processes also. |
| // |
| // Revision 1.3 2006/01/13 18:44:30 acg |
| // Added $Log to record CVS changes into the source. |
| |
| #endif // !defined(sc_spawn_h_INCLUDED) |