Reuse payload extensions.
This commit is contained in:
@@ -55,13 +55,13 @@ unsigned int AddressDecoder::getUnsignedAttrFromJson(nlohmann::json obj, std::st
|
||||
else
|
||||
{
|
||||
SC_REPORT_FATAL("AddressDecoder", ("Attribute " + strName + " is not a number.").c_str());
|
||||
return (unsigned)(-1);
|
||||
return static_cast<unsigned>(-1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SC_REPORT_FATAL("AddressDecoder", ("Attribute " + strName + " is empty or not found.").c_str());
|
||||
return (unsigned)(-1);
|
||||
return static_cast<unsigned>(-1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,15 +124,15 @@ AddressDecoder::AddressDecoder(std::string pathToAddressMapping)
|
||||
vColumnBits = getAttrToVectorFromJson(mapping,"COLUMN_BIT");
|
||||
vByteBits = getAttrToVectorFromJson(mapping,"BYTE_BIT");
|
||||
|
||||
uint64_t channels = (uint64_t)(pow(2.0, vChannelBits.size()) + 0.5);
|
||||
uint64_t ranks = (uint64_t)(pow(2.0, vRankBits.size()) + 0.5);
|
||||
uint64_t bankgroups = (uint64_t)(pow(2.0, vBankGroupBits.size()) + 0.5);
|
||||
uint64_t banks = (uint64_t)(pow(2.0, vBankBits.size()) + 0.5);
|
||||
uint64_t rows = (uint64_t)(pow(2.0, vRowBits.size()) + 0.5);
|
||||
uint64_t columns = (uint64_t)(pow(2.0, vColumnBits.size()) + 0.5);
|
||||
uint64_t bytes = (uint64_t)(pow(2.0, vByteBits.size()) + 0.5);
|
||||
unsigned channels = static_cast<unsigned>(pow(2.0, vChannelBits.size()) + 0.5);
|
||||
unsigned ranks = static_cast<unsigned>(pow(2.0, vRankBits.size()) + 0.5);
|
||||
unsigned bankgroups = static_cast<unsigned>(pow(2.0, vBankGroupBits.size()) + 0.5);
|
||||
unsigned banks = static_cast<unsigned>(pow(2.0, vBankBits.size()) + 0.5);
|
||||
unsigned rows = static_cast<unsigned>(pow(2.0, vRowBits.size()) + 0.5);
|
||||
unsigned columns = static_cast<unsigned>(pow(2.0, vColumnBits.size()) + 0.5);
|
||||
unsigned bytes = static_cast<unsigned>(pow(2.0, vByteBits.size()) + 0.5);
|
||||
|
||||
maximumAddress = bytes * columns * rows * banks * bankgroups * ranks * channels - 1;
|
||||
maximumAddress = static_cast<uint64_t>(bytes) * columns * rows * banks * bankgroups * ranks * channels - 1;
|
||||
|
||||
banksPerGroup = banks;
|
||||
banks = banksPerGroup * bankgroups * ranks;
|
||||
@@ -201,78 +201,78 @@ void AddressDecoder::print()
|
||||
std::cout << "Used Address Mapping:" << std::endl;
|
||||
std::cout << std::endl;
|
||||
|
||||
for (int it = vChannelBits.size() - 1; it >= 0; it--)
|
||||
for (int it = static_cast<int>(vChannelBits.size() - 1); it >= 0; it--)
|
||||
{
|
||||
uint64_t addressBits = (UINT64_C(1) << vChannelBits[it]);
|
||||
uint64_t addressBits = (UINT64_C(1) << vChannelBits[static_cast<std::vector<unsigned>::size_type>(it)]);
|
||||
for (auto it2 : vXor)
|
||||
{
|
||||
if (it2.first == vChannelBits[it])
|
||||
if (it2.first == vChannelBits[static_cast<std::vector<unsigned>::size_type>(it)])
|
||||
addressBits |= (UINT64_C(1) << it2.second);
|
||||
}
|
||||
std::cout << " Ch " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl;
|
||||
}
|
||||
|
||||
for (int it = vRankBits.size() - 1; it >= 0; it--)
|
||||
for (int it = static_cast<int>(vRankBits.size() - 1); it >= 0; it--)
|
||||
{
|
||||
uint64_t addressBits = (UINT64_C(1) << vRankBits[it]);
|
||||
uint64_t addressBits = (UINT64_C(1) << vRankBits[static_cast<std::vector<unsigned>::size_type>(it)]);
|
||||
for (auto it2 : vXor)
|
||||
{
|
||||
if (it2.first == vRankBits[it])
|
||||
if (it2.first == vRankBits[static_cast<std::vector<unsigned>::size_type>(it)])
|
||||
addressBits |= (UINT64_C(1) << it2.second);
|
||||
}
|
||||
std::cout << " Ra " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl;
|
||||
}
|
||||
|
||||
for (int it = vBankGroupBits.size() - 1; it >= 0; it--)
|
||||
for (int it = static_cast<int>(vBankGroupBits.size() - 1); it >= 0; it--)
|
||||
{
|
||||
uint64_t addressBits = (UINT64_C(1) << vBankGroupBits[it]);
|
||||
uint64_t addressBits = (UINT64_C(1) << vBankGroupBits[static_cast<std::vector<unsigned>::size_type>(it)]);
|
||||
for (auto it2 : vXor)
|
||||
{
|
||||
if (it2.first == vBankGroupBits[it])
|
||||
if (it2.first == vBankGroupBits[static_cast<std::vector<unsigned>::size_type>(it)])
|
||||
addressBits |= (UINT64_C(1) << it2.second);
|
||||
}
|
||||
std::cout << " Bg " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl;
|
||||
}
|
||||
|
||||
for (int it = vBankBits.size() - 1; it >= 0; it--)
|
||||
for (int it = static_cast<int>(vBankBits.size() - 1); it >= 0; it--)
|
||||
{
|
||||
uint64_t addressBits = (UINT64_C(1) << vBankBits[it]);
|
||||
uint64_t addressBits = (UINT64_C(1) << vBankBits[static_cast<std::vector<unsigned>::size_type>(it)]);
|
||||
for (auto it2 : vXor)
|
||||
{
|
||||
if (it2.first == vBankBits[it])
|
||||
if (it2.first == vBankBits[static_cast<std::vector<unsigned>::size_type>(it)])
|
||||
addressBits |= (UINT64_C(1) << it2.second);
|
||||
}
|
||||
std::cout << " Ba " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl;
|
||||
}
|
||||
|
||||
for (int it = vRowBits.size() - 1; it >= 0; it--)
|
||||
for (int it = static_cast<int>(vRowBits.size() - 1); it >= 0; it--)
|
||||
{
|
||||
uint64_t addressBits = (UINT64_C(1) << vRowBits[it]);
|
||||
uint64_t addressBits = (UINT64_C(1) << vRowBits[static_cast<std::vector<unsigned>::size_type>(it)]);
|
||||
for (auto it2 : vXor)
|
||||
{
|
||||
if (it2.first == vRowBits[it])
|
||||
if (it2.first == vRowBits[static_cast<std::vector<unsigned>::size_type>(it)])
|
||||
addressBits |= (UINT64_C(1) << it2.second);
|
||||
}
|
||||
std::cout << " Ro " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl;
|
||||
}
|
||||
|
||||
for (int it = vColumnBits.size() - 1; it >= 0; it--)
|
||||
for (int it = static_cast<int>(vColumnBits.size() - 1); it >= 0; it--)
|
||||
{
|
||||
uint64_t addressBits = (UINT64_C(1) << vColumnBits[it]);
|
||||
uint64_t addressBits = (UINT64_C(1) << vColumnBits[static_cast<std::vector<unsigned>::size_type>(it)]);
|
||||
for (auto it2 : vXor)
|
||||
{
|
||||
if (it2.first == vColumnBits[it])
|
||||
if (it2.first == vColumnBits[static_cast<std::vector<unsigned>::size_type>(it)])
|
||||
addressBits |= (UINT64_C(1) << it2.second);
|
||||
}
|
||||
std::cout << " Co " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl;
|
||||
}
|
||||
|
||||
for (int it = vByteBits.size() - 1; it >= 0; it--)
|
||||
for (int it = static_cast<int>(vByteBits.size() - 1); it >= 0; it--)
|
||||
{
|
||||
uint64_t addressBits = (UINT64_C(1) << vByteBits[it]);
|
||||
uint64_t addressBits = (UINT64_C(1) << vByteBits[static_cast<std::vector<unsigned>::size_type>(it)]);
|
||||
for (auto it2 : vXor)
|
||||
{
|
||||
if (it2.first == vByteBits[it])
|
||||
if (it2.first == vByteBits[static_cast<std::vector<unsigned>::size_type>(it)])
|
||||
addressBits |= (UINT64_C(1) << it2.second);
|
||||
}
|
||||
std::cout << " By " << std::setw(2) << it << ": " << std::bitset<64>(addressBits) << std::endl;
|
||||
|
||||
@@ -150,7 +150,7 @@ void TlmRecorder::introduceTransactionSystem(tlm_generic_payload &trans)
|
||||
currentTransactionsInSystem[&trans].timeOfGeneration = SC_ZERO_TIME;
|
||||
else
|
||||
currentTransactionsInSystem[&trans].timeOfGeneration =
|
||||
GenerationExtension::getExtension(&trans).TimeOfGeneration();
|
||||
GenerationExtension::getTimeOfGeneration(trans);
|
||||
|
||||
PRINTDEBUGMESSAGE(name, "New transaction #" + std::to_string(id) + " generation time " +
|
||||
currentTransactionsInSystem[&trans].timeOfGeneration.to_string());
|
||||
|
||||
@@ -46,23 +46,60 @@ DramExtension::DramExtension() :
|
||||
thread(0), channel(0), rank(0), bankgroup(0), bank(0),
|
||||
row(0), column(0), burstlength(0), payloadID(0) {}
|
||||
|
||||
DramExtension::DramExtension(const Thread &thread, const Rank &rank, const BankGroup &bankgroup,
|
||||
const Bank &bank, const Row &row, const Column &column,
|
||||
DramExtension::DramExtension(Thread thread, Rank rank, BankGroup bankgroup,
|
||||
Bank bank, Row row, Column column,
|
||||
unsigned int burstlength, uint64_t payloadID) :
|
||||
thread(thread), channel(0), rank(rank), bankgroup(bankgroup), bank(bank),
|
||||
row(row), column(column), burstlength(burstlength), payloadID(payloadID) {}
|
||||
|
||||
DramExtension::DramExtension(const Thread &thread, const Channel &channel, const Rank &rank,
|
||||
const BankGroup &bankgroup, const Bank &bank, const Row &row,
|
||||
const Column &column, unsigned int burstlength, uint64_t payloadID) :
|
||||
DramExtension::DramExtension(Thread thread, Channel channel, Rank rank,
|
||||
BankGroup bankgroup, Bank bank, Row row,
|
||||
Column column, unsigned int burstlength, uint64_t payloadID) :
|
||||
thread(thread), channel(channel), rank(rank), bankgroup(bankgroup), bank(bank),
|
||||
row(row), column(column), burstlength(burstlength), payloadID(payloadID) {}
|
||||
|
||||
void DramExtension::setExtension(tlm::tlm_generic_payload *payload,
|
||||
Thread thread, Channel channel, Rank rank,
|
||||
BankGroup bankgroup, Bank bank, Row row,
|
||||
Column column, unsigned int burstlength, uint64_t payloadID)
|
||||
{
|
||||
DramExtension *extension = nullptr;
|
||||
payload->get_extension(extension);
|
||||
|
||||
if (extension != nullptr)
|
||||
{
|
||||
extension->thread = thread;
|
||||
extension->channel = channel;
|
||||
extension->rank = rank;
|
||||
extension->bankgroup = bankgroup;
|
||||
extension->bank = bank;
|
||||
extension->row = row;
|
||||
extension->column = column;
|
||||
extension->burstlength = burstlength;
|
||||
extension->payloadID = payloadID;
|
||||
}
|
||||
else
|
||||
{
|
||||
extension = new DramExtension(thread, channel, rank, bankgroup,
|
||||
bank, row, column, burstlength, payloadID);
|
||||
payload->set_auto_extension(extension);
|
||||
}
|
||||
}
|
||||
|
||||
void DramExtension::setExtension(tlm::tlm_generic_payload &payload,
|
||||
Thread thread, Channel channel, Rank rank,
|
||||
BankGroup bankgroup, Bank bank, Row row,
|
||||
Column column, unsigned int burstlength, uint64_t payloadID)
|
||||
{
|
||||
setExtension(&payload, thread, channel, rank, bankgroup,
|
||||
bank, row, column, burstlength, payloadID);
|
||||
}
|
||||
|
||||
DramExtension &DramExtension::getExtension(const tlm_generic_payload *payload)
|
||||
{
|
||||
DramExtension *result = NULL;
|
||||
DramExtension *result = nullptr;
|
||||
payload->get_extension(result);
|
||||
sc_assert(result != NULL);
|
||||
sc_assert(result != nullptr);
|
||||
|
||||
return *result;
|
||||
}
|
||||
@@ -232,17 +269,43 @@ void GenerationExtension::copy_from(const tlm_extension_base &ext)
|
||||
|
||||
}
|
||||
|
||||
void GenerationExtension::setExtension(tlm::tlm_generic_payload *payload, sc_time timeOfGeneration)
|
||||
{
|
||||
GenerationExtension *extension = nullptr;
|
||||
payload->get_extension(extension);
|
||||
|
||||
if (extension != nullptr)
|
||||
{
|
||||
extension->timeOfGeneration = timeOfGeneration;
|
||||
}
|
||||
else
|
||||
{
|
||||
extension = new GenerationExtension(timeOfGeneration);
|
||||
payload->set_auto_extension(extension);
|
||||
}
|
||||
}
|
||||
|
||||
void GenerationExtension::setExtension(tlm::tlm_generic_payload &payload, sc_time timeOfGeneration)
|
||||
{
|
||||
GenerationExtension::setExtension(&payload, timeOfGeneration);
|
||||
}
|
||||
|
||||
GenerationExtension &GenerationExtension::getExtension(const tlm_generic_payload *payload)
|
||||
{
|
||||
GenerationExtension *result = NULL;
|
||||
GenerationExtension *result = nullptr;
|
||||
payload->get_extension(result);
|
||||
sc_assert(result != NULL);
|
||||
sc_assert(result != nullptr);
|
||||
return *result;
|
||||
}
|
||||
|
||||
GenerationExtension &GenerationExtension::getExtension(const tlm_generic_payload &payload)
|
||||
{
|
||||
return GenerationExtension::getExtension(&payload);
|
||||
}
|
||||
|
||||
sc_time GenerationExtension::getTimeOfGeneration(const tlm_generic_payload *payload)
|
||||
{
|
||||
return GenerationExtension::getExtension(payload).TimeOfGeneration();
|
||||
return GenerationExtension::getExtension(payload).timeOfGeneration;
|
||||
}
|
||||
|
||||
sc_time GenerationExtension::getTimeOfGeneration(const tlm_generic_payload &payload)
|
||||
|
||||
@@ -163,16 +163,25 @@ class DramExtension : public tlm::tlm_extension<DramExtension>
|
||||
{
|
||||
public:
|
||||
DramExtension();
|
||||
DramExtension(const Thread &thread, const Rank &rank, const BankGroup &bankgroup,
|
||||
const Bank &bank, const Row &row, const Column &column,
|
||||
DramExtension(Thread thread, Rank rank, BankGroup bankgroup,
|
||||
Bank bank, Row row, Column column,
|
||||
unsigned int burstlength, uint64_t payloadID);
|
||||
DramExtension(const Thread &thread, const Channel &channel, const Rank &rank,
|
||||
const BankGroup &bankgroup, const Bank &bank, const Row &row,
|
||||
const Column &column, unsigned int burstlength, uint64_t payloadID);
|
||||
DramExtension(Thread thread, Channel channel, Rank rank,
|
||||
BankGroup bankgroup, Bank bank, Row row,
|
||||
Column column, unsigned int burstlength, uint64_t payloadID);
|
||||
|
||||
virtual tlm::tlm_extension_base *clone() const;
|
||||
virtual void copy_from(const tlm::tlm_extension_base &ext);
|
||||
|
||||
static void setExtension(tlm::tlm_generic_payload *payload,
|
||||
Thread thread, Channel channel, Rank rank,
|
||||
BankGroup bankgroup, Bank bank, Row row,
|
||||
Column column, unsigned int burstlength, uint64_t payloadID);
|
||||
static void setExtension(tlm::tlm_generic_payload &payload,
|
||||
Thread thread, Channel channel, Rank rank,
|
||||
BankGroup bankgroup, Bank bank, Row row,
|
||||
Column column, unsigned int burstlength, uint64_t payloadID);
|
||||
|
||||
static DramExtension &getExtension(const tlm::tlm_generic_payload *payload);
|
||||
static DramExtension &getExtension(const tlm::tlm_generic_payload &payload);
|
||||
|
||||
@@ -229,12 +238,10 @@ public:
|
||||
: timeOfGeneration(timeOfGeneration) {}
|
||||
virtual tlm::tlm_extension_base *clone() const;
|
||||
virtual void copy_from(const tlm::tlm_extension_base &ext);
|
||||
static GenerationExtension
|
||||
&getExtension(const tlm::tlm_generic_payload *payload);
|
||||
sc_time TimeOfGeneration() const
|
||||
{
|
||||
return timeOfGeneration;
|
||||
}
|
||||
static void setExtension(tlm::tlm_generic_payload *payload, sc_time timeOfGeneration);
|
||||
static void setExtension(tlm::tlm_generic_payload &payload, sc_time timeOfGeneration);
|
||||
static GenerationExtension &getExtension(const tlm::tlm_generic_payload *payload);
|
||||
static GenerationExtension &getExtension(const tlm::tlm_generic_payload &payload);
|
||||
static sc_time getTimeOfGeneration(const tlm::tlm_generic_payload *payload);
|
||||
static sc_time getTimeOfGeneration(const tlm::tlm_generic_payload &payload);
|
||||
|
||||
|
||||
@@ -78,6 +78,8 @@ void BankMachine::updateState(Command command)
|
||||
case Command::PDXA: case Command::PDXP:
|
||||
sleeping = false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -48,8 +48,8 @@ RefreshManagerRankwise::RefreshManagerRankwise(std::vector<BankMachine *> &bankM
|
||||
timeForNextTrigger = memSpec->getRefreshIntervalAB();
|
||||
setUpDummy(refreshPayload, 0, rank);
|
||||
|
||||
maxPostponed = config.refreshMaxPostponed;
|
||||
maxPulledin = -config.refreshMaxPulledin;
|
||||
maxPostponed = static_cast<int>(config.refreshMaxPostponed);
|
||||
maxPulledin = -static_cast<int>(config.refreshMaxPulledin);
|
||||
}
|
||||
|
||||
CommandTuple::Type RefreshManagerRankwise::getNextCommand()
|
||||
@@ -183,5 +183,7 @@ void RefreshManagerRankwise::updateState(Command command)
|
||||
case Command::PDXA: case Command::PDXP:
|
||||
sleeping = false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -230,16 +230,14 @@ void Arbiter::peqCallback(tlm_generic_payload &payload, const tlm_phase &phase)
|
||||
|
||||
void Arbiter::appendDramExtension(int socketId, tlm_generic_payload &payload)
|
||||
{
|
||||
// Append Generation Extension
|
||||
GenerationExtension *genExtension = new GenerationExtension(sc_time_stamp());
|
||||
payload.set_auto_extension(genExtension);
|
||||
// Set Generation Extension and DRAM Extension
|
||||
GenerationExtension::setExtension(&payload, sc_time_stamp());
|
||||
|
||||
unsigned int burstlength = payload.get_streaming_width();
|
||||
DecodedAddress decodedAddress = addressDecoder->decodeAddress(payload.get_address());
|
||||
DramExtension *extension = new DramExtension(Thread(socketId),
|
||||
Channel(decodedAddress.channel), Rank(decodedAddress.rank),
|
||||
BankGroup(decodedAddress.bankgroup), Bank(decodedAddress.bank),
|
||||
Row(decodedAddress.row), Column(decodedAddress.column),
|
||||
burstlength, nextPayloadID[decodedAddress.channel]++);
|
||||
payload.set_auto_extension(extension);
|
||||
DramExtension::setExtension(payload, Thread(socketId),
|
||||
Channel(decodedAddress.channel), Rank(decodedAddress.rank),
|
||||
BankGroup(decodedAddress.bankgroup), Bank(decodedAddress.bank),
|
||||
Row(decodedAddress.row), Column(decodedAddress.column),
|
||||
burstlength, nextPayloadID[decodedAddress.channel]++);
|
||||
}
|
||||
|
||||
@@ -46,8 +46,12 @@ MemoryManager::MemoryManager()
|
||||
|
||||
MemoryManager::~MemoryManager()
|
||||
{
|
||||
for (tlm_generic_payload *payload : freePayloads) {
|
||||
for (tlm_generic_payload *payload : freePayloads)
|
||||
{
|
||||
// Delete data buffer
|
||||
delete[] payload->get_data_ptr();
|
||||
// Delete all extensions
|
||||
payload->reset();
|
||||
delete payload;
|
||||
numberOfFrees++;
|
||||
}
|
||||
@@ -59,7 +63,8 @@ MemoryManager::~MemoryManager()
|
||||
|
||||
tlm_generic_payload *MemoryManager::allocate()
|
||||
{
|
||||
if (freePayloads.empty()) {
|
||||
if (freePayloads.empty())
|
||||
{
|
||||
numberOfAllocations++;
|
||||
tlm_generic_payload *payload = new tlm_generic_payload(this);
|
||||
|
||||
@@ -70,7 +75,9 @@ tlm_generic_payload *MemoryManager::allocate()
|
||||
|
||||
payload->set_data_ptr(data);
|
||||
return payload;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
tlm_generic_payload *result = freePayloads.back();
|
||||
freePayloads.pop_back();
|
||||
return result;
|
||||
@@ -79,7 +86,6 @@ tlm_generic_payload *MemoryManager::allocate()
|
||||
|
||||
void MemoryManager::free(tlm_generic_payload *payload)
|
||||
{
|
||||
payload->reset(); // clears all extensions
|
||||
freePayloads.push_back(payload);
|
||||
}
|
||||
|
||||
|
||||
@@ -49,8 +49,8 @@ public:
|
||||
virtual void free(tlm::tlm_generic_payload *payload);
|
||||
|
||||
private:
|
||||
unsigned int numberOfAllocations;
|
||||
unsigned int numberOfFrees;
|
||||
uint64_t numberOfAllocations;
|
||||
uint64_t numberOfFrees;
|
||||
std::vector<tlm::tlm_generic_payload *> freePayloads;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user