diff --git a/DRAMSys/traceAnalyzer/CMakeLists.txt b/DRAMSys/traceAnalyzer/CMakeLists.txt index 0216e6da..84026164 100644 --- a/DRAMSys/traceAnalyzer/CMakeLists.txt +++ b/DRAMSys/traceAnalyzer/CMakeLists.txt @@ -99,11 +99,9 @@ add_executable(TraceAnalyzer businessObjects/pythoncaller.cpp businessObjects/tracetestresults.cpp presentation/tracemetrictreewidget.cpp - businessObjects/phasedependenciestracker.cpp businessObjects/phases/phase.cpp businessObjects/phases/phasedependency.cpp businessObjects/phases/dependencyinfos.cpp - businessObjects/dramTimeDependencies/timedependenciesIF.cpp presentation/tracedrawingproperties.cpp presentation/util/traceplotline.cpp presentation/util/traceplotlinecache.cpp @@ -113,6 +111,11 @@ add_executable(TraceAnalyzer businessObjects/commentmodel.cpp simulationdialog.cpp + businessObjects/dramTimeDependencies/dramtimedependenciesIF.cpp + businessObjects/dramTimeDependencies/DDR3TimeDependencies.cpp + businessObjects/dramTimeDependencies/dramtimedependencyfactory.cpp + businessObjects/phasedependenciestracker.cpp + selectmetrics.ui preferences.ui evaluationtool.ui diff --git a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.cpp b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.cpp new file mode 100644 index 00000000..e1e375cf --- /dev/null +++ b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.cpp @@ -0,0 +1,80 @@ + +#include "DDR3TimeDependencies.h" + +DDR3TimeDependencies::DDR3TimeDependencies(const QJsonObject& memspec) : DRAMTimeDependenciesIF(memspec) { + mInitializeValues(); +} + +void DDR3TimeDependencies::mInitializeValues() { + burstLength = mMemspecJson["memarchitecturespec"].toObject()["burstLength"].toString().toLongLong(); + dataRate = mMemspecJson["memarchitecturespec"].toObject()["dataRate"].toString().toLongLong(); + clk = mMemspecJson["memarchitecturespec"].toArray()[0].toString().toLongLong(); + + nActivateWindow = 4; + + tRP = mMemspecJson["memtimingspec"].toObject()["RP"].toString().toLongLong(); + tRAS = mMemspecJson["memtimingspec"].toObject()["RAS"].toString().toLongLong(); + tRC = mMemspecJson["memtimingspec"].toObject()["RC"].toString().toLongLong(); + tRTP = mMemspecJson["memtimingspec"].toObject()["RTP"].toString().toLongLong(); + tRRD = mMemspecJson["memtimingspec"].toObject()["RRD"].toString().toLongLong(); + tCCD = mMemspecJson["memtimingspec"].toObject()["CCD"].toString().toLongLong(); + tRCD = mMemspecJson["memtimingspec"].toObject()["RCD"].toString().toLongLong(); + tNAW = mMemspecJson["memtimingspec"].toObject()["NAW"].toString().toLongLong(); + tRL = mMemspecJson["memtimingspec"].toObject()["RL"].toString().toLongLong(); + tWL = mMemspecJson["memtimingspec"].toObject()["WL"].toString().toLongLong(); + tWR = mMemspecJson["memtimingspec"].toObject()["WR"].toString().toLongLong(); + tWTR = mMemspecJson["memtimingspec"].toObject()["WTR"].toString().toLongLong(); + tCKESR = mMemspecJson["memtimingspec"].toObject()["CKESR"].toString().toLongLong(); + tCKE = mMemspecJson["memtimingspec"].toObject()["CKE"].toString().toLongLong(); + tXP = mMemspecJson["memtimingspec"].toObject()["XP"].toString().toLongLong(); + tXPDLL = mMemspecJson["memtimingspec"].toObject()["XPDLL"].toString().toLongLong(); + tXS = mMemspecJson["memtimingspec"].toObject()["XS"].toString().toLongLong(); + tXSDLL = mMemspecJson["memtimingspec"].toObject()["XSDLL"].toString().toLongLong(); + tAL = mMemspecJson["memtimingspec"].toObject()["AL"].toString().toLongLong(); + tRFC = mMemspecJson["memtimingspec"].toObject()["RFC"].toString().toLongLong(); + tREFI = mMemspecJson["memtimingspec"].toObject()["REFI"].toString().toLongLong(); + tRTRS = mMemspecJson["memtimingspec"].toObject()["RTRS"].toString().toLongLong(); + tACTPDEN = mMemspecJson["memtimingspec"].toObject()["ACTPDEN"].toString().toLongLong(); + tPRPDEN = mMemspecJson["memtimingspec"].toObject()["PRPDEN"].toString().toLongLong(); + tREFPDEN = mMemspecJson["memtimingspec"].toObject()["REFPDEN"].toString().toLongLong(); + tCKE = mMemspecJson["memtimingspec"].toObject()["CKE"].toString().toLongLong(); + + tPD = tCKE; + tBURST = (int) ((burstLength / dataRate) * clk); + tRDWR = tRL + tBURST + 2 * clk - tWL; + tRDWR_R = tRL + tBURST + tRTRS - tWL; + tWRRD = tWL + tBURST + tWTR; + tWRRD_R = tWL + tBURST + tRTRS - tRL; + tWRPRE = tWL + tBURST + tWR; + tRDPDEN = tRL + tBURST + clk; + tWRPDEN = tWL + tBURST + tWR; + tWRAPDEN = tWL + tBURST + tWR + clk; +} + +DependencyMap DDR3TimeDependencies::mSpecializedGetDependencies() const { + DependencyMap dmap; + + dmap.emplace( + std::piecewise_construct, + std::forward_as_tuple("ACT"), + std::forward_as_tuple( + std::initializer_list{ + TimeDependency{tRC, "ACT", DependencyType::IntraBank, "tRC"}, + TimeDependency{tAL + tRTP + tRP, "RDA", DependencyType::IntraBank, "tAL + tRTP + tRP"}, + TimeDependency{tWRPRE + tRP, "WRA", DependencyType::IntraBank, "tWRPRE + tRP"}, + TimeDependency{tRP, "PRE", DependencyType::IntraBank, "tRP"}, + TimeDependency{tRRD, "ACT", DependencyType::IntraRank, "tRRD"}, + TimeDependency{tRP, "PREA", DependencyType::IntraRank, "tRP"}, + TimeDependency{tXP, "PDXA", DependencyType::IntraRank, "tXP"}, + TimeDependency{tXP, "PDXP", DependencyType::IntraRank, "tXP"}, + TimeDependency{tRFC, "REFA", DependencyType::IntraRank, "tRFC"}, + TimeDependency{tXS, "SREFEX", DependencyType::IntraRank, "tXS"}, + TimeDependency{tNAW, "NAW", DependencyType::IntraRank, "tNAW"} + } + ) + ); + + // TODO add all the rest + + return dmap; +} \ No newline at end of file diff --git a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.h b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.h new file mode 100644 index 00000000..793b50f1 --- /dev/null +++ b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/DDR3TimeDependencies.h @@ -0,0 +1,59 @@ + +#pragma once + +#include "dramtimedependenciesIF.h" + +class DDR3TimeDependencies : public DRAMTimeDependenciesIF { +public: + DDR3TimeDependencies(const QJsonObject& memspec); + +protected: + void mInitializeValues() override; + DependencyMap mSpecializedGetDependencies() const override; + +protected: + size_t burstLength; + size_t dataRate; + size_t clk; + + size_t nActivateWindow; + + size_t tRP; + size_t tRAS; + size_t tRC; + size_t tRTP; + size_t tRRD; + size_t tCCD; + size_t tRCD; + size_t tNAW; + size_t tRL; + size_t tWL; + size_t tWR; + size_t tWTR; + size_t tCKESR; + size_t tCKE; + size_t tXP; + size_t tXPDLL; + size_t tXS; + size_t tXSDLL; + size_t tAL; + size_t tRFC; + size_t tREFI; + size_t tRTRS; + + size_t tACTPDEN; + size_t tPRPDEN; + size_t tREFPDEN; + + size_t tPD; + size_t tBURST; + size_t tRDWR; + size_t tRDWR_R; + size_t tWRRD; + size_t tWRRD_R; + size_t tWRPRE; + size_t tRDPDEN; + size_t tWRPDEN; + size_t tWRAPDEN; + +}; diff --git a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/timedependenciesIF.cpp b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependenciesIF.cpp similarity index 85% rename from DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/timedependenciesIF.cpp rename to DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependenciesIF.cpp index 692c87c4..c740a801 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/timedependenciesIF.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependenciesIF.cpp @@ -1,10 +1,10 @@ -#include "timedependenciesIF.h" +#include "dramtimedependenciesIF.h" #include -DRAMTimeDependenciesIF::DRAMTimeDependenciesIF(const TraceDB& tdb) { - mGetMemspec(tdb); +DRAMTimeDependenciesIF::DRAMTimeDependenciesIF(const QJsonObject& memspec) { + mMemspecJson = memspec; } @@ -31,7 +31,7 @@ DRAMTimeDependenciesIF::getDependencies(std::vector& dependencyFilter) return dependenciesMap; } -void DRAMTimeDependenciesIF::mGetMemspec(const TraceDB& tdb) { +const QJsonObject DRAMTimeDependenciesIF::getMemspec(const TraceDB& tdb) { QSqlDatabase db = tdb.getDatabase(); QString query = "SELECT Memspec FROM GeneralInfo"; QSqlQuery sqlQuery = db.exec(query); @@ -41,13 +41,16 @@ void DRAMTimeDependenciesIF::mGetMemspec(const TraceDB& tdb) { sqlQuery.finish(); QJsonDocument jsonDocument = QJsonDocument::fromJson(memSpecJson.toUtf8()); - mMemspecJson = jsonDocument.object()["memspec"].toObject(); + return jsonDocument.object()["memspec"].toObject(); } void DRAMTimeDependenciesIF::mFilterDependencyList(std::vector& dependencyList, const std::vector& dependencyFilter) const { std::vector newDepList(dependencyList.size()); + // TODO - probably there is a smarter way to filter these values, + // although the lists are not to be greater than 20-50 elements + std::copy_if( dependencyList.begin(), dependencyList.end(), @@ -70,6 +73,14 @@ void DRAMTimeDependenciesIF::mFilterDependencyList(std::vector& dependencyList = newDepList; + std::sort( + dependencyList.begin(), + dependencyList.end(), + [](const TimeDependency& v1, const TimeDependency& v2) { + return v1.timeValue < v2.timeValue; + } + ); + } void DRAMTimeDependenciesIF::mFilterDependencyMap(DependencyMap& dependencyMap, const std::vector& dependencyFilter) const { diff --git a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/timedependenciesIF.h b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependenciesIF.h similarity index 72% rename from DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/timedependenciesIF.h rename to DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependenciesIF.h index a9bbde13..7071ef84 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/timedependenciesIF.h +++ b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependenciesIF.h @@ -4,6 +4,10 @@ #include #include #include + +#include +#include +#include #include #include "data/tracedb.h" @@ -17,7 +21,8 @@ struct TimeDependency { }; struct PhaseTimeDependencies { - QString phaseName; + explicit PhaseTimeDependencies(std::initializer_list d) : dependencies(d) {} + std::vector dependencies; size_t maxTime; }; @@ -32,11 +37,13 @@ typedef std::map DependencyM class DRAMTimeDependenciesIF { public: - DRAMTimeDependenciesIF(const TraceDB& tdb); + DRAMTimeDependenciesIF(const QJsonObject& memspec); virtual ~DRAMTimeDependenciesIF() = default; DependencyMap getDependencies(std::vector& dependencyFilter) const; + static const QJsonObject getMemspec(const TraceDB& tdb); + protected: void mFilterDependencyList(std::vector& dependencyList, const std::vector& dependencyFilter) const; void mFilterDependencyMap(DependencyMap& dependencyMap, const std::vector& dependencyFilter) const; @@ -45,13 +52,10 @@ protected: protected: QJsonObject mMemspecJson; -// To be implemented +// To be implemented by the specializing class protected: - virtual void mInitializeValues() = 0; - virtual DependencyMap mSpecializedGetDependencies() const = 0; - -private: - void mGetMemspec(const TraceDB& tdb); + virtual void mInitializeValues() {} ; + virtual DependencyMap mSpecializedGetDependencies() const { DependencyMap map; return map; } ; }; diff --git a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependencyfactory.cpp b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependencyfactory.cpp new file mode 100644 index 00000000..f9c72c91 --- /dev/null +++ b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependencyfactory.cpp @@ -0,0 +1,17 @@ + +#include "dramtimedependencyfactory.h" + +DRAMTimeDependenciesIF DRAMTimeDependencyFactory::make(const TraceDB& tdb) { + const QJsonObject& memspec = DRAMTimeDependenciesIF::getMemspec(tdb); + QString deviceType = memspec["memspec"]["memoryType"].toString(); + + if (deviceType == "DDR3") { + return DDR3TimeDependencies(memspec); + + } else { + // TODO maybe throw? + return DRAMTimeDependenciesIF(memspec); + + } + +} diff --git a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependencyfactory.h b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependencyfactory.h new file mode 100644 index 00000000..d6232ffe --- /dev/null +++ b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/dramtimedependencyfactory.h @@ -0,0 +1,15 @@ + +#pragma once + +#include "dramtimedependenciesIF.h" +#include "DDR3TimeDependencies.h" +#include "data/tracedb.h" + +class DRAMTimeDependencyFactory { +public: + static DRAMTimeDependenciesIF make(const TraceDB& tdb); + +private: + DRAMTimeDependencyFactory() = delete; + ~DRAMTimeDependencyFactory() = delete; +}; diff --git a/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp index 667a046d..984a8886 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp @@ -8,7 +8,7 @@ PhaseDependenciesTracker::calculateDependencies(TraceDB& tdb, const std::vector< auto& phases = mGetAllPhases(tdb, commands); - auto& entries = mCalculateDependencies(phases); + auto& entries = mCalculateDependencies(tdb, phases); mInsertIntoTable(tdb, entries); @@ -117,10 +117,10 @@ PhaseDependenciesTracker::mGetAllPhases(TraceDB& tdb, const std::vector -PhaseDependenciesTracker::mCalculateDependencies(const std::vector>& transactions) { +PhaseDependenciesTracker::mCalculateDependencies(const TraceDB& tdb, const std::vector>& transactions) { std::vector entries; - // TODO Get dependency object for specific trace + DRAMTimeDependenciesIF deviceDependencies = DRAMTimeDependencyFactory::make(tdb); // TODO Main dependency calculation loop return entries; diff --git a/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h index fcfe7021..a46d6c05 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h +++ b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h @@ -6,6 +6,7 @@ #include #include "data/tracedb.h" +#include "dramTimeDependencies/dramtimedependencyfactory.h" struct DBPhaseEntry { size_t id; @@ -36,7 +37,7 @@ private: static void mInsertIntoTable(TraceDB& tdb, const std::vector& entries); static const std::vector> mGetAllPhases(TraceDB& tdb, const std::vector& commands); - static const std::vector mCalculateDependencies(const std::vector>& phases); + static const std::vector mCalculateDependencies(const TraceDB& tdb, const std::vector>& phases); static QSqlQuery mExecuteQuery(TraceDB& tdb, const QString queryStr);