From df580c5352528a4837b996a838f486d3838050a4 Mon Sep 17 00:00:00 2001 From: bd Date: Fri, 11 Apr 2025 23:09:49 -0400 Subject: Move storage to a separate git repository. --- tests/cache.cc | 189 ------------------------------- tests/dram.cc | 351 --------------------------------------------------------- 2 files changed, 540 deletions(-) delete mode 100644 tests/cache.cc delete mode 100644 tests/dram.cc (limited to 'tests') diff --git a/tests/cache.cc b/tests/cache.cc deleted file mode 100644 index 0b04bce..0000000 --- a/tests/cache.cc +++ /dev/null @@ -1,189 +0,0 @@ -#include "cache.h" -#include "dram.h" -#include - -class CacheFixture -{ - public: - CacheFixture() - { - this->m_delay = 4; - this->c_delay = 2; - this->d = new Dram(this->m_delay); - this->c = new Cache(this->d, this->c_delay); - this->expected = {0, 0, 0, 0}; - this->actual = this->c->view(0, 1)[0]; - } - - ~CacheFixture() { delete this->c; } - - /** - * An operation that is done a lot. - */ - void - wait_for_storage(int delay, Response expected, std::function f) - { - for (int i = 0; i < delay; ++i) { - Response r = f(); - - // check response - CHECK(r == expected); - // check for early modifications - actual = c->view(0, 1)[0]; - REQUIRE(this->expected == this->actual); - } - } - - int m_delay; - int c_delay; - Cache *c; - Dram *d; - std::array expected; - std::array actual; -}; - -TEST_CASE_METHOD(CacheFixture, "store 0th element in DELAY cycles", "[dram]") -{ - Response r; - signed int w; - CHECK(expected == actual); - - w = 0x11223344; - // delay + 1 due to internal logic, when mem - // finishes handle_miss still returns 'blocked' - this->wait_for_storage(this->m_delay + 1, BLOCKED, [this, w]() { - return this->c->write_word(MEM, w, 0b0); - }); - - this->wait_for_storage(this->c_delay, WAIT, [this, w]() { - return this->c->write_word(MEM, w, 0b0); - }); - - r = c->write_word(MEM, w, 0b0); - CHECK(r == OK); - - actual = this->d->view(0, 1)[0]; - // we do NOT write back now! - REQUIRE(expected == actual); - - expected.at(0) = w; - actual = c->view(0, 1)[0]; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - CacheFixture, - "store 0th, 1st element in DELAY cycles, with conflict", - "[cache]") -{ - Response r; - signed int w; - int i; - CHECK(expected == actual); - - w = 0x11223344; - // delay + 1 due to internal logic, when mem - // finishes handle_miss still returns 'blocked' - for (i = 0; i < this->m_delay + 1; ++i) { - r = c->write_word(MEM, w, 0b0); - CHECK(r == BLOCKED); - r = c->write_word(FETCH, w, 0b1); - CHECK(r == WAIT); - - // check for early modifications - actual = c->view(0, 1)[0]; - REQUIRE(this->expected == this->actual); - } - - for (i = 0; i < this->c_delay; ++i) { - r = c->write_word(MEM, w, 0b0); - CHECK(r == WAIT); - r = c->write_word(FETCH, w, 0b1); - CHECK(r == WAIT); - - // check for early modifications - actual = c->view(0, 1)[0]; - REQUIRE(this->expected == this->actual); - } - - r = c->write_word(MEM, w, 0b0); - CHECK(r == OK); - - actual = d->view(0, 1)[0]; - // we do NOT write back now! - REQUIRE(expected == actual); - - expected.at(0) = w; - actual = c->view(0, 1)[0]; - REQUIRE(expected == actual); - - // this should have been loaded already! - this->wait_for_storage(this->c_delay, WAIT, [this, w]() { - return this->c->write_word(FETCH, w, 0b1); - }); - - r = c->write_word(FETCH, w, 0b1); - CHECK(r == OK); - - expected.at(1) = w; - actual = c->view(0, 1)[0]; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - CacheFixture, - "store 0th, 1st element different tags, in DELAY cycles, no conflict", - "[cache]") -{ - Response r; - signed int w; - CHECK(expected == actual); - - w = 0x11223344; - // delay + 1 due to internal logic, when mem - // finishes handle_miss still returns 'blocked' - this->wait_for_storage(this->m_delay + 1, BLOCKED, [this, w]() { - return this->c->write_word(MEM, w, 0b0); - }); - - this->wait_for_storage(this->c_delay, WAIT, [this, w]() { - return this->c->write_word(MEM, w, 0b0); - }); - - r = c->write_word(MEM, w, 0b0); - CHECK(r == OK); - - expected.at(0) = w; - actual = c->view(0, 1)[0]; - REQUIRE(expected == actual); - - // write back to memory - this->wait_for_storage(this->m_delay + 1, BLOCKED, [this, w]() { - return this->c->write_word(FETCH, w, 0b10000001); - }); - - // fetch new address (don't run the completion cycle yet) - this->wait_for_storage(this->m_delay, BLOCKED, [this, w]() { - return this->c->write_word(FETCH, w, 0b10000001); - }); - - // after the fetch, this cache line should be empty - this->c->write_word(FETCH, w, 0b10000001); - CHECK(r == OK); - - expected.at(0) = 0; - actual = c->view(0, 1)[0]; - CHECK(expected == actual); - - this->wait_for_storage(this->c_delay, WAIT, [this, w]() { - return this->c->write_word(FETCH, w, 0b10000001); - }); - - r = c->write_word(FETCH, w, 0b10000001); - CHECK(r == OK); - - expected.at(0) = 0; - expected.at(1) = w; - actual = c->view(0, 1)[0]; - REQUIRE(expected == actual); -} diff --git a/tests/dram.cc b/tests/dram.cc deleted file mode 100644 index 0e97e81..0000000 --- a/tests/dram.cc +++ /dev/null @@ -1,351 +0,0 @@ -#include "dram.h" -#include -#include - -class DramFixture -{ - public: - DramFixture() - { - this->delay = 3; - this->d = new Dram(this->delay); - this->expected = {0, 0, 0, 0}; - this->actual = this->d->view(0, 1)[0]; - } - - ~DramFixture() { delete this->d; } - - /** - * An operation that is done a lot. - */ - void - wait_for_storage(int delay, Response expected, std::function f) - { - for (int i = 0; i < delay; ++i) { - Response r = f(); - - // check response - CHECK(r == expected); - // check for early modifications - actual = d->view(0, 1)[0]; - REQUIRE(this->expected == this->actual); - } - } - - int delay; - Dram *d; - std::array expected; - std::array actual; -}; - -TEST_CASE_METHOD(DramFixture, "store 0th element in DELAY cycles", "[dram]") -{ - Response r; - signed int w; - CHECK(expected == actual); - - w = 0x11223344; - this->wait_for_storage(this->delay, WAIT, [this, w]() { - return this->d->write_word(MEM, w, 0x0); - }); - - r = this->d->write_word(MEM, w, 0x0); - - CHECK(r == OK); - expected.at(0) = w; - actual = this->d->view(0, 1)[0]; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - DramFixture, - "store 0th, 1st element in DELAY cycles, no conflict", - "[dram]") -{ - Response r; - signed int w; - CHECK(expected == actual); - - w = 0x11223344; - this->wait_for_storage(this->delay, WAIT, [this, w]() { - return this->d->write_word(MEM, w, 0x0); - }); - - r = d->write_word(MEM, w, 0x0); - REQUIRE(r == OK); - - expected.at(0) = w; - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - - this->wait_for_storage(this->delay, WAIT, [this, w]() { - return this->d->write_word(FETCH, w, 0x1); - }); - - r = d->write_word(FETCH, w, 0x1); - CHECK(r == OK); - - actual = d->view(0, 1)[0]; - expected.at(1) = w; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - DramFixture, "store 0th element in DELAY cycles with conflict", "[dram]") -{ - Response r; - signed int w; - int i; - CHECK(expected == actual); - - w = 0x11223344; - for (i = 0; i < this->delay; ++i) { - r = this->d->write_word(MEM, w, 0x0); - CHECK(r == WAIT); - r = this->d->write_word(FETCH, w, 0x1); - CHECK(r == WAIT); - - // check for early modifications - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - } - - r = d->write_word(MEM, w, 0x0); - REQUIRE(r == OK); - - expected.at(0) = w; - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - - this->wait_for_storage(this->delay, WAIT, [this, w]() { - return this->d->write_word(FETCH, w, 0x1); - }); - - r = d->write_word(FETCH, w, 0x1); - CHECK(r == OK); - - actual = d->view(0, 1)[0]; - expected.at(1) = w; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD(DramFixture, "store line in DELAY cycles", "[dram]") -{ - Response r; - signed int w; - std::array buffer; - CHECK(expected == actual); - - w = 0x11223344; - buffer = {w, w + 1, w + 2, w + 3}; - this->wait_for_storage(this->delay, WAIT, [this, w, buffer]() { - return this->d->write_line(MEM, buffer, 0x0); - }); - - r = d->write_line(MEM, buffer, 0x0); - CHECK(r == OK); - - actual = d->view(0, 1)[0]; - expected = buffer; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - DramFixture, "store line in DELAY cycles no conflict", "[dram]") -{ - Response r; - signed int w; - std::array buffer; - CHECK(expected == actual); - - w = 0x11223344; - buffer = {w, w + 1, w + 2, w + 3}; - this->wait_for_storage(this->delay, WAIT, [this, w, buffer]() { - return this->d->write_line(MEM, buffer, 0x0); - }); - - r = this->d->write_line(MEM, buffer, 0x0); - REQUIRE(r == OK); - - expected = buffer; - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - - buffer = {w + 4, w + 5, w + 6, w + 7}; - this->wait_for_storage(this->delay, WAIT, [this, w, buffer]() { - return this->d->write_line(FETCH, buffer, 0x1); - }); - - r = this->d->write_line(FETCH, buffer, 0x1); - CHECK(r == OK); - - expected = buffer; - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - DramFixture, "store line in DELAY cycles with conflict", "[dram]") -{ - Response r; - signed int w; - int i; - std::array buffer; - CHECK(expected == actual); - - w = 0x11223344; - buffer = {w, w + 1, w + 2, w + 3}; - for (i = 0; i < this->delay; ++i) { - r = this->d->write_line(MEM, buffer, 0x0); - CHECK(r == WAIT); - r = d->write_line(FETCH, buffer, 0x1); - CHECK(r == WAIT); - - // check for early modifications - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - } - - r = d->write_line(MEM, buffer, 0x0); - CHECK(r == OK); - - actual = d->view(0, 1)[0]; - expected = buffer; - REQUIRE(expected == actual); - - buffer = {w + 4, w + 5, w + 6, w + 7}; - this->wait_for_storage(this->delay, WAIT, [this, w, buffer]() { - return this->d->write_line(FETCH, buffer, 0x1); - }); - - r = this->d->write_line(FETCH, buffer, 0x1); - CHECK(r == OK); - - expected = buffer; - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - DramFixture, - "store line in DELAY cycles, read in DELAY cycles, no conflict", - "[dram]") -{ - Response r; - signed int w; - int i, addr; - CHECK(expected == actual); - - w = 0x11223311; - addr = 0x0; - expected = {w, w + 1, w + 2, w + 3}; - for (i = 0; i < this->delay; ++i) { - r = d->write_line(MEM, expected, addr); - CHECK(r == WAIT); - } - r = d->write_line(MEM, expected, addr); - CHECK(r == OK); - - for (i = 0; i < this->delay; ++i) { - r = d->read_line(MEM, addr, actual); - - CHECK(r == WAIT); - REQUIRE(expected != actual); - } - - r = d->read_line(MEM, addr, actual); - - CHECK(r == OK); - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - DramFixture, - "store line in DELAY cycles, read in DELAY cycles with conflict", - "[dram]") -{ - Response r; - signed int w; - int i, addr; - CHECK(expected == actual); - - w = 0x11223311; - addr = 0x0; - expected = {w, w + 1, w + 2, w + 3}; - for (i = 0; i < delay; ++i) { - r = d->write_line(MEM, expected, addr); - CHECK(r == WAIT); - - r = d->read_line(FETCH, addr, actual); - CHECK(r == WAIT); - } - r = d->write_line(MEM, expected, addr); - CHECK(r == OK); - - for (i = 0; i < this->delay; ++i) { - r = d->read_line(MEM, addr, actual); - - CHECK(r == WAIT); - REQUIRE(expected != actual); - } - - r = d->read_line(MEM, addr, actual); - - CHECK(r == OK); - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - DramFixture, - "store line in DELAY cycles, read one element at a time in DELAY cycles " - "with conflict", - "[dram]") -{ - Response r; - signed int w, a; - int i, j, addr; - CHECK(expected == actual); - - w = 0x11223311; - a = 0x0; - addr = 0x0; - expected = {w, w + 1, w + 2, w + 3}; - for (i = 0; i < this->delay; ++i) { - r = d->write_line(MEM, expected, addr); - CHECK(r == WAIT); - } - r = d->write_line(MEM, expected, addr); - CHECK(r == OK); - - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - - for (i = 0; i < LINE_SIZE; ++i) { - for (j = 0; j < this->delay; ++j) { - r = d->read_word(MEM, addr, a); - - CHECK(r == WAIT); - REQUIRE(0x0 == a); - } - r = d->read_word(MEM, addr++, a); - CHECK(r == OK); - REQUIRE(w++ == a); - - a = 0; - } -} - -TEST_CASE_METHOD(DramFixture, "Sidedoor bypasses delay", "[dram]") -{ - Response r; - signed int w; - CHECK(expected == actual); - - w = 0x11223344; - r = this->d->write_word(SIDE, w, 0x0); - CHECK(r == OK); - - expected.at(0) = w; - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); -} -- cgit v1.2.3 From 249e5bc94ef86307ecf68f8a07c65b2672ebb21c Mon Sep 17 00:00:00 2001 From: bd Date: Sat, 12 Apr 2025 00:10:52 -0400 Subject: Delete some more storage-only files --- CMakeLists.txt | 7 ++-- gui/CMakeLists.txt | 3 +- gui/main.cc | 2 +- inc/definitions.h | 102 ----------------------------------------------------- inc/stage.h | 2 +- inc/utils.h | 39 -------------------- src/sim/ex.cc | 2 +- src/utils/utils.cc | 42 ---------------------- tests/utils.cc | 65 ---------------------------------- 9 files changed, 7 insertions(+), 257 deletions(-) delete mode 100644 inc/definitions.h delete mode 100644 inc/utils.h delete mode 100644 src/utils/utils.cc delete mode 100644 tests/utils.cc (limited to 'tests') diff --git a/CMakeLists.txt b/CMakeLists.txt index c7918b5..cb614b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,11 +26,6 @@ set(RAM ram) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -# header files -include_directories( - ${PROJECT_SOURCE_DIR}/inc -) - # don't build RAM's tests set(RAM_TESTS OF CACHE BOOL "" FORCE) @@ -47,6 +42,7 @@ qt_standard_project_setup() # binary executable add_library(${PROJECT_NAME}_lib ${SRCS}) +target_include_directories(${PROJECT_NAME}_lib PRIVATE ${PROJECT_SOURCE_DIR}/inc) target_link_libraries(${PROJECT_NAME}_lib ${RAM}_lib) find_package(Catch2 REQUIRED) @@ -56,6 +52,7 @@ file(GLOB_RECURSE TESTS "tests/*.cc") # test executable add_executable(test_rv ${SRCS} ${TESTS}) +target_include_directories(test_rv PRIVATE ${PROJECT_SOURCE_DIR}/inc) target_link_libraries(test_rv PRIVATE Catch2::Catch2WithMain PRIVATE ${RAM}_lib) # test discovery diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index 5b177d2..0d73527 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -21,7 +21,8 @@ file(GLOB SRCS qt_add_resources(GUI_RESOURCES "resources.qrc") add_executable(risc_vector ${SRCS} ${GUI_RESOURCES}) -target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_lib ram_lib Qt6::Widgets) +target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/inc) +target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_lib ram_lib Qt6::Widgets) set_target_properties(risc_vector PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" diff --git a/gui/main.cc b/gui/main.cc index e873d1c..5e45465 100644 --- a/gui/main.cc +++ b/gui/main.cc @@ -1,4 +1,4 @@ -#include "definitions.h" +#include "pipe_spec.h" #include "gui.h" #include "logger.h" #include diff --git a/inc/definitions.h b/inc/definitions.h deleted file mode 100644 index c81c4e3..0000000 --- a/inc/definitions.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef DEFINITIONS_H -#define DEFINITIONS_H -#include "logger.h" -#include - -/** - * The number of bits to specify a word in a line - */ -#define LINE_SPEC 2 -/** - * The total number of words in a line - */ -#define LINE_SIZE static_cast(pow(2, 2)) -/** - * Number of bits in a word - */ -#define WORD_SPEC 32 - -/** - * The number of bits to specify a memory word - * The number of bits to specify a memory line - * The total number of lines in memory - */ -#define MEM_WORD_SPEC 10 -#define MEM_LINE_SPEC static_cast(MEM_WORD_SPEC - LINE_SPEC) -#define MEM_WORDS static_cast(pow(2, MEM_WORD_SPEC)) -#define MEM_LINES static_cast(pow(2, MEM_LINE_SPEC)) - -/** - * The number of bits to specify a l1 cache word - * The number of bits to specify a l1 cache line - * The total number of lines in l1 cache - */ -#define L1_CACHE_WORD_SPEC 7 -#define L1_CACHE_LINE_SPEC \ - static_cast(L1_CACHE_WORD_SPEC - LINE_SPEC) -#define L1_CACHE_LINES static_cast(pow(2, L1_CACHE_LINE_SPEC)) - -/** - * The total number of cycles a memory access takes - */ -#define MEM_DELAY 3 - -/** - * The total number of cycles a level one cache access takes - */ -#define L1_CACHE_DELAY 0 - -/** - * The number of general purpose registers - */ -#define GPR_NUM 16 - -/** - * The number of vector registers - */ -#define V_NUM 8 - -/** - * The number of bits to specify an instruction type - */ -#define TYPE_SIZE 2 - -/** - * The number of bits to specify a register - */ -#define REG_SIZE 5 - -/** - * The number of bits to specify an R-Type opcode. - */ -#define R_OPCODE_SIZE 5 - -/** - * The number of bits to specify an opcode. - */ -#define OPCODE_SIZE 4 - -/** - * The maximum value an integer can hold. - * The minimum is always this number plus one negated. - */ -#define MAX_INT 2147483647 - -/** - * Return the N least-significant bits from integer K using a bit mask - * @param the integer to be parsed - * @param the number of bits to be parsed - * @return the N least-significant bits from K - */ -#define GET_LS_BITS(k, n) ((k) & ((1 << (n)) - 1)) -/** - * Return the bits from integer K starting at N and ending at M using a bit - * mask - * @param the integer to be parsed - * @param the index of the starting bit to be parsed - * @param the index of the ending bit to be parsed - * @return a section of bits from K - */ -#define GET_MID_BITS(k, m, n) GET_LS_BITS((k) >> (m), ((n) - (m))) - -#endif /* DEFINITIONS_H_INCLUDED */ diff --git a/inc/stage.h b/inc/stage.h index 51ab667..da33075 100644 --- a/inc/stage.h +++ b/inc/stage.h @@ -1,8 +1,8 @@ #ifndef STAGE_H #define STAGE_H #include "accessor.h" -#include "definitions.h" #include "instrDTO.h" +#include "pipe_spec.h" #include "response.h" #include "storage.h" #include diff --git a/inc/utils.h b/inc/utils.h deleted file mode 100644 index a375b68..0000000 --- a/inc/utils.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef UTILS_H -#define UTILS_H -#include - -/** - * Parse an address into a tag, index into the cache table, and a line - * offset. - * @param the address to be parsed - * @param the resulting tag - * @param the resulting index - * @param the resulting offset - */ -void get_cache_fields(int address, int *tag, int *index, int *offset); - -/** - * Formats a string using snprintf. - * @param an object that represents the format string - * @param arguments to be formatted - * @return a string object holding the formatted result - */ -const std::string string_format(const char *const zcFormat, ...); - -/** - * Given `address`, returns an address that is within the current memory size - * using a clean wrap. - * @param an address - * @return an address guaranteed to be within range. - */ -int wrap_address(int address); - -/** - * Given `address`, returns the line and word it is in. - * @param an address - * @param the line (row) `address` is in - * @param the word (column) `address` corresponds to - */ -void get_memory_index(int address, int &line, int &word); - -#endif /* UTILS_H_INCLUDED */ diff --git a/src/sim/ex.cc b/src/sim/ex.cc index b6f8a1d..50f00a8 100644 --- a/src/sim/ex.cc +++ b/src/sim/ex.cc @@ -1,6 +1,6 @@ #include "ex.h" #include "accessor.h" -#include "definitions.h" +#include "pipe_spec.h" #include "instrDTO.h" #include "response.h" #include "stage.h" diff --git a/src/utils/utils.cc b/src/utils/utils.cc deleted file mode 100644 index e12a0e0..0000000 --- a/src/utils/utils.cc +++ /dev/null @@ -1,42 +0,0 @@ -#include "utils.h" -#include "definitions.h" -#include -#include -#include - -void get_cache_fields(int address, int *tag, int *index, int *offset) -{ - *tag = GET_MID_BITS(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); -} - -const std::string string_format(const char *const zcFormat, ...) -{ - va_list vaArgs; - va_start(vaArgs, zcFormat); - - va_list vaArgsCopy; - va_copy(vaArgsCopy, vaArgs); - const int iLen = std::vsnprintf(NULL, 0, zcFormat, vaArgsCopy); - va_end(vaArgsCopy); - - std::vector zc(iLen + 1); - std::vsnprintf(zc.data(), zc.size(), zcFormat, vaArgs); - va_end(vaArgs); - return std::string(zc.data(), iLen); -} - -int wrap_address(int address) -{ - if (address < 0) { - return ((address % MEM_WORDS) + MEM_WORDS) % MEM_WORDS; - } - return address % MEM_WORDS; -} - -void get_memory_index(int address, int &line, int &word) -{ - line = wrap_address(address) / LINE_SIZE; - word = address % LINE_SIZE; -} diff --git a/tests/utils.cc b/tests/utils.cc deleted file mode 100644 index 2e0e934..0000000 --- a/tests/utils.cc +++ /dev/null @@ -1,65 +0,0 @@ -#include "utils.h" -#include "definitions.h" -#include - -TEST_CASE("Parse arbitrary fields # one", "[utils]") -{ - int tag, index, offset; - int address = 0b0001010101; - get_cache_fields(address, &tag, &index, &offset); - CHECK(tag == 0b000); - CHECK(index == 0b10101); - CHECK(offset == 0b01); -} - -TEST_CASE("Parse arbitrary fields # two", "[utils]") -{ - int tag, index, offset; - int address = 0b0100111011; - get_cache_fields(address, &tag, &index, &offset); - CHECK(tag == 0b010); - CHECK(index == 0b01110); - CHECK(offset == 0b11); -} - -TEST_CASE("wrap address outside upper bound", "[utils]") -{ - int address = MEM_WORDS + 25; - int wrapped = wrap_address(address); - REQUIRE(wrapped == 25); -} - -TEST_CASE("wrap address inside upper bound", "[utils]") -{ - int address = MEM_WORDS - 25; - int wrapped = wrap_address(address); - REQUIRE(wrapped == MEM_WORDS - 25); -} - -TEST_CASE("wrap address at upper bound", "[utils]") -{ - int address = MEM_WORDS; - int wrapped = wrap_address(address); - REQUIRE(wrapped == 0); -} - -TEST_CASE("wrap address lower than 0 with magnitude lesser than mem size", "[utils]") -{ - int address = -10; - int wrapped = wrap_address(address); - REQUIRE(wrapped == MEM_WORDS - 10); -} - -TEST_CASE("wrap address lower than 0 but with magnitude greater than mem size", "[utils]") -{ - int address = -(MEM_WORDS + 10); - int wrapped = wrap_address(address); - REQUIRE(wrapped == MEM_WORDS - 10); -} - -TEST_CASE("wrap address at 0", "[utils]") -{ - int address = 0; - int wrapped = wrap_address(address); - REQUIRE(wrapped == 0); -} -- cgit v1.2.3