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