kernel.cc revision 13191:a2254693aa5b
111878Sandreas.sandberg@arm.com/*
211878Sandreas.sandberg@arm.com * Copyright 2018 Google, Inc.
311878Sandreas.sandberg@arm.com *
411878Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
511878Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
611878Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
711878Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
811878Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
911878Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
1011878Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
1111878Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
1211878Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
134126SN/A * this software without specific prior written permission.
148295Snate@binkert.org *
154126SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
164126SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
174126SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
184126SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
194126SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
204126SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
214126SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
224126SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
234126SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
244126SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
254126SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
264126SN/A *
274126SN/A * Authors: Gabe Black
284126SN/A */
294126SN/A
304126SN/A#include "systemc/core/kernel.hh"
314126SN/A
324126SN/A#include "base/logging.hh"
334126SN/A#include "systemc/core/channel.hh"
344126SN/A#include "systemc/core/module.hh"
354126SN/A#include "systemc/core/scheduler.hh"
364126SN/A
374126SN/Anamespace sc_gem5
384126SN/A{
394126SN/A
404126SN/Anamespace
4111878Sandreas.sandberg@arm.com{
424126SN/A
438296Snate@binkert.orgbool scMainDone = false;
448296Snate@binkert.orgbool stopAfterCallbacks = false;
4511802Sandreas.sandberg@arm.combool startComplete = false;
468295Snate@binkert.orgbool endComplete = false;
478296Snate@binkert.org
484126SN/Asc_core::sc_status _status = sc_core::SC_ELABORATION;
4911766Sandreas.sandberg@arm.com
5011802Sandreas.sandberg@arm.com} // anonymous namespace
5111802Sandreas.sandberg@arm.com
5211766Sandreas.sandberg@arm.combool Kernel::startOfSimulationComplete() { return startComplete; }
538296Snate@binkert.orgbool Kernel::endOfSimulationComplete() { return endComplete; }
5411878Sandreas.sandberg@arm.com
5511878Sandreas.sandberg@arm.combool Kernel::scMainFinished() { return scMainDone; }
5611878Sandreas.sandberg@arm.comvoid Kernel::scMainFinished(bool finished) { scMainDone = finished; }
5711878Sandreas.sandberg@arm.com
5811878Sandreas.sandberg@arm.comsc_core::sc_status Kernel::status() { return _status; }
5911878Sandreas.sandberg@arm.comvoid Kernel::status(sc_core::sc_status s) { _status = s; }
6011878Sandreas.sandberg@arm.com
6111878Sandreas.sandberg@arm.comKernel::Kernel(Params *params) :
6211878Sandreas.sandberg@arm.com    SimObject(params), t0Event(this, false, EventBase::Default_Pri - 1)
6311878Sandreas.sandberg@arm.com{
6411878Sandreas.sandberg@arm.com    // Install ourselves as the scheduler's event manager.
6511878Sandreas.sandberg@arm.com    ::sc_gem5::scheduler.setEventQueue(eventQueue());
6611878Sandreas.sandberg@arm.com}
6711878Sandreas.sandberg@arm.com
6811878Sandreas.sandberg@arm.comvoid
6911878Sandreas.sandberg@arm.comKernel::init()
7011878Sandreas.sandberg@arm.com{
7111878Sandreas.sandberg@arm.com    if (scMainDone)
7211878Sandreas.sandberg@arm.com        return;
7311878Sandreas.sandberg@arm.com
7413712Sandreas.sandberg@arm.com    if (stopAfterCallbacks)
7513712Sandreas.sandberg@arm.com        fatal("Simulation called sc_stop during elaboration.\n");
7613712Sandreas.sandberg@arm.com
7713712Sandreas.sandberg@arm.com    status(::sc_core::SC_BEFORE_END_OF_ELABORATION);
7813712Sandreas.sandberg@arm.com    for (auto m: sc_gem5::allModules)
7911878Sandreas.sandberg@arm.com        m->beforeEndOfElaboration();
8011878Sandreas.sandberg@arm.com    for (auto c: sc_gem5::allChannels)
8111878Sandreas.sandberg@arm.com        c->sc_chan()->before_end_of_elaboration();
8211878Sandreas.sandberg@arm.com}
8311878Sandreas.sandberg@arm.com
8411878Sandreas.sandberg@arm.comvoid
8511878Sandreas.sandberg@arm.comKernel::regStats()
8611878Sandreas.sandberg@arm.com{
8711878Sandreas.sandberg@arm.com    if (scMainDone || stopAfterCallbacks)
8811878Sandreas.sandberg@arm.com        return;
8911878Sandreas.sandberg@arm.com
9011878Sandreas.sandberg@arm.com    try {
9111878Sandreas.sandberg@arm.com        for (auto m: sc_gem5::allModules)
9211878Sandreas.sandberg@arm.com            for (auto p: m->ports)
9311878Sandreas.sandberg@arm.com                p->_gem5Finalize();
9411878Sandreas.sandberg@arm.com
9511878Sandreas.sandberg@arm.com        status(::sc_core::SC_END_OF_ELABORATION);
9611878Sandreas.sandberg@arm.com        for (auto m: sc_gem5::allModules)
9711878Sandreas.sandberg@arm.com            m->endOfElaboration();
9811878Sandreas.sandberg@arm.com        for (auto c: sc_gem5::allChannels)
9911878Sandreas.sandberg@arm.com            c->sc_chan()->end_of_elaboration();
10011878Sandreas.sandberg@arm.com    } catch (...) {
10111878Sandreas.sandberg@arm.com        ::sc_gem5::scheduler.throwToScMain();
10211878Sandreas.sandberg@arm.com    }
10311878Sandreas.sandberg@arm.com
10411878Sandreas.sandberg@arm.com    ::sc_gem5::scheduler.elaborationDone(true);
10511878Sandreas.sandberg@arm.com}
10611878Sandreas.sandberg@arm.com
10711878Sandreas.sandberg@arm.comvoid
10811878Sandreas.sandberg@arm.comKernel::startup()
10911878Sandreas.sandberg@arm.com{
11011878Sandreas.sandberg@arm.com    if (scMainDone)
11111878Sandreas.sandberg@arm.com        return;
11211878Sandreas.sandberg@arm.com
11311878Sandreas.sandberg@arm.com    schedule(t0Event, curTick());
11411878Sandreas.sandberg@arm.com
11511878Sandreas.sandberg@arm.com    if (stopAfterCallbacks)
11611878Sandreas.sandberg@arm.com        return;
11711878Sandreas.sandberg@arm.com
11811878Sandreas.sandberg@arm.com    try {
11911878Sandreas.sandberg@arm.com        status(::sc_core::SC_START_OF_SIMULATION);
12011878Sandreas.sandberg@arm.com        for (auto m: sc_gem5::allModules)
12111878Sandreas.sandberg@arm.com            m->startOfSimulation();
12211878Sandreas.sandberg@arm.com        for (auto c: sc_gem5::allChannels)
12311878Sandreas.sandberg@arm.com            c->sc_chan()->start_of_simulation();
12411878Sandreas.sandberg@arm.com    } catch (...) {
12511878Sandreas.sandberg@arm.com        ::sc_gem5::scheduler.throwToScMain();
12611878Sandreas.sandberg@arm.com    }
12711878Sandreas.sandberg@arm.com
12811878Sandreas.sandberg@arm.com    startComplete = true;
12911878Sandreas.sandberg@arm.com
13011878Sandreas.sandberg@arm.com    if (stopAfterCallbacks)
13111878Sandreas.sandberg@arm.com        stopWork();
13211878Sandreas.sandberg@arm.com
13311878Sandreas.sandberg@arm.com    kernel->status(::sc_core::SC_RUNNING);
13411878Sandreas.sandberg@arm.com}
13511878Sandreas.sandberg@arm.com
13611878Sandreas.sandberg@arm.comvoid
13711878Sandreas.sandberg@arm.comKernel::stop()
13811878Sandreas.sandberg@arm.com{
13911878Sandreas.sandberg@arm.com    if (status() < ::sc_core::SC_RUNNING)
14011878Sandreas.sandberg@arm.com        stopAfterCallbacks = true;
14111878Sandreas.sandberg@arm.com    else
14213712Sandreas.sandberg@arm.com        stopWork();
14313712Sandreas.sandberg@arm.com}
14413712Sandreas.sandberg@arm.com
14513712Sandreas.sandberg@arm.comvoid
14613712Sandreas.sandberg@arm.comKernel::stopWork()
14711878Sandreas.sandberg@arm.com{
14811878Sandreas.sandberg@arm.com    status(::sc_core::SC_END_OF_SIMULATION);
14911878Sandreas.sandberg@arm.com    try {
15011878Sandreas.sandberg@arm.com        for (auto m: sc_gem5::allModules)
15111878Sandreas.sandberg@arm.com            m->endOfSimulation();
15211878Sandreas.sandberg@arm.com        for (auto c: sc_gem5::allChannels)
15311878Sandreas.sandberg@arm.com            c->sc_chan()->end_of_simulation();
15411878Sandreas.sandberg@arm.com    } catch (...) {
15511878Sandreas.sandberg@arm.com        ::sc_gem5::scheduler.throwToScMain();
1564126SN/A    }
1576001SN/A
15811802Sandreas.sandberg@arm.com    endComplete = true;
15911802Sandreas.sandberg@arm.com
1606001SN/A    status(::sc_core::SC_STOPPED);
1618295Snate@binkert.org}
1628295Snate@binkert.org
1638295Snate@binkert.orgvoid
1646001SN/AKernel::t0Handler()
1658295Snate@binkert.org{
1668295Snate@binkert.org    if (stopAfterCallbacks) {
1678295Snate@binkert.org        scheduler.clear();
1688295Snate@binkert.org        ::sc_gem5::scheduler.initPhase();
16911788Sandreas.sandberg@arm.com        scheduler.scheduleStop(false);
17011802Sandreas.sandberg@arm.com    } else {
1718295Snate@binkert.org        ::sc_gem5::scheduler.initPhase();
1728296Snate@binkert.org        status(::sc_core::SC_RUNNING);
1738296Snate@binkert.org    }
17410169SCurtis.Dunham@arm.com}
17510169SCurtis.Dunham@arm.com
1768296Snate@binkert.orgKernel *kernel;
1778296Snate@binkert.org
1788296Snate@binkert.org} // namespace sc_gem5
1798296Snate@binkert.org
18013681Sandreas.sandberg@arm.comsc_gem5::Kernel *
1818295Snate@binkert.orgSystemC_KernelParams::create()
1828295Snate@binkert.org{
1838296Snate@binkert.org    panic_if(sc_gem5::kernel,
1848295Snate@binkert.org            "Only one systemc kernel object may be defined.\n");
18511802Sandreas.sandberg@arm.com    sc_gem5::kernel = new sc_gem5::Kernel(this);
1868986SAli.Saidi@ARM.com    return sc_gem5::kernel;
1878296Snate@binkert.org}
1888296Snate@binkert.org