summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiddarth Suresh <155843085+SiddarthSuresh98@users.noreply.github.com>2025-03-09 13:19:06 -0400
committerGitHub <noreply@github.com>2025-03-09 13:19:06 -0400
commit57faaa064046824fec72e81a7e0973c495263395 (patch)
tree9469921e3a82ccfef3c8c9deb53ea4091b4c6040
parente4ad6c6694aa1fe9762714507c9ff3488ec21c90 (diff)
parent87bc2a9e172a0f693184c85f0d9661d47c99cd7e (diff)
Merge pull request #17 from bdunahu/bdunahu
Add get_bit_fields, which parses cache fields from a memory address
-rw-r--r--inc/definitions.h22
-rw-r--r--inc/utils.h14
-rw-r--r--src/utils/utils.cc11
-rw-r--r--tests/utils.cc23
4 files changed, 67 insertions, 3 deletions
diff --git a/inc/definitions.h b/inc/definitions.h
index 1593162..4b01be9 100644
--- a/inc/definitions.h
+++ b/inc/definitions.h
@@ -1,10 +1,26 @@
#ifndef DEFINITIONS_H
#define DEFINITIONS_H
+#include <cmath>
-/**
- * Defines common macros.
+/* The number of bits to specify a word in a line
*/
+#define LINE_SPEC 2
+#define LINE_SIZE (int)pow(2, 2)
-#define LINE_SIZE 4
+/* The number of bits to specify a memory line
+ * (/ (expt 2 15) 4)
+ */
+#define MEM_SPEC 13
+#define MEM_SIZE (int)pow(2, MEM_SPEC)
+
+/* The number of bits to specify a l1 cache line
+ */
+#define L1_CACHE_SPEC 5
+#define L1_CACHE_SIZE (int)pow(2, L1_CACHE_SPEC)
+
+/* Parses some bits.
+ */
+#define LAST(k, n) ((k) & ((1 << (n)) - 1))
+#define MID(k, m, n) LAST((k) >> (m), ((n) - (m)))
#endif /* DEFINITIONS_H_INCLUDED */
diff --git a/inc/utils.h b/inc/utils.h
new file mode 100644
index 0000000..e258ed8
--- /dev/null
+++ b/inc/utils.h
@@ -0,0 +1,14 @@
+#ifndef UTILS_H
+#define UTILS_H
+
+/**
+ * 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_bit_fields(int address, int *tag, int *index, int *offset);
+
+#endif /* UTILS_H_INCLUDED */
diff --git a/src/utils/utils.cc b/src/utils/utils.cc
new file mode 100644
index 0000000..b4bdb2f
--- /dev/null
+++ b/src/utils/utils.cc
@@ -0,0 +1,11 @@
+#include "definitions.h"
+#include "utils.h"
+
+void get_bit_fields(int address, int *tag, int *index, int *offset)
+{
+ *tag =
+ MID(address, LINE_SPEC + L1_CACHE_SPEC,
+ MEM_SPEC + LINE_SPEC + L1_CACHE_SPEC);
+ *index = MID(address, LINE_SPEC, L1_CACHE_SPEC + LINE_SPEC);
+ *offset = LAST(address, LINE_SPEC);
+}
diff --git a/tests/utils.cc b/tests/utils.cc
new file mode 100644
index 0000000..5368204
--- /dev/null
+++ b/tests/utils.cc
@@ -0,0 +1,23 @@
+#include "utils.h"
+#include "definitions.h"
+#include <catch2/catch_test_macros.hpp>
+
+TEST_CASE("Parse arbitrary fields # one", "[cache]")
+{
+ int tag, index, offset;
+ int address = 0b111110001010101;
+ get_bit_fields(address, &tag, &index, &offset);
+ CHECK(tag == 0b11111000);
+ CHECK(index == 0b10101);
+ CHECK(offset == 0b01);
+}
+
+TEST_CASE("Parse arbitrary fields # two", "[cache]")
+{
+ int tag, index, offset;
+ int address = 0b000110100111011;
+ get_bit_fields(address, &tag, &index, &offset);
+ CHECK(tag == 0b00011010);
+ CHECK(index == 0b01110);
+ CHECK(offset == 0b11);
+}