@@ -176,62 +176,53 @@ def test_set_wrong_map_data_width(self):
176176
177177
178178class MultiplexerTestCase (unittest .TestCase ):
179- def setUp (self ):
180- self .dut = csr .Multiplexer (addr_width = 16 , data_width = 8 )
181-
182- def test_add_4b (self ):
183- elem_4b = csr .Element (4 , "rw" , path = ("elem_4b" ,))
184- self .assertEqual (self .dut .add (elem_4b , name = "elem_4b" ), (0 , 1 ))
179+ def test_memory_map (self ):
180+ elem_4_rw = csr .Element (4 , "rw" , path = ("elem_4_rw" ,))
181+ elem_8_rw = csr .Element (8 , "rw" , path = ("elem_8_rw" ,))
185182
186- def test_add_8b (self ):
187- elem_8b = csr .Element (8 , "rw" , path = ("elem_8b" ,))
188- self .assertEqual (self .dut .add (elem_8b , name = "elem_8b" ), (0 , 1 ))
183+ memory_map = MemoryMap (addr_width = 2 , data_width = 4 )
184+ memory_map .add_resource (elem_4_rw , name = "elem_4_rw" , size = 1 )
185+ memory_map .add_resource (elem_8_rw , name = "elem_8_rw" , size = 2 )
186+ memory_map .freeze ()
189187
190- def test_add_12b (self ):
191- elem_12b = csr .Element (12 , "rw" , path = ("elem_12b" ,))
192- self .assertEqual (self .dut .add (elem_12b , name = "elem_8b" ), (0 , 2 ))
188+ dut = csr .Multiplexer (memory_map )
193189
194- def test_add_16b ( self ):
195- elem_16b = csr . Element ( 16 , "rw" , path = ( "elem_16b" ,) )
196- self .assertEqual (self . dut .add ( elem_16b , name = "elem_16b" ), ( 0 , 2 ) )
190+ self . assertIs ( dut . bus . memory_map , memory_map )
191+ self . assertEqual ( dut . bus . addr_width , 2 )
192+ self .assertEqual (dut .bus . data_width , 4 )
197193
198- def test_add_two (self ):
199- elem_8b = csr .Element ( 8 , "rw" , path = ("elem_8b" ,))
200- elem_16b = csr .Element (16 , "rw" , path = ("elem_16b" ,))
201- self .assertEqual (self .dut .add (elem_16b , name = "elem_16b" ), (0 , 2 ))
202- self .assertEqual (self .dut .add (elem_8b , name = "elem_8b" ), (2 , 3 ))
203-
204- def test_add_wrong (self ):
194+ def test_wrong_memory_map (self ):
205195 with self .assertRaisesRegex (TypeError ,
206- r"Element must be an instance of csr\.Element , not 'foo'" ):
207- self . dut . add ( elem = "foo" , name = "elem_4b " )
196+ r"Memory map must be an instance of MemoryMap , not 'foo'" ):
197+ csr . Multiplexer ( "foo" )
208198
209- def test_align_to (self ):
210- elem_0 = csr . Element ( 8 , "rw" , path = ( "elem_0" ,) )
211- elem_1 = csr . Element ( 8 , "rw " , path = ( "elem_1" ,) )
212- self .assertEqual ( self . dut . add ( elem_0 , name = "elem_0" ), ( 0 , 1 ))
213- self . assertEqual ( self . dut . align_to ( 2 ), 4 )
214- self . assertEqual ( self . dut . add ( elem_1 , name = "elem_1" ), ( 4 , 5 ) )
199+ def test_wrong_memory_map_resource (self ):
200+ memory_map = MemoryMap ( addr_width = 1 , data_width = 8 )
201+ memory_map . add_resource ( "foo " , name = "foo" , size = 1 )
202+ with self .assertRaisesRegex ( TypeError ,
203+ r"Memory map resource must be an instance of csr\.Element, not 'foo'" ):
204+ csr . Multiplexer ( memory_map )
215205
216- def test_add_wrong_out_of_bounds (self ):
217- elem = csr . Element ( 8 , "rw" , path = ( "elem" ,) )
218- with self . assertRaisesRegex ( ValueError ,
219- r"Address range 0x10000\.\.0x10001 out of bounds for memory map spanning "
220- r"range 0x0\.\.0x10000 \(16 address bits\) " ):
221- self . dut . add ( elem , name = "elem" , addr = 0x10000 )
206+ def test_wrong_memory_map_windows (self ):
207+ memory_map_0 = MemoryMap ( addr_width = 1 , data_width = 8 )
208+ memory_map_1 = MemoryMap ( addr_width = 1 , data_width = 8 )
209+ memory_map_0 . add_window ( memory_map_1 )
210+ with self . assertRaisesRegex ( ValueError , r"Memory map cannot have windows " ):
211+ csr . Multiplexer ( memory_map_0 )
222212
223213 def test_sim (self ):
224214 for shadow_overlaps in [None , 0 , 1 ]:
225215 with self .subTest (shadow_overlaps = shadow_overlaps ):
226- dut = csr .Multiplexer (addr_width = 16 , data_width = 8 , shadow_overlaps = shadow_overlaps )
227-
228- elem_4_r = csr .Element (4 , "r" , path = ("elem_4_r" ,))
229- dut .add (elem_4_r , name = "elem_4_r" )
230- elem_8_w = csr .Element (8 , "w" , path = ("elem_8_w" ,))
231- dut .add (elem_8_w , name = "elem_8_w" )
216+ elem_4_r = csr .Element ( 4 , "r" , path = ("elem_4_r" ,))
217+ elem_8_w = csr .Element ( 8 , "w" , path = ("elem_8_w" ,))
232218 elem_16_rw = csr .Element (16 , "rw" , path = ("elem_16_rw" ,))
233- dut .add (elem_16_rw , name = "elem_16_rw" )
234219
220+ memory_map = MemoryMap (addr_width = 16 , data_width = 8 )
221+ memory_map .add_resource (elem_4_r , name = "elem_4_r" , size = 1 )
222+ memory_map .add_resource (elem_8_w , name = "elem_8_w" , size = 1 )
223+ memory_map .add_resource (elem_16_rw , name = "elem_16_rw" , size = 2 )
224+
225+ dut = csr .Multiplexer (memory_map , shadow_overlaps = shadow_overlaps )
235226 bus = dut .bus
236227
237228 def sim_test ():
@@ -309,38 +300,14 @@ def sim_test():
309300
310301
311302class MultiplexerAlignedTestCase (unittest .TestCase ):
312- def setUp (self ):
313- self .dut = csr .Multiplexer (addr_width = 16 , data_width = 8 , alignment = 2 )
314-
315- def test_add_two (self ):
316- elem_0 = csr .Element ( 8 , "rw" , path = ("elem_0" ,))
317- elem_1 = csr .Element (16 , "rw" , path = ("elem_1" ,))
318- self .assertEqual (self .dut .add (elem_0 , name = "elem_0" ), (0 , 4 ))
319- self .assertEqual (self .dut .add (elem_1 , name = "elem_1" ), (4 , 8 ))
320-
321- def test_over_align_to (self ):
322- elem_0 = csr .Element (8 , "rw" , path = ("elem_0" ,))
323- elem_1 = csr .Element (8 , "rw" , path = ("elem_1" ,))
324- self .assertEqual (self .dut .add (elem_0 , name = "elem_0" ), (0 , 4 ))
325- self .assertEqual (self .dut .align_to (3 ), 8 )
326- self .assertEqual (self .dut .add (elem_1 , name = "elem_1" ), (8 , 12 ))
327-
328- def test_under_align_to (self ):
329- elem_0 = csr .Element (8 , "rw" , path = ("elem_0" ,))
330- elem_1 = csr .Element (8 , "rw" , path = ("elem_1" ,))
331- self .assertEqual (self .dut .add (elem_0 , name = "elem_0" ), (0 , 4 ))
332- self .assertEqual (self .dut .align_to (alignment = 1 ), 4 )
333- self .assertEqual (self .dut .add (elem_1 , name = "elem_1" ), (4 , 8 ))
334-
335303 def test_sim (self ):
336304 for shadow_overlaps in [None , 0 , 1 ]:
337305 with self .subTest (shadow_overlaps = shadow_overlaps ):
338- dut = csr .Multiplexer (addr_width = 16 , data_width = 8 , alignment = 2 ,
339- shadow_overlaps = shadow_overlaps )
340-
341306 elem_20_rw = csr .Element (20 , "rw" , path = ("elem_20_rw" ,))
342- dut .add (elem_20_rw , name = "elem_20_rw" )
307+ memory_map = MemoryMap (addr_width = 16 , data_width = 8 , alignment = 2 )
308+ memory_map .add_resource (elem_20_rw , name = "elem_20_rw" , size = 3 )
343309
310+ dut = csr .Multiplexer (memory_map , shadow_overlaps = shadow_overlaps )
344311 bus = dut .bus
345312
346313 def sim_test ():
@@ -392,7 +359,7 @@ def test_add_wrong_sub_bus(self):
392359 self .dut .add (sub_bus = 1 )
393360
394361 def test_add_wrong_data_width (self ):
395- mux = csr .Multiplexer (addr_width = 10 , data_width = 16 )
362+ mux = csr .Multiplexer (MemoryMap ( addr_width = 10 , data_width = 16 ) )
396363 Fragment .get (mux , platform = None ) # silence UnusedElaboratable
397364
398365 with self .assertRaisesRegex (ValueError ,
@@ -409,14 +376,19 @@ def test_add_wrong_out_of_bounds(self):
409376 self .dut .add (iface )
410377
411378 def test_sim (self ):
412- mux_1 = csr .Multiplexer (addr_width = 10 , data_width = 8 )
413379 elem_1 = csr .Element (8 , "rw" , path = ("elem_1" ,))
414- mux_1 .add (elem_1 , name = "elem_1" )
415- self .dut .add (mux_1 .bus )
416-
417- mux_2 = csr .Multiplexer (addr_width = 10 , data_width = 8 )
418380 elem_2 = csr .Element (8 , "rw" , path = ("elem_2" ,))
419- mux_2 .add (elem_2 , name = "elem_2" , addr = 2 )
381+
382+ memory_map_1 = MemoryMap (addr_width = 10 , data_width = 8 )
383+ memory_map_1 .add_resource (elem_1 , name = "elem_1" , size = 1 )
384+
385+ memory_map_2 = MemoryMap (addr_width = 10 , data_width = 8 )
386+ memory_map_2 .add_resource (elem_2 , name = "elem_2" , size = 1 , addr = 2 )
387+
388+ mux_1 = csr .Multiplexer (memory_map_1 )
389+ mux_2 = csr .Multiplexer (memory_map_2 )
390+
391+ self .dut .add (mux_1 .bus )
420392 self .dut .add (mux_2 .bus )
421393
422394 elem_1_info = self .dut .bus .memory_map .find_resource (elem_1 )
0 commit comments