summaryrefslogtreecommitdiff
path: root/inc
diff options
context:
space:
mode:
authorbd <bdunaisky@umass.edu>2025-03-06 21:28:20 +0000
committerGitHub <noreply@github.com>2025-03-06 21:28:20 +0000
commit0983f834b66f046c5468814fa86af3f4a3c215b6 (patch)
treeaf137790ab40290d1cc4e83f3261370c591512bc /inc
parente3369aad54bce775e2951e71618eb2cbb17972f9 (diff)
parente296a3a6ab782cb80b7091324b41bb78db6d3906 (diff)
Merge pull request #13 from bdunahu/bdunahu
constructors + method declarations for cache, dram, reponse, storage
Diffstat (limited to 'inc')
-rw-r--r--inc/cache.h25
-rw-r--r--inc/dram.h23
-rw-r--r--inc/logger.h15
-rw-r--r--inc/response.h16
-rw-r--r--inc/storage.h59
5 files changed, 138 insertions, 0 deletions
diff --git a/inc/cache.h b/inc/cache.h
new file mode 100644
index 0000000..101cd6e
--- /dev/null
+++ b/inc/cache.h
@@ -0,0 +1,25 @@
+#ifndef CACHE_H
+#define CACHE_H
+#include <storage.h>
+
+class Cache : public Storage
+{
+ public:
+ /**
+ * Constructor.
+ * @param The number of `lines` contained in memory. The total number of
+ * words is this number multiplied by 4.
+ * @param The next lowest level in storage. Methods from this object are
+ * called in case of a cache miss.
+ * @param The number of clock cycles each access takes.
+ * @return A new cache object.
+ */
+ Cache(int lines, Storage *lower, int delay);
+ ~Cache();
+
+ Response *write(Accessor accessor, signed int data, int address) override;
+ Response *read(Accessor accessor, int address) override;
+ int **view(int base, int lines) override;
+};
+
+#endif /* CACHE_H_INCLUDED */
diff --git a/inc/dram.h b/inc/dram.h
new file mode 100644
index 0000000..41dd7de
--- /dev/null
+++ b/inc/dram.h
@@ -0,0 +1,23 @@
+#ifndef DRAM_H
+#define DRAM_H
+#include <storage.h>
+
+class Dram : public Storage
+{
+ public:
+ /**
+ * Constructor.
+ * @param The number of `lines` contained in memory. The total number of
+ * words is this number multiplied by 4.
+ * @param The number of clock cycles each access takes.
+ * @return A new memory object.
+ */
+ Dram(int lines, int delay);
+ ~Dram();
+
+ Response *write(Accessor accessor, signed int data, int address) override;
+ Response *read(Accessor accessor, int address) override;
+ int **view(int base, int lines) override;
+};
+
+#endif /* DRAM_H_INCLUDED */
diff --git a/inc/logger.h b/inc/logger.h
index 5ecdc7e..7ab3051 100644
--- a/inc/logger.h
+++ b/inc/logger.h
@@ -9,10 +9,25 @@ enum LogLevel { DEBUG, INFO, WARNING, ERROR, CRITICAL };
class Logger
{
public:
+ /**
+ * Constructor.
+ * @param The file name to log to.
+ * @return A new logger object.
+ */
Logger(const string &);
~Logger();
+ /**
+ * Set the log level.
+ * @param the log level to set to.
+ */
void setLevel(LogLevel);
+ /**
+ * Log a message at a certain log level.
+ * @param The level to log this message. If the level is lower than the
+ * level set by `setLevel`, then the message is not logged.
+ * @param The message to log.
+ */
void log(LogLevel, const string &);
private:
diff --git a/inc/response.h b/inc/response.h
new file mode 100644
index 0000000..c8141fd
--- /dev/null
+++ b/inc/response.h
@@ -0,0 +1,16 @@
+#ifndef RESPONSE_H
+#define RESPONSE_H
+
+enum Status {
+ OK,
+ WAIT,
+ BLOCKED,
+};
+
+struct Response {
+ Status status;
+ int *line;
+ int val;
+};
+
+#endif /* RESPONSE_H_INCLUDED */
diff --git a/inc/storage.h b/inc/storage.h
new file mode 100644
index 0000000..1e512e2
--- /dev/null
+++ b/inc/storage.h
@@ -0,0 +1,59 @@
+#ifndef STORAGE_H
+#define STORAGE_H
+#include "response.h"
+#include <array>
+#include <vector>
+
+enum Accessor {
+ MEMORY,
+ FETCH,
+ L1CACHE,
+};
+
+class Storage
+{
+ public:
+ /**
+ * Write `data` into `address`.
+ * @param the source making the request.
+ * @param the data (hexadecimal) to write.
+ * @param the address to write to.
+ * @return a status code reflecting the state of the storage level.
+ */
+ virtual Response *
+ write(Accessor accessor, signed int data, int address) = 0;
+ /**
+ * Get the data at `address`.
+ * @param the source making the request.
+ * @param the address being accessed.
+ * @return a status code reflecting the state of the storage level, and the
+ * data being returned.
+ */
+ virtual Response *read(Accessor accessor, int address) = 0;
+ /**
+ * Sidedoor view of `lines` of memory starting at `base`.
+ * @param The base line to start getting memory from.
+ * @param The amount of lines to fetch.
+ * @return A matrix of data values, where each row is a line and each column
+ * is a word.
+ */
+ virtual int **view(int base, int lines) = 0;
+
+ protected:
+ /**
+ * The data currently stored in this level of storage.
+ */
+ std::vector<std::array<unsigned int, 4>> *data;
+ /**
+ * A pointer to the next lowest level of storage.
+ * Used in case of cache misses.
+ */
+ Storage *lower;
+ /**
+ * The number of clock cycles this level of storage takes to complete
+ * requests.
+ */
+ int delay;
+};
+
+#endif /* STORAGE_H_INCLUDED */