weirflow 0.1.0

GPU-first dataflow analysis primitives for Vyre and Santh compiler pipelines.
Documentation
//! `weir::must_init` + `weir::scc_query`  -  both are bitset_and
//! wrappers; gate their reference oracles + Program construction.
//!
//! Op id: `weir::tests::df::must_init_scc_query`. Soundness:
//! `Exact` for both  -  they are pure word-wise AND of two host-
//! supplied bitsets.

use weir::must_init;
use weir::scc_query;

#[test]
fn must_init_cpu_ref_is_word_wise_and() {
    // bit n is set iff (def_dominates[n] AND use_set[n]).
    let def = vec![0b1111_0000u32, 0xFFFF_FFFFu32];
    let uses = vec![0b1010_1010u32, 0x0000_FFFFu32];
    let out = weir::oracle::bitset::must_init(&def, &uses);
    assert_eq!(out, vec![0b1010_0000u32, 0x0000_FFFFu32]);
}

#[test]
fn must_init_program_three_buffers() {
    let prog = must_init::must_init(64, "def", "uses", "out");
    let mut names: Vec<&str> = prog.buffers().iter().map(|b| b.name()).collect();
    names.sort();
    assert!(names.contains(&"def"));
    assert!(names.contains(&"uses"));
    assert!(names.contains(&"out"));
    assert_eq!(prog.buffers().len(), 3);
    assert!(!prog.entry().is_empty());
}

#[test]
fn scc_query_cpu_ref_intersects_query_with_same_scc_set() {
    // bit n set iff n ∈ same_scc AND n ∈ query_set.
    let same_scc = vec![0b1100u32];
    let query = vec![0b1010u32];
    assert_eq!(
        weir::oracle::bitset::scc_query(&same_scc, &query),
        vec![0b1000u32]
    );
}

#[test]
fn scc_query_cpu_ref_returns_empty_for_disjoint_inputs() {
    let same_scc = vec![0b1010u32, 0u32];
    let query = vec![0b0101u32, 0xFFFF_FFFFu32];
    assert_eq!(
        weir::oracle::bitset::scc_query(&same_scc, &query),
        vec![0u32, 0u32]
    );
}

#[test]
fn scc_query_program_three_buffers() {
    let prog = scc_query::scc_query(64, "same_scc", "query", "out");
    let mut names: Vec<&str> = prog.buffers().iter().map(|b| b.name()).collect();
    names.sort();
    assert!(names.contains(&"same_scc"));
    assert!(names.contains(&"query"));
    assert!(names.contains(&"out"));
    assert_eq!(prog.buffers().len(), 3);
    assert!(!prog.entry().is_empty());
}