Skip to main content

litex/verify/
verify_obj_satisfy_family.rs

1use crate::prelude::*;
2
3impl Runtime {
4    pub fn verify_obj_satisfies_family(
5        &mut self,
6        obj: Obj,
7        family_ty: &FamilyObj,
8        verify_state: &VerifyState,
9    ) -> Result<StmtResult, RuntimeError> {
10        let family_name = family_ty.name.to_string();
11        let def =
12            match self.get_cloned_family_definition_by_name(&family_name) {
13                Some(d) => d,
14                None => {
15                    return Err(VerifyRuntimeError(RuntimeErrorStruct::new_with_just_msg(
16                        format!("family `{}` is not defined", family_name),
17                    ))
18                    .into());
19                }
20            };
21        let expected_count = def.params_def_with_type.number_of_params();
22        if family_ty.params.len() != expected_count {
23            return Err(
24                VerifyRuntimeError(RuntimeErrorStruct::new_with_just_msg(format!(
25                    "family `{}` expects {} type argument(s), got {}",
26                    family_name,
27                    expected_count,
28                    family_ty.params.len()
29                )))
30                .into(),
31            );
32        }
33        let param_to_arg_map = def
34            .params_def_with_type
35            .param_defs_and_args_to_param_to_arg_map(family_ty.params.as_slice());
36        let member_set =
37            self.inst_obj(&def.equal_to, &param_to_arg_map, ParamObjType::DefHeader)?;
38        let fact = InFact::new(obj, member_set, default_line_file()).into();
39        self.verify_atomic_fact(&fact, verify_state)
40    }
41}