ptx_parser/parser/instruction/
barrier_cluster.rs

1//! Original PTX specification:
2//!
3//! barrier.cluster.arrive{.sem}{.aligned};
4//! barrier.cluster.wait{.acquire}{.aligned};
5//! .sem = {.release, .relaxed};
6
7#![allow(unused)]
8
9use crate::lexer::PtxToken;
10use crate::parser::{PtxParseError, PtxParser, PtxTokenStream, Span};
11use crate::r#type::common::*;
12
13pub mod section_0 {
14    use super::*;
15    use crate::r#type::instruction::barrier_cluster::section_0::*;
16
17    // ============================================================================
18    // Generated enum parsers
19    // ============================================================================
20
21    impl PtxParser for Sem {
22        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
23            // Try Release
24            {
25                let saved_pos = stream.position();
26                if stream.expect_string(".release").is_ok() {
27                    return Ok(Sem::Release);
28                }
29                stream.set_position(saved_pos);
30            }
31            let saved_pos = stream.position();
32            // Try Relaxed
33            {
34                let saved_pos = stream.position();
35                if stream.expect_string(".relaxed").is_ok() {
36                    return Ok(Sem::Relaxed);
37                }
38                stream.set_position(saved_pos);
39            }
40            stream.set_position(saved_pos);
41            let span = stream.peek().map(|(_, s)| s.clone()).unwrap_or(Span { start: 0, end: 0 });
42            let expected = &[".release", ".relaxed"];
43            let found = stream.peek().map(|(t, _)| format!("{:?}", t)).unwrap_or_else(|_| "<end of input>".to_string());
44            Err(crate::parser::unexpected_value(span, expected, found))
45        }
46    }
47
48    impl PtxParser for BarrierClusterArriveSemAligned {
49        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
50            stream.expect_string("barrier")?;
51            stream.expect_string(".cluster")?;
52            let cluster = ();
53            stream.expect_complete()?;
54            stream.expect_string(".arrive")?;
55            let arrive = ();
56            stream.expect_complete()?;
57            let saved_pos = stream.position();
58            let sem = match Sem::parse(stream) {
59                Ok(val) => Some(val),
60                Err(_) => {
61                    stream.set_position(saved_pos);
62                    None
63                }
64            };
65            stream.expect_complete()?;
66            let saved_pos = stream.position();
67            let aligned = stream.expect_string(".aligned").is_ok();
68            if !aligned {
69                stream.set_position(saved_pos);
70            }
71            stream.expect_complete()?;
72            stream.expect_complete()?;
73            stream.expect(&PtxToken::Semicolon)?;
74            Ok(BarrierClusterArriveSemAligned {
75                cluster,
76                arrive,
77                sem,
78                aligned,
79            })
80        }
81    }
82
83
84    impl PtxParser for BarrierClusterWaitAcquireAligned {
85        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
86            stream.expect_string("barrier")?;
87            stream.expect_string(".cluster")?;
88            let cluster = ();
89            stream.expect_complete()?;
90            stream.expect_string(".wait")?;
91            let wait = ();
92            stream.expect_complete()?;
93            let saved_pos = stream.position();
94            let acquire = stream.expect_string(".acquire").is_ok();
95            if !acquire {
96                stream.set_position(saved_pos);
97            }
98            stream.expect_complete()?;
99            let saved_pos = stream.position();
100            let aligned = stream.expect_string(".aligned").is_ok();
101            if !aligned {
102                stream.set_position(saved_pos);
103            }
104            stream.expect_complete()?;
105            stream.expect_complete()?;
106            stream.expect(&PtxToken::Semicolon)?;
107            Ok(BarrierClusterWaitAcquireAligned {
108                cluster,
109                wait,
110                acquire,
111                aligned,
112            })
113        }
114    }
115
116
117}
118