weirflow 0.1.0

GPU-first dataflow analysis primitives for Vyre and Santh compiler pipelines.
Documentation
#[must_use]
#[deprecated(
    note = "reference oracle only; production code must dispatch the Weir Program on a concrete GPU backend or use weir::oracle for parity evidence"
)]
pub(crate) fn loop_summarize_cpu(cfg_in: &[u32], ranges_in: &[u32], var_count: u32) -> Vec<u32> {
    let vars = loop_sum_u32_to_usize(var_count, "variable count");
    let slots = vars.checked_mul(2).unwrap_or_else(|| {
        panic!(
            "loop_summarize CPU oracle var_count={var_count} overflows host slot indexing. Fix: shard the oracle input."
        )
    });
    if cfg_in.len() != slots || ranges_in.len() != slots {
        panic!(
            "loop_summarize CPU oracle received malformed interval buffers: expected {slots} words, got cfg_in={} ranges_in={}",
            cfg_in.len(),
            ranges_in.len()
        );
    }
    let mut out = vec![0; slots];
    for var in 0..vars {
        let lo_idx = var * 2;
        let hi_idx = lo_idx + 1;
        let prev_lo = cfg_in[lo_idx];
        let prev_hi = cfg_in[hi_idx];
        let new_lo = ranges_in[lo_idx];
        let new_hi = ranges_in[hi_idx];
        out[lo_idx] = if new_lo < prev_lo { 0 } else { prev_lo };
        out[hi_idx] = if prev_hi < new_hi { u32::MAX } else { prev_hi };
    }
    out
}

fn loop_sum_u32_to_usize(value: u32, label: &'static str) -> usize {
    usize::try_from(value).unwrap_or_else(|source| {
        panic!(
            "loop_summarize CPU oracle {label} value {value} cannot fit usize: {source}. Fix: shard the oracle input."
        )
    })
}

#[cfg(test)]
#[allow(deprecated)]
mod tests {
    use super::loop_summarize_cpu;

    #[test]
    #[should_panic(expected = "loop_summarize CPU oracle received malformed interval buffers")]
    fn loop_summarize_rejects_mismatched_cfg_len() {
        let _ = loop_summarize_cpu(&[1, 2], &[1, 2, 3, 4], 2);
    }

    #[test]
    #[should_panic(expected = "loop_summarize CPU oracle received malformed interval buffers")]
    fn loop_summarize_rejects_mismatched_ranges_len() {
        let _ = loop_summarize_cpu(&[1, 2, 3, 4], &[1, 2], 2);
    }
}