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