diff --git a/DRAMSys/library/resources/scripts/createTraceDB.sql b/DRAMSys/library/resources/scripts/createTraceDB.sql index f9ac86ae..e9c71b76 100644 --- a/DRAMSys/library/resources/scripts/createTraceDB.sql +++ b/DRAMSys/library/resources/scripts/createTraceDB.sql @@ -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 diff --git a/DRAMSys/library/src/common/TlmRecorder.cpp b/DRAMSys/library/src/common/TlmRecorder.cpp index d18320e3..b569823d 100644 --- a/DRAMSys/library/src/common/TlmRecorder.cpp +++ b/DRAMSys/library/src/common/TlmRecorder.cpp @@ -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"); diff --git a/DRAMSys/library/src/common/TlmRecorder.h b/DRAMSys/library/src/common/TlmRecorder.h index f1a7e860..122678b5 100644 --- a/DRAMSys/library/src/common/TlmRecorder.h +++ b/DRAMSys/library/src/common/TlmRecorder.h @@ -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 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 diff --git a/DRAMSys/library/src/controller/core/configuration/MemSpec.h b/DRAMSys/library/src/controller/core/configuration/MemSpec.h index 26f3197f..1d84d11c 100644 --- a/DRAMSys/library/src/controller/core/configuration/MemSpec.h +++ b/DRAMSys/library/src/controller/core/configuration/MemSpec.h @@ -104,6 +104,23 @@ struct MemSpec // For different refresh frequencies on different banks, not implemented //std::map 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() {} }; diff --git a/DRAMSys/traceAnalyzer/businessObjects/commandlengths.h b/DRAMSys/traceAnalyzer/businessObjects/commandlengths.h new file mode 100644 index 00000000..63c9ed75 --- /dev/null +++ b/DRAMSys/traceAnalyzer/businessObjects/commandlengths.h @@ -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 diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp index 8c92e00d..e505deb7 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phasefactory.cpp @@ -48,71 +48,64 @@ shared_ptr PhaseFactory::CreatePhase(ID id, const QString &dbPhaseName, const Timespan &span, const shared_ptr &trans, TraceDB &database) { traceTime clk = database.getGeneralInfo().clkPeriod; + const CommandLengths &cl = database.getCommandLengths(); if (dbPhaseName == "REQ") - return shared_ptr(new REQ(id, span, trans, {}, - std::shared_ptr())); + return shared_ptr(new REQ(id, span, trans, {}, std::shared_ptr())); else if (dbPhaseName == "RESP") - return shared_ptr(new RESP(id, span, trans, {}, - std::shared_ptr())); + return shared_ptr(new RESP(id, span, trans, {}, std::shared_ptr())); - else if (dbPhaseName == "PREB") return shared_ptr(new PREB(id, span, - trans, {Timespan(span.Begin(), span.Begin() + clk)}, - std::shared_ptr())); + else if (dbPhaseName == "PREB") + return shared_ptr(new PREB(id, span, trans, + {Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr())); else if (dbPhaseName == "PRE") - return shared_ptr(new PRE(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)}, - std::shared_ptr())); - else if (dbPhaseName == "ACTB") return shared_ptr(new ACTB(id, span, - trans, {Timespan(span.Begin(), span.Begin() + clk)}, - std::shared_ptr())); + return shared_ptr(new PRE(id, span, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.PRE)}, std::shared_ptr())); + else if (dbPhaseName == "ACTB") + return shared_ptr(new ACTB(id, span, trans, + {Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr())); else if (dbPhaseName == "ACT") - return shared_ptr(new ACT(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)}, - std::shared_ptr())); + return shared_ptr(new ACT(id, span, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.ACT)}, std::shared_ptr())); else if (dbPhaseName == "PREA") - return shared_ptr(new PRECHARGE_ALL(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)}, - std::shared_ptr())); + return shared_ptr(new PRECHARGE_ALL(id, span, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.PREA)}, std::shared_ptr())); else if (dbPhaseName == "REFA") - return shared_ptr(new REFA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)}, - std::shared_ptr())); + return shared_ptr(new REFA(id, span, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.REFA)}, std::shared_ptr())); else if (dbPhaseName == "REFB") - return shared_ptr(new REFB(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)}, - std::shared_ptr())); - + return shared_ptr(new REFB(id, span, trans, + {Timespan(span.Begin(), span.Begin() + clk * cl.REFB)}, std::shared_ptr())); else if (dbPhaseName == "RD") - return shared_ptr(new RD(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)}, - std::shared_ptr - (new Timespan(trans->SpanOnDataStrobe())))); + return shared_ptr(new RD(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RD)}, + std::shared_ptr(new Timespan(trans->SpanOnDataStrobe())))); else if (dbPhaseName == "RDA") - return shared_ptr(new RDA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)}, - std::shared_ptr - (new Timespan(trans->SpanOnDataStrobe())))); + return shared_ptr(new RDA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RDA)}, + std::shared_ptr(new Timespan(trans->SpanOnDataStrobe())))); else if (dbPhaseName == "WR") - return shared_ptr(new WR(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)}, - std::shared_ptr - (new Timespan(trans->SpanOnDataStrobe())))); + return shared_ptr(new WR(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WR)}, + std::shared_ptr(new Timespan(trans->SpanOnDataStrobe())))); else if (dbPhaseName == "WRA") - return shared_ptr(new WRA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk)}, - std::shared_ptr - (new Timespan(trans->SpanOnDataStrobe())))); + return shared_ptr(new WRA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WRA)}, + std::shared_ptr(new Timespan(trans->SpanOnDataStrobe())))); else if (dbPhaseName == "PDNA") - return shared_ptr(new PDNA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())}, - std::shared_ptr())); + return shared_ptr(new PDNA(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEA), + Timespan(span.End() - clk * cl.PDXA, span.End())}, std::shared_ptr())); else if (dbPhaseName == "PDNAB") - return shared_ptr(new PDNAB(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())}, - std::shared_ptr())); + return shared_ptr(new PDNAB(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), + Timespan(span.End() - clk, span.End())}, std::shared_ptr())); else if (dbPhaseName == "PDNP") - return shared_ptr(new PDNP(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())}, - std::shared_ptr())); + return shared_ptr(new PDNP(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEP), + Timespan(span.End() - clk * cl.PDXP, span.End())}, std::shared_ptr())); else if (dbPhaseName == "PDNPB") - return shared_ptr(new PDNPB(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())}, - std::shared_ptr())); + return shared_ptr(new PDNPB(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), + Timespan(span.End() - clk, span.End())}, std::shared_ptr())); else if (dbPhaseName == "SREF") - return shared_ptr(new SREF(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())}, - std::shared_ptr())); + return shared_ptr(new SREF(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.SREFEN), + Timespan(span.End() - clk * cl.SREFEX, span.End())}, std::shared_ptr())); else if (dbPhaseName == "SREFB") - return shared_ptr(new SREFB(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), Timespan(span.End() - clk, span.End())}, - std::shared_ptr())); + return shared_ptr(new SREFB(id, span, trans, {Timespan(span.Begin(), span.Begin() + clk), + Timespan(span.End() - clk, span.End())}, std::shared_ptr())); else - throw std::runtime_error("DB phasename " + dbPhaseName.toStdString() + - " unkown to phasefactory"); + throw std::runtime_error("DB phasename " + dbPhaseName.toStdString() + " unkown to phasefactory"); } diff --git a/DRAMSys/traceAnalyzer/data/tracedb.cpp b/DRAMSys/traceAnalyzer/data/tracedb.cpp index 326db059..2e99fc07 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.cpp +++ b/DRAMSys/traceAnalyzer/data/tracedb.cpp @@ -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); diff --git a/DRAMSys/traceAnalyzer/data/tracedb.h b/DRAMSys/traceAnalyzer/data/tracedb.h index 7ab07040..60afb9b8 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.h +++ b/DRAMSys/traceAnalyzer/data/tracedb.h @@ -48,6 +48,7 @@ #include #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> getTransactionsWithCustomQuery( QString queryText); std::vector> 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(); }; diff --git a/DRAMSys/traceAnalyzer/traceAnalyzer.pro b/DRAMSys/traceAnalyzer/traceAnalyzer.pro index e30300c5..9db5fe69 100644 --- a/DRAMSys/traceAnalyzer/traceAnalyzer.pro +++ b/DRAMSys/traceAnalyzer/traceAnalyzer.pro @@ -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 += \