vyre 0.4.0

GPU compute intermediate representation with a standard operation library
Documentation
use crate::ir::{BufferDecl, DataType, Expr, Node, Program};

pub(crate) fn ternary_f32_program(compute: fn(Expr, Expr, Expr) -> Expr) -> Program {
    let idx = Expr::var("idx");
    Program::new(
        vec![
            BufferDecl::read("a", 0, DataType::F32),
            BufferDecl::read("b", 1, DataType::F32),
            BufferDecl::read("c", 2, DataType::F32),
            BufferDecl::output("out", 3, DataType::F32),
        ],
        crate::ops::primitive::WORKGROUP_SIZE,
        vec![
            Node::let_bind("idx", Expr::gid_x()),
            Node::if_then(
                Expr::lt(idx.clone(), Expr::buf_len("out")),
                vec![Node::store(
                    "out",
                    idx.clone(),
                    compute(
                        Expr::load("a", idx.clone()),
                        Expr::load("b", idx.clone()),
                        Expr::load("c", idx),
                    ),
                )],
            ),
        ],
    )
}