Пример #1
0
    def test_removes_sinkless_filters(self):
        """Test that making a netlist correctly filters out passthrough Nodes
        with no outgoing connections.
        """
        # Create the first operator
        object_a = mock.Mock(name="object A")
        vertex_a = mock.Mock(name="vertex A")
        load_fn_a = mock.Mock(name="load function A")
        pre_fn_a = mock.Mock(name="pre function A")
        post_fn_a = mock.Mock(name="post function A")

        operator_a = mock.Mock(name="operator A")
        operator_a.make_vertices.return_value = \
            netlistspec(vertex_a, load_fn_a, pre_fn_a, post_fn_a)

        # Create the second operator
        object_b = mock.Mock(name="object B")
        operator_b = operators.Filter(16)  # Shouldn't need building

        # Create the model, add the items and add an entry to the connection
        # map.
        model = Model()
        model.object_operators[object_a] = operator_a
        model.object_operators[object_b] = operator_b
        model.connection_map.add_connection(operator_a, None,
                                            SignalParameters(), None,
                                            operator_b, None, None)
        netlist = model.make_netlist(1)

        # The netlist should contain vertex a and no nets
        assert netlist.nets == list()
        assert netlist.vertices == [vertex_a]
Пример #2
0
    def test_calls_add_default_keyspace(self):
        """Test that creating a netlist assigns from default keyspace to the
        network.
        """
        # Create a model and patch out the default keyspace and the connection
        # map.
        default_ks = mock.Mock()
        model = Model(keyspaces={"nengo": default_ks})

        # Create the netlist, ensure that this results in a call to
        # `add_default_keyspace'
        with mock.patch.object(model.connection_map,
                               "add_default_keyspace") as f:
            model.make_netlist()

        f.assert_called_once_with(default_ks)
    def test_removes_sinkless_filters(self):
        """Test that making a netlist correctly filters out passthrough Nodes
        with no outgoing connections.
        """
        # Create the first operator
        object_a = mock.Mock(name="object A")
        vertex_a = mock.Mock(name="vertex A")
        load_fn_a = mock.Mock(name="load function A")
        pre_fn_a = mock.Mock(name="pre function A")
        post_fn_a = mock.Mock(name="post function A")

        operator_a = mock.Mock(name="operator A")
        operator_a.make_vertices.return_value = \
            netlistspec(vertex_a, load_fn_a, pre_fn_a, post_fn_a)

        # Create the second operator
        object_b = mock.Mock(name="object B")
        operator_b = operators.Filter(16)  # Shouldn't need building

        # Create the model, add the items and add an entry to the connection
        # map.
        model = Model()
        model.object_operators[object_a] = operator_a
        model.object_operators[object_b] = operator_b
        model.connection_map.add_connection(
            operator_a, None, SignalParameters(), None,
            operator_b, None, None
        )
        netlist = model.make_netlist(1)

        # The netlist should contain vertex a and no nets
        assert netlist.nets == list()
        assert netlist.vertices == [vertex_a]
    def test_calls_add_default_keyspace(self):
        """Test that creating a netlist assigns from default keyspace to the
        network.
        """
        # Create a model and patch out the default keyspace and the connection
        # map.
        default_ks = mock.Mock()
        model = Model(keyspaces={"nengo": default_ks})

        # Create the netlist, ensure that this results in a call to
        # `add_default_keyspace'
        with mock.patch.object(model.connection_map,
                               "add_default_keyspace") as f:
            model.make_netlist()

        f.assert_called_once_with(default_ks)
