Add number of bankgroups and REFSB command length to trace analyzer.

This commit is contained in:
Lukas Steiner
2020-08-26 10:20:45 +02:00
parent eb720d5aa6
commit 79cb57a672
10 changed files with 105 additions and 77 deletions

View File

@@ -19,6 +19,7 @@ CREATE TABLE GeneralInfo(
NumberOfTransactions INTEGER,
TraceEnd INTEGER,
NumberOfRanks INTEGER,
NumberOfBankgroups INTEGER,
NumberOfBanks INTEGER,
clk INTEGER,
UnitOfTime TEXT,
@@ -41,6 +42,7 @@ CREATE TABLE CommandLengths(
WRA INTEGER,
REFA INTEGER,
REFB INTEGER,
REFSB INTEGER,
PDEA INTEGER,
PDXA INTEGER,
PDEP INTEGER,

View File

@@ -275,86 +275,86 @@ void TlmRecorder::prepareSqlStatements()
insertTransactionString =
"INSERT INTO Transactions VALUES (:id,:rangeID,:address,:burstlength,:thread,:channel,:rank,"
":bankgroup,:bank,:row,:column,:dataStrobeBegin,:dataStrobeEnd, :timeOfGeneration,:command)";
insertRangeString = "INSERT INTO Ranges VALUES (:id,:begin,:end)";
updateRangeString = "UPDATE Ranges SET End = :end WHERE ID = :id";
updateDataStrobeString =
"UPDATE Transactions SET DataStrobeBegin = :begin, DataStrobeEnd = :end WHERE ID = :id";
insertPhaseString =
"INSERT INTO Phases (PhaseName,PhaseBegin,PhaseEnd,Transact) VALUES (:name,:begin,:end,:transaction)";
updatePhaseString =
"UPDATE Phases SET PhaseEnd = :end WHERE Transact = :trans AND PhaseName = :name";
insertGeneralInfoString =
"INSERT INTO GeneralInfo VALUES"
"(:numberOfTransactions,:end,:numberOfRanks,:numberOfBanks,:clk,:unitOfTime,:mcconfig,:memspec,"
"(:numberOfTransactions,:end,:numberOfRanks,:numberOfBankgroups,:numberOfBanks,:clk,:unitOfTime,:mcconfig,:memspec,"
":traces,:windowSize, :flexibleRefresh, :maxRefBurst, :controllerThread)";
insertCommandLengthsString =
"INSERT INTO CommandLengths VALUES"
"(:ACT, :PRE, :PREA, :RD, :RDA, :WR, :WRA, :REFA, :REFB, :PDEA, :PDXA, :PDEP, :PDXP, :SREFEN, :SREFEX)";
"(:ACT, :PRE, :PREA, :RD, :RDA, :WR, :WRA, :REFA, :REFB, :REFSB, :PDEA, :PDXA, :PDEP, :PDXP, :SREFEN, :SREFEX)";
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, insertTransactionString.c_str(), -1, &insertTransactionStatement, 0);
sqlite3_prepare_v2(db, insertRangeString.c_str(), -1, &insertRangeStatement, 0);
sqlite3_prepare_v2(db, updateRangeString.c_str(), -1, &updateRangeStatement, 0);
sqlite3_prepare_v2(db, insertPhaseString.c_str(), -1, &insertPhaseStatement, 0);
sqlite3_prepare_v2(db, updatePhaseString.c_str(), -1, &updatePhaseStatement, 0);
sqlite3_prepare_v2(db, updateDataStrobeString.c_str(), -1,
&updateDataStrobeStatement, 0);
sqlite3_prepare_v2(db, insertGeneralInfoString.c_str(), -1,
&insertGeneralInfoStatement, 0);
sqlite3_prepare_v2(db, insertCommandLengthsString.c_str(), -1,
&insertCommandLengthsStatement, 0);
sqlite3_prepare_v2(db, insertDebugMessageString.c_str(), -1,
&insertDebugMessageStatement, 0);
sqlite3_prepare_v2(db, updateDataStrobeString.c_str(), -1, &updateDataStrobeStatement, 0);
sqlite3_prepare_v2(db, insertGeneralInfoString.c_str(), -1, &insertGeneralInfoStatement, 0);
sqlite3_prepare_v2(db, insertCommandLengthsString.c_str(), -1, &insertCommandLengthsStatement, 0);
sqlite3_prepare_v2(db, insertDebugMessageString.c_str(), -1, &insertDebugMessageStatement, 0);
sqlite3_prepare_v2(db, insertPowerString.c_str(), -1, &insertPowerStatement, 0);
}
void TlmRecorder::insertDebugMessageInDB(std::string message, const sc_time &time)
{
sqlite3_bind_int64(insertDebugMessageStatement, 1, time.value());
sqlite3_bind_text(insertDebugMessageStatement, 2, message.c_str(),
message.length(), 0);
sqlite3_bind_text(insertDebugMessageStatement, 2, message.c_str(), message.length(), 0);
executeSqlStatement(insertDebugMessageStatement);
}
void TlmRecorder::insertGeneralInfo()
{
sqlite3_bind_int64(insertGeneralInfoStatement, 1, totalNumTransactions - 1);
sqlite3_bind_int64(insertGeneralInfoStatement, 2,
simulationTimeCoveredByRecording.value());
sqlite3_bind_int(insertGeneralInfoStatement, 3,
Configuration::getInstance().memSpec->numberOfRanks);
sqlite3_bind_int(insertGeneralInfoStatement, 4,
Configuration::getInstance().memSpec->numberOfBanks);
sqlite3_bind_int(insertGeneralInfoStatement, 5,
Configuration::getInstance().memSpec->tCK.value());
sqlite3_bind_text(insertGeneralInfoStatement, 6, "PS", 2, NULL);
sqlite3_bind_text(insertGeneralInfoStatement, 7, mcconfig.c_str(),
mcconfig.length(), NULL);
sqlite3_bind_text(insertGeneralInfoStatement, 8, memspec.c_str(),
memspec.length(), NULL);
sqlite3_bind_text(insertGeneralInfoStatement, 9, traces.c_str(),
traces.length(), NULL);
sqlite3_bind_int64(insertGeneralInfoStatement, 2, simulationTimeCoveredByRecording.value());
sqlite3_bind_int(insertGeneralInfoStatement, 3, Configuration::getInstance().memSpec->numberOfRanks);
sqlite3_bind_int(insertGeneralInfoStatement, 4, Configuration::getInstance().memSpec->numberOfBankGroups);
sqlite3_bind_int(insertGeneralInfoStatement, 5, Configuration::getInstance().memSpec->numberOfBanks);
sqlite3_bind_int(insertGeneralInfoStatement, 6, Configuration::getInstance().memSpec->tCK.value());
sqlite3_bind_text(insertGeneralInfoStatement, 7, "PS", 2, NULL);
sqlite3_bind_text(insertGeneralInfoStatement, 8, mcconfig.c_str(), mcconfig.length(), NULL);
sqlite3_bind_text(insertGeneralInfoStatement, 9, memspec.c_str(), memspec.length(), NULL);
sqlite3_bind_text(insertGeneralInfoStatement, 10, traces.c_str(), traces.length(), NULL);
if (!Configuration::getInstance().enableWindowing)
sqlite3_bind_int64(insertGeneralInfoStatement, 10, 0);
sqlite3_bind_int64(insertGeneralInfoStatement, 11, 0);
else
sqlite3_bind_int64(insertGeneralInfoStatement, 10,
(Configuration::getInstance().memSpec->tCK *
Configuration::getInstance().windowSize).value());
sqlite3_bind_int64(insertGeneralInfoStatement, 11,
(Configuration::getInstance().memSpec->tCK *
Configuration::getInstance().windowSize).value());
if ((Configuration::getInstance().refreshMaxPostponed > 0)
|| (Configuration::getInstance().refreshMaxPulledin > 0)) {
sqlite3_bind_int(insertGeneralInfoStatement, 11, 1);
sqlite3_bind_int(insertGeneralInfoStatement, 12,
std::max(Configuration::getInstance().refreshMaxPostponed,
Configuration::getInstance().refreshMaxPulledin));
} else {
sqlite3_bind_int(insertGeneralInfoStatement, 11, 0);
|| (Configuration::getInstance().refreshMaxPulledin > 0))
{
sqlite3_bind_int(insertGeneralInfoStatement, 12, 1);
sqlite3_bind_int(insertGeneralInfoStatement, 13,
std::max(Configuration::getInstance().refreshMaxPostponed,
Configuration::getInstance().refreshMaxPulledin));
}
else
{
sqlite3_bind_int(insertGeneralInfoStatement, 12, 0);
sqlite3_bind_int(insertGeneralInfoStatement, 13, 0);
}
sqlite3_bind_int(insertGeneralInfoStatement, 13, UINT_MAX);
sqlite3_bind_int(insertGeneralInfoStatement, 14, UINT_MAX);
executeSqlStatement(insertGeneralInfoStatement);
}
@@ -371,12 +371,13 @@ void TlmRecorder::insertCommandLengths()
sqlite3_bind_int(insertCommandLengthsStatement, 7, memSpec->getCommandLength(Command::WRA) / memSpec->tCK);
sqlite3_bind_int(insertCommandLengthsStatement, 8, memSpec->getCommandLength(Command::REFA) / memSpec->tCK);
sqlite3_bind_int(insertCommandLengthsStatement, 9, memSpec->getCommandLength(Command::REFB) / memSpec->tCK);
sqlite3_bind_int(insertCommandLengthsStatement, 10, memSpec->getCommandLength(Command::PDEA) / memSpec->tCK);
sqlite3_bind_int(insertCommandLengthsStatement, 11, memSpec->getCommandLength(Command::PDXA) / memSpec->tCK);
sqlite3_bind_int(insertCommandLengthsStatement, 12, memSpec->getCommandLength(Command::PDEP) / memSpec->tCK);
sqlite3_bind_int(insertCommandLengthsStatement, 13, memSpec->getCommandLength(Command::PDXP) / memSpec->tCK);
sqlite3_bind_int(insertCommandLengthsStatement, 14, memSpec->getCommandLength(Command::SREFEN) / memSpec->tCK);
sqlite3_bind_int(insertCommandLengthsStatement, 15, memSpec->getCommandLength(Command::SREFEX) / memSpec->tCK);
sqlite3_bind_int(insertCommandLengthsStatement, 10, 1);
sqlite3_bind_int(insertCommandLengthsStatement, 11, memSpec->getCommandLength(Command::PDEA) / memSpec->tCK);
sqlite3_bind_int(insertCommandLengthsStatement, 12, memSpec->getCommandLength(Command::PDXA) / memSpec->tCK);
sqlite3_bind_int(insertCommandLengthsStatement, 13, memSpec->getCommandLength(Command::PDEP) / memSpec->tCK);
sqlite3_bind_int(insertCommandLengthsStatement, 14, memSpec->getCommandLength(Command::PDXP) / memSpec->tCK);
sqlite3_bind_int(insertCommandLengthsStatement, 15, memSpec->getCommandLength(Command::SREFEN) / memSpec->tCK);
sqlite3_bind_int(insertCommandLengthsStatement, 16, memSpec->getCommandLength(Command::SREFEX) / memSpec->tCK);
executeSqlStatement(insertCommandLengthsStatement);
}

