Started adding manual code for DDR3 time dependencies.

This commit is contained in:
Iron Prando da Silva
2021-12-09 15:50:26 +01:00
parent 9771537441
commit fcab6a3145
9 changed files with 209 additions and 19 deletions

View File

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

View File

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

View File

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

View File

@@ -1,10 +1,10 @@
#include "timedependenciesIF.h"
#include "dramtimedependenciesIF.h"
#include <QJsonDocument>
DRAMTimeDependenciesIF::DRAMTimeDependenciesIF(const TraceDB& tdb) {
mGetMemspec(tdb);
DRAMTimeDependenciesIF::DRAMTimeDependenciesIF(const QJsonObject& memspec) {
mMemspecJson = memspec;
}
@@ -31,7 +31,7 @@ DRAMTimeDependenciesIF::getDependencies(std::vector<QString>& 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<TimeDependency>& dependencyList, const std::vector<QString>& dependencyFilter) const {
std::vector<TimeDependency> 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<TimeDependency>&
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<QString>& dependencyFilter) const {

View File

@@ -4,6 +4,10 @@
#include <algorithm>
#include <vector>
#include <map>
#include <QJsonDocument>
#include <QJsonValue>
#include <QJsonArray>
#include <QJsonObject>
#include "data/tracedb.h"
@@ -17,7 +21,8 @@ struct TimeDependency {
};
struct PhaseTimeDependencies {
QString phaseName;
explicit PhaseTimeDependencies(std::initializer_list<TimeDependency> d) : dependencies(d) {}
std::vector<TimeDependency> dependencies;
size_t maxTime;
};
@@ -32,11 +37,13 @@ typedef std::map<QString, PhaseTimeDependencies, QStringsComparator> DependencyM
class DRAMTimeDependenciesIF {
public:
DRAMTimeDependenciesIF(const TraceDB& tdb);
DRAMTimeDependenciesIF(const QJsonObject& memspec);
virtual ~DRAMTimeDependenciesIF() = default;
DependencyMap getDependencies(std::vector<QString>& dependencyFilter) const;
static const QJsonObject getMemspec(const TraceDB& tdb);
protected:
void mFilterDependencyList(std::vector<TimeDependency>& dependencyList, const std::vector<QString>& dependencyFilter) const;
void mFilterDependencyMap(DependencyMap& dependencyMap, const std::vector<QString>& 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; } ;
};

View File

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

View File

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

View File

@@ -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<std::str
}
const std::vector<DBDependencyEntry>
PhaseDependenciesTracker::mCalculateDependencies(const std::vector<std::shared_ptr<DBPhaseEntry>>& transactions) {
PhaseDependenciesTracker::mCalculateDependencies(const TraceDB& tdb, const std::vector<std::shared_ptr<DBPhaseEntry>>& transactions) {
std::vector<DBDependencyEntry> entries;
// TODO Get dependency object for specific trace
DRAMTimeDependenciesIF deviceDependencies = DRAMTimeDependencyFactory::make(tdb);
// TODO Main dependency calculation loop
return entries;

View File

@@ -6,6 +6,7 @@
#include <QString>
#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<DBDependencyEntry>& entries);
static const std::vector<std::shared_ptr<DBPhaseEntry>> mGetAllPhases(TraceDB& tdb, const std::vector<std::string>& commands);
static const std::vector<DBDependencyEntry> mCalculateDependencies(const std::vector<std::shared_ptr<DBPhaseEntry>>& phases);
static const std::vector<DBDependencyEntry> mCalculateDependencies(const TraceDB& tdb, const std::vector<std::shared_ptr<DBPhaseEntry>>& phases);
static QSqlQuery mExecuteQuery(TraceDB& tdb, const QString queryStr);