Пример #5
0
    def test_single_vertices(self):
        """Test that operators which produce single vertices work correctly and
        that all functions and signals are correctly collected and included in
        the final netlist.
        """
        # Create the first operator
        vertex_a = mock.Mock(name="vertex A")
        load_fn_a = mock.Mock(name="load function A")
        pre_fn_a = mock.Mock(name="pre function A")
        post_fn_a = mock.Mock(name="post function A")

        object_a = mock.Mock(name="object A")
        operator_a = mock.Mock(name="operator A")
        operator_a.make_vertices.return_value = \
            netlistspec(vertex_a, load_fn_a, pre_fn_a, post_fn_a)

        # Create the second operator
        vertex_b = mock.Mock(name="vertex B")
        load_fn_b = mock.Mock(name="load function B")

        object_b = mock.Mock(name="object B")
        operator_b = mock.Mock(name="operator B")
        operator_b.make_vertices.return_value = \
            netlistspec(vertex_b, load_fn_b)

        # Create a signal between the operators
        keyspace = mock.Mock(name="keyspace")
        keyspace.length = 32
        signal_ab = Signal(ObjectPort(operator_a, None),
                           ObjectPort(operator_b, None),
                           keyspace=keyspace, weight=43)

        # Create the model, add the items and then generate the netlist
        model = Model()
        model.object_operators[object_a] = operator_a
        model.object_operators[object_b] = operator_b
        model.connections_signals[None] = signal_ab
        netlist = model.make_netlist()

        # Check that the make_vertices functions were called
        operator_a.make_vertices.assert_called_once_with(model)
        operator_b.make_vertices.assert_called_once_with(model)

        # Check that the netlist is as expected
        assert len(netlist.nets) == 1
        for net in netlist.nets:
            assert net.source is vertex_a
            assert net.sinks == [vertex_b]
            assert net.keyspace is keyspace
            assert net.weight == signal_ab.weight

        assert set(netlist.vertices) == set([vertex_a, vertex_b])
        assert netlist.keyspaces is model.keyspaces
        assert netlist.groups == list()
        assert set(netlist.load_functions) == set([load_fn_a, load_fn_b])
        assert netlist.before_simulation_functions == [pre_fn_a]
        assert netlist.after_simulation_functions == [post_fn_a]
Пример #6
0
    def test_extra_operators_and_signals(self):
        """Test the operators and signals in the extra_operators and
        extra_signals lists are included when building netlists.
        """
        # Create the first operator
        vertex_a = mock.Mock(name="vertex A")
        load_fn_a = mock.Mock(name="load function A")
        pre_fn_a = mock.Mock(name="pre function A")
        post_fn_a = mock.Mock(name="post function A")

        operator_a = mock.Mock(name="operator A")
        operator_a.make_vertices.return_value = \
            netlistspec(vertex_a, load_fn_a, pre_fn_a, post_fn_a)

        # Create the second operator
        vertex_b = mock.Mock(name="vertex B")
        load_fn_b = mock.Mock(name="load function B")

        operator_b = mock.Mock(name="operator B")
        operator_b.make_vertices.return_value = \
            netlistspec(vertex_b, load_fn_b)

        # Create a signal between the operators
        keyspace = mock.Mock(name="keyspace")
        keyspace.length = 32
        signal_ab = Signal(ObjectPort(operator_a, None),
                           ObjectPort(operator_b, None),
                           keyspace=keyspace, weight=43)

        # Create the model, add the items and then generate the netlist
        model = Model()
        model.extra_operators = [operator_a, operator_b]
        model.extra_signals = [signal_ab]
        netlist = model.make_netlist()

        # Check that the make_vertices functions were called
        operator_a.make_vertices.assert_called_once_with(model)
        operator_b.make_vertices.assert_called_once_with(model)

        # Check that the netlist is as expected
        assert len(netlist.nets) == 1
        for net in netlist.nets:
            assert net.source is vertex_a
            assert net.sinks == [vertex_b]
            assert net.keyspace is keyspace
            assert net.weight == signal_ab.weight

        assert set(netlist.vertices) == set([vertex_a, vertex_b])
        assert netlist.keyspaces is model.keyspaces
        assert netlist.groups == list()
        assert set(netlist.load_functions) == set([load_fn_a, load_fn_b])
        assert netlist.before_simulation_functions == [pre_fn_a]
        assert netlist.after_simulation_functions == [post_fn_a]
