use vyre_foundation::ir::Program;
use crate::graph::program_graph::ProgramGraphShape;
use crate::predicate::edge_kind;
use crate::predicate::traversal::backward_edge_program;
#[cfg(any(test, feature = "cpu-parity"))]
use crate::predicate::traversal::{cpu_ref_backward, cpu_ref_backward_into};
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 {
backward_edge_program(
OP_ID,
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 {
backward_edge_program(OP_ID, shape, frontier_in, frontier_out, edge_kind::CALL_ARG)
}
#[must_use]
#[cfg(any(test, feature = "cpu-parity"))]
pub fn cpu_ref(
node_count: u32,
edge_offsets: &[u32],
edge_targets: &[u32],
edge_kind_mask: &[u32],
frontier_in: &[u32],
) -> Vec<u32> {
cpu_ref_backward(
node_count,
edge_offsets,
edge_targets,
edge_kind_mask,
frontier_in,
edge_kind::CALL_ARG,
)
}
#[cfg(any(test, feature = "cpu-parity"))]
pub fn cpu_ref_into(
node_count: u32,
edge_offsets: &[u32],
edge_targets: &[u32],
edge_kind_mask: &[u32],
frontier_in: &[u32],
out: &mut Vec<u32>,
) {
cpu_ref_backward_into(
node_count,
edge_offsets,
edge_targets,
edge_kind_mask,
frontier_in,
edge_kind::CALL_ARG,
out,
);
}
#[cfg(test)]
mod tests {
use super::*;
use crate::predicate::traversal::assert_region_op_id;
#[test]
fn preserves_wrapper_op_id() {
let program = arg_of(ProgramGraphShape::new(4, 2), "fin", "fout");
assert_region_op_id(&program, OP_ID, "arg_of");
}
}
#[must_use]
#[cfg(any(test, feature = "cpu-parity"))]
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> {
cpu_ref_backward(
node_count,
edge_offsets,
edge_targets,
edge_kind_mask,
frontier_in,
edge_kind::call_arg_slot(slot),
)
}
#[cfg(any(test, feature = "cpu-parity"))]
pub fn cpu_ref_slot_into(
node_count: u32,
edge_offsets: &[u32],
edge_targets: &[u32],
edge_kind_mask: &[u32],
frontier_in: &[u32],
slot: u32,
out: &mut Vec<u32>,
) {
cpu_ref_backward_into(
node_count,
edge_offsets,
edge_targets,
edge_kind_mask,
frontier_in,
edge_kind::call_arg_slot(slot),
out,
);
}
#[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])]] }),
)
}