diff --git a/DRAMSys/simulator/resources/scripts/createTraceDB.sql b/DRAMSys/simulator/resources/scripts/createTraceDB.sql index 4512eda9..e72ead68 100644 --- a/DRAMSys/simulator/resources/scripts/createTraceDB.sql +++ b/DRAMSys/simulator/resources/scripts/createTraceDB.sql @@ -4,6 +4,7 @@ DROP TABLE IF EXISTS Comments; DROP TABLE IF EXISTS ranges; DROP TABLE IF EXISTS Transactions; DROP TABLE IF EXISTS DebugMessages; +DROP TABLE IF EXISTS Power; CREATE TABLE Phases( ID INTEGER PRIMARY KEY, @@ -24,6 +25,11 @@ CREATE TABLE GeneralInfo( Traces TEXT ); +CREATE TABLE Power( + time INTEGER, + AveragePower DOUBLE +); + CREATE TABLE Comments( Time INTEGER, @@ -60,4 +66,4 @@ CREATE TABLE Transactions( CREATE INDEX ranges_index ON Transactions(Range); CREATE INDEX "phasesTransactions" ON "Phases" ("Transact" ASC); -CREATE INDEX "messageTimes" ON "DebugMessages" ("Time" ASC); \ No newline at end of file +CREATE INDEX "messageTimes" ON "DebugMessages" ("Time" ASC); diff --git a/DRAMSys/simulator/simulator.pro b/DRAMSys/simulator/simulator.pro index d4a355c9..812a53b2 100644 --- a/DRAMSys/simulator/simulator.pro +++ b/DRAMSys/simulator/simulator.pro @@ -231,3 +231,5 @@ OTHER_FILES += resources/configs/amconfig/am_wideioFourBanks.xml OTHER_FILES += resources/configs/memconfigs/fifo.xml OTHER_FILES += resources/configs/memconfigs/fifoStrict.xml OTHER_FILES += resources/configs/memconfigs/fr_fcfs.xml + +OTHER_FILES += resources/scripts/createTraceDB.sql diff --git a/DRAMSys/simulator/src/common/TlmRecorder.cpp b/DRAMSys/simulator/src/common/TlmRecorder.cpp index 5c6f8697..0ed225ad 100644 --- a/DRAMSys/simulator/src/common/TlmRecorder.cpp +++ b/DRAMSys/simulator/src/common/TlmRecorder.cpp @@ -74,6 +74,13 @@ TlmRecorder::~TlmRecorder() closeConnection(); } +void TlmRecorder::recordPower(sc_time time, double averagePower) +{ + sqlite3_bind_int64(insertPowerStatement, 1, time.value()); + sqlite3_bind_double(insertPowerStatement, 2, averagePower); + executeSqlStatement(insertPowerStatement); +} + void TlmRecorder::recordPhase(tlm::tlm_generic_payload& trans, tlm::tlm_phase phase, sc_time time) { if(TlmRecorder::recordingEnabled) @@ -264,6 +271,7 @@ void TlmRecorder::prepareSqlStatements() "INSERT INTO GeneralInfo (NumberOfTransactions,TraceEnd,NumberOfBanks,clk,UnitOfTime,Memconfig,Memspec,Traces) Values " "(:numberOfTransactions,:end,:numberOfBanks,:clk,:unitOfTime,:memconfig,:memspec,:traces)"; insertDebugMessageString = "INSERT INTO DebugMessages (Time,Message) Values (:time,:message)"; + insertPowerString = "INSERT INTO Power VALUES (:time,:averagePower)"; sqlite3_prepare_v2(db, insertTransactionString.c_str(), -1, &insertTransactionStatement, 0); sqlite3_prepare_v2(db, insertRangeString.c_str(), -1, &insertRangeStatement, 0); @@ -273,6 +281,7 @@ void TlmRecorder::prepareSqlStatements() sqlite3_prepare_v2(db, updateDataStrobeString.c_str(), -1, &updateDataStrobeStatement, 0); sqlite3_prepare_v2(db, insertGeneralInfoString.c_str(), -1, &insertGeneralInfoStatement, 0); sqlite3_prepare_v2(db, insertDebugMessageString.c_str(), -1, &insertDebugMessageStatement, 0); + sqlite3_prepare_v2(db, insertPowerString.c_str(), -1, &insertPowerStatement, 0); } void TlmRecorder::insertDebugMessageInDB(string message, const sc_time& time) diff --git a/DRAMSys/simulator/src/common/TlmRecorder.h b/DRAMSys/simulator/src/common/TlmRecorder.h index 2f5cb087..1f5e499a 100644 --- a/DRAMSys/simulator/src/common/TlmRecorder.h +++ b/DRAMSys/simulator/src/common/TlmRecorder.h @@ -69,6 +69,7 @@ public: void recordTracenames(string traces){this->traces = traces;} void recordPhase(tlm::tlm_generic_payload &trans, tlm::tlm_phase phase, sc_time time); + void recordPower(sc_time time, double averagePower); void recordDebugMessage(std::string message, sc_time time); void updateDataStrobe(const sc_time& begin, const sc_time& end, tlm::tlm_generic_payload& trans); void closeConnection(); @@ -131,9 +132,9 @@ private: std::vector transactionTerminatingPhases; sqlite3 *db = NULL; sqlite3_stmt *insertTransactionStatement, *insertRangeStatement, *updateRangeStatement, - *insertPhaseStatement, *updatePhaseStatement, *insertGeneralInfoStatement, *insertDebugMessageStatement, *updateDataStrobeStatement; + *insertPhaseStatement, *updatePhaseStatement, *insertGeneralInfoStatement, *insertDebugMessageStatement, *updateDataStrobeStatement, *insertPowerStatement; std::string insertTransactionString, insertRangeString, updateRangeString, insertPhaseString, updatePhaseString, insertGeneralInfoString, - insertDebugMessageString, updateDataStrobeString; + insertDebugMessageString, updateDataStrobeString, insertPowerString; }; #endif diff --git a/DRAMSys/simulator/src/simulation/Dram.h b/DRAMSys/simulator/src/simulation/Dram.h index c68d4ffe..396af69f 100644 --- a/DRAMSys/simulator/src/simulation/Dram.h +++ b/DRAMSys/simulator/src/simulation/Dram.h @@ -200,7 +200,11 @@ struct Dram : sc_module // Calculate the residual power and energy which was not covered by previous windows... printDebugMessage(string("\tCurrent Energy: \t") + to_string(DRAMPower->getEnergy().total_energy - totalEnergy)); printDebugMessage(string("\tAverage Power: \t") + to_string((DRAMPower->getEnergy().total_energy - totalEnergy)/windowSize.value())); - sumOfEnergyWindows += DRAMPower->getEnergy().total_energy - totalEnergy; + + double currentTotalEnergy = DRAMPower->getEnergy().total_energy - totalEnergy; + double currentAveragePower = currentTotalEnergy/windowSize.value(); + sumOfEnergyWindows += currentTotalEnergy; + tlmRecorder->recordPower(sc_time_stamp(),currentAveragePower); totalEnergy = DRAMPower->getEnergy().total_energy; // Make sure that the summed energy of the windows is the same as the final value provided by DRAMPower: @@ -231,6 +235,7 @@ struct Dram : sc_module currentTotalEnergy = DRAMPower->getEnergy().total_energy - totalEnergy; currentAveragePower = currentTotalEnergy/windowSize.value(); // TODO: Store $currentAveragePower in the trace database. + tlmRecorder->recordPower(sc_time_stamp(),currentAveragePower); totalEnergy = DRAMPower->getEnergy().total_energy; sumOfEnergyWindows += currentTotalEnergy;