use super::{CubeContext, CubePrimitive, ExpandElement};
use crate::{ir::Operation, prelude::ExpandElementTyped};
use crate::{
ir::{Elem, Instruction, Item, Plane, UnaryOperator},
unexpanded,
};
pub fn plane_elect() -> bool {
unexpanded!()
}
pub mod plane_elect {
use super::*;
pub fn expand(context: &mut CubeContext) -> ExpandElementTyped<bool> {
let output = context.create_local(Item::new(Elem::Bool));
let out = *output;
context.register(Instruction::new(Plane::Elect, out));
output.into()
}
}
#[allow(unused_variables)]
pub fn plane_broadcast<E: CubePrimitive>(value: E, index: u32) -> E {
unexpanded!()
}
pub mod plane_broadcast {
use super::*;
pub fn expand<E: CubePrimitive>(
context: &mut CubeContext,
value: ExpandElementTyped<E>,
id: ExpandElementTyped<u32>,
) -> ExpandElementTyped<E> {
let output = context.create_local(value.expand.item);
let out = *output;
let lhs = *value.expand;
let rhs = *id.expand;
context.register(Instruction::new(
Plane::Broadcast(crate::ir::BinaryOperator { lhs, rhs }),
out,
));
output.into()
}
}
#[allow(unused_variables)]
pub fn plane_sum<E: CubePrimitive>(value: E) -> E {
unexpanded!()
}
pub mod plane_sum {
use super::*;
pub fn expand<E: CubePrimitive>(
context: &mut CubeContext,
elem: ExpandElementTyped<E>,
) -> ExpandElementTyped<E> {
let elem: ExpandElement = elem.into();
let output = context.create_local(elem.item);
let out = *output;
let input = *elem;
context.register(Instruction::new(Plane::Sum(UnaryOperator { input }), out));
output.into()
}
}
pub fn plane_prod<E: CubePrimitive>(_elem: E) -> E {
unexpanded!()
}
pub mod plane_prod {
use super::*;
pub fn expand<E: CubePrimitive>(
context: &mut CubeContext,
elem: ExpandElementTyped<E>,
) -> ExpandElementTyped<E> {
let elem: ExpandElement = elem.into();
let output = context.create_local(elem.item);
let out = *output;
let input = *elem;
context.register(Instruction::new(Plane::Prod(UnaryOperator { input }), out));
output.into()
}
}
pub fn plane_max<E: CubePrimitive>(_elem: E) -> E {
unexpanded!()
}
pub mod plane_max {
use super::*;
pub fn expand<E: CubePrimitive>(
context: &mut CubeContext,
elem: ExpandElementTyped<E>,
) -> ExpandElementTyped<E> {
let elem: ExpandElement = elem.into();
let output = context.create_local(elem.item);
let out = *output;
let input = *elem;
context.register(Instruction::new(Plane::Max(UnaryOperator { input }), out));
output.into()
}
}
pub fn plane_min<E: CubePrimitive>(_elem: E) -> E {
unexpanded!()
}
pub mod plane_min {
use super::*;
pub fn expand<E: CubePrimitive>(
context: &mut CubeContext,
elem: ExpandElementTyped<E>,
) -> ExpandElementTyped<E> {
let elem: ExpandElement = elem.into();
let output = context.create_local(elem.item);
let out = *output;
let input = *elem;
context.register(Instruction::new(Plane::Min(UnaryOperator { input }), out));
output.into()
}
}
pub fn plane_all(_elem: bool) -> bool {
unexpanded!()
}
pub mod plane_all {
use super::*;
pub fn expand(
context: &mut CubeContext,
elem: ExpandElementTyped<bool>,
) -> ExpandElementTyped<bool> {
let elem: ExpandElement = elem.into();
let output = context.create_local(elem.item);
let out = *output;
let input = *elem;
context.register(Instruction::new(Plane::All(UnaryOperator { input }), out));
output.into()
}
}
pub fn plane_any(_elem: bool) -> bool {
unexpanded!()
}
pub mod plane_any {
use super::*;
pub fn expand(
context: &mut CubeContext,
elem: ExpandElementTyped<bool>,
) -> ExpandElementTyped<bool> {
let elem: ExpandElement = elem.into();
let output = context.create_local(elem.item);
let out = *output;
let input = *elem;
context.register(Instruction::new(Plane::Any(UnaryOperator { input }), out));
output.into()
}
}
impl From<Plane> for Operation {
fn from(value: Plane) -> Self {
Operation::Plane(value)
}
}