def test_float16_input_output_with_opset_version_inference(self):
        """
        Input graph:

        main(%x: (1, 1, 4, 4, fp16)(Tensor)) {
          block0() {
            %pixel_unshuffle_0: (1, 4, 2, 2, fp16)(Tensor) = pixel_unshuffle(x=%x, downscale_factor=2, name="pixel_unshuffle_0")
          } -> (%pixel_unshuffle_0)
        }

        This function would be inferred as an iOS16 function, and the graph pass should behave properly
        """
        @mb.program(input_specs=[mb.TensorSpec(shape=(1, 1, 4, 4), dtype=types.fp16)])
        def prog(x):
            x = mb.pixel_unshuffle(x=x, downscale_factor=np.uint32(2))
            return x

        prev_prog, prev_block, block = apply_pass_and_basic_check(
            prog, "mil_backend::adjust_io_to_supported_types"
        )

        prev_inputs = list(prev_block.inputs.items())
        inputs = list(block.inputs.items())
        prev_outputs = prev_block.outputs
        outputs = block.outputs
        assert prev_inputs[0][1].name == inputs[0][1].name
        assert outputs[0].name == prev_outputs[0].name
        assert get_op_types_in_program(prog) == ['pixel_unshuffle']
        assert inputs[0][1].dtype == types.fp16
        assert block.outputs[0].dtype == types.fp16

        Input graph:

        main(%x: (1, 1, 4, 4, fp16)(Tensor)) {
          block0() {
            %pixel_unshuffle_0: (1, 4, 2, 2, fp16)(Tensor) = pixel_unshuffle(x=%x, downscale_factor=2, name="pixel_unshuffle_0")
          } -> (%pixel_unshuffle_0)
        }

        This function would be inferred as an iOS16 function, and the graph pass should behave properly
        
coremltools/converters/mil/backend/mil/passes/test_passes.py