code: def make_qnn_dense_pattern():
      """Make qnn.dense based pattern supported by DNNL
  
      Returns
      -------
      pattern : Tuple(pattern_name, CallPattern)
          Created pattern name, along with its CallPattern.
      """
      data = wildcard()
      weight = is_constant()
      bias = is_constant()
      o_scl = is_constant()
      dst_zp = is_constant()
      act_scl = is_constant()
      sum_scl = is_constant()
      sum_src = wildcard()
  
      zero_zp = is_expr(const(0, dtype="int32"))
  
      pat = is_op("qnn.dense")(
          data, weight, zero_zp, zero_zp, is_constant(), is_constant()
      )
      pat = is_op("cast")(pat)
      pat = is_op("add")(pat, bias) | pat  # optional bias
      pat = is_op("multiply")(pat, o_scl)
      pat = is_op("clip")(pat)  # TBD, not only clip
      pat = (
          is_op("multiply")(pat, act_scl) | pat
      )  # optional multiply. ex act_scl == 1
      pat = (
          is_op("add")(pat, sum_scl * is_op("cast")(sum_src)) | pat
      )  # optional sum
      pat = (
          is_op("add")(pat, dst_zp) | pat
      )  # optional dst_zp, can be dst_zp == 0
      pat = is_op("cast")(pat)
  
      return "dnnl.qnn.dense", pat
  
imports: import logging
  from functools import reduce
  import tvm.ir
  from tvm import relay
  from tvm.ir import Op
  from tvm.relay import expr
  from tvm.relay import transform
  from tvm.relay.analysis import analysis
  from tvm.relay.expr import Call, GlobalVar, TupleGetItem, const
  from tvm.relay.expr_functor import ExprMutator, ExprVisitor
  from ...None import _ffi_api
  from ...dataflow_pattern import DFPatternCallback, is_constant, is_expr, is_op, rewrite, wildcard
  from .register import register_pattern_table
label_desc: Use image node_id 15 for calling a global function with example usage: make_qnn_dense_pattern() and returns: str,  pat