Added dependency calculations. Still missing tests and interface.

This commit is contained in:
Iron Prando da Silva
2021-12-13 13:31:15 +01:00
parent 1f78932267
commit 6f7c232f45
8 changed files with 114 additions and 52 deletions

View File

@@ -1,43 +1,41 @@
#include "DDR3TimeDependencies.h"
DDR3TimeDependencies::DDR3TimeDependencies(const QJsonObject& memspec) : DRAMTimeDependenciesIF(memspec) {
DDR3TimeDependencies::DDR3TimeDependencies(const QJsonObject& memspec, const uint clk) : DRAMTimeDependenciesIF(memspec, clk) {
mInitializeValues();
}
void DDR3TimeDependencies::mInitializeValues() {
burstLength = mMemspecJson["memarchitecturespec"].toObject()["burstLength"].toString().toInt();
dataRate = mMemspecJson["memarchitecturespec"].toObject()["dataRate"].toString().toInt();
clk = mMemspecJson["memarchitecturespec"].toArray()[0].toString().toInt();
burstLength = mMemspecJson["memarchitecturespec"].toObject()["burstLength"].toInt();
dataRate = mMemspecJson["memarchitecturespec"].toObject()["dataRate"].toInt();
nActivateWindow = 4;
tRP = mMemspecJson["memtimingspec"].toObject()["RP"].toString().toInt();
tRAS = mMemspecJson["memtimingspec"].toObject()["RAS"].toString().toInt();
tRC = mMemspecJson["memtimingspec"].toObject()["RC"].toString().toInt();
tRTP = mMemspecJson["memtimingspec"].toObject()["RTP"].toString().toInt();
tRRD = mMemspecJson["memtimingspec"].toObject()["RRD"].toString().toInt();
tCCD = mMemspecJson["memtimingspec"].toObject()["CCD"].toString().toInt();
tRCD = mMemspecJson["memtimingspec"].toObject()["RCD"].toString().toInt();
tNAW = mMemspecJson["memtimingspec"].toObject()["NAW"].toString().toInt();
tRL = mMemspecJson["memtimingspec"].toObject()["RL"].toString().toInt();
tWL = mMemspecJson["memtimingspec"].toObject()["WL"].toString().toInt();
tWR = mMemspecJson["memtimingspec"].toObject()["WR"].toString().toInt();
tWTR = mMemspecJson["memtimingspec"].toObject()["WTR"].toString().toInt();
tCKESR = mMemspecJson["memtimingspec"].toObject()["CKESR"].toString().toInt();
tCKE = mMemspecJson["memtimingspec"].toObject()["CKE"].toString().toInt();
tXP = mMemspecJson["memtimingspec"].toObject()["XP"].toString().toInt();
tXPDLL = mMemspecJson["memtimingspec"].toObject()["XPDLL"].toString().toInt();
tXS = mMemspecJson["memtimingspec"].toObject()["XS"].toString().toInt();
tXSDLL = mMemspecJson["memtimingspec"].toObject()["XSDLL"].toString().toInt();
tAL = mMemspecJson["memtimingspec"].toObject()["AL"].toString().toInt();
tRFC = mMemspecJson["memtimingspec"].toObject()["RFC"].toString().toInt();
tREFI = mMemspecJson["memtimingspec"].toObject()["REFI"].toString().toInt();
tRTRS = mMemspecJson["memtimingspec"].toObject()["RTRS"].toString().toInt();
tACTPDEN = mMemspecJson["memtimingspec"].toObject()["ACTPDEN"].toString().toInt();
tPRPDEN = mMemspecJson["memtimingspec"].toObject()["PRPDEN"].toString().toInt();
tREFPDEN = mMemspecJson["memtimingspec"].toObject()["REFPDEN"].toString().toInt();
tCKE = mMemspecJson["memtimingspec"].toObject()["CKE"].toString().toInt();
tRP = clk * mMemspecJson["memtimingspec"].toObject()["RP"].toInt();
tRAS = clk * mMemspecJson["memtimingspec"].toObject()["RAS"].toInt();
tRC = clk * mMemspecJson["memtimingspec"].toObject()["RC"].toInt();
tRTP = clk * mMemspecJson["memtimingspec"].toObject()["RTP"].toInt();
tRRD = clk * mMemspecJson["memtimingspec"].toObject()["RRD"].toInt();
tCCD = clk * mMemspecJson["memtimingspec"].toObject()["CCD"].toInt();
tRCD = clk * mMemspecJson["memtimingspec"].toObject()["RCD"].toInt();
tNAW = clk * mMemspecJson["memtimingspec"].toObject()["FAW"].toInt();
tRL = clk * mMemspecJson["memtimingspec"].toObject()["RL"].toInt();
tWL = clk * mMemspecJson["memtimingspec"].toObject()["WL"].toInt();
tWR = clk * mMemspecJson["memtimingspec"].toObject()["WR"].toInt();
tWTR = clk * mMemspecJson["memtimingspec"].toObject()["WTR"].toInt();
tCKESR = clk * mMemspecJson["memtimingspec"].toObject()["CKESR"].toInt();
tCKE = clk * mMemspecJson["memtimingspec"].toObject()["CKE"].toInt();
tXP = clk * mMemspecJson["memtimingspec"].toObject()["XP"].toInt();
tXPDLL = clk * mMemspecJson["memtimingspec"].toObject()["XPDLL"].toInt();
tXS = clk * mMemspecJson["memtimingspec"].toObject()["XS"].toInt();
tXSDLL = clk * mMemspecJson["memtimingspec"].toObject()["XSDLL"].toInt();
tAL = clk * mMemspecJson["memtimingspec"].toObject()["AL"].toInt();
tRFC = clk * mMemspecJson["memtimingspec"].toObject()["RFC"].toInt();
tREFI = clk * mMemspecJson["memtimingspec"].toObject()["REFI"].toInt();
tRTRS = clk * mMemspecJson["memtimingspec"].toObject()["RTRS"].toInt();
tACTPDEN = clk * mMemspecJson["memtimingspec"].toObject()["ACTPDEN"].toInt();
tPRPDEN = clk * mMemspecJson["memtimingspec"].toObject()["PRPDEN"].toInt();
tREFPDEN = clk * mMemspecJson["memtimingspec"].toObject()["REFPDEN"].toInt();
tCKE = clk * mMemspecJson["memtimingspec"].toObject()["CKE"].toInt();
tPD = tCKE;
tBURST = (uint) ((burstLength / (float) dataRate) * clk);

View File

@@ -5,7 +5,7 @@
class DDR3TimeDependencies : public DRAMTimeDependenciesIF {
public:
DDR3TimeDependencies(const QJsonObject& memspec);
DDR3TimeDependencies(const QJsonObject& memspec, const uint clk);
protected:
void mInitializeValues() override;

View File

@@ -3,8 +3,9 @@
#include <QJsonDocument>
DRAMTimeDependenciesIF::DRAMTimeDependenciesIF(const QJsonObject& memspec) {
DRAMTimeDependenciesIF::DRAMTimeDependenciesIF(const QJsonObject& memspec, const uint inClk) {
mMemspecJson = memspec;
clk = inClk;
}
@@ -34,16 +35,18 @@ DRAMTimeDependenciesIF::getDependencies(std::vector<QString>& dependencyFilter)
return dependenciesMap;
}
const QJsonObject DRAMTimeDependenciesIF::getMemspec(const TraceDB& tdb) {
const QJsonObject DRAMTimeDependenciesIF::getMemspec(const TraceDB& tdb, uint& clk) {
QSqlDatabase db = tdb.getDatabase();
QString query = "SELECT Memspec FROM GeneralInfo";
QString query = "SELECT clk, Memspec FROM GeneralInfo";
QSqlQuery sqlQuery = db.exec(query);
sqlQuery.next();
QString memSpecJson = sqlQuery.value(0).toString();
clk = sqlQuery.value(0).toInt();
QString memSpecJson = sqlQuery.value(1).toString();
sqlQuery.finish();
QJsonDocument jsonDocument = QJsonDocument::fromJson(memSpecJson.toUtf8());
return jsonDocument.object()["memspec"].toObject();
}

View File

@@ -38,12 +38,12 @@ typedef std::map<QString, PhaseTimeDependencies, QStringsComparator> DependencyM
class DRAMTimeDependenciesIF {
public:
DRAMTimeDependenciesIF(const QJsonObject& memspec);
DRAMTimeDependenciesIF(const QJsonObject& memspec, const uint clk);
virtual ~DRAMTimeDependenciesIF() = default;
DependencyMap getDependencies(std::vector<QString>& dependencyFilter) const;
static const QJsonObject getMemspec(const TraceDB& tdb);
static const QJsonObject getMemspec(const TraceDB& tdb, uint& clk);
const uint getClk() const { return clk; }
const uint getNAW() const { return nActivateWindow; };

View File

@@ -2,11 +2,12 @@
#include "dramtimedependencyfactory.h"
std::shared_ptr<DRAMTimeDependenciesIF> DRAMTimeDependencyFactory::make(const TraceDB& tdb) {
const QJsonObject& memspec = DRAMTimeDependenciesIF::getMemspec(tdb);
uint clk = 0;
const QJsonObject& memspec = DRAMTimeDependenciesIF::getMemspec(tdb, clk);
QString deviceType = memspec["memoryType"].toString();
if (deviceType == "DDR3") {
return std::make_shared<DDR3TimeDependencies>(memspec);
return std::make_shared<DDR3TimeDependencies>(memspec, clk);
} else {
// TODO maybe throw?

View File

@@ -3,15 +3,22 @@
void
PhaseDependenciesTracker::calculateDependencies(TraceDB& tdb, std::vector<QString>& commands) {
mBeginTransaction(tdb);
mDropTable(tdb);
mCreateTable(tdb);
auto& phases = mGetAllPhases(tdb, commands);
if (phases.size() == 0) {
mRollbackChanges(tdb);
}
auto& entries = mCalculateDependencies(tdb, phases, commands);
mInsertIntoTable(tdb, entries);
mCommitTransaction(tdb);
}
void PhaseDependenciesTracker::mDropTable(TraceDB& tdb) {
@@ -29,7 +36,7 @@ void PhaseDependenciesTracker::mCreateTable(TraceDB& tdb) {
}
void PhaseDependenciesTracker::mInsertIntoTable(TraceDB& tdb, const std::vector<DBDependencyEntry>& entries) {
static const size_t bulkInsertionSize = 1000;
static const size_t bulkInsertionSize = 200;
auto numberOfEntries = entries.size();
@@ -37,25 +44,33 @@ void PhaseDependenciesTracker::mInsertIntoTable(TraceDB& tdb, const std::vector<
size_t counter = 0;
for (const auto& entry : entries) {
if (counter == 0) {
// TODO Reset command string and add first command
command = "";
// Reset command string and add first entry
command = "INSERT INTO 'DirectDependencies' ('DelayedPhaseID', 'DelayedPhaseName', 'DependencyType', 'TimeDependency', 'DependencyPhaseID', 'DependencyPhaseName') ";
mAddFirstEntryCommandString(command, entry);
counter++;
} else if (counter == bulkInsertionSize) {
// TODO Write last command and submit
} else if (counter == bulkInsertionSize-1) {
// Write last entry and submit
mAddEntryCommandString(command, entry);
mExecuteQuery(tdb, command);
counter = 0;
} else {
// TODO
// Write entry
mAddEntryCommandString(command, entry);
counter++;
}
}
if (counter != 0) {
// TODO Submit command string
mExecuteQuery(tdb, command);
}
}
@@ -74,7 +89,7 @@ PhaseDependenciesTracker::mGetAllPhases(TraceDB& tdb, const std::vector<QString>
queryStr = queryStr + '\"' + cmd + "\",";
}
queryStr.back() = ')';
queryStr += " ORDER BY PhaseBegin ";
queryStr += " ORDER BY PhaseBegin; ";
auto query = mExecuteQuery(tdb, queryStr);
@@ -119,6 +134,7 @@ PhaseDependenciesTracker::mGetAllPhases(TraceDB& tdb, const std::vector<QString>
const std::vector<DBDependencyEntry>
PhaseDependenciesTracker::mCalculateDependencies(const TraceDB& tdb, const std::vector<std::shared_ptr<DBPhaseEntry>>& phases, std::vector<QString>& commands) {
std::vector<DBDependencyEntry> entries;
entries.reserve((size_t) (0.4 * phases.size()));
// Get dependencies for tdb device
auto device = DRAMTimeDependencyFactory::make(tdb);
@@ -146,7 +162,6 @@ PhaseDependenciesTracker::mCalculateDependencies(const TraceDB& tdb, const std::
const auto& otherPhase = phases[j];
// Calculates the time difference in nanoseconds
const auto timeDiff = phase->phaseBegin - otherPhase->phaseBegin;
// Time difference begin greater than the maximum possible dependency time ends the internal loop
if (timeDiff > deps.maxTime) break;
@@ -157,12 +172,11 @@ PhaseDependenciesTracker::mCalculateDependencies(const TraceDB& tdb, const std::
if (
dep.depType == DependencyType::IntraBank && cmdBank != otherPhase->tBank
|| dep.depType == DependencyType::IntraRank && cmdBank != otherPhase->tRank
|| dep.depType == DependencyType::IntraRank && cmdRank != otherPhase->tRank
|| dep.depType == DependencyType::InterRank && cmdRank == otherPhase->tRank // TODO - is this last comparison correct?
) {
continue;
}
if (dep.phaseDep == "NAW") {
if (otherPhase->phaseName == "ACT") {
if (timeDiff == dep.timeValue) {
@@ -226,3 +240,40 @@ QSqlQuery PhaseDependenciesTracker::mExecuteQuery(TraceDB& tdb, const QString qu
return query;
}
void PhaseDependenciesTracker::mBeginTransaction(TraceDB& tdb) {
const QString queryStr = "BEGIN TRANSACTION;";
mExecuteQuery(tdb, queryStr);
}
void PhaseDependenciesTracker::mRollbackChanges(TraceDB& tdb) {
const QString queryStr = "ROLLBACK;";
mExecuteQuery(tdb, queryStr);
}
void PhaseDependenciesTracker::mCommitTransaction(TraceDB& tdb) {
const QString queryStr = "COMMIT;";
mExecuteQuery(tdb, queryStr);
}
void PhaseDependenciesTracker::mAddFirstEntryCommandString(QString& command, const DBDependencyEntry& entry) {
command = command + " SELECT '" + QString::number(entry.delayedPhaseID) + "' AS 'DelayedPhaseID', '"
+ entry.delayedPhaseName + "' AS 'DelayedPhaseName', '"
+ entry.dependencyType + "' AS 'DependencyType', '"
+ entry.timeDependency + "' AS 'TimeDependency', '"
+ QString::number(entry.dependencyPhaseID) + "' AS 'DependencyPhaseID', '"
+ entry.dependencyPhaseName + "' AS 'DependencyPhaseName' ";
}
void PhaseDependenciesTracker::mAddEntryCommandString(QString& command, const DBDependencyEntry& entry) {
command = command + " UNION ALL SELECT '" + QString::number(entry.delayedPhaseID) + "', '"
+ entry.delayedPhaseName + "', '"
+ entry.dependencyType + "', '"
+ entry.timeDependency + "', '"
+ QString::number(entry.dependencyPhaseID) + "', '"
+ entry.dependencyPhaseName + "' ";
}

View File

@@ -43,4 +43,13 @@ private:
PhaseDependenciesTracker() = delete;
~PhaseDependenciesTracker() = delete;
private:
static void mBeginTransaction(TraceDB& tdb);
static void mRollbackChanges(TraceDB& tdb);
static void mCommitTransaction(TraceDB& tdb);
static void mAddFirstEntryCommandString(QString& command, const DBDependencyEntry& entry);
static void mAddEntryCommandString(QString& command, const DBDependencyEntry& entry);
};

View File

@@ -315,7 +315,7 @@ void TraceFileTab::on_calculateDependencies_clicked() {
// TODO - For now fixed, but must be selectable
std::vector<QString> dependencyFilter = {
"ACT",
"PREPB",
"PREPB",
"RD",
"RDA",
"WR",