From 6bbc348b8a4c1a98a1fbf63b6b3f62adab030d8a Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Mon, 28 Jun 2021 18:59:32 +0200 Subject: [PATCH] Make the lines of the TraceAnalyzer more dynamic This commit is a preparation for the upcoming feature that will make dynamically rearranging the lines of the TracePlot possible. Most importantly the y-values of the lines in the TraceDrawingProperties class aren't statically defined any more and can already be rearranged as wanted in the code. --- .../businessObjects/phases/phase.cpp | 102 +++---- .../businessObjects/phases/phase.h | 12 +- .../presentation/tracedrawingproperties.cpp | 253 +++++++++++++----- .../presentation/tracedrawingproperties.h | 46 +++- .../presentation/tracenavigator.cpp | 10 + .../presentation/tracenavigator.h | 5 + .../traceAnalyzer/presentation/traceplot.cpp | 30 ++- .../traceAnalyzer/presentation/traceplot.h | 1 + .../presentation/traceplotline.cpp | 31 ++- .../presentation/traceplotline.h | 15 +- .../presentation/tracescroller.cpp | 19 +- .../presentation/tracescroller.h | 3 + 12 files changed, 358 insertions(+), 169 deletions(-) diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp index 1f0308f9..869b20b3 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp @@ -66,33 +66,29 @@ void Phase::draw(QPainter *painter, const QwtScaleMap &xMap, if (!isCollapsed(drawingProperties)) { - if (getGranularity() == Granularity::Rankwise) + for (auto line : getTracePlotLines(drawingProperties)) { - for (int i = getYVal(drawingProperties); i < (int)(getYVal(drawingProperties) + drawingProperties.banksPerRank); i++) - drawPhaseSymbol(span.Begin(), span.End(), i, drawingProperties.drawText, - getPhaseSymbol(), painter, xMap, yMap); - } - else if (getGranularity() == Granularity::Groupwise) - { - for (int i = getYVal(drawingProperties); i < (int)(getYVal(drawingProperties) + drawingProperties.banksPerRank); i += drawingProperties.banksPerGroup) - drawPhaseSymbol(span.Begin(), span.End(), i, drawingProperties.drawText, - getPhaseSymbol(), painter, xMap, yMap); - } - else // if (getGranularity() == Granularity::Bankwise) - drawPhaseSymbol(span.Begin(), span.End(), getYVal(drawingProperties), + drawPhaseSymbol(span.Begin(), span.End(), line->getYVal(), drawingProperties.drawText, getPhaseSymbol(), painter, xMap, yMap); + } } for (Timespan span : spansOnCommandBus) { - drawPhaseSymbol(span.Begin(), span.End(), drawingProperties.yValCommandBus, - false, PhaseSymbol::Hexagon, painter, xMap, yMap); + for (auto commandBusLine : drawingProperties.getCommandBusLines()) + { + drawPhaseSymbol(span.Begin(), span.End(), commandBusLine->getYVal(), + false, PhaseSymbol::Hexagon, painter, xMap, yMap); + } } if (spanOnDataBus) { - drawPhaseSymbol(spanOnDataBus->Begin(), spanOnDataBus->End(), drawingProperties.yValDataBus, - false, PhaseSymbol::Hexagon, painter, xMap, yMap); + for (auto dataBusLine : drawingProperties.getDataBusLines()) + { + drawPhaseSymbol(spanOnDataBus->Begin(), spanOnDataBus->End(), dataBusLine->getYVal(), + false, PhaseSymbol::Hexagon, painter, xMap, yMap); + } } } @@ -137,16 +133,6 @@ QColor Phase::getColor(const TraceDrawingProperties &drawingProperties) const } } -int Phase::getYVal(const TraceDrawingProperties &drawingProperties) const -{ - if (getGranularity() == Granularity::Bankwise) - return drawingProperties.getYValOfBank(transaction->bank); - else if (getGranularity() == Granularity::Groupwise) - return drawingProperties.getYValOfBankGroup(transaction->rank, transaction->bank); - else // if (getGranularity() == Granularity::Rankwise) - return drawingProperties.getYValOfRank(transaction->rank); -} - Qt::BrushStyle Phase::getBrushStyle() const { return Qt::SolidPattern; @@ -160,36 +146,31 @@ bool Phase::isSelected(traceTime time, double yVal, if (span.Begin() <= time && time <= (span.End() + offset)) { - if (getGranularity() == Granularity::Bankwise) + for (auto line : getTracePlotLines(drawingProperties)) { - if (fabs(yVal - getYVal(drawingProperties)) <= hexagonHeight) + if (fabs(yVal - line->getYVal()) <= hexagonHeight) return true; } - else if (getGranularity() == Granularity::Groupwise) - { - for (int offset = 0; offset < drawingProperties.banksPerRank; offset += drawingProperties.banksPerGroup) - { - if (fabs(yVal - (getYVal(drawingProperties) + offset)) <= hexagonHeight) - return true; - } - } - else // if (getGranularity() == Granularity::Rankwise) - { - for (int offset = 0; offset < drawingProperties.banksPerRank; offset++) - { - if (fabs(yVal - (getYVal(drawingProperties) + offset)) <= hexagonHeight) - return true; - } - } } - if (spanOnDataBus && spanOnDataBus->contains(time) && fabs(yVal - drawingProperties.yValDataBus) <= hexagonHeight) - return true; + if (spanOnDataBus && spanOnDataBus->contains(time)) + { + for (auto dataBusLine : drawingProperties.getDataBusLines()) + { + if (fabs(yVal - dataBusLine->getYVal()) <= hexagonHeight) + return true; + } + } for (Timespan span : spansOnCommandBus) { - if (span.contains(time) - && fabs(yVal - drawingProperties.yValCommandBus) <= hexagonHeight) - return true; + if (span.contains(time)) + { + for (auto commandBusLine : drawingProperties.getCommandBusLines()) + { + if (fabs(yVal - commandBusLine->getYVal()) <= hexagonHeight) + return true; + } + } } return false; @@ -200,6 +181,27 @@ Phase::PhaseSymbol Phase::getPhaseSymbol() const return PhaseSymbol::Hexagon; } +std::vector> Phase::getTracePlotLines(const TraceDrawingProperties &drawingProperties) const +{ + if (getGranularity() == Granularity::Rankwise) + { + return drawingProperties.getBankLinesFromRank(transaction->rank); + } + else if (getGranularity() == Granularity::Groupwise) + { + return drawingProperties.getBankLinesFromGroup(transaction->rank, + transaction->bankgroup % drawingProperties.groupsPerRank); + } + else // if (getGranularity() == Granularity::Bankwise) + { + return drawingProperties.getBankLines(transaction->rank, + transaction->bankgroup % drawingProperties.groupsPerRank, + transaction->bank + % drawingProperties.banksPerRank + % drawingProperties.banksPerGroup); + } +} + bool Phase::isCollapsed(const TraceDrawingProperties &drawingProperties) const { // Never discard REQ and RESP phases diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h index 986c0654..b5fb6815 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.h @@ -90,12 +90,14 @@ protected: virtual PhaseSymbol getPhaseSymbol() const; virtual Qt::BrushStyle getBrushStyle() const; virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const; - virtual int getYVal(const TraceDrawingProperties &drawingProperties) const; + virtual QColor getPhaseColor() const = 0; virtual void drawPhaseSymbol(traceTime begin, traceTime end, double y, bool drawtext, PhaseSymbol symbol, QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap) const; + virtual std::vector> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const; + enum class Granularity {Bankwise, Groupwise, Rankwise}; virtual Granularity getGranularity() const @@ -119,10 +121,10 @@ protected: { return "REQ"; } - virtual int getYVal(const TraceDrawingProperties &drawingProperties) const + virtual std::vector> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const override { - return drawingProperties.yValRequest; + return drawingProperties.getRequestLines(); } }; @@ -140,10 +142,10 @@ protected: { return "RESP"; } - virtual int getYVal(const TraceDrawingProperties &drawingProperties) const + virtual std::vector> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const override { - return drawingProperties.yValResponse; + return drawingProperties.getResponseLines(); } }; diff --git a/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp b/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp index 7b9ef486..c57bbc6b 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp +++ b/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.cpp @@ -35,25 +35,25 @@ #include "tracedrawingproperties.h" -TraceDrawingProperties::TraceDrawingProperties() : - drawText(true), - drawBorder(true), - colorGrouping(ColorGrouping::PhaseType) +TraceDrawingProperties::TraceDrawingProperties(bool drawText, bool drawBorder, + ColorGrouping colorGrouping) : + drawText(drawText), + drawBorder(drawBorder), + colorGrouping(colorGrouping) { } -TraceDrawingProperties::TraceDrawingProperties(bool drawText, bool drawBorder, - ColorGrouping colorGrouping) : - drawText(drawText), - drawBorder(drawBorder), - colorGrouping(colorGrouping) +void TraceDrawingProperties::init(std::shared_ptr tracePlotLines, + std::shared_ptr> collapsedRanks) { + this->tracePlotLines = tracePlotLines; + this->collapsedRanks = collapsedRanks; } void TraceDrawingProperties::setUpTracePlotLines() { - tracePlotLines.push_back(std::make_shared("REQ", collapsedRanks)); - tracePlotLines.push_back(std::make_shared("RESP", collapsedRanks)); + tracePlotLines->push_back(std::make_shared("REQ", collapsedRanks)); + tracePlotLines->push_back(std::make_shared("RESP", collapsedRanks)); for (unsigned int rank = numberOfRanks; rank--;) { @@ -61,26 +61,20 @@ void TraceDrawingProperties::setUpTracePlotLines() { for (unsigned int bank = banksPerGroup; bank--;) { - QString rankLabel = QString("RA") + QString::number(rank); - QString bankGroupLabel = QString("BG") + QString::number(group); - QString bankLabel = QString("BA") + QString::number(bank); - - QString label = rankLabel + QString(" ") + bankGroupLabel + QString(" ") + bankLabel; - std::shared_ptr line; if (bank == banksPerGroup - 1 && group == groupsPerRank - 1) - line = std::make_shared(label, rankLabel, rank, collapsedRanks); + line = std::make_shared(rank, group, bank, collapsedRanks); else - line = std::make_shared(label, rank, collapsedRanks); + line = std::make_shared(rank, group, bank, collapsedRanks); - tracePlotLines.push_back(line); + tracePlotLines->push_back(line); } } } - tracePlotLines.push_back(std::make_shared("Command Bus", collapsedRanks)); - tracePlotLines.push_back(std::make_shared("Data Bus", collapsedRanks)); + tracePlotLines->push_back(std::make_shared("Command Bus", collapsedRanks)); + tracePlotLines->push_back(std::make_shared("Data Bus", collapsedRanks)); // Collapse all ranks except the first one by default. for (int i = 0; i < numberOfRanks; i++) @@ -95,10 +89,10 @@ void TraceDrawingProperties::updateLabels() // Clear hash table, because otherwise not all old values will be overwritten. labels->clear(); - // The data bus is defined to start at -4. - int i = -4; + // The lowest line starts at the y value of 0. + int i = 0; - for (auto it = tracePlotLines.rbegin(); it != tracePlotLines.rend(); it++) + for (auto it = tracePlotLines->rbegin(); it != tracePlotLines->rend(); it++) { // Don't add collapsed ranks, but always add the first rank line. auto bankLine = std::dynamic_pointer_cast(*it); @@ -110,18 +104,7 @@ void TraceDrawingProperties::updateLabels() (*it)->setYVal(i); - if (std::dynamic_pointer_cast(*it)) - yValRequest = i; - - if (std::dynamic_pointer_cast(*it)) - yValResponse = i; - - if (std::dynamic_pointer_cast(*it)) - yValDataBus = i; - if (std::dynamic_pointer_cast(*it)) { - yValCommandBus = i; - // Add two spaces. i += 2; } @@ -135,26 +118,9 @@ const std::shared_ptr> TraceDrawingProperties::getLabels() c return labels; } -const std::vector> & TraceDrawingProperties::getTracePlotLines() const +const TracePlotLineVector &TraceDrawingProperties::getTracePlotLines() const { - return tracePlotLines; -} - -const std::shared_ptr TraceDrawingProperties::getFirstRankLine(unsigned int rank) const -{ - // TODO: Maybe cache results? - Q_ASSERT(rank <= numberOfRanks - 1); - - std::shared_ptr firstRankLine; - - for (auto &line : tracePlotLines) - { - firstRankLine = std::dynamic_pointer_cast(line); - if (firstRankLine && firstRankLine->rank == rank) - break; - } - - return firstRankLine; + return *tracePlotLines; } void TraceDrawingProperties::setRankCollapsedState(unsigned int rank, bool collapse) @@ -173,30 +139,179 @@ bool TraceDrawingProperties::getRankCollapsedState(unsigned int rank) const unsigned int TraceDrawingProperties::getNumberOfDisplayedLines() const { - return yValRequest + 6; + unsigned int max = 0; + + for (auto line : *tracePlotLines) + { + if (!line->isCollapsed() && max < line->getYVal()) + max = line->getYVal(); + } + + return max; } -unsigned int TraceDrawingProperties::getYValOfBank(unsigned int bank) const +std::vector> TraceDrawingProperties::getCommandBusLines() const { - unsigned int rank = bank / banksPerRank; + if (commandBusLinesCache.size() != 0) + return commandBusLinesCache; - return getYValOfRank(rank) + bank % banksPerRank; + std::vector> commandBusLines; + for (auto line : *tracePlotLines) + { + auto commandBusLine = std::dynamic_pointer_cast(line); + if (commandBusLine) + commandBusLines.push_back(commandBusLine); + } + + commandBusLinesCache = commandBusLines; + + return commandBusLines; } -unsigned int TraceDrawingProperties::getYValOfBankGroup(unsigned int rank, unsigned int bank) const +std::vector> TraceDrawingProperties::getDataBusLines() const { - return getYValOfRank(rank) + bank % banksPerGroup; + if (dataBusLinesCache.size() != 0) + return dataBusLinesCache; + + std::vector> dataBusLines; + for (auto line : *tracePlotLines) + { + auto dataBusLine = std::dynamic_pointer_cast(line); + if (dataBusLine) + dataBusLines.push_back(dataBusLine); + } + + dataBusLinesCache = dataBusLines; + + return dataBusLines; } -unsigned int TraceDrawingProperties::getYValOfRank(unsigned int rank) const +std::vector> TraceDrawingProperties::getRequestLines() const { - unsigned int i = 0; + if (requestLinesCache.size() != 0) + return requestLinesCache; - for (unsigned int j = 0; j < rank; j++) - if ((*collapsedRanks)[j]) - i += 1; - else - i += banksPerRank; + std::vector> requestLines; + for (auto line : *tracePlotLines) + { + auto requestLine = std::dynamic_pointer_cast(line); + if (requestLine) + requestLines.push_back(requestLine); + } - return i; + requestLinesCache = requestLines; + + return requestLines; +} + +std::vector> TraceDrawingProperties::getResponseLines() const +{ + if (responseLinesCache.size() != 0) + return responseLinesCache; + + std::vector> responseLines; + for (auto line : *tracePlotLines) + { + auto responseLine = std::dynamic_pointer_cast(line); + if (responseLine) + responseLines.push_back(responseLine); + } + + responseLinesCache = responseLines; + + return responseLines; +} + +std::vector> TraceDrawingProperties::getFirstRankLines(unsigned int rank) const +{ + Q_ASSERT(rank <= numberOfRanks - 1); + + if (firstRankLinesCache.find(rank) != firstRankLinesCache.end()) + return firstRankLinesCache[rank]; + + std::vector> firstRankLines; + + for (auto line : *tracePlotLines) + { + auto firstRankLine = std::dynamic_pointer_cast(line); + if (firstRankLine && firstRankLine->rank == rank) + firstRankLines.push_back(firstRankLine); + } + + firstRankLinesCache[rank] = firstRankLines; + + return firstRankLines; +} + +std::vector> TraceDrawingProperties::getBankLinesFromRank(unsigned int rank) const +{ + Q_ASSERT(rank <= numberOfRanks - 1); + + if (bankLinesFromRankCache.find(rank) != bankLinesFromRankCache.end()) + return bankLinesFromRankCache[rank]; + + std::vector> bankLines; + for (auto line : *tracePlotLines) + { + auto bankLine = std::dynamic_pointer_cast(line); + + if (bankLine && bankLine->rank == rank) + bankLines.push_back(bankLine); + } + + bankLinesFromRankCache[rank] = bankLines; + + return bankLines; +} + +std::vector> TraceDrawingProperties::getBankLinesFromGroup(unsigned int rank, unsigned int group) const +{ + Q_ASSERT(rank <= numberOfRanks - 1); + Q_ASSERT(group <= groupsPerRank - 1); + + std::tuple bankLinesTuple {rank, group}; + + if (bankLinesFromGroupCache.find(bankLinesTuple) != bankLinesFromGroupCache.end()) + return bankLinesFromGroupCache[bankLinesTuple]; + + std::vector> bankLines; + + for (auto line : *tracePlotLines) + { + auto bankLine = std::dynamic_pointer_cast(line); + + if (bankLine && bankLine->rank == rank && bankLine->group == group) + bankLines.push_back(bankLine); + } + + bankLinesFromGroupCache[bankLinesTuple] = bankLines; + + return bankLines; +} + +std::vector> TraceDrawingProperties::getBankLines(unsigned int rank, unsigned int group, + unsigned int bank) const +{ + Q_ASSERT(rank <= numberOfRanks - 1); + Q_ASSERT(group <= groupsPerRank - 1); + Q_ASSERT(bank <= banksPerGroup - 1); + + std::tuple bankLinesTuple {rank, group, bank}; + + if (bankLinesCache.find(bankLinesTuple) != bankLinesCache.end()) + return bankLinesCache[bankLinesTuple]; + + std::vector> bankLines; + + for (auto line : *tracePlotLines) + { + auto bankLine = std::dynamic_pointer_cast(line); + + if (bankLine && bankLine->rank == rank && bankLine->group == group && bankLine->bank == bank) + bankLines.push_back(bankLine); + } + + bankLinesCache[bankLinesTuple] = bankLines; + + return bankLines; } diff --git a/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.h b/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.h index 37ff6564..5dc40a3f 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.h +++ b/DRAMSys/traceAnalyzer/presentation/tracedrawingproperties.h @@ -43,19 +43,19 @@ #include #include #include +#include #include "tracedrawing.h" #include "traceplotline.h" enum class ColorGrouping {PhaseType, Transaction, Thread}; +using TracePlotLineVector = std::vector>; + struct TraceDrawingProperties { bool drawText; bool drawBorder; ColorGrouping colorGrouping; - int yValResponse; - int yValRequest; - int yValCommandBus; - int yValDataBus; + unsigned int numberOfRanks; unsigned int numberOfBankgroups; unsigned int numberOfBanks; @@ -63,8 +63,12 @@ struct TraceDrawingProperties { unsigned int groupsPerRank; unsigned int banksPerGroup; - TraceDrawingProperties(); - TraceDrawingProperties(bool drawText, bool drawBorder, ColorGrouping colorGrouping); + TraceDrawingProperties(bool drawText = true, + bool drawBorder = true, + ColorGrouping colorGrouping = ColorGrouping::PhaseType); + + void init(std::shared_ptr tracePlotLines, std::shared_ptr> collapsedRanks); + void setUpTracePlotLines(); void setRankCollapsedState(unsigned int rank, bool collapse); @@ -72,21 +76,35 @@ struct TraceDrawingProperties { unsigned int getNumberOfDisplayedLines() const; - unsigned int getYValOfBank(unsigned int bank) const; - unsigned int getYValOfBankGroup(unsigned int rank, unsigned int bank) const; - unsigned int getYValOfRank(unsigned int rank) const; + std::vector> getRequestLines() const; + std::vector> getResponseLines() const; + std::vector> getCommandBusLines() const; + std::vector> getDataBusLines() const; + std::vector> getFirstRankLines(unsigned int rank) const; + std::vector> getBankLines(unsigned int rank, unsigned int group, unsigned int bank) const; + std::vector> getBankLinesFromGroup(unsigned int rank, unsigned int group) const; + std::vector> getBankLinesFromRank(unsigned int rank) const; - - const std::vector> & getTracePlotLines() const; - const std::shared_ptr getFirstRankLine(unsigned int rank) const; + const TracePlotLineVector &getTracePlotLines() const; void updateLabels(); const std::shared_ptr> getLabels() const; private: std::shared_ptr> labels = std::make_shared>(); - std::shared_ptr> collapsedRanks = std::make_shared>(); - std::vector> tracePlotLines; + + std::shared_ptr> collapsedRanks; + std::shared_ptr tracePlotLines; + + // Caches + mutable std::map, std::vector>> bankLinesCache; + mutable std::map, std::vector>> bankLinesFromGroupCache; + mutable std::map>> bankLinesFromRankCache; + mutable std::map>> firstRankLinesCache; + mutable std::vector> requestLinesCache; + mutable std::vector> responseLinesCache; + mutable std::vector> commandBusLinesCache; + mutable std::vector> dataBusLinesCache; }; #endif // TRACECOLLECTIONDRAWINGPROPERTIES_H diff --git a/DRAMSys/traceAnalyzer/presentation/tracenavigator.cpp b/DRAMSys/traceAnalyzer/presentation/tracenavigator.cpp index 7ff82f87..b7f44ded 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracenavigator.cpp +++ b/DRAMSys/traceAnalyzer/presentation/tracenavigator.cpp @@ -317,3 +317,13 @@ Timespan TraceNavigator::getSpanCoveredBySelectedTransaction() return Timespan(begin, end); } + +std::shared_ptr> TraceNavigator::getCollapsedRanks() +{ + return collapsedRanks; +} + +std::shared_ptr TraceNavigator::getTracePlotLines() +{ + return tracePlotLines; +} diff --git a/DRAMSys/traceAnalyzer/presentation/tracenavigator.h b/DRAMSys/traceAnalyzer/presentation/tracenavigator.h index dd97db47..e390a8e1 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracenavigator.h +++ b/DRAMSys/traceAnalyzer/presentation/tracenavigator.h @@ -117,6 +117,9 @@ public: void commitChangesToDB(); void refreshData(); + std::shared_ptr> getCollapsedRanks(); + std::shared_ptr getTracePlotLines(); + Q_SIGNALS: void currentTraceTimeChanged(); void selectedTransactionsChanged(); @@ -133,6 +136,8 @@ private: void getCommentsFromDB(); bool changesToCommitExist; + std::shared_ptr> collapsedRanks = std::make_shared>(); + std::shared_ptr tracePlotLines = std::make_shared(); }; #endif // TRACENAVIGATOR_H diff --git a/DRAMSys/traceAnalyzer/presentation/traceplot.cpp b/DRAMSys/traceAnalyzer/presentation/traceplot.cpp index caf99c8f..c1781592 100644 --- a/DRAMSys/traceAnalyzer/presentation/traceplot.cpp +++ b/DRAMSys/traceAnalyzer/presentation/traceplot.cpp @@ -209,6 +209,8 @@ void TracePlot::connectNavigatorQ_SIGNALS() void TracePlot::setUpDrawingProperties() { + drawingProperties.init(navigator->getTracePlotLines(), navigator->getCollapsedRanks()); + drawingProperties.numberOfRanks = navigator->GeneralTraceInfo().numberOfRanks; drawingProperties.numberOfBankgroups = navigator->GeneralTraceInfo().numberOfBankgroups; drawingProperties.numberOfBanks = navigator->GeneralTraceInfo().numberOfBanks; @@ -257,13 +259,14 @@ void TracePlot::setUpZoom() void TracePlot::updateScrollbar() { - const unsigned int pageStep = scrollBar->pageStep(); + // The maximum number of displayed lines determined by the pageStep of the scroll bar. + const unsigned int maxDisplayedLines = scrollBar->pageStep(); - const int maximum = drawingProperties.getNumberOfDisplayedLines() - pageStep; + const int maximum = drawingProperties.getNumberOfDisplayedLines() - maxDisplayedLines; if (maximum >= 0) { - scrollBar->setMaximum(drawingProperties.getNumberOfDisplayedLines() - pageStep); + scrollBar->setMaximum(maximum); scrollBar->show(); } else @@ -272,18 +275,15 @@ void TracePlot::updateScrollbar() void TracePlot::verticalScrollbarChanged(int value) { - const int yValRequest = drawingProperties.yValRequest; + const int yMax = drawingProperties.getNumberOfDisplayedLines(); - // The maximum number of displayed lines determined by the pageStep of the scroll bar. - const int maxDisplayedLines = scrollBar->pageStep(); - - if (drawingProperties.getNumberOfDisplayedLines() <= maxDisplayedLines) + if (scrollBar->isHidden()) { - setAxisScale(yLeft, -5, yValRequest + 1, 1.0); + setAxisScale(yLeft, -1, yMax + 1, 1.0); } else { - setAxisScale(yLeft, yValRequest - maxDisplayedLines + 1 - value, yValRequest + 1 - value, 1.0); + setAxisScale(yLeft, scrollBar->maximum() - 1 - value, yMax + 1 - value, 1.0); } replot(); @@ -302,8 +302,11 @@ void TracePlot::setUpAxis() QObject::connect(customLabelScaleDraw, &CustomLabelScaleDraw::scaleRedraw, this, [=]() { for (auto rankButton : rankCollapseButtons) { - auto firstRankLine = drawingProperties.getFirstRankLine(rankButton->rank); - positionButton(*firstRankLine, *rankButton); + for (auto line : drawingProperties.getFirstRankLines(rankButton->rank)) + { + auto firstRankLine = static_pointer_cast(line); + positionButton(*firstRankLine, *rankButton); + } } }); @@ -338,7 +341,8 @@ void TracePlot::setUpAxis() updateScrollbar(); - emit scrollBar->valueChanged(scrollBar->value()); + Q_EMIT scrollBar->valueChanged(scrollBar->value()); + Q_EMIT tracePlotLinesChanged(); }); rankCollapseButtons.push_back(button); diff --git a/DRAMSys/traceAnalyzer/presentation/traceplot.h b/DRAMSys/traceAnalyzer/presentation/traceplot.h index 5f40a4eb..e63d3557 100644 --- a/DRAMSys/traceAnalyzer/presentation/traceplot.h +++ b/DRAMSys/traceAnalyzer/presentation/traceplot.h @@ -96,6 +96,7 @@ public Q_SLOTS: Q_SIGNALS: void tracePlotZoomChanged(); + void tracePlotLinesChanged(); void colorGroupingChanged(ColorGrouping colorgrouping); private Q_SLOTS: diff --git a/DRAMSys/traceAnalyzer/presentation/traceplotline.cpp b/DRAMSys/traceAnalyzer/presentation/traceplotline.cpp index 10834fb9..57d7e693 100644 --- a/DRAMSys/traceAnalyzer/presentation/traceplotline.cpp +++ b/DRAMSys/traceAnalyzer/presentation/traceplotline.cpp @@ -42,6 +42,11 @@ TracePlotLine::TracePlotLine(const QString &label, const std::shared_ptr> collapsedRanks) : + collapsedRanks(collapsedRanks) +{ +} + TracePlotLine::~TracePlotLine() {} const QString & TracePlotLine::getLabel() const @@ -66,11 +71,16 @@ int TracePlotLine::getYVal() const } -TracePlotBankLine::TracePlotBankLine(const QString &label, unsigned int rank, +TracePlotBankLine::TracePlotBankLine(unsigned int rank, unsigned int group, unsigned int bank, const std::shared_ptr> collapsedRanks) : - TracePlotLine(label, collapsedRanks), - rank(rank) + TracePlotLine(collapsedRanks), + rank(rank), group(group), bank(bank) { + QString rankLabel = QString("RA") + QString::number(rank); + QString bankGroupLabel = QString("BG") + QString::number(group); + QString bankLabel = QString("BA") + QString::number(bank); + + label = rankLabel + QString(" ") + bankGroupLabel + QString(" ") + bankLabel; } bool TracePlotBankLine::isCollapsed() const @@ -79,16 +89,21 @@ bool TracePlotBankLine::isCollapsed() const } -TracePlotFirstRankLine::TracePlotFirstRankLine(const QString &label, const QString &collapsedLabel, - unsigned int rank, const std::shared_ptr> collapsedRanks) : - TracePlotBankLine(label, rank, collapsedRanks), - collapsedLabel(collapsedLabel) +TracePlotFirstRankLine::TracePlotFirstRankLine(unsigned int rank, unsigned int group, unsigned int bank, + const std::shared_ptr> collapsedRanks) : + TracePlotBankLine(rank, group, bank, collapsedRanks) { + collapsedLabel = QString("RA") + QString::number(rank); +} + +bool TracePlotFirstRankLine::isCollapsed() const +{ + return false; } const QString & TracePlotFirstRankLine::getLabel() const { - if (isCollapsed()) + if (TracePlotBankLine::isCollapsed()) return collapsedLabel; else return TracePlotLine::getLabel(); diff --git a/DRAMSys/traceAnalyzer/presentation/traceplotline.h b/DRAMSys/traceAnalyzer/presentation/traceplotline.h index be93d6b4..7493d7bc 100644 --- a/DRAMSys/traceAnalyzer/presentation/traceplotline.h +++ b/DRAMSys/traceAnalyzer/presentation/traceplotline.h @@ -53,6 +53,8 @@ public: int getYVal() const; protected: + TracePlotLine(const std::shared_ptr> collapsedRanks); + QString label; int yVal; const std::shared_ptr> collapsedRanks; @@ -62,23 +64,28 @@ protected: class TracePlotBankLine : public TracePlotLine { public: - TracePlotBankLine(const QString &label, unsigned int rank, const std::shared_ptr> collapsedRanks); + TracePlotBankLine(unsigned int rank, unsigned int group, unsigned int bank, + const std::shared_ptr> collapsedRanks); ~TracePlotBankLine() = default; void setCollapsed(bool value); - bool isCollapsed() const override; + virtual bool isCollapsed() const override; const unsigned int rank; + const unsigned int group; + const unsigned int bank; }; class TracePlotFirstRankLine final : public TracePlotBankLine { public: - TracePlotFirstRankLine(const QString &label, const QString &collapsedLabel, - unsigned int rank, const std::shared_ptr> collapsedRanks); + TracePlotFirstRankLine(unsigned int rank, unsigned int group, unsigned int bank, + const std::shared_ptr> collapsedRanks); ~TracePlotFirstRankLine() = default; + bool isCollapsed() const override; + const QString & getLabel() const override; private: diff --git a/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp b/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp index 1090bd45..629f5c33 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp +++ b/DRAMSys/traceAnalyzer/presentation/tracescroller.cpp @@ -61,8 +61,9 @@ void TraceScroller::init(TraceNavigator *navigator, TracePlot *tracePlot) this -> navigator = navigator; connectNavigatorQ_SIGNALS(); - setUpAxis(); setUpDrawingProperties(); + // setUpDrawingProperties() must be called before setUpAxis(). + setUpAxis(); setUpTracePlotItem(); getAndDrawComments(); @@ -73,6 +74,8 @@ void TraceScroller::init(TraceNavigator *navigator, TracePlot *tracePlot) QObject::connect(tracePlot, SIGNAL(colorGroupingChanged(ColorGrouping)), this, SLOT(colorGroupingChanged(ColorGrouping))); + + QObject::connect(tracePlot, SIGNAL(tracePlotLinesChanged()), this, SLOT(updateAxis())); } @@ -86,26 +89,30 @@ void TraceScroller::setUpTracePlotItem() void TraceScroller::setUpDrawingProperties() { + drawingProperties.init(navigator->getTracePlotLines(), navigator->getCollapsedRanks()); + drawingProperties.numberOfRanks = navigator->GeneralTraceInfo().numberOfRanks; 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.yValResponse = drawingProperties.numberOfBanks; - drawingProperties.yValRequest = drawingProperties.numberOfBanks + 1; - drawingProperties.yValCommandBus = -3; - drawingProperties.yValDataBus = -4; } void TraceScroller::setUpAxis() { - setAxisScale(yLeft, -1, navigator->GeneralTraceInfo().numberOfBanks + 2, 1.0); + updateAxis(); axisScaleDraw(yLeft)->enableComponent(QwtAbstractScaleDraw::Labels, false ); axisScaleDraw(yLeft)->enableComponent(QwtAbstractScaleDraw::Ticks, false ); } +void TraceScroller::updateAxis() +{ + setAxisScale(yLeft, -1, drawingProperties.getNumberOfDisplayedLines() + 1, 1.0); + replot(); +} + void TraceScroller::connectNavigatorQ_SIGNALS() { QObject::connect(navigator, SIGNAL(currentTraceTimeChanged()), this, diff --git a/DRAMSys/traceAnalyzer/presentation/tracescroller.h b/DRAMSys/traceAnalyzer/presentation/tracescroller.h index 485af8a6..c9016ce5 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracescroller.h +++ b/DRAMSys/traceAnalyzer/presentation/tracescroller.h @@ -78,6 +78,9 @@ public Q_SLOTS: void selectedTransactionsChanged(); void colorGroupingChanged(ColorGrouping colorgrouping); +private Q_SLOTS: + void updateAxis(); + }; #endif // TraceScroller_H