1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use crate::{
    interface::assembler::AssembleResult,
    modules::riscv::basic::interface::parser::RISCV,
    types::middleware_types::{AssemblerConfig, MemoryReturnRange, Optional},
};

pub trait Simulator: Send + Sync {
    fn load_inst(&mut self, inst: AssembleResult<RISCV>) -> Result<(), String>;
    fn get_raw_inst(&self) -> &Option<AssembleResult<RISCV>>;
    fn update_config(&mut self, config: &AssemblerConfig) -> Result<(), String>;
    fn run(&mut self) -> Result<(), String>;
    fn debug(&mut self) -> Result<(), String>;
    fn stop(&mut self) -> Result<(), String>;
    fn resume(&mut self) -> Result<(), String>;
    fn step(&mut self) -> Result<(), String>;
    fn reset(&mut self) -> Result<(), String>;
    fn undo(&mut self) -> Result<(), String>;
    fn set_breakpoint(&mut self, idx: usize) -> Result<(), String>;
    fn remove_breakpoint(&mut self, idx: usize) -> Result<(), String>;
    fn syscall_input(&mut self, input: &str) -> Result<(), String>;
    fn get_register(&self) -> &[u32];
    fn get_memory(&self) -> Vec<u32>;
    fn get_pc_idx(&self) -> Option<usize>;
    fn get_filepath(&self) -> &str;
    fn get_memory_return_range(&self) -> MemoryReturnRange;
    fn set_memory_return_range(&mut self, range: MemoryReturnRange) -> Result<(), String>;
    fn set_fake_middleware(&mut self, middleware: Option<&'static mut dyn FakeMiddlewareTrait>);
}

pub trait FakeMiddlewareTrait: Send + Sync {
    fn request_input(&mut self);
    fn output(&mut self, output: &str);
    fn update(&mut self, res: Optional);
}