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}