Skip to main content

litex/execute/by_stmt/
tuple_by_stmt.rs

1use super::kuratowski_by_stmt::kuratowski_encode_tuple_boxes;
2use crate::prelude::*;
3
4impl Runtime {
5    pub fn exec_by_tuple_stmt(
6        &mut self,
7        stmt: &ByTupleAsSetStmt,
8    ) -> Result<StmtResult, RuntimeError> {
9        let stmt_exec: Stmt = stmt.clone().into();
10
11        let tuple_struct = match &stmt.obj {
12            Obj::Tuple(tuple) => tuple.clone(),
13            _ => {
14                if let Some(t) = self.get_obj_equal_to_tuple(&stmt.obj.to_string()) {
15                    t
16                } else {
17                    return Err(short_exec_error(
18                        stmt_exec,
19                        format!(
20                            "by tuple as set: `{}` is not known to denote a tuple",
21                            stmt.obj
22                        ),
23                        None,
24                        vec![],
25                    ));
26                }
27            }
28        };
29
30        let verify_state = VerifyState::new(0, false);
31        self.verify_obj_well_defined_and_store_cache(&stmt.obj, &verify_state)
32            .map_err(|e| {
33                short_exec_error(
34                    stmt_exec.clone(),
35                    format!("by tuple as set: `{}` is not well-defined", stmt.obj),
36                    Some(e),
37                    vec![],
38                )
39            })?;
40
41        let encoded = kuratowski_encode_tuple_boxes(&tuple_struct.args).map_err(|msg| {
42            short_exec_error(
43                stmt_exec.clone(),
44                format!("by tuple as set: {}", msg),
45                None,
46                vec![],
47            )
48        })?;
49
50        let equal_fact = EqualFact::new(stmt.obj.clone(), encoded, stmt.line_file.clone()).into();
51
52        match self.verify_well_defined_and_store_and_infer_with_default_verify_state(equal_fact) {
53            Ok(infer_result) => {
54                self.store_tuple_obj_and_cart(
55                    &stmt.obj.to_string(),
56                    Some(tuple_struct),
57                    None,
58                    stmt.line_file.clone(),
59                );
60                Ok((NonFactualStmtSuccess::new(stmt_exec, infer_result, vec![])).into())
61            }
62            Err(store_error) => Err(short_exec_error(
63                stmt_exec,
64                "by tuple as set: failed to store definitional equality".to_string(),
65                Some(store_error),
66                vec![],
67            )),
68        }
69    }
70}