use crate::ir::{BufferDecl, DataType, Expr, Node, Program};
use crate::ops::{AlgebraicLaw, OpSpec};
pub const INPUTS: &[DataType] = &[
DataType::U32,
DataType::U32,
DataType::U32,
DataType::U32,
DataType::U32,
DataType::U32,
];
pub const OUTPUTS: &[DataType] = &[DataType::U32];
pub const LAWS: &[AlgebraicLaw] = &[AlgebraicLaw::Bounded { lo: 0, hi: 1 }];
pub const WORKGROUP_SIZE: [u32; 3] = [1, 1, 1];
#[must_use]
pub const fn spec(id: &'static str, build: fn() -> Program) -> OpSpec {
OpSpec::composition_inlinable(id, INPUTS, OUTPUTS, LAWS, build)
}
#[must_use]
pub fn condition_program(compute: fn() -> Expr) -> Program {
Program::new(
vec![
BufferDecl::read("rule_id", 0, DataType::U32),
BufferDecl::read("pattern_id", 1, DataType::U32),
BufferDecl::read("pattern_state", 2, DataType::U32),
BufferDecl::read("pattern_count", 3, DataType::U32),
BufferDecl::read("file_size", 4, DataType::U32),
BufferDecl::read("threshold", 5, DataType::U32),
BufferDecl::output("out", 6, DataType::U32),
],
WORKGROUP_SIZE,
vec![Node::store("out", Expr::u32(0), compute())],
)
}
#[must_use]
pub fn pattern_state() -> Expr {
Expr::load("pattern_state", Expr::u32(0))
}
#[must_use]
pub fn pattern_count() -> Expr {
Expr::load("pattern_count", Expr::u32(0))
}
#[must_use]
pub fn file_size() -> Expr {
Expr::load("file_size", Expr::u32(0))
}
#[must_use]
pub fn threshold() -> Expr {
Expr::load("threshold", Expr::u32(0))
}