Пример #7
0
    def test_multiple_sink_vertices(self):
        # Create the first operator
        vertex_a = mock.Mock(name="vertex A")
        load_fn_a = mock.Mock(name="load function A")
        pre_fn_a = mock.Mock(name="pre function A")
        post_fn_a = mock.Mock(name="post function A")

        object_a = mock.Mock(name="object A")
        operator_a = mock.Mock(name="operator A")
        operator_a.make_vertices.return_value = \
            netlistspec(vertex_a, load_fn_a, pre_fn_a, post_fn_a)

        # Create the second operator
        vertex_b0 = mock.Mock(name="vertex B0")
        vertex_b1 = mock.Mock(name="vertex B1")
        load_fn_b = mock.Mock(name="load function B")

        object_b = mock.Mock(name="object B")
        operator_b = mock.Mock(name="operator B")
        operator_b.make_vertices.return_value = \
            netlistspec([vertex_b0, vertex_b1], load_fn_b)

        # Create a signal between the operators
        keyspace = mock.Mock(name="keyspace")
        keyspace.length = 32
        signal_ab = Signal(ObjectPort(operator_a, None),
                           ObjectPort(operator_b, None),
                           keyspace=keyspace, weight=3)

        # Create the model, add the items and then generate the netlist
        model = Model()
        model.object_operators[object_a] = operator_a
        model.object_operators[object_b] = operator_b
        model.connections_signals[None] = signal_ab
        netlist = model.make_netlist()

        # Check that the netlist is as expected
        assert set(netlist.vertices) == set([vertex_a, vertex_b0, vertex_b1])
        assert len(netlist.nets) == 1
        for net in netlist.nets:
            assert net.source is vertex_a
            assert net.sinks == [vertex_b0, vertex_b1]
            assert net.keyspace is keyspace
            assert net.weight == signal_ab.weight

        # Check that the groups are correct
        assert netlist.groups == [set([vertex_b0, vertex_b1])]
Пример #8
0
    def test_extra_operators_and_signals(self):
        """Test the operators in the extra_operators list are included when
        building netlists.
        """
        # Create the first operator
        vertex_a = mock.Mock(name="vertex A")
        load_fn_a = mock.Mock(name="load function A")
        pre_fn_a = mock.Mock(name="pre function A")
        post_fn_a = mock.Mock(name="post function A")

        operator_a = mock.Mock(name="operator A", spec_set=["make_vertices"])
        operator_a.make_vertices.return_value = \
            netlistspec((vertex_a, ), load_fn_a, pre_fn_a, post_fn_a)

        # Create the second operator
        vertex_b = mock.Mock(name="vertex B")
        load_fn_b = mock.Mock(name="load function B")

        operator_b = mock.Mock(name="operator B", spec_set=["make_vertices"])
        operator_b.make_vertices.return_value = \
            netlistspec((vertex_b, ), load_fn_b)

        # Create the model, add the items and then generate the netlist
        model = Model()
        model.extra_operators = [operator_a, operator_b]
        netlist = model.make_netlist()

        # Check that the make_vertices functions were called
        operator_a.make_vertices.assert_called_once_with(model)
        operator_b.make_vertices.assert_called_once_with(model)

        # Check that the netlist is as expected
        assert len(netlist.nets) == 0

        assert netlist.operator_vertices == {
            operator_a: (vertex_a, ),
            operator_b: (vertex_b, ),
        }
        assert netlist.keyspaces is model.keyspaces
        assert len(netlist.constraints) == 0
        assert set(netlist.load_functions) == set([load_fn_a, load_fn_b])
        assert netlist.before_simulation_functions == [pre_fn_a]
        assert netlist.after_simulation_functions == [post_fn_a]
Пример #9
0
    def test_extra_operators_and_signals(self):
        """Test the operators in the extra_operators list are included when
        building netlists.
        """
        # Create the first operator
        vertex_a = mock.Mock(name="vertex A")
        load_fn_a = mock.Mock(name="load function A")
        pre_fn_a = mock.Mock(name="pre function A")
        post_fn_a = mock.Mock(name="post function A")

        operator_a = mock.Mock(name="operator A", spec_set=["make_vertices"])
        operator_a.make_vertices.return_value = \
            netlistspec((vertex_a, ), load_fn_a, pre_fn_a, post_fn_a)

        # Create the second operator
        vertex_b = mock.Mock(name="vertex B")
        load_fn_b = mock.Mock(name="load function B")

        operator_b = mock.Mock(name="operator B", spec_set=["make_vertices"])
        operator_b.make_vertices.return_value = \
            netlistspec((vertex_b, ), load_fn_b)

        # Create the model, add the items and then generate the netlist
        model = Model()
        model.extra_operators = [operator_a, operator_b]
        netlist = model.make_netlist()

        # Check that the make_vertices functions were called
        operator_a.make_vertices.assert_called_once_with(model)
        operator_b.make_vertices.assert_called_once_with(model)

        # Check that the netlist is as expected
        assert len(netlist.nets) == 0

        assert netlist.operator_vertices == {
            operator_a: (vertex_a, ),
            operator_b: (vertex_b, ),
        }
        assert netlist.keyspaces is model.keyspaces
        assert len(netlist.constraints) == 0
        assert set(netlist.load_functions) == set([load_fn_a, load_fn_b])
        assert netlist.before_simulation_functions == [pre_fn_a]
        assert netlist.after_simulation_functions == [post_fn_a]
