litex/verify/
verify_arg_satisfy_param_def.rs1use crate::prelude::*;
2
3impl Runtime {
4 pub fn verify_obj_satisfies_param_type(
5 &mut self,
6 obj: Obj,
7 param_type: &ParamType,
8 verify_state: &VerifyState,
9 ) -> Result<StmtResult, RuntimeError> {
10 match param_type {
11 ParamType::Obj(set_obj) => {
12 let fact = InFact::new(obj, set_obj.clone(), default_line_file()).into();
13 self.verify_atomic_fact(&fact, verify_state)
14 }
15 ParamType::Set(_) => {
16 let fact = IsSetFact::new(obj, default_line_file()).into();
17 self.verify_atomic_fact(&fact, verify_state)
18 }
19 ParamType::NonemptySet(_) => {
20 let fact = IsNonemptySetFact::new(obj, default_line_file()).into();
21 self.verify_atomic_fact(&fact, verify_state)
22 }
23 ParamType::FiniteSet(_) => {
24 let fact = IsFiniteSetFact::new(obj, default_line_file()).into();
25 self.verify_atomic_fact(&fact, verify_state)
26 }
27 }
28 }
29
30 pub fn verify_args_satisfy_param_def_flat_types(
31 &mut self,
32 param_defs: &ParamDefWithType,
33 args: &Vec<Obj>,
34 verify_state: &VerifyState,
35 to_inst_param_type: ParamObjType,
36 ) -> Result<StmtResult, RuntimeError> {
37 let instantiated_types =
38 self.inst_param_def_with_type_one_by_one(param_defs, args, to_inst_param_type)?;
39 let flat_types = param_defs.flat_instantiated_types_for_args(&instantiated_types);
40 let mut infer_result = InferResult::new();
41 for (arg, param_type) in args.iter().zip(flat_types.iter()) {
42 let verify_result =
43 self.verify_obj_satisfies_param_type(arg.clone(), param_type, verify_state)?;
44 if verify_result.is_unknown() {
45 return Ok(verify_result);
46 }
47 match verify_result {
48 StmtResult::NonFactualStmtSuccess(x) => {
49 infer_result.new_infer_result_inside(x.infers);
50 }
51 StmtResult::FactualStmtSuccess(x) => {
52 infer_result.new_infer_result_inside(x.infers);
53 }
54 StmtResult::StmtUnknown(_) => unreachable!(),
55 }
56 }
57 Ok(NonFactualStmtSuccess::new(
58 DoNothingStmt::new(default_line_file()).into(),
59 infer_result,
60 Vec::new(),
61 )
62 .into())
63 }
64}