@@ -190,6 +190,26 @@ def get_list_by_name(self, reg_name: str) -> 'ObjList':
190190 logger ().log_verbose (f" Got reg list: { ', ' .join ([reg .name for reg in reglist ])} " )
191191 return reglist
192192
193+ def _get_matching_registers (self , current_obj : 'Recursable' , reg_name : str ) -> 'ObjList' :
194+ """
195+ Recursively get all register objects from the current object
196+
197+ Args:
198+ current_obj: The current object to search for registers
199+ reg_name: Name of the register
200+
201+ Returns:
202+ List of register objects matching the name found in the current object and its children
203+ """
204+ matched_regs = ObjList ()
205+ if hasattr (current_obj , 'get_next_levels' ):
206+ next_obj_list = current_obj .get_next_levels ('*' )
207+ for next_obj in next_obj_list :
208+ matched_regs .extend (self ._get_matching_registers (next_obj , reg_name ))
209+ if hasattr (current_obj , 'get_register_matches' ):
210+ matched_regs .extend (current_obj .get_register_matches (reg_name ))
211+ return matched_regs
212+
193213 def get_list_by_name_without_scope (self , reg_name : str ) -> 'ObjList' :
194214 """
195215 Get register list without scope prefix.
@@ -212,109 +232,14 @@ def get_list_by_name_without_scope(self, reg_name: str) -> 'ObjList':
212232 logger ().log_warning ("Configuration not initialized" )
213233 return result_list
214234
215- # Use the platform structure to search across all vendors and devices
235+ # Use the platform structure to search across all vendors, IPs and BARs
216236 if hasattr (self .cs .Cfg , 'platform' ) and self .cs .Cfg .platform :
217237 # Log diagnostic info at debug level
218- platform = self .cs .Cfg .platform
219- if hasattr (platform , 'vendor_list' ) and platform .vendor_list :
220- vendor_count = len (platform .vendor_list )
221- logger ().log_debug (f"Searching { vendor_count } vendors in platform structure" )
222-
223- # Search through all vendor/device combinations
224- for vendor_id in platform .vendor_list :
225- vendor = platform .get_vendor (vendor_id )
226-
227- # Check if vendor.devices exists
228- if hasattr (vendor , 'ip_list' ) and vendor .ip_list :
229- for ip_id in vendor .ip_list :
230- ip = vendor .get_ip (ip_id )
231-
232- if hasattr (ip , 'bar_list' ) and ip .bar_list :
233- for bar_id in ip .bar_list :
234- # Check for registers
235- bar = ip .get_bar (bar_id )
236- has_registers = (hasattr (bar , 'register_list' ) and
237- bar .register_list )
238-
239- if has_registers and reg_name in bar .register_list :
240- # Found the register, add all instances
241- reg_objects = bar .register_list [reg_name ]
242- logger ().log_debug (
243- f"Found register { reg_name } in { vendor_id } .{ ip_id } .{ bar_id } " )
244- if isinstance (reg_objects , list ):
245- result_list .extend (reg_objects )
246- else :
247- result_list .append (reg_objects )
248- # Check for registers
249- has_registers = (hasattr (ip , 'register_list' ) and
250- ip .register_list )
251-
252- if has_registers and reg_name in ip .register_list :
253- # Found the register, add all instances
254- reg_objects = ip .register_list [reg_name ]
255- logger ().log_debug (
256- f"Found register { reg_name } in { vendor_id } .{ ip_id } " )
257-
258- if isinstance (reg_objects , list ):
259- result_list .extend (reg_objects )
260- else :
261- result_list .append (reg_objects )
262- else :
263- logger ().log_debug ("No vendors in platform structure" )
238+ plat_obj = self .cs .Cfg .platform
239+ result_list = self ._get_matching_registers (plat_obj , reg_name )
264240 else :
265241 logger ().log_debug ("Platform structure not available" )
266242
267- # If no results found in platform structure, try fallback methods
268- if not result_list :
269- logger ().log_debug (
270- f"No results found for { reg_name } in platform structure, trying fallbacks" )
271-
272- # Try different fallback approaches
273- try :
274- # First try direct wildcard approach
275- fallback_result = self .cs .Cfg .get_reglist ('*.*.' + reg_name )
276- if fallback_result :
277- logger ().log_debug (
278- f"Found { len (fallback_result )} results with '*.*.' fallback" )
279- result_list .extend (fallback_result )
280- except Exception as e :
281- logger ().log_debug (f"First fallback failed: { str (e )} " )
282-
283- try :
284- # Second approach: more flexible wildcard pattern
285- fallback_result = self .cs .Cfg .get_reglist ('*.' + reg_name )
286- if fallback_result :
287- logger ().log_debug (
288- f"Found { len (fallback_result )} results with '*.' fallback" )
289- result_list .extend (fallback_result )
290- except Exception as e2 :
291- logger ().log_debug (f"Second fallback failed: { str (e2 )} " )
292-
293- try :
294- # Legacy approach: check REGISTERS structure directly
295- if hasattr (self .cs .Cfg , 'REGISTERS' ):
296- possible_regs = []
297-
298- # Search through legacy REGISTERS structure
299- for vid in self .cs .Cfg .REGISTERS .keys ():
300- for dev in self .cs .Cfg .REGISTERS [vid ].keys ():
301- if reg_name in self .cs .Cfg .REGISTERS [vid ][dev ]:
302- reg_path = f"{ vid } .{ dev } .{ reg_name } "
303- possible_regs .append (reg_path )
304-
305- # Get register objects for each path found
306- for reg_path in possible_regs :
307- try :
308- reg_objs = self .cs .Cfg .get_reglist (reg_path )
309- logger ().log_debug (
310- f"Found register via legacy lookup: { reg_path } " )
311- result_list .extend (reg_objs )
312- except Exception :
313- # Ignore errors for individual registers
314- pass
315- except Exception as e3 :
316- logger ().log_debug (f"All fallbacks failed: { str (e3 )} " )
317-
318243 # Log summary
319244 if result_list :
320245 logger ().log_debug (
0 commit comments