vyre-conform 0.1.0

Conformance suite for vyre backends — proves byte-identical output to CPU reference
Documentation
pub use apply_binary::apply_binary;
pub use apply_unary::apply_unary;
pub use call_u32::call_u32;
pub use is_unary_spec::is_unary_spec;
pub use lookup_primitive_cpu::lookup_primitive_cpu;
pub use sample::SAMPLE;

use crate::properties::tests::{pair, primitive, result_u32, unary};
use crate::spec::law::AlgebraicLaw;

#[inline]
pub fn apply_binary(f: fn(&[u8]) -> Vec<u8>, a: u32, b: u32) -> u32 {
    result_u32(&f(&pair(a, b)))
}


#[inline]
pub fn apply_unary(f: fn(&[u8]) -> Vec<u8>, a: u32) -> u32 {
    result_u32(&f(&unary(a)))
}


#[inline]
pub fn call_u32(spec: &crate::spec::types::OpSpec, input: &[u8]) -> u32 {
    result_u32(&(spec.cpu_fn)(input))
}


#[inline]
pub fn is_unary_spec(spec: &crate::spec::types::OpSpec) -> bool {
    spec.signature.inputs.len() == 1
}


#[inline]
pub fn lookup_primitive_cpu(id: &str) -> fn(&[u8]) -> Vec<u8> {
    let specs = primitive::specs();
    let spec = specs.iter().find(|s| s.id == id).unwrap_or_else(|| {
        panic!(
            "primitive op '{id}' not in catalog; a declared law references an op that does not exist. \
             Fix: register the referenced op or correct the law declaration."
        )
    });
    spec.cpu_fn
}


pub const SAMPLE: [u32; 8] = [
    0,
    1,
    5,
    0x7FFF_FFFF,
    0x8000_0000,
    0xDEAD_BEEF,
    0xFFFF_FFFF - 1,
    u32::MAX,
];