Пример #10
0
    def test_multiple_source_vertices(self):
        """Test that each of the vertices associated with a source is correctly
        included in the sources of a net.
        """
        class MyVertexSlice(VertexSlice):
            def __init__(self, *args, **kwargs):
                super(MyVertexSlice, self).__init__(*args, **kwargs)
                self.args = None

            def transmits_signal(self, signal_parameters,
                                 transmission_parameters):
                self.args = (signal_parameters, transmission_parameters)
                return False

        # Create the first operator
        vertex_a0 = VertexSlice(slice(0, 1))
        vertex_a1 = VertexSlice(slice(1, 2))
        vertex_a2 = MyVertexSlice(slice(2, 3))
        load_fn_a = mock.Mock(name="load function A")
        pre_fn_a = mock.Mock(name="pre function A")
        post_fn_a = mock.Mock(name="post function A")

        object_a = mock.Mock(name="object A")
        operator_a = mock.Mock(name="operator A", spec_set=["make_vertices"])
        operator_a.make_vertices.return_value = \
            netlistspec([vertex_a0, vertex_a1, vertex_a2],
                        load_fn_a, pre_fn_a, post_fn_a)

        # Create the second operator
        vertex_b = Vertex()
        load_fn_b = mock.Mock(name="load function B")

        object_b = mock.Mock(name="object B")
        operator_b = mock.Mock(name="operator B", spec_set=["make_vertices"])
        operator_b.make_vertices.return_value = \
            netlistspec((vertex_b, ), load_fn_b)

        # Create a signal between the operators
        keyspace = mock.Mock(name="keyspace")
        keyspace.length = 32
        signal_ab_parameters = SignalParameters(keyspace=keyspace, weight=43)

        # Create the model, add the items and then generate the netlist
        model = Model()
        model.object_operators[object_a] = operator_a
        model.object_operators[object_b] = operator_b
        model.connection_map.add_connection(
            operator_a, None, signal_ab_parameters, None,
            operator_b, None, None
        )
        netlist = model.make_netlist()

        # Check that the netlist is as expected
        assert netlist.operator_vertices == {
            operator_a: (vertex_a0, vertex_a1, vertex_a2),
            operator_b: (vertex_b, ),
        }
        assert len(netlist.nets) == 1
        for net in itervalues(netlist.nets):
            assert net.sources == [vertex_a0, vertex_a1]
            assert net.sinks == [vertex_b]

        assert len(netlist.constraints) == 0

        # Check that `transmit_signal` was called correctly
        sig, tp = vertex_a2.args
        assert sig.keyspace is keyspace
        assert tp is None
