code: def schedule_conv2d_spatial_pack_nhwc(cfg, s, op, output):
      """Spatial Pack schedule for Conv2d NHWC"""
      unpack = op.output(0)
      conv = unpack.op.input_tensors[0]
      data_vec = conv.op.input_tensors[0]
      kernel_vec = conv.op.input_tensors[1]
      data_pad = data_vec.op.input_tensors[0]
  
      OWI = cfg["tile_ow"].size[-1]
      OCI = cfg["tile_co"].size[-1]
  
      # schedule unpack/output
      if output != unpack:
          s[unpack].compute_inline()
      n, oh, ow, oc = s[output].op.axis
      oco, oci = cfg["tile_co"].apply(s, output, oc)
      oho, ohi = cfg["tile_oh"].apply(s, output, oh)
      owo, owi = cfg["tile_ow"].apply(s, output, ow)
      s[output].reorder(n, oho, owo, oco, ohi, owi, oci)
      cfg["ann_spatial"].apply(
          s,
          output,
          [owi, oci],
          axis_lens=[OWI, OCI],
          max_unroll=16,
          cfg=cfg,
      )
  
      cfg.define_knob("compat", [0, 1])
      compat_axis = [owo, oco][
          cfg["compat"].val
      ]  # pylint: disable=R1706
      s[conv].compute_at(s[output], compat_axis)
      paxis = s[output].fuse(n, oho)
      s[output].parallel(paxis)
  
      # schedule conv
      n, oho, owo, oco, ohi, owi, oci = s[conv].op.axis
      ic, kh, kw = s[conv].op.reduce_axis
      cfg["reorder_conv"].apply(
          s, conv, [n, oho, owo, oco, kh, kw, ic, ohi, owi, oci]
      )
      cfg["ann_reduce"].apply(
          s,
          conv,
          [kh, kw],
          axis_lens=[
              get_const_int(kh.dom.extent),
              get_const_int(kw.dom.extent),
          ],
          max_unroll=16,
          cfg=cfg,
      )
      cfg["ann_spatial"].apply(
          s,
          conv,
          [owi, oci],
          axis_lens=[OWI, OCI],
          max_unroll=16,
          cfg=cfg,
      )
  
      # schedule data_vec, data_pad and kernel_vec
      compat_axis = [owo, oco][
          cfg["compat"].val
      ]  # pylint: disable=R1706
      s[kernel_vec].compute_at(s[conv], compat_axis)
      s[data_vec].compute_at(s[conv], compat_axis)
  
      # Inlining kernel vec brings a performance improvement, but the tuner seems to not
      # like it, so inline only when we are using the fallback config
      if cfg.is_fallback:
          s[kernel_vec].compute_inline()
  
      if data_vec.op.name == "data_vec_undilated":
          n, oho, owo, kh, kw, ic, ohi, owi = s[data_vec].op.axis
      else:
          n, oho, owo, ohi, owi, ic = s[data_vec].op.axis
      s[data_pad].compute_at(s[data_vec], n)
  
      return s
  
file_path: tvm/python/tvm/topi/arm_cpu/conv2d_spatial_pack.py
imports: from __future__ import absolute_import
  import tvm
  from tvm import te
  from tvm import autotvm
  from tvm.target import Target
  from tvm.autotvm.task.space import SplitEntity, OtherOptionEntity, AnnotateEntity, ReorderEntity
  from ..None import nn
  from ..utils import get_const_tuple
  from ..nn.utils import get_const_int, get_pad_tuple
label_desc: Use image node_id 4 for calling a global function with example usage: schedule_conv2d_spatial_pack_nhwc(cfg, s, op, output) and returns: s