Adapt TA to new database format (1).
This commit is contained in:
@@ -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()));
|
||||
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 "
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user