From b8dff6208c132bacf567100ab4a492cabaadb843 Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Mon, 6 Dec 2021 17:06:14 +0100 Subject: [PATCH] Add new commands and DB fields on TA side. --- .../businessObjects/commandlengths.h | 66 +++-- .../businessObjects/generalinfo.h | 54 ++-- .../businessObjects/phases/phase.cpp | 41 +-- .../businessObjects/phases/phase.h | 190 +++++++----- .../businessObjects/phases/phasefactory.cpp | 85 +++--- .../businessObjects/phases/phasefactory.h | 4 +- DRAMSys/traceAnalyzer/data/tracedb.cpp | 270 ++++++++++++------ DRAMSys/traceAnalyzer/data/tracedb.h | 20 +- .../presentation/tracedrawingproperties.cpp | 13 +- .../presentation/tracedrawingproperties.h | 20 +- .../traceAnalyzer/presentation/traceplot.cpp | 7 +- .../presentation/tracescroller.cpp | 7 +- 12 files changed, 475 insertions(+), 302 deletions(-) diff --git a/DRAMSys/traceAnalyzer/businessObjects/commandlengths.h b/DRAMSys/traceAnalyzer/businessObjects/commandlengths.h index 7048a0d0..8cfd421b 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/commandlengths.h +++ b/DRAMSys/traceAnalyzer/businessObjects/commandlengths.h @@ -38,40 +38,48 @@ struct CommandLengths { - unsigned NOP; - unsigned RD; - unsigned WR; - unsigned RDA; - unsigned WRA; - unsigned ACT; - unsigned PRE; - unsigned REFB; - unsigned PRESB; - unsigned REFSB; - unsigned RFMSB; - unsigned PREA; - unsigned REFA; - unsigned RFMAB; - unsigned PDEA; - unsigned PDXA; - unsigned PDEP; - unsigned PDXP; - unsigned SREFEN; - unsigned SREFEX; + unsigned NOP = 1; + unsigned RD = 1; + unsigned WR = 1; + unsigned RDA = 1; + unsigned WRA = 1; + unsigned ACT = 1; + unsigned PREPB = 1; + unsigned REFPB = 1; + unsigned RFMPB = 1; + unsigned REFP2B = 1; + unsigned RFMP2B = 1; + unsigned PRESB = 1; + unsigned REFSB = 1; + unsigned RFMSB = 1; + unsigned PREAB = 1; + unsigned REFAB = 1; + unsigned RFMAB = 1; + unsigned PDEA = 1; + unsigned PDXA = 1; + unsigned PDEP = 1; + unsigned PDXP = 1; + unsigned SREFEN = 1; + unsigned SREFEX = 1; CommandLengths(unsigned NOP, unsigned RD, unsigned WR, unsigned RDA, unsigned WRA, unsigned ACT, - unsigned PRE, unsigned REFB, unsigned PRESB, - unsigned REFSB, unsigned RFMSB, unsigned PREA, - unsigned REFA, unsigned RFMAB, unsigned PDEA, - unsigned PDXA, unsigned PDEP, unsigned PDXP, + unsigned PREPB, unsigned REFPB, unsigned RFMPB, + unsigned REFP2B, unsigned RFMP2B, + unsigned PRESB, unsigned REFSB, unsigned RFMSB, + unsigned PREAB, unsigned REFAB, unsigned RFMAB, + unsigned PDEA, unsigned PDXA, unsigned PDEP, unsigned PDXP, unsigned SREFEN, unsigned SREFEX) : - NOP(NOP), RD(RD), WR(WR), RDA(RDA), WRA(WRA), ACT(ACT), PRE(PRE), - REFB(REFB), PRESB(PRESB), REFSB(REFSB), RFMSB(RFMSB), PREA(PREA), - REFA(REFA), RFMAB(RFMAB), PDEA(PDEA), PDXA(PDXA), PDEP(PDEP), - PDXP(PDXP), SREFEN(SREFEN), SREFEX(SREFEX) {} + NOP(NOP), RD(RD), WR(WR), + RDA(RDA), WRA(WRA), ACT(ACT), + PREPB(PREPB), REFPB(REFPB), RFMPB(RFMPB), + REFP2B(REFP2B), RFMP2B(RFMP2B), + PRESB(PRESB), REFSB(REFSB), RFMSB(RFMSB), + PREAB(PREAB), REFAB(REFAB), RFMAB(RFMAB), + PDEA(PDEA), PDXA(PDXA), PDEP(PDEP), PDXP(PDXP), + SREFEN(SREFEN), SREFEX(SREFEX) {} - CommandLengths() {} + CommandLengths() = default; }; #endif // COMMANDLENGTHS_H diff --git a/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h b/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h index b6108c3e..7eb8e8d2 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h +++ b/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h @@ -38,36 +38,44 @@ #ifndef GENERALINFO_H #define GENERALINFO_H + #include "timespan.h" #include struct GeneralInfo { -public: - unsigned int numberOfTransactions; - unsigned int numberOfPhases; - Timespan span; - unsigned int numberOfRanks; - unsigned int numberOfBankgroups; - unsigned int numberOfBanks; - unsigned int banksPerRank; - unsigned int groupsPerRank; - unsigned int banksPerGroup; - QString unitOfTime; - unsigned int clkPeriod; - unsigned int windowSize; - unsigned int controllerThread; + uint64_t numberOfTransactions = 0; + uint64_t numberOfPhases = 0; + Timespan span = 0; + unsigned int numberOfRanks = 1; + unsigned int numberOfBankGroups = 1; + unsigned int numberOfBanks = 1; + unsigned int banksPerRank = 1; + unsigned int groupsPerRank = 1; + unsigned int banksPerGroup = 1; + QString description = "empty"; + QString unitOfTime = "PS"; + uint64_t clkPeriod = 1000; + uint64_t windowSize = 0; + unsigned int refreshMaxPostponed = 0; + unsigned int refreshMaxPulledin = 0; + uint64_t controllerThread = UINT64_MAX; + unsigned int maxBufferDepth = 8; + unsigned int per2BankOffset = 1; - GeneralInfo(unsigned int numberOfTransactions, unsigned int numberOfPhases, Timespan span, + GeneralInfo() = default; + GeneralInfo(uint64_t numberOfTransactions, uint64_t numberOfPhases, Timespan span, unsigned int numberOfRanks, unsigned int numberOfBankgroups, unsigned int numberOfBanks, - QString unitOfTime, unsigned int clkPeriod, unsigned int windowSize, unsigned int controllerThread) - : numberOfTransactions(numberOfTransactions), numberOfPhases(numberOfPhases), span(span), - numberOfRanks(numberOfRanks), numberOfBankgroups(numberOfBankgroups), numberOfBanks(numberOfBanks), - banksPerRank(numberOfBanks / numberOfRanks), groupsPerRank(numberOfBankgroups / numberOfRanks), - banksPerGroup(numberOfBanks / numberOfBankgroups), unitOfTime(unitOfTime), clkPeriod(clkPeriod), - windowSize(windowSize), controllerThread(controllerThread) - { - } + QString description, QString unitOfTime, uint64_t clkPeriod, uint64_t windowSize, + unsigned int refreshMaxPostponed, unsigned int refreshMaxPulledin, + uint64_t controllerThread, unsigned int maxBufferDepth, unsigned int per2BankOffset) : + numberOfTransactions(numberOfTransactions) , numberOfPhases(numberOfPhases), span(span), + numberOfRanks(numberOfRanks), numberOfBankGroups(numberOfBankgroups), numberOfBanks(numberOfBanks), + banksPerRank(numberOfBanks / numberOfRanks), groupsPerRank(numberOfBankgroups / numberOfRanks), + banksPerGroup(numberOfBanks / numberOfBankgroups), description(std::move(description)), + unitOfTime(std::move(unitOfTime)), clkPeriod(clkPeriod), windowSize(windowSize), + refreshMaxPostponed(refreshMaxPostponed), refreshMaxPulledin(refreshMaxPulledin), + controllerThread(controllerThread), maxBufferDepth(maxBufferDepth), per2BankOffset(per2BankOffset) {} }; #endif // GENERALINFO_H diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp index 15ec782a..0c13f1fd 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp @@ -43,8 +43,6 @@ #include "businessObjects/transaction.h" #include -using namespace std; - void Phase::draw(QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, bool highlight, const TraceDrawingProperties &drawingProperties) const @@ -179,20 +177,16 @@ void Phase::drawPhaseDependencies(traceTime begin, traceTime end, double y, QColor Phase::getColor(const TraceDrawingProperties &drawingProperties) const { - switch (drawingProperties.colorGrouping) { - case ColorGrouping::PhaseType: - return getPhaseColor(); - break; - case ColorGrouping::Thread: - return ColorGenerator::getColor(static_cast(transaction.lock()->thread)); - break; - case ColorGrouping::AlphaTransaction: - return ColorGenerator::getAlphaColored(transaction.lock()->id); - - break; - case ColorGrouping::Transaction: - default: - return ColorGenerator::getColor(transaction.lock()->id); + switch (drawingProperties.colorGrouping) + { + case ColorGrouping::PhaseType: + return getPhaseColor(); + case ColorGrouping::Thread: + return ColorGenerator::getColor(static_cast(transaction.lock()->thread)); + case ColorGrouping::AlphaTransaction: + return ColorGenerator::getAlphaColored(transaction.lock()->id); + case ColorGrouping::Transaction: default: + return ColorGenerator::getColor(transaction.lock()->id); } } @@ -252,13 +246,22 @@ std::vector> Phase::getTracePlotLines(const Trace return drawingProperties.getBankLinesGroupwise(transaction.lock()->rank, transaction.lock()->bank % drawingProperties.banksPerGroup); } + else if (getGranularity() == Granularity::TwoBankwise) + { + unsigned int firstGroup = transaction.lock()->bank / drawingProperties.banksPerGroup; + unsigned int firstBank = transaction.lock()->bank % drawingProperties.banksPerGroup; + unsigned int secondGroup = (transaction.lock()->bank + drawingProperties.per2BankOffset) + / drawingProperties.banksPerGroup; + unsigned int secondBank = (transaction.lock()->bank + drawingProperties.per2BankOffset) + % drawingProperties.banksPerGroup; + return drawingProperties.getBankLinesTwoBankwise(transaction.lock()->rank, firstGroup, firstBank, secondGroup, + secondBank); + } else // if (getGranularity() == Granularity::Bankwise) { return drawingProperties.getBankLines(transaction.lock()->rank, transaction.lock()->bankgroup % drawingProperties.groupsPerRank, - transaction.lock()->bank - % drawingProperties.banksPerRank - % drawingProperties.banksPerGroup); + transaction.lock()->bank % drawingProperties.banksPerGroup); } } diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h index feb7b99a..3f05b8d2 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h @@ -106,7 +106,7 @@ protected: virtual std::vector> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const; - enum class Granularity {Bankwise, Groupwise, Rankwise}; + enum class Granularity {Bankwise, TwoBankwise, Groupwise, Rankwise}; virtual Granularity getGranularity() const { @@ -121,15 +121,15 @@ class REQ : public Phase public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(1); } - virtual QString Name() const final + QString Name() const final { return "REQ"; } - virtual std::vector> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const + std::vector> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const override { return drawingProperties.getRequestLines(); @@ -142,22 +142,22 @@ class RESP : public Phase public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(1); } - virtual QString Name() const override + QString Name() const override { return "RESP"; } - virtual std::vector> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const + std::vector> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const override { return drawingProperties.getResponseLines(); } }; - +/* class PREB: public Phase { public: @@ -172,19 +172,19 @@ protected: return "PREB"; } }; - -class PRE : public Phase +*/ +class PREPB : public Phase { public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(1); } - virtual QString Name() const override + QString Name() const override { - return "PRE"; + return "PREPB"; } }; @@ -193,7 +193,7 @@ class PRESB : public Phase public: using Phase::Phase; protected: - virtual QString Name() const override + QString Name() const override { return "PRESB"; } @@ -201,49 +201,49 @@ protected: { return {span.Begin()}; } - virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const + QColor getColor(const TraceDrawingProperties &drawingProperties) const override { Q_UNUSED(drawingProperties) return getPhaseColor(); } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(1); } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Groupwise; } }; -class PREA : public Phase +class PREAB : public Phase { public: using Phase::Phase; protected: - virtual QString Name() const override + QString Name() const override { - return "PREA"; + return "PREAB"; } virtual std::vector getTimesOnCommandBus() const { return {span.Begin()}; } - virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const + QColor getColor(const TraceDrawingProperties &drawingProperties) const override { Q_UNUSED(drawingProperties) return getPhaseColor(); } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(10); } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Rankwise; } }; - +/* class ACTB : public Phase { public: @@ -258,17 +258,17 @@ protected: return "ACTB"; } }; - +*/ class ACT : public Phase { public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(3); } - virtual QString Name() const override + QString Name() const override { return "ACT"; } @@ -279,11 +279,11 @@ class RD : public Phase public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(4); } - virtual QString Name() const override + QString Name() const override { return "RD"; } @@ -294,11 +294,11 @@ class RDA : public Phase public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(5); } - virtual QString Name() const override + QString Name() const override { return "RDA"; } @@ -309,11 +309,11 @@ class WR : public Phase public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(6); } - virtual QString Name() const override + QString Name() const override { return "WR"; } @@ -324,11 +324,11 @@ class WRA : public Phase public: using Phase::Phase; protected: - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { return ColorGenerator::getColor(7); } - virtual QString Name() const override + QString Name() const override { return "WRA"; } @@ -339,7 +339,7 @@ class AUTO_REFRESH : public Phase public: using Phase::Phase; protected: - virtual QString Name() const override + QString Name() const override { return "REF"; } @@ -347,12 +347,12 @@ protected: { return {span.Begin()}; } - virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const + QColor getColor(const TraceDrawingProperties &drawingProperties) const override { Q_UNUSED(drawingProperties) return getPhaseColor(); } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { QColor phaseColor = QColor(Qt::darkCyan); phaseColor.setAlpha(130); @@ -360,16 +360,16 @@ protected: } }; -class REFA : public AUTO_REFRESH +class REFAB : public AUTO_REFRESH { public: using AUTO_REFRESH::AUTO_REFRESH; protected: - virtual QString Name() const override + QString Name() const override { - return "REFA"; + return "REFAB"; } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Rankwise; } @@ -380,15 +380,15 @@ class RFMAB : public AUTO_REFRESH public: using AUTO_REFRESH::AUTO_REFRESH; protected: - virtual QString Name() const override + QString Name() const override { return "RFMAB"; } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Rankwise; } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { QColor phaseColor = QColor(Qt::darkRed); phaseColor.setAlpha(130); @@ -397,14 +397,50 @@ protected: }; -class REFB : public AUTO_REFRESH +class REFPB : public AUTO_REFRESH { public: using AUTO_REFRESH::AUTO_REFRESH; protected: - virtual QString Name() const override + QString Name() const override { - return "REFB"; + return "REFPB"; + } +}; + +class REFP2B : public AUTO_REFRESH +{ +public: + using AUTO_REFRESH::AUTO_REFRESH; +protected: + QString Name() const override + { + return "REFP2B"; + } + Granularity getGranularity() const override + { + return Granularity::TwoBankwise; + } +}; + +class RFMP2B : public AUTO_REFRESH +{ +public: + using AUTO_REFRESH::AUTO_REFRESH; +protected: + QString Name() const override + { + return "RFMP2B"; + } + Granularity getGranularity() const override + { + return Granularity::TwoBankwise; + } + QColor getPhaseColor() const override + { + QColor phaseColor = QColor(Qt::darkRed); + phaseColor.setAlpha(130); + return phaseColor; } }; @@ -413,11 +449,11 @@ class REFSB : public AUTO_REFRESH public: using AUTO_REFRESH::AUTO_REFRESH; protected: - virtual QString Name() const override + QString Name() const override { return "REFSB"; } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Groupwise; } @@ -428,15 +464,15 @@ class RFMSB : public AUTO_REFRESH public: using AUTO_REFRESH::AUTO_REFRESH; protected: - virtual QString Name() const override + QString Name() const override { return "RFMSB"; } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Groupwise; } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { QColor phaseColor = QColor(Qt::darkRed); phaseColor.setAlpha(130); @@ -449,24 +485,24 @@ class PDNAB : public Phase public: using Phase::Phase; protected: - virtual QString Name() const override + QString Name() const override { return "PDNAB"; } - virtual Qt::BrushStyle getBrushStyle() const override + Qt::BrushStyle getBrushStyle() const override { return Qt::Dense6Pattern; } - virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const + QColor getColor(const TraceDrawingProperties &drawingProperties) const override { Q_UNUSED(drawingProperties) return getPhaseColor(); } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { - return QColor(Qt::black); + return {Qt::black}; } - virtual Phase::PhaseSymbol getPhaseSymbol() const override + Phase::PhaseSymbol getPhaseSymbol() const override { return PhaseSymbol::Rect; } @@ -477,11 +513,11 @@ class PDNA : public PDNAB public: using PDNAB::PDNAB; protected: - virtual QString Name() const override + QString Name() const override { return "PDNA"; } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Rankwise; } @@ -492,24 +528,24 @@ class PDNPB : public Phase public: using Phase::Phase; protected: - virtual QString Name() const override + QString Name() const override { return "PDNPB"; } - virtual Qt::BrushStyle getBrushStyle() const override + Qt::BrushStyle getBrushStyle() const override { return Qt::Dense4Pattern; } - virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const + QColor getColor(const TraceDrawingProperties &drawingProperties) const override { Q_UNUSED(drawingProperties) return getPhaseColor(); } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { - return QColor(Qt::black); + return {Qt::black}; } - virtual Phase::PhaseSymbol getPhaseSymbol() const override + Phase::PhaseSymbol getPhaseSymbol() const override { return PhaseSymbol::Rect; } @@ -520,11 +556,11 @@ class PDNP : public PDNPB public: using PDNPB::PDNPB; protected: - virtual QString Name() const override + QString Name() const override { return "PDNP"; } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Rankwise; } @@ -535,24 +571,24 @@ class SREFB : public Phase public: using Phase::Phase; protected: - virtual QString Name() const override + QString Name() const override { return "SREFB"; } - virtual Qt::BrushStyle getBrushStyle() const override + Qt::BrushStyle getBrushStyle() const override { return Qt::Dense1Pattern; } - virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const + QColor getColor(const TraceDrawingProperties &drawingProperties) const override { Q_UNUSED(drawingProperties) return getPhaseColor(); } - virtual QColor getPhaseColor() const override + QColor getPhaseColor() const override { - return QColor(Qt::black); + return {Qt::black}; } - virtual Phase::PhaseSymbol getPhaseSymbol() const override + Phase::PhaseSymbol getPhaseSymbol() const override { return PhaseSymbol::Rect; } @@ -563,11 +599,11 @@ class SREF : public SREFB public: using SREFB::SREFB; protected: - virtual QString Name() const override + QString Name() const override { return "SREF"; } - virtual Granularity getGranularity() const override + Granularity getGranularity() const override { return Granularity::Rankwise; } diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp index 9afa91e1..60847527 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp @@ -42,81 +42,88 @@ #include "data/tracedb.h" #include "businessObjects/timespan.h" -using namespace std; - -shared_ptr PhaseFactory::CreatePhase(ID id, const QString &dbPhaseName, - const Timespan &span, const shared_ptr &trans, TraceDB &database) +std::shared_ptr PhaseFactory::CreatePhase(ID id, const QString &dbPhaseName, + const Timespan &span, const std::shared_ptr &trans, + TraceDB &database) { traceTime clk = database.getGeneralInfo().clkPeriod; const CommandLengths &cl = database.getCommandLengths(); if (dbPhaseName == "REQ") - return shared_ptr(new REQ(id, span, clk, trans, {}, std::shared_ptr())); + return std::shared_ptr(new REQ(id, span, clk, trans, {}, std::shared_ptr())); else if (dbPhaseName == "RESP") - return shared_ptr(new RESP(id, span, clk, trans, {}, std::shared_ptr())); - - else if (dbPhaseName == "PREB") + return std::shared_ptr(new RESP(id, span, clk, trans, {}, std::shared_ptr())); + /*else if (dbPhaseName == "PREB") return shared_ptr(new PREB(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr())); - else if (dbPhaseName == "PRE") - return shared_ptr(new PRE(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk * cl.PRE)}, std::shared_ptr())); - else if (dbPhaseName == "ACTB") - return shared_ptr(new ACTB(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr())); + {Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr()));*/ + else if (dbPhaseName == "PREPB" || dbPhaseName == "PRE") // for backwards compatibility + return std::shared_ptr(new PREPB(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.PREPB)}, std::shared_ptr())); + /*else if (dbPhaseName == "ACTB") + return std::shared_ptr(new ACTB(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr()));*/ else if (dbPhaseName == "ACT") - return shared_ptr(new ACT(id, span, clk, trans, + return std::shared_ptr(new ACT(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.ACT)}, std::shared_ptr())); - else if (dbPhaseName == "PREA") - return shared_ptr(new PREA(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk * cl.PREA)}, std::shared_ptr())); - else if (dbPhaseName == "REFA") - return shared_ptr(new REFA(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk * cl.REFA)}, std::shared_ptr())); + else if (dbPhaseName == "PREAB" || dbPhaseName == "PREA") // for backwards compatibility + return std::shared_ptr(new PREAB(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.PREAB)}, std::shared_ptr())); + else if (dbPhaseName == "REFAB" || dbPhaseName == "REFA") // for backwards compatibility + return std::shared_ptr(new REFAB(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.REFAB)}, std::shared_ptr())); else if (dbPhaseName == "RFMAB") - return shared_ptr(new RFMAB(id, span, clk, trans, + return std::shared_ptr(new RFMAB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RFMAB)}, std::shared_ptr())); - else if (dbPhaseName == "REFB") - return shared_ptr(new REFB(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk * cl.REFB)}, std::shared_ptr())); + else if (dbPhaseName == "REFPB" || dbPhaseName == "REFB") // for backwards compatibility + return std::shared_ptr(new REFPB(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.REFPB)}, std::shared_ptr())); + else if (dbPhaseName == "RFMPB") + return std::shared_ptr(new REFPB(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.RFMPB)}, std::shared_ptr())); + else if (dbPhaseName == "REFP2B") + return std::shared_ptr(new REFP2B(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.REFP2B)}, std::shared_ptr())); + else if (dbPhaseName == "RFMP2B") + return std::shared_ptr(new REFP2B(id, span, clk, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.RFMP2B)}, std::shared_ptr())); else if (dbPhaseName == "PRESB") - return shared_ptr(new PRESB(id, span, clk, trans, + return std::shared_ptr(new PRESB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PRESB)}, std::shared_ptr())); else if (dbPhaseName == "REFSB") - return shared_ptr(new REFSB(id, span, clk, trans, + return std::shared_ptr(new REFSB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.REFSB)}, std::shared_ptr())); else if (dbPhaseName == "RFMSB") - return shared_ptr(new RFMSB(id, span, clk, trans, + return std::shared_ptr(new RFMSB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RFMSB)}, std::shared_ptr())); else if (dbPhaseName == "RD") - return shared_ptr(new RD(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RD)}, + return std::shared_ptr(new RD(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RD)}, std::shared_ptr(new Timespan(trans->spanOnDataStrobe)))); else if (dbPhaseName == "RDA") - return shared_ptr(new RDA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RDA)}, + return std::shared_ptr(new RDA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RDA)}, std::shared_ptr(new Timespan(trans->spanOnDataStrobe)))); else if (dbPhaseName == "WR") - return shared_ptr(new WR(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WR)}, + return std::shared_ptr(new WR(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WR)}, std::shared_ptr(new Timespan(trans->spanOnDataStrobe)))); else if (dbPhaseName == "WRA") - return shared_ptr(new WRA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WRA)}, + return std::shared_ptr(new WRA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WRA)}, std::shared_ptr(new Timespan(trans->spanOnDataStrobe)))); else if (dbPhaseName == "PDNA") - return shared_ptr(new PDNA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEA), + return std::shared_ptr(new PDNA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEA), Timespan(span.End() - clk * cl.PDXA, span.End())}, std::shared_ptr())); else if (dbPhaseName == "PDNAB") - return shared_ptr(new PDNAB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), + return std::shared_ptr(new PDNAB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())}, std::shared_ptr())); else if (dbPhaseName == "PDNP") - return shared_ptr(new PDNP(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEP), + return std::shared_ptr(new PDNP(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEP), Timespan(span.End() - clk * cl.PDXP, span.End())}, std::shared_ptr())); else if (dbPhaseName == "PDNPB") - return shared_ptr(new PDNPB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), + return std::shared_ptr(new PDNPB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())}, std::shared_ptr())); else if (dbPhaseName == "SREF") - return shared_ptr(new SREF(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.SREFEN), + return std::shared_ptr(new SREF(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.SREFEN), Timespan(span.End() - clk * cl.SREFEX, span.End())}, std::shared_ptr())); else if (dbPhaseName == "SREFB") - return shared_ptr(new SREFB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), + return std::shared_ptr(new SREFB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())}, std::shared_ptr())); else throw std::runtime_error("DB phasename " + dbPhaseName.toStdString() + " unkown to phasefactory"); diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.h b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.h index 4c01e794..4aef44c7 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.h +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.h @@ -37,6 +37,7 @@ #ifndef PHASEFACTORY_H #define PHASEFACTORY_H + #include "phase.h" #include #include @@ -46,9 +47,8 @@ class TraceDB; class PhaseFactory { -private: - PhaseFactory(); public: + PhaseFactory() = delete; static std::shared_ptr CreatePhase(ID id, const QString &dbPhaseName, const Timespan &span, const std::shared_ptr &trans, TraceDB &database); diff --git a/DRAMSys/traceAnalyzer/data/tracedb.cpp b/DRAMSys/traceAnalyzer/data/tracedb.cpp index 98fa0978..4608f6ec 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.cpp +++ b/DRAMSys/traceAnalyzer/data/tracedb.cpp @@ -52,14 +52,13 @@ //define symbol printqueries if all queries should be printed to the console //#define printqueries -using namespace std; - TraceDB::TraceDB(QString path, bool openExisting) { this->pathToDB = path; database = QSqlDatabase::database(path); - if (database.isValid() && database.isOpen()) { + if (database.isValid() && database.isOpen()) + { // Close the database connection if it exists and was not closed yet. database.removeDatabase(path); database.close(); @@ -132,7 +131,7 @@ void TraceDB::refreshData() //QueryText must select the fields //TransactionID, Ranges.begin, Ranges.end, Address, TThread, TChannel, TBank, TRow, TColumn, Phases.ID AS PhaseID, PhaseName, PhaseBegin, PhaseEnd -vector> TraceDB::getTransactionsWithCustomQuery( +std::vector> TraceDB::getTransactionsWithCustomQuery( QString queryText) { QSqlQuery query(database); @@ -141,7 +140,7 @@ vector> TraceDB::getTransactionsWithCustomQuery( return parseTransactionsFromQuery(query); } -vector> TraceDB::getTransactionsInTimespan(const Timespan &span, bool updateVisiblePhases) +std::vector> TraceDB::getTransactionsInTimespan(const Timespan &span, bool updateVisiblePhases) { selectTransactionsByTimespan.bindValue(":begin", span.Begin()); selectTransactionsByTimespan.bindValue(":end", span.End()); @@ -170,7 +169,7 @@ void TraceDB::updateDependenciesInTimespan(const Timespan &span) } //TODO Remove exception -shared_ptr TraceDB::getTransactionByID(ID id) +std::shared_ptr TraceDB::getTransactionByID(ID id) { selectTransactionById.bindValue(":id", id); executeQuery(selectTransactionById); @@ -183,12 +182,11 @@ shared_ptr TraceDB::getTransactionByID(ID id) } -shared_ptr TraceDB::getNextActivate(traceTime time) +std::shared_ptr TraceDB::getNextActivate(traceTime time) { QSqlQuery query(database); QString queryText = queryTexts.queryHead + - "WHERE PhaseBegin > :traceTime AND PhaseName " - "IN ('ACT','ACTB') ORDER BY PhaseBegin ASC LIMIT 1"; + "WHERE PhaseBegin > :traceTime AND PhaseName = 'ACT' ORDER BY PhaseBegin ASC LIMIT 1"; query.prepare(queryText); query.bindValue(":traceTime", time); @@ -196,12 +194,12 @@ shared_ptr TraceDB::getNextActivate(traceTime time) return parseTransactionFromQuery(query); } -shared_ptr TraceDB::getNextPrecharge(traceTime time) +std::shared_ptr TraceDB::getNextPrecharge(traceTime time) { QSqlQuery query(database); QString queryText = queryTexts.queryHead + "WHERE PhaseBegin > :traceTime AND PhaseName " - "IN ('PRE','PREA','PREB','PRESB') ORDER BY PhaseBegin ASC LIMIT 1"; + "IN ('PRE','PREPB','PREA','PREAB','PRESB') ORDER BY PhaseBegin ASC LIMIT 1"; query.prepare(queryText); query.bindValue(":traceTime", time); @@ -233,12 +231,12 @@ shared_ptr TraceDB::getNextPrecharge(traceTime time) // return parseTransactionFromQuery(query); // } -shared_ptr TraceDB::getNextRefresh(traceTime time) +std::shared_ptr TraceDB::getNextRefresh(traceTime time) { QSqlQuery query(database); QString queryText = queryTexts.queryHead + "WHERE PhaseBegin > :traceTime AND PhaseName " - "IN ('REFA','REFB','REFSB','SREF','SREFB') ORDER BY PhaseBegin ASC LIMIT 1"; + "IN ('REFAB','REFA','REFB','REFPB','REFP2B','REFSB','SREF','SREFB') ORDER BY PhaseBegin ASC LIMIT 1"; query.prepare(queryText); query.bindValue(":traceTime", time); executeQuery(query); @@ -278,92 +276,187 @@ ID TraceDB::getTransactionIDFromPhaseID(ID phaseID) if (query.next()) { return query.value(0).toInt(); } else { - throw sqlException("Phase with ID " + to_string(phaseID) + " not in db", + throw sqlException("Phase with ID " + std::to_string(phaseID) + " not in db", this->pathToDB.toStdString()); } } -GeneralInfo *TraceDB::getGeneralInfoFromDB() +GeneralInfo TraceDB::getGeneralInfoFromDB() { - QSqlQuery query(database); - query.prepare("SELECT NumberOfTransactions, TraceEnd, NumberOfRanks, NumberOfBankgroups, NumberOfBanks, Clk, " - "UnitOfTime, Traces, Memspec, MCconfig, WindowSize, ControllerThread FROM GeneralInfo"); - executeQuery(query); + QVariant parameter; + parameter = getParameterFromTable("NumberOfTransactions", "GeneralInfo"); + uint64_t numberOfTransactions = parameter.isValid() ? parameter.toULongLong() : 0; + parameter = getParameterFromTable("TraceEnd", "GeneralInfo"); + traceTime traceEnd = parameter.isValid() ? parameter.toULongLong() : 0; + parameter = getParameterFromTable("NumberOfRanks", "GeneralInfo"); + unsigned numberOfRanks = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("NumberOfBankgroups", "GeneralInfo"); + unsigned numberOfBankGroups = parameter.isValid() ? parameter.toUInt() : numberOfRanks; + parameter = getParameterFromTable("NumberOfBanks", "GeneralInfo"); + unsigned numberOfBanks = parameter.isValid() ? parameter.toUInt() : numberOfBankGroups; + parameter = getParameterFromTable("Clk", "GeneralInfo"); + uint64_t clkPeriod = parameter.isValid() ? parameter.toULongLong() : 1000; + parameter = getParameterFromTable("UnitOfTime", "GeneralInfo"); + QString unitOfTime = parameter.isValid() ? parameter.toString() : "PS"; + parameter = getParameterFromTable("Traces", "GeneralInfo"); + QString traces = parameter.isValid() ? "Traces: " + parameter.toString() : "Traces: empty"; + parameter = getParameterFromTable("Memspec", "GeneralInfo"); + QString memspec = parameter.isValid() ? "Memspec: " + parameter.toString() : "Memspec: empty"; + parameter = getParameterFromTable("MCconfig", "GeneralInfo"); + QString mcconfig = parameter.isValid() ? "MCconfig: " + parameter.toString() : "MCconfig: empty"; + parameter = getParameterFromTable("WindowSize", "GeneralInfo"); + uint64_t windowSize = parameter.isValid() ? parameter.toULongLong() : 0; + parameter = getParameterFromTable("RefreshMaxPostponed", "GeneralInfo"); + unsigned refreshMaxPostponed = parameter.isValid() ? parameter.toUInt() : 0; + parameter = getParameterFromTable("RefreshMaxPulledin", "GeneralInfo"); + unsigned refreshMaxPulledin = parameter.isValid() ? parameter.toUInt() : 0; + parameter = getParameterFromTable("ControllerThread", "GeneralInfo"); + uint64_t controllerThread = parameter.isValid() ? parameter.toULongLong() : UINT64_MAX; + parameter = getParameterFromTable("MaxBufferDepth", "GeneralInfo"); + unsigned maxBufferDepth = parameter.isValid() ? parameter.toUInt() : 8; + parameter = getParameterFromTable("Per2BankOffset", "GeneralInfo"); + unsigned per2BankOffset = parameter.isValid() ? parameter.toUInt() : 1; - if (query.next()) { - unsigned int numberOfTransactions = query.value(0).toInt(); - traceTime traceEnd = query.value(1).toLongLong(); - unsigned int numberOfRanks = query.value(2).toInt(); - unsigned int numberOfBankgroups = query.value(3).toInt(); - unsigned int numberOfBanks = query.value(4).toInt(); - unsigned int clkPeriod = query.value(5).toInt(); - QString unitOfTime = query.value(6).toString(); - unsigned int numberOfPhases = getNumberOfPhases(); + uint64_t numberOfPhases = getNumberOfPhases(); - QString traces = "Traces: " + query.value(7).toString(); - QString memspec = "Memspec: " + query.value(8).toString(); - QString mcconfig = "MCconfig: " + query.value(9).toString(); - unsigned int windowSize = query.value(10).toInt(); - unsigned int controllerThread = query.value(11).toUInt(); + QString description = (traces + "\n"); + description += mcconfig + "\n"; + description += memspec + "\n"; + description += "Number of Transactions: " + QString::number(numberOfTransactions) + "\n"; + description += "Clock period: " + QString::number(clkPeriod) + " " + unitOfTime + "\n"; + description += "Length of trace: " + prettyFormatTime(traceEnd) + "\n"; + description += "Window size:" + QString::number(windowSize) + "\n"; - return new GeneralInfo(numberOfTransactions, numberOfPhases, Timespan(0, traceEnd), numberOfRanks, - numberOfBankgroups, numberOfBanks, unitOfTime, clkPeriod, windowSize, controllerThread); - } else { - throw sqlException("Tracefile corrupted. No general info table", - this->pathToDB.toStdString()); - } + return {numberOfTransactions, numberOfPhases, Timespan(0, traceEnd), numberOfRanks, + numberOfBankGroups, numberOfBanks, description, unitOfTime, clkPeriod, windowSize, + refreshMaxPostponed, refreshMaxPulledin, controllerThread, maxBufferDepth, per2BankOffset}; } CommandLengths TraceDB::getCommandLengthsFromDB() { - unsigned NOP = getLengthOfCommandFromDB("NOP"); - unsigned RD = getLengthOfCommandFromDB("RD"); - unsigned WR = getLengthOfCommandFromDB("WR"); - unsigned RDA = getLengthOfCommandFromDB("RDA"); - unsigned WRA = getLengthOfCommandFromDB("WRA"); - unsigned ACT = getLengthOfCommandFromDB("ACT"); - unsigned PRE = getLengthOfCommandFromDB("PRE"); - unsigned REFB = getLengthOfCommandFromDB("REFB"); - unsigned PRESB = getLengthOfCommandFromDB("PRESB"); - unsigned REFSB = getLengthOfCommandFromDB("REFSB"); - unsigned RFMSB = getLengthOfCommandFromDB("RFMSB"); - unsigned PREA = getLengthOfCommandFromDB("PREA"); - unsigned REFA = getLengthOfCommandFromDB("REFA"); - unsigned RFMAB = getLengthOfCommandFromDB("RFMAB"); - unsigned PDEA = getLengthOfCommandFromDB("PDEA"); - unsigned PDXA = getLengthOfCommandFromDB("PDXA"); - unsigned PDEP = getLengthOfCommandFromDB("PDEP"); - unsigned PDXP = getLengthOfCommandFromDB("PDXP"); - unsigned SREFEN = getLengthOfCommandFromDB("SREFEN"); - unsigned SREFEX = getLengthOfCommandFromDB("SREFEX"); - - return {NOP, RD, WR, RDA, WRA, ACT, PRE, REFB, PRESB, REFSB, RFMSB, - PREA, REFA, RFMAB, PDEA, PDXA, PDEP, PDXP, SREFEN, SREFEX}; -} - -unsigned int TraceDB::getLengthOfCommandFromDB(const std::string& command) -{ - QSqlQuery query(("SELECT " + command + " FROM CommandLengths").c_str(), database); - if (query.first()) - return query.value(0).toUInt(); + QVariant parameter; + parameter = getParameterFromTable("NOP", "CommandLengths"); + unsigned NOP = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("RD", "CommandLengths"); + unsigned RD = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("WR", "CommandLengths"); + unsigned WR = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("RDA", "CommandLengths"); + unsigned RDA = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("WRA", "CommandLengths"); + unsigned WRA = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("ACT", "CommandLengths"); + unsigned ACT = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("PREPB", "CommandLengths"); + unsigned PREPB; + if (parameter.isValid()) + { + PREPB = parameter.toUInt(); + } else { - qDebug() << "Warning: Length of command " << command.c_str() << " not present in DB, setting 1 as default."; - return 1; + parameter = getParameterFromTable("PRE", "CommandLengths"); + if (parameter.isValid()) + PREPB = parameter.toUInt(); + else + PREPB = 1; + } + parameter = getParameterFromTable("REFPB", "CommandLengths"); + unsigned REFPB; + if (parameter.isValid()) + { + REFPB = parameter.toUInt(); + } + else + { + parameter = getParameterFromTable("REFB", "CommandLengths"); + if (parameter.isValid()) + REFPB = parameter.toUInt(); + else + REFPB = 1; + } + parameter = getParameterFromTable("RFMPB", "CommandLengths"); + unsigned RFMPB = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("REFP2B", "CommandLengths"); + unsigned REFP2B = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("RFMP2B", "CommandLengths"); + unsigned RFMP2B = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("PRESB", "CommandLengths"); + unsigned PRESB = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("REFSB", "CommandLengths"); + unsigned REFSB = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("RFMSB", "CommandLengths"); + unsigned RFMSB = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("PREAB", "CommandLengths"); + unsigned PREAB; + if (parameter.isValid()) + { + PREAB = parameter.toUInt(); + } + else + { + parameter = getParameterFromTable("PREA", "CommandLengths"); + if (parameter.isValid()) + PREAB = parameter.toUInt(); + else + PREAB = 1; + } + parameter = getParameterFromTable("REFAB", "CommandLengths"); + unsigned REFAB; + if (parameter.isValid()) + { + REFAB = parameter.toUInt(); + } + else + { + parameter = getParameterFromTable("REFA", "CommandLengths"); + if (parameter.isValid()) + REFAB = parameter.toUInt(); + else + REFAB = 1; + } + parameter = getParameterFromTable("RFMAB", "CommandLengths"); + unsigned RFMAB = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("PDEA", "CommandLengths"); + unsigned PDEA = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("PDXA", "CommandLengths"); + unsigned PDXA = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("PDEP", "CommandLengths"); + unsigned PDEP = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("PDXP", "CommandLengths"); + unsigned PDXP = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("SREFEN", "CommandLengths"); + unsigned SREFEN = parameter.isValid() ? parameter.toUInt() : 1; + parameter = getParameterFromTable("SREFEX", "CommandLengths"); + unsigned SREFEX = parameter.isValid() ? parameter.toUInt() : 1; + + return {NOP, RD, WR, RDA, WRA, ACT, PREPB, REFPB, RFMPB, REFP2B, RFMP2B, PRESB, REFSB, RFMSB, + PREAB, REFAB, RFMAB, PDEA, PDXA, PDEP, PDXP, SREFEN, SREFEX}; +} + +QVariant TraceDB::getParameterFromTable(const std::string& parameter, const std::string& table) +{ + QSqlQuery query(("SELECT " + parameter + " FROM " + table).c_str(), database); + if (query.first()) + return query.value(0); + else + { + qDebug() << "Parameter " << parameter.c_str() << " not present in table " << table.c_str(); + return {}; } } -unsigned int TraceDB::getNumberOfPhases() +uint64_t TraceDB::getNumberOfPhases() { QSqlQuery query(database); query.prepare("SELECT COUNT(ID) FROM Phases"); executeQuery(query); query.next(); - return query.value(0).toInt(); + return query.value(0).toULongLong(); } -vector TraceDB::getComments() +std::vector TraceDB::getComments() { QSqlQuery query(database); query.prepare("SELECT Time,Text From Comments"); @@ -372,7 +465,7 @@ vector TraceDB::getComments() } -vector TraceDB::getDebugMessagesInTimespan(const Timespan &span) +std::vector TraceDB::getDebugMessagesInTimespan(const Timespan &span) { selectDebugMessagesByTimespan.bindValue(":begin", span.Begin()); selectDebugMessagesByTimespan.bindValue(":end", span.End()); @@ -381,7 +474,7 @@ vector TraceDB::getDebugMessagesInTimespan(const Timespan return parseCommentsFromQuery(selectDebugMessagesByTimespan); } -vector TraceDB::getDebugMessagesInTimespan(const Timespan &span, +std::vector TraceDB::getDebugMessagesInTimespan(const Timespan &span, unsigned int limit = 50) { selectDebugMessagesByTimespanWithLimit.bindValue(":begin", span.Begin()); @@ -434,23 +527,23 @@ QSqlDatabase TraceDB::getDatabase() const */ -shared_ptr TraceDB::parseTransactionFromQuery(QSqlQuery &query) +std::shared_ptr TraceDB::parseTransactionFromQuery(QSqlQuery &query) { auto result = parseTransactionsFromQuery(query); if (!result.empty()) return result[0]; else - return shared_ptr(); + return {}; } -vector> TraceDB::parseTransactionsFromQuery(QSqlQuery &query, bool updateVisiblePhases) +std::vector> TraceDB::parseTransactionsFromQuery(QSqlQuery &query, bool updateVisiblePhases) { if (updateVisiblePhases) { _visiblePhases.clear(); } - vector> result; + std::vector> result; bool firstIteration = true; ID currentID = 0; @@ -475,9 +568,9 @@ vector> TraceDB::parseTransactionsFromQuery(QSqlQuery &q unsigned int bank = query.value(11).toInt(); unsigned int row = query.value(12).toInt(); unsigned int column = query.value(13).toInt(); - result.push_back(shared_ptr(new Transaction(id, address, burstlength, + result.push_back(std::make_shared(id, address, burstlength, thread, channel, rank, bankgroup, bank, row, column, - span, spanOnStrobe, generalInfo->clkPeriod))); + span, spanOnStrobe, generalInfo.clkPeriod)); } unsigned int phaseID = query.value(14).toInt(); @@ -524,14 +617,14 @@ void TraceDB::mUpdateDependenciesFromQuery(QSqlQuery &query) if (_visiblePhases.count(dependencyID) > 0) { - _visiblePhases[delayedID]->addDependency(std::shared_ptr( - new PhaseDependency(type, timeDependencyStr, _visiblePhases[dependencyID]))); + _visiblePhases[delayedID]->addDependency(std::make_shared( + PhaseDependency(type, timeDependencyStr, _visiblePhases[dependencyID]))); } else { _visiblePhases[delayedID]->addDependency( - std::shared_ptr(new PhaseDependency(type, timeDependencyStr))); + std::make_shared(PhaseDependency(type, timeDependencyStr))); } } else @@ -541,10 +634,11 @@ void TraceDB::mUpdateDependenciesFromQuery(QSqlQuery &query) } } -vector TraceDB::parseCommentsFromQuery(QSqlQuery &query) +std::vector TraceDB::parseCommentsFromQuery(QSqlQuery &query) { - vector result; - while (query.next()) { + std::vector result; + while (query.next()) + { result.push_back(CommentModel::Comment{query.value(0).toLongLong(), query.value(1).toString()}); } diff --git a/DRAMSys/traceAnalyzer/data/tracedb.h b/DRAMSys/traceAnalyzer/data/tracedb.h index 525824b8..8b759f24 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.h +++ b/DRAMSys/traceAnalyzer/data/tracedb.h @@ -77,7 +77,7 @@ public: const GeneralInfo &getGeneralInfo() const { - return *generalInfo; + return generalInfo; } const CommandLengths &getCommandLengths() const @@ -114,8 +114,8 @@ public: private: QString pathToDB; QSqlDatabase database; - GeneralInfo *generalInfo; - CommandLengths commandLengths; + GeneralInfo generalInfo; + CommandLengths commandLengths{}; QSqlQuery insertPhaseQuery; QSqlQuery insertTransactionQuery; @@ -133,22 +133,22 @@ private: TransactionQueryTexts queryTexts; void prepareQueries(); void executeQuery(QSqlQuery query); - QString queryToString(QSqlQuery query); + static QString queryToString(QSqlQuery query); std::shared_ptr parseTransactionFromQuery(QSqlQuery &query); std::vector> parseTransactionsFromQuery(QSqlQuery &query, bool updateVisiblePhases = false); - std::vector parseCommentsFromQuery(QSqlQuery &query); + static std::vector parseCommentsFromQuery(QSqlQuery &query); void mUpdateDependenciesFromQuery(QSqlQuery &query); - DependencyInfos parseDependencyInfos(QSqlQuery &query, const DependencyInfos::Type infoType); + static DependencyInfos parseDependencyInfos(QSqlQuery &query, const DependencyInfos::Type infoType); void executeScriptFile(QString fileName); void dropAndCreateTables(); - unsigned int getNumberOfPhases(); - GeneralInfo *getGeneralInfoFromDB(); + uint64_t getNumberOfPhases(); + GeneralInfo getGeneralInfoFromDB(); CommandLengths getCommandLengthsFromDB(); - unsigned int getLengthOfCommandFromDB(const std::string& command); + QVariant getParameterFromTable(const std::string& parameter, const std::string& table); std::map> _visiblePhases; // Updated at parseTransactionsFromQuery }; @@ -165,7 +165,7 @@ public: this->message = std::string("Error in file ") + filename + std::string(" ") + message; } - const char *what() const noexcept + const char *what() const noexcept override { return message.c_str(); } diff --git a/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp b/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp index 8a1971d4..b1a5ccc4 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp +++ b/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp @@ -192,7 +192,7 @@ void TraceDrawingProperties::collapseOrExpandAllRanks(ToggleCollapsedAction::Col } } -const std::shared_ptr> TraceDrawingProperties::getLabels() const +std::shared_ptr> TraceDrawingProperties::getLabels() const { return labels; } @@ -289,3 +289,14 @@ TracePlotLineVector TraceDrawingProperties::getBankLinesFromRank(unsigned int ra { return tracePlotLineCache->getBankLinesFromRank(rank); } + +TracePlotLineVector TraceDrawingProperties::getBankLinesTwoBankwise(unsigned int rank, unsigned int firstGroup, + unsigned int firstBank, unsigned int secondGroup, + unsigned int secondBank) const +{ + TracePlotLineVector firstBankLines = tracePlotLineCache->getBankLines(rank, firstGroup, firstBank); + TracePlotLineVector secondBankLines = tracePlotLineCache->getBankLines(rank, secondGroup, secondBank); + firstBankLines.insert(firstBankLines.end(), secondBankLines.begin(), secondBankLines.end()); + + return firstBankLines; +} diff --git a/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.h b/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.h index 2573606e..6c437ad0 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.h +++ b/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.h @@ -93,12 +93,13 @@ public: DependencyOptions drawDependenciesOption; ColorGrouping colorGrouping; - unsigned int numberOfRanks; - unsigned int numberOfBankgroups; - unsigned int numberOfBanks; - unsigned int banksPerRank; - unsigned int groupsPerRank; - unsigned int banksPerGroup; + unsigned int numberOfRanks = 1; + unsigned int numberOfBankGroups = 1; + unsigned int numberOfBanks = 1; + unsigned int banksPerRank = 1; + unsigned int groupsPerRank = 1; + unsigned int banksPerGroup = 1; + unsigned int per2BankOffset = 0; TraceDrawingProperties(bool drawText = true, bool drawBorder = true, DependencyOptions drawDependenciesOption = {DependencyOption::Disabled, @@ -123,9 +124,12 @@ public: TracePlotLineVector getBankLines(unsigned int rank, unsigned int group, unsigned int bank) const; TracePlotLineVector getBankLinesFromGroup(unsigned int rank, unsigned int group) const; TracePlotLineVector getBankLinesGroupwise(unsigned int rank, unsigned int bank) const; + TracePlotLineVector getBankLinesTwoBankwise(unsigned int rank, unsigned int firstGroup, + unsigned int firstBank, unsigned int secondGroup, + unsigned int secondBank) const; TracePlotLineVector getBankLinesFromRank(unsigned int rank) const; - const std::shared_ptr> getLabels() const; + std::shared_ptr> getLabels() const; void updateTracePlotLines(QTreeWidget *treeWidget); void collapseOrExpandAllRanks(ToggleCollapsedAction::CollapseAction collapseAction); @@ -142,7 +146,7 @@ private: std::shared_ptr tracePlotLines; std::shared_ptr tracePlotLineCache; - TracePlot *tracePlot; + TracePlot *tracePlot = nullptr; }; #endif // TRACECOLLECTIONDRAWINGPROPERTIES_H diff --git a/DRAMSys/traceAnalyzer/presentation/traceplot.cpp b/DRAMSys/traceAnalyzer/presentation/traceplot.cpp index f1ecc997..7c986afd 100644 --- a/DRAMSys/traceAnalyzer/presentation/traceplot.cpp +++ b/DRAMSys/traceAnalyzer/presentation/traceplot.cpp @@ -303,11 +303,12 @@ void TracePlot::setUpDrawingProperties() drawingProperties.init(navigator->getTracePlotLines(), navigator->getTracePlotLineCache(), this); drawingProperties.numberOfRanks = navigator->GeneralTraceInfo().numberOfRanks; - drawingProperties.numberOfBankgroups = navigator->GeneralTraceInfo().numberOfBankgroups; + drawingProperties.numberOfBankGroups = navigator->GeneralTraceInfo().numberOfBankGroups; drawingProperties.numberOfBanks = navigator->GeneralTraceInfo().numberOfBanks; drawingProperties.banksPerRank = drawingProperties.numberOfBanks / drawingProperties.numberOfRanks; - drawingProperties.groupsPerRank = drawingProperties.numberOfBankgroups / drawingProperties.numberOfRanks; - drawingProperties.banksPerGroup = drawingProperties.numberOfBanks / drawingProperties.numberOfBankgroups; + drawingProperties.groupsPerRank = drawingProperties.numberOfBankGroups / drawingProperties.numberOfRanks; + drawingProperties.banksPerGroup = drawingProperties.numberOfBanks / drawingProperties.numberOfBankGroups; + drawingProperties.per2BankOffset = navigator->GeneralTraceInfo().per2BankOffset; } void TracePlot::setUpQueryEditor() diff --git a/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp b/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp index 50d5dbd6..79d75c72 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp +++ b/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp @@ -107,11 +107,12 @@ void TraceScroller::setUpDrawingProperties() drawingProperties.init(navigator->getTracePlotLines(), navigator->getTracePlotLineCache()); drawingProperties.numberOfRanks = navigator->GeneralTraceInfo().numberOfRanks; - drawingProperties.numberOfBankgroups = navigator->GeneralTraceInfo().numberOfBankgroups; + drawingProperties.numberOfBankGroups = navigator->GeneralTraceInfo().numberOfBankGroups; drawingProperties.numberOfBanks = navigator->GeneralTraceInfo().numberOfBanks; drawingProperties.banksPerRank = drawingProperties.numberOfBanks / drawingProperties.numberOfRanks; - drawingProperties.groupsPerRank = drawingProperties.numberOfBankgroups / drawingProperties.numberOfRanks; - drawingProperties.banksPerGroup = drawingProperties.numberOfBanks / drawingProperties.numberOfBankgroups; + drawingProperties.groupsPerRank = drawingProperties.numberOfBankGroups / drawingProperties.numberOfRanks; + drawingProperties.banksPerGroup = drawingProperties.numberOfBanks / drawingProperties.numberOfBankGroups; + drawingProperties.per2BankOffset = navigator->GeneralTraceInfo().per2BankOffset; }