summaryrefslogtreecommitdiff
path: root/inc/cache.h
diff options
context:
space:
mode:
authorbd <bdunaisky@umass.edu>2025-04-12 01:38:39 +0000
committerGitHub <noreply@github.com>2025-04-12 01:38:39 +0000
commitbe2bc108dc112ae7e21d4a77f7bcbfac88d6fcd4 (patch)
tree08549aa6c7cbae114958df62f92c9e60eb5f114c /inc/cache.h
parent101f0facf8002907ca6e19faabfdcf472c0c3152 (diff)
parent1fb7a9bd5eb41e87871bcbb3423caaabdd8ce1d9 (diff)
Merge pull request #1 from bdunahu/bdunahu
First part of storage rework (see description)
Diffstat (limited to 'inc/cache.h')
-rw-r--r--inc/cache.h55
1 files changed, 25 insertions, 30 deletions
diff --git a/inc/cache.h b/inc/cache.h
index 88fd352..0f15536 100644
--- a/inc/cache.h
+++ b/inc/cache.h
@@ -3,8 +3,8 @@
#include "definitions.h"
#include "storage.h"
#include <array>
-#include <ostream>
#include <functional>
+#include <ostream>
class Cache : public Storage
{
@@ -21,55 +21,52 @@ class Cache : public Storage
Cache(Storage *lower, int delay);
~Cache();
- Response
- write_word(Accessor accessor, signed int data, int address) override;
- Response write_line(
- Accessor accessor,
- std::array<signed int, LINE_SIZE> data_line,
- int address) override;
- Response read_line(
- Accessor accessor,
- int address,
- std::array<signed int, LINE_SIZE> &data_line) override;
- Response
- read_word(Accessor accessor, int address, signed int &data) override;
+ int
+ write_word(void *, signed int, int) override;
+ int
+ write_line(void *, std::array<signed int, LINE_SIZE>, int) override;
+ int
+ read_line(void *, int, std::array<signed int, LINE_SIZE> &) override;
+ int
+ read_word(void *, int, signed int &) override;
/**
* Getter for the meta attribute.
* TODO this doesn't seem like good object-oriented practice.
* @return this->meta
*/
- std::array<std::array<int, 2>, L1_CACHE_LINES> get_meta() const;
+ std::array<std::array<int, 2>, L1_CACHE_LINES>
+ get_meta() const;
private:
/**
* Helper for all access methods.
- * Calls `request_handler` when `accessor` is allowed to complete its
+ * Calls `request_handler` when `id` is allowed to complete its
* request cycle.
* @param the source making the request
* @param the address to write to
* @param the function to call when an access should be completed
*/
- Response process(
- Accessor accessor,
- int address,
- std::function<void(int index, int offset)> request_handler);
+ int
+ process(void *id, int address, std::function<void(int index, int offset)> request_handler);
/**
- * Returns OK if `accessor` is allowed to complete its request this cycle.
- * Handles cache misses, wait times, and setting the current accessor this
+ * Returns OK if `id` is allowed to complete its request this cycle.
+ * Handles cache misses, wait times, and setting the current id this
* storage is serving.
- * @param the accessor asking for a resource
- * @return whether or not the access can be carried out this function call.
+ * @param the id asking for a resource
+ * @return 1 if the access can be carried out this function call, 0 otherwise.
*/
- Response is_access_cleared(Accessor accessor, int address);
+ int
+ is_access_cleared(void *id, int address);
/**
- * Helper for access_cleared.
+ * Helper for is_access_cleared.
* Fetches `address` from a lower level of storage if it is not already
- * present. If it is not, temporarily sets the is_blocked attribute of this
- * cache level to true, and the victim line is chosen/written back.
+ * present. The victim line is chosen/written back.
* @param the address that must be present in cache.
+ * @param 0 if the address is currently in cache, 1 if it is being fetched.
*/
- void handle_miss(int address);
+ int
+ is_address_missing(int address);
/**
* An array of metadata about elements in `data`.
* If the first value of an element is negative, the corresponding
@@ -79,6 +76,4 @@ class Cache : public Storage
std::array<std::array<int, 2>, L1_CACHE_LINES> meta;
};
-std::ostream &operator<<(std::ostream &os, const Cache &c);
-
#endif /* CACHE_H_INCLUDED */