summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-03-08 12:53:21 -0500
committerbd <bdunahu@operationnull.com>2025-03-08 12:53:21 -0500
commit46472983e5b570ab7c73c13b75010bddc90a6316 (patch)
tree20bb5766a0103acf2dff8e53b01ff709f9e518d3
parent2c424d29fd813b1fbef3b07595713611a1684903 (diff)
parentf8ed20ddbcb602ca0c5eea57fb78fb42d008f797 (diff)
Merge remote-tracking branch 'origin/master' into bdunahuer
-rw-r--r--inc/cli.h95
-rw-r--r--src/cli/cli.cc187
-rw-r--r--src/main.cc8
3 files changed, 288 insertions, 2 deletions
diff --git a/inc/cli.h b/inc/cli.h
new file mode 100644
index 0000000..69bd3a9
--- /dev/null
+++ b/inc/cli.h
@@ -0,0 +1,95 @@
+#ifndef CLI_H
+#define CLI_H
+#include <unordered_map>
+#include <functional>
+#include <string>
+
+class Cli {
+ public:
+
+ Cli();
+
+ ~Cli();
+
+ /**
+ * Prints all available commands to the console.
+ */
+ void help();
+
+ /**
+ * Loads data from memory from the specified memory address.
+ * @param memory_address address of the memory where data needs to be loaded from
+ * @param pipeline_stage pipeline stage to be served by memory subsystem
+ */
+ void load(int memory_address, int pipeline_stage);
+
+ /**
+ * Stores data into memory at the specified address.
+ * @param memory_address address of the memory where data needs to be stored
+ * @param pipeline_stage pipeline stage to be served by memory subsystem
+ * @param data data value to be written to the memory
+ */
+ void store(int memory_address, int pipeline_stage, int data);
+
+ /**
+ * Loads a memory image from a file and configures memory to the image.
+ * This function provides a side door memory image loading interface to the memory system,
+ * allowing the user to load a memory image from a file and configure the memory subsystem to the image.
+ * @param filename name of file containing memory image
+ */
+ void load_memory_image(const std::string& filename);
+
+ /**
+ * Resets the memory configuration and cycles to their initial state.
+ * This function provides a side door reset interface to the memory system,
+ * allowing the user to reset the memory configuration directly.
+ */
+ void reset();
+
+ /**
+ * Updates the memory at the specified address with the given data.
+ * This function provides a side door modification interface to the memory system,
+ * allowing the user to modify the memory configuration directly.
+ * @param memory_address address of the memory to be updated
+ * @param data data value to be written to the memory
+ */
+ void update_memory(int memory_address, int data);
+
+ /**
+ * Displays the current status of the entire memory subsystem.
+ * This function provides a side door view into the memory system,
+ * showing its current state and configuration.
+ */
+ void view_memory();
+
+ /**
+ * Displays the data at the specified memory address.
+ * This function provides a side door view into the memory system,
+ * showing the data at the specified memory address.
+ * @param memory_address address of the memory to be viewed
+ */
+ void view_memory_address(int memory_address);
+
+ /**
+ * Updates the controls using a configuration file.
+ * This function provides a side door modification interface to the control system,
+ * allowing the user to update the controls directly.
+ * @param config_file name of file containing control configuration
+ */
+ void update_controls(const std::string& config_file);
+
+ /**
+ * Runs the command line interface
+ * This function is the main entry point for the command line interface.
+ */
+ void run();
+
+ private:
+
+ /** Map of commands and their corresponding functions.
+ * This map is used to store the commands and their corresponding functions.
+ */
+ std::unordered_map<std::string, std::function<void(std::vector<std::string>)>> commands;
+};
+
+#endif /* CLI_H_INCLUDED */ \ No newline at end of file
diff --git a/src/cli/cli.cc b/src/cli/cli.cc
new file mode 100644
index 0000000..5d78744
--- /dev/null
+++ b/src/cli/cli.cc
@@ -0,0 +1,187 @@
+#include "cli.h"
+#include <sstream>
+#include <iostream>
+#include <vector>
+
+Cli::Cli() {
+ commands["load"] = [this](std::vector<std::string> args) {
+ if (args.size() >= 2){
+ try{
+ load(std::stoi(args[0]), std::stoi(args[1]));
+ } catch(const std::exception &e){
+ std::cerr << "Invalid input: " << e.what() << std::endl;
+ }
+ }
+ else {
+ std::cout << "Usage: load <memory-address> <pipeline-stage>\n";
+ }
+ return;
+ };
+
+ commands["store"] = [this](std::vector<std::string> args) {
+ if (args.size() >= 3) {
+ try{
+ store(std::stoi(args[0]), std::stoi(args[1]), std::stoi(args[2]));
+ }catch(const std::exception &e) {
+ std::cerr << "Invalid input: " << e.what() << std::endl;
+ }
+ }
+ else {
+ std::cout << "Usage: store <memory-address> <pipeline-stage> <data>\n";
+ }
+ return;
+ };
+
+ commands["load-memory-image"] = [this](std::vector<std::string> args) {
+ if (!args.empty()) {
+ load_memory_image(args[0]);
+ }
+ else {
+ std::cout << "Usage: load-memory-image <filename>\n";
+ }
+ return;
+ };
+
+ commands["reset"] = [this](std::vector<std::string> args) {
+ reset();
+ return;
+ };
+
+ commands["update-memory"] = [this](std::vector<std::string> args) {
+ if (args.size() >= 2) {
+ try {
+ update_memory(std::stoi(args[0]), std::stoi(args[1]));
+ } catch(const std::exception &e){
+ std::cerr << "Invalid input: all arguments are integers" << e.what() << std::endl;
+ }
+ }
+ else{
+ std::cout << "Usage: update-memory <memory-address> <data>\n";
+ }
+ return;
+ };
+
+ commands["view-memory"] = [this](std::vector<std::string> args) {
+ view_memory();
+ return;
+ };
+
+ commands["view-memory-address"] = [this](std::vector<std::string> args) {
+ if (!args.empty()) {
+ try{
+ view_memory_address(std::stoi(args[0]));
+ } catch(const std::exception &e){
+ std::cerr << "Invalid input: " << e.what() << std::endl;
+ }
+ }
+ else {
+ std::cout << "Usage: view-memory-address <memory-address>\n";
+ }
+ return;
+ };
+
+ commands["update-controls"] = [this](std::vector<std::string> args) {
+ if (!args.empty()) {
+ update_controls(args[0]);
+ }
+ else {
+ std::cout << "Usage: update-controls <configuration-file>\n";
+ }
+ return;
+ };
+
+ commands["help"] = [this](std::vector<std::string> args) {
+ help();
+ return;
+ };
+}
+
+Cli::~Cli() {}
+
+//TODO: These function stubs are to be improved after they have been implemented internally.
+void Cli::help() {
+ std::cout << "Available commands:\n"
+ << " load <memory-address> <pipeline-stage> - Load data from memory at specified address\n"
+ << " store <memory-address> <pipeline-stage> <data> - Stores data into memory at specified address\n"
+ << " load-memory-image <filename> - side door function that loads a memory image from a file and configures memory to the image\n"
+ << " reset - side door function that resets the memory configuration and cycles\n"
+ << " update-memory <memory-address> <data> - side door function that updates the memory at the specified address with data provided\n"
+ << " view-memory - side door function that views the current status of the entire memory subsystem\n"
+ << " view-memory-address <memory-address> - side door function that views data at specific memory address\n"
+ << " update-controls <configuration-file> - side door function that takes in a configuration file and updates the controls\n"
+ << " exit - Quits the program\n";
+}
+
+void Cli::load(int memory_address, int pipeline_stage) {
+ std::cout << "Loading data from memory address " << memory_address
+ << " at pipeline stage " << pipeline_stage << ".\n";
+}
+
+
+void Cli::store(int memory_address, int pipeline_stage, int data) {
+ std::cout << "Storing " << data << " into memory address " << memory_address
+ << " at pipeline stage " << pipeline_stage << ".\n";
+}
+
+
+void Cli::load_memory_image(const std::string& filename) {
+ std::cout << "Loading memory image from file: " << filename << ".\n";
+}
+
+
+void Cli::reset() {
+ std::cout << "Resetting memory configuration and cycles.\n";
+}
+
+
+void Cli::update_memory(int memory_address, int data) {
+ std::cout << "Updating memory at address " << memory_address
+ << " with data " << data << ".\n";
+}
+
+
+void Cli::view_memory() {
+ std::cout << "Viewing current status of memory subsystem.\n";
+}
+
+
+void Cli::view_memory_address(int memory_address) {
+ std::cout << "Viewing data at memory address " << memory_address << ".\n";
+}
+
+
+void Cli::update_controls(const std::string& config_file) {
+ std::cout << "Updating controls using configuration file: " << config_file << ".\n";
+}
+
+void Cli::run(){
+ std::cout << "Memory Command Processor Started. Type 'help' for a list of commands.\n";
+
+ std::string input;
+ while (true) {
+ std::cout << "> ";
+ std::getline(std::cin, input);
+ std::istringstream iss(input);
+ std::vector<std::string> tokens;
+ std::string word;
+
+ while (iss >> word) tokens.push_back(word);
+ if (tokens.empty()) continue;
+
+ std::string command = tokens[0];
+ tokens.erase(tokens.begin());
+
+ if (command == "exit") {
+ std::cout << "Exiting...\n";
+ break;
+ }
+
+ auto it = commands.find(command);
+ if (it != commands.end()) {
+ it->second(tokens);
+ } else {
+ std::cout << "Unknown command. Type 'help' for available commands.\n";
+ }
+ }
+}
+
diff --git a/src/main.cc b/src/main.cc
index 6871fb9..68b3cdf 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -1,7 +1,10 @@
#include "logger.h"
+#include "cli.h"
#include <getopt.h>
#include <iostream>
+
+
void err()
{
std::cerr << "Usage:\n\trisc_vector [OPTIONS]\nOptions:\n\t--debug,\t-d: "
@@ -39,8 +42,8 @@ void parseArguments(int argc, char **argv, Logger &logger, bool &python)
int main(int argc, char **argv)
{
-
Logger logger("vector.log");
+ Cli cli;
logger.log(INFO, "Initializing...");
bool python = true;
@@ -52,5 +55,6 @@ int main(int argc, char **argv)
logger.log(INFO, "Python started.");
}
+ cli.run();
return EXIT_SUCCESS;
-}
+} \ No newline at end of file