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
42                .peek()
43                .map(|(_, s)| s.clone())
44                .unwrap_or(Span { start: 0, end: 0 });
45            let expected = &[".release", ".relaxed"];
46            let found = stream
47                .peek()
48                .map(|(t, _)| format!("{:?}", t))
49                .unwrap_or_else(|_| "<end of input>".to_string());
50            Err(crate::parser::unexpected_value(span, expected, found))
51        }
52    }
53
54    impl PtxParser for BarrierClusterArriveSemAligned {
55        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
56            stream.expect_string("barrier")?;
57            stream.expect_string(".cluster")?;
58            let cluster = ();
59            stream.expect_complete()?;
60            stream.expect_string(".arrive")?;
61            let arrive = ();
62            stream.expect_complete()?;
63            let saved_pos = stream.position();
64            let sem = match Sem::parse(stream) {
65                Ok(val) => Some(val),
66                Err(_) => {
67                    stream.set_position(saved_pos);
68                    None
69                }
70            };
71            stream.expect_complete()?;
72            let saved_pos = stream.position();
73            let aligned = stream.expect_string(".aligned").is_ok();
74            if !aligned {
75                stream.set_position(saved_pos);
76            }
77            stream.expect_complete()?;
78            stream.expect_complete()?;
79            stream.expect(&PtxToken::Semicolon)?;
80            Ok(BarrierClusterArriveSemAligned {
81                cluster,
82                arrive,
83                sem,
84                aligned,
85            })
86        }
87    }
88
89    impl PtxParser for BarrierClusterWaitAcquireAligned {
90        fn parse(stream: &mut PtxTokenStream) -> Result<Self, PtxParseError> {
91            stream.expect_string("barrier")?;
92            stream.expect_string(".cluster")?;
93            let cluster = ();
94            stream.expect_complete()?;
95            stream.expect_string(".wait")?;
96            let wait = ();
97            stream.expect_complete()?;
98            let saved_pos = stream.position();
99            let acquire = stream.expect_string(".acquire").is_ok();
100            if !acquire {
101                stream.set_position(saved_pos);
102            }
103            stream.expect_complete()?;
104            let saved_pos = stream.position();
105            let aligned = stream.expect_string(".aligned").is_ok();
106            if !aligned {
107                stream.set_position(saved_pos);
108            }
109            stream.expect_complete()?;
110            stream.expect_complete()?;
111            stream.expect(&PtxToken::Semicolon)?;
112            Ok(BarrierClusterWaitAcquireAligned {
113                cluster,
114                wait,
115                acquire,
116                aligned,
117            })
118        }
119    }
120}