@@ -51,7 +51,8 @@ def insert_random_inversions(rate=0.5):
51
51
52
52
def randomly_replace (wire ):
53
53
if random .random () < rate :
54
- new_src , new_dst = transform .clone_wire (wire ), transform .clone_wire (wire )
54
+ new_src = transform .clone_wire (wire , pyrtl .wire .next_tempvar_name ())
55
+ new_dst = transform .clone_wire (wire , pyrtl .wire .next_tempvar_name ())
55
56
new_dst <<= ~ new_src
56
57
return new_src , new_dst
57
58
return wire , wire
@@ -263,26 +264,47 @@ class TestCloning(unittest.TestCase):
263
264
def setUp (self ):
264
265
pyrtl .reset_working_block ()
265
266
266
- def test_clone_wire_no_or_same_name_same_block (self ):
267
- for clone_name in ( None , 'a' ):
268
- a = pyrtl . WireVector ( 1 , 'a' )
269
- self . assertEqual ( a . name , 'a' )
270
- self .assertEqual ( pyrtl . working_block (). wirevector_set , { a } )
271
- self .assertIs ( pyrtl . working_block (). wirevector_by_name [ 'a' ], a )
267
+ def test_same_type (self ):
268
+ for ix , cls in enumerate ([ pyrtl . WireVector , pyrtl . Register , pyrtl . Input , pyrtl . Output ] ):
269
+ w1 = cls ( 4 , 'w%d' % ix )
270
+ w2 = pyrtl . clone_wire ( w1 , 'y%d' % ix )
271
+ self .assertIsInstance ( w2 , cls )
272
+ self .assertEqual ( w1 . bitwidth , w2 . bitwidth )
272
273
273
- w = pyrtl .clone_wire (a , name = clone_name )
274
- self .assertTrue (a .name .startswith ("tmp" ))
275
- self .assertEqual (w .name , 'a' )
276
- self .assertIs (pyrtl .working_block ().wirevector_by_name ['a' ], w )
277
- self .assertEqual (pyrtl .working_block ().wirevector_set , {a , w })
274
+ def test_clone_wire_no_name_same_block (self ):
275
+ a = pyrtl .WireVector (1 , 'a' )
276
+ with self .assertRaises (pyrtl .PyrtlError ) as error :
277
+ pyrtl .clone_wire (a )
278
+ self .assertEqual (
279
+ str (error .exception ),
280
+ "Must provide a name for the newly cloned wire "
281
+ "when cloning within the same block."
282
+ )
283
+
284
+ def test_clone_wire_same_name_same_block (self ):
285
+ a = pyrtl .WireVector (1 , 'a' )
286
+ with self .assertRaises (pyrtl .PyrtlError ) as error :
287
+ pyrtl .clone_wire (a , 'a' )
288
+ self .assertEqual (
289
+ str (error .exception ),
290
+ "Cannot give a newly cloned wire the same name as an existing wire."
291
+ )
292
+
293
+ def test_clone_wire_different_name_same_block (self ):
294
+ a = pyrtl .WireVector (1 , 'a' )
295
+ self .assertEqual (a .name , 'a' )
296
+ self .assertEqual (pyrtl .working_block ().wirevector_set , {a })
297
+ self .assertIs (pyrtl .working_block ().wirevector_by_name ['a' ], a )
278
298
279
- w .name = 'w'
280
- self .assertEqual (w .name , 'w' )
281
- self .assertIs (pyrtl .working_block ().wirevector_by_name ['w' ], w )
299
+ w = pyrtl .clone_wire (a , name = 'w' )
300
+ self .assertEqual (w .name , 'w' )
301
+ self .assertEqual (a .name , 'a' )
302
+ self .assertIs (pyrtl .working_block ().wirevector_by_name ['w' ], w )
303
+ self .assertIs (pyrtl .working_block ().wirevector_by_name ['a' ], a )
304
+ self .assertEqual (pyrtl .working_block ().wirevector_set , {a , w })
282
305
283
- pyrtl .working_block ().remove_wirevector (a )
284
- self .assertEqual (pyrtl .working_block ().wirevector_set , {w })
285
- pyrtl .reset_working_block ()
306
+ pyrtl .working_block ().remove_wirevector (a )
307
+ self .assertEqual (pyrtl .working_block ().wirevector_set , {w })
286
308
287
309
def test_clone_wire_no_or_same_name_different_block (self ):
288
310
for clone_name in (None , 'a' ):
@@ -300,18 +322,7 @@ def test_clone_wire_no_or_same_name_different_block(self):
300
322
self .assertEqual (b .wirevector_set , {w })
301
323
pyrtl .reset_working_block ()
302
324
303
- def test_clone_wire_with_different_name_same_block (self ):
304
- a = pyrtl .WireVector (1 , 'a' )
305
- w = pyrtl .clone_wire (a , 'w' )
306
- self .assertEqual (a .name , 'a' )
307
- self .assertEqual (w .name , 'w' )
308
- self .assertIs (pyrtl .working_block ().wirevector_by_name ['a' ], a )
309
- self .assertEqual (pyrtl .working_block ().wirevector_set , {a , w })
310
-
311
- pyrtl .working_block ().remove_wirevector (a )
312
- self .assertEqual (pyrtl .working_block ().wirevector_set , {w })
313
-
314
- def test_clone_wire_with_different_name_different_block (self ):
325
+ def test_clone_wire_different_name_different_block (self ):
315
326
a = pyrtl .WireVector (1 , 'a' )
316
327
b = pyrtl .Block ()
317
328
with set_working_block (b ):
0 commit comments