Terminate and record last transaction of simulation.
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
#include <iostream>
|
||||
#include <ostream>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <unordered_map>
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
#include <cerrno>
|
||||
@@ -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<Transaction> recordedData;
|
||||
std::map<tlm::tlm_generic_payload *, Transaction> currentTransactionsInSystem;
|
||||
std::unordered_map<tlm::tlm_generic_payload *, Transaction> currentTransactionsInSystem;
|
||||
|
||||
uint64_t totalNumTransactions;
|
||||
sc_time simulationTimeCoveredByRecording;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user