View File

@@ -47,6 +47,7 @@ struct CommandLengths
unsigned WRA;
unsigned REFA;
unsigned REFB;
unsigned REFSB;
unsigned PDEA;
unsigned PDXA;
unsigned PDEP;
@@ -56,10 +57,11 @@ struct CommandLengths
CommandLengths(unsigned ACT, unsigned PRE, unsigned PREA,
unsigned RD, unsigned RDA, unsigned WR, unsigned WRA,
unsigned REFA, unsigned REFB, unsigned PDEA, unsigned PDXA,
unsigned PDEP, unsigned PDXP, unsigned SREFEN, unsigned SREFEX) :
unsigned REFA, unsigned REFB, unsigned REFSB,
unsigned PDEA, unsigned PDXA, unsigned PDEP, unsigned PDXP,
unsigned SREFEN, unsigned SREFEX) :
ACT(ACT), PRE(PRE), PREA(PREA), RD(RD), RDA(RDA), WR(WR), WRA(WRA),
REFA(REFA), REFB(REFB), PDEA(PDEA), PDXA(PDXA),
REFA(REFA), REFB(REFB), REFSB(REFSB), PDEA(PDEA), PDXA(PDXA),
PDEP(PDEP), PDXP(PDXP), SREFEN(SREFEN), SREFEX(SREFEX) {}
CommandLengths() {}

