def test_href_equality(self):
     top = sdn.Instance()
     top_def = sdn.Definition()
     top.reference = top_def
     middle = top_def.create_child()
     middle_def = sdn.Definition()
     middle.reference = middle_def
     leaf = middle_def.create_child()
     leaf_def = sdn.Definition()
     leaf.reference = leaf_def
     sequence = [top, middle, leaf]
     href1 = HRef.from_sequence(sequence)
     href2 = HRef.from_sequence(sequence)
     self.assertEqual(href1, href1)
     self.assertNotEqual(href1, None)
     self.assertEqual(href1, href2)
     self.assertNotEqual(href1, href2.parent)
     href3 = HRef.from_sequence(sequence[1:])
     self.assertNotEqual(href1, href3)
 def test_href_pin_name(self):
     top = sdn.Instance()
     top.name = "TOP"
     top_def = sdn.Definition()
     top.reference = top_def
     port = top_def.create_port()
     port.name = "PORT"
     port.create_pins(1)
     port.is_array = True
     wire = port.pins[0]
     sequence = [top, port, wire]
     self.assertEqual("PORT[0]", HRef.from_sequence(sequence).name)
 def test_href_wire_name(self):
     top = sdn.Instance()
     top.name = "TOP"
     top_def = sdn.Definition()
     top.reference = top_def
     cable = top_def.create_cable()
     cable.name = "CABLE"
     cable.create_wires(1)
     cable.is_array = True
     wire = cable.wires[0]
     sequence = [top, cable, wire]
     self.assertEqual("CABLE[0]", HRef.from_sequence(sequence).name)
    def test_is_unique(self):
        netlist = sdn.Netlist()
        library = netlist.create_library()
        definition1 = library.create_definition()
        instance1 = definition1.create_child()

        definition2 = library.create_definition()
        instance2a = definition2.create_child()
        instance2a.reference = definition1
        instance2b = definition2.create_child()
        instance2b.reference = definition1

        instance3 = sdn.Instance()
        instance3.reference = definition2
        netlist.top_instance = instance3

        href1 = HRef.from_sequence([instance3, instance2a, instance1])
        href2 = HRef.from_sequence([instance3, instance2b, instance1])

        # Another test for test_flyweight stuffed in here :)
        self.assertTrue(href1.parent.parent is href2.parent.parent)
        self.assertTrue(href1.is_valid)
        self.assertTrue(href2.is_valid)
        self.assertFalse(href2.is_unique)

        self.assertFalse(href1.is_unique)
        definition2.remove_child(instance2b)
        self.assertFalse(href2.is_valid)
        self.assertFalse(href2.is_unique)
        self.assertTrue(href1.is_unique)

        definition4 = library.create_definition()
        definition4.add_child(instance2b)
        instance4 = sdn.Instance()
        instance4.reference = definition4
        definition2.add_child(instance4)
        self.assertFalse(href1.is_unique)
    def test_href_str_and_repr(self):
        netlist = sdn.Netlist()
        library = netlist.create_library()
        definition = library.create_definition()
        instance = sdn.Instance()
        instance.reference = definition
        netlist.top_instance = instance

        cable = definition.create_cable()
        cable.name = "MY_CABLE"
        cable.create_wires(8)
        href = HRef.from_sequence([instance, cable])
        href_str = str(href)
        self.assertTrue(href_str == "MY_CABLE")
        href_repr = repr(href)
        self.assertTrue(HRef.__name__ in href_repr)
        self.assertTrue(cable.__class__.__name__ in href_repr)
    def test_flyweight(self):
        instance = sdn.Instance()
        href1 = HRef.from_parent_and_item(None, instance)
        href2 = HRef.from_parent_and_item(None, instance)
        self.assertTrue(href1 is href2)
        import weakref
        w_href1 = weakref.ref(href1)
        w_href2 = weakref.ref(href2)
        href1 = None
        href2 = None
        import gc
        gc.collect()
        self.assertIsNone(w_href1())
        self.assertIsNone(w_href2())

        instance2 = sdn.Instance()
        href1 = HRef.from_sequence([instance, instance2])
        href2_parent = HRef(instance, None)
        href2 = HRef.from_parent_and_item(href2_parent, instance2)
        self.assertTrue(href1 is href2)
    def test_href_valid(self):
        instance = sdn.Instance()
        href = HRef.from_parent_and_item(None, instance)
        self.assertFalse(href.is_valid)

        definition = sdn.Definition()
        instance.reference = definition
        self.assertFalse(href.is_valid)

        library = sdn.Library()
        library.add_definition(definition)
        self.assertFalse(href.is_valid)

        netlist = sdn.Netlist()
        netlist.add_library(library)
        self.assertFalse(href.is_valid)

        netlist.top_instance = instance
        self.assertTrue(href.is_valid)

        cable = sdn.Cable()
        wire = sdn.Wire()

        href = HRef.from_sequence([instance, cable, wire])
        self.assertFalse(href.is_valid)

        cable.add_wire(wire)
        self.assertFalse(href.is_valid)

        definition.add_cable(cable)
        self.assertTrue(href.is_valid)

        instance.reference = None
        self.assertFalse(href.is_valid)

        port = sdn.Port()
        pin  = sdn.InnerPin()

        href = HRef.from_sequence([instance, port, pin])
        self.assertFalse(href.is_valid)

        port.add_pin(pin)
        self.assertFalse(href.is_valid)

        definition.add_port(port)
        self.assertFalse(href.is_valid)

        instance.reference = definition
        self.assertTrue(href.is_valid)

        higher_definition = library.create_definition()
        higher_definition.add_child(instance)
        self.assertTrue(href.is_valid)

        higher_instance = sdn.Instance()
        higher_instance.reference = higher_definition
        netlist.top_instance = higher_instance
        self.assertFalse(href.is_valid)

        href = HRef.from_sequence([higher_instance, instance, cable, wire])
        self.assertTrue(href.is_valid)
        higher_instance.reference = None
        self.assertFalse(href.is_valid)
        higher_definition.remove_child(instance)
        self.assertFalse(href.is_valid)

        definition.remove_cable(cable)
        self.assertFalse(href.is_valid)

        cable.remove_wire(wire)
        self.assertFalse(href.is_valid)

        cable.add_wire(wire)
        href = HRef.from_sequence([cable, wire])
        self.assertFalse(href.is_valid)

        cable.remove_wire(wire)
        new_cable = sdn.Cable()
        new_cable.add_wire(wire)
        self.assertFalse(href.is_valid)

        href = HRef.from_parent_and_item(None, wire)
        self.assertFalse(href.is_valid)

        port.remove_pin(pin)
        new_port = sdn.Port()
        new_port.add_pin(pin)
        href = HRef.from_sequence([port, pin])
        self.assertFalse(href.is_valid)

        href = HRef.from_parent_and_item(None, pin)
        self.assertFalse(href.is_valid)

        href = HRef.from_parent_and_item(None, definition)
        self.assertFalse(href.is_valid)