Included various command lengths.

This commit is contained in:
Lukas Steiner
2019-09-20 17:35:01 +02:00
parent 97542d5f97
commit 5fe5529c7c
9 changed files with 225 additions and 53 deletions

View File

@@ -1,5 +1,6 @@
DROP TABLE IF EXISTS Phases;
DROP TABLE IF EXISTS GeneralInfo;
DROP TABLE IF EXISTS CommandLengths;
DROP TABLE IF EXISTS Comments;
DROP TABLE IF EXISTS ranges;
DROP TABLE IF EXISTS Transactions;
@@ -29,6 +30,24 @@ CREATE TABLE GeneralInfo(
ControllerThread INTEGER
);
CREATE TABLE CommandLengths(
ACT INTEGER,
PRE INTEGER,
PREA INTEGER,
RD INTEGER,
RDA INTEGER,
WR INTEGER,
WRA INTEGER,
REFA INTEGER,
REFB INTEGER,
PDEA INTEGER,
PDXA INTEGER,
PDEP INTEGER,
PDXP INTEGER,
SREFEN INTEGER,
SREFEX INTEGER
);
CREATE TABLE Power(
time DOUBLE,
AveragePower DOUBLE

View File

@@ -78,6 +78,7 @@ TlmRecorder::~TlmRecorder()
sqlite3_finalize(insertPhaseStatement);
sqlite3_finalize(updatePhaseStatement);
sqlite3_finalize(insertGeneralInfoStatement);
sqlite3_finalize(insertCommandLengthsStatement);
sqlite3_finalize(insertDebugMessageStatement);
sqlite3_finalize(updateDataStrobeStatement);
sqlite3_finalize(insertPowerStatement);
@@ -285,6 +286,9 @@ void TlmRecorder::prepareSqlStatements()
insertGeneralInfoString =
"INSERT INTO GeneralInfo (NumberOfTransactions,TraceEnd,NumberOfBanks,clk,UnitOfTime,MCconfig,Memspec,Traces, WindowSize, FlexibleRefresh, MaxRefBurst, ControllerThread) VALUES"
"(:numberOfTransactions,:end,:numberOfBanks,:clk,:unitOfTime,:mcconfig,:memspec,:traces,:windowSize, :flexibleRefresh, :maxRefBurst, :controllerThread)";
insertCommandLengthsString =
"INSERT INTO CommandLengths VALUES"
"(:ACT, :PRE, :PREA, :RD, :RDA, :WR, :WRA, :REFA, :REFB, :PDEA, :PDXA, :PDEP, :PDXP, :SREFEN, :SREFEX)";
insertDebugMessageString =
"INSERT INTO DebugMessages (Time,Message) Values (:time,:message)";
insertPowerString = "INSERT INTO Power VALUES (:time,:averagePower)";
@@ -299,6 +303,8 @@ void TlmRecorder::prepareSqlStatements()
&updateDataStrobeStatement, 0);
sqlite3_prepare_v2(db, insertGeneralInfoString.c_str(), -1,
&insertGeneralInfoStatement, 0);
sqlite3_prepare_v2(db, insertCommandLengthsString.c_str(), -1,
&insertCommandLengthsStatement, 0);
sqlite3_prepare_v2(db, insertDebugMessageString.c_str(), -1,
&insertDebugMessageStatement, 0);
sqlite3_prepare_v2(db, insertPowerString.c_str(), -1, &insertPowerStatement, 0);
@@ -348,6 +354,29 @@ void TlmRecorder::insertGeneralInfo()
executeSqlStatement(insertGeneralInfoStatement);
}
void TlmRecorder::insertCommandLengths()
{
MemSpec *memSpec = Configuration::getInstance().memSpec;
sqlite3_bind_int(insertCommandLengthsStatement, 1, memSpec->clACT);
sqlite3_bind_int(insertCommandLengthsStatement, 2, memSpec->clPRE);
sqlite3_bind_int(insertCommandLengthsStatement, 3, memSpec->clPREA);
sqlite3_bind_int(insertCommandLengthsStatement, 4, memSpec->clRD);
sqlite3_bind_int(insertCommandLengthsStatement, 5, memSpec->clRDA);
sqlite3_bind_int(insertCommandLengthsStatement, 6, memSpec->clWR);
sqlite3_bind_int(insertCommandLengthsStatement, 7, memSpec->clWRA);
sqlite3_bind_int(insertCommandLengthsStatement, 8, memSpec->clREFA);
sqlite3_bind_int(insertCommandLengthsStatement, 9, memSpec->clREFB);
sqlite3_bind_int(insertCommandLengthsStatement, 10, memSpec->clPDEA);
sqlite3_bind_int(insertCommandLengthsStatement, 11, memSpec->clPDXA);
sqlite3_bind_int(insertCommandLengthsStatement, 12, memSpec->clPDEP);
sqlite3_bind_int(insertCommandLengthsStatement, 13, memSpec->clPDXP);
sqlite3_bind_int(insertCommandLengthsStatement, 14, memSpec->clSREFEN);
sqlite3_bind_int(insertCommandLengthsStatement, 15, memSpec->clSREFEX);
executeSqlStatement(insertCommandLengthsStatement);
}
void TlmRecorder::insertTransactionInDB(Transaction &recordingData)
{
sqlite3_bind_int(insertTransactionStatement, 1, recordingData.id);
@@ -430,6 +459,7 @@ void TlmRecorder::closeConnection()
{
commitRecordedDataToDB();
insertGeneralInfo();
insertCommandLengths();
PRINTDEBUGMESSAGE(name(), "Number of transactions written to DB: "
+ std::to_string(totalNumTransactions - 1));
PRINTDEBUGMESSAGE(name(), "tlmPhaseRecorder:\tEnd Recording");

View File

@@ -125,6 +125,7 @@ private:
void commitRecordedDataToDB();
void insertGeneralInfo();
void insertCommandLengths();
void insertTransactionInDB(Transaction &recordingData);
void insertRangeInDB(unsigned int id, const sc_time &begin, const sc_time &end);
void insertPhaseInDB(string phaseName, const sc_time &begin, const sc_time &end,
@@ -141,12 +142,12 @@ private:
std::vector<tlm::tlm_phase> transactionTerminatingPhases;
sqlite3 *db = NULL;
sqlite3_stmt *insertTransactionStatement, *insertRangeStatement,
*updateRangeStatement,
*insertPhaseStatement, *updatePhaseStatement, *insertGeneralInfoStatement,
*updateRangeStatement, *insertPhaseStatement, *updatePhaseStatement,
*insertGeneralInfoStatement, *insertCommandLengthsStatement,
*insertDebugMessageStatement, *updateDataStrobeStatement, *insertPowerStatement;
std::string insertTransactionString, insertRangeString, updateRangeString,
insertPhaseString, updatePhaseString, insertGeneralInfoString,
insertDebugMessageString, updateDataStrobeString, insertPowerString;
std::string insertTransactionString, insertRangeString, updateRangeString, insertPhaseString,
updatePhaseString, insertGeneralInfoString, insertCommandLengthsString,
insertDebugMessageString, updateDataStrobeString, insertPowerString;
};
#endif // TLMRECORDER_H

View File

@@ -104,6 +104,23 @@ struct MemSpec
// For different refresh frequencies on different banks, not implemented
//std::map<Bank, sc_time> refreshTimings;
// Command lengths on bus:
unsigned clACT = 1;
unsigned clPRE = 1;
unsigned clPREA = 1;
unsigned clRD = 1;
unsigned clRDA = 1;
unsigned clWR = 1;
unsigned clWRA = 1;
unsigned clREFA = 1;
unsigned clREFB = 1;
unsigned clPDEA = 1;
unsigned clPDXA = 1;
unsigned clPDEP = 1;
unsigned clPDXP = 1;
unsigned clSREFEN = 1;
unsigned clSREFEX = 1;
virtual ~MemSpec() {}
};

View File

@@ -0,0 +1,68 @@
/*
* Copyright (c) 2019, University of Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors:
* Lukas Steiner
*/
#ifndef COMMANDLENGTHS_H
#define COMMANDLENGTHS_H
struct CommandLengths
{
unsigned ACT;
unsigned PRE;
unsigned PREA;
unsigned RD;
unsigned RDA;
unsigned WR;
unsigned WRA;
unsigned REFA;
unsigned REFB;
unsigned PDEA;
unsigned PDXA;
unsigned PDEP;
unsigned PDXP;
unsigned SREFEN;
unsigned SREFEX;
CommandLengths(unsigned ACT, unsigned PRE, unsigned PREA,
unsigned RD, unsigned RDA, unsigned WR, unsigned WRA,
unsigned REFA, unsigned REFB, unsigned PDEA, unsigned PDXA,
unsigned PDEP, unsigned PDXP, unsigned SREFEN, unsigned SREFEX) :
ACT(ACT), PRE(PRE), PREA(PREA), RD(RD), RDA(RDA), WR(WR), WRA(WRA),
REFA(REFA), REFB(REFB), PDEA(PDEA), PDXA(PDXA),
PDEP(PDEP), PDXP(PDXP), SREFEN(SREFEN), SREFEX(SREFEX) {}
CommandLengths() {}
};
#endif // COMMANDLENGTHS_H

View File

@@ -48,71 +48,64 @@ shared_ptr<Phase> PhaseFactory::CreatePhase(ID id, const QString &dbPhaseName,
const Timespan &span, const shared_ptr<Transaction> &trans, TraceDB &database)
{
traceTime clk = database.getGeneralInfo().clkPeriod;
const CommandLengths &cl = database.getCommandLengths();
if (dbPhaseName == "REQ")
return shared_ptr<Phase>(new REQ(id, span, trans, {},
std::shared_ptr<Timespan>()));
return shared_ptr<Phase>(new REQ(id, span, trans, {}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "RESP")
return shared_ptr<Phase>(new RESP(id, span, trans, {},
std::shared_ptr<Timespan>()));
return shared_ptr<Phase>(new RESP(id, span, trans, {}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "PREB") return shared_ptr<Phase>(new PREB(id, span,
trans, {Timespan(span.Begin(), span.Begin() + clk)},
std::shared_ptr<Timespan>()));
else if (dbPhaseName == "PREB")
return shared_ptr<Phase>(new PREB(id, span, trans,
{Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "PRE")
return shared_ptr<Phase>(new PRE(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)},
std::shared_ptr<Timespan>()));
else if (dbPhaseName == "ACTB") return shared_ptr<Phase>(new ACTB(id, span,
trans, {Timespan(span.Begin(), span.Begin() + clk)},
std::shared_ptr<Timespan>()));
return shared_ptr<Phase>(new PRE(id, span, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.PRE)}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "ACTB")
return shared_ptr<Phase>(new ACTB(id, span, trans,
{Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "ACT")
return shared_ptr<Phase>(new ACT(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)},
std::shared_ptr<Timespan>()));
return shared_ptr<Phase>(new ACT(id, span, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.ACT)}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "PREA")
return shared_ptr<Phase>(new PRECHARGE_ALL(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)},
std::shared_ptr<Timespan>()));
return shared_ptr<Phase>(new PRECHARGE_ALL(id, span, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.PREA)}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "REFA")
return shared_ptr<Phase>(new REFA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)},
std::shared_ptr<Timespan>()));
return shared_ptr<Phase>(new REFA(id, span, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.REFA)}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "REFB")
return shared_ptr<Phase>(new REFB(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)},
std::shared_ptr<Timespan>()));
return shared_ptr<Phase>(new REFB(id, span, trans,
{Timespan(span.Begin(), span.Begin() + clk * cl.REFB)}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "RD")
return shared_ptr<Phase>(new RD(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)},
std::shared_ptr<Timespan>
(new Timespan(trans->SpanOnDataStrobe()))));
return shared_ptr<Phase>(new RD(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RD)},
std::shared_ptr<Timespan>(new Timespan(trans->SpanOnDataStrobe()))));
else if (dbPhaseName == "RDA")
return shared_ptr<Phase>(new RDA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)},
std::shared_ptr<Timespan>
(new Timespan(trans->SpanOnDataStrobe()))));
return shared_ptr<Phase>(new RDA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RDA)},
std::shared_ptr<Timespan>(new Timespan(trans->SpanOnDataStrobe()))));
else if (dbPhaseName == "WR")
return shared_ptr<Phase>(new WR(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)},
std::shared_ptr<Timespan>
(new Timespan(trans->SpanOnDataStrobe()))));
return shared_ptr<Phase>(new WR(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WR)},
std::shared_ptr<Timespan>(new Timespan(trans->SpanOnDataStrobe()))));
else if (dbPhaseName == "WRA")
return shared_ptr<Phase>(new WRA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)},
std::shared_ptr<Timespan>
(new Timespan(trans->SpanOnDataStrobe()))));
return shared_ptr<Phase>(new WRA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WRA)},
std::shared_ptr<Timespan>(new Timespan(trans->SpanOnDataStrobe()))));
else if (dbPhaseName == "PDNA")
return shared_ptr<Phase>(new PDNA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())},
std::shared_ptr<Timespan>()));
return shared_ptr<Phase>(new PDNA(id, span, 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 shared_ptr<Phase>(new PDNAB(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())},
std::shared_ptr<Timespan>()));
return shared_ptr<Phase>(new PDNAB(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk),
Timespan(span.End() - clk, span.End())}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "PDNP")
return shared_ptr<Phase>(new PDNP(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())},
std::shared_ptr<Timespan>()));
return shared_ptr<Phase>(new PDNP(id, span, 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 shared_ptr<Phase>(new PDNPB(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())},
std::shared_ptr<Timespan>()));
return shared_ptr<Phase>(new PDNPB(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk),
Timespan(span.End() - clk, span.End())}, std::shared_ptr<Timespan>()));
else if (dbPhaseName == "SREF")
return shared_ptr<Phase>(new SREF(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())},
std::shared_ptr<Timespan>()));
return shared_ptr<Phase>(new SREF(id, span, 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 shared_ptr<Phase>(new SREFB(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())},
std::shared_ptr<Timespan>()));
return shared_ptr<Phase>(new SREFB(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk),
Timespan(span.End() - clk, span.End())}, std::shared_ptr<Timespan>()));
else
throw std::runtime_error("DB phasename " + dbPhaseName.toStdString() +
" unkown to phasefactory");
throw std::runtime_error("DB phasename " + dbPhaseName.toStdString() + " unkown to phasefactory");
}