Пример #11
0
    def test_multiple_sink_vertices(self):
        """Test that each of the vertices associated with a sink is correctly
        included in the sinks of a net.
        """
        # Create the first operator
        vertex_a = mock.Mock(name="vertex A")
        load_fn_a = mock.Mock(name="load function A")
        pre_fn_a = mock.Mock(name="pre function A")
        post_fn_a = mock.Mock(name="post function A")

        object_a = mock.Mock(name="object A")
        operator_a = mock.Mock(name="operator A", spec_set=["make_vertices"])
        operator_a.make_vertices.return_value = \
            netlistspec((vertex_a, ), load_fn_a, pre_fn_a, post_fn_a)

        # Create the second operator
        vertex_b0 = mock.Mock(name="vertex B0")
        vertex_b1 = mock.Mock(name="vertex B1")
        load_fn_b = mock.Mock(name="load function B")

        object_b = mock.Mock(name="object B")
        operator_b = mock.Mock(name="operator B", spec_set=["make_vertices"])
        operator_b.make_vertices.return_value = \
            netlistspec([vertex_b0, vertex_b1], load_fn_b)

        # Create a third operator, which won't accept the signal
        vertex_c = mock.Mock(name="vertex C")
        vertex_c.accepts_signal.side_effect = lambda _, __: False

        object_c = mock.Mock(name="object C")
        operator_c = mock.Mock(name="operator C", spec_set=["make_vertices"])
        operator_c.make_vertices.return_value = netlistspec((vertex_c, ))

        # Create a signal between the operators
        keyspace = mock.Mock(name="keyspace")
        keyspace.length = 32
        signal_ab_parameters = SignalParameters(keyspace=keyspace, weight=3)

        # Create the model, add the items and then generate the netlist
        model = Model()
        model.object_operators[object_a] = operator_a
        model.object_operators[object_b] = operator_b
        model.object_operators[object_c] = operator_c
        model.connection_map.add_connection(
            operator_a, None, signal_ab_parameters, None,
            operator_b, None, None
        )
        model.connection_map.add_connection(
            operator_a, None, signal_ab_parameters, None,
            operator_c, None, None
        )
        netlist = model.make_netlist()

        # Check that the "accepts_signal" method of vertex_c was called with
        # reasonable arguments
        assert vertex_c.accepts_signal.called

        # Check that the netlist is as expected
        assert netlist.operator_vertices == {
            operator_a: (vertex_a, ),
            operator_b: (vertex_b0, vertex_b1),
            operator_c: (vertex_c, ),
        }
        assert len(netlist.nets) == 1
        for net in itervalues(netlist.nets):
            assert net.sources == [vertex_a]
            assert net.sinks == [vertex_b0, vertex_b1]
            assert net.weight == signal_ab_parameters.weight

        assert len(netlist.constraints) == 0
Пример #12
0
    def test_single_vertices(self):
        """Test that operators which produce single vertices work correctly and
        that all functions and signals are correctly collected and included in
        the final netlist.
        """
        # Create the first operator
        vertex_a = mock.Mock(name="vertex A")
        load_fn_a = mock.Mock(name="load function A")
        pre_fn_a = mock.Mock(name="pre function A")
        post_fn_a = mock.Mock(name="post function A")
        constraint_a = mock.Mock(name="Constraint B")

        object_a = mock.Mock(name="object A")
        operator_a = mock.Mock(name="operator A", spec_set=["make_vertices"])
        operator_a.make_vertices.return_value = \
            netlistspec((vertex_a, ), load_fn_a, pre_fn_a, post_fn_a,
                        constraint_a)

        # Create the second operator
        vertex_b = mock.Mock(name="vertex B")
        load_fn_b = mock.Mock(name="load function B")
        constraint_b = mock.Mock(name="Constraint B")

        object_b = mock.Mock(name="object B")
        operator_b = mock.Mock(name="operator B", spec_set=["make_vertices"])
        operator_b.make_vertices.return_value = \
            netlistspec((vertex_b, ), load_fn_b, constraints=[constraint_b])

        # Create a signal between the operators
        keyspace = mock.Mock(name="keyspace")
        keyspace.length = 32
        signal_ab_parameters = SignalParameters(keyspace=keyspace, weight=43)

        # Create the model, add the items and then generate the netlist
        model = Model()
        model.object_operators[object_a] = operator_a
        model.object_operators[object_b] = operator_b
        model.connection_map.add_connection(
            operator_a, None, signal_ab_parameters, None,
            operator_b, None, None
        )
        netlist = model.make_netlist()

        # Check that the make_vertices functions were called
        operator_a.make_vertices.assert_called_once_with(model)
        operator_b.make_vertices.assert_called_once_with(model)

        # Check that the netlist is as expected
        assert len(netlist.nets) == 1
        for net in itervalues(netlist.nets):
            assert net.sources == [vertex_a]
            assert net.sinks == [vertex_b]
            assert net.weight == signal_ab_parameters.weight

        assert netlist.operator_vertices == {
            operator_a: (vertex_a, ),
            operator_b: (vertex_b, ),
        }

        assert netlist.keyspaces is model.keyspaces
        assert set(netlist.constraints) == set([constraint_a, constraint_b])
        assert set(netlist.load_functions) == set([load_fn_a, load_fn_b])
        assert netlist.before_simulation_functions == [pre_fn_a]
        assert netlist.after_simulation_functions == [post_fn_a]
