vyre-conform 0.1.0

Conformance suite for vyre backends — proves byte-identical output to CPU reference
Documentation
use crate::spec::law::canonical_law_id;
use crate::spec::minimums::MIN_LAWS;
use crate::spec::Verification;
use crate::OpSpec;

use super::error::CoverageError;

pub(super) fn check_laws(spec: &OpSpec, errors: &mut Vec<CoverageError>) {
    if spec.laws.len() < MIN_LAWS {
        errors.push(CoverageError::EmptyLawSet {
            op_id: spec.id.to_string(),
        });
    }
}

pub(super) fn check_declared_laws(spec: &OpSpec, errors: &mut Vec<CoverageError>) {
    use std::collections::HashMap;
    let mut laws_ms: HashMap<String, usize> = HashMap::new();
    for l in &spec.laws {
        *laws_ms.entry(canonical_law_id(l)).or_insert(0) += 1;
    }
    let mut declared_ms: HashMap<String, usize> = HashMap::new();
    for d in &spec.declared_laws {
        *declared_ms.entry(canonical_law_id(&d.law)).or_insert(0) += 1;
    }
    if laws_ms != declared_ms {
        errors.push(CoverageError::LawListDrift {
            op_id: spec.id.to_string(),
        });
    }

    for declared in &spec.declared_laws {
        if let Verification::WitnessedU32 { count: 0, .. } = declared.verified_by {
            errors.push(CoverageError::ZeroWitnesses {
                op_id: spec.id.to_string(),
                law: declared.law.name().to_string(),
            });
        }
    }
}