View File

@@ -70,6 +70,7 @@ TraceDB::TraceDB(QString path, bool openExisting)
dropAndCreateTables();
prepareQueries();
generalInfo = getGeneralInfoFromDB();
commandLengths = getCommandLengthsFromDB();
}
void TraceDB::prepareQueries()
@@ -273,6 +274,40 @@ GeneralInfo TraceDB::getGeneralInfoFromDB()
}
}
CommandLengths TraceDB::getCommandLengthsFromDB()
{
QSqlQuery query(database);
query.prepare("SELECT * FROM CommandLengths");
executeQuery(query);
if (query.next())
{
unsigned ACT = query.value(0).toInt();
unsigned PRE = query.value(1).toInt();
unsigned PREA = query.value(2).toInt();
unsigned RD = query.value(3).toInt();
unsigned RDA = query.value(4).toInt();
unsigned WR = query.value(5).toInt();
unsigned WRA = query.value(6).toInt();
unsigned REFA = query.value(7).toInt();
unsigned REFB = query.value(8).toInt();
unsigned PDEA = query.value(9).toInt();
unsigned PDXA = query.value(10).toInt();
unsigned PDEP = query.value(11).toInt();
unsigned PDXP = query.value(12).toInt();
unsigned SREFEN = query.value(13).toInt();
unsigned SREFEX = query.value(14).toInt();
return CommandLengths(ACT, PRE, PREA, RD, RDA, WR, WRA, REFA, REFB,
PDEA, PDXA, PDEP, PDXP, SREFEN, SREFEX);
}
else
{
throw sqlException("Tracefile corrupted. No command lengths table",
this->pathToDB.toStdString());
}
}
unsigned int TraceDB::getNumberOfPhases()
{
QSqlQuery query(database);

View File

@@ -48,6 +48,7 @@
#include <string>
#include "businessObjects/transaction.h"
#include "businessObjects/generalinfo.h"
#include "businessObjects/commandlengths.h"
#include "businessObjects/phases/phasefactory.h"
#include "businessObjects/comment.h"
#include "QueryTexts.h"
@@ -76,6 +77,11 @@ public:
return generalInfo;
}
const CommandLengths &getCommandLengths()
{
return commandLengths;
}
std::vector<std::shared_ptr<Transaction>> getTransactionsWithCustomQuery(
QString queryText);
std::vector<std::shared_ptr<Transaction>> getTransactionsInTimespan(
@@ -100,6 +106,7 @@ private:
QString pathToDB;
QSqlDatabase database;
GeneralInfo generalInfo;
CommandLengths commandLengths;
QSqlQuery insertPhaseQuery;
QSqlQuery insertTransactionQuery;
@@ -122,6 +129,7 @@ private:
unsigned int getNumberOfPhases();
GeneralInfo getGeneralInfoFromDB();
CommandLengths getCommandLengthsFromDB();
};

View File

@@ -156,7 +156,8 @@ HEADERS += businessObjects/transaction.h \
presentation/tracemetrictreewidget.h \
businessObjects/calculatedMetric.h \
businessObjects/tracecalculatedmetrics.h \
businessObjects/phases/phase.h
businessObjects/phases/phase.h \
businessObjects/commandlengths.h
FORMS += \