def METHOD_NAME(
    name,
    mem_type,
    banks=2,
):
    N = dace.symbol("N")
    M = dace.symbol("M")
    sdfg = dace.SDFG(name + "_" + mem_type)
    state = sdfg.add_state('red_' + mem_type, True)
    in1 = sdfg.add_array("in1", [banks, N, M], dace.float32)
    in2 = sdfg.add_array("in2", [banks, N, M], dace.float32)
    out = sdfg.add_array("out", [banks, N], dace.float32)
    in1[1].location["memorytype"] = mem_type
    in2[1].location["memorytype"] = mem_type
    out[1].location["memorytype"] = mem_type
    in1[1].location["bank"] = f"0:{banks}"
    in2[1].location["bank"] = f"{banks}:{2*banks}"
    out[1].location["bank"] = f"{2*banks}:{3*banks}"
    read_in1 = state.add_read("in1")
    read_in2 = state.add_read("in2")
    out_write = state.add_write("out")
    tmp_in1_memlet = dace.Memlet(f"in1[k, i, j]")
    tmp_in2_memlet = dace.Memlet(f"in2[k, i, j]")
    tmp_out_memlet = dace.Memlet(f"out[k, i]", wcr="lambda x,y: x+y")
    outer_entry, outer_exit = state.add_map("vadd_outer_map", dict(k=f'0:{banks}'))
    map_entry, map_exit = state.add_map("vadd_inner_map", dict(i="0:N", j="0:M"))
    tasklet = state.add_tasklet("mul", dict(__in1=None, __in2=None), dict(__out=None), '__out = __in1 * __in2')
    outer_entry.map.schedule = dace.ScheduleType.Unrolled
    state.add_memlet_path(read_in1, outer_entry, map_entry, tasklet, memlet=tmp_in1_memlet, dst_conn="__in1")
    state.add_memlet_path(read_in2, outer_entry, map_entry, tasklet, memlet=tmp_in2_memlet, dst_conn="__in2")
    state.add_memlet_path(tasklet, map_exit, outer_exit, out_write, memlet=tmp_out_memlet, src_conn="__out")
    sdfg.apply_fpga_transformations()
    return sdfg