sc_main.cc revision 13404:5da37c38d749
112027Sjungma@eit.uni-kl.de/* 212027Sjungma@eit.uni-kl.de * Copyright 2018 Google, Inc. 312027Sjungma@eit.uni-kl.de * 412027Sjungma@eit.uni-kl.de * Redistribution and use in source and binary forms, with or without 512027Sjungma@eit.uni-kl.de * modification, are permitted provided that the following conditions are 612027Sjungma@eit.uni-kl.de * met: redistributions of source code must retain the above copyright 712027Sjungma@eit.uni-kl.de * notice, this list of conditions and the following disclaimer; 812027Sjungma@eit.uni-kl.de * redistributions in binary form must reproduce the above copyright 912027Sjungma@eit.uni-kl.de * notice, this list of conditions and the following disclaimer in the 1012027Sjungma@eit.uni-kl.de * documentation and/or other materials provided with the distribution; 1112027Sjungma@eit.uni-kl.de * neither the name of the copyright holders nor the names of its 1212027Sjungma@eit.uni-kl.de * contributors may be used to endorse or promote products derived from 1312027Sjungma@eit.uni-kl.de * this software without specific prior written permission. 1412027Sjungma@eit.uni-kl.de * 1512027Sjungma@eit.uni-kl.de * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1612027Sjungma@eit.uni-kl.de * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1712027Sjungma@eit.uni-kl.de * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1812027Sjungma@eit.uni-kl.de * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1912027Sjungma@eit.uni-kl.de * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2012027Sjungma@eit.uni-kl.de * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2112027Sjungma@eit.uni-kl.de * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2212027Sjungma@eit.uni-kl.de * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2312027Sjungma@eit.uni-kl.de * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2412027Sjungma@eit.uni-kl.de * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2512027Sjungma@eit.uni-kl.de * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2612027Sjungma@eit.uni-kl.de * 2712027Sjungma@eit.uni-kl.de * Authors: Gabe Black 2812027Sjungma@eit.uni-kl.de */ 2912027Sjungma@eit.uni-kl.de 3012027Sjungma@eit.uni-kl.de#include "base/types.hh" 3112027Sjungma@eit.uni-kl.de#include "sim/core.hh" 3212027Sjungma@eit.uni-kl.de#include "sim/eventq.hh" 3312027Sjungma@eit.uni-kl.de#include "systemc/core/kernel.hh" 3412027Sjungma@eit.uni-kl.de#include "systemc/core/sc_main_fiber.hh" 3512027Sjungma@eit.uni-kl.de#include "systemc/core/scheduler.hh" 3612027Sjungma@eit.uni-kl.de#include "systemc/ext/core/messages.hh" 3712027Sjungma@eit.uni-kl.de#include "systemc/ext/core/sc_main.hh" 3812027Sjungma@eit.uni-kl.de#include "systemc/ext/utils/sc_report_handler.hh" 3912027Sjungma@eit.uni-kl.de 4012027Sjungma@eit.uni-kl.denamespace sc_core 4112027Sjungma@eit.uni-kl.de{ 4212027Sjungma@eit.uni-kl.de 4312027Sjungma@eit.uni-kl.denamespace 4412027Sjungma@eit.uni-kl.de{ 4512027Sjungma@eit.uni-kl.de 4612027Sjungma@eit.uni-kl.desc_stop_mode _stop_mode = SC_STOP_FINISH_DELTA; 4712027Sjungma@eit.uni-kl.de 4812027Sjungma@eit.uni-kl.de} // anonymous namespace 4912027Sjungma@eit.uni-kl.de 5012027Sjungma@eit.uni-kl.deint 5112027Sjungma@eit.uni-kl.desc_argc() 5212027Sjungma@eit.uni-kl.de{ 5312027Sjungma@eit.uni-kl.de return ::sc_gem5::scMainFiber.argc(); 5412027Sjungma@eit.uni-kl.de} 5512027Sjungma@eit.uni-kl.de 5612027Sjungma@eit.uni-kl.deconst char *const * 5712027Sjungma@eit.uni-kl.desc_argv() 5812027Sjungma@eit.uni-kl.de{ 5912027Sjungma@eit.uni-kl.de return ::sc_gem5::scMainFiber.argv(); 6012027Sjungma@eit.uni-kl.de} 6112027Sjungma@eit.uni-kl.de 6212027Sjungma@eit.uni-kl.devoid 6312027Sjungma@eit.uni-kl.desc_start() 6412027Sjungma@eit.uni-kl.de{ 6512027Sjungma@eit.uni-kl.de Tick now = ::sc_gem5::scheduler.getCurTick(); 6612027Sjungma@eit.uni-kl.de sc_start(sc_time::from_value(MaxTick - now), SC_EXIT_ON_STARVATION); 6712027Sjungma@eit.uni-kl.de} 6812027Sjungma@eit.uni-kl.de 6912027Sjungma@eit.uni-kl.devoid 7012027Sjungma@eit.uni-kl.desc_pause() 7112027Sjungma@eit.uni-kl.de{ 7212027Sjungma@eit.uni-kl.de if (::sc_gem5::Kernel::status() == SC_RUNNING) 7312027Sjungma@eit.uni-kl.de ::sc_gem5::scheduler.schedulePause(); 7412027Sjungma@eit.uni-kl.de} 7512027Sjungma@eit.uni-kl.de 7612027Sjungma@eit.uni-kl.devoid 7712027Sjungma@eit.uni-kl.desc_start(const sc_time &time, sc_starvation_policy p) 7812027Sjungma@eit.uni-kl.de{ 7912027Sjungma@eit.uni-kl.de if (time.value() == 0) { 8012027Sjungma@eit.uni-kl.de ::sc_gem5::scheduler.oneCycle(); 8112027Sjungma@eit.uni-kl.de } else { 8212027Sjungma@eit.uni-kl.de Tick now = ::sc_gem5::scheduler.getCurTick(); 8312027Sjungma@eit.uni-kl.de if (MaxTick - now < time.value()) 8412027Sjungma@eit.uni-kl.de SC_REPORT_ERROR(SC_ID_SIMULATION_TIME_OVERFLOW_, ""); 8512027Sjungma@eit.uni-kl.de ::sc_gem5::scheduler.start(now + time.value(), p == SC_RUN_TO_TIME); 8612027Sjungma@eit.uni-kl.de } 8712027Sjungma@eit.uni-kl.de} 8812027Sjungma@eit.uni-kl.de 8912027Sjungma@eit.uni-kl.devoid 9012027Sjungma@eit.uni-kl.desc_set_stop_mode(sc_stop_mode mode) 9112027Sjungma@eit.uni-kl.de{ 9212027Sjungma@eit.uni-kl.de if (sc_is_running()) { 9312027Sjungma@eit.uni-kl.de SC_REPORT_ERROR(SC_ID_STOP_MODE_AFTER_START_, ""); 9412027Sjungma@eit.uni-kl.de return; 9512027Sjungma@eit.uni-kl.de } 9612027Sjungma@eit.uni-kl.de _stop_mode = mode; 9712027Sjungma@eit.uni-kl.de} 9812027Sjungma@eit.uni-kl.de 9912027Sjungma@eit.uni-kl.desc_stop_mode 10012027Sjungma@eit.uni-kl.desc_get_stop_mode() 10112027Sjungma@eit.uni-kl.de{ 10212027Sjungma@eit.uni-kl.de return _stop_mode; 10312027Sjungma@eit.uni-kl.de} 10412027Sjungma@eit.uni-kl.de 10512027Sjungma@eit.uni-kl.devoid 10612027Sjungma@eit.uni-kl.desc_stop() 10712027Sjungma@eit.uni-kl.de{ 10812027Sjungma@eit.uni-kl.de static bool stop_called = false; 10912027Sjungma@eit.uni-kl.de if (stop_called) { 11012027Sjungma@eit.uni-kl.de static bool stop_warned = false; 11112027Sjungma@eit.uni-kl.de if (!stop_warned) 11212027Sjungma@eit.uni-kl.de SC_REPORT_WARNING(SC_ID_SIMULATION_STOP_CALLED_TWICE_, ""); 11312027Sjungma@eit.uni-kl.de stop_warned = true; 11412027Sjungma@eit.uni-kl.de return; 11512027Sjungma@eit.uni-kl.de } 11612027Sjungma@eit.uni-kl.de stop_called = true; 11712027Sjungma@eit.uni-kl.de 11812027Sjungma@eit.uni-kl.de if (::sc_gem5::Kernel::status() == SC_STOPPED) 11912027Sjungma@eit.uni-kl.de return; 12012027Sjungma@eit.uni-kl.de 12112027Sjungma@eit.uni-kl.de if ((sc_get_status() & SC_RUNNING)) { 12212027Sjungma@eit.uni-kl.de bool finish_delta = (_stop_mode == SC_STOP_FINISH_DELTA); 12312027Sjungma@eit.uni-kl.de ::sc_gem5::scheduler.scheduleStop(finish_delta); 12412027Sjungma@eit.uni-kl.de } else { 12512027Sjungma@eit.uni-kl.de ::sc_gem5::Kernel::stop(); 12612027Sjungma@eit.uni-kl.de } 12712027Sjungma@eit.uni-kl.de} 12812027Sjungma@eit.uni-kl.de 12912027Sjungma@eit.uni-kl.deconst sc_time & 13012027Sjungma@eit.uni-kl.desc_time_stamp() 13112027Sjungma@eit.uni-kl.de{ 13212027Sjungma@eit.uni-kl.de static sc_time tstamp(1.0, SC_SEC); 13312027Sjungma@eit.uni-kl.de tstamp = sc_time::from_value(::sc_gem5::scheduler.getCurTick()); 13412027Sjungma@eit.uni-kl.de return tstamp; 13512027Sjungma@eit.uni-kl.de} 13612027Sjungma@eit.uni-kl.de 13712027Sjungma@eit.uni-kl.desc_dt::uint64 13812027Sjungma@eit.uni-kl.desc_delta_count() 13912027Sjungma@eit.uni-kl.de{ 14012027Sjungma@eit.uni-kl.de return sc_gem5::scheduler.numCycles(); 14112027Sjungma@eit.uni-kl.de} 14212027Sjungma@eit.uni-kl.de 14312027Sjungma@eit.uni-kl.debool 14412027Sjungma@eit.uni-kl.desc_is_running() 14512027Sjungma@eit.uni-kl.de{ 14612027Sjungma@eit.uni-kl.de return sc_get_status() & (SC_RUNNING | SC_PAUSED); 14712027Sjungma@eit.uni-kl.de} 14812027Sjungma@eit.uni-kl.de 14912027Sjungma@eit.uni-kl.debool 15012027Sjungma@eit.uni-kl.desc_pending_activity_at_current_time() 15112027Sjungma@eit.uni-kl.de{ 15212027Sjungma@eit.uni-kl.de return ::sc_gem5::scheduler.pendingCurr(); 15312027Sjungma@eit.uni-kl.de} 15412027Sjungma@eit.uni-kl.de 15512027Sjungma@eit.uni-kl.debool 15612027Sjungma@eit.uni-kl.desc_pending_activity_at_future_time() 15712027Sjungma@eit.uni-kl.de{ 15812027Sjungma@eit.uni-kl.de return ::sc_gem5::scheduler.pendingFuture(); 15912027Sjungma@eit.uni-kl.de} 16012027Sjungma@eit.uni-kl.de 16112027Sjungma@eit.uni-kl.debool 16212027Sjungma@eit.uni-kl.desc_pending_activity() 16312027Sjungma@eit.uni-kl.de{ 16412027Sjungma@eit.uni-kl.de return sc_pending_activity_at_current_time() || 16512027Sjungma@eit.uni-kl.de sc_pending_activity_at_future_time(); 16612027Sjungma@eit.uni-kl.de} 16712027Sjungma@eit.uni-kl.de 16812027Sjungma@eit.uni-kl.desc_time 16912027Sjungma@eit.uni-kl.desc_time_to_pending_activity() 17012027Sjungma@eit.uni-kl.de{ 17112027Sjungma@eit.uni-kl.de return sc_time::from_value(::sc_gem5::scheduler.timeToPending()); 17212027Sjungma@eit.uni-kl.de} 17312027Sjungma@eit.uni-kl.de 17412027Sjungma@eit.uni-kl.desc_status 17512027Sjungma@eit.uni-kl.desc_get_status() 17612027Sjungma@eit.uni-kl.de{ 17712027Sjungma@eit.uni-kl.de return ::sc_gem5::kernel ? ::sc_gem5::kernel->status() : SC_ELABORATION; 17812027Sjungma@eit.uni-kl.de} 17912027Sjungma@eit.uni-kl.de 18012027Sjungma@eit.uni-kl.destd::ostream & 18112027Sjungma@eit.uni-kl.deoperator << (std::ostream &os, sc_status s) 18212027Sjungma@eit.uni-kl.de{ 18312027Sjungma@eit.uni-kl.de switch (s) { 18412027Sjungma@eit.uni-kl.de case SC_ELABORATION: 18512027Sjungma@eit.uni-kl.de os << "SC_ELABORATION"; 18612027Sjungma@eit.uni-kl.de break; 18712027Sjungma@eit.uni-kl.de case SC_BEFORE_END_OF_ELABORATION: 18812027Sjungma@eit.uni-kl.de os << "SC_BEFORE_END_OF_ELABORATION"; 18912027Sjungma@eit.uni-kl.de break; 19012027Sjungma@eit.uni-kl.de case SC_END_OF_ELABORATION: 19112027Sjungma@eit.uni-kl.de os << "SC_END_OF_ELABORATION"; 19212027Sjungma@eit.uni-kl.de break; 19312027Sjungma@eit.uni-kl.de case SC_START_OF_SIMULATION: 19412027Sjungma@eit.uni-kl.de os << "SC_START_OF_SIMULATION"; 19512027Sjungma@eit.uni-kl.de break; 19612027Sjungma@eit.uni-kl.de case SC_RUNNING: 19712027Sjungma@eit.uni-kl.de os << "SC_RUNNING"; 19812027Sjungma@eit.uni-kl.de break; 19912027Sjungma@eit.uni-kl.de case SC_PAUSED: 20012027Sjungma@eit.uni-kl.de os << "SC_PAUSED"; 20112027Sjungma@eit.uni-kl.de break; 20212027Sjungma@eit.uni-kl.de case SC_STOPPED: 20312027Sjungma@eit.uni-kl.de os << "SC_STOPPED"; 20412027Sjungma@eit.uni-kl.de break; 20512027Sjungma@eit.uni-kl.de case SC_END_OF_SIMULATION: 20612027Sjungma@eit.uni-kl.de os << "SC_END_OF_SIMULATION"; 20712027Sjungma@eit.uni-kl.de break; 20812027Sjungma@eit.uni-kl.de 20912027Sjungma@eit.uni-kl.de // Nonstandard 210 case SC_END_OF_INITIALIZATION: 211 os << "SC_END_OF_INITIALIZATION"; 212 break; 213 case SC_END_OF_UPDATE: 214 os << "SC_END_OF_UPDATE"; 215 break; 216 case SC_BEFORE_TIMESTEP: 217 os << "SC_BEFORE_TIMESTEP"; 218 break; 219 220 default: 221 if (s & SC_STATUS_ANY) { 222 const char *prefix = "("; 223 for (sc_status m = (sc_status)0x1; 224 m < SC_STATUS_ANY; m = (sc_status)(m << 1)) { 225 if (m & s) { 226 os << prefix; 227 prefix = "|"; 228 os << m; 229 } 230 } 231 os << ")"; 232 } else { 233 ccprintf(os, "%#x", s); 234 } 235 } 236 237 return os; 238} 239 240} // namespace sc_core 241