diff --git a/tests/fpgadataflow/test_layer_streaming_maxpool_batch.py b/tests/fpgadataflow/test_layer_streaming_maxpool_batch.py index 884e64e06cace43e92c7a62073f59aa00f0d9c0e..313748bff930a06ccc68b8f06c0f24be178990f0 100644 --- a/tests/fpgadataflow/test_layer_streaming_maxpool_batch.py +++ b/tests/fpgadataflow/test_layer_streaming_maxpool_batch.py @@ -35,19 +35,22 @@ import finn.core.onnx_exec as oxe from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper +from finn.custom_op.general.maxpoolnhwc import compute_pool_output_dim # from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim +from finn.transformation.fpgadataflow.convert_to_hls_layers import InferStreamingMaxPool from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames +from finn.transformation.infer_shapes import InferShapes from finn.util.basic import gen_finn_dt_tensor -def make_single_maxpoolnhwc_modelwrapper(k, ifm_ch, ifm_dim, ofm_dim, idt): +def make_single_maxpoolnhwc_modelwrapper(k, ifm_ch, ifm_dim, ofm_dim, idt, ceil_mode): k_h, k_w = k ifm_dim_h, ifm_dim_w = ifm_dim ofm_dim_h, ofm_dim_w = ofm_dim @@ -66,6 +69,7 @@ def make_single_maxpoolnhwc_modelwrapper(k, ifm_ch, ifm_dim, ofm_dim, idt): domain="finn.custom_op.general", kernel_shape=[k_h, k_w], strides=[k_h, k_w], + ceil_mode=ceil_mode, pads=[0, 0, 0, 0], ) graph = helper.make_graph( @@ -81,7 +85,9 @@ def make_single_maxpoolnhwc_modelwrapper(k, ifm_ch, ifm_dim, ofm_dim, idt): return model -def make_single_streamingmaxpool_modelwrapper(k, ifm_ch, pe, ifm_dim, ofm_dim, idt): +def make_single_streamingmaxpool_modelwrapper( + k, ifm_ch, pe, ifm_dim, ofm_dim, idt, ceil_mode +): k_h, k_w = k ifm_dim_h, ifm_dim_w = ifm_dim ofm_dim_h, ofm_dim_w = ofm_dim @@ -103,6 +109,7 @@ def make_single_streamingmaxpool_modelwrapper(k, ifm_ch, pe, ifm_dim, ofm_dim, i NumChannels=ifm_ch, PE=pe, ImgDim=[ifm_dim_h, ifm_dim_w], + CeilMode=ceil_mode, dataType=idt.name, ) graph = helper.make_graph( @@ -129,16 +136,20 @@ def prepare_inputs(input_tensor): # kernel size @pytest.mark.parametrize("k", [2, 4]) # input dimension -@pytest.mark.parametrize("ifm_dim", [4, 8]) +@pytest.mark.parametrize("ifm_dim", [4, 10]) # input channels @pytest.mark.parametrize("ifm_ch", [1, 3]) # 1,3 # pe @pytest.mark.parametrize("pe", [1, 3]) +# ceil mode +@pytest.mark.parametrize("ceil_mode", [1]) # execution mode @pytest.mark.parametrize("exec_mode", ["rtlsim", "cppsim"]) @pytest.mark.slow @pytest.mark.vivado -def test_fpgadataflow_streamingmaxpool(idt, dim_1d, k, ifm_dim, ifm_ch, pe, exec_mode): +def test_fpgadataflow_streamingmaxpool( + idt, dim_1d, k, ifm_dim, ifm_ch, pe, ceil_mode, exec_mode +): ifm_dim_h = ifm_dim k_h = k if dim_1d: @@ -152,12 +163,12 @@ def test_fpgadataflow_streamingmaxpool(idt, dim_1d, k, ifm_dim, ifm_ch, pe, exec stride_h = k_h stride_w = k_w - ofm_dim_h = int(((ifm_dim_h - k_h) / stride_h) + 1) - ofm_dim_w = int(((ifm_dim_w - k_w) / stride_w) + 1) + ofm_dim_h = compute_pool_output_dim(ifm_dim_h, k_h, stride_h, 0, ceil_mode) + ofm_dim_w = compute_pool_output_dim(ifm_dim_w, k_w, stride_w, 0, ceil_mode) ofm_dim = (ofm_dim_h, ofm_dim_w) if idt == DataType["BIPOLAR"] and dim_1d: pytest.skip("Skipping binary StreamingMaxPool_1d (not implemented)") - if ifm_dim_h % k_h != 0 or ifm_dim_w % k_w != 0: + if (ifm_dim_h % k_h != 0 or ifm_dim_w % k_w != 0) and (not dim_1d): pytest.skip("Skipping StreamingMaxPool test w/ ImgDim % PoolDim != 0") if pe > ifm_ch: pytest.skip("SIMD cannot be larger than number of input channels") @@ -166,12 +177,13 @@ def test_fpgadataflow_streamingmaxpool(idt, dim_1d, k, ifm_dim, ifm_ch, pe, exec # prepare input data input_dict = prepare_inputs(x) - golden = make_single_maxpoolnhwc_modelwrapper(k, ifm_ch, ifm_dim, ofm_dim, idt) + golden = make_single_maxpoolnhwc_modelwrapper( + k, ifm_ch, ifm_dim, ofm_dim, idt, ceil_mode + ) y_expected = oxe.execute_onnx(golden, input_dict)["outp"] - model = make_single_streamingmaxpool_modelwrapper( - k, ifm_ch, pe, ifm_dim, ofm_dim, idt - ) + model = golden.transform(InferStreamingMaxPool()) + model = model.transform(InferShapes()) if exec_mode == "cppsim": model = model.transform(SetExecMode("cppsim"))