diff options
Diffstat (limited to 'src/main/resources/sim_api.h')
| -rw-r--r-- | src/main/resources/sim_api.h | 156 |
1 files changed, 0 insertions, 156 deletions
diff --git a/src/main/resources/sim_api.h b/src/main/resources/sim_api.h deleted file mode 100644 index f7789141..00000000 --- a/src/main/resources/sim_api.h +++ /dev/null @@ -1,156 +0,0 @@ -#ifndef __SIM_API_H -#define __SIM_API_H - -#include <iostream> -#include <fstream> -#include <sstream> -#include <vector> -#include <map> - -enum SIM_CMD { RESET, STEP, UPDATE, POKE, PEEK, GETID, SETCLK, FIN }; - -template<class T> struct sim_data_t { - std::vector<T> resets; - std::vector<T> inputs; - std::vector<T> outputs; - std::vector<T> signals; - std::map<std::string, size_t> signal_map; - std::map<std::string, T> clk_map; -}; - -template <class T> class sim_api_t { -public: - void tick() { - static bool is_reset = false; - // First, Generates output tokens (in hex) - generate_tokens(); - if (is_reset) { - start(); - is_reset = false; - } - - // Next, handle commands from the testers - bool exit = false; - do { - size_t cmd; - std::cin >> std::dec >> cmd; - switch ((SIM_CMD) cmd) { - case RESET: - reset(); is_reset = true; exit = true; break; - case STEP: - consume_tokens(); - step(); exit = true; break; - case UPDATE: - consume_tokens(); - update(); exit = true; break; - case POKE: poke(); break; - case PEEK: peek(); break; - case GETID: getid(); break; - case SETCLK: setclk(); break; - case FIN: finish(); exit = true; break; - default: break; - } - } while (!exit); - } -private: - virtual void reset() = 0; - virtual void start() = 0; - virtual void finish() = 0; - virtual void update() = 0; - virtual void step() = 0; - // Consumes input tokens (in hex) - virtual void put_value(T& sig) = 0; - // Generate output tokens (in hex) - virtual void get_value(T& sig) = 0; - // Find a signal of path - virtual int search(std::string& path) { return -1; } - - void poke() { - size_t id; - std::cin >> std::dec >> id; - T obj = sim_data.signals[id]; - if (obj) { - put_value(obj); - } else { - std::cout << "Cannot find the object of id = " << id << std::endl; - finish(); - exit(0); - } - } - - void peek() { - size_t id; - std::cin >> std::dec >> id; - T obj = sim_data.signals[id]; - if (obj) { - get_value(obj); - } else { - std::cout << "Cannot find the object of id = " << id << std::endl; - finish(); - exit(0); - } - } - - void getid() { - std::string wire; - std::cin >> wire; - std::map<std::string, size_t>::iterator it = sim_data.signal_map.find(wire); - if (it != sim_data.signal_map.end()) { - std::cerr << it->second << std::endl; - } else { - int id = search(wire); - if (id < 0) { - std::cout << "Cannot find the object, " << wire<< std::endl; - finish(); - exit(0); - } - std::cerr << id << std::endl; - } - } - - void setclk() { - std::string clkname; - std::cin >> clkname; - typename std::map<std::string, T>::iterator it = sim_data.clk_map.find(clkname); - if (it != sim_data.clk_map.end()) { - put_value(it->second); - } else { - std::cout << "Cannot find " << clkname << std::endl; - } - } - - void consume_tokens() { - for (size_t i = 0 ; i < sim_data.inputs.size() ; i++) { - put_value(sim_data.inputs[i]); - } - } - - void generate_tokens() { - for (size_t i = 0 ; i < sim_data.outputs.size() ; i++) { - get_value(sim_data.outputs[i]); - } - } -protected: - sim_data_t<T> sim_data; - - void read_signal_map(std::string filename) { - std::ifstream file(filename.c_str()); - if (!file) { - std::cout << "Cannot open " << filename << std::endl; - finish(); - exit(0); - } - std::string line; - size_t id = 0; - while (std::getline(file, line)) { - std::istringstream iss(line); - std::string path; - size_t width, n; - iss >> path >> width >> n; - sim_data.signal_map[path] = id; - id += n; - } - } -}; - -#endif //__SIM_API_H |