View File

@@ -45,6 +45,7 @@ struct GeneralInfo {
unsigned int numberOfPhases;
Timespan span;
unsigned int numberOfRanks;
unsigned int numberOfBankgroups;
unsigned int numberOfBanks;
QString description;
QString unitOfTime;
@@ -53,12 +54,12 @@ struct GeneralInfo {
unsigned int controllerThread;
public:
GeneralInfo(unsigned int numberOfTransactions, unsigned int numberOfPhases,
Timespan span, unsigned int numberOfRanks, unsigned int numberOfBanks,
GeneralInfo(unsigned int numberOfTransactions, unsigned int numberOfPhases, Timespan span,
unsigned int numberOfRanks, unsigned int numberOfBankgroups, unsigned int numberOfBanks,
const QString &description, QString unitOfTime, unsigned int clkPeriod,
unsigned int windowSize, unsigned int controllerThread) :
numberOfTransactions(numberOfTransactions) , numberOfPhases(numberOfPhases),
span(span), numberOfRanks(numberOfRanks), numberOfBanks(numberOfBanks),
numberOfTransactions(numberOfTransactions) , numberOfPhases(numberOfPhases), span(span),
numberOfRanks(numberOfRanks), numberOfBankgroups(numberOfBankgroups), numberOfBanks(numberOfBanks),
description(description), unitOfTime(unitOfTime), clkPeriod(clkPeriod),
windowSize(windowSize), controllerThread(controllerThread) {}

View File

@@ -314,8 +314,22 @@ protected:
}
};
class REFSB : public AUTO_REFRESH
{
public:
using AUTO_REFRESH::AUTO_REFRESH;
protected:
virtual QString Name() const override
{
return "REFSB";
}
virtual bool isBankwise() const override
{
return false;
}
};
class PRECHARGE_ALL : public Phase
class PREA : public Phase
{
public:
using Phase::Phase;

View File

@@ -68,7 +68,7 @@ shared_ptr<Phase> PhaseFactory::CreatePhase(ID id, const QString &dbPhaseName,
return shared_ptr<Phase>(new ACT(id, span, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.ACT)}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "PREA")
return shared_ptr<Phase>(new PRECHARGE_ALL(id, span, trans,
return shared_ptr<Phase>(new PREA(id, span, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.PREA)}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "REFA")
return shared_ptr<Phase>(new REFA(id, span, trans,
@@ -76,6 +76,9 @@ shared_ptr<Phase> PhaseFactory::CreatePhase(ID id, const QString &dbPhaseName,
else if (dbPhaseName == "REFB")
return shared_ptr<Phase>(new REFB(id, span, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.REFB)}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "REFSB")
return shared_ptr<Phase>(new REFSB(id, span, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.REFSB)}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "RD")
return shared_ptr<Phase>(new RD(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RD)},
std::shared_ptr<Timespan>(new Timespan(trans->SpanOnDataStrobe()))));

View File

@@ -238,7 +238,7 @@ ID TraceDB::getTransactionIDFromPhaseID(ID phaseID)
GeneralInfo TraceDB::getGeneralInfoFromDB()
{
QSqlQuery query(database);
query.prepare("SELECT NumberOfTransactions, TraceEnd, NumberOfRanks, NumberOfBanks, Clk, "
query.prepare("SELECT NumberOfTransactions, TraceEnd, NumberOfRanks, NumberOfBankgroups, NumberOfBanks, Clk, "
"UnitOfTime, Traces, Memspec, MCconfig, WindowSize, ControllerThread FROM GeneralInfo");
executeQuery(query);
@@ -246,16 +246,17 @@ GeneralInfo TraceDB::getGeneralInfoFromDB()
unsigned int numberOfTransactions = query.value(0).toInt();
traceTime traceEnd = query.value(1).toLongLong();
unsigned int numberOfRanks = query.value(2).toInt();
unsigned int numberOfBanks = query.value(3).toInt();
unsigned int clkPeriod = query.value(4).toInt();
QString unitOfTime = query.value(5).toString();
unsigned int numberOfBankgroups = query.value(3).toInt();
unsigned int numberOfBanks = query.value(4).toInt();
unsigned int clkPeriod = query.value(5).toInt();
QString unitOfTime = query.value(6).toString();
unsigned int numberOfPhases = getNumberOfPhases();
QString traces = "Traces: " + query.value(6).toString();
QString memspec = "Memspec: " + query.value(7).toString();
QString mcconfig = "MCconfig: " + query.value(8).toString();
unsigned int windowSize = query.value(9).toInt();
unsigned int controllerThread = query.value(10).toUInt();
QString traces = "Traces: " + query.value(7).toString();
QString memspec = "Memspec: " + query.value(8).toString();
QString mcconfig = "MCconfig: " + query.value(9).toString();
unsigned int windowSize = query.value(10).toInt();
unsigned int controllerThread = query.value(11).toUInt();
QString description = (traces + "\n");
description += mcconfig + "\n";
@@ -268,8 +269,8 @@ GeneralInfo TraceDB::getGeneralInfoFromDB()
description += "Window size:" + QString::number(windowSize) + "\n";
return GeneralInfo(numberOfTransactions, numberOfPhases, Timespan(0, traceEnd),
numberOfRanks, numberOfBanks, description, unitOfTime,
clkPeriod, windowSize, controllerThread);
numberOfRanks, numberOfBankgroups, numberOfBanks,
description, unitOfTime, clkPeriod, windowSize, controllerThread);
} else {
throw sqlException("Tracefile corrupted. No general info table",
this->pathToDB.toStdString());
@@ -293,14 +294,15 @@ CommandLengths TraceDB::getCommandLengthsFromDB()
unsigned WRA = query.value(6).toInt();
unsigned REFA = query.value(7).toInt();
unsigned REFB = query.value(8).toInt();
unsigned PDEA = query.value(9).toInt();
unsigned PDXA = query.value(10).toInt();
unsigned PDEP = query.value(11).toInt();
unsigned PDXP = query.value(12).toInt();
unsigned SREFEN = query.value(13).toInt();
unsigned SREFEX = query.value(14).toInt();
unsigned REFSB = query.value(9).toInt();
unsigned PDEA = query.value(10).toInt();
unsigned PDXA = query.value(11).toInt();
unsigned PDEP = query.value(12).toInt();
unsigned PDXP = query.value(13).toInt();
unsigned SREFEN = query.value(14).toInt();
unsigned SREFEX = query.value(15).toInt();
return CommandLengths(ACT, PRE, PREA, RD, RDA, WR, WRA, REFA, REFB,
return CommandLengths(ACT, PRE, PREA, RD, RDA, WR, WRA, REFA, REFB, REFSB,
PDEA, PDXA, PDEP, PDXP, SREFEN, SREFEX);
}
else

View File

@@ -54,6 +54,7 @@ struct TraceDrawingProperties {
int yValCommandBus;
int yValDataBus;
unsigned int numberOfRanks;
unsigned int numberOfBankgroups;
unsigned int numberOfBanks;
unsigned int banksPerRank;
@@ -68,8 +69,8 @@ struct TraceDrawingProperties {
drawText(drawText), drawBorder(drawBorder), colorGrouping(colorGrouping),
yValResponse(yValResponse), yValRequest(yValRequest),
yValCommandBus(yValCommandBus), yValDataBus(yValDataBus),
numberOfRanks(numberOfRanks), numberOfBanks(numberOfBanks),
banksPerRank(numberOfBanks / numberOfRanks) {}
numberOfRanks(numberOfRanks), numberOfBankgroups(numberOfBankgroups),
numberOfBanks(numberOfBanks), banksPerRank(numberOfBanks / numberOfRanks) {}
QHash<int, QString> getLabels() const
{
@@ -78,7 +79,7 @@ struct TraceDrawingProperties {
result[i] = QString("Bank ") + QString::number(i);
}
result[yValCommandBus] = "Cmd Bus";
result[yValCommandBus] = "Command Bus";
result[yValResponse] = "RESP";
result[yValRequest] = "REQ";
result[yValDataBus] = "Data Bus";

View File

@@ -206,6 +206,7 @@ void TracePlot::connectNavigatorQ_SIGNALS()
void TracePlot::setUpDrawingProperties()
{
drawingProperties.numberOfRanks = navigator->GeneralTraceInfo().numberOfRanks;
drawingProperties.numberOfBankgroups = navigator->GeneralTraceInfo().numberOfBankgroups;
drawingProperties.numberOfBanks = navigator->GeneralTraceInfo().numberOfBanks;
drawingProperties.banksPerRank = drawingProperties.numberOfBanks / drawingProperties.numberOfRanks;
drawingProperties.yValResponse = drawingProperties.numberOfBanks;

View File

@@ -87,6 +87,7 @@ void TraceScroller::setUpTracePlotItem()
void TraceScroller::setUpDrawingProperties()
{
drawingProperties.numberOfRanks = navigator->GeneralTraceInfo().numberOfRanks;
drawingProperties.numberOfBankgroups = navigator->GeneralTraceInfo().numberOfBankgroups;
drawingProperties.numberOfBanks = navigator->GeneralTraceInfo().numberOfBanks;
drawingProperties.banksPerRank = drawingProperties.numberOfBanks / drawingProperties.numberOfRanks;
drawingProperties.yValResponse = drawingProperties.numberOfBanks;