100 lines
2.9 KiB
C++
100 lines
2.9 KiB
C++
/*
|
|
* SimulationManager.cpp
|
|
*
|
|
* Created on: Apr 4, 2014
|
|
* Author: jonny
|
|
*/
|
|
|
|
#include "SimulationManager.h"
|
|
#include "../common/TlmRecorder.h"
|
|
#include "../common/DebugManager.h"
|
|
#include "../common/xmlAddressdecoder.h"
|
|
#include "../core/ControllerCore.h"
|
|
#include <stdlib.h>
|
|
#include <iostream>
|
|
#include <vector>
|
|
using namespace std;
|
|
|
|
namespace simulation {
|
|
|
|
SimulationManager::SimulationManager(sc_module_name name, string memconfig, string memspec,
|
|
string stl1, unsigned int burstlength1, string stl2,
|
|
unsigned int burstlenght2, string traceName, string pathToResources,
|
|
bool silent) :
|
|
dram("dram"), arbiter("arbiter"), controller("controller"), player1("player1",
|
|
pathToResources + string("traces/") + stl1,burstlength1, this), player2("player2",
|
|
pathToResources + string("traces/") + stl2,burstlenght2, this), traceName(traceName)
|
|
|
|
{
|
|
SC_THREAD(terminationThread);
|
|
|
|
cout << pathToResources + string("configs/memconfigs/") + memconfig << endl;
|
|
cout << pathToResources + string("configs/memspecs/") + memspec << endl;
|
|
|
|
|
|
xmlAddressDecoder::addressConfigURI = pathToResources + string("configs/addressConfig.xml");
|
|
TlmRecorder::dbName = traceName;
|
|
TlmRecorder::sqlScriptURI = pathToResources + string("scripts/createTraceDB.sql");
|
|
|
|
player1.iSocket.bind(arbiter.tSockets[0]);
|
|
player2.iSocket.bind(arbiter.tSockets[1]);
|
|
arbiter.iSocket.bind(controller.tSocket);
|
|
controller.iSocket.bind(dram.tSocket);
|
|
|
|
vector<string> whiteList;
|
|
if(!silent)
|
|
{
|
|
whiteList.push_back(controller.name());
|
|
whiteList.push_back(player2.name());
|
|
whiteList.push_back(player1.name());
|
|
whiteList.push_back(this->name());
|
|
whiteList.push_back(TlmRecorder::senderName);
|
|
whiteList.push_back(ControllerCore::senderName);
|
|
whiteList.push_back(PowerDownManager::senderName);
|
|
}
|
|
DebugManager::getInstance().addToWhiteList(whiteList);
|
|
}
|
|
|
|
void SimulationManager::startSimulation()
|
|
{
|
|
|
|
clock_t begin = clock();
|
|
|
|
DebugManager::getInstance().printDebugMessage(name(), "Starting simulation");
|
|
player1.start();
|
|
player2.start();
|
|
sc_start();
|
|
|
|
clock_t end = clock();
|
|
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
|
|
DebugManager::getInstance().printDebugMessage(name(),
|
|
"Simulation took " + to_string(elapsed_secs) + " seconds");
|
|
}
|
|
|
|
void SimulationManager::tracePlayerFinishedCallback(string name)
|
|
{
|
|
|
|
DebugManager::getInstance().printDebugMessage(this->name(), "Traceplayer " + name + " finshed");
|
|
static int finishedPlayers = 0;
|
|
finishedPlayers++;
|
|
if (finishedPlayers == numberOfTracePlayers)
|
|
{
|
|
terminateSimulation.notify();
|
|
}
|
|
}
|
|
|
|
void SimulationManager::terminationThread()
|
|
{
|
|
wait(terminateSimulation);
|
|
DebugManager::getInstance().printDebugMessage(this->name(), "Terminating simulation");
|
|
controller.terminateSimulation();
|
|
//waits for the termination of all pending powerdown phases in the dram system
|
|
wait(sc_time(50, SC_NS));
|
|
TlmRecorder::getInstance().closeConnection();
|
|
sc_stop();
|
|
}
|
|
|
|
|
|
|
|
} /* namespace simulation */
|