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(&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}