diff options
author | bd <bdunahu@operationnull.com> | 2025-03-11 19:02:55 -0400 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2025-03-11 19:02:55 -0400 |
commit | fb7735049f571ac45a193481e962f497b4759fa4 (patch) | |
tree | 8721f192b627001a3d47af2157ba14b97c52d645 | |
parent | df803d2ccc6a3e1e112cc88feb6c8b84743073b6 (diff) |
fix lots of bugs
-rw-r--r-- | inc/definitions.h | 1 | ||||
-rw-r--r-- | src/storage/cache.cc | 10 | ||||
-rw-r--r-- | src/utils/utils.cc | 7 | ||||
-rw-r--r-- | tests/utils.cc | 22 |
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]") |