code: def _alter_qnn_conv2d_layout(attrs, inputs, tinfos, _out_type):
      data_layout = attrs["data_layout"]
      kernel_layout = attrs["kernel_layout"]
      data_tensor, kernel_tensor, _, _, _, _ = tinfos
  
      if (
          "int8" in data_tensor.dtype
          and "int8" in kernel_tensor.dtype
          and data_layout == "NCHW"
          and kernel_layout == "OIHW"
      ):
          out_channel, in_channel, _, _ = get_const_tuple(
              kernel_tensor.shape
          )
  
          if out_channel % 32 != 0 or in_channel % 4 != 0:
              return None
  
          n_elems = 4
          oc_bn = 32
          ic_bn = min(in_channel, 32)
  
          new_attrs = dict(attrs)
          new_attrs["channels"] = out_channel
          new_attrs["data_layout"] = f"NCHW{ic_bn}c"
          new_attrs[
              "kernel_layout"
          ] = f"OIHW{ic_bn // n_elems:n}i{oc_bn:n}o{n_elems:n}i"
          new_attrs["out_layout"] = f"NCHW{oc_bn}c"
  
          return relay.qnn.op.conv2d(*inputs, **new_attrs)
  
      return None
  
imports: from tvm import relay
  from ...nn import qnn_conv2d_alter_layout
  from ...utils import get_const_tuple
label_desc: Use image node_id 1 for calling a global function with example usage: _alter_qnn_conv2d_layout(attrs, inputs, tinfos, _out_type) and returns: None, relay, None