diff --git a/DRAMSys/library/resources/configs/amconfigs/am_ranktest.xml b/DRAMSys/library/resources/configs/amconfigs/am_ranktest.xml
index 11b68c5c..fc62b956 100644
--- a/DRAMSys/library/resources/configs/amconfigs/am_ranktest.xml
+++ b/DRAMSys/library/resources/configs/amconfigs/am_ranktest.xml
@@ -16,11 +16,11 @@ B B B | R R R R R R R R R R R R R R | C C C C C C C C C C | Y Y Y
-->
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/DRAMSys/library/resources/configs/mcconfigs/fifoStrict.xml b/DRAMSys/library/resources/configs/mcconfigs/fifoStrict.xml
index 64b06284..1226d09a 100644
--- a/DRAMSys/library/resources/configs/mcconfigs/fifoStrict.xml
+++ b/DRAMSys/library/resources/configs/mcconfigs/fifoStrict.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/DRAMSys/library/resources/configs/memspecs/memspec_ranktest.xml b/DRAMSys/library/resources/configs/memspecs/memspec_ranktest.xml
index cd5852ec..6fc6b6be 100644
--- a/DRAMSys/library/resources/configs/memspecs/memspec_ranktest.xml
+++ b/DRAMSys/library/resources/configs/memspecs/memspec_ranktest.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/DRAMSys/library/src/common/XmlAddressDecoder.cpp b/DRAMSys/library/src/common/XmlAddressDecoder.cpp
index 2da48e45..7b476781 100644
--- a/DRAMSys/library/src/common/XmlAddressDecoder.cpp
+++ b/DRAMSys/library/src/common/XmlAddressDecoder.cpp
@@ -79,6 +79,12 @@ void XmlAddressDecoder::setConfiguration(std::string addressConfigURI)
masks.rank = pow(2.0, to + 1.0) - pow(2.0, from + 0.0);
amount.rank = pow(2.0, to - from + 1.0);
}
+ else if (std::strcmp(child->Name(), "bankgroup") == 0)
+ {
+ shifts.bankgroup = from;
+ masks.bankgroup = pow(2.0, to + 1.0) - pow(2.0, from + 0.0);
+ amount.bankgroup = pow(2.0, to - from + 1.0);
+ }
else if (std::strcmp(child->Name(), "bank") == 0)
{
shifts.bank = from;
@@ -107,10 +113,12 @@ void XmlAddressDecoder::setConfiguration(std::string addressConfigURI)
SC_REPORT_FATAL("XmlAddressDecoder", ("Unknown field " + std::string(child->Name())).c_str());
}
- banksPerRank = amount.bank;
- amount.bank = amount.bank * amount.rank;
- amount.bankgroup = Configuration::getInstance().memSpec->NumberOfBankGroups;
- banksPerGroup = amount.bank / amount.bankgroup;
+ banksPerGroup = amount.bank;
+ banksPerRank = banksPerGroup * amount.bankgroup;
+ amount.bank = banksPerRank * amount.rank;
+
+ bankgroupsPerRank = amount.bankgroup;
+ amount.bankgroup = bankgroupsPerRank * amount.rank;
}
@@ -119,8 +127,10 @@ DecodedAddress XmlAddressDecoder::decodeAddress(uint64_t addr)
DecodedAddress result;
result.channel = (addr & masks.channel) >> shifts.channel;
result.rank = (addr & masks.rank) >> shifts.rank;
- result.bankgroup = result.bank / banksPerGroup;
- result.bank = ((addr & masks.bank) >> shifts.bank) + result.rank * banksPerRank;
+ result.bankgroup = ((addr & masks.bankgroup) >> shifts.bankgroup)
+ + result.rank * bankgroupsPerRank;
+ result.bank = ((addr & masks.bank) >> shifts.bank)
+ + result.bankgroup * banksPerGroup;
result.row = (addr & masks.row) >> shifts.row;
result.column = (addr & masks.column) >> shifts.column;
result.bytes = (addr & masks.bytes) >> shifts.bytes;
@@ -131,7 +141,8 @@ uint64_t XmlAddressDecoder::encodeAddress(DecodedAddress n)
{
return (n.channel << shifts.channel) |
(n.rank << shifts.rank) |
- ((n.bank % banksPerRank) << shifts.bank) |
+ ((n.bankgroup % bankgroupsPerRank) << shifts.bankgroup) |
+ ((n.bank % banksPerGroup) << shifts.bank) |
(n.row << shifts.row) |
(n.column << shifts.column) |
(n.bytes << shifts.bytes);
@@ -153,11 +164,12 @@ void XmlAddressDecoder::print()
{
std::cout << headline << std::endl;
std::cout << "Address Mapping:" << std::endl << std::endl;
- std::cout << std::setw(10) << "channel: " << std::bitset<64>(masks.channel) << std::endl;
- std::cout << std::setw(10) << "rank: " << std::bitset<64>(masks.rank) << std::endl;
- std::cout << std::setw(10) << "bank: " << std::bitset<64>(masks.bank) << std::endl;
- std::cout << std::setw(10) << "row: " << std::bitset<64>(masks.row) << std::endl;
- std::cout << std::setw(10) << "column: " << std::bitset<64>(masks.column) << std::endl;
- std::cout << std::setw(10) << "bytes: " << std::bitset<64>(masks.bytes) << std::endl;
+ std::cout << std::setw(11) << "channel: " << std::bitset<64>(masks.channel) << std::endl;
+ std::cout << std::setw(11) << "rank: " << std::bitset<64>(masks.rank) << std::endl;
+ std::cout << std::setw(11) << "bankgroup: " << std::bitset<64>(masks.bankgroup) << std::endl;
+ std::cout << std::setw(11) << "bank: " << std::bitset<64>(masks.bank) << std::endl;
+ std::cout << std::setw(11) << "row: " << std::bitset<64>(masks.row) << std::endl;
+ std::cout << std::setw(11) << "column: " << std::bitset<64>(masks.column) << std::endl;
+ std::cout << std::setw(11) << "bytes: " << std::bitset<64>(masks.bytes) << std::endl;
std::cout << std::endl;
}
diff --git a/DRAMSys/library/src/common/XmlAddressDecoder.h b/DRAMSys/library/src/common/XmlAddressDecoder.h
index b0c848d7..85a9c0ca 100644
--- a/DRAMSys/library/src/common/XmlAddressDecoder.h
+++ b/DRAMSys/library/src/common/XmlAddressDecoder.h
@@ -55,6 +55,7 @@ private:
{
uint64_t channel = 0;
uint64_t rank = 0;
+ uint64_t bankgroup = 0;
uint64_t bank = 0;
uint64_t row = 0;
uint64_t column = 0;
@@ -65,6 +66,7 @@ private:
{
unsigned channel = 0;
unsigned rank = 0;
+ unsigned bankgroup = 0;
unsigned bank = 0;
unsigned row = 0;
unsigned column = 0;
@@ -73,6 +75,7 @@ private:
unsigned banksPerGroup;
unsigned banksPerRank;
+ unsigned bankgroupsPerRank;
tinyxml2::XMLElement *addressmapping;
diff --git a/DRAMSys/library/src/common/utils.h b/DRAMSys/library/src/common/utils.h
index e997d99a..9def2069 100644
--- a/DRAMSys/library/src/common/utils.h
+++ b/DRAMSys/library/src/common/utils.h
@@ -92,7 +92,7 @@ bool isIn(const T &value, const std::vector &collection)
}
constexpr const char headline[] =
- "==========================================================================";
+ "===========================================================================";
static inline void loadbar(unsigned int x,
unsigned int n,