Adapt TA to new database format (1).

This commit is contained in:
Lukas Steiner
2022-05-02 17:44:56 +02:00
parent 489fa5f02b
commit 14588dbb77
12 changed files with 158 additions and 154 deletions

View File

@@ -368,7 +368,7 @@ void TlmRecorder::insertGeneralInfo()
sqlite3_bind_int64(insertGeneralInfoStatement, 11, 0);
sqlite3_bind_int(insertGeneralInfoStatement, 12, static_cast<int>(config.refreshMaxPostponed));
sqlite3_bind_int(insertGeneralInfoStatement, 13, static_cast<int>(config.refreshMaxPulledin));
sqlite3_bind_int64(insertGeneralInfoStatement, 14, static_cast<int64_t>(UINT64_MAX));
sqlite3_bind_int(insertGeneralInfoStatement, 14, static_cast<int>(UINT_MAX));
sqlite3_bind_int(insertGeneralInfoStatement, 15, static_cast<int>(config.requestBufferSize));
sqlite3_bind_int(insertGeneralInfoStatement, 16, static_cast<int>(config.memSpec->getPer2BankOffset()));

View File

@@ -41,6 +41,7 @@
#include "timespan.h"
#include <QString>
#include <climits>
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),

View File

@@ -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<int> Phase::getYVals(const TraceDrawingProperties &drawingProperties
{
std::vector<int> 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<int> 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)

View File

@@ -56,11 +56,12 @@ class Transaction;
class Phase
{
public:
Phase(ID id, Timespan span, traceTime clk, const std::shared_ptr<Transaction> &transaction,
std::vector<Timespan> spansOnCommandBus,
std::shared_ptr<Timespan> 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> &transaction, std::vector<Timespan> 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> transaction;
std::vector<Timespan> spansOnCommandBus;
std::shared_ptr<Timespan> spanOnDataBus;
std::vector<std::shared_ptr<PhaseDependency>> 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:

View File

@@ -43,88 +43,77 @@
#include "businessObjects/timespan.h"
std::shared_ptr<Phase> PhaseFactory::CreatePhase(ID id, const QString &dbPhaseName,
const Timespan &span, const std::shared_ptr<Transaction> &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<Transaction> &trans, TraceDB &database)
{
traceTime clk = database.getGeneralInfo().clkPeriod;
traceTime clk = static_cast<long long int>(database.getGeneralInfo().clkPeriod);
const CommandLengths &cl = database.getCommandLengths();
if (dbPhaseName == "REQ")
return std::shared_ptr<Phase>(new REQ(id, span, clk, trans, {}, std::shared_ptr<Timespan>()));
return std::shared_ptr<Phase>(new REQ(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column, burstLength, clk, trans, {}));
else if (dbPhaseName == "RESP")
return std::shared_ptr<Phase>(new RESP(id, span, clk, trans, {}, std::shared_ptr<Timespan>()));
/*else if (dbPhaseName == "PREB")
return shared_ptr<Phase>(new PREB(id, span, clk, trans,
{Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr<Timespan>()));*/
else if (dbPhaseName == "PREPB" || dbPhaseName == "PRE") // for backwards compatibility
return std::shared_ptr<Phase>(new PREPB(id, span, clk, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.PREPB)}, std::shared_ptr<Timespan>()));
/*else if (dbPhaseName == "ACTB")
return std::shared_ptr<Phase>(new ACTB(id, span, clk, trans,
{Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr<Timespan>()));*/
return std::shared_ptr<Phase>(new RESP(id, span, spanOnDataStrobe, rank, bankGroup, bank, row, column,burstLength, clk, trans, {}));
else if (dbPhaseName == "PREPB")
return std::shared_ptr<Phase>(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<Phase>(new ACT(id, span, clk, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.ACT)}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "PREAB" || dbPhaseName == "PREA") // for backwards compatibility
return std::shared_ptr<Phase>(new PREAB(id, span, clk, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.PREAB)}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "REFAB" || dbPhaseName == "REFA") // for backwards compatibility
return std::shared_ptr<Phase>(new REFAB(id, span, clk, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.REFAB)}, std::shared_ptr<Timespan>()));
return std::shared_ptr<Phase>(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<Phase>(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<Phase>(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<Phase>(new RFMAB(id, span, clk, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.RFMAB)}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "REFPB" || dbPhaseName == "REFB") // for backwards compatibility
return std::shared_ptr<Phase>(new REFPB(id, span, clk, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.REFPB)}, std::shared_ptr<Timespan>()));
return std::shared_ptr<Phase>(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<Phase>(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<Phase>(new REFPB(id, span, clk, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.RFMPB)}, std::shared_ptr<Timespan>()));
return std::shared_ptr<Phase>(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<Phase>(new REFP2B(id, span, clk, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.REFP2B)}, std::shared_ptr<Timespan>()));
return std::shared_ptr<Phase>(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<Phase>(new REFP2B(id, span, clk, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.RFMP2B)}, std::shared_ptr<Timespan>()));
return std::shared_ptr<Phase>(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<Phase>(new PRESB(id, span, clk, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.PRESB)}, std::shared_ptr<Timespan>()));
return std::shared_ptr<Phase>(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<Phase>(new REFSB(id, span, clk, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.REFSB)}, std::shared_ptr<Timespan>()));
return std::shared_ptr<Phase>(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<Phase>(new RFMSB(id, span, clk, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.RFMSB)}, std::shared_ptr<Timespan>()));
return std::shared_ptr<Phase>(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<Phase>(new RD(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RD)},
std::shared_ptr<Timespan>(new Timespan(trans->spanOnDataStrobe))));
return std::shared_ptr<Phase>(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<Phase>(new RDA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RDA)},
std::shared_ptr<Timespan>(new Timespan(trans->spanOnDataStrobe))));
return std::shared_ptr<Phase>(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<Phase>(new WR(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WR)},
std::shared_ptr<Timespan>(new Timespan(trans->spanOnDataStrobe))));
return std::shared_ptr<Phase>(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<Phase>(new WRA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WRA)},
std::shared_ptr<Timespan>(new Timespan(trans->spanOnDataStrobe))));
return std::shared_ptr<Phase>(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<Phase>(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<Timespan>()));
else if (dbPhaseName == "PDNAB")
return std::shared_ptr<Phase>(new PDNAB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk),
Timespan(span.End() - clk, span.End())}, std::shared_ptr<Timespan>()));
return std::shared_ptr<Phase>(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<Phase>(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<Timespan>()));
else if (dbPhaseName == "PDNPB")
return std::shared_ptr<Phase>(new PDNPB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk),
Timespan(span.End() - clk, span.End())}, std::shared_ptr<Timespan>()));
return std::shared_ptr<Phase>(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<Phase>(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<Timespan>()));
else if (dbPhaseName == "SREFB")
return std::shared_ptr<Phase>(new SREFB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk),
Timespan(span.End() - clk, span.End())}, std::shared_ptr<Timespan>()));
return std::shared_ptr<Phase>(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");
}

