diff --git a/DRAMSys/tests/DDR4/scripts/createTraceDB.sql b/DRAMSys/tests/DDR4/scripts/createTraceDB.sql index 7a127fac..a8fa60a8 100644 --- a/DRAMSys/tests/DDR4/scripts/createTraceDB.sql +++ b/DRAMSys/tests/DDR4/scripts/createTraceDB.sql @@ -19,6 +19,7 @@ CREATE TABLE GeneralInfo( NumberOfTransactions INTEGER, TraceEnd INTEGER, NumberOfRanks INTEGER, + NumberOfBankgroups INTEGER, NumberOfBanks INTEGER, clk INTEGER, UnitOfTime TEXT, @@ -41,6 +42,7 @@ CREATE TABLE CommandLengths( WRA INTEGER, REFA INTEGER, REFB INTEGER, + REFSB INTEGER, PDEA INTEGER, PDXA INTEGER, PDEP INTEGER, diff --git a/DRAMSys/tests/HBM2/scripts/createTraceDB.sql b/DRAMSys/tests/HBM2/scripts/createTraceDB.sql index 7a127fac..a8fa60a8 100644 --- a/DRAMSys/tests/HBM2/scripts/createTraceDB.sql +++ b/DRAMSys/tests/HBM2/scripts/createTraceDB.sql @@ -19,6 +19,7 @@ CREATE TABLE GeneralInfo( NumberOfTransactions INTEGER, TraceEnd INTEGER, NumberOfRanks INTEGER, + NumberOfBankgroups INTEGER, NumberOfBanks INTEGER, clk INTEGER, UnitOfTime TEXT, @@ -41,6 +42,7 @@ CREATE TABLE CommandLengths( WRA INTEGER, REFA INTEGER, REFB INTEGER, + REFSB INTEGER, PDEA INTEGER, PDXA INTEGER, PDEP INTEGER, diff --git a/DRAMSys/tests/ddr3_multirank/scripts/createTraceDB.sql b/DRAMSys/tests/ddr3_multirank/scripts/createTraceDB.sql index 7a127fac..a8fa60a8 100644 --- a/DRAMSys/tests/ddr3_multirank/scripts/createTraceDB.sql +++ b/DRAMSys/tests/ddr3_multirank/scripts/createTraceDB.sql @@ -19,6 +19,7 @@ CREATE TABLE GeneralInfo( NumberOfTransactions INTEGER, TraceEnd INTEGER, NumberOfRanks INTEGER, + NumberOfBankgroups INTEGER, NumberOfBanks INTEGER, clk INTEGER, UnitOfTime TEXT, @@ -41,6 +42,7 @@ CREATE TABLE CommandLengths( WRA INTEGER, REFA INTEGER, REFB INTEGER, + REFSB INTEGER, PDEA INTEGER, PDXA INTEGER, PDEP INTEGER, diff --git a/DRAMSys/tests/lpddr4/scripts/createTraceDB.sql b/DRAMSys/tests/lpddr4/scripts/createTraceDB.sql index 7a127fac..a8fa60a8 100644 --- a/DRAMSys/tests/lpddr4/scripts/createTraceDB.sql +++ b/DRAMSys/tests/lpddr4/scripts/createTraceDB.sql @@ -19,6 +19,7 @@ CREATE TABLE GeneralInfo( NumberOfTransactions INTEGER, TraceEnd INTEGER, NumberOfRanks INTEGER, + NumberOfBankgroups INTEGER, NumberOfBanks INTEGER, clk INTEGER, UnitOfTime TEXT, @@ -41,6 +42,7 @@ CREATE TABLE CommandLengths( WRA INTEGER, REFA INTEGER, REFB INTEGER, + REFSB INTEGER, PDEA INTEGER, PDXA INTEGER, PDEP INTEGER, diff --git a/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h b/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h index 8eaa9fd4..d201f80d 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h +++ b/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h @@ -40,28 +40,33 @@ #include "timespan.h" #include -struct GeneralInfo { +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 description; QString unitOfTime; unsigned int clkPeriod; unsigned int windowSize; unsigned int controllerThread; -public: GeneralInfo(unsigned int numberOfTransactions, unsigned int numberOfPhases, Timespan span, unsigned int numberOfRanks, unsigned int numberOfBankgroups, unsigned int numberOfBanks, const QString &description, QString unitOfTime, unsigned int clkPeriod, unsigned int windowSize, unsigned int controllerThread) : numberOfTransactions(numberOfTransactions) , numberOfPhases(numberOfPhases), span(span), numberOfRanks(numberOfRanks), numberOfBankgroups(numberOfBankgroups), numberOfBanks(numberOfBanks), - description(description), unitOfTime(unitOfTime), clkPeriod(clkPeriod), - windowSize(windowSize), controllerThread(controllerThread) {} + banksPerRank(numberOfBanks / numberOfRanks), groupsPerRank(numberOfBankgroups / numberOfRanks), + banksPerGroup(numberOfBanks / numberOfBankgroups), description(description), unitOfTime(unitOfTime), + clkPeriod(clkPeriod), windowSize(windowSize), controllerThread(controllerThread) {} GeneralInfo() {} }; diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp index 1f88cc24..a4393318 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp @@ -113,20 +113,20 @@ QColor Phase::getColor(const TraceDrawingProperties &drawingProperties) const break; case ColorGrouping::Thread: return ColorGenerator::getColor(static_cast - (transaction->Thread())); + (transaction->thread)); break; case ColorGrouping::Transaction: default: - return ColorGenerator::getColor(transaction->Id()); + return ColorGenerator::getColor(transaction->id); } } int Phase::getYVal(const TraceDrawingProperties &drawingProperties) const { if (isBankwise()) - return transaction->Bank(); + return transaction->bank; else - return transaction->Rank() * drawingProperties.banksPerRank; + return transaction->rank * drawingProperties.banksPerRank; } Qt::BrushStyle Phase::getBrushStyle() const diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp index 862bf687..94a6c453 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp @@ -81,16 +81,16 @@ shared_ptr PhaseFactory::CreatePhase(ID id, const QString &dbPhaseName, {Timespan(span.Begin(), span.Begin() + clk * cl.REFSB)}, std::shared_ptr())); else if (dbPhaseName == "RD") return shared_ptr(new RD(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RD)}, - std::shared_ptr(new Timespan(trans->SpanOnDataStrobe())))); + std::shared_ptr(new Timespan(trans->spanOnDataStrobe)))); else if (dbPhaseName == "RDA") return shared_ptr(new RDA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RDA)}, - std::shared_ptr(new Timespan(trans->SpanOnDataStrobe())))); + std::shared_ptr(new Timespan(trans->spanOnDataStrobe)))); else if (dbPhaseName == "WR") return shared_ptr(new WR(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WR)}, - std::shared_ptr(new Timespan(trans->SpanOnDataStrobe())))); + std::shared_ptr(new Timespan(trans->spanOnDataStrobe)))); else if (dbPhaseName == "WRA") return shared_ptr(new WRA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WRA)}, - std::shared_ptr(new Timespan(trans->SpanOnDataStrobe())))); + std::shared_ptr(new Timespan(trans->spanOnDataStrobe)))); else if (dbPhaseName == "PDNA") return shared_ptr(new PDNA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEA), Timespan(span.End() - clk * cl.PDXA, span.End())}, std::shared_ptr())); diff --git a/DRAMSys/traceAnalyzer/businessObjects/transaction.h b/DRAMSys/traceAnalyzer/businessObjects/transaction.h index b6027df0..57854bea 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/transaction.h +++ b/DRAMSys/traceAnalyzer/businessObjects/transaction.h @@ -48,14 +48,15 @@ typedef unsigned int ID; class Transaction { private: - unsigned int address, burstlength, thread, channel, rank, - bankgroup, bank, row, column; - Timespan span; - Timespan spanOnDataStrobe; - ID id; std::vector> phases; public: + const unsigned int address, burstlength, thread, channel, rank, + bankgroup, bank, row, column; + 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, @@ -69,54 +70,6 @@ public: bool isSelected(traceTime time, double yVal, const TraceDrawingProperties &drawingproperties) const; - unsigned int Address() const - { - return address; - } - unsigned int Burstlength() const - { - return burstlength; - } - unsigned int Thread() - { - return thread; - } - unsigned int Channel() const - { - return channel; - } - unsigned int Rank() const - { - return rank; - } - unsigned int Bankgroup() const - { - return bankgroup; - } - unsigned int Bank() const - { - return bank; - } - unsigned int Row() const - { - return row; - } - unsigned int Column() const - { - return column; - } - ID Id() const - { - return id; - } - const Timespan &Span() const - { - return span; - } - const Timespan &SpanOnDataStrobe() - { - return spanOnDataStrobe; - } const std::vector> &Phases() const { return phases; diff --git a/DRAMSys/traceAnalyzer/presentation/tracenavigator.cpp b/DRAMSys/traceAnalyzer/presentation/tracenavigator.cpp index afd59c73..7ff82f87 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracenavigator.cpp +++ b/DRAMSys/traceAnalyzer/presentation/tracenavigator.cpp @@ -69,7 +69,7 @@ void TraceNavigator::navigateToTime(traceTime time) void TraceNavigator::navigateToTransaction(ID id) { - navigateToTime(traceFile.getTransactionByID(id)->Span().Begin()); + navigateToTime(traceFile.getTransactionByID(id)->span.Begin()); } @@ -162,25 +162,25 @@ void TraceNavigator::selectTransaction(ID id) void TraceNavigator::selectTransaction(const shared_ptr &transaction) { - selectTransaction(transaction->Id()); + selectTransaction(transaction->id); } void TraceNavigator::selectNextTransaction() { if (selectedTransactions.empty() - || selectedTransactions.front()->Id() == + || selectedTransactions.front()->id == traceFile.getGeneralInfo().numberOfTransactions) selectFirstTransaction(); else - selectTransaction(selectedTransactions.front()->Id() + 1); + selectTransaction(selectedTransactions.front()->id + 1); } void TraceNavigator::selectPreviousTransaction() { - if (selectedTransactions.empty() || selectedTransactions.front()->Id() == 1) + if (selectedTransactions.empty() || selectedTransactions.front()->id == 1) selectLastTransaction(); else - selectTransaction(selectedTransactions.front()->Id() - 1); + selectTransaction(selectedTransactions.front()->id - 1); } void TraceNavigator::selectFirstTransaction() @@ -199,7 +199,7 @@ void TraceNavigator::selectNextRefresh() shared_ptr nextRefresh; if (!SelectedTransactions().empty()) - nextRefresh = traceFile.getNextRefresh(SelectedTransactions().front()->Id()); + nextRefresh = traceFile.getNextRefresh(SelectedTransactions().front()->id); else nextRefresh = traceFile.getNextRefresh(0); @@ -212,7 +212,7 @@ void TraceNavigator::selectNextActivate() shared_ptr nextActivate; if (!SelectedTransactions().empty()) - nextActivate = traceFile.getNextActivate(SelectedTransactions().front()->Id()); + nextActivate = traceFile.getNextActivate(SelectedTransactions().front()->id); else nextActivate = traceFile.getNextActivate(0); @@ -226,7 +226,7 @@ void TraceNavigator::selectNextPrecharge() if (!SelectedTransactions().empty()) nextPrecharge = traceFile.getNextPrecharge( - SelectedTransactions().front()->Id()); + SelectedTransactions().front()->id); else nextPrecharge = traceFile.getNextPrecharge(0); @@ -239,7 +239,7 @@ void TraceNavigator::selectNextActb() shared_ptr nextActb; if (!SelectedTransactions().empty()) - nextActb = traceFile.getNextActb(SelectedTransactions().front()->Id()); + nextActb = traceFile.getNextActb(SelectedTransactions().front()->id); else nextActb = traceFile.getNextActb(0); @@ -253,7 +253,7 @@ void TraceNavigator::selectNextPreb() if (!SelectedTransactions().empty()) nextPreb = traceFile.getNextPreb( - SelectedTransactions().front()->Id()); + SelectedTransactions().front()->id); else nextPreb = traceFile.getNextPreb(0); @@ -266,7 +266,7 @@ void TraceNavigator::selectNextRefb() shared_ptr n; if (!SelectedTransactions().empty()) - n = traceFile.getNextRefb(SelectedTransactions().front()->Id()); + n = traceFile.getNextRefb(SelectedTransactions().front()->id); else n = traceFile.getNextRefb(0); @@ -277,13 +277,13 @@ void TraceNavigator::selectNextRefb() bool TraceNavigator::transactionIsSelected(const shared_ptr &transaction) const { - return transactionIsSelected(transaction->Id()); + return transactionIsSelected(transaction->id); } bool TraceNavigator::transactionIsSelected(ID id) const { for (const auto &transaction : selectedTransactions) { - if (transaction->Id() == id) + if (transaction->id == id) return true; } return false; @@ -307,12 +307,12 @@ Timespan TraceNavigator::getSpanCoveredBySelectedTransaction() if (!hasSelectedTransactions()) return Timespan(0, 0); - traceTime begin = SelectedTransactions().at(0)->Span().Begin(); - traceTime end = SelectedTransactions().at(0)->Span().End(); + traceTime begin = SelectedTransactions().at(0)->span.Begin(); + traceTime end = SelectedTransactions().at(0)->span.End(); for (const auto &transaction : selectedTransactions) { - if (transaction->Span().End() > end) - end = transaction->Span().End(); + if (transaction->span.End() > end) + end = transaction->span.End(); } return Timespan(begin, end); diff --git a/DRAMSys/traceAnalyzer/presentation/transactiontreewidget.cpp b/DRAMSys/traceAnalyzer/presentation/transactiontreewidget.cpp index bd30ad40..af97ff3b 100644 --- a/DRAMSys/traceAnalyzer/presentation/transactiontreewidget.cpp +++ b/DRAMSys/traceAnalyzer/presentation/transactiontreewidget.cpp @@ -66,7 +66,7 @@ void TransactionTreeWidget::AppendTransaction(const shared_ptr &transaction) { QTreeWidgetItem *node = new TransactionTreeItem(this, transaction, - navigator->GeneralTraceInfo().controllerThread); + navigator->GeneralTraceInfo()); addTopLevelItem(node); } @@ -89,33 +89,33 @@ void TransactionTreeWidget::ContextMenuRequested(QPoint point) TransactionTreeWidget::TransactionTreeItem::TransactionTreeItem( QTreeWidget *parent, const shared_ptr &transaction, - unsigned int controllerThread) : QTreeWidgetItem(parent, - transactionTreeItemType) + const GeneralInfo &generalInfo) + : QTreeWidgetItem(parent, transactionTreeItemType) { - this->setText(0, QString::number(transaction->Id())); - this->id = transaction->Id(); + this->setText(0, QString::number(transaction->id)); + this->id = transaction->id; QTreeWidgetItem *time = new QTreeWidgetItem({"Timespan"}); - AppendTimespan(time, transaction->Span()); + AppendTimespan(time, transaction->span); this->addChild(time); - this->addChild(new QTreeWidgetItem( {"Lenght", prettyFormatTime(transaction->Span().timeCovered())})); + this->addChild(new QTreeWidgetItem({"Lenght", 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)})); + this->addChild(new QTreeWidgetItem({"Address", QString("0x") + QString::number(transaction->address, 16)})); - 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())} )); - this->addChild(new QTreeWidgetItem( {"Bank", QString::number(transaction->Bank())} )); - 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() != controllerThread) { - this->addChild(new QTreeWidgetItem( {"Burstlength", QString::number(transaction->Burstlength())})); - this->addChild(new QTreeWidgetItem( {"Thread", QString::number(transaction->Thread())})); + if (transaction->thread != generalInfo.controllerThread) + { + this->addChild(new QTreeWidgetItem({"Burstlength", QString::number(transaction->burstlength)})); + this->addChild(new QTreeWidgetItem({"Thread", QString::number(transaction->thread)})); } QTreeWidgetItem *phasesNode = new QTreeWidgetItem(this); phasesNode->setText(0, "Phases"); - phasesNode->addChild(new QTreeWidgetItem( {"", "Begin", "End"} )); + phasesNode->addChild(new QTreeWidgetItem({"", "Begin", "End"})); for (std::shared_ptr phase : transaction->Phases()) { AppendPhase(phasesNode, *phase); diff --git a/DRAMSys/traceAnalyzer/presentation/transactiontreewidget.h b/DRAMSys/traceAnalyzer/presentation/transactiontreewidget.h index a08547ab..5cda6399 100644 --- a/DRAMSys/traceAnalyzer/presentation/transactiontreewidget.h +++ b/DRAMSys/traceAnalyzer/presentation/transactiontreewidget.h @@ -71,7 +71,7 @@ private: public: static constexpr int transactionTreeItemType = 1001; TransactionTreeItem(QTreeWidget *parent, - const std::shared_ptr &trans, unsigned int controllerThread); + const std::shared_ptr &trans, const GeneralInfo &generalInfo); ID Id() { return id;