Added dependency calculations. Still missing tests and interface.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
class DDR3TimeDependencies : public DRAMTimeDependenciesIF {
|
||||
public:
|
||||
DDR3TimeDependencies(const QJsonObject& memspec);
|
||||
DDR3TimeDependencies(const QJsonObject& memspec, const uint clk);
|
||||
|
||||
protected:
|
||||
void mInitializeValues() override;
|
||||
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
@@ -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; };
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -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 + "' ";
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
};
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user