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