import pytest
from elasticai.creator.ir2vhdl import LoweringPass, Shape, edge, vhdl_node
from elasticai.creator_plugins.time_multiplexed_sequential.src import (
network as _network_handler,
)
from elasticai.creator_plugins.time_multiplexed_sequential.src import (
sequential,
)
from .high_level_network import network
[docs]
@pytest.fixture
def lower():
_lower = LoweringPass()
_lower.register(sequential)
_lower.register_iterable(_network_handler)
return _lower
[docs]
def test_first_shift_reg_has_three_output_wires():
in_channels = 2
length = 4
_net = network(
input_shape=(in_channels, length), kernel_size=2, out_channels=2, stride=1
)
lowered = sequential(_net)
node = lowered.nodes["shift_register_i0"]
assert node.output_shape == (2, 2)
[docs]
def test_shift_reg_predecessor_is_conv1():
in_channels = 2
length = 4
_net = network(
input_shape=(in_channels, length), kernel_size=2, out_channels=2, stride=1
)
lowered = sequential(_net)
p = {n.name for n in (iter(lowered.successors("shift_register_i0").values()))}
assert p == {"conv1_i0"}
[docs]
class TestsForSecondConv:
[docs]
def network(self):
return network(input_shape=(3, 2), kernel_size=1, out_channels=3, stride=1)
[docs]
def get_hl_conv(self):
pass
[docs]
def test_high_and_low_level_have_same_in_channels(self):
_net = self.network()
hl_conv1 = _net.nodes["conv1_i0"]
lowered = sequential(_net)
low_level_conv1 = lowered.nodes["conv1_i0"]
assert low_level_conv1.input_shape.depth == hl_conv1.input_shape.depth
[docs]
def test_add_correct_edges(lower):
net = network(
input_shape=(2, 7),
kernel_size=3,
out_channels=1,
)
lowered = tuple(lower([net]))[0]
edges = tuple(lowered.edges.values())
expected = (
edge(
src="input",
dst="conv0_i0",
src_dst_indices=tuple(),
),
edge(
src="conv0_i0",
dst="striding_shift_register_i0",
src_dst_indices=tuple(),
),
edge(
src="striding_shift_register_i0",
dst="conv1_i0",
src_dst_indices=tuple(),
),
edge(src="conv1_i0", dst="output", src_dst_indices=tuple()),
)
assert edges == expected
[docs]
def test_generates_adapter_for_addressing_skeleton(lower):
lowered = {
i.name: i
for i in lower(
[
network(
input_shape=(1, 4),
kernel_size=4,
out_channels=1,
),
]
)
}
adapter = lowered["buffered_network_wrapper"]
assert adapter.attributes["generic_map"] == {
"KERNEL_SIZE": "4",
"STRIDE": "2",
}
[docs]
def test_generates_adapter_for_addressing_skeleton_with_varied_parameters(lower):
in_channels = 2
width = 10
kernel_size = 3
expected_adapter_kernel_size = kernel_size * in_channels
expected_adapter_stride = in_channels
lowered = {
i.name: i
for i in lower(
[
network(
input_shape=(in_channels, width),
kernel_size=kernel_size,
out_channels=4,
stride=1,
),
]
)
}
adapter = lowered["buffered_network_wrapper"]
assert adapter.attributes["generic_map"] == {
"KERNEL_SIZE": str(expected_adapter_kernel_size),
"STRIDE": str(expected_adapter_stride),
}