summaryrefslogtreecommitdiff
path: root/src/utils.cc
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-04-11 21:14:25 -0400
committerbd <bdunahu@operationnull.com>2025-04-11 21:14:25 -0400
commit101f0facf8002907ca6e19faabfdcf472c0c3152 (patch)
treef5cdc59276f18428a02db3898be6ccf23753c349 /src/utils.cc
parent1b5a73c67f9eaaf73e5046f52c48105579a7dae4 (diff)
Move source files to top-level src directory
Diffstat (limited to 'src/utils.cc')
-rw-r--r--src/utils.cc42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/utils.cc b/src/utils.cc
new file mode 100644
index 0000000..e12a0e0
--- /dev/null
+++ b/src/utils.cc
@@ -0,0 +1,42 @@
+#include "utils.h"
+#include "definitions.h"
+#include <cstdarg>
+#include <string>
+#include <vector>
+
+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<char> 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;
+}