Pointer to reference.
This commit is contained in:
@@ -144,7 +144,7 @@ void to_json(json &j, const TraceSetup &c)
|
||||
json transition_j;
|
||||
transition_j["from"] = transition.first;
|
||||
transition_j["to"] = transition.second.to;
|
||||
transition_j["propability"] = transition.second.propability;
|
||||
transition_j["probability"] = transition.second.probability;
|
||||
remove_null_values(transition_j);
|
||||
transitions_j.insert(transitions_j.end(), transition_j);
|
||||
}
|
||||
@@ -247,7 +247,7 @@ void from_json(const json &j, TraceSetup &c)
|
||||
TraceGeneratorStateTransition transition;
|
||||
unsigned int from = transition_j.at("from");
|
||||
transition.to = transition_j.at("to");
|
||||
transition.propability = transition_j.at("propability");
|
||||
transition.probability = transition_j.at("probability");
|
||||
generator.transitions.emplace(from, transition);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ struct TraceGeneratorIdleState : public TraceGeneratorState
|
||||
struct TraceGeneratorStateTransition
|
||||
{
|
||||
unsigned int to;
|
||||
float propability;
|
||||
float probability;
|
||||
};
|
||||
|
||||
struct TraceGenerator : public TrafficInitiator
|
||||
|
||||
@@ -70,7 +70,7 @@ MemoryManager::~MemoryManager()
|
||||
//PRINTDEBUGMESSAGE("MemoryManager","Number of freed payloads: " + to_string(numberOfFrees));
|
||||
}
|
||||
|
||||
tlm_generic_payload *MemoryManager::allocate(unsigned dataLength)
|
||||
tlm_generic_payload& MemoryManager::allocate(unsigned dataLength)
|
||||
{
|
||||
if (freePayloads[dataLength].empty())
|
||||
{
|
||||
@@ -85,17 +85,17 @@ tlm_generic_payload *MemoryManager::allocate(unsigned dataLength)
|
||||
payload->set_data_ptr(data);
|
||||
}
|
||||
|
||||
return payload;
|
||||
return *payload;
|
||||
}
|
||||
else
|
||||
{
|
||||
tlm_generic_payload *result = freePayloads[dataLength].top();
|
||||
tlm_generic_payload* result = freePayloads[dataLength].top();
|
||||
freePayloads[dataLength].pop();
|
||||
return result;
|
||||
return *result;
|
||||
}
|
||||
}
|
||||
|
||||
void MemoryManager::free(tlm_generic_payload *payload)
|
||||
void MemoryManager::free(tlm_generic_payload* payload)
|
||||
{
|
||||
unsigned dataLength = payload->get_data_length();
|
||||
freePayloads[dataLength].push(payload);
|
||||
|
||||
@@ -47,13 +47,13 @@ class MemoryManager : public tlm::tlm_mm_interface
|
||||
public:
|
||||
MemoryManager();
|
||||
~MemoryManager() override;
|
||||
tlm::tlm_generic_payload *allocate(unsigned dataLength);
|
||||
void free(tlm::tlm_generic_payload *payload) override;
|
||||
tlm::tlm_generic_payload& allocate(unsigned dataLength);
|
||||
void free(tlm::tlm_generic_payload* payload) override;
|
||||
|
||||
private:
|
||||
uint64_t numberOfAllocations;
|
||||
uint64_t numberOfFrees;
|
||||
std::unordered_map<unsigned, std::stack<tlm::tlm_generic_payload *>> freePayloads;
|
||||
std::unordered_map<unsigned, std::stack<tlm::tlm_generic_payload*>> freePayloads;
|
||||
bool storageEnabled = false;
|
||||
};
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ StlPlayer::StlPlayer(const sc_module_name &name,
|
||||
unsigned int maxPendingReadRequests,
|
||||
unsigned int maxPendingWriteRequests,
|
||||
bool addLengthConverter,
|
||||
TraceSetup *setup,
|
||||
TraceSetup& setup,
|
||||
bool relative) :
|
||||
TrafficInitiator(name, setup, maxPendingReadRequests, maxPendingWriteRequests,
|
||||
Configuration::getInstance().memSpec->defaultBytesPerBurst, addLengthConverter),
|
||||
@@ -102,17 +102,17 @@ void StlPlayer::sendNextPayload()
|
||||
}
|
||||
|
||||
// Allocate a generic payload for this request.
|
||||
tlm_generic_payload *payload = setup->allocatePayload(lineIterator->dataLength);
|
||||
payload->acquire();
|
||||
tlm_generic_payload& payload = setup.allocatePayload(lineIterator->dataLength);
|
||||
payload.acquire();
|
||||
|
||||
// Fill up the payload.
|
||||
payload->set_address(lineIterator->address);
|
||||
payload->set_response_status(TLM_INCOMPLETE_RESPONSE);
|
||||
payload->set_dmi_allowed(false);
|
||||
payload->set_byte_enable_length(0);
|
||||
payload->set_data_length(lineIterator->dataLength);
|
||||
payload->set_command(lineIterator->command);
|
||||
std::copy(lineIterator->data.begin(), lineIterator->data.end(), payload->get_data_ptr());
|
||||
payload.set_address(lineIterator->address);
|
||||
payload.set_response_status(TLM_INCOMPLETE_RESPONSE);
|
||||
payload.set_dmi_allowed(false);
|
||||
payload.set_byte_enable_length(0);
|
||||
payload.set_data_length(lineIterator->dataLength);
|
||||
payload.set_command(lineIterator->command);
|
||||
std::copy(lineIterator->data.begin(), lineIterator->data.end(), payload.get_data_ptr());
|
||||
|
||||
sc_time sendingTime;
|
||||
sc_time sendingOffset;
|
||||
@@ -127,13 +127,13 @@ void StlPlayer::sendNextPayload()
|
||||
else
|
||||
sendingTime = sc_time_stamp() + sendingOffset + lineIterator->sendingTime;
|
||||
|
||||
sendToTarget(*payload, BEGIN_REQ, sendingTime - sc_time_stamp());
|
||||
sendToTarget(payload, BEGIN_REQ, sendingTime - sc_time_stamp());
|
||||
|
||||
transactionsSent++;
|
||||
|
||||
if (payload->get_command() == tlm::TLM_READ_COMMAND)
|
||||
if (payload.get_command() == tlm::TLM_READ_COMMAND)
|
||||
pendingReadRequests++;
|
||||
else if (payload->get_command() == tlm::TLM_WRITE_COMMAND)
|
||||
else if (payload.get_command() == tlm::TLM_WRITE_COMMAND)
|
||||
pendingWriteRequests++;
|
||||
|
||||
PRINTDEBUGMESSAGE(name(), "Performing request #" + std::to_string(transactionsSent));
|
||||
|
||||
@@ -70,7 +70,7 @@ public:
|
||||
unsigned int maxPendingReadRequests,
|
||||
unsigned int maxPendingWriteRequests,
|
||||
bool addLengthConverter,
|
||||
TraceSetup *setup,
|
||||
TraceSetup& setup,
|
||||
bool relative);
|
||||
|
||||
~StlPlayer() override;
|
||||
@@ -89,8 +89,8 @@ private:
|
||||
|
||||
static constexpr unsigned lineBufferSize = 10000;
|
||||
|
||||
std::vector<LineContent> *currentBuffer;
|
||||
std::vector<LineContent> *parseBuffer;
|
||||
std::vector<LineContent>* currentBuffer;
|
||||
std::vector<LineContent>* parseBuffer;
|
||||
std::array<std::vector<LineContent>, 2> lineContents;
|
||||
std::vector<LineContent>::const_iterator lineIterator;
|
||||
|
||||
|
||||
@@ -106,10 +106,10 @@ TraceSetup::TraceSetup(const DRAMSysConfiguration::TraceSetup &traceSetup, const
|
||||
StlPlayer *player;
|
||||
if (ext == "stl")
|
||||
player = new StlPlayer(moduleName.c_str(), stlFile, playerClk, maxPendingReadRequests,
|
||||
maxPendingWriteRequests, addLengthConverter, this, false);
|
||||
maxPendingWriteRequests, addLengthConverter, *this, false);
|
||||
else if (ext == "rstl")
|
||||
player = new StlPlayer(moduleName.c_str(), stlFile, playerClk, maxPendingReadRequests,
|
||||
maxPendingWriteRequests, addLengthConverter, this, true);
|
||||
maxPendingWriteRequests, addLengthConverter, *this, true);
|
||||
else
|
||||
throw std::runtime_error("Unsupported file extension in " + name);
|
||||
|
||||
@@ -118,7 +118,7 @@ TraceSetup::TraceSetup(const DRAMSysConfiguration::TraceSetup &traceSetup, const
|
||||
}
|
||||
else if constexpr (std::is_same_v<T, DRAMSysConfiguration::TraceGenerator>)
|
||||
{
|
||||
TrafficGenerator *trafficGenerator = new TrafficGenerator(name.c_str(), initiator, this);
|
||||
TrafficGenerator *trafficGenerator = new TrafficGenerator(name.c_str(), initiator, *this);
|
||||
players.push_back(std::unique_ptr<TrafficInitiator>(trafficGenerator));
|
||||
|
||||
totalTransactions += trafficGenerator->getTotalTransactions();
|
||||
@@ -129,7 +129,7 @@ TraceSetup::TraceSetup(const DRAMSysConfiguration::TraceSetup &traceSetup, const
|
||||
uint64_t rowIncrement = initiator.rowIncrement;
|
||||
|
||||
players.push_back(
|
||||
std::unique_ptr<TrafficInitiator>(new TrafficGeneratorHammer(name.c_str(), initiator, this)));
|
||||
std::unique_ptr<TrafficInitiator>(new TrafficGeneratorHammer(name.c_str(), initiator, *this)));
|
||||
totalTransactions += numRequests;
|
||||
}
|
||||
},
|
||||
@@ -195,12 +195,12 @@ void TraceSetup::transactionFinished()
|
||||
std::cout << std::endl;
|
||||
}
|
||||
|
||||
tlm_generic_payload *TraceSetup::allocatePayload(unsigned dataLength)
|
||||
tlm_generic_payload& TraceSetup::allocatePayload(unsigned dataLength)
|
||||
{
|
||||
return memoryManager.allocate(dataLength);
|
||||
}
|
||||
|
||||
tlm_generic_payload *TraceSetup::allocatePayload()
|
||||
tlm_generic_payload& TraceSetup::allocatePayload()
|
||||
{
|
||||
return allocatePayload(defaultDataLength);
|
||||
}
|
||||
|
||||
@@ -56,8 +56,8 @@ public:
|
||||
|
||||
void trafficInitiatorTerminates();
|
||||
void transactionFinished();
|
||||
tlm::tlm_generic_payload *allocatePayload(unsigned dataLength);
|
||||
tlm::tlm_generic_payload *allocatePayload();
|
||||
tlm::tlm_generic_payload& allocatePayload(unsigned dataLength);
|
||||
tlm::tlm_generic_payload& allocatePayload();
|
||||
|
||||
private:
|
||||
unsigned int numberOfTrafficInitiators;
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
using namespace sc_core;
|
||||
using namespace tlm;
|
||||
|
||||
TrafficGeneratorIf::TrafficGeneratorIf(const sc_core::sc_module_name &name, TraceSetup *setup,
|
||||
TrafficGeneratorIf::TrafficGeneratorIf(const sc_core::sc_module_name& name, TraceSetup& setup,
|
||||
unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests,
|
||||
unsigned int dataLength, bool addLengthConverter)
|
||||
: TrafficInitiator(name, setup, maxPendingReadRequests, maxPendingWriteRequests, dataLength, addLengthConverter)
|
||||
@@ -69,14 +69,14 @@ void TrafficGeneratorIf::sendNextPayload()
|
||||
else if (command == tlm::TLM_WRITE_COMMAND)
|
||||
pendingWriteRequests++;
|
||||
|
||||
tlm_generic_payload *payload = setup->allocatePayload();
|
||||
payload->acquire();
|
||||
payload->set_address(address);
|
||||
payload->set_response_status(tlm::TLM_INCOMPLETE_RESPONSE);
|
||||
payload->set_dmi_allowed(false);
|
||||
payload->set_byte_enable_length(0);
|
||||
payload->set_data_length(defaultDataLength);
|
||||
payload->set_command(command);
|
||||
tlm_generic_payload& payload = setup.allocatePayload();
|
||||
payload.acquire();
|
||||
payload.set_address(address);
|
||||
payload.set_response_status(tlm::TLM_INCOMPLETE_RESPONSE);
|
||||
payload.set_dmi_allowed(false);
|
||||
payload.set_byte_enable_length(0);
|
||||
payload.set_data_length(defaultDataLength);
|
||||
payload.set_command(command);
|
||||
|
||||
sc_time generatorClk = getGeneratorClk();
|
||||
sc_time sendingOffset;
|
||||
@@ -86,7 +86,7 @@ void TrafficGeneratorIf::sendNextPayload()
|
||||
sendingOffset = (generatorClk * clksPerRequest()) - (sc_time_stamp() % generatorClk) + generatorClk * clksToIdle();
|
||||
|
||||
// TODO: do not send two requests in the same cycle
|
||||
sendToTarget(*payload, tlm::BEGIN_REQ, sendingOffset);
|
||||
sendToTarget(payload, tlm::BEGIN_REQ, sendingOffset);
|
||||
|
||||
transactionsSent++;
|
||||
PRINTDEBUGMESSAGE(name(), "Performing request #" + std::to_string(transactionsSent));
|
||||
@@ -94,7 +94,7 @@ void TrafficGeneratorIf::sendNextPayload()
|
||||
}
|
||||
|
||||
TrafficGenerator::TrafficGenerator(const sc_module_name &name, const DRAMSysConfiguration::TraceGenerator &conf,
|
||||
TraceSetup *setup)
|
||||
TraceSetup& setup)
|
||||
: TrafficGeneratorIf(name, setup, conf.maxPendingReadRequests.value_or(defaultMaxPendingReadRequests),
|
||||
conf.maxPendingWriteRequests.value_or(defaultMaxPendingWriteRequests),
|
||||
conf.dataLength.value_or(Configuration::getInstance().memSpec->defaultBytesPerBurst),
|
||||
@@ -153,19 +153,19 @@ void TrafficGenerator::calculateTransitions()
|
||||
while (true)
|
||||
{
|
||||
auto transitionsIt = conf.transitions.equal_range(state);
|
||||
float propabilityAccumulated = 0.0f;
|
||||
float probabilityAccumulated = 0.0f;
|
||||
std::map<unsigned int, std::pair<float, float>> transitionsDistribution;
|
||||
|
||||
for (auto it = transitionsIt.first; it != transitionsIt.second; ++it)
|
||||
{
|
||||
float lowerLimit = propabilityAccumulated;
|
||||
propabilityAccumulated += it->second.propability;
|
||||
float upperLimit = propabilityAccumulated;
|
||||
float lowerLimit = probabilityAccumulated;
|
||||
probabilityAccumulated += it->second.probability;
|
||||
float upperLimit = probabilityAccumulated;
|
||||
transitionsDistribution[it->second.to] = {lowerLimit, upperLimit};
|
||||
}
|
||||
|
||||
if (propabilityAccumulated > 1.001f)
|
||||
SC_REPORT_WARNING("TrafficGenerator", "Sum of transition propabilities greater than 1.");
|
||||
if (probabilityAccumulated > 1.001f)
|
||||
SC_REPORT_WARNING("TrafficGenerator", "Sum of transition probabilities greater than 1.");
|
||||
|
||||
float random = randomDistribution(randomGenerator);
|
||||
bool transitionFound = false;
|
||||
@@ -376,7 +376,7 @@ uint64_t TrafficGenerator::evaluateMaxAddress(const DRAMSysConfiguration::TraceG
|
||||
}
|
||||
|
||||
TrafficGeneratorHammer::TrafficGeneratorHammer(const sc_core::sc_module_name &name,
|
||||
const DRAMSysConfiguration::TraceHammer &conf, TraceSetup *setup)
|
||||
const DRAMSysConfiguration::TraceHammer &conf, TraceSetup& setup)
|
||||
: TrafficGeneratorIf(name, setup, 1, 1, Configuration::getInstance().memSpec->defaultBytesPerBurst, false),
|
||||
generatorClk(evaluateGeneratorClk(conf)), rowIncrement(conf.rowIncrement), numRequests(conf.numRequests)
|
||||
{
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
class TrafficGeneratorIf : public TrafficInitiator
|
||||
{
|
||||
public:
|
||||
TrafficGeneratorIf(const sc_core::sc_module_name &name, TraceSetup *setup,
|
||||
TrafficGeneratorIf(const sc_core::sc_module_name &name, TraceSetup& setup,
|
||||
unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests,
|
||||
unsigned int dataLength, bool addLengthConverter);
|
||||
|
||||
@@ -68,7 +68,7 @@ class TrafficGenerator : public TrafficGeneratorIf
|
||||
{
|
||||
public:
|
||||
TrafficGenerator(const sc_core::sc_module_name &name, const DRAMSysConfiguration::TraceGenerator &conf,
|
||||
TraceSetup *setup);
|
||||
TraceSetup& setup);
|
||||
|
||||
uint64_t getTotalTransactions() const;
|
||||
void waitUntil(const sc_core::sc_event *ev);
|
||||
@@ -131,7 +131,7 @@ class TrafficGeneratorHammer final : public TrafficGeneratorIf
|
||||
{
|
||||
public:
|
||||
TrafficGeneratorHammer(const sc_core::sc_module_name &name, const DRAMSysConfiguration::TraceHammer &conf,
|
||||
TraceSetup *setup);
|
||||
TraceSetup& setup);
|
||||
|
||||
private:
|
||||
void prepareNextPayload() override;
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
using namespace sc_core;
|
||||
using namespace tlm;
|
||||
|
||||
TrafficInitiator::TrafficInitiator(const sc_module_name &name, TraceSetup *setup,
|
||||
TrafficInitiator::TrafficInitiator(const sc_module_name &name, TraceSetup& setup,
|
||||
unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests,
|
||||
unsigned int defaultDataLength, bool addLengthConverter) :
|
||||
sc_module(name),
|
||||
@@ -62,7 +62,7 @@ TrafficInitiator::TrafficInitiator(const sc_module_name &name, TraceSetup *setup
|
||||
void TrafficInitiator::terminate()
|
||||
{
|
||||
std::cout << sc_time_stamp() << " " << this->name() << " terminated " << std::endl;
|
||||
setup->trafficInitiatorTerminates();
|
||||
setup.trafficInitiatorTerminates();
|
||||
}
|
||||
|
||||
tlm_sync_enum TrafficInitiator::nb_transport_bw(tlm_generic_payload &payload,
|
||||
@@ -87,7 +87,7 @@ void TrafficInitiator::peqCallback(tlm_generic_payload &payload,
|
||||
payload.release();
|
||||
sendToTarget(payload, END_RESP, SC_ZERO_TIME);
|
||||
if (Configuration::getInstance().simulationProgressBar)
|
||||
setup->transactionFinished();
|
||||
setup.transactionFinished();
|
||||
|
||||
transactionsReceived++;
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ class TrafficInitiator : public sc_core::sc_module
|
||||
{
|
||||
public:
|
||||
tlm_utils::simple_initiator_socket<TrafficInitiator> iSocket;
|
||||
TrafficInitiator(const sc_core::sc_module_name &name, TraceSetup *setup,
|
||||
TrafficInitiator(const sc_core::sc_module_name &name, TraceSetup& setup,
|
||||
unsigned int maxPendingReadRequests, unsigned int maxPendingWriteRequests,
|
||||
unsigned int defaultDataLength, bool addLengthConverter);
|
||||
SC_HAS_PROCESS(TrafficInitiator);
|
||||
@@ -68,7 +68,7 @@ protected:
|
||||
|
||||
tlm_utils::peq_with_cb_and_phase<TrafficInitiator> payloadEventQueue;
|
||||
void terminate();
|
||||
TraceSetup *setup;
|
||||
TraceSetup& setup;
|
||||
void sendToTarget(tlm::tlm_generic_payload &payload, const tlm::tlm_phase &phase,
|
||||
const sc_core::sc_time &delay);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user