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