use crate::ir::{Expr, Program};
use crate::ops::primitive;
use crate::ops::{AlgebraicLaw, OpSpec, U32_INPUTS, U32_OUTPUTS};
pub const LAWS: &[AlgebraicLaw] = &[
AlgebraicLaw::Involution,
AlgebraicLaw::DeMorgan {
inner_op: "primitive.bitwise.and",
dual_op: "primitive.bitwise.or",
},
AlgebraicLaw::DeMorgan {
inner_op: "primitive.bitwise.or",
dual_op: "primitive.bitwise.and",
},
];
#[derive(Debug, Clone, Copy, Default)]
pub struct Not;
impl Not {
pub const SPEC: OpSpec = OpSpec::composition_inlinable(
"primitive.bitwise.not",
U32_INPUTS,
U32_OUTPUTS,
LAWS,
Self::program,
);
#[must_use]
pub fn program() -> Program {
primitive::unary_u32_program(Expr::bitnot)
}
}