Terminate and record last transaction of simulation.

This commit is contained in:
Lukas Steiner
2021-05-31 14:15:07 +02:00
parent 834e10efde
commit 57c62ccc87
3 changed files with 45 additions and 12 deletions

View File

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

View File

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

View File

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