summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-03-11 19:02:55 -0400
committerbd <bdunahu@operationnull.com>2025-03-11 19:02:55 -0400
commitfb7735049f571ac45a193481e962f497b4759fa4 (patch)
tree8721f192b627001a3d47af2157ba14b97c52d645
parentdf803d2ccc6a3e1e112cc88feb6c8b84743073b6 (diff)
fix lots of bugs
-rw-r--r--inc/definitions.h1
-rw-r--r--src/storage/cache.cc10
-rw-r--r--src/utils/utils.cc7
-rw-r--r--tests/utils.cc22
4 files changed, 21 insertions, 19 deletions
diff --git a/inc/definitions.h b/inc/definitions.h
index 1d68a60..80fccbe 100644
--- a/inc/definitions.h
+++ b/inc/definitions.h
@@ -19,6 +19,7 @@
*/
#define MEM_WORD_SPEC 10
#define MEM_LINE_SPEC static_cast<unsigned int>(MEM_WORD_SPEC - LINE_SPEC)
+#define MEM_WORDS static_cast<int>(pow(2, MEM_WORD_SPEC))
#define MEM_LINES static_cast<int>(pow(2, MEM_LINE_SPEC))
/**
diff --git a/src/storage/cache.cc b/src/storage/cache.cc
index 14a6e61..ea90f50 100644
--- a/src/storage/cache.cc
+++ b/src/storage/cache.cc
@@ -138,6 +138,7 @@ void Cache::fetch_resource(int expected)
(meta->at(0) << (L1_CACHE_LINE_SPEC + LINE_SPEC))));
if (r == OK) {
meta->at(1) = -1;
+ r = WAIT;
}
} else {
r = this->lower->read_line(L1CACHE, expected, actual);
@@ -165,11 +166,12 @@ std::ostream &operator<<(std::ostream &os, const Cache &c)
std::vector<std::array<signed int, LINE_SIZE>> data =
c.view(0, L1_CACHE_LINES);
std::array<std::array<int, 2>, L1_CACHE_LINES> meta = c.get_meta();
+ std::cout << "FOO " << meta.at(31)[0];
os << " " << std::setfill(' ') << std::setw(L1_CACHE_LINE_SPEC + 2) << "INDEX"
<< " | " << std::setfill(' ') << std::setw((8 + 3) * 4 - 1) << "DATA"
<< " | " << std::setfill(' ')
- << std::setw(MEM_LINE_SPEC - LINE_SPEC - L1_CACHE_LINE_SPEC + 2) << "TAG"
+ << std::setw(MEM_LINE_SPEC - L1_CACHE_LINE_SPEC + 2) << "TAG"
<< " | D" << std::endl;
for (int i = 0; i < L1_CACHE_LINES; ++i) {
os << " 0b" << std::setw(L1_CACHE_LINE_SPEC) << std::bitset<L1_CACHE_LINE_SPEC>(i)
@@ -178,12 +180,12 @@ std::ostream &operator<<(std::ostream &os, const Cache &c)
os << "0x" << std::setfill('0') << std::setw(8) << std::hex
<< data.at(i).at(j) << " ";
}
- os << "| 0x" << std::setfill(' ');
+ os << "| 0b" << std::setfill(' ');
if (meta.at(i)[0] < 0)
- os << "?";
+ os << std::setfill('?') << std::setw(MEM_LINE_SPEC - L1_CACHE_LINE_SPEC) << "";
else
- os << std::bitset<MEM_LINE_SPEC - LINE_SPEC - L1_CACHE_LINE_SPEC>(meta.at(i)[0]);
+ os << std::bitset<MEM_LINE_SPEC - L1_CACHE_LINE_SPEC>(meta.at(i)[0]);
os << " | " << (int)(meta.at(i)[0] >= 0) << std::endl;
}
diff --git a/src/utils/utils.cc b/src/utils/utils.cc
index 87ce488..ebbc1e9 100644
--- a/src/utils/utils.cc
+++ b/src/utils/utils.cc
@@ -7,8 +7,7 @@
void get_bit_fields(int address, int *tag, int *index, int *offset)
{
*tag = GET_MID_BITS(
- address, LINE_SPEC + L1_CACHE_LINE_SPEC,
- MEM_LINE_SPEC + LINE_SPEC + L1_CACHE_LINE_SPEC);
+ address, L1_CACHE_LINE_SPEC + LINE_SPEC, MEM_WORD_SPEC);
*index = GET_MID_BITS(address, LINE_SPEC, L1_CACHE_LINE_SPEC + LINE_SPEC);
*offset = GET_LS_BITS(address, LINE_SPEC);
}
@@ -31,7 +30,7 @@ const std::string string_format(const char *const zcFormat, ...)
int wrap_address(int address) {
if (address < 0){
- return ((address % MEM_LINES) + MEM_LINES) % MEM_LINES;
+ return ((address % MEM_WORDS) + MEM_WORDS) % MEM_WORDS;
}
- return address % MEM_LINES;
+ return address % MEM_WORDS;
}
diff --git a/tests/utils.cc b/tests/utils.cc
index 900db1a..ea1a1ed 100644
--- a/tests/utils.cc
+++ b/tests/utils.cc
@@ -5,9 +5,9 @@
TEST_CASE("Parse arbitrary fields # one", "[cache]")
{
int tag, index, offset;
- int address = 0b111110001010101;
+ int address = 0b0001010101;
get_bit_fields(address, &tag, &index, &offset);
- CHECK(tag == 0b11111000);
+ CHECK(tag == 0b000);
CHECK(index == 0b10101);
CHECK(offset == 0b01);
}
@@ -15,30 +15,30 @@ TEST_CASE("Parse arbitrary fields # one", "[cache]")
TEST_CASE("Parse arbitrary fields # two", "[cache]")
{
int tag, index, offset;
- int address = 0b000110100111011;
+ int address = 0b0100111011;
get_bit_fields(address, &tag, &index, &offset);
- CHECK(tag == 0b00011010);
+ CHECK(tag == 0b010);
CHECK(index == 0b01110);
CHECK(offset == 0b11);
}
TEST_CASE("wrap address outside upper bound", "[utils]")
{
- int address = MEM_LINES + 25;
+ int address = MEM_WORDS + 25;
int wrapped = wrap_address(address);
REQUIRE(wrapped == 25);
}
TEST_CASE("wrap address inside upper bound", "[utils]")
{
- int address = MEM_LINES - 25;
+ int address = MEM_WORDS - 25;
int wrapped = wrap_address(address);
- REQUIRE(wrapped == MEM_LINES - 25);
+ REQUIRE(wrapped == MEM_WORDS - 25);
}
TEST_CASE("wrap address at upper bound", "[utils]")
{
- int address = MEM_LINES;
+ int address = MEM_WORDS;
int wrapped = wrap_address(address);
REQUIRE(wrapped == 0);
}
@@ -47,14 +47,14 @@ TEST_CASE("wrap address lower than 0 with magnitude lesser than mem size", "[uti
{
int address = -10;
int wrapped = wrap_address(address);
- REQUIRE(wrapped == MEM_LINES - 10);
+ REQUIRE(wrapped == MEM_WORDS - 10);
}
TEST_CASE("wrap address lower than 0 but with magnitude greater than mem size", "[utils]")
{
- int address = -(MEM_LINES + 10);
+ int address = -(MEM_WORDS + 10);
int wrapped = wrap_address(address);
- REQUIRE(wrapped == MEM_LINES - 10);
+ REQUIRE(wrapped == MEM_WORDS - 10);
}
TEST_CASE("wrap address at 0", "[utils]")