Skip to main content

litex/execute/
exec_def_prop_stmt.rs

1use crate::prelude::*;
2
3impl Runtime {
4    pub fn exec_def_prop_stmt(
5        &mut self,
6        def_prop_stmt: &DefPropStmt,
7    ) -> Result<StmtResult, RuntimeError> {
8        self.run_in_local_env(|rt| rt.def_prop_stmt_check_well_defined(def_prop_stmt))
9            .map_err(|e| exec_stmt_error_with_stmt_and_cause(def_prop_stmt.clone().into(), e))?;
10        self.store_def_prop(def_prop_stmt)?;
11        Ok(NonFactualStmtSuccess::new_with_stmt(def_prop_stmt.clone().into()).into())
12    }
13
14    fn def_prop_stmt_check_well_defined(
15        &mut self,
16        def_prop_stmt: &DefPropStmt,
17    ) -> Result<(), RuntimeError> {
18        self.define_params_with_type(
19            &def_prop_stmt.params_def_with_type,
20            false,
21            ParamObjType::DefHeader,
22        )
23        .map_err(|e| exec_stmt_error_with_stmt_and_cause(def_prop_stmt.clone().into(), e))?;
24
25        for fact in def_prop_stmt.iff_facts.iter() {
26            self.verify_fact_well_defined_and_store_and_infer(
27                fact.clone(),
28                &VerifyState::new(0, false),
29            )
30            .map_err(|inner_exec_error| {
31                exec_stmt_error_with_stmt_and_cause(def_prop_stmt.clone().into(), inner_exec_error)
32            })?;
33        }
34        Ok(())
35    }
36}