code: def convert_qnn_conv2d(attrs, inputs, tinfos, desired_layouts):
      """Convert Layout pass registration for QNN conv2d op.
  
      Parameters
      ----------
      attrs : tvm.ir.Attrs
          Attributes of current convolution
      inputs : list of tvm.relay.Expr
          The args of the Relay expr to be legalized
      tinfos : list of types
          List of input and output types
      desired_layouts : list of layout strings
          List of layouts defining our desired
          layout for the data and kernel inputs respectively.
  
      Returns
      -------
      result : tvm.relay.Expr
          The transformed expr
      """
      # pylint: disable=import-outside-toplevel
      from tvm import relay
  
      assert (
          len(desired_layouts) == 2
      ), "A desired layout is expected for both of qnn.conv2d's inputs"
      desired_data_layout, desired_kernel_layout = map(
          str, desired_layouts
      )
      assert (
          desired_data_layout != "default"
      ), "Data layout cannot be default"
  
      new_attrs = dict(attrs)
      new_attrs["data_layout"] = desired_data_layout
  
      if desired_kernel_layout != "default":
          new_attrs["kernel_layout"] = desired_kernel_layout
          return relay.qnn.op.conv2d(*inputs, **new_attrs)
  
      if desired_data_layout == "NCHW":
          new_attrs["kernel_layout"] = "OIHW"
          return relay.qnn.op.conv2d(*inputs, **new_attrs)
      if desired_data_layout == "NHWC":
          # Check for depthwise convolution.
          data_info = tinfos[0]
          weight_info = tinfos[1]
          if is_depthwise_conv2d(
              data_info.shape,
              attrs["data_layout"],
              weight_info.shape,
              attrs["kernel_layout"],
              attrs["groups"],
          ):
              new_attrs["kernel_layout"] = "HWOI"
          else:
              new_attrs["kernel_layout"] = "HWIO"
          return relay.qnn.op.conv2d(*inputs, **new_attrs)
  
      raise ValueError(
          f"Layout {desired_data_layout} is not yet supported"
      )
  
imports: from __future__ import absolute_import
  from tvm.relay.op import op
  from ...op.strategy.generic import is_depthwise_conv2d
label_desc: Use image node_id 1 for calling a global function with example usage: convert_qnn_conv2d(attrs, inputs, tinfos, desired_layouts) and returns: relay, relay, relay