From 57c62ccc879b7b332e1548228deea834cf5c3743 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Mon, 31 May 2021 14:15:07 +0200 Subject: [PATCH] Terminate and record last transaction of simulation. --- DRAMSys/library/src/common/TlmRecorder.cpp | 48 ++++++++++++++++++---- DRAMSys/library/src/common/TlmRecorder.h | 7 ++-- DRAMSys/library/src/common/utils.cpp | 2 +- 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/DRAMSys/library/src/common/TlmRecorder.cpp b/DRAMSys/library/src/common/TlmRecorder.cpp index 319fe53d..7e952fa8 100644 --- a/DRAMSys/library/src/common/TlmRecorder.cpp +++ b/DRAMSys/library/src/common/TlmRecorder.cpp @@ -131,10 +131,16 @@ void TlmRecorder::recordPhase(tlm_generic_payload &trans, currentTransactionsInSystem[&trans].setPhaseEnd(phaseName, time); } - bool phaseTerminatesTransaction = std::count(transactionTerminatingPhases.begin(), - transactionTerminatingPhases.end(), phase) == 1; - if (phaseTerminatesTransaction) - removeTransactionFromSystem(trans); + if (currentTransactionsInSystem[&trans].cmd == 'X') + { + if (std::count(transactionTerminatingPhases.begin(), transactionTerminatingPhases.end(), phase) == 1) + removeTransactionFromSystem(trans); + } + else + { + if (phase == END_RESP) + removeTransactionFromSystem(trans); + } simulationTimeCoveredByRecording = time; } @@ -161,8 +167,13 @@ void TlmRecorder::introduceTransactionSystem(tlm_generic_payload &trans) { totalNumTransactions++; currentTransactionsInSystem[&trans].id = totalNumTransactions; - currentTransactionsInSystem[&trans].cmd = trans.get_command() == - tlm::TLM_READ_COMMAND ? 'R' : 'W'; + tlm_command command = trans.get_command(); + if (command == TLM_READ_COMMAND) + currentTransactionsInSystem[&trans].cmd = 'R'; + else if (command == TLM_WRITE_COMMAND) + currentTransactionsInSystem[&trans].cmd = 'W'; + else + currentTransactionsInSystem[&trans].cmd = 'X'; currentTransactionsInSystem[&trans].address = trans.get_address(); currentTransactionsInSystem[&trans].burstLength = DramExtension::getBurstLength(trans); currentTransactionsInSystem[&trans].dramExtension = DramExtension::getExtension(trans); @@ -192,6 +203,28 @@ void TlmRecorder::removeTransactionFromSystem(tlm_generic_payload &trans) currentTransactionsInSystem.erase(&trans); } +void TlmRecorder::terminateRemainingTransactions() +{ + while (!currentTransactionsInSystem.empty()) + { + auto transaction = currentTransactionsInSystem.begin(); + if (transaction->second.cmd == 'X') + { + std::string beginPhase = transaction->second.recordedPhases.front().name; + if (beginPhase == "PDNA") + recordPhase(*(transaction->first), END_PDNA, sc_time_stamp()); + else if (beginPhase == "PDNP") + recordPhase(*(transaction->first), END_PDNP, sc_time_stamp()); + else if (beginPhase == "SREF") + recordPhase(*(transaction->first), END_SREF, sc_time_stamp()); + else + removeTransactionFromSystem(*transaction->first); + } + else + recordPhase(*(transaction->first), END_RESP, sc_time_stamp()); + } +} + void TlmRecorder::commitRecordedDataToDB() { sqlite3_exec(db, "BEGIN;", nullptr, nullptr, nullptr); @@ -262,7 +295,7 @@ void TlmRecorder::openDB(const std::string &dbName) void TlmRecorder::setUpTransactionTerminatingPhases() { - transactionTerminatingPhases.push_back(END_RESP); + transactionTerminatingPhases.emplace_back(END_RESP); // Refresh All transactionTerminatingPhases.push_back(END_REFA); @@ -478,6 +511,7 @@ void TlmRecorder::executeInitialSqlCommand() void TlmRecorder::closeConnection() { + terminateRemainingTransactions(); commitRecordedDataToDB(); insertGeneralInfo(); insertCommandLengths(); diff --git a/DRAMSys/library/src/common/TlmRecorder.h b/DRAMSys/library/src/common/TlmRecorder.h index aeeb8ce1..deefd36f 100644 --- a/DRAMSys/library/src/common/TlmRecorder.h +++ b/DRAMSys/library/src/common/TlmRecorder.h @@ -42,7 +42,7 @@ #include #include #include -#include +#include #include #include #include @@ -55,8 +55,6 @@ class TlmRecorder { public: - std::string sqlScriptURI; - TlmRecorder(const std::string &name, const std::string &dbName); ~TlmRecorder(); @@ -123,6 +121,7 @@ private: void introduceTransactionSystem(tlm::tlm_generic_payload &trans); void removeTransactionFromSystem(tlm::tlm_generic_payload &trans); + void terminateRemainingTransactions(); void commitRecordedDataToDB(); void insertGeneralInfo(); void insertCommandLengths(); @@ -134,7 +133,7 @@ private: static constexpr unsigned transactionCommitRate = 1024; std::vector recordedData; - std::map currentTransactionsInSystem; + std::unordered_map currentTransactionsInSystem; uint64_t totalNumTransactions; sc_time simulationTimeCoveredByRecording; diff --git a/DRAMSys/library/src/common/utils.cpp b/DRAMSys/library/src/common/utils.cpp index f9b6b520..3a1e86c3 100644 --- a/DRAMSys/library/src/common/utils.cpp +++ b/DRAMSys/library/src/common/utils.cpp @@ -142,7 +142,7 @@ std::string parseString(json &obj, const std::string &name) void setUpDummy(tlm_generic_payload &payload, uint64_t channelPayloadID, Rank rank, BankGroup bankGroup, Bank bank) { payload.set_address(bank.getStartAddress()); - payload.set_command(TLM_READ_COMMAND); + payload.set_command(TLM_IGNORE_COMMAND); payload.set_data_length(0); payload.set_response_status(TLM_OK_RESPONSE); payload.set_dmi_allowed(false);