Skip to main content

litex/runtime/
runtime_known_object_properties.rs

1use crate::prelude::*;
2
3impl Runtime {
4    pub fn iter_environments_from_top(&self) -> impl Iterator<Item = &Environment> {
5        self.environment_stack.iter().rev().map(|env| env.as_ref())
6    }
7
8    /// Declared function space (`KnownFnInfo.fn_set`) only — not `$restrict_fn_in` targets.
9    pub fn get_object_in_fn_set(&self, obj: &Obj) -> Option<&FnSetBody> {
10        let key = obj.to_string();
11
12        for env in self.iter_environments_from_top() {
13            if let Some(info) = env.known_objs_in_fn_sets.get(&key) {
14                if let Some((body, _)) = info.fn_set.as_ref() {
15                    return Some(body);
16                }
17            }
18        }
19
20        None
21    }
22
23    /// Like [`get_object_in_fn_set`](Self::get_object_in_fn_set) but falls back to
24    /// [`KnownFnInfo.restrict_to`](KnownFnInfo::restrict_to) (e.g. after `$restrict_fn_in`) for well-defined/calls.
25    pub fn get_object_in_fn_set_or_restrict(&self, obj: &Obj) -> Option<&FnSetBody> {
26        let key = obj.to_string();
27
28        for env in self.iter_environments_from_top() {
29            if let Some(info) = env.known_objs_in_fn_sets.get(&key) {
30                if let Some((body, _)) = info.fn_set.as_ref() {
31                    return Some(body);
32                }
33                if let Some((rb, _)) = info.restrict_to.as_ref() {
34                    return Some(rb);
35                }
36            }
37        }
38
39        None
40    }
41
42    pub fn get_cloned_object_in_fn_set(&self, obj: &Obj) -> Option<FnSetBody> {
43        let key = obj.to_string();
44
45        for env in self.iter_environments_from_top() {
46            if let Some(info) = env.known_objs_in_fn_sets.get(&key) {
47                if let Some((body, _)) = info.fn_set.clone() {
48                    return Some(body);
49                }
50            }
51        }
52
53        None
54    }
55
56    pub fn get_cloned_object_in_fn_set_or_restrict(&self, obj: &Obj) -> Option<FnSetBody> {
57        self.get_object_in_fn_set_or_restrict(obj).cloned()
58    }
59
60    /// User `have fn f … = …`: [`FnSetBody`] and defining RHS when both are stored in
61    /// [`crate::environment::KnownFnInfo`] (inner scopes override outer).
62    pub fn get_known_fn_body_and_equal_to_for_key(
63        &self,
64        key: &str,
65    ) -> Option<(FnSetBody, Obj, LineFile)> {
66        for env in self.iter_environments_from_top() {
67            if let Some(info) = env.known_objs_in_fn_sets.get(key) {
68                if let (Some((body, _lf_body)), Some((eq, eq_line))) =
69                    (info.fn_set.clone(), info.equal_to.clone())
70                {
71                    return Some((body, eq, eq_line));
72                }
73            }
74        }
75        None
76    }
77
78    pub fn cache_well_defined_obj_contains(&self, key: &str) -> bool {
79        for env in self.iter_environments_from_top() {
80            if env.cache_well_defined_obj.contains_key(key) {
81                return true;
82            }
83        }
84        false
85    }
86
87    pub fn cache_known_facts_contains(&self, key: &str) -> (bool, LineFile) {
88        for env in self.iter_environments_from_top() {
89            if let Some(line_file) = env.cache_known_fact.get(key) {
90                return (true, line_file.clone());
91            }
92        }
93        (false, default_line_file())
94    }
95
96    pub fn get_object_equal_to_cart(&self, name: &str) -> Option<Cart> {
97        for env in self.iter_environments_from_top() {
98            if let Some((known_cart_obj, _)) = env.known_objs_equal_to_cart.get(name) {
99                return Some(known_cart_obj.clone());
100            }
101            if let Some((_, Some(known_cart_obj), _)) = env.known_objs_equal_to_tuple.get(name) {
102                return Some(known_cart_obj.clone());
103            }
104        }
105        None
106    }
107
108    pub fn get_obj_equal_to_tuple(&self, name: &str) -> Option<Tuple> {
109        for env in self.iter_environments_from_top() {
110            if let Some((Some(known_tuple_obj), _, _)) = env.known_objs_equal_to_tuple.get(name) {
111                return Some(known_tuple_obj.clone());
112            }
113        }
114        None
115    }
116
117    pub fn get_obj_equal_to_finite_seq_list(&self, name: &str) -> Option<FiniteSeqListObj> {
118        for env in self.iter_environments_from_top() {
119            if let Some((known_list, _, _)) = env.known_objs_equal_to_finite_seq_list.get(name) {
120                return Some(known_list.clone());
121            }
122        }
123        None
124    }
125
126    pub fn get_finite_seq_set_for_obj_equal_to_seq_list(&self, name: &str) -> Option<FiniteSeqSet> {
127        for env in self.iter_environments_from_top() {
128            if let Some((_, member_of, _)) = env.known_objs_equal_to_finite_seq_list.get(name) {
129                return member_of.clone();
130            }
131        }
132        None
133    }
134
135    pub fn get_obj_equal_to_matrix_list(&self, name: &str) -> Option<MatrixListObj> {
136        for env in self.iter_environments_from_top() {
137            if let Some((known_matrix, _, _)) = env.known_objs_equal_to_matrix_list.get(name) {
138                return Some(known_matrix.clone());
139            }
140        }
141        None
142    }
143
144    pub fn get_matrix_set_for_obj_equal_to_matrix_list(&self, name: &str) -> Option<MatrixSet> {
145        for env in self.iter_environments_from_top() {
146            if let Some((_, member_of, _)) = env.known_objs_equal_to_matrix_list.get(name) {
147                return member_of.clone();
148            }
149        }
150        None
151    }
152
153    pub fn get_object_equal_to_tuple(&self, name: &str) -> Option<Cart> {
154        for env in self.iter_environments_from_top() {
155            if let Some(cart) = env.known_objs_equal_to_tuple.get(name) {
156                return cart.1.clone();
157            }
158        }
159        None
160    }
161
162    pub fn get_object_equal_to_normalized_decimal_number(&self, obj_str: &str) -> Option<Number> {
163        for env in self.iter_environments_from_top() {
164            if let Some(calculated_value) = env
165                .known_objs_equal_to_normalized_decimal_number
166                .get(obj_str)
167            {
168                return Some(calculated_value.clone());
169            }
170        }
171        None
172    }
173
174    // TODO: PREDICATE WITH MOD NAME IS NOT IMPLEMENTED YET
175    pub fn get_all_objs_equal_to_given(&self, given: &str) -> Vec<String> {
176        let mut result = vec![];
177        for env in self.iter_environments_from_top() {
178            if let Some((_, equiv_class_members_rc)) = env.known_equality.get(given) {
179                for obj in equiv_class_members_rc.iter() {
180                    result.push(obj.to_string());
181                }
182            }
183        }
184
185        result
186    }
187}