sc_process_handle.cc revision 13317
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" 3212953Sgabeblack@google.com#include "systemc/core/scheduler.hh" 3313317Sgabeblack@google.com#include "systemc/ext/core/messages.hh" 3412960Sgabeblack@google.com#include "systemc/ext/core/sc_main.hh" 3512838Sgabeblack@google.com#include "systemc/ext/core/sc_process_handle.hh" 3613128Sgabeblack@google.com#include "systemc/ext/utils/sc_report_handler.hh" 3712838Sgabeblack@google.com 3812838Sgabeblack@google.comnamespace sc_core 3912838Sgabeblack@google.com{ 4012838Sgabeblack@google.com 4112838Sgabeblack@google.comconst char * 4212838Sgabeblack@google.comsc_unwind_exception::what() const throw() 4312838Sgabeblack@google.com{ 4412994Sgabeblack@google.com return _isReset ? "RESET" : "KILL"; 4512838Sgabeblack@google.com} 4612838Sgabeblack@google.com 4712838Sgabeblack@google.combool 4812838Sgabeblack@google.comsc_unwind_exception::is_reset() const 4912838Sgabeblack@google.com{ 5012994Sgabeblack@google.com return _isReset; 5112838Sgabeblack@google.com} 5212838Sgabeblack@google.com 5312994Sgabeblack@google.comsc_unwind_exception::sc_unwind_exception() : _isReset(false) {} 5412994Sgabeblack@google.comsc_unwind_exception::sc_unwind_exception(const sc_unwind_exception &e) : 5512994Sgabeblack@google.com _isReset(e._isReset) 5612994Sgabeblack@google.com{} 5712952Sgabeblack@google.comsc_unwind_exception::~sc_unwind_exception() throw() {} 5812838Sgabeblack@google.com 5912838Sgabeblack@google.com 6013087Sgabeblack@google.comvoid 6113087Sgabeblack@google.comsc_set_location(const char *file, int lineno) 6212939Sgabeblack@google.com{ 6313087Sgabeblack@google.com sc_process_b *current = ::sc_gem5::scheduler.current(); 6413087Sgabeblack@google.com if (!current) 6513087Sgabeblack@google.com return; 6613087Sgabeblack@google.com current->file = file; 6713087Sgabeblack@google.com current->lineno = lineno; 6812939Sgabeblack@google.com} 6912939Sgabeblack@google.com 7012939Sgabeblack@google.com 7112939Sgabeblack@google.comsc_process_b * 7212939Sgabeblack@google.comsc_get_curr_process_handle() 7312939Sgabeblack@google.com{ 7413254Sgabeblack@google.com return ::sc_gem5::scheduler.current(); 7512939Sgabeblack@google.com} 7612939Sgabeblack@google.com 7712939Sgabeblack@google.com 7812952Sgabeblack@google.comsc_process_handle::sc_process_handle() : _gem5_process(nullptr) {} 7912952Sgabeblack@google.com 8012952Sgabeblack@google.comsc_process_handle::sc_process_handle(const sc_process_handle &handle) : 8112952Sgabeblack@google.com _gem5_process(handle._gem5_process) 8212838Sgabeblack@google.com{ 8312952Sgabeblack@google.com if (_gem5_process) 8412952Sgabeblack@google.com _gem5_process->incref(); 8512838Sgabeblack@google.com} 8612838Sgabeblack@google.com 8712952Sgabeblack@google.comsc_process_handle::sc_process_handle(sc_object *obj) : 8812952Sgabeblack@google.com _gem5_process(dynamic_cast<::sc_gem5::Process *>(obj)) 8912838Sgabeblack@google.com{ 9012952Sgabeblack@google.com if (_gem5_process) 9112952Sgabeblack@google.com _gem5_process->incref(); 9212838Sgabeblack@google.com} 9312838Sgabeblack@google.com 9412838Sgabeblack@google.comsc_process_handle::~sc_process_handle() 9512838Sgabeblack@google.com{ 9612952Sgabeblack@google.com if (_gem5_process) 9712952Sgabeblack@google.com _gem5_process->decref(); 9812838Sgabeblack@google.com} 9912838Sgabeblack@google.com 10012838Sgabeblack@google.com 10112838Sgabeblack@google.combool 10212838Sgabeblack@google.comsc_process_handle::valid() const 10312838Sgabeblack@google.com{ 10412952Sgabeblack@google.com return _gem5_process != nullptr; 10512838Sgabeblack@google.com} 10612838Sgabeblack@google.com 10712838Sgabeblack@google.com 10812838Sgabeblack@google.comsc_process_handle & 10912952Sgabeblack@google.comsc_process_handle::operator = (const sc_process_handle &handle) 11012838Sgabeblack@google.com{ 11112952Sgabeblack@google.com if (_gem5_process) 11212952Sgabeblack@google.com _gem5_process->decref(); 11312952Sgabeblack@google.com _gem5_process = handle._gem5_process; 11412952Sgabeblack@google.com if (_gem5_process) 11512952Sgabeblack@google.com _gem5_process->incref(); 11612838Sgabeblack@google.com return *this; 11712838Sgabeblack@google.com} 11812838Sgabeblack@google.com 11912838Sgabeblack@google.combool 12012952Sgabeblack@google.comsc_process_handle::operator == (const sc_process_handle &handle) const 12112838Sgabeblack@google.com{ 12212952Sgabeblack@google.com return _gem5_process && handle._gem5_process && 12312952Sgabeblack@google.com (_gem5_process == handle._gem5_process); 12412838Sgabeblack@google.com} 12512838Sgabeblack@google.com 12612838Sgabeblack@google.combool 12712952Sgabeblack@google.comsc_process_handle::operator != (const sc_process_handle &handle) const 12812838Sgabeblack@google.com{ 12912952Sgabeblack@google.com return !(handle == *this); 13012838Sgabeblack@google.com} 13112838Sgabeblack@google.com 13212838Sgabeblack@google.combool 13312952Sgabeblack@google.comsc_process_handle::operator < (const sc_process_handle &other) const 13412838Sgabeblack@google.com{ 13512952Sgabeblack@google.com return _gem5_process < other._gem5_process; 13612838Sgabeblack@google.com} 13712838Sgabeblack@google.com 13812952Sgabeblack@google.comvoid 13912952Sgabeblack@google.comsc_process_handle::swap(sc_process_handle &handle) 14012838Sgabeblack@google.com{ 14112952Sgabeblack@google.com ::sc_gem5::Process *temp = handle._gem5_process; 14212952Sgabeblack@google.com handle._gem5_process = _gem5_process; 14312952Sgabeblack@google.com _gem5_process = temp; 14412838Sgabeblack@google.com} 14512838Sgabeblack@google.com 14612838Sgabeblack@google.com 14712838Sgabeblack@google.comconst char * 14812838Sgabeblack@google.comsc_process_handle::name() const 14912838Sgabeblack@google.com{ 15012952Sgabeblack@google.com return _gem5_process ? _gem5_process->name() : ""; 15112838Sgabeblack@google.com} 15212838Sgabeblack@google.com 15312838Sgabeblack@google.comsc_curr_proc_kind 15412838Sgabeblack@google.comsc_process_handle::proc_kind() const 15512838Sgabeblack@google.com{ 15612952Sgabeblack@google.com return _gem5_process ? _gem5_process->procKind() : SC_NO_PROC_; 15712838Sgabeblack@google.com} 15812838Sgabeblack@google.com 15912838Sgabeblack@google.comconst std::vector<sc_object *> & 16012838Sgabeblack@google.comsc_process_handle::get_child_objects() const 16112838Sgabeblack@google.com{ 16212952Sgabeblack@google.com static const std::vector<sc_object *> empty; 16312952Sgabeblack@google.com return _gem5_process ? _gem5_process->get_child_objects() : empty; 16412838Sgabeblack@google.com} 16512838Sgabeblack@google.com 16612838Sgabeblack@google.comconst std::vector<sc_event *> & 16712838Sgabeblack@google.comsc_process_handle::get_child_events() const 16812838Sgabeblack@google.com{ 16912952Sgabeblack@google.com static const std::vector<sc_event *> empty; 17012952Sgabeblack@google.com return _gem5_process ? _gem5_process->get_child_events() : empty; 17112838Sgabeblack@google.com} 17212838Sgabeblack@google.com 17312838Sgabeblack@google.comsc_object * 17412838Sgabeblack@google.comsc_process_handle::get_parent_object() const 17512838Sgabeblack@google.com{ 17612952Sgabeblack@google.com return _gem5_process ? _gem5_process->get_parent_object() : nullptr; 17712838Sgabeblack@google.com} 17812838Sgabeblack@google.com 17912838Sgabeblack@google.comsc_object * 18012838Sgabeblack@google.comsc_process_handle::get_process_object() const 18112838Sgabeblack@google.com{ 18212952Sgabeblack@google.com return _gem5_process; 18312838Sgabeblack@google.com} 18412838Sgabeblack@google.com 18512838Sgabeblack@google.combool 18612838Sgabeblack@google.comsc_process_handle::dynamic() const 18712838Sgabeblack@google.com{ 18812952Sgabeblack@google.com return _gem5_process ? _gem5_process->dynamic() : false; 18912838Sgabeblack@google.com} 19012838Sgabeblack@google.com 19112838Sgabeblack@google.combool 19212838Sgabeblack@google.comsc_process_handle::terminated() const 19312838Sgabeblack@google.com{ 19412952Sgabeblack@google.com return _gem5_process ? _gem5_process->terminated() : false; 19512838Sgabeblack@google.com} 19612838Sgabeblack@google.com 19712838Sgabeblack@google.comconst sc_event & 19812838Sgabeblack@google.comsc_process_handle::terminated_event() const 19912838Sgabeblack@google.com{ 20013128Sgabeblack@google.com if (!_gem5_process) { 20113317Sgabeblack@google.com SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "terminated_event()"); 20213303Sgabeblack@google.com static sc_gem5::InternalScEvent non_event; 20313128Sgabeblack@google.com return non_event; 20413128Sgabeblack@google.com } 20513128Sgabeblack@google.com return _gem5_process->terminatedEvent(); 20612838Sgabeblack@google.com} 20712838Sgabeblack@google.com 20812838Sgabeblack@google.com 20912838Sgabeblack@google.comvoid 21012838Sgabeblack@google.comsc_process_handle::suspend(sc_descendent_inclusion_info include_descendants) 21112838Sgabeblack@google.com{ 21213128Sgabeblack@google.com if (!_gem5_process) { 21313317Sgabeblack@google.com SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "suspend()"); 21412952Sgabeblack@google.com return; 21513128Sgabeblack@google.com } 21612952Sgabeblack@google.com _gem5_process->suspend(include_descendants == SC_INCLUDE_DESCENDANTS); 21712838Sgabeblack@google.com} 21812838Sgabeblack@google.com 21912838Sgabeblack@google.comvoid 22012838Sgabeblack@google.comsc_process_handle::resume(sc_descendent_inclusion_info include_descendants) 22112838Sgabeblack@google.com{ 22213128Sgabeblack@google.com if (!_gem5_process) { 22313317Sgabeblack@google.com SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "resume()"); 22412952Sgabeblack@google.com return; 22513128Sgabeblack@google.com } 22612952Sgabeblack@google.com _gem5_process->resume(include_descendants == SC_INCLUDE_DESCENDANTS); 22712838Sgabeblack@google.com} 22812838Sgabeblack@google.com 22912838Sgabeblack@google.comvoid 23012838Sgabeblack@google.comsc_process_handle::disable(sc_descendent_inclusion_info include_descendants) 23112838Sgabeblack@google.com{ 23213128Sgabeblack@google.com if (!_gem5_process) { 23313317Sgabeblack@google.com SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "disable()"); 23412952Sgabeblack@google.com return; 23513128Sgabeblack@google.com } 23612952Sgabeblack@google.com _gem5_process->disable(include_descendants == SC_INCLUDE_DESCENDANTS); 23712838Sgabeblack@google.com} 23812838Sgabeblack@google.com 23912838Sgabeblack@google.comvoid 24012838Sgabeblack@google.comsc_process_handle::enable(sc_descendent_inclusion_info include_descendants) 24112838Sgabeblack@google.com{ 24213128Sgabeblack@google.com if (!_gem5_process) { 24313317Sgabeblack@google.com SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "enable()"); 24412952Sgabeblack@google.com return; 24513128Sgabeblack@google.com } 24612952Sgabeblack@google.com _gem5_process->enable(include_descendants == SC_INCLUDE_DESCENDANTS); 24712838Sgabeblack@google.com} 24812838Sgabeblack@google.com 24912838Sgabeblack@google.comvoid 25012838Sgabeblack@google.comsc_process_handle::kill(sc_descendent_inclusion_info include_descendants) 25112838Sgabeblack@google.com{ 25213128Sgabeblack@google.com if (!_gem5_process) { 25313317Sgabeblack@google.com SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "kill()"); 25412952Sgabeblack@google.com return; 25513128Sgabeblack@google.com } 25612952Sgabeblack@google.com _gem5_process->kill(include_descendants == SC_INCLUDE_DESCENDANTS); 25712838Sgabeblack@google.com} 25812838Sgabeblack@google.com 25912838Sgabeblack@google.comvoid 26012838Sgabeblack@google.comsc_process_handle::reset(sc_descendent_inclusion_info include_descendants) 26112838Sgabeblack@google.com{ 26213128Sgabeblack@google.com if (!_gem5_process) { 26313317Sgabeblack@google.com SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "reset()"); 26412952Sgabeblack@google.com return; 26513128Sgabeblack@google.com } 26612952Sgabeblack@google.com _gem5_process->reset(include_descendants == SC_INCLUDE_DESCENDANTS); 26712838Sgabeblack@google.com} 26812838Sgabeblack@google.com 26912838Sgabeblack@google.combool 27012838Sgabeblack@google.comsc_process_handle::is_unwinding() 27112838Sgabeblack@google.com{ 27212952Sgabeblack@google.com if (!_gem5_process) { 27313317Sgabeblack@google.com SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "is_unwinding()"); 27412952Sgabeblack@google.com return false; 27512952Sgabeblack@google.com } 27613128Sgabeblack@google.com return _gem5_process->isUnwinding(); 27712838Sgabeblack@google.com} 27812838Sgabeblack@google.com 27912838Sgabeblack@google.comconst sc_event & 28012838Sgabeblack@google.comsc_process_handle::reset_event() const 28112838Sgabeblack@google.com{ 28213128Sgabeblack@google.com if (!_gem5_process) { 28313317Sgabeblack@google.com SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "reset()"); 28413303Sgabeblack@google.com static sc_gem5::InternalScEvent non_event; 28513128Sgabeblack@google.com return non_event; 28613128Sgabeblack@google.com } 28713128Sgabeblack@google.com return _gem5_process->resetEvent(); 28812838Sgabeblack@google.com} 28912838Sgabeblack@google.com 29012838Sgabeblack@google.com 29112838Sgabeblack@google.comvoid 29212838Sgabeblack@google.comsc_process_handle::sync_reset_on( 29312838Sgabeblack@google.com sc_descendent_inclusion_info include_descendants) 29412838Sgabeblack@google.com{ 29513128Sgabeblack@google.com if (!_gem5_process) { 29613317Sgabeblack@google.com SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "sync_reset_on()"); 29712952Sgabeblack@google.com return; 29813128Sgabeblack@google.com } 29912952Sgabeblack@google.com _gem5_process->syncResetOn(include_descendants == SC_INCLUDE_DESCENDANTS); 30012838Sgabeblack@google.com} 30112838Sgabeblack@google.com 30212838Sgabeblack@google.comvoid 30312838Sgabeblack@google.comsc_process_handle::sync_reset_off( 30412838Sgabeblack@google.com sc_descendent_inclusion_info include_descendants) 30512838Sgabeblack@google.com{ 30613128Sgabeblack@google.com if (!_gem5_process) { 30713317Sgabeblack@google.com SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "sync_reset_off()"); 30812952Sgabeblack@google.com return; 30913128Sgabeblack@google.com } 31012952Sgabeblack@google.com _gem5_process->syncResetOff(include_descendants == SC_INCLUDE_DESCENDANTS); 31112838Sgabeblack@google.com} 31212838Sgabeblack@google.com 31312838Sgabeblack@google.com 31412838Sgabeblack@google.comsc_process_handle 31512838Sgabeblack@google.comsc_get_current_process_handle() 31612838Sgabeblack@google.com{ 31712960Sgabeblack@google.com if (sc_is_running()) 31812960Sgabeblack@google.com return sc_process_handle(::sc_gem5::scheduler.current()); 31912960Sgabeblack@google.com else 32012960Sgabeblack@google.com return sc_process_handle(::sc_gem5::Process::newest()); 32112838Sgabeblack@google.com} 32212838Sgabeblack@google.com 32312838Sgabeblack@google.combool 32412838Sgabeblack@google.comsc_is_unwinding() 32512838Sgabeblack@google.com{ 32612952Sgabeblack@google.com return sc_get_current_process_handle().is_unwinding(); 32712838Sgabeblack@google.com} 32812838Sgabeblack@google.com 32912899Sgabeblack@google.combool sc_allow_process_control_corners; 33012899Sgabeblack@google.com 33112838Sgabeblack@google.com} // namespace sc_core 332