From 6af98efea5681026d2d158fa138f1bb4e487afaa Mon Sep 17 00:00:00 2001 From: Yaman Umuroglu <maltanar@gmail.com> Date: Tue, 26 Jul 2022 16:39:28 +0200 Subject: [PATCH] [Test] broaden scope of Downsampler tests --- .../test_fpgadataflow_downsampler.py | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/tests/fpgadataflow/test_fpgadataflow_downsampler.py b/tests/fpgadataflow/test_fpgadataflow_downsampler.py index 8b5c5c77f..11e5cca28 100644 --- a/tests/fpgadataflow/test_fpgadataflow_downsampler.py +++ b/tests/fpgadataflow/test_fpgadataflow_downsampler.py @@ -50,17 +50,24 @@ from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode -def build_model(is_1d, in_dim, k, stride, dt_in, dt_w, pad_half=0): +def build_model(is_1d, in_dim, k, stride, dt_in, dt_w, pad_half=0, flip_1d=False): np.random.seed(0) out_dim = compute_conv_output_dim(in_dim, k, stride, 2 * pad_half) ifm = 8 ofm = 16 if is_1d: - shape_in = [1, ifm, in_dim, 1] - shape_out = [1, ofm, out_dim, 1] - shape_k = [k, 1] - shape_s = [stride, 1] - shape_p = [pad_half, 0, pad_half, 0] + if flip_1d: + shape_in = [1, ifm, 1, in_dim] + shape_out = [1, ofm, 1, out_dim] + shape_k = [1, k] + shape_s = [1, stride] + shape_p = [0, pad_half, 0, pad_half] + else: + shape_in = [1, ifm, in_dim, 1] + shape_out = [1, ofm, out_dim, 1] + shape_k = [k, 1] + shape_s = [stride, 1] + shape_p = [pad_half, 0, pad_half, 0] else: shape_in = [1, ifm, in_dim, in_dim] shape_out = [1, ofm, out_dim, out_dim] @@ -101,19 +108,25 @@ def build_model(is_1d, in_dim, k, stride, dt_in, dt_w, pad_half=0): return model -@pytest.mark.parametrize("is_1d", [False]) -@pytest.mark.parametrize("exec_mode", ["cppsim"]) -def test_fpgadataflow_downsampler(is_1d, exec_mode): +@pytest.mark.parametrize("is_1d", [True, False]) +@pytest.mark.parametrize("flip_1d", [True, False]) +@pytest.mark.parametrize("exec_mode", ["cppsim", "rtlsim"]) +def test_fpgadataflow_downsampler(is_1d, flip_1d, exec_mode): + if flip_1d and not is_1d: + pytest.skip("flip_1d only applicable for is_1d") in_dim = 32 k = 1 stride = 2 dt_in = DataType["UINT8"] dt_w = DataType["INT2"] - model = build_model(is_1d, in_dim, k, stride, dt_in, dt_w) + model = build_model( + is_1d, in_dim, k, stride, dt_in, dt_w, pad_half=0, flip_1d=flip_1d + ) inp = gen_finn_dt_tensor(dt_in, model.get_tensor_shape("in0")) idict = {"in0": inp} y_expected = execute_onnx(model, idict)["out0"] model = model.transform(to_hls.InferConvInpGen()) + assert len(model.get_nodes_by_op_type("DownSampler")) == 1 if exec_mode == "cppsim": model = model.transform(SetExecMode("cppsim")) model = model.transform(PrepareCppSim()) @@ -127,14 +140,18 @@ def test_fpgadataflow_downsampler(is_1d, exec_mode): else: raise Exception("Unknown exec_mode") y_produced = execute_onnx(model, idict)["out0"] - assert len(model.get_nodes_by_op_type("DownSampler")) == 1 assert (y_produced == y_expected).all() - if exec_mode == "rtlsim": node = model.get_nodes_by_op_type("DownSampler")[0] inst = getCustomOp(node) cycles_rtlsim = inst.get_nodeattr("cycles_rtlsim") exp_cycles_dict = model.analysis(exp_cycles_per_layer) exp_cycles = exp_cycles_dict[node.name] + # small adjustment for 2D testcase due to how rtlsim works: + # output is finished before all pixels are read, since last + # row is dropped (rtlsim finishes based on # of expected + # pixels) + if not is_1d: + exp_cycles = exp_cycles - in_dim assert np.isclose(exp_cycles, cycles_rtlsim, atol=10) assert exp_cycles != 0 -- GitLab