Пример #13
0
    def test_multiple_source_vertices(self):
        """Test that each of the vertices associated with a source is correctly
        included in the sources of a net.
        """
        class MyVertexSlice(VertexSlice):
            def __init__(self, *args, **kwargs):
                super(MyVertexSlice, self).__init__(*args, **kwargs)
                self.args = None

            def transmits_signal(self, signal_parameters,
                                 transmission_parameters):
                self.args = (signal_parameters, transmission_parameters)
                return False

        # Create the first operator
        vertex_a0 = VertexSlice(slice(0, 1))
        vertex_a1 = VertexSlice(slice(1, 2))
        vertex_a2 = MyVertexSlice(slice(2, 3))
        load_fn_a = mock.Mock(name="load function A")
        pre_fn_a = mock.Mock(name="pre function A")
        post_fn_a = mock.Mock(name="post function A")

        object_a = mock.Mock(name="object A")
        operator_a = mock.Mock(name="operator A", spec_set=["make_vertices"])
        operator_a.make_vertices.return_value = \
            netlistspec([vertex_a0, vertex_a1, vertex_a2],
                        load_fn_a, pre_fn_a, post_fn_a)

        # Create the second operator
        vertex_b = Vertex()
        load_fn_b = mock.Mock(name="load function B")

        object_b = mock.Mock(name="object B")
        operator_b = mock.Mock(name="operator B", spec_set=["make_vertices"])
        operator_b.make_vertices.return_value = \
            netlistspec((vertex_b, ), load_fn_b)

        # Create a signal between the operators
        keyspace = mock.Mock(name="keyspace")
        keyspace.length = 32
        signal_ab_parameters = SignalParameters(keyspace=keyspace, weight=43)

        # Create the model, add the items and then generate the netlist
        model = Model()
        model.object_operators[object_a] = operator_a
        model.object_operators[object_b] = operator_b
        model.connection_map.add_connection(operator_a, None,
                                            signal_ab_parameters, None,
                                            operator_b, None, None)
        netlist = model.make_netlist()

        # Check that the netlist is as expected
        assert netlist.operator_vertices == {
            operator_a: (vertex_a0, vertex_a1, vertex_a2),
            operator_b: (vertex_b, ),
        }
        assert len(netlist.nets) == 1
        for net in itervalues(netlist.nets):
            assert net.sources == [vertex_a0, vertex_a1]
            assert net.sinks == [vertex_b]

        assert len(netlist.constraints) == 0

        # Check that `transmit_signal` was called correctly
        sig, tp = vertex_a2.args
        assert sig.keyspace is keyspace
        assert tp is None
