use cubecl_macros_internal::cube_op;
use derive_more::From;
use derive_new::new;
use pliron::derive::{format, op_interface_impl, pliron_attr};
use crate::{CanMaterialize, HasSideEffects, interfaces::Synchronizes, prelude::*};
#[format]
#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub enum SyncScope {
Unit,
Plane,
Cube,
Device,
}
#[pliron_attr(name = "cube.sync_scope", format = "$0", verifier = "succ")]
#[derive(new, From, PartialEq, Eq, Clone, Debug, Hash, PartialOrd, Ord)]
pub struct SyncScopeAttr(pub SyncScope);
#[cube_op(name = "sync.sync")]
#[result_ty(none)]
#[op_traits(CanMaterialize, HasSideEffects)]
pub struct SyncOp {
pub scope: SyncScopeAttr,
}
#[op_interface_impl]
impl Synchronizes for SyncOp {
fn minimum_scope(&self, ctx: &Context) -> SyncScope {
self.scope(ctx).0
}
fn maximum_scope(&self, ctx: &Context) -> SyncScope {
self.scope(ctx).0
}
}
#[cube_op(name = "sync.sync_async_proxy")]
#[result_ty(none)]
#[op_traits(CanMaterialize, HasSideEffects)]
pub struct SyncAsyncProxyOp {}