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 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 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 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 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}