weirflow 0.1.0

GPU-first dataflow analysis primitives for Vyre and Santh compiler pipelines.
Documentation
//! `weir::cross_language::cross_language`  -  three-stage forward
//! reach gated on at least one FFI edge.
//!
//! Op id: `weir::tests::df::cross_language`. Soundness: `MayOver`
//!  -  the GPU pipeline composes `csr_forward_traverse` (FFI-only) +
//! `bitset_fixpoint_warm_start` + `bitset_and`. Tests pin the
//! buffer set + entry-vector non-emptiness; the reference oracle's
//! correctness over hand-shaped graphs is exercised by the
//! upstream module's own unit tests.

use weir::cross_language::cross_language;
use weir::oracle::graph::cross_language as cpu_ref;

#[test]
fn cross_language_program_includes_all_named_buffers() {
    let prog = cross_language(
        64,
        "source",
        "sink",
        "post_cross",
        "current",
        "next",
        "changed",
        "seed",
        "out",
    )
    .expect("Fix: cross-language test program must fuse");
    let names: Vec<&str> = prog.buffers().iter().map(|b| b.name()).collect();
    for required in [
        "source",
        "sink",
        "post_cross",
        "current",
        "next",
        "changed",
        "out",
    ] {
        assert!(names.contains(&required), "missing {required} in {names:?}");
    }
    assert!(!prog.entry().is_empty());
}

#[test]
fn cross_language_program_scales_with_node_count() {
    for &n in &[1u32, 32, 64, 256] {
        let prog = cross_language(n, "s", "k", "p", "c", "x", "ch", "sd", "o")
            .expect("Fix: cross-language test program must fuse");
        assert!(prog.buffers().len() >= 7);
        assert!(!prog.entry().is_empty());
    }
}

#[test]
fn cpu_ref_returns_zero_when_no_path_crosses_an_ffi_edge() {
    // Single node, no edges, no FFI. cpu_ref should return all zeros
    // (no node reachable from source via FFI).
    let node_count = 1u32;
    let edge_offsets = vec![0u32, 0u32];
    let edge_targets: Vec<u32> = vec![];
    let edge_kind_mask: Vec<u32> = vec![];
    let edge_is_ffi: Vec<u32> = vec![];
    let source = vec![1u32]; // bit 0 set
    let sink = vec![1u32];
    let out = cpu_ref(
        node_count,
        &edge_offsets,
        &edge_targets,
        &edge_kind_mask,
        &edge_is_ffi,
        &source,
        &sink,
    );
    assert!(
        out.iter().all(|w| *w == 0),
        "no FFI edge → no reach; got {out:?}"
    );
}