vyre-conform 0.1.0

Conformance suite for vyre backends — proves byte-identical output to CPU reference
Documentation
use crate::generate::generators;
use crate::OpSpec;
use serde::{Deserialize, Serialize};
use std::collections::HashSet;
use std::fs;
use std::io;
use std::path::Path;
use super::util::*;

fn random_input_for_signature(rng: &mut XorShift64, signature: &crate::spec::types::OpSignature) -> Vec<u8> {
    use crate::spec::types::DataType;
    let mut bytes = Vec::new();
    for ty in &signature.inputs {
        match ty {
            DataType::U32 => bytes.extend_from_slice(&rng.next_u32().to_le_bytes()),
            DataType::I32 => bytes.extend_from_slice(&(rng.next_u32() as i32).to_le_bytes()),
            DataType::U64 => bytes.extend_from_slice(&rng.next_u64().to_le_bytes()),
            DataType::Vec2U32 => {
                bytes.extend_from_slice(&rng.next_u32().to_le_bytes());
                bytes.extend_from_slice(&rng.next_u32().to_le_bytes());
            }
            DataType::Vec4U32 => {
                for _ in 0..4 {
                    bytes.extend_from_slice(&rng.next_u32().to_le_bytes());
                }
            }
            DataType::Bytes | DataType::Array { .. } => {
                let len = (rng.next_u32() as usize) % 4097;
                for _ in 0..len {
                    bytes.push((rng.next_u32() & 0xFF) as u8);
                }
            }
            _ => {
                // Fallback for future DataType variants: treat as random bytes.
                let len = (rng.next_u32() as usize) % 64;
                for _ in 0..len {
                    bytes.push((rng.next_u32() & 0xFF) as u8);
                }
            }
        }
    }
    bytes
}