summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-04-16 11:23:46 -0400
committerbd <bdunahu@operationnull.com>2025-04-16 11:23:46 -0400
commit71f69927931e007d0bac13b9268b6a697b45c70a (patch)
tree41ab4e108784f6c180ad23fcc3bd3bf9440a9a2b
parenta7620015acc2401165b4587cbb6c9a118d944493 (diff)
Update GET_FIELDS to account for number of ways, constructors
-rw-r--r--inc/cache.h18
-rw-r--r--src/cache.cc29
-rw-r--r--src/dram.cc5
-rw-r--r--tests/c11.h2
-rw-r--r--tests/cache_2_1.cc4
5 files changed, 35 insertions, 23 deletions
diff --git a/inc/cache.h b/inc/cache.h
index 7409c02..6f06466 100644
--- a/inc/cache.h
+++ b/inc/cache.h
@@ -17,8 +17,8 @@
*/
// clang-format off
#define GET_FIELDS(a, t, i, o) \
- *(t) = GET_MID_BITS(a, this->size + LINE_SPEC, MEM_WORD_SPEC); \
- *(i) = GET_MID_BITS(a, LINE_SPEC, this->size + LINE_SPEC); \
+ *(t) = GET_MID_BITS(a, this->size + LINE_SPEC - this->ways, MEM_WORD_SPEC); \
+ *(i) = GET_MID_BITS(a, LINE_SPEC, this->size + LINE_SPEC - this->ways); \
*(o) = GET_LS_BITS(a, LINE_SPEC)
// clang-format on
@@ -32,10 +32,12 @@ nn * Constructor.
* @param The next lowest level in storage. Methods from this object are
* called in case of a cache miss.
* @param The number of bits required to specify a line in this level of cache.
+ * @param The number of ways this line of cache uses, or the number of data addresses stored for
+ * certain address index.
* @param The number of clock cycles each access takes.
* @return A new cache object.
*/
- Cache(Storage *lower, unsigned int size, int delay);
+ Cache(Storage *lower, unsigned int size, unsigned int ways, int delay);
~Cache();
int write_word(void *, signed int, int) override;
@@ -44,7 +46,8 @@ nn * Constructor.
int read_word(void *, int, signed int &) override;
private:
- int process(void *id, int address, std::function<void(int index, int offset)> request_handler) override;
+ int process(
+ void *id, int address, std::function<void(int index, int offset)> request_handler) override;
/**
* Helper for process.
* Fetches `address` from a lower level of storage if it is not already
@@ -58,12 +61,17 @@ nn * Constructor.
*/
unsigned int size;
/**
+ * The number of bits required to specify a way, or the number of data addresses stored for
+ * certain address index.
+ */
+ unsigned int ways;
+ /**
* An array of metadata about elements in `data`.
* If the first value of an element is negative, the corresponding
* element in `data` is invalid. If the most second value of an element
* is nonzero, the corresponding element in `data` is dirty.
*/
- std::vector<std::array<signed int, 2>> meta;
+ std::vector<std::array<signed int, 3>> meta;
};
#endif /* CACHE_H_INCLUDED */
diff --git a/src/cache.cc b/src/cache.cc
index 68047ed..08545fd 100644
--- a/src/cache.cc
+++ b/src/cache.cc
@@ -3,15 +3,18 @@
#include <iostream>
#include <iterator>
-Cache::Cache(Storage *lower, unsigned int size, int delay) : Storage(delay)
+Cache::Cache(Storage *lower, unsigned int size, unsigned int ways, int delay) : Storage(delay)
{
int true_size;
true_size = 1 << size;
this->data->resize(true_size);
- this->meta = std::vector<std::array<signed int, 2>>(true_size, {-1, -1});
- this->size = size;
+ this->meta = std::vector<std::array<signed int, 3>>(true_size, {-1, -1, -1});
this->lower = lower;
+
+ this->size = size;
+ // store the number of bits which are moved into the tag field
+ this->ways = ways;
}
Cache::~Cache()
@@ -58,13 +61,7 @@ Cache::read_word(void *id, int address, signed int &data)
int
Cache::process(void *id, int address, std::function<void(int index, int offset)> request_handler)
{
- if (!preprocess(id))
- return 0;
-
- if (is_address_missing(address))
- return 0;
-
- if (!this->is_data_ready())
+ if (!preprocess(id) || is_address_missing(address) || !this->is_data_ready())
return 0;
int tag, index, offset;
@@ -79,7 +76,7 @@ Cache::is_address_missing(int expected)
{
int r, q, tag, index, offset;
std::array<signed int, LINE_SIZE> *actual;
- std::array<int, 2> *meta;
+ std::array<int, 3> *meta;
GET_FIELDS(expected, &tag, &index, &offset);
r = 0;
@@ -104,3 +101,13 @@ Cache::is_address_missing(int expected)
return r;
}
+
+// unsigned int
+// Cache::get_true_index(unsigned int index)
+// {
+// }
+
+// unsigned int
+// Cache::get_replacement_index(unsigned int index)
+// {
+// }
diff --git a/src/dram.cc b/src/dram.cc
index bbd18b7..53db16b 100644
--- a/src/dram.cc
+++ b/src/dram.cc
@@ -54,10 +54,7 @@ Dram::load(std::vector<signed int> program)
int
Dram::process(void *id, int address, std::function<void(int line, int word)> request_handler)
{
- if (!preprocess(id))
- return 0;
-
- if (!this->is_data_ready())
+ if (!preprocess(id) || !this->is_data_ready())
return 0;
int line, word;
diff --git a/tests/c11.h b/tests/c11.h
index 6d63c77..e5599db 100644
--- a/tests/c11.h
+++ b/tests/c11.h
@@ -18,7 +18,7 @@ class C11
this->c_delay = 2;
this->mem = new int();
this->fetch = new int();
- this->c = new Cache(new Dram(this->m_delay), 5, this->c_delay);
+ this->c = new Cache(new Dram(this->m_delay), 5, 0, this->c_delay);
this->expected = {0, 0, 0, 0};
this->actual = this->c->view(0, 1)[0];
}
diff --git a/tests/cache_2_1.cc b/tests/cache_2_1.cc
index 5b5a072..cb48d2a 100644
--- a/tests/cache_2_1.cc
+++ b/tests/cache_2_1.cc
@@ -16,8 +16,8 @@ class C21 : public C11
public:
C21() : C11()
{
- this->c2 = new Cache(new Dram(this->m_delay), 7, this->c_delay);
- this->c = new Cache(this->c2, 5, this->c_delay);
+ this->c2 = new Cache(new Dram(this->m_delay), 7, 0, this->c_delay);
+ this->c = new Cache(this->c2, 5, 0, this->c_delay);
}
Cache *c2;