use vyre_foundation::ir::Program;
use crate::graph::csr_backward_traverse::csr_backward_traverse;
use crate::graph::program_graph::ProgramGraphShape;
use crate::predicate::edge_kind;
pub const OP_ID: &str = "vyre-primitives::predicate::arg_of";
#[must_use]
pub fn arg_of_slot(
shape: ProgramGraphShape,
frontier_in: &str,
frontier_out: &str,
slot: u32,
) -> Program {
csr_backward_traverse(
shape,
frontier_in,
frontier_out,
edge_kind::call_arg_slot(slot),
)
}
#[must_use]
pub fn arg_of(shape: ProgramGraphShape, frontier_in: &str, frontier_out: &str) -> Program {
csr_backward_traverse(shape, frontier_in, frontier_out, edge_kind::CALL_ARG)
}
#[must_use]
pub fn cpu_ref(
node_count: u32,
edge_offsets: &[u32],
edge_targets: &[u32],
edge_kind_mask: &[u32],
frontier_in: &[u32],
) -> Vec<u32> {
crate::graph::csr_backward_traverse::cpu_ref(
node_count,
edge_offsets,
edge_targets,
edge_kind_mask,
frontier_in,
edge_kind::CALL_ARG,
)
}
#[must_use]
pub fn cpu_ref_slot(
node_count: u32,
edge_offsets: &[u32],
edge_targets: &[u32],
edge_kind_mask: &[u32],
frontier_in: &[u32],
slot: u32,
) -> Vec<u32> {
crate::graph::csr_backward_traverse::cpu_ref(
node_count,
edge_offsets,
edge_targets,
edge_kind_mask,
frontier_in,
edge_kind::call_arg_slot(slot),
)
}
#[cfg(feature = "inventory-registry")]
inventory::submit! {
crate::harness::OpEntry::new(
OP_ID,
|| arg_of(ProgramGraphShape::new(4, 2), "fin", "fout"),
Some(|| {
use super::inventory_u32_le_bytes as b;
vec![vec![
b(&[2, 1, 1, 1]), b(&[0, 1, 2, 2, 2]), b(&[1, 2]), b(&[2, 2]), b(&[0, 0, 0, 0]), b(&[0b0010]), b(&[0]), ]]
}),
Some(|| {
use super::inventory_u32_le_bytes as b;
vec![vec![b(&[0b0001])]] }),
)
}