Skip to main content

vihaco_cpu/
lib.rs

1// SPDX-FileCopyrightText: 2026 The vihaco Authors
2// SPDX-License-Identifier: MIT
3
4mod 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}