misc: Adopt the gem5 namespace
Apply the gem5 namespace to the codebase. Some anonymous namespaces could theoretically be removed, but since this change's main goal was to keep conflicts at a minimum, it was decided not to modify much the general shape of the files. A few missing comments of the form "// namespace X" that occurred before the newly added "} // namespace gem5" have been added for consistency. std out should not be included in the gem5 namespace, so they weren't. ProtoMessage has not been included in the gem5 namespace, since I'm not familiar with how proto works. Regarding the SystemC files, although they belong to gem5, they actually perform integration between gem5 and SystemC; therefore, it deserved its own separate namespace. Files that are automatically generated have been included in the gem5 namespace. The .isa files currently are limited to a single namespace. This limitation should be later removed to make it easier to accomodate a better API. Regarding the files in util, gem5:: was prepended where suitable. Notice that this patch was tested as much as possible given that most of these were already not previously compiling. Change-Id: Ia53d404ec79c46edaa98f654e23bc3b0e179fe2d Signed-off-by: Daniel R. Carvalho <odanrc@yahoo.com.br> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/46323 Maintainer: Bobby R. Bruce <bbruce@ucdavis.edu> Reviewed-by: Bobby R. Bruce <bbruce@ucdavis.edu> Reviewed-by: Matthew Poremba <matthew.poremba@amd.com> Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
committed by
Daniel Carvalho
parent
d4904b3b89
commit
974a47dfb9
@@ -293,10 +293,15 @@ if __name__ == '__main__':
|
||||
print("#include <string>")
|
||||
print("#include <set>")
|
||||
print()
|
||||
print("namespace gem5")
|
||||
print("{")
|
||||
print()
|
||||
print("std::set<std::string> version_tags = {")
|
||||
for tag in Upgrader.tag_set:
|
||||
print(" \"{}\",".format(tag))
|
||||
print("};")
|
||||
print()
|
||||
print("} // namespace gem5")
|
||||
exit(0)
|
||||
elif not args.checkpoint:
|
||||
parser.error("You must specify a checkpoint file to modify or a "
|
||||
|
||||
@@ -72,6 +72,8 @@
|
||||
#include "sim/system.hh"
|
||||
#include "stats.hh"
|
||||
|
||||
using namespace gem5;
|
||||
|
||||
void
|
||||
usage(const std::string &prog_name)
|
||||
{
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
*
|
||||
* C++-only configuration stats handling example
|
||||
*
|
||||
* Register with: statistics::registerHandlers(statsReset, statsDump)
|
||||
* Register with: gem5::statistics::registerHandlers(statsReset, statsDump)
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
@@ -54,7 +54,7 @@ namespace CxxConfig
|
||||
|
||||
void statsPrepare()
|
||||
{
|
||||
std::list<statistics::Info *> stats = statistics::statsList();
|
||||
std::list<gem5::statistics::Info *> stats = gem5::statistics::statsList();
|
||||
|
||||
/* gather_stats -> prepare */
|
||||
for (auto i = stats.begin(); i != stats.end(); ++i)
|
||||
@@ -65,26 +65,26 @@ void statsDump()
|
||||
{
|
||||
std::cerr << "Stats dump\n";
|
||||
|
||||
statistics::processDumpQueue();
|
||||
gem5::statistics::processDumpQueue();
|
||||
|
||||
std::list<statistics::Info *> stats = statistics::statsList();
|
||||
std::list<gem5::statistics::Info *> stats = gem5::statistics::statsList();
|
||||
|
||||
statsPrepare();
|
||||
|
||||
/* gather_stats -> convert_value */
|
||||
for (auto i = stats.begin(); i != stats.end(); ++i) {
|
||||
statistics::Info *stat = *i;
|
||||
gem5::statistics::Info *stat = *i;
|
||||
|
||||
statistics::ScalarInfo *scalar =
|
||||
dynamic_cast<statistics::ScalarInfo *>(stat);
|
||||
statistics::VectorInfo *vector =
|
||||
dynamic_cast<statistics::VectorInfo *>(stat);
|
||||
gem5::statistics::ScalarInfo *scalar =
|
||||
dynamic_cast<gem5::statistics::ScalarInfo *>(stat);
|
||||
gem5::statistics::VectorInfo *vector =
|
||||
dynamic_cast<gem5::statistics::VectorInfo *>(stat);
|
||||
|
||||
if (scalar) {
|
||||
std::cerr << "SCALAR " << stat->name << ' '
|
||||
<< scalar->value() << '\n';
|
||||
} else if (vector) {
|
||||
statistics::VResult results = vector->value();
|
||||
gem5::statistics::VResult results = vector->value();
|
||||
|
||||
unsigned int index = 0;
|
||||
for (auto e = results.begin(); e != results.end(); ++e) {
|
||||
@@ -104,12 +104,12 @@ void statsReset()
|
||||
{
|
||||
std::cerr << "Stats reset\n";
|
||||
|
||||
statistics::processResetQueue();
|
||||
gem5::statistics::processResetQueue();
|
||||
}
|
||||
|
||||
void statsEnable()
|
||||
{
|
||||
std::list<statistics::Info *> stats = statistics::statsList();
|
||||
std::list<gem5::statistics::Info *> stats = gem5::statistics::statsList();
|
||||
|
||||
for (auto i = stats.begin(); i != stats.end(); ++i)
|
||||
(*i)->enable();
|
||||
|
||||
@@ -71,6 +71,8 @@
|
||||
#include "sim/system.hh"
|
||||
#include "stats.hh"
|
||||
|
||||
using namespace gem5;
|
||||
|
||||
// Defining global string variable decalred in stats.hh
|
||||
std::string filename;
|
||||
|
||||
|
||||
@@ -59,8 +59,8 @@ class Gem5TopLevelModule : public Gem5SystemC::Module
|
||||
friend class Gem5Control;
|
||||
|
||||
protected:
|
||||
CxxConfigFileBase *config_file;
|
||||
CxxConfigManager *root_manager;
|
||||
gem5::CxxConfigFileBase *config_file;
|
||||
gem5::CxxConfigManager *root_manager;
|
||||
Gem5SystemC::Logger logger;
|
||||
|
||||
/** Things to do at end_of_elaborate */
|
||||
@@ -87,13 +87,13 @@ class Gem5TopLevelModule : public Gem5SystemC::Module
|
||||
void end_of_elaboration();
|
||||
};
|
||||
|
||||
Gem5System::Gem5System(CxxConfigManager *manager_,
|
||||
Gem5System::Gem5System(gem5::CxxConfigManager *manager_,
|
||||
const std::string &system_name, const std::string &instance_name) :
|
||||
manager(manager_),
|
||||
systemName(system_name),
|
||||
instanceName(instance_name)
|
||||
{
|
||||
manager->addRenaming(CxxConfigManager::Renaming(
|
||||
manager->addRenaming(gem5::CxxConfigManager::Renaming(
|
||||
system_name, instance_name));
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ Gem5System::instantiate()
|
||||
{
|
||||
try {
|
||||
/* Make a new System */
|
||||
SimObject *obj = manager->findObject(systemName, true);
|
||||
gem5::SimObject *obj = manager->findObject(systemName, true);
|
||||
|
||||
/* Add the System's objects to the list of managed
|
||||
* objects for initialisation */
|
||||
@@ -142,7 +142,7 @@ Gem5System::instantiate()
|
||||
manager->instantiate(false);
|
||||
manager->initState();
|
||||
manager->startup();
|
||||
} catch (CxxConfigManager::Exception &e) {
|
||||
} catch (gem5::CxxConfigManager::Exception &e) {
|
||||
fatal("Config problem in Gem5System: %s: %s",
|
||||
e.name, e.message);
|
||||
}
|
||||
@@ -165,19 +165,19 @@ Gem5Control::registerEndOfElaboration(void (*func)())
|
||||
void
|
||||
Gem5Control::setDebugFlag(const char *flag)
|
||||
{
|
||||
::setDebugFlag(flag);
|
||||
::gem5::setDebugFlag(flag);
|
||||
}
|
||||
|
||||
void
|
||||
Gem5Control::clearDebugFlag(const char *flag)
|
||||
{
|
||||
::clearDebugFlag(flag);
|
||||
::gem5::clearDebugFlag(flag);
|
||||
}
|
||||
|
||||
void
|
||||
Gem5Control::setRemoteGDBPort(unsigned int port)
|
||||
{
|
||||
::setRemoteGDBPort(port);
|
||||
::gem5::setRemoteGDBPort(port);
|
||||
}
|
||||
|
||||
Gem5System *
|
||||
@@ -185,7 +185,7 @@ Gem5Control::makeSystem(const std::string &system_name,
|
||||
const std::string &instance_name)
|
||||
{
|
||||
Gem5System *ret = new Gem5System(
|
||||
new CxxConfigManager(*(module->config_file)),
|
||||
new gem5::CxxConfigManager(*(module->config_file)),
|
||||
system_name, instance_name);
|
||||
|
||||
return ret;
|
||||
@@ -214,10 +214,10 @@ Gem5TopLevelModule::Gem5TopLevelModule(sc_core::sc_module_name name,
|
||||
{
|
||||
SC_THREAD(run);
|
||||
|
||||
cxxConfigInit();
|
||||
gem5::cxxConfigInit();
|
||||
|
||||
/* Pass DPRINTF messages to SystemC */
|
||||
Trace::setDebugLogger(&logger);
|
||||
gem5::Trace::setDebugLogger(&logger);
|
||||
|
||||
/* @todo need this as an option */
|
||||
Gem5SystemC::setTickFrequency();
|
||||
@@ -233,13 +233,14 @@ Gem5TopLevelModule::Gem5TopLevelModule(sc_core::sc_module_name name,
|
||||
}
|
||||
|
||||
/* Enable keyboard interrupt, async I/O etc. */
|
||||
initSignals();
|
||||
gem5::initSignals();
|
||||
|
||||
/* Enable stats */
|
||||
statistics::initSimStats();
|
||||
statistics::registerHandlers(CxxConfig::statsReset, CxxConfig::statsDump);
|
||||
gem5::statistics::initSimStats();
|
||||
gem5::statistics::registerHandlers(gem5::CxxConfig::statsReset,
|
||||
gem5::CxxConfig::statsDump);
|
||||
|
||||
Trace::enable();
|
||||
gem5::Trace::enable();
|
||||
|
||||
config_file = new CxxIniFile();
|
||||
|
||||
@@ -248,13 +249,13 @@ Gem5TopLevelModule::Gem5TopLevelModule(sc_core::sc_module_name name,
|
||||
config_filename);
|
||||
}
|
||||
|
||||
root_manager = new CxxConfigManager(*config_file);
|
||||
root_manager = new gem5::CxxConfigManager(*config_file);
|
||||
|
||||
CxxConfig::statsEnable();
|
||||
gem5::CxxConfig::statsEnable();
|
||||
|
||||
/* Make the root object */
|
||||
try {
|
||||
SimObject *root = root_manager->findObject("root", false);
|
||||
gem5::SimObject *root = root_manager->findObject("root", false);
|
||||
|
||||
/* Make sure we don't traverse into root's children */
|
||||
root_manager->objectsInOrder.push_back(root);
|
||||
@@ -262,7 +263,7 @@ Gem5TopLevelModule::Gem5TopLevelModule(sc_core::sc_module_name name,
|
||||
root_manager->instantiate(false);
|
||||
root_manager->initState();
|
||||
root_manager->startup();
|
||||
} catch (CxxConfigManager::Exception &e) {
|
||||
} catch (gem5::CxxConfigManager::Exception &e) {
|
||||
fatal("Config problem in Gem5TopLevelModule: %s: %s",
|
||||
e.name, e.message);
|
||||
}
|
||||
@@ -277,11 +278,11 @@ Gem5TopLevelModule::~Gem5TopLevelModule()
|
||||
void
|
||||
Gem5TopLevelModule::run()
|
||||
{
|
||||
GlobalSimLoopExitEvent *exit_event = NULL;
|
||||
gem5::GlobalSimLoopExitEvent *exit_event = NULL;
|
||||
|
||||
exit_event = simulate();
|
||||
|
||||
std::cerr << "Exit at tick " << curTick()
|
||||
std::cerr << "Exit at tick " << gem5::curTick()
|
||||
<< ", cause: " << exit_event->getCause() << '\n';
|
||||
|
||||
getEventQueue(0)->dump();
|
||||
@@ -304,4 +305,3 @@ makeGem5Control(const std::string &config_filename)
|
||||
{
|
||||
return new Gem5SystemC::Gem5Control(config_filename);
|
||||
}
|
||||
|
||||
|
||||
@@ -55,7 +55,10 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace gem5
|
||||
{
|
||||
class CxxConfigManager;
|
||||
} // namespace gem5
|
||||
|
||||
namespace Gem5SystemC
|
||||
{
|
||||
@@ -63,7 +66,7 @@ namespace Gem5SystemC
|
||||
class Gem5TopLevelModule;
|
||||
class Gem5Control;
|
||||
|
||||
/** Gem5System's wrap CxxConfigManager's instantiating a gem5 System
|
||||
/** Gem5System's wrap gem5::CxxConfigManager's instantiating a gem5 System
|
||||
* object (and its children). New Gem5Systems are created by
|
||||
* Gem5Control::makeSystem. A new system can have its parameters
|
||||
* tweaked using setParam{,Vector} before being instantiated using
|
||||
@@ -85,7 +88,7 @@ class Gem5System
|
||||
private:
|
||||
/** Config management for *just* this system's objects (notably
|
||||
* excluding root */
|
||||
CxxConfigManager *manager;
|
||||
gem5::CxxConfigManager *manager;
|
||||
|
||||
/** The config file prototype for the system */
|
||||
std::string systemName;
|
||||
@@ -95,7 +98,7 @@ class Gem5System
|
||||
|
||||
public:
|
||||
/** A constructor only used by Gem5Control */
|
||||
Gem5System(CxxConfigManager *manager_,
|
||||
Gem5System(gem5::CxxConfigManager *manager_,
|
||||
const std::string &system_name, const std::string &instance_name);
|
||||
|
||||
virtual ~Gem5System();
|
||||
@@ -110,7 +113,7 @@ class Gem5System
|
||||
|
||||
/** Build the system's gem5 infrastructure, bind its ports (note
|
||||
* that all ports *must* be internal to the system), init and
|
||||
* SimObject::startup the system */
|
||||
* gem5::SimObject::startup the system */
|
||||
virtual void instantiate();
|
||||
};
|
||||
|
||||
|
||||
@@ -60,9 +60,9 @@ class CuttingStreambuf : public std::streambuf
|
||||
std::ostringstream line;
|
||||
|
||||
/** Logger to send complete lines to */
|
||||
Trace::Logger *logger;
|
||||
gem5::Trace::Logger *logger;
|
||||
|
||||
CuttingStreambuf(Trace::Logger *logger_) : logger(logger_)
|
||||
CuttingStreambuf(gem5::Trace::Logger *logger_) : logger(logger_)
|
||||
{ }
|
||||
|
||||
/** Accumulate to line up to \n and then emit */
|
||||
@@ -130,7 +130,7 @@ Logger::~Logger()
|
||||
|
||||
/** Log a single message as a single sc_report call */
|
||||
void
|
||||
Logger::logMessage(Tick when, const std::string &name,
|
||||
Logger::logMessage(gem5::Tick when, const std::string &name,
|
||||
const std::string &flag, const std::string &message)
|
||||
{
|
||||
/* Need to chop the newline off the message */
|
||||
@@ -147,4 +147,4 @@ Logger::getOstream()
|
||||
return stream;
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace Gem5SystemC
|
||||
|
||||
@@ -53,7 +53,7 @@ namespace Gem5SystemC
|
||||
{
|
||||
|
||||
/** sc_report logging class */
|
||||
class Logger : public Trace::Logger
|
||||
class Logger : public gem5::Trace::Logger
|
||||
{
|
||||
protected:
|
||||
/** Stream to offer getOstream. This will cut messages up newlines and
|
||||
@@ -67,7 +67,7 @@ class Logger : public Trace::Logger
|
||||
~Logger();
|
||||
|
||||
/** Log a single message as a single sc_report call */
|
||||
void logMessage(Tick when, const std::string &name,
|
||||
void logMessage(gem5::Tick when, const std::string &name,
|
||||
const std::string &flag, const std::string &message) override;
|
||||
|
||||
std::ostream &getOstream();
|
||||
|
||||
@@ -51,6 +51,9 @@
|
||||
* most one Gem5Module instantiated in any simulation.
|
||||
*/
|
||||
|
||||
#include <cassert>
|
||||
|
||||
#include "base/compiler.hh"
|
||||
#include "base/logging.hh"
|
||||
#include "base/pollevent.hh"
|
||||
#include "base/trace.hh"
|
||||
@@ -70,8 +73,8 @@ namespace Gem5SystemC
|
||||
void
|
||||
setTickFrequency()
|
||||
{
|
||||
::setClockFrequency(1000000000000);
|
||||
::fixClockFrequency();
|
||||
::gem5::setClockFrequency(1000000000000);
|
||||
::gem5::fixClockFrequency();
|
||||
}
|
||||
|
||||
Module::Module(sc_core::sc_module_name name) : sc_core::sc_channel(name),
|
||||
@@ -87,7 +90,7 @@ Module::Module(sc_core::sc_module_name name) : sc_core::sc_channel(name),
|
||||
}
|
||||
|
||||
void
|
||||
Module::SCEventQueue::wakeup(Tick when)
|
||||
Module::SCEventQueue::wakeup(gem5::Tick when)
|
||||
{
|
||||
DPRINTF(Event, "waking up SCEventQueue\n");
|
||||
/* Don't bother to use 'when' for now */
|
||||
@@ -101,17 +104,17 @@ Module::setupEventQueues(Module &module)
|
||||
"Gem5SystemC::Module::setupEventQueues must be called"
|
||||
" before any gem5 event queues are set up");
|
||||
|
||||
numMainEventQueues = 1;
|
||||
mainEventQueue.push_back(new SCEventQueue("events", module));
|
||||
curEventQueue(getEventQueue(0));
|
||||
gem5::numMainEventQueues = 1;
|
||||
gem5::mainEventQueue.push_back(new SCEventQueue("events", module));
|
||||
gem5::curEventQueue(getEventQueue(0));
|
||||
}
|
||||
|
||||
void
|
||||
Module::catchup()
|
||||
{
|
||||
EventQueue *eventq = getEventQueue(0);
|
||||
Tick systemc_time = sc_core::sc_time_stamp().value();
|
||||
Tick gem5_time = curTick();
|
||||
gem5::EventQueue *eventq = getEventQueue(0);
|
||||
gem5::Tick systemc_time = sc_core::sc_time_stamp().value();
|
||||
gem5::Tick gem5_time = gem5::curTick();
|
||||
|
||||
/* gem5 time *must* lag SystemC as SystemC is the master */
|
||||
fatal_if(gem5_time > systemc_time, "gem5 time must lag SystemC time"
|
||||
@@ -120,7 +123,7 @@ Module::catchup()
|
||||
eventq->setCurTick(systemc_time);
|
||||
|
||||
if (!eventq->empty()) {
|
||||
Tick next_event_time M5_VAR_USED = eventq->nextTick();
|
||||
gem5::Tick next_event_time M5_VAR_USED = eventq->nextTick();
|
||||
|
||||
fatal_if(gem5_time > next_event_time,
|
||||
"Missed an event at time %d gem5: %d, SystemC: %d",
|
||||
@@ -137,14 +140,14 @@ Module::notify(sc_core::sc_time time_from_now)
|
||||
void
|
||||
Module::serviceAsyncEvent()
|
||||
{
|
||||
EventQueue *eventq = getEventQueue(0);
|
||||
std::lock_guard<EventQueue> lock(*eventq);
|
||||
gem5::EventQueue *eventq = gem5::getEventQueue(0);
|
||||
std::lock_guard<gem5::EventQueue> lock(*eventq);
|
||||
|
||||
assert(async_event);
|
||||
|
||||
/* Catch up gem5 time with SystemC time so that any event here won't
|
||||
* be in the past relative to the current time */
|
||||
Tick systemc_time = sc_core::sc_time_stamp().value();
|
||||
gem5::Tick systemc_time = sc_core::sc_time_stamp().value();
|
||||
|
||||
/* Move time on to match SystemC */
|
||||
catchup();
|
||||
@@ -158,7 +161,7 @@ Module::serviceAsyncEvent()
|
||||
|
||||
if (async_exit) {
|
||||
async_exit = false;
|
||||
exitSimLoop("user interrupt received");
|
||||
gem5::exitSimLoop("user interrupt received");
|
||||
}
|
||||
|
||||
if (async_io) {
|
||||
@@ -173,7 +176,7 @@ Module::serviceAsyncEvent()
|
||||
void
|
||||
Module::serviceExternalEvent()
|
||||
{
|
||||
EventQueue *eventq = getEventQueue(0);
|
||||
gem5::EventQueue *eventq = getEventQueue(0);
|
||||
|
||||
if (!in_simulate && !async_event)
|
||||
warn("Gem5SystemC external event received while not in simulate");
|
||||
@@ -188,7 +191,7 @@ Module::serviceExternalEvent()
|
||||
void
|
||||
Module::eventLoop()
|
||||
{
|
||||
EventQueue *eventq = getEventQueue(0);
|
||||
gem5::EventQueue *eventq = getEventQueue(0);
|
||||
|
||||
fatal_if(!in_simulate, "Gem5SystemC event loop entered while"
|
||||
" outside Gem5SystemC::Module::simulate");
|
||||
@@ -197,12 +200,12 @@ Module::eventLoop()
|
||||
serviceAsyncEvent();
|
||||
|
||||
while (!eventq->empty()) {
|
||||
Tick next_event_time = eventq->nextTick();
|
||||
gem5::Tick next_event_time = eventq->nextTick();
|
||||
|
||||
/* Move time on to match SystemC */
|
||||
catchup();
|
||||
|
||||
Tick gem5_time = curTick();
|
||||
gem5::Tick gem5_time = gem5::curTick();
|
||||
|
||||
/* Woken up early */
|
||||
if (wait_exit_time > sc_core::sc_time_stamp().value()) {
|
||||
@@ -211,7 +214,7 @@ Module::eventLoop()
|
||||
}
|
||||
|
||||
if (gem5_time < next_event_time) {
|
||||
Tick wait_period = next_event_time - gem5_time;
|
||||
gem5::Tick wait_period = next_event_time - gem5_time;
|
||||
wait_exit_time = gem5_time + wait_period;
|
||||
|
||||
DPRINTF(Event, "Waiting for %d ticks for next gem5 event\n",
|
||||
@@ -224,7 +227,7 @@ Module::eventLoop()
|
||||
|
||||
return;
|
||||
} else if (gem5_time > next_event_time) {
|
||||
Tick systemc_time = sc_core::sc_time_stamp().value();
|
||||
gem5::Tick systemc_time = sc_core::sc_time_stamp().value();
|
||||
|
||||
/* Missed event, for some reason the above test didn't work
|
||||
* or an event was scheduled in the past */
|
||||
@@ -247,14 +250,15 @@ Module::eventLoop()
|
||||
GlobalSimLoopExitEvent *
|
||||
Module::simulate(Tick num_cycles)
|
||||
{
|
||||
inform("Entering event queue @ %d. Starting simulation...", curTick());
|
||||
inform("Entering event queue @ %d. Starting simulation...",
|
||||
gem5::curTick());
|
||||
|
||||
if (num_cycles < MaxTick - curTick())
|
||||
num_cycles = curTick() + num_cycles;
|
||||
if (num_cycles < gem5::MaxTick - gem5::curTick())
|
||||
num_cycles = gem5::curTick() + num_cycles;
|
||||
else /* counter would roll over or be set to MaxTick anyhow */
|
||||
num_cycles = MaxTick;
|
||||
num_cycles = gem5::MaxTick;
|
||||
|
||||
GlobalEvent *limit_event = new GlobalSimLoopExitEvent(num_cycles,
|
||||
gem5::GlobalEvent *limit_event = new GlobalSimLoopExitEvent(num_cycles,
|
||||
"simulate() limit reached", 0, 0);
|
||||
|
||||
exitEvent = NULL;
|
||||
@@ -277,10 +281,10 @@ Module::simulate(Tick num_cycles)
|
||||
in_simulate = false;
|
||||
|
||||
/* Locate the global exit event */
|
||||
BaseGlobalEvent *global_event = exitEvent->globalEvent();
|
||||
gem5::BaseGlobalEvent *global_event = exitEvent->globalEvent();
|
||||
assert(global_event != NULL);
|
||||
|
||||
GlobalSimLoopExitEvent *global_exit_event =
|
||||
gem5::GlobalSimLoopExitEvent *global_exit_event =
|
||||
dynamic_cast<GlobalSimLoopExitEvent *>(global_event);
|
||||
assert(global_exit_event != NULL);
|
||||
|
||||
@@ -292,4 +296,4 @@ Module::simulate(Tick num_cycles)
|
||||
return global_exit_event;
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace Gem5SystemC
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
|
||||
#include <systemc>
|
||||
|
||||
#include "base/types.hh"
|
||||
#include "sim/eventq.hh"
|
||||
#include "sim/sim_events.hh"
|
||||
|
||||
@@ -93,7 +94,7 @@ class Module : public sc_core::sc_channel
|
||||
sc_core::sc_event eventLoopEnterEvent;
|
||||
|
||||
/** Expected exit time of last eventLoop sleep */
|
||||
Tick wait_exit_time;
|
||||
gem5::Tick wait_exit_time;
|
||||
|
||||
/** Are we in Module::simulate? Used to mask events when not inside
|
||||
* the simulate loop */
|
||||
@@ -101,18 +102,18 @@ class Module : public sc_core::sc_channel
|
||||
|
||||
/** Placeholder base class for a variant event queue if this becomes
|
||||
* useful */
|
||||
class SCEventQueue : public EventQueue
|
||||
class SCEventQueue : public gem5::EventQueue
|
||||
{
|
||||
protected:
|
||||
Module &module;
|
||||
|
||||
public:
|
||||
SCEventQueue(const std::string &name,
|
||||
Module &module_) : EventQueue(name), module(module_)
|
||||
Module &module_) : gem5::EventQueue(name), module(module_)
|
||||
{ }
|
||||
|
||||
/** Signal module to wakeup */
|
||||
void wakeup(Tick when);
|
||||
void wakeup(gem5::Tick when);
|
||||
};
|
||||
|
||||
/** Service any async event marked up in the globals event_... */
|
||||
@@ -125,7 +126,7 @@ class Module : public sc_core::sc_channel
|
||||
Module(sc_core::sc_module_name name);
|
||||
|
||||
/** Last exitEvent from eventLoop */
|
||||
Event *exitEvent;
|
||||
gem5::Event *exitEvent;
|
||||
|
||||
/** Setup global event queues. Call this before any other event queues
|
||||
* are created */
|
||||
@@ -148,13 +149,14 @@ class Module : public sc_core::sc_channel
|
||||
void eventLoop();
|
||||
|
||||
/** Run eventLoop up to num_cycles and return the final event */
|
||||
GlobalSimLoopExitEvent *simulate(Tick num_cycles = MaxTick);
|
||||
gem5::GlobalSimLoopExitEvent *
|
||||
simulate(gem5::Tick num_cycles = gem5::MaxTick);
|
||||
};
|
||||
|
||||
/** There are assumptions throughout Gem5SystemC file that a tick is 1ps.
|
||||
* Make this the case */
|
||||
void setTickFrequency();
|
||||
|
||||
}
|
||||
} // namespace Gem5SystemC
|
||||
|
||||
#endif // __SIM_SC_MODULE_HH__
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
*
|
||||
* C++-only configuration stats handling example
|
||||
*
|
||||
* Register with: statistics::registerHandlers(statsReset, statsDump)
|
||||
* Register with: gem5::statistics::registerHandlers(statsReset, statsDump)
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
@@ -57,15 +57,15 @@ namespace CxxConfig
|
||||
|
||||
void statsPrepare()
|
||||
{
|
||||
std::list<statistics::Info *> stats = statistics::statsList();
|
||||
std::list<gem5::statistics::Info *> stats = gem5::statistics::statsList();
|
||||
|
||||
/* gather_stats -> prepare */
|
||||
for (auto i = stats.begin(); i != stats.end(); ++i){
|
||||
statistics::Info *stat = *i;
|
||||
statistics::VectorInfo *vector =
|
||||
dynamic_cast<statistics::VectorInfo *>(stat);
|
||||
gem5::statistics::Info *stat = *i;
|
||||
gem5::statistics::VectorInfo *vector =
|
||||
dynamic_cast<gem5::statistics::VectorInfo *>(stat);
|
||||
if (vector){
|
||||
(dynamic_cast<statistics::VectorInfo *>(*i))->prepare();
|
||||
(dynamic_cast<gem5::statistics::VectorInfo *>(*i))->prepare();
|
||||
}
|
||||
else {
|
||||
(*i)->prepare();
|
||||
@@ -77,11 +77,12 @@ void statsPrepare()
|
||||
void statsDump()
|
||||
{
|
||||
bool desc = true;
|
||||
statistics::Output *output = statistics::initText(filename, desc, true);
|
||||
gem5::statistics::Output *output =
|
||||
gem5::statistics::initText(filename, desc, true);
|
||||
|
||||
statistics::processDumpQueue();
|
||||
gem5::statistics::processDumpQueue();
|
||||
|
||||
std::list<statistics::Info *> stats = statistics::statsList();
|
||||
std::list<gem5::statistics::Info *> stats = gem5::statistics::statsList();
|
||||
|
||||
statsEnable();
|
||||
statsPrepare();
|
||||
@@ -89,32 +90,33 @@ void statsDump()
|
||||
output->begin();
|
||||
/* gather_stats -> convert_value */
|
||||
for (auto i = stats.begin(); i != stats.end(); ++i) {
|
||||
statistics::Info *stat = *i;
|
||||
gem5::statistics::Info *stat = *i;
|
||||
|
||||
const statistics::ScalarInfo *scalar =
|
||||
dynamic_cast<statistics::ScalarInfo *>(stat);
|
||||
statistics::VectorInfo *vector =
|
||||
dynamic_cast<statistics::VectorInfo *>(stat);
|
||||
const statistics::Vector2dInfo *vector2d =
|
||||
dynamic_cast<statistics::Vector2dInfo *>(vector);
|
||||
const statistics::DistInfo *dist =
|
||||
dynamic_cast<statistics::DistInfo *>(stat);
|
||||
const statistics::VectorDistInfo *vectordist =
|
||||
dynamic_cast<statistics::VectorDistInfo *>(stat);
|
||||
const statistics::SparseHistInfo *sparse =
|
||||
dynamic_cast<statistics::SparseHistInfo *>(stat);
|
||||
const statistics::InfoProxy <statistics::Vector2d,
|
||||
statistics::Vector2dInfo> *info =
|
||||
dynamic_cast<statistics::InfoProxy
|
||||
<statistics::Vector2d,statistics::Vector2dInfo>*>(stat);
|
||||
const gem5::statistics::ScalarInfo *scalar =
|
||||
dynamic_cast<gem5::statistics::ScalarInfo *>(stat);
|
||||
gem5::statistics::VectorInfo *vector =
|
||||
dynamic_cast<gem5::statistics::VectorInfo *>(stat);
|
||||
const gem5::statistics::Vector2dInfo *vector2d =
|
||||
dynamic_cast<gem5::statistics::Vector2dInfo *>(vector);
|
||||
const gem5::statistics::DistInfo *dist =
|
||||
dynamic_cast<gem5::statistics::DistInfo *>(stat);
|
||||
const gem5::statistics::VectorDistInfo *vectordist =
|
||||
dynamic_cast<gem5::statistics::VectorDistInfo *>(stat);
|
||||
const gem5::statistics::SparseHistInfo *sparse =
|
||||
dynamic_cast<gem5::statistics::SparseHistInfo *>(stat);
|
||||
const gem5::statistics::InfoProxy <gem5::statistics::Vector2d,
|
||||
gem5::statistics::Vector2dInfo> *info =
|
||||
dynamic_cast<gem5::statistics::InfoProxy
|
||||
<gem5::statistics::Vector2d,
|
||||
gem5::statistics::Vector2dInfo>*>(stat);
|
||||
|
||||
if (vector) {
|
||||
const statistics::FormulaInfo *formula =
|
||||
dynamic_cast<statistics::FormulaInfo *>(vector);
|
||||
const gem5::statistics::FormulaInfo *formula =
|
||||
dynamic_cast<gem5::statistics::FormulaInfo *>(vector);
|
||||
if (formula){
|
||||
output->visit(*formula);
|
||||
} else {
|
||||
const statistics::VectorInfo *vector1 = vector;
|
||||
const gem5::statistics::VectorInfo *vector1 = vector;
|
||||
output->visit(*vector1);
|
||||
}
|
||||
} else if (vector2d) {
|
||||
@@ -140,19 +142,19 @@ void statsReset()
|
||||
{
|
||||
std::cerr << "Stats reset\n";
|
||||
|
||||
statistics::processResetQueue();
|
||||
gem5::statistics::processResetQueue();
|
||||
}
|
||||
|
||||
void statsEnable()
|
||||
{
|
||||
std::list<statistics::Info *> stats = statistics::statsList();
|
||||
std::list<gem5::statistics::Info *> stats = gem5::statistics::statsList();
|
||||
|
||||
for (auto i = stats.begin(); i != stats.end(); ++i){
|
||||
statistics::Info *stat = *i;
|
||||
statistics::VectorInfo *vector =
|
||||
dynamic_cast<statistics::VectorInfo *>(stat);
|
||||
gem5::statistics::Info *stat = *i;
|
||||
gem5::statistics::VectorInfo *vector =
|
||||
dynamic_cast<gem5::statistics::VectorInfo *>(stat);
|
||||
if (vector){
|
||||
(dynamic_cast<statistics::VectorInfo *>(*i))->enable();
|
||||
(dynamic_cast<gem5::statistics::VectorInfo *>(*i))->enable();
|
||||
}
|
||||
else {
|
||||
(*i)->enable();
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
|
||||
#include "systemc/ext/systemc"
|
||||
|
||||
using namespace gem5;
|
||||
|
||||
class Printer : public sc_core::sc_module
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -29,8 +29,8 @@
|
||||
#include "sim/sim_exit.hh"
|
||||
#include "systemc_simple_object/feeder.hh"
|
||||
|
||||
Feeder::Feeder(const Gem5_FeederParams ¶ms) :
|
||||
SimObject(params), printer(params.printer), delay(params.delay),
|
||||
Feeder::Feeder(const gem5::Gem5_FeederParams ¶ms) :
|
||||
gem5::SimObject(params), printer(params.printer), delay(params.delay),
|
||||
strings(params.strings), index(0), event(this)
|
||||
{
|
||||
// Bind the printer objects "input" port to our sc_buffer. This will let
|
||||
@@ -46,16 +46,16 @@ Feeder::Feeder(const Gem5_FeederParams ¶ms) :
|
||||
void
|
||||
Feeder::startup()
|
||||
{
|
||||
schedule(&event, curTick() + delay);
|
||||
schedule(&event, gem5::curTick() + delay);
|
||||
}
|
||||
|
||||
void
|
||||
Feeder::feed()
|
||||
{
|
||||
if (index >= strings.size())
|
||||
exitSimLoop("Printed all the words.");
|
||||
gem5::exitSimLoop("Printed all the words.");
|
||||
else
|
||||
buf.write(strings[index++].c_str());
|
||||
|
||||
schedule(&event, curTick() + delay);
|
||||
schedule(&event, gem5::curTick() + delay);
|
||||
}
|
||||
|
||||
@@ -42,18 +42,21 @@
|
||||
#include "systemc/ext/channel/sc_buffer.hh"
|
||||
|
||||
// This implementation (mostly) just uses standard gem5 mechanisms.
|
||||
namespace gem5
|
||||
{
|
||||
class Gem5_FeederParams;
|
||||
} // namespace gem5
|
||||
|
||||
class Feeder : public SimObject
|
||||
class Feeder : public gem5::SimObject
|
||||
{
|
||||
public:
|
||||
Feeder(const Gem5_FeederParams ¶ms);
|
||||
Feeder(const gem5::Gem5_FeederParams ¶ms);
|
||||
|
||||
void feed();
|
||||
|
||||
private:
|
||||
Printer *printer;
|
||||
Tick delay;
|
||||
gem5::Tick delay;
|
||||
std::vector<std::string> strings;
|
||||
int index;
|
||||
|
||||
@@ -61,7 +64,7 @@ class Feeder : public SimObject
|
||||
// except to help interact with systemc objects/models.
|
||||
sc_core::sc_buffer<const char *> buf;
|
||||
|
||||
EventWrapper<Feeder, &Feeder::feed> event;
|
||||
gem5::EventWrapper<Feeder, &Feeder::feed> event;
|
||||
|
||||
void startup() override;
|
||||
};
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
// systemc object could accept those parameters however it likes, for instance
|
||||
// through its constructor or by assigning them to a member variable.
|
||||
Printer *
|
||||
SystemC_PrinterParams::create() const
|
||||
gem5::SystemC_PrinterParams::create() const
|
||||
{
|
||||
Printer *printer = new Printer(name.c_str());
|
||||
printer->prefix = prefix;
|
||||
|
||||
@@ -71,7 +71,7 @@ class Printer : public sc_core::sc_module
|
||||
}
|
||||
}
|
||||
|
||||
statistics::Scalar numWords;
|
||||
gem5::statistics::Scalar numWords;
|
||||
|
||||
// Gem5 statistics should be set up during the "end_of_elabortion"
|
||||
// callback.
|
||||
|
||||
@@ -105,7 +105,7 @@ CliParser::parse(int argc, char** argv)
|
||||
usage(prog_name);
|
||||
}
|
||||
}
|
||||
} catch (CxxConfigManager::Exception &e) {
|
||||
} catch (gem5::CxxConfigManager::Exception &e) {
|
||||
std::cerr << e.name << ": " << e.message << "\n";
|
||||
std::exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
@@ -33,8 +33,7 @@
|
||||
#include <iostream>
|
||||
#include <systemc>
|
||||
|
||||
#include <sim/core.hh>
|
||||
#include <sim/simulate.hh>
|
||||
#include <sim/cur_tick.hh>
|
||||
|
||||
#include "report_handler.hh"
|
||||
|
||||
@@ -44,7 +43,7 @@ void
|
||||
reportHandler(const sc_report &report, const sc_actions &actions)
|
||||
{
|
||||
uint64_t systemc_time = report.get_time().value();
|
||||
uint64_t gem5_time = curTick();
|
||||
uint64_t gem5_time = gem5::curTick();
|
||||
|
||||
if (actions & SC_DO_NOTHING)
|
||||
return;
|
||||
|
||||
@@ -45,7 +45,7 @@ TrafficGenerator::TrafficGenerator(sc_core::sc_module_name name)
|
||||
void
|
||||
TrafficGenerator::process()
|
||||
{
|
||||
auto rnd = Random(time(NULL));
|
||||
auto rnd = gem5::Random(time(NULL));
|
||||
|
||||
unsigned const memSize = (1 << 10); // 512 MB
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ using namespace tlm;
|
||||
namespace Gem5SystemC
|
||||
{
|
||||
|
||||
Gem5Extension::Gem5Extension(PacketPtr packet)
|
||||
Gem5Extension::Gem5Extension(gem5::PacketPtr packet)
|
||||
{
|
||||
Packet = packet;
|
||||
}
|
||||
@@ -56,7 +56,7 @@ Gem5Extension& Gem5Extension::getExtension(const tlm_generic_payload &payload)
|
||||
return Gem5Extension::getExtension(&payload);
|
||||
}
|
||||
|
||||
PacketPtr Gem5Extension::getPacket()
|
||||
gem5::PacketPtr Gem5Extension::getPacket()
|
||||
{
|
||||
return Packet;
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace Gem5SystemC
|
||||
class Gem5Extension: public tlm::tlm_extension<Gem5Extension>
|
||||
{
|
||||
public:
|
||||
Gem5Extension(PacketPtr packet);
|
||||
Gem5Extension(gem5::PacketPtr packet);
|
||||
|
||||
virtual tlm_extension_base* clone() const;
|
||||
virtual void copy_from(const tlm_extension_base& ext);
|
||||
@@ -56,10 +56,10 @@ class Gem5Extension: public tlm::tlm_extension<Gem5Extension>
|
||||
getExtension(const tlm::tlm_generic_payload *payload);
|
||||
static Gem5Extension&
|
||||
getExtension(const tlm::tlm_generic_payload &payload);
|
||||
PacketPtr getPacket();
|
||||
gem5::PacketPtr getPacket();
|
||||
|
||||
private:
|
||||
PacketPtr Packet;
|
||||
gem5::PacketPtr Packet;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -41,22 +41,22 @@
|
||||
namespace Gem5SystemC
|
||||
{
|
||||
|
||||
PacketPtr
|
||||
gem5::PacketPtr
|
||||
SCMasterPort::generatePacket(tlm::tlm_generic_payload& trans)
|
||||
{
|
||||
Request::Flags flags;
|
||||
auto req = std::make_shared<Request>(
|
||||
gem5::Request::Flags flags;
|
||||
auto req = std::make_shared<gem5::Request>(
|
||||
trans.get_address(), trans.get_data_length(), flags,
|
||||
owner.id);
|
||||
|
||||
MemCmd cmd;
|
||||
gem5::MemCmd cmd;
|
||||
|
||||
switch (trans.get_command()) {
|
||||
case tlm::TLM_READ_COMMAND:
|
||||
cmd = MemCmd::ReadReq;
|
||||
cmd = gem5::MemCmd::ReadReq;
|
||||
break;
|
||||
case tlm::TLM_WRITE_COMMAND:
|
||||
cmd = MemCmd::WriteReq;
|
||||
cmd = gem5::MemCmd::WriteReq;
|
||||
break;
|
||||
default:
|
||||
SC_REPORT_FATAL("SCMasterPort",
|
||||
@@ -67,23 +67,23 @@ SCMasterPort::generatePacket(tlm::tlm_generic_payload& trans)
|
||||
* Allocate a new Packet. The packet will be deleted when it returns from
|
||||
* the gem5 world as a response.
|
||||
*/
|
||||
auto pkt = new Packet(req, cmd);
|
||||
auto pkt = new gem5::Packet(req, cmd);
|
||||
pkt->dataStatic(trans.get_data_ptr());
|
||||
|
||||
return pkt;
|
||||
}
|
||||
|
||||
void
|
||||
SCMasterPort::destroyPacket(PacketPtr pkt)
|
||||
SCMasterPort::destroyPacket(gem5::PacketPtr pkt)
|
||||
{
|
||||
delete pkt;
|
||||
}
|
||||
|
||||
SCMasterPort::SCMasterPort(const std::string& name_,
|
||||
const std::string& systemc_name,
|
||||
ExternalMaster& owner_,
|
||||
gem5::ExternalMaster& owner_,
|
||||
Gem5SimControl& simControl)
|
||||
: ExternalMaster::ExternalPort(name_, owner_),
|
||||
: gem5::ExternalMaster::ExternalPort(name_, owner_),
|
||||
peq(this, &SCMasterPort::peq_cb),
|
||||
waitForRetry(false),
|
||||
pendingRequest(nullptr),
|
||||
@@ -93,7 +93,8 @@ SCMasterPort::SCMasterPort(const std::string& name_,
|
||||
transactor(nullptr),
|
||||
simControl(simControl)
|
||||
{
|
||||
system = dynamic_cast<const ExternalMasterParams&>(owner_.params()).system;
|
||||
system = dynamic_cast<const gem5::ExternalMasterParams&>(
|
||||
owner_.params()).system;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -169,7 +170,7 @@ SCMasterPort::peq_cb(tlm::tlm_generic_payload& trans,
|
||||
{
|
||||
// catch up with SystemC time
|
||||
simControl.catchup();
|
||||
assert(curTick() == sc_core::sc_time_stamp().value());
|
||||
assert(gem5::curTick() == sc_core::sc_time_stamp().value());
|
||||
|
||||
switch (phase) {
|
||||
case tlm::BEGIN_REQ:
|
||||
@@ -196,7 +197,7 @@ SCMasterPort::handleBeginReq(tlm::tlm_generic_payload& trans)
|
||||
|
||||
trans.acquire();
|
||||
|
||||
PacketPtr pkt = nullptr;
|
||||
gem5::PacketPtr pkt = nullptr;
|
||||
|
||||
Gem5Extension* extension = nullptr;
|
||||
trans.get_extension(extension);
|
||||
@@ -256,7 +257,7 @@ SCMasterPort::b_transport(tlm::tlm_generic_payload& trans,
|
||||
Gem5Extension* extension = nullptr;
|
||||
trans.get_extension(extension);
|
||||
|
||||
PacketPtr pkt = nullptr;
|
||||
gem5::PacketPtr pkt = nullptr;
|
||||
|
||||
// If there is an extension, this transaction was initiated by the gem5
|
||||
// world and we can pipe through the original packet.
|
||||
@@ -266,15 +267,15 @@ SCMasterPort::b_transport(tlm::tlm_generic_payload& trans,
|
||||
pkt = generatePacket(trans);
|
||||
}
|
||||
|
||||
Tick ticks = sendAtomic(pkt);
|
||||
gem5::Tick ticks = sendAtomic(pkt);
|
||||
|
||||
// send an atomic request to gem5
|
||||
panic_if(pkt->needsResponse() && !pkt->isResponse(),
|
||||
"Packet sending failed!\n");
|
||||
|
||||
// one tick is a pico second
|
||||
auto delay = sc_core::sc_time((double)(ticks / sim_clock::as_int::ps),
|
||||
sc_core::SC_PS);
|
||||
auto delay = sc_core::sc_time(
|
||||
(double)(ticks / gem5::sim_clock::as_int::ps), sc_core::SC_PS);
|
||||
|
||||
// update time
|
||||
t += delay;
|
||||
@@ -312,7 +313,7 @@ SCMasterPort::get_direct_mem_ptr(tlm::tlm_generic_payload& trans,
|
||||
}
|
||||
|
||||
bool
|
||||
SCMasterPort::recvTimingResp(PacketPtr pkt)
|
||||
SCMasterPort::recvTimingResp(gem5::PacketPtr pkt)
|
||||
{
|
||||
// exclusion rule
|
||||
// We need to Wait for END_RESP before sending next BEGIN_RESP
|
||||
@@ -404,9 +405,9 @@ SCMasterPort::recvRangeChange()
|
||||
"received address range change but ignored it");
|
||||
}
|
||||
|
||||
ExternalMaster::ExternalPort*
|
||||
gem5::ExternalMaster::ExternalPort*
|
||||
SCMasterPortHandler::getExternalPort(const std::string &name,
|
||||
ExternalMaster &owner,
|
||||
gem5::ExternalMaster &owner,
|
||||
const std::string &port_data)
|
||||
{
|
||||
// Create and register a new SystemC master port
|
||||
|
||||
@@ -71,10 +71,10 @@ class Gem5MasterTransactor;
|
||||
* It is assumed that the mode (atomic/timing) does not change during
|
||||
* execution.
|
||||
*/
|
||||
class SCMasterPort : public ExternalMaster::ExternalPort
|
||||
class SCMasterPort : public gem5::ExternalMaster::ExternalPort
|
||||
{
|
||||
private:
|
||||
struct TlmSenderState : public Packet::SenderState
|
||||
struct TlmSenderState : public gem5::Packet::SenderState
|
||||
{
|
||||
tlm::tlm_generic_payload& trans;
|
||||
TlmSenderState(tlm::tlm_generic_payload& trans)
|
||||
@@ -87,7 +87,7 @@ class SCMasterPort : public ExternalMaster::ExternalPort
|
||||
|
||||
bool waitForRetry;
|
||||
tlm::tlm_generic_payload* pendingRequest;
|
||||
PacketPtr pendingPacket;
|
||||
gem5::PacketPtr pendingPacket;
|
||||
|
||||
bool needToSendRetry;
|
||||
|
||||
@@ -95,7 +95,7 @@ class SCMasterPort : public ExternalMaster::ExternalPort
|
||||
|
||||
Gem5MasterTransactor* transactor;
|
||||
|
||||
System* system;
|
||||
gem5::System* system;
|
||||
|
||||
Gem5SimControl& simControl;
|
||||
|
||||
@@ -113,14 +113,14 @@ class SCMasterPort : public ExternalMaster::ExternalPort
|
||||
tlm::tlm_dmi& dmi_data);
|
||||
|
||||
// Gem5 SCMasterPort interface
|
||||
bool recvTimingResp(PacketPtr pkt);
|
||||
bool recvTimingResp(gem5::PacketPtr pkt);
|
||||
void recvReqRetry();
|
||||
void recvRangeChange();
|
||||
|
||||
public:
|
||||
SCMasterPort(const std::string& name_,
|
||||
const std::string& systemc_name,
|
||||
ExternalMaster& owner_,
|
||||
gem5::ExternalMaster& owner_,
|
||||
Gem5SimControl& simControl);
|
||||
|
||||
void bindToTransactor(Gem5MasterTransactor* transactor);
|
||||
@@ -135,13 +135,13 @@ class SCMasterPort : public ExternalMaster::ExternalPort
|
||||
void handleBeginReq(tlm::tlm_generic_payload& trans);
|
||||
void handleEndResp(tlm::tlm_generic_payload& trans);
|
||||
|
||||
PacketPtr generatePacket(tlm::tlm_generic_payload& trans);
|
||||
void destroyPacket(PacketPtr pkt);
|
||||
gem5::PacketPtr generatePacket(tlm::tlm_generic_payload& trans);
|
||||
void destroyPacket(gem5::PacketPtr pkt);
|
||||
|
||||
void checkTransaction(tlm::tlm_generic_payload& trans);
|
||||
};
|
||||
|
||||
class SCMasterPortHandler : public ExternalMaster::Handler
|
||||
class SCMasterPortHandler : public gem5::ExternalMaster::Handler
|
||||
{
|
||||
private:
|
||||
Gem5SimControl& control;
|
||||
@@ -149,8 +149,8 @@ class SCMasterPortHandler : public ExternalMaster::Handler
|
||||
public:
|
||||
SCMasterPortHandler(Gem5SimControl& control) : control(control) {}
|
||||
|
||||
ExternalMaster::ExternalPort *
|
||||
getExternalPort(const std::string &name, ExternalMaster &owner,
|
||||
gem5::ExternalMaster::ExternalPort *
|
||||
getExternalPort(const std::string &name, gem5::ExternalMaster &owner,
|
||||
const std::string &port_data);
|
||||
};
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace Gem5SystemC {
|
||||
* transactors to schedule events in gem5.
|
||||
*/
|
||||
template <typename OWNER>
|
||||
class PayloadEvent : public Event
|
||||
class PayloadEvent : public gem5::Event
|
||||
{
|
||||
public:
|
||||
OWNER& port;
|
||||
@@ -88,7 +88,8 @@ class PayloadEvent : public Event
|
||||
* Get time from SystemC as this will always be more up to date
|
||||
* than gem5's
|
||||
*/
|
||||
Tick nextEventTick = sc_core::sc_time_stamp().value() + delay.value();
|
||||
gem5::Tick nextEventTick =
|
||||
sc_core::sc_time_stamp().value() + delay.value();
|
||||
|
||||
port.owner.wakeupEventQueue(nextEventTick);
|
||||
port.owner.schedule(this, nextEventTick);
|
||||
|
||||
@@ -50,7 +50,7 @@ MemoryManager mm;
|
||||
* information to a previously allocated tlm payload
|
||||
*/
|
||||
void
|
||||
packet2payload(PacketPtr packet, tlm::tlm_generic_payload &trans)
|
||||
packet2payload(gem5::PacketPtr packet, tlm::tlm_generic_payload &trans)
|
||||
{
|
||||
trans.set_address(packet->getAddr());
|
||||
|
||||
@@ -79,8 +79,8 @@ packet2payload(PacketPtr packet, tlm::tlm_generic_payload &trans)
|
||||
/**
|
||||
* Similar to TLM's blocking transport (LT)
|
||||
*/
|
||||
Tick
|
||||
SCSlavePort::recvAtomic(PacketPtr packet)
|
||||
gem5::Tick
|
||||
SCSlavePort::recvAtomic(gem5::PacketPtr packet)
|
||||
{
|
||||
CAUGHT_UP;
|
||||
SC_REPORT_INFO("SCSlavePort", "recvAtomic hasn't been tested much");
|
||||
@@ -105,7 +105,7 @@ SCSlavePort::recvAtomic(PacketPtr packet)
|
||||
trans->set_auto_extension(extension);
|
||||
|
||||
/* Execute b_transport: */
|
||||
if (packet->cmd == MemCmd::SwapReq) {
|
||||
if (packet->cmd == gem5::MemCmd::SwapReq) {
|
||||
SC_REPORT_FATAL("SCSlavePort", "SwapReq not supported");
|
||||
} else if (packet->isRead()) {
|
||||
transactor->socket->b_transport(*trans, delay);
|
||||
@@ -130,7 +130,7 @@ SCSlavePort::recvAtomic(PacketPtr packet)
|
||||
* Similar to TLM's debug transport
|
||||
*/
|
||||
void
|
||||
SCSlavePort::recvFunctional(PacketPtr packet)
|
||||
SCSlavePort::recvFunctional(gem5::PacketPtr packet)
|
||||
{
|
||||
/* Prepare the transaction */
|
||||
tlm::tlm_generic_payload * trans = mm.allocate();
|
||||
@@ -151,7 +151,7 @@ SCSlavePort::recvFunctional(PacketPtr packet)
|
||||
}
|
||||
|
||||
bool
|
||||
SCSlavePort::recvTimingSnoopResp(PacketPtr packet)
|
||||
SCSlavePort::recvTimingSnoopResp(gem5::PacketPtr packet)
|
||||
{
|
||||
/* Snooping should be implemented with tlm_dbg_transport */
|
||||
SC_REPORT_FATAL("SCSlavePort","unimplemented func.: recvTimingSnoopResp");
|
||||
@@ -159,7 +159,7 @@ SCSlavePort::recvTimingSnoopResp(PacketPtr packet)
|
||||
}
|
||||
|
||||
void
|
||||
SCSlavePort::recvFunctionalSnoop(PacketPtr packet)
|
||||
SCSlavePort::recvFunctionalSnoop(gem5::PacketPtr packet)
|
||||
{
|
||||
/* Snooping should be implemented with tlm_dbg_transport */
|
||||
SC_REPORT_FATAL("SCSlavePort","unimplemented func.: recvFunctionalSnoop");
|
||||
@@ -169,7 +169,7 @@ SCSlavePort::recvFunctionalSnoop(PacketPtr packet)
|
||||
* Similar to TLM's non-blocking transport (AT)
|
||||
*/
|
||||
bool
|
||||
SCSlavePort::recvTimingReq(PacketPtr packet)
|
||||
SCSlavePort::recvTimingReq(gem5::PacketPtr packet)
|
||||
{
|
||||
CAUGHT_UP;
|
||||
|
||||
@@ -330,7 +330,7 @@ SCSlavePort::recvRespRetry()
|
||||
|
||||
tlm::tlm_generic_payload *trans = blockingResponse;
|
||||
blockingResponse = NULL;
|
||||
PacketPtr packet = Gem5Extension::getExtension(trans).getPacket();
|
||||
gem5::PacketPtr packet = Gem5Extension::getExtension(trans).getPacket();
|
||||
|
||||
bool need_retry = !sendTimingResp(packet);
|
||||
|
||||
@@ -356,8 +356,8 @@ SCSlavePort::nb_transport_bw(tlm::tlm_generic_payload& trans,
|
||||
|
||||
SCSlavePort::SCSlavePort(const std::string &name_,
|
||||
const std::string &systemc_name,
|
||||
ExternalSlave &owner_) :
|
||||
ExternalSlave::ExternalPort(name_, owner_),
|
||||
gem5::ExternalSlave &owner_) :
|
||||
gem5::ExternalSlave::ExternalPort(name_, owner_),
|
||||
blockingRequest(NULL),
|
||||
needToSendRequestRetry(false),
|
||||
blockingResponse(NULL),
|
||||
@@ -376,9 +376,9 @@ SCSlavePort::bindToTransactor(Gem5SlaveTransactor* transactor)
|
||||
&SCSlavePort::nb_transport_bw);
|
||||
}
|
||||
|
||||
ExternalSlave::ExternalPort*
|
||||
gem5::ExternalSlave::ExternalPort*
|
||||
SCSlavePortHandler::getExternalPort(const std::string &name,
|
||||
ExternalSlave &owner,
|
||||
gem5::ExternalSlave &owner,
|
||||
const std::string &port_data)
|
||||
{
|
||||
// Create and register a new SystemC slave port
|
||||
|
||||
@@ -52,7 +52,7 @@ class Gem5SlaveTransactor;
|
||||
* Test that gem5 is at the same time as SystemC
|
||||
*/
|
||||
#define CAUGHT_UP do { \
|
||||
assert(curTick() == sc_core::sc_time_stamp().value()); \
|
||||
assert(gem5::curTick() == sc_core::sc_time_stamp().value()); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
@@ -65,7 +65,7 @@ class Gem5SlaveTransactor;
|
||||
* original packet as a payload extension, the packet can be restored and send
|
||||
* back to the gem5 world upon receiving a response from the SystemC world.
|
||||
*/
|
||||
class SCSlavePort : public ExternalSlave::ExternalPort
|
||||
class SCSlavePort : public gem5::ExternalSlave::ExternalPort
|
||||
{
|
||||
public:
|
||||
/** One instance of pe and the related callback needed */
|
||||
@@ -93,12 +93,12 @@ class SCSlavePort : public ExternalSlave::ExternalPort
|
||||
|
||||
protected:
|
||||
/** The gem5 Port slave interface */
|
||||
Tick recvAtomic(PacketPtr packet);
|
||||
void recvFunctional(PacketPtr packet);
|
||||
bool recvTimingReq(PacketPtr packet);
|
||||
bool recvTimingSnoopResp(PacketPtr packet);
|
||||
gem5::Tick recvAtomic(gem5::PacketPtr packet);
|
||||
void recvFunctional(gem5::PacketPtr packet);
|
||||
bool recvTimingReq(gem5::PacketPtr packet);
|
||||
bool recvTimingSnoopResp(gem5::PacketPtr packet);
|
||||
void recvRespRetry();
|
||||
void recvFunctionalSnoop(PacketPtr packet);
|
||||
void recvFunctionalSnoop(gem5::PacketPtr packet);
|
||||
|
||||
Gem5SlaveTransactor* transactor;
|
||||
|
||||
@@ -110,14 +110,14 @@ class SCSlavePort : public ExternalSlave::ExternalPort
|
||||
|
||||
SCSlavePort(const std::string &name_,
|
||||
const std::string &systemc_name,
|
||||
ExternalSlave &owner_);
|
||||
gem5::ExternalSlave &owner_);
|
||||
|
||||
void bindToTransactor(Gem5SlaveTransactor* transactor);
|
||||
|
||||
friend PayloadEvent<SCSlavePort>;
|
||||
};
|
||||
|
||||
class SCSlavePortHandler : public ExternalSlave::Handler
|
||||
class SCSlavePortHandler : public gem5::ExternalSlave::Handler
|
||||
{
|
||||
private:
|
||||
Gem5SimControl& control;
|
||||
@@ -125,8 +125,8 @@ class SCSlavePortHandler : public ExternalSlave::Handler
|
||||
public:
|
||||
SCSlavePortHandler(Gem5SimControl& control) : control(control) {}
|
||||
|
||||
ExternalSlave::ExternalPort *
|
||||
getExternalPort(const std::string &name, ExternalSlave &owner,
|
||||
gem5::ExternalSlave::ExternalPort *
|
||||
getExternalPort(const std::string &name, gem5::ExternalSlave &owner,
|
||||
const std::string &port_data);
|
||||
};
|
||||
|
||||
|
||||
@@ -72,28 +72,30 @@ Gem5SimControl::Gem5SimControl(sc_core::sc_module_name name,
|
||||
}
|
||||
instance = this;
|
||||
|
||||
cxxConfigInit();
|
||||
gem5::cxxConfigInit();
|
||||
|
||||
// register the systemc slave and master port handler
|
||||
ExternalSlave::registerHandler("tlm_slave", new SCSlavePortHandler(*this));
|
||||
ExternalMaster::registerHandler("tlm_master",
|
||||
new SCMasterPortHandler(*this));
|
||||
gem5::ExternalSlave::registerHandler("tlm_slave",
|
||||
new SCSlavePortHandler(*this));
|
||||
gem5::ExternalMaster::registerHandler("tlm_master",
|
||||
new SCMasterPortHandler(*this));
|
||||
|
||||
Trace::setDebugLogger(&logger);
|
||||
gem5::Trace::setDebugLogger(&logger);
|
||||
|
||||
Gem5SystemC::setTickFrequency();
|
||||
assert(sc_core::sc_get_time_resolution()
|
||||
== sc_core::sc_time(1,sc_core::SC_PS));
|
||||
|
||||
Gem5SystemC::Module::setupEventQueues(*this);
|
||||
initSignals();
|
||||
gem5::initSignals();
|
||||
|
||||
statistics::initSimStats();
|
||||
statistics::registerHandlers(CxxConfig::statsReset, CxxConfig::statsDump);
|
||||
gem5::statistics::initSimStats();
|
||||
gem5::statistics::registerHandlers(CxxConfig::statsReset,
|
||||
CxxConfig::statsDump);
|
||||
|
||||
Trace::enable();
|
||||
gem5::Trace::enable();
|
||||
|
||||
CxxConfigFileBase* conf = new CxxIniFile();
|
||||
gem5::CxxConfigFileBase* conf = new gem5::CxxIniFile();
|
||||
|
||||
if (configFile.empty()) {
|
||||
std::cerr << "No gem5 config file specified!\n";
|
||||
@@ -105,7 +107,7 @@ Gem5SimControl::Gem5SimControl(sc_core::sc_module_name name,
|
||||
std::exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
config_manager = new CxxConfigManager(*conf);
|
||||
config_manager = new gem5::CxxConfigManager(*conf);
|
||||
|
||||
// parse debug flags string and clear/set flags accordingly
|
||||
std::stringstream ss;
|
||||
@@ -114,19 +116,19 @@ Gem5SimControl::Gem5SimControl(sc_core::sc_module_name name,
|
||||
while (std::getline(ss, flag, ' ')) {
|
||||
if (flag.at(0) == '-') {
|
||||
flag.erase(0, 1); // remove the '-'
|
||||
clearDebugFlag(flag.c_str());
|
||||
gem5::clearDebugFlag(flag.c_str());
|
||||
}
|
||||
else {
|
||||
setDebugFlag(flag.c_str());
|
||||
gem5::setDebugFlag(flag.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
CxxConfig::statsEnable();
|
||||
getEventQueue(0)->dump();
|
||||
gem5::getEventQueue(0)->dump();
|
||||
|
||||
try {
|
||||
config_manager->instantiate();
|
||||
} catch (CxxConfigManager::Exception &e) {
|
||||
} catch (gem5::CxxConfigManager::Exception &e) {
|
||||
std::cerr << "Config problem in sim object "
|
||||
<< e.name << ": " << e.message << "\n";
|
||||
std::exit(EXIT_FAILURE);
|
||||
@@ -139,7 +141,7 @@ Gem5SimControl::end_of_elaboration()
|
||||
try {
|
||||
config_manager->initState();
|
||||
config_manager->startup();
|
||||
} catch (CxxConfigManager::Exception &e) {
|
||||
} catch (gem5::CxxConfigManager::Exception &e) {
|
||||
std::cerr << "Config problem in sim object "
|
||||
<< e.name << ": " << e.message << "\n";
|
||||
std::exit(EXIT_FAILURE);
|
||||
@@ -152,7 +154,7 @@ Gem5SimControl::run()
|
||||
// notify callback
|
||||
beforeSimulate();
|
||||
|
||||
GlobalSimLoopExitEvent *exit_event = NULL;
|
||||
gem5::GlobalSimLoopExitEvent *exit_event = NULL;
|
||||
|
||||
if (simulationEnd == 0) {
|
||||
exit_event = simulate();
|
||||
@@ -160,10 +162,10 @@ Gem5SimControl::run()
|
||||
exit_event = simulate(simulationEnd);
|
||||
}
|
||||
|
||||
std::cerr << "Exit at tick " << curTick()
|
||||
std::cerr << "Exit at tick " << gem5::curTick()
|
||||
<< ", cause: " << exit_event->getCause() << '\n';
|
||||
|
||||
getEventQueue(0)->dump();
|
||||
gem5::getEventQueue(0)->dump();
|
||||
|
||||
// notify callback
|
||||
afterSimulate();
|
||||
|
||||
@@ -59,10 +59,10 @@ namespace Gem5SystemC
|
||||
class Gem5SimControl : public Module, public Gem5SimControlInterface
|
||||
{
|
||||
protected:
|
||||
CxxConfigManager* config_manager;
|
||||
gem5::CxxConfigManager* config_manager;
|
||||
Gem5SystemC::Logger logger;
|
||||
|
||||
Tick simulationEnd;
|
||||
gem5::Tick simulationEnd;
|
||||
|
||||
/*
|
||||
* Keep track of the slave and master ports that are created by gem5
|
||||
|
||||
Reference in New Issue
Block a user