View File

@@ -50,8 +50,9 @@ class PhaseFactory
public:
PhaseFactory() = delete;
static std::shared_ptr<Phase> CreatePhase(ID id, const QString &dbPhaseName,
const Timespan &span, const std::shared_ptr<Transaction> &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<Transaction> &trans, TraceDB &database);
};
#endif // PHASEFACTORY_H

View File

@@ -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> phase)
{

View File

@@ -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,

View File

@@ -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 "

View File

@@ -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<std::shared_ptr<Transaction>> 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<Transaction>(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<Transaction>(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)

View File

@@ -79,9 +79,9 @@ void TransactionTreeWidget::ContextMenuRequested(QPoint point)
contextMenu.addActions({goToTransaction});
QAction *selectedContextMenuItems = contextMenu.exec(mapToGlobal(point));
if (selectedContextMenuItems) {
TransactionTreeItem *item = static_cast<TransactionTreeItem *>
(selectedItems().at(0));
if (selectedContextMenuItems)
{
TransactionTreeItem *item = dynamic_cast<TransactionTreeItem *>(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> phase : transaction->Phases()) {
for (const std::shared_ptr<Phase>& phase : transaction->Phases()) {
AppendPhase(phasesNode, *phase);
}
}

View File

@@ -61,15 +61,18 @@ void QueryEditor::init(TraceNavigator *navigator)
void QueryEditor::on_executeQuery_clicked()
{
try {
std::vector<std::shared_ptr<Transaction>> result =
navigator->TraceFile().getTransactionsWithCustomQuery(queryTexts.queryHead + " "
+ ui->queryEdit->toPlainText());
try
{
std::vector<std::shared_ptr<Transaction>> 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());
}
}