summaryrefslogtreecommitdiff
path: root/src/cli/cli.cc
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-03-11 00:09:12 -0400
committerbd <bdunahu@operationnull.com>2025-03-11 00:09:12 -0400
commitf34156105801c81677c54d1713104ac3d7c1c112 (patch)
treea37a0e14ec5cef442d979852876dd307c6d4bf22 /src/cli/cli.cc
parent17dfdb2e00b609e3c7e975ce7a7c19da43318b79 (diff)
cli display clock cycle, parse ';' delimited commands
Diffstat (limited to 'src/cli/cli.cc')
-rw-r--r--src/cli/cli.cc139
1 files changed, 83 insertions, 56 deletions
diff --git a/src/cli/cli.cc b/src/cli/cli.cc
index 272c246..033849e 100644
--- a/src/cli/cli.cc
+++ b/src/cli/cli.cc
@@ -3,17 +3,21 @@
#include "definitions.h"
#include "dram.h"
#include "response.h"
-#include <stdio.h>
+#include "utils.h"
+#include <iostream>
Cli::Cli()
{
this->cache = nullptr;
+ this->cycle = 0;
this->initialize();
- commands["l"] = [this](std::vector<std::string> args) {
- if (args.size() >= 1) {
+ commands['l'] = [this](std::vector<std::string> args) {
+ Accessor a;
+ if (args.size() >= 2) {
try {
- load(std::stoi(args[0]));
+ a = match_accessor_or_die(args[0]);
+ load(a, std::stoi(args[1]));
} catch (const std::invalid_argument &e) {
std::cerr << "Invalid input: " << e.what() << std::endl;
}
@@ -23,16 +27,11 @@ Cli::Cli()
return;
};
- commands["s"] = [this](std::vector<std::string> args) {
+ commands['s'] = [this](std::vector<std::string> args) {
Accessor a;
if (args.size() >= 3) {
try {
- if (tolower(args[0][0]) == 'f')
- a = FETCH;
- else if (tolower(args[0][0]) == 'm')
- a = MEM;
- else
- throw std::invalid_argument(args[0]);
+ a = match_accessor_or_die(args[0]);
store(a, std::stoi(args[1]), std::stoi(args[2]));
} catch (const std::invalid_argument &e) {
std::cerr << "Invalid input: " << e.what() << std::endl;
@@ -43,12 +42,12 @@ Cli::Cli()
return;
};
- commands["r"] = [this](std::vector<std::string> args) {
+ commands['r'] = [this](std::vector<std::string> args) {
reset();
return;
};
- commands["p"] = [this](std::vector<std::string> args) {
+ commands['p'] = [this](std::vector<std::string> args) {
if (args.size() >= 1) {
try {
peek(std::stoi(args[0]));
@@ -61,12 +60,12 @@ Cli::Cli()
return;
};
- commands["c"] = [this](std::vector<std::string> args) {
+ commands['c'] = [this](std::vector<std::string> args) {
clock();
return;
};
- commands["h"] = [this](std::vector<std::string> args) {
+ commands['h'] = [this](std::vector<std::string> args) {
help();
return;
};
@@ -77,23 +76,29 @@ Cli::~Cli() { delete this->cache; }
void Cli::help()
{
std::cout
- << "Available commands:\n"
- << " l <address> - Load data from memory at the specified "
- "address\n"
- << " s <accessor> <data> <address> - Stores data into memory at "
- "specified address. Accessor must be one of: \"MEM\", \"FETCH\", "
- "\"L1CACHE\".\n"
- << " c - manually advances the clock\n"
- << " f - advances the clock until one operation reports completion\n"
- << " r - side door function that resets the memory configuration and "
- "cycles\n"
- << " p <storage-level> <base> <lines> - side door function that peeks "
- "the current status of the entire memory subsystem\n"
- << " h - Prints this help text\n"
- << " q - Quits the program\n";
+ << "Available commands:" << std::endl
+ << " [l]oad <address> - Load data from memory at the specified "
+ "address"
+ << std::endl
+ << " [s]tore <accessor> <data> <address> - Stores data into memory at "
+ "specified address. Acessor must be one of: [f]etch, [m]em"
+ << std::endl
+ << " [c]ycle - manually advances the clock" << std::endl
+ << " [f]orce - advances the clock until one operation reports "
+ "completion"
+ << std::endl
+ << " [r]eset - side door function that resets the memory "
+ "configuration and "
+ "cycles"
+ << std::endl
+ << " [p]eek <storage-level> <base> <lines> - side door function that "
+ "peeks the current status of the entire memory subsystem"
+ << std::endl
+ << " [h]elp - Prints this help text" << std::endl
+ << " [q]uit - Quits the program" << std::endl;
}
-void Cli::load(int memory_address) { ; }
+void Cli::load(Accessor accessor, int address) { ; }
void Cli::store(Accessor accessor, int data, int address)
{
@@ -101,12 +106,11 @@ void Cli::store(Accessor accessor, int data, int address)
std::cout << r << " to " << accessor << " storing " << data << '\n';
}
-void Cli::update(int memory_address, int data)
+void Cli::clock()
{
- std::cout << "Resetting memory configuration and cycles.\n";
-};
-
-void Cli::clock() { this->cache->resolve(); }
+ this->cache->resolve();
+ ++this->cycle;
+}
void Cli::reset()
{
@@ -140,33 +144,42 @@ void Cli::run()
"commands.\n";
std::string input;
- while (true) {
- std::cout << "> ";
+ bool run = true;
+ while (run) {
+ std::cout << this->cycle << "> ";
std::getline(std::cin, input);
- std::istringstream iss(input);
- std::vector<std::string> tokens;
+ std::istringstream iss1(input);
+ std::vector<std::string> words;
+ std::string sentence;
std::string word;
- while (iss >> word)
- tokens.push_back(word);
- if (tokens.empty())
- continue;
+ while (std::getline(iss1, sentence, ';')) {
+ words.clear();
+ std::istringstream iss2(sentence);
- std::string command = tokens[0];
- tokens.erase(tokens.begin());
+ while (iss2 >> word) {
+ words.push_back(word);
+ }
+ if (words.empty())
+ continue;
- if (command == "q") {
- std::cout << "Exiting...\n";
- break;
- }
+ std::string command = words[0];
+ words.erase(words.begin());
- auto it = commands.find(command);
- if (it != commands.end()) {
- it->second(tokens);
- } else {
- std::cout << "Unknown command: '" << command
- << "'. Type 'help' for available commands.\n";
+ if (command == "q") {
+ run = false;
+ break;
+ }
+
+ auto it = commands.find(tolower(command[0]));
+ if (it != commands.end()) {
+ it->second(words);
+ } else {
+ std::cout << "Unknown command: '" << command
+ << "'. Type 'help' for available commands."
+ << std::endl;
+ }
}
}
}
@@ -174,9 +187,23 @@ void Cli::run()
void Cli::initialize()
{
Logger *global_log = Logger::getInstance();
- global_log->log(INFO, "Resetting memory configuration.");
+
+ global_log->log(INFO, "Resetting memory configuration and cycle.");
+
if (this->cache != nullptr)
delete this->cache;
+
Dram *d = new Dram(MEM_SIZE, MEM_DELAY);
this->cache = new Cache(d, L1_CACHE_DELAY);
+ this->cycle = 1;
+}
+
+Accessor match_accessor_or_die(std::string s)
+{
+ if (tolower(s[0]) == 'f')
+ return FETCH;
+ else if (tolower(s[0]) == 'm')
+ return MEM;
+ else
+ throw std::invalid_argument(s);
}