112027Sjungma@eit.uni-kl.de/*****************************************************************************
212027Sjungma@eit.uni-kl.de
312027Sjungma@eit.uni-kl.de  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412027Sjungma@eit.uni-kl.de  more contributor license agreements.  See the NOTICE file distributed
512027Sjungma@eit.uni-kl.de  with this work for additional information regarding copyright ownership.
612027Sjungma@eit.uni-kl.de  Accellera licenses this file to you under the Apache License, Version 2.0
712027Sjungma@eit.uni-kl.de  (the "License"); you may not use this file except in compliance with the
812027Sjungma@eit.uni-kl.de  License.  You may obtain a copy of the License at
912027Sjungma@eit.uni-kl.de
1012027Sjungma@eit.uni-kl.de    http://www.apache.org/licenses/LICENSE-2.0
1112027Sjungma@eit.uni-kl.de
1212027Sjungma@eit.uni-kl.de  Unless required by applicable law or agreed to in writing, software
1312027Sjungma@eit.uni-kl.de  distributed under the License is distributed on an "AS IS" BASIS,
1412027Sjungma@eit.uni-kl.de  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512027Sjungma@eit.uni-kl.de  implied.  See the License for the specific language governing
1612027Sjungma@eit.uni-kl.de  permissions and limitations under the License.
1712027Sjungma@eit.uni-kl.de
1812027Sjungma@eit.uni-kl.de *****************************************************************************/
1912027Sjungma@eit.uni-kl.de
2012027Sjungma@eit.uni-kl.de/*****************************************************************************
2112027Sjungma@eit.uni-kl.de
2212027Sjungma@eit.uni-kl.de  sc_reset.cpp -- Support for reset.
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de  Original Author: Andy Goodrich, Forte Design Systems
2512027Sjungma@eit.uni-kl.de
2612027Sjungma@eit.uni-kl.de  CHANGE LOG AT THE END OF THE FILE
2712027Sjungma@eit.uni-kl.de *****************************************************************************/
2812027Sjungma@eit.uni-kl.de
2912027Sjungma@eit.uni-kl.de
3012027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_simcontext.h"
3112027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_reset.h"
3212027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_process_handle.h"
3312027Sjungma@eit.uni-kl.de#include "sysc/communication/sc_signal.h"
3412027Sjungma@eit.uni-kl.de#include "sysc/communication/sc_signal_ports.h"
3512027Sjungma@eit.uni-kl.de
3612027Sjungma@eit.uni-kl.de
3712027Sjungma@eit.uni-kl.de// THE SYSTEMC PROOF OF CONCEPT SIMULATOR RESET SIGNAL IMPLEMENTATION:
3812027Sjungma@eit.uni-kl.de//
3912027Sjungma@eit.uni-kl.de// (1) An instance of the sc_reset class is attached to each sc_signal<bool>
4012027Sjungma@eit.uni-kl.de//     that is used as a reset signal.
4112027Sjungma@eit.uni-kl.de//
4212027Sjungma@eit.uni-kl.de// (2) Each process that is senstive to a reset signal will be registered in the
4312027Sjungma@eit.uni-kl.de//     sc_reset class attached to that reset signal.
4412027Sjungma@eit.uni-kl.de//
4512027Sjungma@eit.uni-kl.de// (3) When a change in the value of a reset signal occurs it invokes the
4612027Sjungma@eit.uni-kl.de//     notify_processes() method of its sc_reset object instance. The
4712027Sjungma@eit.uni-kl.de//     notify_processes() method will call the reset_changed() method of each
4812027Sjungma@eit.uni-kl.de//     process that is registered with it to inform the process that
4912027Sjungma@eit.uni-kl.de//     state of the reset signal has changed.
5012027Sjungma@eit.uni-kl.de//
5112027Sjungma@eit.uni-kl.de// (4) A process may have multiple reset signals, so counters are kept for the
5212027Sjungma@eit.uni-kl.de//     number of active asynchronous, and synchronous, reset signals that are
5312027Sjungma@eit.uni-kl.de//     active. Those counters are incremented and decremented in the process'
5412027Sjungma@eit.uni-kl.de//     reset_changed() method.
5512027Sjungma@eit.uni-kl.de//
5612027Sjungma@eit.uni-kl.de// (5) When a process' semantics() method is called the current reset state is
5712027Sjungma@eit.uni-kl.de//     checked, and a reset sequence is initiated if the process is in reset.
5812027Sjungma@eit.uni-kl.de//     This will occur every time an SC_METHOD is dispatched. SC_CTHREAD and
5912027Sjungma@eit.uni-kl.de//     and SC_THREAD instances, only go through the semantics() method they
6012027Sjungma@eit.uni-kl.de//     initially start up. So the reset check  is duplicated in the suspend_me()
6112027Sjungma@eit.uni-kl.de//     method, the tail of which will execute each time the thread is
6212027Sjungma@eit.uni-kl.de//     dispatched.
6312027Sjungma@eit.uni-kl.de
6412027Sjungma@eit.uni-kl.denamespace sc_core {
6512027Sjungma@eit.uni-kl.de
6612027Sjungma@eit.uni-kl.declass sc_reset_finder;
6712027Sjungma@eit.uni-kl.destatic sc_reset_finder* reset_finder_q=0;  // Q of reset finders to reconcile.
6812027Sjungma@eit.uni-kl.de
6912027Sjungma@eit.uni-kl.de//==============================================================================
7012027Sjungma@eit.uni-kl.de// sc_reset_finder - place holder class for a port reset signal until it is
7112027Sjungma@eit.uni-kl.de//                   bound and an interface class is available. When the port
7212027Sjungma@eit.uni-kl.de//                   has been bound the information in this class will be used
7312027Sjungma@eit.uni-kl.de//                   to initialize its sc_reset object instance.
7412027Sjungma@eit.uni-kl.de//==============================================================================
7512027Sjungma@eit.uni-kl.declass sc_reset_finder {
7612027Sjungma@eit.uni-kl.de    friend class sc_reset;
7712027Sjungma@eit.uni-kl.de  public:
7812027Sjungma@eit.uni-kl.de    sc_reset_finder( bool async, const sc_in<bool>* port_p, bool level,
7912027Sjungma@eit.uni-kl.de        sc_process_b* target_p);
8012027Sjungma@eit.uni-kl.de    sc_reset_finder( bool async, const sc_inout<bool>* port_p, bool level,
8112027Sjungma@eit.uni-kl.de        sc_process_b* target_p);
8212027Sjungma@eit.uni-kl.de    sc_reset_finder( bool async, const sc_out<bool>* port_p, bool level,
8312027Sjungma@eit.uni-kl.de        sc_process_b* target_p);
8412027Sjungma@eit.uni-kl.de
8512027Sjungma@eit.uni-kl.de  protected:
8612027Sjungma@eit.uni-kl.de    bool                   m_async;     // True if asynchronous reset.
8712027Sjungma@eit.uni-kl.de    bool                   m_level;     // Level for reset.
8812027Sjungma@eit.uni-kl.de    sc_reset_finder*       m_next_p;    // Next reset finder in list.
8912027Sjungma@eit.uni-kl.de    const sc_in<bool>*     m_in_p;      // Port for which reset is needed.
9012027Sjungma@eit.uni-kl.de    const sc_inout<bool>*  m_inout_p;   // Port for which reset is needed.
9112027Sjungma@eit.uni-kl.de    const sc_out<bool>*    m_out_p;     // Port for which reset is needed.
9212027Sjungma@eit.uni-kl.de    sc_process_b*          m_target_p;  // Process to reset.
9312027Sjungma@eit.uni-kl.de
9412027Sjungma@eit.uni-kl.de  private: // disabled
9512027Sjungma@eit.uni-kl.de    sc_reset_finder( const sc_reset_finder& );
9612027Sjungma@eit.uni-kl.de    const sc_reset_finder& operator = ( const sc_reset_finder& );
9712027Sjungma@eit.uni-kl.de};
9812027Sjungma@eit.uni-kl.de
9912027Sjungma@eit.uni-kl.deinline sc_reset_finder::sc_reset_finder(
10012027Sjungma@eit.uni-kl.de    bool async, const sc_in<bool>* port_p, bool level, sc_process_b* target_p) :
10112027Sjungma@eit.uni-kl.de    m_async(async), m_level(level), m_next_p(0), m_in_p(port_p), m_inout_p(0),
10212027Sjungma@eit.uni-kl.de    m_out_p(0), m_target_p(target_p)
10312027Sjungma@eit.uni-kl.de{
10412027Sjungma@eit.uni-kl.de    m_next_p = reset_finder_q;
10512027Sjungma@eit.uni-kl.de    reset_finder_q = this;
10612027Sjungma@eit.uni-kl.de}
10712027Sjungma@eit.uni-kl.de
10812027Sjungma@eit.uni-kl.deinline sc_reset_finder::sc_reset_finder(
10912027Sjungma@eit.uni-kl.de    bool async, const sc_inout<bool>* port_p, bool level, sc_process_b* target_p
11012027Sjungma@eit.uni-kl.de) :
11112027Sjungma@eit.uni-kl.de    m_async(async), m_level(level), m_next_p(0), m_in_p(0), m_inout_p(port_p),
11212027Sjungma@eit.uni-kl.de    m_out_p(0), m_target_p(target_p)
11312027Sjungma@eit.uni-kl.de{
11412027Sjungma@eit.uni-kl.de    m_next_p = reset_finder_q;
11512027Sjungma@eit.uni-kl.de    reset_finder_q = this;
11612027Sjungma@eit.uni-kl.de}
11712027Sjungma@eit.uni-kl.de
11812027Sjungma@eit.uni-kl.deinline sc_reset_finder::sc_reset_finder(
11912027Sjungma@eit.uni-kl.de    bool async, const sc_out<bool>* port_p, bool level, sc_process_b* target_p
12012027Sjungma@eit.uni-kl.de) :
12112027Sjungma@eit.uni-kl.de    m_async(async), m_level(level), m_next_p(0), m_in_p(0), m_inout_p(0),
12212027Sjungma@eit.uni-kl.de    m_out_p(port_p), m_target_p(target_p)
12312027Sjungma@eit.uni-kl.de{
12412027Sjungma@eit.uni-kl.de    m_next_p = reset_finder_q;
12512027Sjungma@eit.uni-kl.de    reset_finder_q = this;
12612027Sjungma@eit.uni-kl.de}
12712027Sjungma@eit.uni-kl.de
12812027Sjungma@eit.uni-kl.de
12912027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
13012027Sjungma@eit.uni-kl.de//"sc_reset::notify_processes"
13112027Sjungma@eit.uni-kl.de//
13212027Sjungma@eit.uni-kl.de// Notify processes that there is a change in the reset signal value.
13312027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
13412027Sjungma@eit.uni-kl.devoid sc_reset::notify_processes()
13512027Sjungma@eit.uni-kl.de{
13612027Sjungma@eit.uni-kl.de    bool                                    active;       // true if reset is active.
13712027Sjungma@eit.uni-kl.de    sc_reset_target*                        entry_p;      // reset entry processing.
13812027Sjungma@eit.uni-kl.de    std::vector<sc_reset_target>::size_type process_i;    // index of process resetting.
13912027Sjungma@eit.uni-kl.de    std::vector<sc_reset_target>::size_type process_n;    // # of processes to reset.
14012027Sjungma@eit.uni-kl.de    bool                                    value;        // value of our signal.
14112027Sjungma@eit.uni-kl.de
14212027Sjungma@eit.uni-kl.de    value = m_iface_p->read();
14312027Sjungma@eit.uni-kl.de    process_n = m_targets.size();
14412027Sjungma@eit.uni-kl.de    for ( process_i = 0; process_i < process_n; process_i++ )
14512027Sjungma@eit.uni-kl.de    {
14612027Sjungma@eit.uni-kl.de        entry_p = &m_targets[process_i];
14712027Sjungma@eit.uni-kl.de	active = ( entry_p->m_level == value );
14812027Sjungma@eit.uni-kl.de	entry_p->m_process_p->reset_changed( entry_p->m_async, active );
14912027Sjungma@eit.uni-kl.de    }
15012027Sjungma@eit.uni-kl.de}
15112027Sjungma@eit.uni-kl.de
15212027Sjungma@eit.uni-kl.de
15312027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
15412027Sjungma@eit.uni-kl.de//"sc_reset::reconcile_resets"
15512027Sjungma@eit.uni-kl.de//
15612027Sjungma@eit.uni-kl.de// This static method processes the sc_reset_finders to establish the actual
15712027Sjungma@eit.uni-kl.de// reset connections.
15812027Sjungma@eit.uni-kl.de//
15912027Sjungma@eit.uni-kl.de// Notes:
16012027Sjungma@eit.uni-kl.de//   (1) If reset is asserted we tell the process that it is in reset.
16112027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
16212027Sjungma@eit.uni-kl.devoid sc_reset::reconcile_resets()
16312027Sjungma@eit.uni-kl.de{
16412027Sjungma@eit.uni-kl.de    const sc_signal_in_if<bool>*  iface_p;      // Interface to reset signal.
16512027Sjungma@eit.uni-kl.de    sc_reset_finder*              next_p;       // Next finder to process.
16612027Sjungma@eit.uni-kl.de    sc_reset_finder*              now_p;        // Finder currently processing.
16712027Sjungma@eit.uni-kl.de    sc_reset_target               reset_target; // Target's reset entry.
16812027Sjungma@eit.uni-kl.de    sc_reset*                     reset_p;      // Reset object to use.
16912027Sjungma@eit.uni-kl.de
17012027Sjungma@eit.uni-kl.de    for ( now_p = reset_finder_q; now_p; now_p = next_p )
17112027Sjungma@eit.uni-kl.de    {
17212027Sjungma@eit.uni-kl.de        next_p = now_p->m_next_p;
17312027Sjungma@eit.uni-kl.de        if ( now_p->m_in_p )
17412027Sjungma@eit.uni-kl.de        {
17512027Sjungma@eit.uni-kl.de            iface_p = DCAST<const sc_signal_in_if<bool>*>(
17612027Sjungma@eit.uni-kl.de                now_p->m_in_p->get_interface());
17712027Sjungma@eit.uni-kl.de        }
17812027Sjungma@eit.uni-kl.de        else if ( now_p->m_inout_p )
17912027Sjungma@eit.uni-kl.de        {
18012027Sjungma@eit.uni-kl.de            iface_p = DCAST<const sc_signal_in_if<bool>*>(
18112027Sjungma@eit.uni-kl.de                now_p->m_inout_p->get_interface());
18212027Sjungma@eit.uni-kl.de        }
18312027Sjungma@eit.uni-kl.de        else
18412027Sjungma@eit.uni-kl.de        {
18512027Sjungma@eit.uni-kl.de            iface_p = DCAST<const sc_signal_in_if<bool>*>(
18612027Sjungma@eit.uni-kl.de                now_p->m_out_p->get_interface());
18712027Sjungma@eit.uni-kl.de        }
18812027Sjungma@eit.uni-kl.de        assert( iface_p != 0 );
18912027Sjungma@eit.uni-kl.de        reset_p = iface_p->is_reset();
19012027Sjungma@eit.uni-kl.de	now_p->m_target_p->m_resets.push_back(reset_p);
19112027Sjungma@eit.uni-kl.de	reset_target.m_async = now_p->m_async;
19212027Sjungma@eit.uni-kl.de	reset_target.m_level = now_p->m_level;
19312027Sjungma@eit.uni-kl.de	reset_target.m_process_p = now_p->m_target_p;
19412027Sjungma@eit.uni-kl.de	reset_p->m_targets.push_back(reset_target);
19512027Sjungma@eit.uni-kl.de	if ( iface_p->read() == now_p->m_level ) // see note 1 above
19612027Sjungma@eit.uni-kl.de	    now_p->m_target_p->initially_in_reset( now_p->m_async );
19712027Sjungma@eit.uni-kl.de        delete now_p;
19812027Sjungma@eit.uni-kl.de    }
19912027Sjungma@eit.uni-kl.de}
20012027Sjungma@eit.uni-kl.de
20112027Sjungma@eit.uni-kl.de
20212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
20312027Sjungma@eit.uni-kl.de//"sc_reset::remove_process"
20412027Sjungma@eit.uni-kl.de//
20512027Sjungma@eit.uni-kl.de// This method removes the supplied process from the list of processes that
20612027Sjungma@eit.uni-kl.de// should be notified when there is a change in the value of the reset signal.
20712027Sjungma@eit.uni-kl.de//
20812027Sjungma@eit.uni-kl.de// Arguments:
20912027Sjungma@eit.uni-kl.de//     process_p -> process to be removed.
21012027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
21112027Sjungma@eit.uni-kl.devoid sc_reset::remove_process( sc_process_b* process_p )
21212027Sjungma@eit.uni-kl.de{
21312027Sjungma@eit.uni-kl.de    int process_i; // Index of process resetting.
21412027Sjungma@eit.uni-kl.de    int process_n; // # of processes to reset.
21512027Sjungma@eit.uni-kl.de
21612027Sjungma@eit.uni-kl.de    process_n = m_targets.size();
21712027Sjungma@eit.uni-kl.de    for ( process_i = 0; process_i < process_n; )
21812027Sjungma@eit.uni-kl.de    {
21912027Sjungma@eit.uni-kl.de        if ( m_targets[process_i].m_process_p == process_p )
22012027Sjungma@eit.uni-kl.de        {
22112027Sjungma@eit.uni-kl.de            m_targets[process_i] = m_targets[process_n-1];
22212027Sjungma@eit.uni-kl.de	    process_n--;
22312027Sjungma@eit.uni-kl.de            m_targets.resize(process_n);
22412027Sjungma@eit.uni-kl.de        }
22512027Sjungma@eit.uni-kl.de	else
22612027Sjungma@eit.uni-kl.de	{
22712027Sjungma@eit.uni-kl.de	    process_i++;
22812027Sjungma@eit.uni-kl.de	}
22912027Sjungma@eit.uni-kl.de    }
23012027Sjungma@eit.uni-kl.de}
23112027Sjungma@eit.uni-kl.de
23212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
23312027Sjungma@eit.uni-kl.de//"sc_reset::reset_signal_is - ports"
23412027Sjungma@eit.uni-kl.de//
23512027Sjungma@eit.uni-kl.de// These overloads of the reset_signal_is() method will register the active
23612027Sjungma@eit.uni-kl.de// process with the sc_reset object instance associated with the supplied port.
23712027Sjungma@eit.uni-kl.de// If the port does not yet have a pointer to its sc_signal<bool> instance it
23812027Sjungma@eit.uni-kl.de// will create an sc_reset_finder class object instance that will be used
23912027Sjungma@eit.uni-kl.de// to set the process' reset information when the port has been bound.
24012027Sjungma@eit.uni-kl.de//
24112027Sjungma@eit.uni-kl.de// Arguments:
24212027Sjungma@eit.uni-kl.de//     async = true if the reset signal is asynchronous, false if not.
24312027Sjungma@eit.uni-kl.de//     port  = port for sc_signal<bool> that will provide the reset signal.
24412027Sjungma@eit.uni-kl.de//     level = level at which reset is active, either true or false.
24512027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
24612027Sjungma@eit.uni-kl.devoid sc_reset::reset_signal_is( bool async, const sc_in<bool>& port, bool level)
24712027Sjungma@eit.uni-kl.de{
24812027Sjungma@eit.uni-kl.de    const sc_signal_in_if<bool>* iface_p;
24912027Sjungma@eit.uni-kl.de    sc_process_b*                process_p;
25012027Sjungma@eit.uni-kl.de
25112027Sjungma@eit.uni-kl.de    process_p = (sc_process_b*)sc_get_current_process_handle();
25212027Sjungma@eit.uni-kl.de    assert( process_p );
25312027Sjungma@eit.uni-kl.de    process_p->m_has_reset_signal = true;
25412027Sjungma@eit.uni-kl.de    switch ( process_p->proc_kind() )
25512027Sjungma@eit.uni-kl.de    {
25612027Sjungma@eit.uni-kl.de      case SC_THREAD_PROC_:
25712027Sjungma@eit.uni-kl.de      case SC_METHOD_PROC_:
25812027Sjungma@eit.uni-kl.de      case SC_CTHREAD_PROC_:
25912027Sjungma@eit.uni-kl.de        iface_p = DCAST<const sc_signal_in_if<bool>*>(port.get_interface());
26012027Sjungma@eit.uni-kl.de        if ( iface_p )
26112027Sjungma@eit.uni-kl.de            reset_signal_is( async, *iface_p, level );
26212027Sjungma@eit.uni-kl.de        else
26312027Sjungma@eit.uni-kl.de            new sc_reset_finder( async, &port, level, process_p );
26412027Sjungma@eit.uni-kl.de        break;
26512027Sjungma@eit.uni-kl.de      default:
26612027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR(SC_ID_UNKNOWN_PROCESS_TYPE_, process_p->name());
26712027Sjungma@eit.uni-kl.de        break;
26812027Sjungma@eit.uni-kl.de    }
26912027Sjungma@eit.uni-kl.de}
27012027Sjungma@eit.uni-kl.de
27112027Sjungma@eit.uni-kl.devoid sc_reset::reset_signal_is(
27212027Sjungma@eit.uni-kl.de    bool async, const sc_inout<bool>& port, bool level )
27312027Sjungma@eit.uni-kl.de{
27412027Sjungma@eit.uni-kl.de    const sc_signal_in_if<bool>* iface_p;
27512027Sjungma@eit.uni-kl.de    sc_process_b*                process_p;
27612027Sjungma@eit.uni-kl.de
27712027Sjungma@eit.uni-kl.de    process_p = (sc_process_b*)sc_get_current_process_handle();
27812027Sjungma@eit.uni-kl.de    assert( process_p );
27912027Sjungma@eit.uni-kl.de    process_p->m_has_reset_signal = true;
28012027Sjungma@eit.uni-kl.de    switch ( process_p->proc_kind() )
28112027Sjungma@eit.uni-kl.de    {
28212027Sjungma@eit.uni-kl.de      case SC_THREAD_PROC_:
28312027Sjungma@eit.uni-kl.de      case SC_METHOD_PROC_:
28412027Sjungma@eit.uni-kl.de      case SC_CTHREAD_PROC_:
28512027Sjungma@eit.uni-kl.de        iface_p = DCAST<const sc_signal_in_if<bool>*>(port.get_interface());
28612027Sjungma@eit.uni-kl.de        if ( iface_p )
28712027Sjungma@eit.uni-kl.de            reset_signal_is( async, *iface_p, level );
28812027Sjungma@eit.uni-kl.de        else
28912027Sjungma@eit.uni-kl.de            new sc_reset_finder( async, &port, level, process_p );
29012027Sjungma@eit.uni-kl.de        break;
29112027Sjungma@eit.uni-kl.de      default:
29212027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR(SC_ID_UNKNOWN_PROCESS_TYPE_, process_p->name());
29312027Sjungma@eit.uni-kl.de        break;
29412027Sjungma@eit.uni-kl.de    }
29512027Sjungma@eit.uni-kl.de}
29612027Sjungma@eit.uni-kl.de
29712027Sjungma@eit.uni-kl.devoid sc_reset::reset_signal_is(
29812027Sjungma@eit.uni-kl.de    bool async, const sc_out<bool>& port, bool level )
29912027Sjungma@eit.uni-kl.de{
30012027Sjungma@eit.uni-kl.de    const sc_signal_in_if<bool>* iface_p;
30112027Sjungma@eit.uni-kl.de    sc_process_b*                process_p;
30212027Sjungma@eit.uni-kl.de
30312027Sjungma@eit.uni-kl.de    process_p = (sc_process_b*)sc_get_current_process_handle();
30412027Sjungma@eit.uni-kl.de    assert( process_p );
30512027Sjungma@eit.uni-kl.de    process_p->m_has_reset_signal = true;
30612027Sjungma@eit.uni-kl.de    switch ( process_p->proc_kind() )
30712027Sjungma@eit.uni-kl.de    {
30812027Sjungma@eit.uni-kl.de      case SC_THREAD_PROC_:
30912027Sjungma@eit.uni-kl.de      case SC_METHOD_PROC_:
31012027Sjungma@eit.uni-kl.de      case SC_CTHREAD_PROC_:
31112027Sjungma@eit.uni-kl.de        iface_p = DCAST<const sc_signal_in_if<bool>*>(port.get_interface());
31212027Sjungma@eit.uni-kl.de        if ( iface_p )
31312027Sjungma@eit.uni-kl.de            reset_signal_is( async, *iface_p, level );
31412027Sjungma@eit.uni-kl.de        else
31512027Sjungma@eit.uni-kl.de            new sc_reset_finder( async, &port, level, process_p );
31612027Sjungma@eit.uni-kl.de        break;
31712027Sjungma@eit.uni-kl.de      default:
31812027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR(SC_ID_UNKNOWN_PROCESS_TYPE_, process_p->name());
31912027Sjungma@eit.uni-kl.de        break;
32012027Sjungma@eit.uni-kl.de    }
32112027Sjungma@eit.uni-kl.de}
32212027Sjungma@eit.uni-kl.de
32312027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
32412027Sjungma@eit.uni-kl.de//"sc_reset::reset_signal_is"
32512027Sjungma@eit.uni-kl.de//
32612027Sjungma@eit.uni-kl.de// This static method will register the active process instance as being
32712027Sjungma@eit.uni-kl.de// reset by the sc_signal<bool> whose interface has been supplied. If no
32812027Sjungma@eit.uni-kl.de// sc_reset object instance has been attached to the sc_signal<bool> yet, it
32912027Sjungma@eit.uni-kl.de// will be created and attached. The active process instance is pushed into
33012027Sjungma@eit.uni-kl.de// the list of processes that the sc_reset object instance should notify if
33112027Sjungma@eit.uni-kl.de// the value of the reset signal changes.
33212027Sjungma@eit.uni-kl.de//
33312027Sjungma@eit.uni-kl.de// Arguments:
33412027Sjungma@eit.uni-kl.de//     async = true if the reset signal is asynchronous, false if not.
33512027Sjungma@eit.uni-kl.de//     iface = interface for the reset signal.
33612027Sjungma@eit.uni-kl.de//     level = is the level at which reset is active, either true or false.
33712027Sjungma@eit.uni-kl.de// Notes:
33812027Sjungma@eit.uni-kl.de//   (1) If reset is asserted we tell the process that it is in reset
33912027Sjungma@eit.uni-kl.de//       initially.
34012027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
34112027Sjungma@eit.uni-kl.devoid sc_reset::reset_signal_is(
34212027Sjungma@eit.uni-kl.de    bool async, const sc_signal_in_if<bool>& iface, bool level )
34312027Sjungma@eit.uni-kl.de{
34412027Sjungma@eit.uni-kl.de    sc_process_b*   process_p;    // process adding reset for.
34512027Sjungma@eit.uni-kl.de    sc_reset_target reset_target; // entry to build for the process.
34612027Sjungma@eit.uni-kl.de    sc_reset*       reset_p;      // reset object.
34712027Sjungma@eit.uni-kl.de
34812027Sjungma@eit.uni-kl.de    process_p = sc_process_b::last_created_process_base();
34912027Sjungma@eit.uni-kl.de    assert( process_p );
35012027Sjungma@eit.uni-kl.de    process_p->m_has_reset_signal = true;
35112027Sjungma@eit.uni-kl.de    switch ( process_p->proc_kind() )
35212027Sjungma@eit.uni-kl.de    {
35312027Sjungma@eit.uni-kl.de      case SC_METHOD_PROC_:
35412027Sjungma@eit.uni-kl.de      case SC_CTHREAD_PROC_:
35512027Sjungma@eit.uni-kl.de      case SC_THREAD_PROC_:
35612027Sjungma@eit.uni-kl.de	reset_p = iface.is_reset();
35712027Sjungma@eit.uni-kl.de	process_p->m_resets.push_back(reset_p);
35812027Sjungma@eit.uni-kl.de        reset_target.m_async = async;
35912027Sjungma@eit.uni-kl.de	reset_target.m_level = level;
36012027Sjungma@eit.uni-kl.de	reset_target.m_process_p = process_p;
36112027Sjungma@eit.uni-kl.de	reset_p->m_targets.push_back(reset_target);
36212027Sjungma@eit.uni-kl.de	if ( iface.read() == level ) process_p->initially_in_reset( async );
36312027Sjungma@eit.uni-kl.de        break;
36412027Sjungma@eit.uni-kl.de      default:
36512027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR(SC_ID_UNKNOWN_PROCESS_TYPE_, process_p->name());
36612027Sjungma@eit.uni-kl.de        break;
36712027Sjungma@eit.uni-kl.de    }
36812027Sjungma@eit.uni-kl.de}
36912027Sjungma@eit.uni-kl.de
37012027Sjungma@eit.uni-kl.de} // namespace sc_core
37112027Sjungma@eit.uni-kl.de
37212027Sjungma@eit.uni-kl.de// $Log: sc_reset.cpp,v $
37312027Sjungma@eit.uni-kl.de// Revision 1.16  2011/08/26 20:46:10  acg
37412027Sjungma@eit.uni-kl.de//  Andy Goodrich: moved the modification log to the end of the file to
37512027Sjungma@eit.uni-kl.de//  eliminate source line number skew when check-ins are done.
37612027Sjungma@eit.uni-kl.de//
37712027Sjungma@eit.uni-kl.de// Revision 1.15  2011/08/24 22:05:51  acg
37812027Sjungma@eit.uni-kl.de//  Torsten Maehne: initialization changes to remove warnings.
37912027Sjungma@eit.uni-kl.de//
38012027Sjungma@eit.uni-kl.de// Revision 1.14  2011/04/08 22:37:34  acg
38112027Sjungma@eit.uni-kl.de//  Andy Goodrich: documentation of the reset mechanism and additional
38212027Sjungma@eit.uni-kl.de//  documentation of methods. Removal of check for SC_METHODs in
38312027Sjungma@eit.uni-kl.de//  sc_reset_signal_is() that should not have been there.
38412027Sjungma@eit.uni-kl.de//
38512027Sjungma@eit.uni-kl.de// Revision 1.13  2011/03/20 15:13:01  acg
38612027Sjungma@eit.uni-kl.de//  Andy Goodrich: set the reset flag for async_reset_signal_is to catch
38712027Sjungma@eit.uni-kl.de//  the suspend() corner case.
38812027Sjungma@eit.uni-kl.de//
38912027Sjungma@eit.uni-kl.de// Revision 1.12  2011/03/20 13:43:23  acg
39012027Sjungma@eit.uni-kl.de//  Andy Goodrich: added async_signal_is() plus suspend() as a corner case.
39112027Sjungma@eit.uni-kl.de//
39212027Sjungma@eit.uni-kl.de// Revision 1.11  2011/03/06 19:57:11  acg
39312027Sjungma@eit.uni-kl.de//  Andy Goodrich: refinements for the illegal suspend - synchronous reset
39412027Sjungma@eit.uni-kl.de//  interaction.
39512027Sjungma@eit.uni-kl.de//
39612027Sjungma@eit.uni-kl.de// Revision 1.10  2011/02/18 20:27:14  acg
39712027Sjungma@eit.uni-kl.de//  Andy Goodrich: Updated Copyrights.
39812027Sjungma@eit.uni-kl.de//
39912027Sjungma@eit.uni-kl.de// Revision 1.9  2011/02/13 21:47:37  acg
40012027Sjungma@eit.uni-kl.de//  Andy Goodrich: update copyright notice.
40112027Sjungma@eit.uni-kl.de//
40212027Sjungma@eit.uni-kl.de// Revision 1.8  2011/02/01 21:08:26  acg
40312027Sjungma@eit.uni-kl.de//  Andy Goodrich: new multiple reset support.
40412027Sjungma@eit.uni-kl.de//
40512027Sjungma@eit.uni-kl.de// Revision 1.7  2011/01/06 18:04:38  acg
40612027Sjungma@eit.uni-kl.de//  Andy Goodrich: removed commented out code.
40712027Sjungma@eit.uni-kl.de//
40812027Sjungma@eit.uni-kl.de// Revision 1.6  2010/12/07 20:09:13  acg
40912027Sjungma@eit.uni-kl.de// Andy Goodrich: removed sc_signal overloads since already have sc_signal_in_if overloads.
41012027Sjungma@eit.uni-kl.de//
41112027Sjungma@eit.uni-kl.de// Revision 1.5  2010/11/20 17:10:56  acg
41212027Sjungma@eit.uni-kl.de//  Andy Goodrich: reset processing changes for new IEEE 1666 standard.
41312027Sjungma@eit.uni-kl.de//
41412027Sjungma@eit.uni-kl.de// Revision 1.4  2009/05/22 16:06:29  acg
41512027Sjungma@eit.uni-kl.de//  Andy Goodrich: process control updates.
41612027Sjungma@eit.uni-kl.de//
41712027Sjungma@eit.uni-kl.de// Revision 1.3  2009/03/12 22:59:58  acg
41812027Sjungma@eit.uni-kl.de//  Andy Goodrich: updates for 2.4 stuff.
41912027Sjungma@eit.uni-kl.de//
42012027Sjungma@eit.uni-kl.de// Revision 1.2  2008/05/22 17:06:26  acg
42112027Sjungma@eit.uni-kl.de//  Andy Goodrich: updated copyright notice to include 2008.
42212027Sjungma@eit.uni-kl.de//
42312027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:05  acg
42412027Sjungma@eit.uni-kl.de// SystemC 2.3
42512027Sjungma@eit.uni-kl.de//
42612027Sjungma@eit.uni-kl.de// Revision 1.7  2006/12/02 20:58:19  acg
42712027Sjungma@eit.uni-kl.de//  Andy Goodrich: updates from 2.2 for IEEE 1666 support.
42812027Sjungma@eit.uni-kl.de//
42912027Sjungma@eit.uni-kl.de// Revision 1.5  2006/04/11 23:13:21  acg
43012027Sjungma@eit.uni-kl.de//   Andy Goodrich: Changes for reduced reset support that only includes
43112027Sjungma@eit.uni-kl.de//   sc_cthread, but has preliminary hooks for expanding to method and thread
43212027Sjungma@eit.uni-kl.de//   processes also.
43312027Sjungma@eit.uni-kl.de//
43412027Sjungma@eit.uni-kl.de// Revision 1.4  2006/01/24 20:49:05  acg
43512027Sjungma@eit.uni-kl.de// Andy Goodrich: changes to remove the use of deprecated features within the
43612027Sjungma@eit.uni-kl.de// simulator, and to issue warning messages when deprecated features are used.
43712027Sjungma@eit.uni-kl.de//
43812027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:44:30  acg
43912027Sjungma@eit.uni-kl.de// Added $Log to record CVS changes into the source.
44012027Sjungma@eit.uni-kl.de//
441