1mod component;
5mod data;
6mod display;
7mod instruction;
8mod outcome;
9pub mod parse_helpers;
10
11pub use component::CPUMessage;
12pub use data::CPU;
13pub use instruction::Instruction;
14pub use outcome::StepOutcome;
15
16#[cfg(test)]
17mod tests {
18 use super::*;
19
20 #[test]
21 fn cpu_instruction_derive_exposes_explicit_canonical_syntax_entries() {
22 let variants = <Instruction as vihaco::CanonicalInstructionSyntax>::variants();
23
24 let expect = [
25 ("cpu::const_i64", &[vihaco::OperandKind::I64][..]),
26 ("cpu::const_f64", &[vihaco::OperandKind::F64][..]),
27 ("cpu::const_bool", &[vihaco::OperandKind::Bool][..]),
28 ("cpu::const_u64", &[vihaco::OperandKind::NonNegativeU64][..]),
29 ("cpu::fn_ref", &[vihaco::OperandKind::Symbol][..]),
30 ("cpu::call_direct", &[vihaco::OperandKind::Symbol][..]),
31 ];
32
33 for (mnemonic, operands) in expect {
34 let syntax = variants
35 .iter()
36 .find(|syntax| syntax.mnemonic == mnemonic)
37 .unwrap_or_else(|| panic!("missing canonical syntax entry for {mnemonic}"));
38
39 assert_eq!(
40 syntax.operands, operands,
41 "unexpected operands for canonical syntax entry {mnemonic}"
42 );
43 }
44 }
45}