Пример #14
0
    def test_multiple_sink_vertices(self):
        """Test that each of the vertices associated with a sink is correctly
        included in the sinks of a net.
        """
        # Create the first operator
        vertex_a = mock.Mock(name="vertex A")
        load_fn_a = mock.Mock(name="load function A")
        pre_fn_a = mock.Mock(name="pre function A")
        post_fn_a = mock.Mock(name="post function A")

        object_a = mock.Mock(name="object A")
        operator_a = mock.Mock(name="operator A", spec_set=["make_vertices"])
        operator_a.make_vertices.return_value = \
            netlistspec((vertex_a, ), load_fn_a, pre_fn_a, post_fn_a)

        # Create the second operator
        vertex_b0 = mock.Mock(name="vertex B0")
        vertex_b1 = mock.Mock(name="vertex B1")
        load_fn_b = mock.Mock(name="load function B")

        object_b = mock.Mock(name="object B")
        operator_b = mock.Mock(name="operator B", spec_set=["make_vertices"])
        operator_b.make_vertices.return_value = \
            netlistspec([vertex_b0, vertex_b1], load_fn_b)

        # Create a third operator, which won't accept the signal
        vertex_c = mock.Mock(name="vertex C")
        vertex_c.accepts_signal.side_effect = lambda _, __: False

        object_c = mock.Mock(name="object C")
        operator_c = mock.Mock(name="operator C", spec_set=["make_vertices"])
        operator_c.make_vertices.return_value = netlistspec((vertex_c, ))

        # Create a signal between the operators
        keyspace = mock.Mock(name="keyspace")
        keyspace.length = 32
        signal_ab_parameters = SignalParameters(keyspace=keyspace, weight=3)

        # Create the model, add the items and then generate the netlist
        model = Model()
        model.object_operators[object_a] = operator_a
        model.object_operators[object_b] = operator_b
        model.object_operators[object_c] = operator_c
        model.connection_map.add_connection(operator_a, None,
                                            signal_ab_parameters, None,
                                            operator_b, None, None)
        model.connection_map.add_connection(operator_a, None,
                                            signal_ab_parameters, None,
                                            operator_c, None, None)
        netlist = model.make_netlist()

        # Check that the "accepts_signal" method of vertex_c was called with
        # reasonable arguments
        assert vertex_c.accepts_signal.called

        # Check that the netlist is as expected
        assert netlist.operator_vertices == {
            operator_a: (vertex_a, ),
            operator_b: (vertex_b0, vertex_b1),
            operator_c: (vertex_c, ),
        }
        assert len(netlist.nets) == 1
        for net in itervalues(netlist.nets):
            assert net.sources == [vertex_a]
            assert net.sinks == [vertex_b0, vertex_b1]
            assert net.weight == signal_ab_parameters.weight

        assert len(netlist.constraints) == 0
Пример #15
0
    def test_single_vertices(self):
        """Test that operators which produce single vertices work correctly and
        that all functions and signals are correctly collected and included in
        the final netlist.
        """
        # Create the first operator
        vertex_a = mock.Mock(name="vertex A")
        load_fn_a = mock.Mock(name="load function A")
        pre_fn_a = mock.Mock(name="pre function A")
        post_fn_a = mock.Mock(name="post function A")
        constraint_a = mock.Mock(name="Constraint B")

        object_a = mock.Mock(name="object A")
        operator_a = mock.Mock(name="operator A", spec_set=["make_vertices"])
        operator_a.make_vertices.return_value = \
            netlistspec((vertex_a, ), load_fn_a, pre_fn_a, post_fn_a,
                        constraint_a)

        # Create the second operator
        vertex_b = mock.Mock(name="vertex B")
        load_fn_b = mock.Mock(name="load function B")
        constraint_b = mock.Mock(name="Constraint B")

        object_b = mock.Mock(name="object B")
        operator_b = mock.Mock(name="operator B", spec_set=["make_vertices"])
        operator_b.make_vertices.return_value = \
            netlistspec((vertex_b, ), load_fn_b, constraints=[constraint_b])

        # Create a signal between the operators
        keyspace = mock.Mock(name="keyspace")
        keyspace.length = 32
        signal_ab_parameters = SignalParameters(keyspace=keyspace, weight=43)

        # Create the model, add the items and then generate the netlist
        model = Model()
        model.object_operators[object_a] = operator_a
        model.object_operators[object_b] = operator_b
        model.connection_map.add_connection(operator_a, None,
                                            signal_ab_parameters, None,
                                            operator_b, None, None)
        netlist = model.make_netlist()

        # Check that the make_vertices functions were called
        operator_a.make_vertices.assert_called_once_with(model)
        operator_b.make_vertices.assert_called_once_with(model)

        # Check that the netlist is as expected
        assert len(netlist.nets) == 1
        for net in itervalues(netlist.nets):
            assert net.sources == [vertex_a]
            assert net.sinks == [vertex_b]
            assert net.weight == signal_ab_parameters.weight

        assert netlist.operator_vertices == {
            operator_a: (vertex_a, ),
            operator_b: (vertex_b, ),
        }

        assert netlist.keyspaces is model.keyspaces
        assert set(netlist.constraints) == set([constraint_a, constraint_b])
        assert set(netlist.load_functions) == set([load_fn_a, load_fn_b])
        assert netlist.before_simulation_functions == [pre_fn_a]
        assert netlist.after_simulation_functions == [post_fn_a]