def METHOD_NAME(
    in_shape,  # [batchsize, in_channels]
    kernel_shape,  # [out_channels, num_inputs]
    input_zero_point,
    kernel_zero_point,
    input_scale,
    kernel_scale,
    output_zero_point,
    output_scale,
    dtype,
    kernel_dtype,
    bias_dtype,
    out_channels,
    enable_bias,
    relu_type="NONE",
):
    """Return a model and any parameters it may have"""
    input_ = relay.var("input", shape=in_shape, dtype=dtype)
    rng = np.random.default_rng(12321)
    kmin, kmax = get_dtype_range(kernel_dtype)
    weight = tvm.nd.array(
        rng.integers(
            kmin,
            high=kmax,
            size=kernel_shape,
            dtype=kernel_dtype,
        )
    )
    weight_const = relay.const(weight, kernel_dtype)
    dense = relay.qnn.op.dense(
        input_,
        weight_const,
        input_zero_point=relay.const(input_zero_point, "int32"),
        kernel_zero_point=relay.const(kernel_zero_point, "int32"),
        input_scale=relay.const(input_scale, "float32"),
        kernel_scale=relay.const(kernel_scale, "float32"),
        units=out_channels,
        out_dtype=bias_dtype,
    )
    bias = tvm.nd.array(rng.integers(0, high=10, size=(out_channels,), dtype=bias_dtype))
    bias_const = relay.const(bias, bias_dtype)
    last_op = relay.nn.bias_add(dense, bias_const) if enable_bias else dense
    requant_input_sc = input_scale * kernel_scale
    last_op = relay.qnn.op.requantize(
        last_op,
        relay.const(requant_input_sc, "float32"),
        relay.const(0, "int32"),
        relay.const(output_scale, "float32"),
        relay.const(output_zero_point, "int32"),
        out_dtype=dtype,
    )
    last_op = make_qnn_relu(last_op, relu_type, output_scale, output_zero_point, dtype)
    params = {"w": weight, "b": bias}
    return last_op, params