litex/runtime/
runtime_known_object_properties.rs1use 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 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 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 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 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}