use super::{CubeContext, CubePrimitive, ExpandElement};
use crate::prelude::ExpandElementTyped;
use crate::{
ir::{Elem, InitOperator, Item, Operation, Subcube, UnaryOperator},
unexpanded,
};
pub fn subcube_elect() -> bool {
unexpanded!()
}
pub fn subcube_elect_expand<E: CubePrimitive>(context: &mut CubeContext) -> ExpandElement {
let output = context.create_local(Item::new(Elem::Bool));
let out = *output;
context.register(Operation::Subcube(Subcube::Elect(InitOperator { out })));
output
}
#[allow(unused_variables)]
pub fn subcube_sum<E: CubePrimitive>(value: E) -> E {
unexpanded!()
}
pub mod subcube_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(Operation::Subcube(Subcube::Sum(UnaryOperator {
input,
out,
})));
output.into()
}
}
pub fn subcube_prod<E: CubePrimitive>(_elem: E) -> E {
unexpanded!()
}
pub mod subcube_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(Operation::Subcube(Subcube::Prod(UnaryOperator {
input,
out,
})));
output.into()
}
}
pub fn subcube_max<E: CubePrimitive>(_elem: E) -> E {
unexpanded!()
}
pub mod subcube_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(Operation::Subcube(Subcube::Max(UnaryOperator {
input,
out,
})));
output.into()
}
}
pub fn subcube_min<E: CubePrimitive>(_elem: E) -> E {
unexpanded!()
}
pub mod subcube_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(Operation::Subcube(Subcube::Min(UnaryOperator {
input,
out,
})));
output.into()
}
}
pub fn subcube_all<E: CubePrimitive>(_elem: E) -> E {
unexpanded!()
}
pub mod subcube_all {
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(Operation::Subcube(Subcube::All(UnaryOperator {
input,
out,
})));
output.into()
}
}