2121import unittest
2222from abc import ABC , abstractmethod
2323from typing import Union , Optional
24+ from itertools import product
2425
2526from ..lib import FieldReadWrite , FieldReadOnly , FieldWriteOnly
2627from ..lib import FieldEnumReadWrite , FieldEnumReadOnly , FieldEnumWriteOnly
4142from .utilities import get_field_bitmask_int , get_field_inv_bitmask
4243from ..sim_lib .simulator import BaseSimulator
4344
45+ class NodeIterators :
46+ """
47+ The Node Iterator class is intended to an efficient way to define the iterators of particular
48+ type that are present on a node
49+ """
50+ __slots__ = ['__node_descriptions' ]
51+ def __init__ (self , * args :Union [str , tuple [str , list [int ]]]):
52+ self .__node_descriptions = args
53+
54+ @staticmethod
55+ def __rolled_item (item :Union [str , tuple [str , list [int ]]]) -> str :
56+ if isinstance (item , tuple ):
57+ return item [0 ]
58+ return item
59+
60+ @property
61+ def rolled (self ) -> set [str ]:
62+ """
63+ name of all the rolled nodes in a set
64+ """
65+ return { self .__rolled_item (item ) for item in self .__node_descriptions }
66+
67+ @property
68+ def unrolled (self ) -> set [str ]:
69+ """
70+ name of all the unrolled nodes in a set
71+ """
72+ return_list = []
73+ for item in self .__node_descriptions :
74+ if isinstance (item , tuple ):
75+ dim_set = list (product (* [range (dim ) for dim in item [1 ]]))
76+ for dim in dim_set :
77+ # to match the systemrdl compiler dimension put into the inst name of
78+ # the array, the name must be item[x][y]
79+ dim_str = '' .join ([f'[{ str (i )} ]' for i in dim ])
80+ return_list .append (f'{ item [0 ]} { dim_str } ' )
81+ else :
82+ return_list .append (item )
83+ return set (return_list )
84+
4485class CommonTestBase (unittest .TestCase , ABC ):
4586 """
4687 Base Test class for the autogenerated register test to be used for the async and
@@ -201,8 +242,8 @@ def _test_register_iterators(self,
201242 MemoryAsyncReadOnly , MemoryAsyncReadOnlyLegacy ,
202243 MemoryAsyncWriteOnly , MemoryAsyncWriteOnlyLegacy ,
203244 MemoryAsyncReadWrite , MemoryAsyncReadWriteLegacy ],
204- readable_registers : set [ str ] ,
205- writeable_registers : set [ str ] ) -> None :
245+ readable_registers : NodeIterators ,
246+ writeable_registers : NodeIterators ) -> None :
206247
207248 if isinstance (dut , (AddressMap , AsyncAddressMap , RegFile , AsyncRegFile ,
208249 MemoryReadOnly , MemoryReadOnlyLegacy ,
@@ -211,7 +252,10 @@ def _test_register_iterators(self,
211252 MemoryAsyncReadWrite , MemoryAsyncReadWriteLegacy )):
212253 child_readable_reg_names = { reg .inst_name for reg in
213254 dut .get_readable_registers (unroll = True )}
214- self .assertEqual (readable_registers , child_readable_reg_names )
255+ self .assertEqual (readable_registers .unrolled , child_readable_reg_names )
256+ child_readable_reg_names = {reg .inst_name for reg in
257+ dut .get_readable_registers (unroll = False )}
258+ self .assertEqual (readable_registers .rolled , child_readable_reg_names )
215259 else :
216260 self .assertFalse (hasattr (dut , 'get_readable_registers' ))
217261
@@ -222,32 +266,43 @@ def _test_register_iterators(self,
222266 MemoryAsyncReadWrite , MemoryAsyncReadWriteLegacy )):
223267 child_writable_reg_names = {reg .inst_name for reg in
224268 dut .get_writable_registers (unroll = True )}
225- self .assertEqual (writeable_registers , child_writable_reg_names )
269+ self .assertEqual (writeable_registers .unrolled , child_writable_reg_names )
270+ child_writable_reg_names = {reg .inst_name for reg in
271+ dut .get_writable_registers (unroll = False )}
272+ self .assertEqual (writeable_registers .rolled , child_writable_reg_names )
226273 else :
227274 self .assertFalse (hasattr (dut , 'get_writable_registers' ))
228275
229276 child_reg_names = {field .inst_name for field in dut .get_registers (unroll = True )}
230- self .assertEqual (readable_registers | writeable_registers , child_reg_names )
277+ self .assertEqual (readable_registers .unrolled | writeable_registers .unrolled ,
278+ child_reg_names )
279+ child_reg_names = {field .inst_name for field in dut .get_registers (unroll = False )}
280+ self .assertEqual (readable_registers .rolled | writeable_registers .rolled ,
281+ child_reg_names )
231282
232283
233284 def _test_memory_iterators (self ,
234285 dut : Union [AddressMap , AsyncAddressMap ],
235- memories : set [ str ] ) -> None :
286+ memories : NodeIterators ) -> None :
236287 child_mem_names = {reg .inst_name for reg in dut .get_memories (unroll = True )}
237- self .assertEqual (memories , child_mem_names )
288+ self .assertEqual (memories .unrolled , child_mem_names )
289+ child_mem_names = {reg .inst_name for reg in dut .get_memories (unroll = False )}
290+ self .assertEqual (memories .rolled , child_mem_names )
238291
239292 def __test_section_iterators (self ,
240293 dut : Union [AddressMap , AsyncAddressMap , RegFile , AsyncRegFile ],
241- sections : set [ str ] ) -> None :
294+ sections : NodeIterators ) -> None :
242295 child_section_names = {reg .inst_name for reg in dut .get_sections (unroll = True )}
243- self .assertEqual (sections , child_section_names )
296+ self .assertEqual (sections .unrolled , child_section_names )
297+ child_section_names = {reg .inst_name for reg in dut .get_sections (unroll = False )}
298+ self .assertEqual (sections .rolled , child_section_names )
244299
245300 def _test_addrmap_iterators (self , * ,
246301 dut : Union [AddressMap , AsyncAddressMap ],
247- memories : set [ str ] ,
248- sections : set [ str ] ,
249- readable_registers : set [ str ] ,
250- writeable_registers : set [ str ] ) -> None :
302+ memories : NodeIterators ,
303+ sections : NodeIterators ,
304+ readable_registers : NodeIterators ,
305+ writeable_registers : NodeIterators ) -> None :
251306 self ._test_register_iterators (dut = dut ,
252307 readable_registers = readable_registers ,
253308 writeable_registers = writeable_registers )
@@ -258,9 +313,9 @@ def _test_addrmap_iterators(self, *,
258313
259314 def _test_regfile_iterators (self ,
260315 dut : Union [RegFile , AsyncRegFile ],
261- sections : set [ str ] ,
262- readable_registers : set [ str ] ,
263- writeable_registers : set [ str ] ) -> None :
316+ sections : NodeIterators ,
317+ readable_registers : NodeIterators ,
318+ writeable_registers : NodeIterators ) -> None :
264319 self ._test_register_iterators (dut = dut ,
265320 readable_registers = readable_registers ,
266321 writeable_registers = writeable_registers )
0 commit comments