diff --git a/test/pytest/test_keras_api.py b/test/pytest/test_keras_api.py index 606f2bc51d..d9ede0b699 100644 --- a/test/pytest/test_keras_api.py +++ b/test/pytest/test_keras_api.py @@ -175,36 +175,38 @@ def test_conv1d(test_case_id, padds, backend, strategy, io_type, synthesis_confi # 5e-2 might be too high np.testing.assert_allclose(hls_prediction, keras_prediction, rtol=0, atol=5e-2) - if not (backend in ['Vivado', 'Vitis'] and io_type == 'io_stream' and padds == 'same'): - # Vivado/Vitis inserts and additional layer for 'same' padding in io_stream - assert len(model.layers) + 2 == len(hls_model.get_layers()) - assert list(hls_model.get_layers())[1].attributes['name'] == model.layers[0]._name - assert list(hls_model.get_layers())[1].attributes['class_name'] == 'Conv1D' - assert list(hls_model.get_layers())[1].attributes['activation'] == str(model.layers[0].activation).split()[1] - assert list(hls_model.get_layers())[1].attributes['in_width'] == model.layers[0]._batch_input_shape[1] - assert list(hls_model.get_layers())[1].attributes['filt_width'] == model.layers[0].kernel_size[0] - assert list(hls_model.get_layers())[1].attributes['n_chan'] == model.layers[0].input_shape[2] - assert list(hls_model.get_layers())[1].attributes['n_filt'] == model.layers[0].filters - assert list(hls_model.get_layers())[1].attributes['stride_width'] == model.layers[0].strides[0] - assert list(hls_model.get_layers())[1].attributes['data_format'] == model.layers[0].data_format - assert list(hls_model.get_layers())[1].attributes['out_width'] == list(model.layers[0].output_shape)[1] - - out_width = math.ceil(float(model.layers[0]._batch_input_shape[2]) / float(model.layers[0].strides[0])) - pad_along_width = max( - (out_width - 1) * model.layers[0].strides[0] - + model.layers[0].kernel_size[0] - - model.layers[0]._batch_input_shape[2], - 0, - ) - pad_left = pad_along_width // 2 - pad_right = pad_along_width - pad_left + off = 0 + # Vitis/Vivado adds a padding layer after the input in the io_stream case + if backend in ['Vitis', 'Vivado'] and io_type == 'io_stream' and padds == 'same': + off = 1 + assert len(model.layers) + 2 + off == len(hls_model.get_layers()) + assert list(hls_model.get_layers())[1 + off].attributes['name'] == model.layers[0]._name + assert list(hls_model.get_layers())[1 + off].attributes['class_name'] == 'Conv1D' + assert list(hls_model.get_layers())[1 + off].attributes['activation'] == str(model.layers[0].activation).split()[1] + assert list(hls_model.get_layers())[1].attributes['in_width'] == model.layers[0]._batch_input_shape[1] + assert list(hls_model.get_layers())[1 + off].attributes['filt_width'] == model.layers[0].kernel_size[0] + assert list(hls_model.get_layers())[1 + off].attributes['n_chan'] == model.layers[0].input_shape[2] + assert list(hls_model.get_layers())[1 + off].attributes['n_filt'] == model.layers[0].filters + assert list(hls_model.get_layers())[1 + off].attributes['stride_width'] == model.layers[0].strides[0] + assert list(hls_model.get_layers())[1 + off].attributes['data_format'] == model.layers[0].data_format + assert list(hls_model.get_layers())[1 + off].attributes['out_width'] == list(model.layers[0].output_shape)[1] + + out_width = math.ceil(float(model.layers[0]._batch_input_shape[2]) / float(model.layers[0].strides[0])) + pad_along_width = max( + (out_width - 1) * model.layers[0].strides[0] + + model.layers[0].kernel_size[0] + - model.layers[0]._batch_input_shape[2], + 0, + ) + pad_left = pad_along_width // 2 + pad_right = pad_along_width - pad_left - if model.layers[0].padding == 'same': - assert list(hls_model.get_layers())[1].attributes['pad_left'] == pad_left - assert list(hls_model.get_layers())[1].attributes['pad_right'] == pad_right - elif model.layers[0].padding == 'valid': - assert list(hls_model.get_layers())[1].attributes['pad_left'] == 0 - assert list(hls_model.get_layers())[1].attributes['pad_right'] == 0 + if model.layers[0].padding == 'same': + assert list(hls_model.get_layers())[1].attributes['pad_left'] == pad_left + assert list(hls_model.get_layers())[1].attributes['pad_right'] == pad_right + elif model.layers[0].padding == 'valid': + assert list(hls_model.get_layers())[1 + off].attributes['pad_left'] == 0 + assert list(hls_model.get_layers())[1 + off].attributes['pad_right'] == 0 chans_options = ['channels_last']