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        self.verify_obj_well_defined_and_store_cache(&param_def.set, &VerifyState::new(0, false))
17            .map_err(|well_defined_error| {
18                let param_names_text = param_def.params.join(", ");
19                let error_line_file = well_defined_error.line_file().clone();
20                RuntimeError::from(DefineParamsRuntimeError(RuntimeErrorStruct::new(
21                    None,
22                    format!(
23                        "define params with set: failed to verify set well-defined for params [{}] with set {}",
24                        param_names_text, param_def.set
25                    ),
26                    error_line_file,
27                    Some(well_defined_error),
28                    vec![],
29                )))
30            })?;
31        let mut infer_result = InferResult::new();
32        let facts = param_def.facts_for_binding_scope(binding_scope);
33        for (name, fact) in param_def.params.iter().zip(facts.iter()) {
34            self.store_free_param_or_identifier_name(name, binding_scope)
35                .map_err(|runtime_error| {
36                    RuntimeError::from(DefineParamsRuntimeError(
37                        RuntimeErrorStruct::new_with_msg_and_cause(
38                            format!(
39                                "define params with set: failed to declare parameter `{}`",
40                                name
41                            ),
42                            runtime_error,
43                        ),
44                    ))
45                })?;
46            let fact_infer_result = self
47                .verify_well_defined_and_store_and_infer_with_default_verify_state(fact.clone())
48                .map_err(|store_fact_error| {
49                    RuntimeError::from(DefineParamsRuntimeError(RuntimeErrorStruct::new_with_msg_and_cause(format!(
50                            "define params with set: failed to store in-set fact for parameter `{}`",
51                            name
52                        ), store_fact_error)))
53                })?;
54            infer_result.new_infer_result_inside(fact_infer_result);
55        }
56        Ok(infer_result)
57    }
58}