Started adding manual code for DDR3 time dependencies.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
};
|
||||
@@ -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 {
|
||||
@@ -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; } ;
|
||||
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user