sc_process_handle.cc revision 12952
112838Sgabeblack@google.com/*
212838Sgabeblack@google.com * Copyright 2018 Google, Inc.
312838Sgabeblack@google.com *
412838Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without
512838Sgabeblack@google.com * modification, are permitted provided that the following conditions are
612838Sgabeblack@google.com * met: redistributions of source code must retain the above copyright
712838Sgabeblack@google.com * notice, this list of conditions and the following disclaimer;
812838Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright
912838Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the
1012838Sgabeblack@google.com * documentation and/or other materials provided with the distribution;
1112838Sgabeblack@google.com * neither the name of the copyright holders nor the names of its
1212838Sgabeblack@google.com * contributors may be used to endorse or promote products derived from
1312838Sgabeblack@google.com * this software without specific prior written permission.
1412838Sgabeblack@google.com *
1512838Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1612838Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1712838Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1812838Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1912838Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2012838Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2112838Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2212838Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2312838Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2412838Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2512838Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2612838Sgabeblack@google.com *
2712838Sgabeblack@google.com * Authors: Gabe Black
2812838Sgabeblack@google.com */
2912838Sgabeblack@google.com
3012838Sgabeblack@google.com#include "base/logging.hh"
3112952Sgabeblack@google.com#include "systemc/core/process.hh"
3212838Sgabeblack@google.com#include "systemc/ext/core/sc_process_handle.hh"
3312838Sgabeblack@google.com
3412838Sgabeblack@google.comnamespace sc_core
3512838Sgabeblack@google.com{
3612838Sgabeblack@google.com
3712838Sgabeblack@google.comconst char *
3812838Sgabeblack@google.comsc_unwind_exception::what() const throw()
3912838Sgabeblack@google.com{
4012952Sgabeblack@google.com    panic("%s for base class called.\n", __PRETTY_FUNCTION__);
4112838Sgabeblack@google.com}
4212838Sgabeblack@google.com
4312838Sgabeblack@google.combool
4412838Sgabeblack@google.comsc_unwind_exception::is_reset() const
4512838Sgabeblack@google.com{
4612952Sgabeblack@google.com    panic("%s for base class called.\n", __PRETTY_FUNCTION__);
4712838Sgabeblack@google.com}
4812838Sgabeblack@google.com
4912952Sgabeblack@google.comsc_unwind_exception::sc_unwind_exception() {}
5012952Sgabeblack@google.comsc_unwind_exception::sc_unwind_exception(const sc_unwind_exception &) {}
5112952Sgabeblack@google.comsc_unwind_exception::~sc_unwind_exception() throw() {}
5212838Sgabeblack@google.com
5312838Sgabeblack@google.com
5412939Sgabeblack@google.comconst char *
5512939Sgabeblack@google.comsc_process_b::name()
5612939Sgabeblack@google.com{
5712939Sgabeblack@google.com    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
5812939Sgabeblack@google.com    return "";
5912939Sgabeblack@google.com}
6012939Sgabeblack@google.com
6112939Sgabeblack@google.comconst char *
6212939Sgabeblack@google.comsc_process_b::kind()
6312939Sgabeblack@google.com{
6412939Sgabeblack@google.com    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
6512939Sgabeblack@google.com    return "";
6612939Sgabeblack@google.com}
6712939Sgabeblack@google.com
6812939Sgabeblack@google.com
6912939Sgabeblack@google.comsc_process_b *
7012939Sgabeblack@google.comsc_get_curr_process_handle()
7112939Sgabeblack@google.com{
7212939Sgabeblack@google.com    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
7312939Sgabeblack@google.com    return nullptr;
7412939Sgabeblack@google.com}
7512939Sgabeblack@google.com
7612939Sgabeblack@google.com
7712952Sgabeblack@google.comsc_process_handle::sc_process_handle() : _gem5_process(nullptr) {}
7812952Sgabeblack@google.com
7912952Sgabeblack@google.comsc_process_handle::sc_process_handle(const sc_process_handle &handle) :
8012952Sgabeblack@google.com    _gem5_process(handle._gem5_process)
8112838Sgabeblack@google.com{
8212952Sgabeblack@google.com    if (_gem5_process)
8312952Sgabeblack@google.com        _gem5_process->incref();
8412838Sgabeblack@google.com}
8512838Sgabeblack@google.com
8612952Sgabeblack@google.comsc_process_handle::sc_process_handle(sc_object *obj) :
8712952Sgabeblack@google.com    _gem5_process(dynamic_cast<::sc_gem5::Process *>(obj))
8812838Sgabeblack@google.com{
8912952Sgabeblack@google.com    if (_gem5_process)
9012952Sgabeblack@google.com        _gem5_process->incref();
9112838Sgabeblack@google.com}
9212838Sgabeblack@google.com
9312838Sgabeblack@google.comsc_process_handle::~sc_process_handle()
9412838Sgabeblack@google.com{
9512952Sgabeblack@google.com    if (_gem5_process)
9612952Sgabeblack@google.com        _gem5_process->decref();
9712838Sgabeblack@google.com}
9812838Sgabeblack@google.com
9912838Sgabeblack@google.com
10012838Sgabeblack@google.combool
10112838Sgabeblack@google.comsc_process_handle::valid() const
10212838Sgabeblack@google.com{
10312952Sgabeblack@google.com    return _gem5_process != nullptr;
10412838Sgabeblack@google.com}
10512838Sgabeblack@google.com
10612838Sgabeblack@google.com
10712838Sgabeblack@google.comsc_process_handle &
10812952Sgabeblack@google.comsc_process_handle::operator = (const sc_process_handle &handle)
10912838Sgabeblack@google.com{
11012952Sgabeblack@google.com    if (_gem5_process)
11112952Sgabeblack@google.com        _gem5_process->decref();
11212952Sgabeblack@google.com    _gem5_process = handle._gem5_process;
11312952Sgabeblack@google.com    if (_gem5_process)
11412952Sgabeblack@google.com        _gem5_process->incref();
11512838Sgabeblack@google.com    return *this;
11612838Sgabeblack@google.com}
11712838Sgabeblack@google.com
11812838Sgabeblack@google.combool
11912952Sgabeblack@google.comsc_process_handle::operator == (const sc_process_handle &handle) const
12012838Sgabeblack@google.com{
12112952Sgabeblack@google.com    return _gem5_process && handle._gem5_process &&
12212952Sgabeblack@google.com        (_gem5_process == handle._gem5_process);
12312838Sgabeblack@google.com}
12412838Sgabeblack@google.com
12512838Sgabeblack@google.combool
12612952Sgabeblack@google.comsc_process_handle::operator != (const sc_process_handle &handle) const
12712838Sgabeblack@google.com{
12812952Sgabeblack@google.com    return !(handle == *this);
12912838Sgabeblack@google.com}
13012838Sgabeblack@google.com
13112838Sgabeblack@google.combool
13212952Sgabeblack@google.comsc_process_handle::operator < (const sc_process_handle &other) const
13312838Sgabeblack@google.com{
13412952Sgabeblack@google.com    return _gem5_process < other._gem5_process;
13512838Sgabeblack@google.com}
13612838Sgabeblack@google.com
13712952Sgabeblack@google.comvoid
13812952Sgabeblack@google.comsc_process_handle::swap(sc_process_handle &handle)
13912838Sgabeblack@google.com{
14012952Sgabeblack@google.com    ::sc_gem5::Process *temp = handle._gem5_process;
14112952Sgabeblack@google.com    handle._gem5_process = _gem5_process;
14212952Sgabeblack@google.com    _gem5_process = temp;
14312838Sgabeblack@google.com}
14412838Sgabeblack@google.com
14512838Sgabeblack@google.com
14612838Sgabeblack@google.comconst char *
14712838Sgabeblack@google.comsc_process_handle::name() const
14812838Sgabeblack@google.com{
14912952Sgabeblack@google.com    return _gem5_process ? _gem5_process->name() : "";
15012838Sgabeblack@google.com}
15112838Sgabeblack@google.com
15212838Sgabeblack@google.comsc_curr_proc_kind
15312838Sgabeblack@google.comsc_process_handle::proc_kind() const
15412838Sgabeblack@google.com{
15512952Sgabeblack@google.com    return _gem5_process ? _gem5_process->procKind() : SC_NO_PROC_;
15612838Sgabeblack@google.com}
15712838Sgabeblack@google.com
15812838Sgabeblack@google.comconst std::vector<sc_object *> &
15912838Sgabeblack@google.comsc_process_handle::get_child_objects() const
16012838Sgabeblack@google.com{
16112952Sgabeblack@google.com    static const std::vector<sc_object *> empty;
16212952Sgabeblack@google.com    return _gem5_process ? _gem5_process->get_child_objects() : empty;
16312838Sgabeblack@google.com}
16412838Sgabeblack@google.com
16512838Sgabeblack@google.comconst std::vector<sc_event *> &
16612838Sgabeblack@google.comsc_process_handle::get_child_events() const
16712838Sgabeblack@google.com{
16812952Sgabeblack@google.com    static const std::vector<sc_event *> empty;
16912952Sgabeblack@google.com    return _gem5_process ? _gem5_process->get_child_events() : empty;
17012838Sgabeblack@google.com}
17112838Sgabeblack@google.com
17212838Sgabeblack@google.comsc_object *
17312838Sgabeblack@google.comsc_process_handle::get_parent_object() const
17412838Sgabeblack@google.com{
17512952Sgabeblack@google.com    return _gem5_process ? _gem5_process->get_parent_object() : nullptr;
17612838Sgabeblack@google.com}
17712838Sgabeblack@google.com
17812838Sgabeblack@google.comsc_object *
17912838Sgabeblack@google.comsc_process_handle::get_process_object() const
18012838Sgabeblack@google.com{
18112952Sgabeblack@google.com    return _gem5_process;
18212838Sgabeblack@google.com}
18312838Sgabeblack@google.com
18412838Sgabeblack@google.combool
18512838Sgabeblack@google.comsc_process_handle::dynamic() const
18612838Sgabeblack@google.com{
18712952Sgabeblack@google.com    return _gem5_process ? _gem5_process->dynamic() : false;
18812838Sgabeblack@google.com}
18912838Sgabeblack@google.com
19012838Sgabeblack@google.combool
19112838Sgabeblack@google.comsc_process_handle::terminated() const
19212838Sgabeblack@google.com{
19312952Sgabeblack@google.com    return _gem5_process ? _gem5_process->terminated() : false;
19412838Sgabeblack@google.com}
19512838Sgabeblack@google.com
19612838Sgabeblack@google.comconst sc_event &
19712838Sgabeblack@google.comsc_process_handle::terminated_event() const
19812838Sgabeblack@google.com{
19912952Sgabeblack@google.com    static sc_event non_event;
20012952Sgabeblack@google.com    return _gem5_process ? _gem5_process->terminatedEvent() : non_event;
20112838Sgabeblack@google.com}
20212838Sgabeblack@google.com
20312838Sgabeblack@google.com
20412838Sgabeblack@google.comvoid
20512838Sgabeblack@google.comsc_process_handle::suspend(sc_descendent_inclusion_info include_descendants)
20612838Sgabeblack@google.com{
20712952Sgabeblack@google.com    if (!_gem5_process)
20812952Sgabeblack@google.com        return;
20912952Sgabeblack@google.com    _gem5_process->suspend(include_descendants == SC_INCLUDE_DESCENDANTS);
21012838Sgabeblack@google.com}
21112838Sgabeblack@google.com
21212838Sgabeblack@google.comvoid
21312838Sgabeblack@google.comsc_process_handle::resume(sc_descendent_inclusion_info include_descendants)
21412838Sgabeblack@google.com{
21512952Sgabeblack@google.com    if (!_gem5_process)
21612952Sgabeblack@google.com        return;
21712952Sgabeblack@google.com    _gem5_process->resume(include_descendants == SC_INCLUDE_DESCENDANTS);
21812838Sgabeblack@google.com}
21912838Sgabeblack@google.com
22012838Sgabeblack@google.comvoid
22112838Sgabeblack@google.comsc_process_handle::disable(sc_descendent_inclusion_info include_descendants)
22212838Sgabeblack@google.com{
22312952Sgabeblack@google.com    if (!_gem5_process)
22412952Sgabeblack@google.com        return;
22512952Sgabeblack@google.com    _gem5_process->disable(include_descendants == SC_INCLUDE_DESCENDANTS);
22612838Sgabeblack@google.com}
22712838Sgabeblack@google.com
22812838Sgabeblack@google.comvoid
22912838Sgabeblack@google.comsc_process_handle::enable(sc_descendent_inclusion_info include_descendants)
23012838Sgabeblack@google.com{
23112952Sgabeblack@google.com    if (!_gem5_process)
23212952Sgabeblack@google.com        return;
23312952Sgabeblack@google.com    _gem5_process->enable(include_descendants == SC_INCLUDE_DESCENDANTS);
23412838Sgabeblack@google.com}
23512838Sgabeblack@google.com
23612838Sgabeblack@google.comvoid
23712838Sgabeblack@google.comsc_process_handle::kill(sc_descendent_inclusion_info include_descendants)
23812838Sgabeblack@google.com{
23912952Sgabeblack@google.com    if (!_gem5_process)
24012952Sgabeblack@google.com        return;
24112952Sgabeblack@google.com    _gem5_process->kill(include_descendants == SC_INCLUDE_DESCENDANTS);
24212838Sgabeblack@google.com}
24312838Sgabeblack@google.com
24412838Sgabeblack@google.comvoid
24512838Sgabeblack@google.comsc_process_handle::reset(sc_descendent_inclusion_info include_descendants)
24612838Sgabeblack@google.com{
24712952Sgabeblack@google.com    if (!_gem5_process)
24812952Sgabeblack@google.com        return;
24912952Sgabeblack@google.com    _gem5_process->reset(include_descendants == SC_INCLUDE_DESCENDANTS);
25012838Sgabeblack@google.com}
25112838Sgabeblack@google.com
25212838Sgabeblack@google.combool
25312838Sgabeblack@google.comsc_process_handle::is_unwinding()
25412838Sgabeblack@google.com{
25512952Sgabeblack@google.com    if (!_gem5_process) {
25612952Sgabeblack@google.com        //TODO This should generate a systemc style warning if the handle is
25712952Sgabeblack@google.com        //invalid.
25812952Sgabeblack@google.com        return false;
25912952Sgabeblack@google.com    } else {
26012952Sgabeblack@google.com        return _gem5_process->isUnwinding();
26112952Sgabeblack@google.com    }
26212838Sgabeblack@google.com}
26312838Sgabeblack@google.com
26412838Sgabeblack@google.comconst sc_event &
26512838Sgabeblack@google.comsc_process_handle::reset_event() const
26612838Sgabeblack@google.com{
26712952Sgabeblack@google.com    static sc_event non_event;
26812952Sgabeblack@google.com    return _gem5_process ? _gem5_process->resetEvent() : non_event;
26912838Sgabeblack@google.com}
27012838Sgabeblack@google.com
27112838Sgabeblack@google.com
27212838Sgabeblack@google.comvoid
27312838Sgabeblack@google.comsc_process_handle::sync_reset_on(
27412838Sgabeblack@google.com        sc_descendent_inclusion_info include_descendants)
27512838Sgabeblack@google.com{
27612952Sgabeblack@google.com    if (!_gem5_process)
27712952Sgabeblack@google.com        return;
27812952Sgabeblack@google.com    _gem5_process->syncResetOn(include_descendants == SC_INCLUDE_DESCENDANTS);
27912838Sgabeblack@google.com}
28012838Sgabeblack@google.com
28112838Sgabeblack@google.comvoid
28212838Sgabeblack@google.comsc_process_handle::sync_reset_off(
28312838Sgabeblack@google.com        sc_descendent_inclusion_info include_descendants)
28412838Sgabeblack@google.com{
28512952Sgabeblack@google.com    if (!_gem5_process)
28612952Sgabeblack@google.com        return;
28712952Sgabeblack@google.com    _gem5_process->syncResetOff(include_descendants == SC_INCLUDE_DESCENDANTS);
28812838Sgabeblack@google.com}
28912838Sgabeblack@google.com
29012838Sgabeblack@google.com
29112838Sgabeblack@google.comsc_process_handle
29212838Sgabeblack@google.comsc_get_current_process_handle()
29312838Sgabeblack@google.com{
29412838Sgabeblack@google.com    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
29512952Sgabeblack@google.com    return sc_process_handle(nullptr /* Current process pointer */);
29612838Sgabeblack@google.com}
29712838Sgabeblack@google.com
29812838Sgabeblack@google.combool
29912838Sgabeblack@google.comsc_is_unwinding()
30012838Sgabeblack@google.com{
30112952Sgabeblack@google.com    return sc_get_current_process_handle().is_unwinding();
30212838Sgabeblack@google.com}
30312838Sgabeblack@google.com
30412899Sgabeblack@google.combool sc_allow_process_control_corners;
30512899Sgabeblack@google.com
30612838Sgabeblack@google.com} // namespace sc_core
307