Skip to main content

litex/parse/by_stmt/
fn_tuple_by_stmt.rs

1use crate::prelude::*;
2
3impl Runtime {
4    pub fn parse_by_fn_stmt(&mut self, tb: &mut TokenBlock) -> Result<Stmt, RuntimeError> {
5        tb.skip_token(FN_LOWER_CASE)?;
6        if tb.current_token_is_equal_to(SET) {
7            tb.skip_token(SET)?;
8            tb.skip_token(AS)?;
9            tb.skip_token(SET)?;
10            tb.skip_token(COLON)?;
11            return self.parse_by_fn_set_stmt(tb);
12        }
13        tb.skip_token(AS)?;
14        tb.skip_token(SET)?;
15        tb.skip_token(COLON)?;
16        let function = self.parse_obj(tb)?;
17        Ok(ByFnAsSetStmt::new(function, tb.line_file.clone()).into())
18    }
19
20    pub fn parse_by_fn_set_stmt(&mut self, tb: &mut TokenBlock) -> Result<Stmt, RuntimeError> {
21        let func = self.parse_obj(tb)?;
22        tb.skip_token(FACT_PREFIX)?;
23        tb.skip_token(IN)?;
24        tb.skip_token(FN_LOWER_CASE)?;
25        let fn_set = self.parse_fn_set(tb)?;
26        Ok(ByFnSetAsSetStmt::new(func, fn_set, tb.line_file.clone()).into())
27    }
28
29    // `by tuple as set: <obj>` expands the tuple as its set-theoretic encoding.
30    pub fn parse_by_tuple_stmt(&mut self, tb: &mut TokenBlock) -> Result<Stmt, RuntimeError> {
31        tb.skip_token(TUPLE)?;
32        tb.skip_token(AS)?;
33        tb.skip_token(SET)?;
34        tb.skip_token(COLON)?;
35        let obj = self.parse_obj(tb)?;
36        Ok(ByTupleAsSetStmt::new(obj, tb.line_file.clone()).into())
37    }
38}