/* * 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 #include #include 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 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 */