use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Ast {
pub items: Vec<Item>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Item {
Kernel(KernelDef),
DeviceFunction(FunctionDef),
HostFunction(FunctionDef),
GlobalVar(GlobalVar),
TypeDef(TypeDef),
Include(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KernelDef {
pub name: String,
pub params: Vec<Parameter>,
pub body: Block,
pub attributes: Vec<KernelAttribute>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum KernelAttribute {
LaunchBounds { max_threads: u32, min_blocks: Option<u32> },
MaxRegisters(u32),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FunctionDef {
pub name: String,
pub return_type: Type,
pub params: Vec<Parameter>,
pub body: Block,
pub qualifiers: Vec<FunctionQualifier>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum FunctionQualifier {
Device,
Host,
Global,
Inline,
NoInline,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Parameter {
pub name: String,
pub ty: Type,
pub qualifiers: Vec<ParamQualifier>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ParamQualifier {
Const,
Restrict,
Volatile,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Type {
Void,
Bool,
Int(IntType),
Float(FloatType),
Pointer(Box<Type>),
Array(Box<Type>, Option<usize>),
Vector(VectorType),
Named(String),
Texture(TextureType),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum IntType {
I8,
I16,
I32,
I64,
U8,
U16,
U32,
U64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum FloatType {
F16,
F32,
F64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VectorType {
pub element: Box<Type>,
pub size: u8, }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextureType {
pub dim: TextureDim,
pub element: Box<Type>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TextureDim {
Tex1D,
Tex2D,
Tex3D,
TexCube,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Statement {
VarDecl {
name: String,
ty: Type,
init: Option<Expression>,
storage: StorageClass,
},
Expr(Expression),
Block(Block),
If {
condition: Expression,
then_branch: Box<Statement>,
else_branch: Option<Box<Statement>>,
},
For {
init: Option<Box<Statement>>,
condition: Option<Expression>,
update: Option<Expression>,
body: Box<Statement>,
},
While {
condition: Expression,
body: Box<Statement>,
},
Return(Option<Expression>),
Break,
Continue,
SyncThreads,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum StorageClass {
Auto,
Register,
Shared,
Global,
Constant,
Local,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Block {
pub statements: Vec<Statement>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Expression {
Literal(Literal),
Var(String),
Binary {
op: BinaryOp,
left: Box<Expression>,
right: Box<Expression>,
},
Unary {
op: UnaryOp,
expr: Box<Expression>,
},
Call {
name: String,
args: Vec<Expression>,
},
Index {
array: Box<Expression>,
index: Box<Expression>,
},
Member {
object: Box<Expression>,
field: String,
},
Cast {
ty: Type,
expr: Box<Expression>,
},
ThreadIdx(Dimension),
BlockIdx(Dimension),
BlockDim(Dimension),
GridDim(Dimension),
WarpPrimitive {
op: WarpOp,
args: Vec<Expression>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum Dimension {
X,
Y,
Z,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Literal {
Bool(bool),
Int(i64),
UInt(u64),
Float(f64),
String(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum BinaryOp {
Add,
Sub,
Mul,
Div,
Mod,
And,
Or,
Xor,
Shl,
Shr,
Eq,
Ne,
Lt,
Le,
Gt,
Ge,
LogicalAnd,
LogicalOr,
Assign,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum UnaryOp {
Not,
Neg,
BitNot,
PreInc,
PreDec,
PostInc,
PostDec,
Deref,
AddrOf,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum WarpOp {
Shuffle,
ShuffleXor,
ShuffleUp,
ShuffleDown,
Vote,
Ballot,
ActiveMask,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GlobalVar {
pub name: String,
pub ty: Type,
pub storage: StorageClass,
pub init: Option<Expression>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TypeDef {
pub name: String,
pub ty: Type,
}