diff options
author | bd <bdunahu@operationnull.com> | 2025-03-11 00:09:12 -0400 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2025-03-11 00:09:12 -0400 |
commit | 11182ea41cc5f453b06d769dea6e157aa9c3cf86 (patch) | |
tree | a37a0e14ec5cef442d979852876dd307c6d4bf22 /src/cli/cli.cc | |
parent | 183ddf3d0d4c9eb6fa6470f45dbb4041c48eebab (diff) |
cli display clock cycle, parse ';' delimited commands
Diffstat (limited to 'src/cli/cli.cc')
-rw-r--r-- | src/cli/cli.cc | 139 |
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); } |