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