@@ -81,10 +81,11 @@ def __init__(self, address: int):
8181 self .address = address
8282
8383 @abstractmethod
84- def _build_registers (self ) -> dict [int , Union [MemoryRegister , Register ]]:
84+ def _build_registers (self ) -> dict [int , Union [list [Union [MemoryRegister , Register ]],
85+ Union [MemoryRegister , Register ]]]:
8586 """
86- populate the register structure, this method is intended to written by the generated code
87- based on then design
87+ populate the register structure, this method is intended to implemented by the generated
88+ code based on then design
8889 """
8990
9091 @abstractmethod
@@ -145,7 +146,15 @@ def _read(self, addr: int,
145146 # see if the address is a register first this ensures that registers in memories are
146147 # accessed directly
147148 if addr in self ._registers :
148- return self ._registers [addr ].read ()
149+ addr_entry = self ._registers [addr ]
150+ if isinstance (addr_entry , list ):
151+ # search the list for a readable register
152+ for inner_reg in addr_entry :
153+ # pylint: disable-next=protected-access
154+ if inner_reg ._readable :
155+ return inner_reg .read ()
156+ else :
157+ return addr_entry .read ()
149158
150159 potential_memory = self .memory_for_address (address = addr )
151160 if potential_memory is not None :
@@ -164,7 +173,14 @@ def _write(self, addr: int,
164173 # see if the address is a register first this ensures that registers in memories are
165174 # accessed directly
166175 if addr in self ._registers :
167- self ._registers [addr ].write (data )
176+ addr_entry = self ._registers [addr ]
177+ if isinstance (addr_entry , list ):
178+ for inner_reg in addr_entry :
179+ # pylint: disable-next=protected-access
180+ if inner_reg ._writable :
181+ inner_reg .write (data )
182+ else :
183+ addr_entry .write (data )
168184 else :
169185 potential_memory = self .memory_for_address (address = addr )
170186 if potential_memory is not None :
@@ -244,8 +260,13 @@ def register_by_full_name(self, name: str) -> Union[MemoryRegister, Register]:
244260
245261 """
246262 for reg in self ._registers .values ():
247- if reg .full_inst_name == name :
248- return reg
263+ if isinstance (reg , list ):
264+ for reg_list_entry in reg :
265+ if reg_list_entry .full_inst_name == name :
266+ return reg_list_entry
267+ else :
268+ if reg .full_inst_name == name :
269+ return reg
249270
250271 raise ValueError (f'register name not matched: { name } ' )
251272
@@ -260,9 +281,15 @@ def field_by_full_name(self, name: str) -> Field:
260281
261282 """
262283 for reg in self ._registers .values ():
263- for field in reg .fields :
264- if field .full_inst_name == name :
265- return field
284+ if isinstance (reg , list ):
285+ for reg_list_entry in reg :
286+ for field in reg_list_entry .fields :
287+ if field .full_inst_name == name :
288+ return field
289+ else :
290+ for field in reg .fields :
291+ if field .full_inst_name == name :
292+ return field
266293
267294 raise ValueError (f'field name not matched: { name } ' )
268295
@@ -282,12 +309,21 @@ def node_by_full_name(self, name: str) -> Union[Memory, MemoryRegister, Register
282309 return mem .memory
283310
284311 for reg in self ._registers .values ():
285- if reg .full_inst_name == name :
286- return reg
287-
288- for field in reg .fields :
289- if field .full_inst_name == name :
290- return field
312+ if isinstance (reg , list ):
313+ for reg_list_entry in reg :
314+ if reg_list_entry .full_inst_name == name :
315+ return reg_list_entry
316+
317+ for field in reg_list_entry .fields :
318+ if field .full_inst_name == name :
319+ return field
320+ else :
321+ if reg .full_inst_name == name :
322+ return reg
323+
324+ for field in reg .fields :
325+ if field .full_inst_name == name :
326+ return field
291327
292328 raise ValueError (f'node name not matched: { name } ' )
293329
0 commit comments