gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
kernel.cc
Go to the documentation of this file.
1 /*
2  * Copyright 2018 Google, Inc.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met: redistributions of source code must retain the above copyright
7  * notice, this list of conditions and the following disclaimer;
8  * redistributions in binary form must reproduce the above copyright
9  * notice, this list of conditions and the following disclaimer in the
10  * documentation and/or other materials provided with the distribution;
11  * neither the name of the copyright holders nor the names of its
12  * contributors may be used to endorse or promote products derived from
13  * this software without specific prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  *
27  * Authors: Gabe Black
28  */
29 
30 #include "systemc/core/kernel.hh"
31 
32 #include "base/logging.hh"
33 #include "systemc/core/channel.hh"
34 #include "systemc/core/module.hh"
35 #include "systemc/core/port.hh"
38 
39 namespace sc_gem5
40 {
41 
42 namespace
43 {
44 
45 bool stopAfterCallbacks = false;
46 bool startComplete = false;
47 bool endComplete = false;
48 
50 
51 } // anonymous namespace
52 
53 bool Kernel::startOfSimulationComplete() { return startComplete; }
54 bool Kernel::endOfSimulationComplete() { return endComplete; }
55 
56 sc_core::sc_status Kernel::status() { return _status; }
57 void Kernel::status(sc_core::sc_status s) { _status = s; }
58 
60  SimObject(params), t0Event(this, false, EventBase::Default_Pri - 1)
61 {
62  // Install ourselves as the scheduler's event manager.
64 }
65 
66 void
68 {
69  if (scMainFiber.finished())
70  return;
71 
72  if (stopAfterCallbacks)
73  fatal("Simulation called sc_stop during elaboration.\n");
74 
76  for (auto p: allPorts)
77  p->sc_port_base()->before_end_of_elaboration();
78  for (auto m: sc_gem5::allModules)
79  m->beforeEndOfElaboration();
80  for (auto c: sc_gem5::allChannels)
81  c->sc_chan()->before_end_of_elaboration();
82 
84 }
85 
86 void
88 {
89  if (scMainFiber.finished() || stopAfterCallbacks)
90  return;
91 
92  try {
93  for (auto p: allPorts)
94  p->finalize();
95  for (auto p: allPorts)
96  p->regPort();
97 
99  for (auto p: allPorts)
100  p->sc_port_base()->end_of_elaboration();
101  for (auto m: sc_gem5::allModules)
102  m->endOfElaboration();
103  for (auto c: sc_gem5::allChannels)
104  c->sc_chan()->end_of_elaboration();
105  } catch (...) {
107  }
108 }
109 
110 void
112 {
113  if (scMainFiber.finished())
114  return;
115 
117 
118  if (stopAfterCallbacks)
119  return;
120 
121  try {
123  for (auto p: allPorts)
124  p->sc_port_base()->start_of_simulation();
125  for (auto m: sc_gem5::allModules)
126  m->startOfSimulation();
127  for (auto c: sc_gem5::allChannels)
128  c->sc_chan()->start_of_simulation();
129  } catch (...) {
131  }
132 
133  startComplete = true;
134 
135  if (stopAfterCallbacks)
136  stopWork();
137 
139 }
140 
141 void
143 {
144  if (status() < ::sc_core::SC_RUNNING)
145  stopAfterCallbacks = true;
146  else
147  stopWork();
148 }
149 
150 void
152 {
154  try {
155  for (auto p: allPorts)
156  p->sc_port_base()->end_of_simulation();
157  for (auto m: sc_gem5::allModules)
158  m->endOfSimulation();
159  for (auto c: sc_gem5::allChannels)
160  c->sc_chan()->end_of_simulation();
161  } catch (...) {
163  }
164 
165  endComplete = true;
166 
168 }
169 
170 void
172 {
173  if (stopAfterCallbacks) {
174  scheduler.clear();
176  scheduler.scheduleStop(false);
177  } else {
180  }
181 }
182 
184 
185 } // namespace sc_gem5
186 
188 SystemC_KernelParams::create()
189 {
191  "Only one systemc kernel object may be defined.\n");
192  sc_gem5::kernel = new sc_gem5::Kernel(this);
193  return sc_gem5::kernel;
194 }
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
Definition: kernel.cc:67
bool finished() const
Returns whether the "main" function of this fiber has finished.
Definition: fiber.hh:83
Kernel(Params *params)
Definition: kernel.cc:59
bool elaborationDone()
Definition: scheduler.hh:356
EventWrapper< Kernel, &Kernel::t0Handler > t0Event
Definition: kernel.hh:70
std::list< Module * > allModules
Definition: module.cc:213
#define fatal(...)
This implements a cprintf based fatal() function.
Definition: logging.hh:175
void regStats() override
Callback to set stat parameters.
Definition: kernel.cc:87
Bitfield< 0 > m
SimObjectParams Params
Definition: sim_object.hh:113
static bool endOfSimulationComplete()
Definition: kernel.cc:54
Kernel * kernel
Definition: kernel.cc:183
static sc_core::sc_status status()
Definition: kernel.cc:56
static bool startOfSimulationComplete()
Definition: kernel.cc:53
void t0Handler()
Definition: kernel.cc:171
void scheduleStop(bool finish_delta)
Definition: scheduler.cc:470
Tick curTick()
The current simulated tick.
Definition: core.hh:47
Bitfield< 4 > s
const Params * params() const
Definition: sim_object.hh:114
void startup() override
startup() is the final initialization call before simulation.
Definition: kernel.cc:111
Scheduler scheduler
Definition: scheduler.cc:491
void setEventQueue(EventQueue *_eq)
Definition: scheduler.hh:227
EventQueue * eventQueue() const
Definition: eventq.hh:738
Bitfield< 29 > c
std::list< Port * > allPorts
Definition: port.cc:169
static void stop()
Definition: kernel.cc:142
std::set< Channel * > allChannels
Definition: channel.cc:60
void schedule(Event &event, Tick when)
Definition: eventq.hh:744
Common base class for Event and GlobalEvent, so they can share flag and priority definitions and acce...
Definition: eventq.hh:93
ScMainFiber scMainFiber
Bitfield< 0 > p
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
Definition: logging.hh:185
static void stopWork()
Definition: kernel.cc:151
Abstract superclass for simulation objects.
Definition: sim_object.hh:96
sc_status
Definition: sc_main.hh:83

Generated on Fri Feb 28 2020 16:27:03 for gem5 by doxygen 1.8.13