Power Recording implemented

This commit is contained in:
Matthias Jung
2016-03-16 00:24:25 +01:00
parent d3d3ffc2c5
commit 835d8deceb
5 changed files with 27 additions and 4 deletions

View File

@@ -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);
CREATE INDEX "messageTimes" ON "DebugMessages" ("Time" ASC);

View File

@@ -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

View File

@@ -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)

View File

@@ -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<tlm::tlm_phase> 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

View File

@@ -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;