use ziskos::zisklib::keccakf_cache::KeccakfCache;
use crate::{
Mem, FCALL_PARAMS_MAX_SIZE, FCALL_RESULT_MAX_SIZE, REGS_IN_MAIN_TOTAL_NUMBER, ROM_ENTRY,
};
#[derive(Debug, Default, PartialEq, Eq)]
pub enum EmulationMode {
#[default]
Mem,
GenerateMemReads,
ConsumeMemReads,
}
#[derive(Debug, Default)]
pub struct PrecompiledInstContext {
pub step: u64,
pub input_data: Vec<u64>,
pub output_data: Vec<u64>,
}
#[derive(Debug)]
pub struct FcallInstContext {
pub parameters: [u64; FCALL_PARAMS_MAX_SIZE],
pub parameters_size: u64,
pub result: [u64; FCALL_RESULT_MAX_SIZE],
pub result_size: u64,
pub result_got: u64,
}
impl Default for FcallInstContext {
fn default() -> Self {
Self {
parameters: [0; FCALL_PARAMS_MAX_SIZE],
parameters_size: 0,
result: [0; FCALL_RESULT_MAX_SIZE],
result_size: 0,
result_got: 0,
}
}
}
#[derive(Debug)]
pub struct InstContext {
pub mem: Mem,
pub a: u64,
pub b: u64,
pub c: u64,
pub flag: bool,
pub sp: u64,
pub pc: u64,
pub step: u64,
pub end: bool,
pub error: bool,
pub regs: [u64; REGS_IN_MAIN_TOTAL_NUMBER],
pub emulation_mode: EmulationMode,
pub precompiled: PrecompiledInstContext,
pub fcall: FcallInstContext,
pub keccakf_cache: KeccakfCache,
pub data_ext_len: usize,
pub extended_arg: i64,
pub stats_hint: u64,
pub input_len: u64,
}
impl InstContext {
pub fn new() -> InstContext {
InstContext {
mem: Mem::default(),
a: 0,
b: 0,
c: 0,
flag: false,
sp: 0,
pc: ROM_ENTRY,
step: 0,
end: false,
error: false,
regs: [0; REGS_IN_MAIN_TOTAL_NUMBER],
emulation_mode: EmulationMode::default(),
precompiled: PrecompiledInstContext::default(),
fcall: FcallInstContext::default(),
keccakf_cache: KeccakfCache::default(),
data_ext_len: 0,
extended_arg: 0,
stats_hint: 0,
input_len: 0,
}
}
pub fn to_text(&self) -> String {
let s = format! {"a={:x} b={:x} c={:x} flag={} sp={} pc={} step={} end={}", self.a, self.b, self.c, self.flag, self.sp, self.pc, self.step, self.end};
s
}
}
impl Default for InstContext {
fn default() -> Self {
Self::new()
}
}