diff --git a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.cpp b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.cpp index 5b494732..1b59a3eb 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.cpp @@ -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); diff --git a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.h b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.h index 53568c34..7c8a30f4 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.h +++ b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.h @@ -5,7 +5,7 @@ class DDR3TimeDependencies : public DRAMTimeDependenciesIF { public: - DDR3TimeDependencies(const QJsonObject& memspec); + DDR3TimeDependencies(const QJsonObject& memspec, const uint clk); protected: void mInitializeValues() override; diff --git a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependenciesIF.cpp b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependenciesIF.cpp index 0960d646..40f43b6a 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependenciesIF.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependenciesIF.cpp @@ -3,8 +3,9 @@ #include -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& 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(); } diff --git a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependenciesIF.h b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependenciesIF.h index cc818162..bd495583 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependenciesIF.h +++ b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependenciesIF.h @@ -38,12 +38,12 @@ typedef std::map DependencyM class DRAMTimeDependenciesIF { public: - DRAMTimeDependenciesIF(const QJsonObject& memspec); + DRAMTimeDependenciesIF(const QJsonObject& memspec, const uint clk); virtual ~DRAMTimeDependenciesIF() = default; DependencyMap getDependencies(std::vector& 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; }; diff --git a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependencyfactory.cpp b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependencyfactory.cpp index 65f41cc7..1586406f 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependencyfactory.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependencyfactory.cpp @@ -2,11 +2,12 @@ #include "dramtimedependencyfactory.h" std::shared_ptr 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(memspec); + return std::make_shared(memspec, clk); } else { // TODO maybe throw? diff --git a/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp index 7a18e978..2f0a8e45 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp @@ -3,15 +3,22 @@ void PhaseDependenciesTracker::calculateDependencies(TraceDB& tdb, std::vector& 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& 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 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 const std::vector PhaseDependenciesTracker::mCalculateDependencies(const TraceDB& tdb, const std::vector>& phases, std::vector& commands) { std::vector 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 + "' "; +} diff --git a/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h index a01c537a..17d5ecda 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h +++ b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h @@ -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); + }; diff --git a/DRAMSys/traceAnalyzer/tracefiletab.cpp b/DRAMSys/traceAnalyzer/tracefiletab.cpp index c5e9df52..c922b299 100644 --- a/DRAMSys/traceAnalyzer/tracefiletab.cpp +++ b/DRAMSys/traceAnalyzer/tracefiletab.cpp @@ -315,7 +315,7 @@ void TraceFileTab::on_calculateDependencies_clicked() { // TODO - For now fixed, but must be selectable std::vector dependencyFilter = { "ACT", - "PREPB", + "PREPB", "RD", "RDA", "WR",