|
| 1 | +from pyrtl.core import set_working_block |
1 | 2 | import unittest
|
2 | 3 | import pyrtl
|
3 | 4 | from pyrtl import transform
|
@@ -257,6 +258,70 @@ def test_replace_only_dst_wire(self):
|
257 | 258 | self.assertEqual(w4_dst_net.args, (w4, w2))
|
258 | 259 | self.assertEqual(w4_dst_net.dests, w1_dst_net.dests)
|
259 | 260 |
|
| 261 | +class TestCloning(unittest.TestCase): |
| 262 | + def setUp(self): |
| 263 | + pyrtl.reset_working_block() |
| 264 | + |
| 265 | + def test_clone_wire_no_or_same_name_same_block(self): |
| 266 | + for clone_name in (None, 'a'): |
| 267 | + a = pyrtl.WireVector(1, 'a') |
| 268 | + self.assertEqual(a.name, 'a') |
| 269 | + self.assertEqual(pyrtl.working_block().wirevector_set, {a}) |
| 270 | + self.assertIs(pyrtl.working_block().wirevector_by_name['a'], a) |
| 271 | + |
| 272 | + w = pyrtl.clone_wire(a, name=clone_name) |
| 273 | + self.assertTrue(a.name.startswith("tmp")) |
| 274 | + self.assertEqual(w.name, 'a') |
| 275 | + self.assertIs(pyrtl.working_block().wirevector_by_name['a'], w) |
| 276 | + self.assertEqual(pyrtl.working_block().wirevector_set, {a, w}) |
| 277 | + |
| 278 | + w.name = 'w' |
| 279 | + self.assertEqual(w.name, 'w') |
| 280 | + self.assertIs(pyrtl.working_block().wirevector_by_name['w'], w) |
| 281 | + |
| 282 | + pyrtl.working_block().remove_wirevector(a) |
| 283 | + self.assertEqual(pyrtl.working_block().wirevector_set, {w}) |
| 284 | + pyrtl.reset_working_block() |
| 285 | + |
| 286 | + def test_clone_wire_no_or_same_name_different_block(self): |
| 287 | + for clone_name in (None, 'a'): |
| 288 | + a = pyrtl.WireVector(1, 'a') |
| 289 | + b = pyrtl.Block() |
| 290 | + with pyrtl.set_working_block(b): |
| 291 | + w = pyrtl.clone_wire(a, name=clone_name) |
| 292 | + |
| 293 | + self.assertEqual(a.name, 'a') |
| 294 | + self.assertIs(pyrtl.working_block().wirevector_by_name['a'], a) |
| 295 | + self.assertEqual(pyrtl.working_block().wirevector_set, {a}) |
| 296 | + |
| 297 | + self.assertEqual(w.name, 'a') |
| 298 | + self.assertIs(b.wirevector_by_name['a'], w) |
| 299 | + self.assertEqual(b.wirevector_set, {w}) |
| 300 | + pyrtl.reset_working_block() |
| 301 | + |
| 302 | + def test_clone_wire_with_different_name_same_block(self): |
| 303 | + a = pyrtl.WireVector(1, 'a') |
| 304 | + w = pyrtl.clone_wire(a, 'w') |
| 305 | + self.assertEqual(a.name, 'a') |
| 306 | + self.assertEqual(w.name, 'w') |
| 307 | + self.assertIs(pyrtl.working_block().wirevector_by_name['a'], a) |
| 308 | + self.assertEqual(pyrtl.working_block().wirevector_set, {a, w}) |
| 309 | + |
| 310 | + pyrtl.working_block().remove_wirevector(a) |
| 311 | + self.assertEqual(pyrtl.working_block().wirevector_set, {w}) |
| 312 | + |
| 313 | + def test_clone_wire_with_different_name_different_block(self): |
| 314 | + a = pyrtl.WireVector(1, 'a') |
| 315 | + b = pyrtl.Block() |
| 316 | + with set_working_block(b): |
| 317 | + w = pyrtl.clone_wire(a, 'w') |
| 318 | + self.assertEqual(a.name, 'a') |
| 319 | + self.assertEqual(w.name, 'w') |
| 320 | + self.assertIs(pyrtl.working_block().wirevector_by_name['a'], a) |
| 321 | + self.assertEqual(pyrtl.working_block().wirevector_set, {a}) |
| 322 | + self.assertIs(b.wirevector_by_name['w'], w) |
| 323 | + self.assertEqual(b.wirevector_set, {w}) |
| 324 | + |
260 | 325 |
|
261 | 326 | # this code needs mocking from python 3's unittests to work
|
262 | 327 | """
|
|
0 commit comments