#![allow(non_snake_case)]
use std::marker::PhantomData;
use cubecl::prelude::*;
use crate::tile::{
BounceTile, CmmaTile, InterleavedTile, MmaTile, PartitionTile, PipelinedTile, PlaneVecTile,
RegisterTile, RowWise, ScopeMarker, SharedTile, StageTile, TileScope, UnitTile,
WhiteboxFragment, variants::stage::partition::partition_get_at_mut,
};
#[derive(CubeType)]
pub struct Tile<N: Numeric, Sc: TileScope> {
pub(crate) kind: TileKind<N, Sc>,
pub(crate) _scope: ScopeMarker<Sc>,
}
#[derive(CubeType)]
#[allow(dead_code)]
pub(crate) enum TileKind<N: Numeric, Sc: TileScope> {
Stage(StageTile<N>),
Partition(PartitionTile<N, Sc>),
SharedTile(SharedTile<N>),
Cmma(CmmaTile<N>),
Mma(MmaTile<N>),
Register(RegisterTile<N>),
PlaneVec(PlaneVecTile<N>),
Interleaved(InterleavedTile<N>),
Unit(UnitTile<N>),
WhiteboxFragment(WhiteboxFragment<N>),
RowWise(RowWise<N>),
Pipelined(PipelinedTile<N, Sc>),
Bounce(BounceTile<N>),
None,
}
#[cube]
impl<N: Numeric, Sc: TileScope> Tile<N, Sc> {
pub(crate) fn from_kind(kind: TileKind<N, Sc>) -> Tile<N, Sc> {
Tile::<N, Sc> {
kind,
_scope: ScopeMarker::<Sc> {
_phantom: PhantomData,
},
}
}
pub fn new_SharedTile(t: SharedTile<N>) -> Tile<N, Sc> {
Self::from_kind(TileKind::new_SharedTile(t))
}
pub fn new_Stage(t: StageTile<N>) -> Tile<N, Sc> {
Self::from_kind(TileKind::new_Stage(t))
}
pub fn new_Partition(t: PartitionTile<N, Sc>) -> Tile<N, Sc> {
Self::from_kind(TileKind::new_Partition(t))
}
pub fn new_Pipelined(t: PipelinedTile<N, Sc>) -> Tile<N, Sc> {
Self::from_kind(TileKind::new_Pipelined(t))
}
pub fn new_None() -> Tile<N, Sc> {
Self::from_kind(TileKind::new_None())
}
pub fn new_RowWise(t: RowWise<N>) -> Tile<N, Sc> {
Self::from_kind(TileKind::new_RowWise(t))
}
pub fn partition_tile_at_mut(
&mut self,
#[comptime] m: usize,
#[comptime] n: usize,
#[comptime] n_cols: usize,
) -> &mut Tile<N, Sc> {
match &mut self.kind {
TileKind::Partition(p) => partition_get_at_mut::<N, Sc>(p, m, n, n_cols),
TileKind::SharedTile(_)
| TileKind::Cmma(_)
| TileKind::Mma(_)
| TileKind::Register(_)
| TileKind::PlaneVec(_)
| TileKind::Interleaved(_)
| TileKind::Unit(_)
| TileKind::WhiteboxFragment(_)
| TileKind::RowWise(_)
| TileKind::Bounce(_)
| TileKind::Stage(_)
| TileKind::Pipelined(_)
| TileKind::None => {
panic!("Tile::partition_tile_at_mut: self.kind is not Partition")
}
}
}
}