Skip to main content

singe_ptx/ast/
common.rs

1#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
2pub struct Span {
3    pub start: usize,
4    pub end: usize,
5}
6
7impl Span {
8    pub fn new(start: usize, end: usize) -> Self {
9        Self { start, end }
10    }
11
12    pub fn start_position(self, source: &str) -> SourcePosition {
13        SourcePosition::from_offset(source, self.start)
14    }
15
16    pub fn end_position(self, source: &str) -> SourcePosition {
17        SourcePosition::from_offset(source, self.end)
18    }
19}
20
21#[derive(Debug, Clone, Copy, PartialEq, Eq)]
22pub struct SourcePosition {
23    pub line: usize,
24    pub column: usize,
25}
26
27impl SourcePosition {
28    pub fn from_offset(source: &str, offset: usize) -> Self {
29        let clamped = offset.min(source.len());
30        let prefix = &source[..clamped];
31        let line = prefix.bytes().filter(|b| *b == b'\n').count() + 1;
32        let column = match prefix.rfind('\n') {
33            Some(index) => prefix[index + 1..].chars().count() + 1,
34            None => prefix.chars().count() + 1,
35        };
36        Self { line, column }
37    }
38}
39
40#[derive(Debug, Clone, Copy, PartialEq, Eq)]
41pub enum StateSpace {
42    Reg,
43    SReg,
44    Const,
45    Global,
46    Local,
47    Param,
48    Shared,
49    Tex,
50}
51
52#[derive(Debug, Clone, Copy, PartialEq, Eq)]
53pub enum ScalarType {
54    B8,
55    B16,
56    B32,
57    B64,
58    B128,
59    S8,
60    S16,
61    S32,
62    S64,
63    U8,
64    U16,
65    U32,
66    U64,
67    F16,
68    F16x2,
69    F32,
70    F64,
71    Bf16,
72    Tf32,
73    Pred,
74    TexRef,
75    SamplerRef,
76    SurfRef,
77}
78
79#[derive(Debug, Clone, Copy, PartialEq, Eq)]
80pub enum FloatRoundingMode {
81    Rn,
82    Rna,
83    Rz,
84    Rm,
85    Rp,
86}
87
88#[derive(Debug, Clone, Copy, PartialEq, Eq)]
89pub enum IntRoundingMode {
90    Rni,
91    Rzi,
92    Rmi,
93    Rpi,
94}
95
96#[derive(Debug, Clone, Copy, PartialEq, Eq)]
97pub enum CompareOp {
98    Eq,
99    Ne,
100    Lt,
101    Le,
102    Gt,
103    Ge,
104    Lo,
105    Ls,
106    Hi,
107    Hs,
108    Equ,
109    Neu,
110    Ltu,
111    Leu,
112    Gtu,
113    Geu,
114    Num,
115    Nan,
116}
117
118#[derive(Debug, Clone, Copy, PartialEq, Eq)]
119pub enum MulMode {
120    Hi,
121    Lo,
122    Wide,
123}
124
125#[derive(Debug, Clone, Copy, PartialEq, Eq)]
126pub enum LinkingDirective {
127    Extern,
128    Visible,
129    Weak,
130    Common,
131}
132
133#[derive(Debug, Clone, Copy, PartialEq, Eq)]
134pub enum VectorSize {
135    V2,
136    V4,
137}