Skip to main content

litex/execute/
exec_family_def.rs

1use crate::prelude::*;
2
3impl Runtime {
4    pub fn exec_def_family_stmt(
5        &mut self,
6        def_family_stmt: &DefFamilyStmt,
7    ) -> Result<StmtResult, RuntimeError> {
8        let family_definition_infer_result =
9            self.run_in_local_env(|rt| rt.def_family_stmt_check_well_defined(def_family_stmt))?;
10
11        self.store_def_family(def_family_stmt)
12            .map_err(|store_error| {
13                short_exec_error(
14                    def_family_stmt.clone().into(),
15                    "failed to store family definition",
16                    Some(store_error),
17                    vec![],
18                )
19            })?;
20
21        Ok((NonFactualStmtSuccess::new(
22            def_family_stmt.clone().into(),
23            family_definition_infer_result,
24            vec![],
25        ))
26        .into())
27    }
28
29    fn def_family_stmt_check_well_defined(
30        &mut self,
31        def_family_stmt: &DefFamilyStmt,
32    ) -> Result<InferResult, RuntimeError> {
33        let verify_state = VerifyState::new(0, false);
34        let mut family_definition_infer_result = self
35            .define_params_with_type(
36                &def_family_stmt.params_def_with_type,
37                false,
38                ParamObjType::DefHeader,
39            )
40            .map_err(|define_params_error| {
41                short_exec_error(
42                    def_family_stmt.clone().into(),
43                    "",
44                    Some(define_params_error),
45                    vec![],
46                )
47            })?;
48
49        for dom_fact in def_family_stmt.dom_facts.iter() {
50            let dom_fact_infer_result = self
51                .verify_or_and_chain_atomic_fact_well_defined_and_store_and_infer(
52                    dom_fact,
53                    &verify_state,
54                )
55                .map_err(|inner_exec_error| {
56                    short_exec_error(
57                        def_family_stmt.clone().into(),
58                        "",
59                        Some(inner_exec_error),
60                        vec![],
61                    )
62                })?;
63            family_definition_infer_result.new_infer_result_inside(dom_fact_infer_result);
64        }
65
66        self.verify_obj_well_defined_and_store_cache(&def_family_stmt.equal_to, &verify_state)
67            .map_err(|well_defined_error| {
68                short_exec_error(
69                    def_family_stmt.clone().into(),
70                    "",
71                    Some(well_defined_error),
72                    vec![],
73                )
74            })?;
75
76        Ok(family_definition_infer_result)
77    }
78}