vyre 0.4.0

GPU compute intermediate representation with a standard operation library
Documentation
use crate::ir::model::expr::Expr;
use crate::ir::model::node::Node;
use crate::ir::model::program::{BufferDecl, Program};
use crate::ir::model::types::DataType;
use crate::lower::wgsl::{lower, lower_anonymous};

#[test]
#[inline]
pub fn i32_div_and_negate_lower_correctly() -> crate::error::Result<()> {
    let program = Program::new(
        vec![BufferDecl::read_write("out", 0, DataType::I32)],
        [1, 1, 1],
        vec![
            Node::let_bind("x", Expr::i32(5)),
            Node::store(
                "out",
                Expr::u32(0),
                Expr::div(Expr::negate(Expr::var("x")), Expr::i32(0)),
            ),
        ],
    )
    .with_entry_op_id("primitive.math.div");
    let wgsl = lower(&program)?;
    assert!(
        wgsl.contains("_vyre_safe_div_i32"),
        "expected signed division helper for I32, got:\n{wgsl}"
    );
    assert!(
        wgsl.contains("-_v_x"),
        "expected unary minus for I32 negate, got:\n{wgsl}"
    );
    Ok(())
}

#[test]
#[inline]
pub fn no_atomic_program_emits_no_atomic_helpers() -> crate::error::Result<()> {
    let program = Program::new(
        vec![
            BufferDecl::read("input", 0, DataType::U32),
            BufferDecl::read_write("out", 1, DataType::U32),
        ],
        [1, 1, 1],
        vec![
            Node::let_bind("x", Expr::load("input", Expr::u32(0))),
            Node::store("out", Expr::u32(0), Expr::var("x")),
        ],
    );
    let wgsl = lower_anonymous(&program)?;
    assert!(
        !wgsl.contains("atomicLoad")
            && !wgsl.contains("atomicStore")
            && !wgsl.contains("_vyre_atomic_"),
        "non-atomic program emitted atomic helpers:\n{wgsl}"
    );
    Ok(())
}