Skip to main content

singe_ptx/ast/
directive.rs

1use crate::ast::{LinkingDirective, ScalarType, Span, StateSpace, VectorSize};
2
3#[derive(Debug, Clone, PartialEq)]
4pub struct VariableDecl {
5    pub span: Span,
6    pub name: String,
7    pub ty: ScalarType,
8    pub state_space: Option<StateSpace>,
9    pub linkage: Option<LinkingDirective>,
10    pub attributes: Vec<Attribute>,
11    pub alignment: Option<u32>,
12    pub vector: Option<VectorSize>,
13    pub count: Option<u32>,
14    pub array_bounds: Vec<Option<u32>>,
15    pub initializer: Option<Initializer>,
16}
17
18#[derive(Debug, Clone, PartialEq)]
19pub enum Attribute {
20    Managed { span: Span },
21    Unified { span: Span, uuid1: u64, uuid2: u64 },
22}
23
24#[derive(Debug, Clone, PartialEq)]
25pub enum Initializer {
26    Integer {
27        span: Span,
28        value: i64,
29    },
30    UnsignedInteger {
31        span: Span,
32        value: u64,
33    },
34    Float {
35        span: Span,
36        value: f64,
37    },
38    Symbol {
39        span: Span,
40        name: String,
41    },
42    Cast {
43        span: Span,
44        ty: InitializerCastType,
45        expr: Box<Initializer>,
46    },
47    Generic {
48        span: Span,
49        expr: Box<Initializer>,
50    },
51    Masked {
52        span: Span,
53        mask: u64,
54        value: Box<Initializer>,
55    },
56    List {
57        span: Span,
58        values: Vec<Initializer>,
59    },
60    Unary {
61        span: Span,
62        op: InitializerUnaryOp,
63        expr: Box<Initializer>,
64    },
65    Binary {
66        span: Span,
67        op: InitializerBinaryOp,
68        left: Box<Initializer>,
69        right: Box<Initializer>,
70    },
71    Conditional {
72        span: Span,
73        condition: Box<Initializer>,
74        then_expr: Box<Initializer>,
75        else_expr: Box<Initializer>,
76    },
77}
78
79#[derive(Debug, Clone, Copy, PartialEq, Eq)]
80pub enum InitializerUnaryOp {
81    Plus,
82    Minus,
83    LogicalNot,
84    BitwiseNot,
85}
86
87#[derive(Debug, Clone, Copy, PartialEq, Eq)]
88pub enum InitializerBinaryOp {
89    Add,
90    Sub,
91    Mul,
92    Div,
93    Rem,
94    Shl,
95    Shr,
96    Lt,
97    Le,
98    Gt,
99    Ge,
100    Eq,
101    Ne,
102    BitAnd,
103    BitXor,
104    BitOr,
105    LogicalAnd,
106    LogicalOr,
107}
108
109#[derive(Debug, Clone, Copy, PartialEq, Eq)]
110pub enum InitializerCastType {
111    S64,
112    U64,
113}