diff --git a/DRAMSys/library/src/common/TlmRecorder.cpp b/DRAMSys/library/src/common/TlmRecorder.cpp index 0d30e623..c062999e 100644 --- a/DRAMSys/library/src/common/TlmRecorder.cpp +++ b/DRAMSys/library/src/common/TlmRecorder.cpp @@ -368,7 +368,7 @@ void TlmRecorder::insertGeneralInfo() sqlite3_bind_int64(insertGeneralInfoStatement, 11, 0); sqlite3_bind_int(insertGeneralInfoStatement, 12, static_cast(config.refreshMaxPostponed)); sqlite3_bind_int(insertGeneralInfoStatement, 13, static_cast(config.refreshMaxPulledin)); - sqlite3_bind_int64(insertGeneralInfoStatement, 14, static_cast(UINT64_MAX)); + sqlite3_bind_int(insertGeneralInfoStatement, 14, static_cast(UINT_MAX)); sqlite3_bind_int(insertGeneralInfoStatement, 15, static_cast(config.requestBufferSize)); sqlite3_bind_int(insertGeneralInfoStatement, 16, static_cast(config.memSpec->getPer2BankOffset())); diff --git a/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h b/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h index 4f5ef2a6..c43a288e 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h +++ b/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h @@ -41,6 +41,7 @@ #include "timespan.h" #include +#include struct GeneralInfo { @@ -59,7 +60,7 @@ struct GeneralInfo uint64_t windowSize = 0; unsigned int refreshMaxPostponed = 0; unsigned int refreshMaxPulledin = 0; - uint64_t controllerThread = UINT64_MAX; + unsigned int controllerThread = UINT_MAX; unsigned int maxBufferDepth = 8; unsigned int per2BankOffset = 1; bool rowColumnCommandBus = false; @@ -69,7 +70,7 @@ struct GeneralInfo GeneralInfo(uint64_t numberOfTransactions, uint64_t numberOfPhases, Timespan span, unsigned int numberOfRanks, unsigned int numberOfBankgroups, unsigned int numberOfBanks, QString description, QString unitOfTime, uint64_t clkPeriod, uint64_t windowSize, unsigned int refreshMaxPostponed, - unsigned int refreshMaxPulledin, uint64_t controllerThread, unsigned int maxBufferDepth, + unsigned int refreshMaxPulledin, unsigned int controllerThread, unsigned int maxBufferDepth, unsigned int per2BankOffset, bool rowColumnCommandBus, bool pseudoChannelMode) : numberOfTransactions(numberOfTransactions), numberOfPhases(numberOfPhases), span(span), numberOfRanks(numberOfRanks), numberOfBankGroups(numberOfBankgroups), numberOfBanks(numberOfBanks), diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp index 0cd31fd7..5ddec5a2 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp @@ -84,7 +84,7 @@ void Phase::draw(QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap & } } - for (Timespan span : spansOnCommandBus) + for (Timespan spanOnCommandBus : spansOnCommandBus) { for (const auto &line : drawingProperties.getTracePlotLines()) { @@ -101,30 +101,30 @@ void Phase::draw(QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap & else if (line->data.type != AbstractTracePlotLineModel::CommandBusLine) continue; - drawPhaseSymbol(span.Begin(), span.End(), line->data.yVal, false, PhaseSymbol::Hexagon, painter, xMap, yMap, + drawPhaseSymbol(spanOnCommandBus.Begin(), spanOnCommandBus.End(), line->data.yVal, false, PhaseSymbol::Hexagon, painter, xMap, yMap, drawingProperties.textColor); } } - if (spanOnDataBus) + if (spanOnDataStrobe.End() != 0) { for (const auto &line : drawingProperties.getTracePlotLines()) { if (line->data.type == AbstractTracePlotLineModel::PseudoChannel0Line) { - if (transaction.lock()->rank != 0) + if (rank != 0) continue; } else if (line->data.type == AbstractTracePlotLineModel::PseudoChannel1Line) { - if (transaction.lock()->rank != 1) + if (rank != 1) continue; } else if (line->data.type != AbstractTracePlotLineModel::DataBusLine) continue; - drawPhaseSymbol(spanOnDataBus->Begin(), spanOnDataBus->End(), line->data.yVal, false, PhaseSymbol::Hexagon, - painter, xMap, yMap, drawingProperties.textColor); + drawPhaseSymbol(spanOnDataStrobe.Begin(), spanOnDataStrobe.End(), line->data.yVal, false, + PhaseSymbol::Hexagon, painter, xMap, yMap, drawingProperties.textColor); } } } @@ -207,9 +207,6 @@ std::vector Phase::getYVals(const TraceDrawingProperties &drawingProperties { std::vector yVals; - unsigned int transactionRank = transaction.lock()->rank; - unsigned int transactionBank = transaction.lock()->bank; - for (const auto &line : drawingProperties.getTracePlotLines()) { if (line->data.type != AbstractTracePlotLineModel::BankLine) @@ -217,26 +214,26 @@ std::vector Phase::getYVals(const TraceDrawingProperties &drawingProperties unsigned int yVal = line->data.yVal; - unsigned int rank = line->data.rank; - unsigned int bank = line->data.bank; + unsigned int drawnRank = line->data.rank; + unsigned int drawnBank = line->data.bank; bool shouldBeDrawn = false; switch (getGranularity()) { case Granularity::Rankwise: - shouldBeDrawn = (transactionRank == rank); + shouldBeDrawn = (rank == drawnRank); break; case Granularity::Groupwise: - shouldBeDrawn = (transactionRank == rank) && (transactionBank % drawingProperties.banksPerGroup == - bank % drawingProperties.banksPerGroup); + shouldBeDrawn = (rank == drawnRank) && (bank % drawingProperties.banksPerGroup == + drawnBank % drawingProperties.banksPerGroup); break; case Granularity::Bankwise: - shouldBeDrawn = (transactionBank == bank); + shouldBeDrawn = (bank == drawnBank); break; case Granularity::TwoBankwise: - shouldBeDrawn = (transactionBank == bank) || ((transactionBank + drawingProperties.per2BankOffset) == bank); + shouldBeDrawn = (bank == drawnBank) || ((bank + drawingProperties.per2BankOffset) == drawnBank); break; } @@ -332,18 +329,18 @@ bool Phase::isSelected(Timespan timespan, double yVal, const TraceDrawingPropert } } - if (spanOnDataBus && spanOnDataBus->overlaps(timespan)) + if (spanOnDataStrobe.End() != 0 && spanOnDataStrobe.overlaps(timespan)) { for (const auto &line : drawingProperties.getTracePlotLines()) { if (line->data.type == AbstractTracePlotLineModel::PseudoChannel0Line) { - if (transaction.lock()->rank != 0) + if (rank != 0) continue; } else if (line->data.type == AbstractTracePlotLineModel::PseudoChannel1Line) { - if (transaction.lock()->rank != 1) + if (rank != 1) continue; } else if (line->data.type != AbstractTracePlotLineModel::DataBusLine) diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h index 9b9550d1..d02e28d5 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h @@ -56,11 +56,12 @@ class Transaction; class Phase { public: - Phase(ID id, Timespan span, traceTime clk, const std::shared_ptr &transaction, - std::vector spansOnCommandBus, - std::shared_ptr spanOnDataBus): - id(id), span(span), clk(clk), transaction(transaction), - spansOnCommandBus(spansOnCommandBus), spanOnDataBus(spanOnDataBus), + Phase(ID id, Timespan span, Timespan spanOnDataStrobe, unsigned int rank, unsigned int bankGroup, + unsigned int bank, unsigned int row, unsigned int column, unsigned int burstLength, + traceTime clk, const std::shared_ptr &transaction, std::vector spansOnCommandBus) : + id(id), span(span), spanOnDataStrobe(spanOnDataStrobe), + rank(rank), bankGroup(bankGroup), bank(bank), row(row), column(column), burstLength(burstLength), + clk(clk), transaction(transaction), spansOnCommandBus(spansOnCommandBus), hexagonHeight(0.6), captionPosition(TextPositioning::bottomRight) {} void draw(QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, @@ -83,10 +84,11 @@ public: protected: ID id; Timespan span; + Timespan spanOnDataStrobe; + unsigned int rank, bankGroup, bank, row, column, burstLength; traceTime clk; std::weak_ptr transaction; std::vector spansOnCommandBus; - std::shared_ptr spanOnDataBus; std::vector> mDependencies; double hexagonHeight; @@ -399,6 +401,23 @@ protected: } }; +class RFMPB final : public AUTO_REFRESH +{ +public: + using AUTO_REFRESH::AUTO_REFRESH; +protected: + QString Name() const override + { + return "RFMPB"; + } + QColor getPhaseColor() const override + { + QColor phaseColor = QColor(Qt::darkRed); + phaseColor.setAlpha(130); + return phaseColor; + } +}; + class REFP2B final : public AUTO_REFRESH { public: diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp index 60847527..290034f4 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp @@ -43,88 +43,77 @@ #include "businessObjects/timespan.h" std::shared_ptr PhaseFactory::CreatePhase(ID id, const QString &dbPhaseName, - const Timespan &span, const std::shared_ptr &trans, - TraceDB &database) + const Timespan& span, const Timespan& spanOnDataStrobe, + unsigned int rank, unsigned int bankGroup, unsigned int bank, unsigned int row, unsigned int column, + unsigned int burstLength, const std::shared_ptr &trans, TraceDB &database) { - traceTime clk = database.getGeneralInfo().clkPeriod; + traceTime clk = static_cast(database.getGeneralInfo().clkPeriod); const CommandLengths &cl = database.getCommandLengths(); if (dbPhaseName == "REQ") - return std::shared_ptr(new REQ(id, span, clk, trans, {}, std::shared_ptr())); + return std::shared_ptr(new REQ(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, burstLength, clk, trans, {})); else if (dbPhaseName == "RESP") - 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 == "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()));*/ + return std::shared_ptr(new RESP(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column,burstLength, clk, trans, {})); + else if (dbPhaseName == "PREPB") + return std::shared_ptr(new PREPB(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PREPB)})); else if (dbPhaseName == "ACT") - return std::shared_ptr(new ACT(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk * cl.ACT)}, 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())); + return std::shared_ptr(new ACT(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.ACT)})); + else if (dbPhaseName == "PREAB") + return std::shared_ptr(new PREAB(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PREAB)})); + else if (dbPhaseName == "REFAB") + return std::shared_ptr(new REFAB(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.REFAB)})); else if (dbPhaseName == "RFMAB") - return std::shared_ptr(new RFMAB(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk * cl.RFMAB)}, 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())); + return std::shared_ptr(new RFMAB(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RFMAB)})); + else if (dbPhaseName == "REFPB") + return std::shared_ptr(new REFPB(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.REFPB)})); 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())); + return std::shared_ptr(new RFMPB(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RFMPB)})); 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())); + return std::shared_ptr(new REFP2B(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.REFP2B)})); 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())); + return std::shared_ptr(new RFMP2B(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RFMP2B)})); else if (dbPhaseName == "PRESB") - return std::shared_ptr(new PRESB(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk * cl.PRESB)}, std::shared_ptr())); + return std::shared_ptr(new PRESB(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PRESB)})); else if (dbPhaseName == "REFSB") - return std::shared_ptr(new REFSB(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk * cl.REFSB)}, std::shared_ptr())); + return std::shared_ptr(new REFSB(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.REFSB)})); else if (dbPhaseName == "RFMSB") - return std::shared_ptr(new RFMSB(id, span, clk, trans, - {Timespan(span.Begin(), span.Begin() + clk * cl.RFMSB)}, std::shared_ptr())); + return std::shared_ptr(new RFMSB(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RFMSB)})); else if (dbPhaseName == "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)))); + return std::shared_ptr(new RD(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RD)})); else if (dbPhaseName == "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)))); + return std::shared_ptr(new RDA(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RDA)})); else if (dbPhaseName == "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)))); + return std::shared_ptr(new WR(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WR)})); else if (dbPhaseName == "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)))); + return std::shared_ptr(new WRA(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WRA)})); else if (dbPhaseName == "PDNA") - 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 std::shared_ptr(new PDNAB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), - Timespan(span.End() - clk, span.End())}, std::shared_ptr())); + return std::shared_ptr(new PDNA(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEA), + Timespan(span.End() - clk * cl.PDXA, span.End())})); else if (dbPhaseName == "PDNP") - 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 std::shared_ptr(new PDNPB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), - Timespan(span.End() - clk, span.End())}, std::shared_ptr())); + return std::shared_ptr(new PDNP(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEP), + Timespan(span.End() - clk * cl.PDXP, span.End())})); else if (dbPhaseName == "SREF") - 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 std::shared_ptr(new SREFB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk), - Timespan(span.End() - clk, span.End())}, std::shared_ptr())); + return std::shared_ptr(new SREF(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, + burstLength, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.SREFEN), + Timespan(span.End() - clk * cl.SREFEX, span.End())})); 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 4aef44c7..10d99b54 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.h +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.h @@ -50,8 +50,9 @@ class PhaseFactory public: PhaseFactory() = delete; static std::shared_ptr CreatePhase(ID id, const QString &dbPhaseName, - const Timespan &span, const std::shared_ptr &trans, - TraceDB &database); + const Timespan& span, const Timespan& spanOnDataStrobe, + unsigned int rank, unsigned int bankGroup, unsigned int bank, unsigned int row, unsigned int column, + unsigned int burstLength, const std::shared_ptr &trans, TraceDB &database); }; #endif // PHASEFACTORY_H diff --git a/DRAMSys/traceAnalyzer/businessObjects/transaction.cpp b/DRAMSys/traceAnalyzer/businessObjects/transaction.cpp index 11f188f7..e97dddf0 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/transaction.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/transaction.cpp @@ -42,13 +42,9 @@ using namespace std; unsigned int Transaction::mSNumTransactions = 0; -Transaction::Transaction(ID id, unsigned int address, unsigned int burstlength, - unsigned int thread, unsigned int channel, unsigned int rank, - unsigned int bankgroup, unsigned int bank, unsigned int row, unsigned int column, - Timespan span, Timespan spanOnDataStrobe, traceTime clk) - : clk(clk), address(address), burstlength(burstlength), thread(thread), channel(channel), - rank(rank), bankgroup(bankgroup), bank(bank), row(row), column(column), span(span), - spanOnDataStrobe(spanOnDataStrobe), id(id) {} +Transaction::Transaction(ID id, unsigned int address, unsigned int dataLength, + unsigned int thread, unsigned int channel, Timespan span, traceTime clk) + : clk(clk), address(address), dataLength(dataLength), thread(thread), channel(channel), span(span), id(id) {} void Transaction::addPhase(shared_ptr phase) { diff --git a/DRAMSys/traceAnalyzer/businessObjects/transaction.h b/DRAMSys/traceAnalyzer/businessObjects/transaction.h index d2c97990..f6caf329 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/transaction.h +++ b/DRAMSys/traceAnalyzer/businessObjects/transaction.h @@ -53,16 +53,13 @@ private: traceTime clk; public: - const unsigned int address, burstlength, thread, channel, rank, - bankgroup, bank, row, column; + const uint64_t address; + const unsigned int dataLength, thread, channel; const Timespan span; - const Timespan spanOnDataStrobe; const ID id; - Transaction(ID id, unsigned int address, unsigned int burstlength, - unsigned int thread, unsigned int channel, unsigned int rank, - unsigned int bankgroup, unsigned int bank, unsigned int row, unsigned int column, - Timespan span, Timespan spanOnDataStrobe, traceTime clk); + Transaction(ID id, unsigned int address, unsigned int dataLength, unsigned int thread, unsigned int channel, + Timespan span, traceTime clk); void draw(QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, bool highlight, diff --git a/DRAMSys/traceAnalyzer/data/QueryTexts.h b/DRAMSys/traceAnalyzer/data/QueryTexts.h index 361ec855..996df475 100644 --- a/DRAMSys/traceAnalyzer/data/QueryTexts.h +++ b/DRAMSys/traceAnalyzer/data/QueryTexts.h @@ -50,11 +50,10 @@ struct TransactionQueryTexts { TransactionQueryTexts() { queryHead = - "SELECT Transactions.ID AS TransactionID, Ranges.begin, Ranges.end,DataStrobeBegin,DataStrobeEnd, Address,Burstlength, TThread, TChannel, TRank, TBankgroup, TBank, TRow, TColumn,Phases.ID AS PhaseID, PhaseName, PhaseBegin, PhaseEnd " + "SELECT Transactions.ID AS TransactionID, Ranges.begin, Ranges.end, Address, DataLength, Thread, Channel, Phases.ID AS PhaseID, PhaseName, PhaseBegin, PhaseEnd, DataStrobeBegin, DataStrobeEnd, Rank, BankGroup, Bank, Row, Column, BurstLength " " FROM Transactions INNER JOIN Phases ON Phases.Transact = Transactions.ID INNER JOIN Ranges ON Transactions.Range = Ranges.ID "; - selectTransactionsByTimespan = queryHead + - " WHERE Ranges.end >= :begin AND Ranges.begin <= :end"; + selectTransactionsByTimespan = queryHead + " WHERE Ranges.end >= :begin AND Ranges.begin <= :end"; selectTransactionById = queryHead + " WHERE Transactions.ID = :id"; checkDependenciesExist = "SELECT CASE WHEN 0 < (SELECT count(*) FROM sqlite_master WHERE type = 'table' AND " diff --git a/DRAMSys/traceAnalyzer/data/tracedb.cpp b/DRAMSys/traceAnalyzer/data/tracedb.cpp index b445e478..4b17e031 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.cpp +++ b/DRAMSys/traceAnalyzer/data/tracedb.cpp @@ -311,7 +311,7 @@ GeneralInfo TraceDB::getGeneralInfoFromDB() parameter = getParameterFromTable("RefreshMaxPulledin", "GeneralInfo"); unsigned refreshMaxPulledin = parameter.isValid() ? parameter.toUInt() : 0; parameter = getParameterFromTable("ControllerThread", "GeneralInfo"); - uint64_t controllerThread = parameter.isValid() ? parameter.toULongLong() : UINT64_MAX; + unsigned controllerThread = parameter.isValid() ? parameter.toUInt() : UINT_MAX; parameter = getParameterFromTable("MaxBufferDepth", "GeneralInfo"); unsigned maxBufferDepth = parameter.isValid() ? parameter.toUInt() : 8; parameter = getParameterFromTable("Per2BankOffset", "GeneralInfo"); @@ -535,34 +535,35 @@ std::vector> TraceDB::parseTransactionsFromQuery(QS ID currentID = 0; int i = -1; - while (query.next()) { - + while (query.next()) + { ID id = query.value(0).toInt(); - if (currentID != id || firstIteration) { + if (currentID != id || firstIteration) + { ++i; firstIteration = false; currentID = id; Timespan span(query.value(1).toLongLong(), query.value(2).toLongLong()); - Timespan spanOnStrobe(query.value(3).toLongLong(), query.value(4).toLongLong()); - unsigned int address = query.value(5).toInt(); - unsigned int burstlength = query.value(6).toInt(); - unsigned int thread = query.value(7).toInt(); - unsigned int channel = query.value(8).toInt(); - unsigned int rank = query.value(9).toInt(); - unsigned int bankgroup = query.value(10).toInt(); - unsigned int bank = query.value(11).toInt(); - unsigned int row = query.value(12).toInt(); - unsigned int column = query.value(13).toInt(); - result.push_back(std::make_shared(id, address, burstlength, - thread, channel, rank, bankgroup, bank, row, column, - span, spanOnStrobe, generalInfo.clkPeriod)); + uint64_t address = query.value(3).toULongLong(); + unsigned int dataLength = query.value(4).toUInt(); + unsigned int thread = query.value(5).toUInt(); + unsigned int channel = query.value(6).toUInt(); + result.push_back(std::make_shared(id, address, dataLength, thread, channel, span, generalInfo.clkPeriod)); } - unsigned int phaseID = query.value(14).toInt(); - QString phaseName = query.value(15).toString(); - Timespan span(query.value(16).toLongLong(), query.value(17).toLongLong()); - auto phase = PhaseFactory::CreatePhase(phaseID, phaseName, span, result.at(result.size() - 1), *this); + unsigned int phaseID = query.value(7).toInt(); + QString phaseName = query.value(8).toString(); + Timespan span(query.value(9).toLongLong(), query.value(10).toLongLong()); + Timespan spanOnDataStrobe(query.value(11).toLongLong(), query.value(12).toLongLong()); + unsigned int rank = query.value(13).toUInt(); + unsigned int bankGroup = query.value(14).toUInt(); + unsigned int bank = query.value(15).toUInt(); + unsigned int row = query.value(16).toUInt(); + unsigned int column = query.value(17).toUInt(); + unsigned int burstLength = query.value(18).toUInt(); + auto phase = PhaseFactory::CreatePhase(phaseID, phaseName, span, spanOnDataStrobe, rank, bankGroup, bank, + row, column, burstLength, result.at(result.size() - 1), *this); result.at(result.size() - 1)->addPhase(phase); if (updateVisiblePhases) diff --git a/DRAMSys/traceAnalyzer/presentation/transactiontreewidget.cpp b/DRAMSys/traceAnalyzer/presentation/transactiontreewidget.cpp index 759bbdde..f8e5637f 100644 --- a/DRAMSys/traceAnalyzer/presentation/transactiontreewidget.cpp +++ b/DRAMSys/traceAnalyzer/presentation/transactiontreewidget.cpp @@ -79,9 +79,9 @@ void TransactionTreeWidget::ContextMenuRequested(QPoint point) contextMenu.addActions({goToTransaction}); QAction *selectedContextMenuItems = contextMenu.exec(mapToGlobal(point)); - if (selectedContextMenuItems) { - TransactionTreeItem *item = static_cast - (selectedItems().at(0)); + if (selectedContextMenuItems) + { + TransactionTreeItem *item = dynamic_cast(selectedItems().at(0)); navigator->selectTransaction(item->Id()); } } @@ -95,29 +95,30 @@ TransactionTreeWidget::TransactionTreeItem::TransactionTreeItem( this->setText(0, QString::number(transaction->id)); this->id = transaction->id; - QTreeWidgetItem *time = new QTreeWidgetItem({"Timespan"}); + bool isControllerTransaction = (transaction->thread == generalInfo.controllerThread); + + auto* time = new QTreeWidgetItem({"Timespan"}); AppendTimespan(time, transaction->span); this->addChild(time); this->addChild(new QTreeWidgetItem({"Length", prettyFormatTime(transaction->span.timeCovered())})); - this->addChild(new QTreeWidgetItem({"Channel", QString::number(transaction->channel)})); - this->addChild(new QTreeWidgetItem({"Rank", QString::number(transaction->rank)})); - this->addChild(new QTreeWidgetItem({"Bankgroup", QString::number(transaction->bankgroup % generalInfo.groupsPerRank)})); - this->addChild(new QTreeWidgetItem({"Bank", QString::number(transaction->bank % generalInfo.banksPerGroup)})); - this->addChild(new QTreeWidgetItem({"Row", QString::number(transaction->row)})); - this->addChild(new QTreeWidgetItem({"Column", QString::number(transaction->column)})); + // TODO: move to phase + //this->addChild(new QTreeWidgetItem({"Rank", QString::number(transaction->rank)})); + //this->addChild(new QTreeWidgetItem({"Bankgroup", QString::number(transaction->bankgroup % generalInfo.groupsPerRank)})); + //this->addChild(new QTreeWidgetItem({"Bank", QString::number(transaction->bank % generalInfo.banksPerGroup)})); + //this->addChild(new QTreeWidgetItem({"Row", QString::number(transaction->row)})); + //this->addChild(new QTreeWidgetItem({"Column", QString::number(transaction->column)})); this->addChild(new QTreeWidgetItem({"Address", QString("0x") + QString::number(transaction->address, 16)})); - - if (transaction->thread != generalInfo.controllerThread) - { - this->addChild(new QTreeWidgetItem({"Burstlength", QString::number(transaction->burstlength)})); + if (!isControllerTransaction) + this->addChild(new QTreeWidgetItem({"Data Length", QString::number(transaction->dataLength)})); + this->addChild(new QTreeWidgetItem({"Channel", QString::number(transaction->channel)})); + if (!isControllerTransaction) this->addChild(new QTreeWidgetItem({"Thread", QString::number(transaction->thread)})); - } - QTreeWidgetItem *phasesNode = new QTreeWidgetItem(this); + auto* phasesNode = new QTreeWidgetItem(this); phasesNode->setText(0, "Phases"); phasesNode->addChild(new QTreeWidgetItem({"", "Begin", "End"})); - for (std::shared_ptr phase : transaction->Phases()) { + for (const std::shared_ptr& phase : transaction->Phases()) { AppendPhase(phasesNode, *phase); } } diff --git a/DRAMSys/traceAnalyzer/queryeditor.cpp b/DRAMSys/traceAnalyzer/queryeditor.cpp index 19086392..0a97f840 100644 --- a/DRAMSys/traceAnalyzer/queryeditor.cpp +++ b/DRAMSys/traceAnalyzer/queryeditor.cpp @@ -61,15 +61,18 @@ void QueryEditor::init(TraceNavigator *navigator) void QueryEditor::on_executeQuery_clicked() { - try { - std::vector> result = - navigator->TraceFile().getTransactionsWithCustomQuery(queryTexts.queryHead + " " - + ui->queryEdit->toPlainText()); + try + { + std::vector> result = navigator->TraceFile().getTransactionsWithCustomQuery( + queryTexts.queryHead + " " + ui->queryEdit->toPlainText()); ui->transactiontreeWidget->clear(); - for (const auto &trans : result) { + for (const auto& trans : result) + { ui->transactiontreeWidget->AppendTransaction(trans); } - } catch (sqlException ex) { + } + catch (sqlException ex) + { QMessageBox::warning(this, "Query failed", ex.what()); } }