litex/execute/by_stmt/
tuple_by_stmt.rs1use 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}