From b9fa5813bcb1583f628e3faa904aea424df757d7 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Fri, 27 Aug 2021 13:55:51 +0200 Subject: [PATCH] Fix select next transacion and use current time instead of ID Select next activate, precharge and refresh now works every time and uses the current time instead of the ID to search for the next phase. Also add a new entry "Select next command" that selects the very first phase after the current positon. --- DRAMSys/traceAnalyzer/data/tracedb.cpp | 32 +++++++++++++------ DRAMSys/traceAnalyzer/data/tracedb.h | 7 ++-- .../presentation/tracenavigator.cpp | 32 +++++++++---------- .../presentation/tracenavigator.h | 13 ++++---- .../traceAnalyzer/presentation/traceplot.cpp | 25 +++++++++++---- .../traceAnalyzer/presentation/traceplot.h | 2 ++ 6 files changed, 70 insertions(+), 41 deletions(-) diff --git a/DRAMSys/traceAnalyzer/data/tracedb.cpp b/DRAMSys/traceAnalyzer/data/tracedb.cpp index 3d32946b..ffd9ede3 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.cpp +++ b/DRAMSys/traceAnalyzer/data/tracedb.cpp @@ -149,26 +149,28 @@ shared_ptr TraceDB::getTransactionByID(ID id) } -shared_ptr TraceDB::getNextActivate(ID currentTransactionId) +shared_ptr TraceDB::getNextActivate(traceTime time) { QSqlQuery query(database); QString queryText = queryTexts.queryHead + - "WHERE TransactionID > :currentID AND PhaseName = 'ACT' LIMIT 1"; + "WHERE PhaseBegin > :traceTime AND PhaseName " + "IN ('ACT','ACTB') ORDER BY PhaseBegin ASC LIMIT 1"; query.prepare(queryText); - query.bindValue(":currentID", currentTransactionId); + query.bindValue(":traceTime", time); executeQuery(query); return parseTransactionFromQuery(query); } -shared_ptr TraceDB::getNextPrecharge(ID currentTransactionId) +shared_ptr TraceDB::getNextPrecharge(traceTime time) { QSqlQuery query(database); QString queryText = queryTexts.queryHead + - "WHERE TransactionID > :currentID AND PhaseName IN ('PRE','PREA') LIMIT 1"; + "WHERE PhaseBegin > :traceTime AND PhaseName " + "IN ('PRE','PREA','PREB','PRESB') ORDER BY PhaseBegin ASC LIMIT 1"; query.prepare(queryText); - query.bindValue(":currentID", currentTransactionId); + query.bindValue(":traceTime", time); executeQuery(query); return parseTransactionFromQuery(query); } @@ -197,13 +199,25 @@ shared_ptr TraceDB::getNextPrecharge(ID currentTransactionId) // return parseTransactionFromQuery(query); // } -shared_ptr TraceDB::getNextRefresh(ID currentTransactionId) +shared_ptr TraceDB::getNextRefresh(traceTime time) { QSqlQuery query(database); QString queryText = queryTexts.queryHead + - "WHERE TransactionID > :currentID AND PhaseName IN ('REFA') LIMIT 1"; + "WHERE PhaseBegin > :traceTime AND PhaseName " + "IN ('REFA','REFB','REFSB','SREF','SREFB') ORDER BY PhaseBegin ASC LIMIT 1"; query.prepare(queryText); - query.bindValue(":currentID", currentTransactionId); + query.bindValue(":traceTime", time); + executeQuery(query); + return parseTransactionFromQuery(query); +} + +std::shared_ptr TraceDB::getNextCommand(traceTime time) +{ + QSqlQuery query(database); + QString queryText = queryTexts.queryHead + + "WHERE PhaseBegin > :traceTime ORDER BY PhaseBegin ASC LIMIT 1"; + query.prepare(queryText); + query.bindValue(":traceTime", time); executeQuery(query); return parseTransactionFromQuery(query); } diff --git a/DRAMSys/traceAnalyzer/data/tracedb.h b/DRAMSys/traceAnalyzer/data/tracedb.h index 74c0176e..fcce5a48 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.h +++ b/DRAMSys/traceAnalyzer/data/tracedb.h @@ -86,9 +86,10 @@ public: QString queryText); std::vector> getTransactionsInTimespan( const Timespan &span); - std::shared_ptr getNextPrecharge(ID currentTransactionId); - std::shared_ptr getNextActivate(ID currentTransactionId); - std::shared_ptr getNextRefresh(ID currentTransactionId); + std::shared_ptr getNextPrecharge(traceTime time); + std::shared_ptr getNextActivate(traceTime time); + std::shared_ptr getNextRefresh(traceTime time); + std::shared_ptr getNextCommand(traceTime time); // std::shared_ptr getNextPreb(ID currentTransactionId); // std::shared_ptr getNextActb(ID currentTransactionId); // std::shared_ptr getNextRefb(ID currentTransactionId); diff --git a/DRAMSys/traceAnalyzer/presentation/tracenavigator.cpp b/DRAMSys/traceAnalyzer/presentation/tracenavigator.cpp index 592601b5..13b0526c 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracenavigator.cpp +++ b/DRAMSys/traceAnalyzer/presentation/tracenavigator.cpp @@ -201,46 +201,46 @@ void TraceNavigator::selectLastTransaction() } -void TraceNavigator::selectNextRefresh() +void TraceNavigator::selectNextRefresh(traceTime time) { shared_ptr nextRefresh; - if (!SelectedTransactions().empty()) - nextRefresh = traceFile.getNextRefresh(SelectedTransactions().front()->id); - else - nextRefresh = traceFile.getNextRefresh(0); + nextRefresh = traceFile.getNextRefresh(time); if (nextRefresh) selectTransaction(nextRefresh); } -void TraceNavigator::selectNextActivate() +void TraceNavigator::selectNextActivate(traceTime time) { shared_ptr nextActivate; - if (!SelectedTransactions().empty()) - nextActivate = traceFile.getNextActivate(SelectedTransactions().front()->id); - else - nextActivate = traceFile.getNextActivate(0); + nextActivate = traceFile.getNextActivate(time); if (nextActivate) selectTransaction(nextActivate); } -void TraceNavigator::selectNextPrecharge() +void TraceNavigator::selectNextPrecharge(traceTime time) { shared_ptr nextPrecharge; - if (!SelectedTransactions().empty()) - nextPrecharge = traceFile.getNextPrecharge( - SelectedTransactions().front()->id); - else - nextPrecharge = traceFile.getNextPrecharge(0); + nextPrecharge = traceFile.getNextPrecharge(time); if (nextPrecharge) selectTransaction(nextPrecharge); } +void TraceNavigator::selectNextCommand(traceTime time) +{ + shared_ptr nextCommand; + + nextCommand = traceFile.getNextCommand(time); + + if (nextCommand) + selectTransaction(nextCommand); +} + // void TraceNavigator::selectNextActb() // { // shared_ptr nextActb; diff --git a/DRAMSys/traceAnalyzer/presentation/tracenavigator.h b/DRAMSys/traceAnalyzer/presentation/tracenavigator.h index 374c3f08..28bc8af7 100644 --- a/DRAMSys/traceAnalyzer/presentation/tracenavigator.h +++ b/DRAMSys/traceAnalyzer/presentation/tracenavigator.h @@ -87,12 +87,13 @@ public: void selectPreviousTransaction(); void selectLastTransaction(); void selectFirstTransaction(); - void selectNextRefresh(); - void selectNextActivate(); - void selectNextPrecharge(); - void selectNextActb(); - void selectNextPreb(); - void selectNextRefb(); + void selectNextRefresh(traceTime time); + void selectNextActivate(traceTime time); + void selectNextPrecharge(traceTime time); + void selectNextCommand(traceTime time); +// void selectNextActb(); +// void selectNextPreb(); +// void selectNextRefb(); void addSelectedTransactions(const std::vector> &transactions); diff --git a/DRAMSys/traceAnalyzer/presentation/traceplot.cpp b/DRAMSys/traceAnalyzer/presentation/traceplot.cpp index 5636ff39..d2a25e5b 100644 --- a/DRAMSys/traceAnalyzer/presentation/traceplot.cpp +++ b/DRAMSys/traceAnalyzer/presentation/traceplot.cpp @@ -97,23 +97,25 @@ void TracePlot::setUpActions() SLOT(on_executeQuery())); selectNextRefresh = new QAction("Select next refresh", this); - selectNextRefresh->setShortcut(QKeySequence("alt+r")); addAction(selectNextRefresh); QObject::connect(selectNextRefresh, SIGNAL(triggered()), this, SLOT(on_selectNextRefresh())); selectNextActivate = new QAction("Select next activate", this); - selectNextActivate->setShortcut(QKeySequence("alt+a")); addAction(selectNextActivate); QObject::connect(selectNextActivate, SIGNAL(triggered()), this, SLOT(on_selectNextActivate())); selectNextPrecharge = new QAction("Select next precharge", this); - selectNextPrecharge->setShortcut(QKeySequence("alt+p")); addAction(selectNextPrecharge); QObject::connect(selectNextPrecharge, SIGNAL(triggered()), this, SLOT(on_selectNextPrecharge())); + selectNextCommand = new QAction("Select next command", this); + addAction(selectNextCommand); + QObject::connect(selectNextCommand, SIGNAL(triggered()), this, + SLOT(on_selectNextCommand())); + // selectNextActb = new QAction("Select next atcb", this); // selectNextActb->setShortcut(QKeySequence("alt+b")); // addAction(selectNextActb); @@ -169,7 +171,7 @@ void TracePlot::setUpContextMenu() contextMenu->addMenu(goToSubMenu); QMenu *selectSubMenu = new QMenu("Select", contextMenu); - selectSubMenu->addActions({selectNextRefresh, selectNextActivate, selectNextPrecharge /*, selectNextActb, selectNextPreb, selectNextRefb */}); + selectSubMenu->addActions({selectNextRefresh, selectNextActivate, selectNextPrecharge, selectNextCommand /*, selectNextActb, selectNextPreb, selectNextRefb */}); contextMenu->addMenu(selectSubMenu); contextMenu->addActions({showQueryEditor, insertComment, exportToPdf}); @@ -427,17 +429,26 @@ void TracePlot::on_executeQuery() void TracePlot::on_selectNextRefresh() { - navigator->selectNextRefresh(); + traceTime time = invTransform(xBottom, contextMenuMouseDown.x()); + navigator->selectNextRefresh(time); } void TracePlot::on_selectNextActivate() { - navigator->selectNextActivate(); + traceTime time = invTransform(xBottom, contextMenuMouseDown.x()); + navigator->selectNextActivate(time); } void TracePlot::on_selectNextPrecharge() { - navigator->selectNextPrecharge(); + traceTime time = invTransform(xBottom, contextMenuMouseDown.x()); + navigator->selectNextPrecharge(time); +} + +void TracePlot::on_selectNextCommand() +{ + traceTime time = invTransform(xBottom, contextMenuMouseDown.x()); + navigator->selectNextCommand(time); } // void TracePlot::on_selectNextActb() diff --git a/DRAMSys/traceAnalyzer/presentation/traceplot.h b/DRAMSys/traceAnalyzer/presentation/traceplot.h index 9fb4253b..72e44ba2 100644 --- a/DRAMSys/traceAnalyzer/presentation/traceplot.h +++ b/DRAMSys/traceAnalyzer/presentation/traceplot.h @@ -101,6 +101,7 @@ private Q_SLOTS: void on_selectNextRefresh(); void on_selectNextActivate(); void on_selectNextPrecharge(); + void on_selectNextCommand(); // void on_selectNextActb(); // void on_selectNextPreb(); // void on_selectNextRefb(); @@ -168,6 +169,7 @@ private: QAction *selectNextRefresh; QAction *selectNextActivate; QAction *selectNextPrecharge; + QAction *selectNextCommand; // QAction *selectNextActb; // QAction *selectNextPreb; // QAction *selectNextRefb;