vyre 0.4.0

GPU compute intermediate representation with a standard operation library
Documentation
use crate::ir::{Expr, Program};
use crate::ops::primitive;
use crate::ops::{AlgebraicLaw, OpSpec, U32_INPUTS, U32_OUTPUTS};

// Logical NOT: returns 1 for zero input, 0 for non-zero.



// `Involution` on integer semantics fails for inputs other than 0 or
// 1: `logical_not(logical_not(5)) = logical_not(0) = 1`, not `5`.
// Involution only holds when the input is already a boolean, which is
// not guaranteed by the `u32` wire type. Per audit
// `primitive-laws-kimi-AUDIT`.
pub const LAWS: &[AlgebraicLaw] = &[AlgebraicLaw::Bounded { lo: 0, hi: 1 }];

/// Logical NOT operation.
#[derive(Debug, Clone, Copy, Default)]
pub struct LogicalNot;

impl LogicalNot {
    /// Declarative operation specification.
    ///
    /// Laws are declared as explicit `AlgebraicLaw` values on `SPEC`.
    pub const SPEC: OpSpec = OpSpec::composition_inlinable(
        "primitive.compare.logical_not",
        U32_INPUTS,
        U32_OUTPUTS,
        LAWS,
        Self::program,
    );

    /// Build the canonical IR program.
    ///
    /// # Examples
    ///
    /// ```
    /// use vyre::ir::Expr;
    /// use vyre::ops::primitive::compare::logical_not::LogicalNot;
    ///
    /// let _expr = Expr::not(Expr::u32(0));
    /// let program = LogicalNot::program();
    /// assert!(!program.entry().is_empty());
    /// ```
    #[must_use]
    pub fn program() -> Program {
        primitive::unary_u32_program(Expr::not)
    }
}

// Backend-specific lowering tripwires for logical_not.

// WGSL lowering marker for `primitive.compare.logical_not`.
//
// Not a stub: this is a zero-overhead Category A marker. `LogicalNot::program`
// builds concrete IR through `core/src/ops/primitive/mod.rs::unary_u32_program`; `core/src/lower/wgsl/expr.rs::emit_unop` emits WGSL.
// `core/tests/conformance.rs::conformance_all_primitives` verifies
// lowered GPU bytes are bit-exact against the conform CPU reference.
//
// ```wgsl
// _vyre_store_out(idx, select(0u, 1u, (_vyre_load_a(idx) == 0u)));
// ```