Skip to main content

litex/execute/
exec_def_struct_stmt.rs

1use crate::prelude::*;
2
3impl Runtime {
4    pub fn exec_def_struct_stmt(
5        &mut self,
6        def_struct_stmt: &DefStructStmt,
7    ) -> Result<StmtResult, RuntimeError> {
8        self.run_in_local_env(|rt| rt.def_struct_stmt_check_well_defined(def_struct_stmt))
9            .map_err(|e| exec_stmt_error_with_stmt_and_cause(def_struct_stmt.clone().into(), e))?;
10        self.store_def_struct(def_struct_stmt)?;
11        Ok(NonFactualStmtSuccess::new_with_stmt(def_struct_stmt.clone().into()).into())
12    }
13
14    fn def_struct_stmt_check_well_defined(
15        &mut self,
16        def_struct_stmt: &DefStructStmt,
17    ) -> Result<(), RuntimeError> {
18        let verify_state = VerifyState::new(0, false);
19
20        if let Some((param_def_with_type, dom_facts)) = &def_struct_stmt.param_def_with_dom {
21            self.define_params_with_type(param_def_with_type, false, ParamObjType::DefHeader)?;
22            for dom_fact in dom_facts.iter() {
23                self.verify_or_and_chain_atomic_fact_well_defined(dom_fact, &verify_state)?;
24            }
25        }
26
27        for (_, field_type) in def_struct_stmt.fields.iter() {
28            self.verify_obj_well_defined_and_store_cache(field_type, &verify_state)?;
29        }
30
31        self.run_in_local_env(|rt| {
32            for (field_name, field_type) in def_struct_stmt.fields.iter() {
33                let param_def =
34                    ParamGroupWithSet::new(vec![field_name.clone()], field_type.clone());
35                rt.define_params_with_set_in_scope(&param_def, ParamObjType::DefStructField)?;
36            }
37
38            for fact in def_struct_stmt.equivalent_facts.iter() {
39                rt.verify_fact_well_defined(fact, &verify_state)?;
40            }
41            Ok::<(), RuntimeError>(())
42        })?;
43
44        Ok(())
45    }
46}