use super::{
claimed_slot_body, execute_already_claimed_slot_body, persistent_lane_prologue,
process_io_requests, wrap_persistent_megakernel_program,
};
use super::{Expr, Node, OpcodeHandler, Program};
#[must_use]
pub fn build_program_priority(workgroup_size_x: u32, opcodes: &[OpcodeHandler]) -> Program {
build_program_priority_slots(workgroup_size_x, workgroup_size_x.max(1), opcodes)
}
#[must_use]
pub fn build_program_priority_slots(
workgroup_size_x: u32,
slot_count: u32,
opcodes: &[OpcodeHandler],
) -> Program {
wrap_persistent_megakernel_program(
workgroup_size_x,
slot_count.max(1),
persistent_body_priority_slots(workgroup_size_x, slot_count.max(1), opcodes),
)
}
#[must_use]
pub fn persistent_body_priority(workgroup_size_x: u32, opcodes: &[OpcodeHandler]) -> Vec<Node> {
persistent_body_priority_slots(workgroup_size_x, workgroup_size_x.max(1), opcodes)
}
#[must_use]
pub fn persistent_body_priority_slots(
workgroup_size_x: u32,
slot_count: u32,
opcodes: &[OpcodeHandler],
) -> Vec<Node> {
use crate::megakernel::scheduler;
let slot_count = slot_count.max(1);
let mut body = persistent_lane_prologue(workgroup_size_x);
body.extend(scheduler::priority_scan_body(slot_count));
body.push(Node::if_then(
Expr::ne(Expr::var("claimed_slot_base"), Expr::u32(u32::MAX)),
{
let mut exec = vec![Node::let_bind("slot_base", Expr::var("claimed_slot_base"))];
exec.extend(execute_already_claimed_slot_body(
Expr::var("claimed_tenant"),
claimed_slot_body(opcodes),
));
exec
},
));
body.push(Node::Block(process_io_requests()));
body
}