Skip to main content

litex/execute/
exec_define_params_with_set.rs

1use crate::prelude::*;
2
3impl Runtime {
4    pub fn define_params_with_set(
5        &mut self,
6        param_def: &ParamGroupWithSet,
7    ) -> Result<InferResult, RuntimeError> {
8        self.define_params_with_set_in_scope(param_def, ParamObjType::FnSet)
9    }
10
11    pub fn define_params_with_set_in_scope(
12        &mut self,
13        param_def: &ParamGroupWithSet,
14        binding_scope: ParamObjType,
15    ) -> Result<InferResult, RuntimeError> {
16        let param_set = param_def.set_obj();
17        self.verify_obj_well_defined_and_store_cache(param_set, &VerifyState::new(0, false))
18            .map_err(|well_defined_error| {
19                let param_names_text = param_def.params.join(", ");
20                let error_line_file = well_defined_error.line_file().clone();
21                RuntimeError::from(DefineParamsRuntimeError(RuntimeErrorStruct::new(
22                    None,
23                    format!(
24                        "define params with set: failed to verify set well-defined for params [{}] with set {}",
25                        param_names_text, param_set
26                    ),
27                    error_line_file,
28                    Some(well_defined_error),
29                    vec![],
30                )))
31            })?;
32        let mut infer_result = InferResult::new();
33        let facts = param_def.facts_for_binding_scope(binding_scope);
34        for (name, fact) in param_def.params.iter().zip(facts.iter()) {
35            self.store_free_param_or_identifier_name(name, binding_scope)
36                .map_err(|runtime_error| {
37                    RuntimeError::from(DefineParamsRuntimeError(
38                        RuntimeErrorStruct::new_with_msg_and_cause(
39                            format!(
40                                "define params with set: failed to declare parameter `{}`",
41                                name
42                            ),
43                            runtime_error,
44                        ),
45                    ))
46                })?;
47            let fact_infer_result = self
48                .verify_well_defined_and_store_and_infer_with_default_verify_state(fact.clone())
49                .map_err(|store_fact_error| {
50                    RuntimeError::from(DefineParamsRuntimeError(RuntimeErrorStruct::new_with_msg_and_cause(format!(
51                            "define params with set: failed to store in-set fact for parameter `{}`",
52                            name
53                        ), store_fact_error)))
54                })?;
55            infer_result.new_infer_result_inside(fact_infer_result);
56        }
57        Ok(infer_result)
58    }
59}