#[machine_check::machine_description]
mod machine_module {
use ::machine_check::{Bitvector, BitvectorArray};
use ::std::{
clone::Clone,
cmp::{Eq, PartialEq},
fmt::Debug,
hash::Hash,
};
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub struct Input {
gpio_read: BitvectorArray<4, 8>,
uninit_reg: BitvectorArray<2, 8>,
uninit_data: BitvectorArray<8, 8>,
}
impl ::machine_check::Input for Input {}
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub struct State {
pc: Bitvector<7>,
reg: BitvectorArray<2, 8>,
data: BitvectorArray<8, 8>,
}
impl ::machine_check::State for State {}
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub struct System {
pub progmem: BitvectorArray<7, 12>,
}
impl ::machine_check::Machine for System {
type Input = Input;
type State = State;
fn init(&self, input: &Input) -> State {
State {
pc: Bitvector::<7>::new(0),
reg: Clone::clone(&input.uninit_reg),
data: Clone::clone(&input.uninit_data),
}
}
fn next(&self, state: &State, input: &Input) -> State {
let instruction = self.progmem[state.pc];
let mut pc = state.pc + Bitvector::<7>::new(1);
let mut reg = Clone::clone(&state.reg);
let mut data = Clone::clone(&state.data);
::machine_check::bitmask_switch!(instruction {
"00dd_00--_aabb" => { reg[d] = reg[a] + reg[b];
}
"00dd_01--_gggg" => { reg[d] = input.gpio_read[g];
}
"00rr_1kkk_kkkk" => { if reg[r] & Bitvector::<8>::new(1)
== Bitvector::<8>::new(1) {
pc = k;
};
}
"01dd_kkkk_kkkk" => { reg[d] = k;
}
"10dd_nnnn_nnnn" => { reg[d] = data[n];
}
"11ss_nnnn_nnnn" => { data[n] = reg[s];
}
});
State { pc, reg, data }
}
}
}
use machine_check::{Bitvector, BitvectorArray};
fn main() {
let toy_program = [
Bitvector::new(0b0100_0000_0000),
Bitvector::new(0b0101_0000_0001),
Bitvector::new(0b0110_0000_0000),
Bitvector::new(0b1100_0000_0000),
Bitvector::new(0b1100_0000_0001),
Bitvector::new(0b0011_0100_0000),
Bitvector::new(0b0011_1000_0011),
Bitvector::new(0b0010_0000_1001),
Bitvector::new(0b1110_0000_0001),
Bitvector::new(0b0001_1000_0011),
];
let mut progmem = BitvectorArray::new_filled(Bitvector::new(0));
for (index, instruction) in toy_program.into_iter().enumerate() {
progmem[Bitvector::new(index as u64)] = instruction;
}
let system = machine_module::System { progmem };
machine_check::run(system);
}