class_docstr: Traverses the graph to determine consumers that are NPU operations and
  which have restrictions to use NHCWB16 layout. The result is maintained in
  `npu_consumers` and `restrictions`.
  
  Attributes
  ----------
  npu_consumers : Dict[tvm.relay.expr.Call, List[bool]]
      Mapping from NPU operation to list of boolean values that represent
      whether or not each consumer is an NPU operation.
  restrictions : Dict[tvm.relay.expr.Call, List[bool]]
      Mapping from NPU operation to list of boolean values that represent
      whether or not operation has restrictions to use NHCWB16 layout.
  optimize_ops : Dict[str, Callable]
      A map from NPU operation name to function that creates NPU operation.
code: def __init__(self, optimize_ops):
      self.npu_consumers = defaultdict(list)
      self.restrictions = defaultdict(list)
      self.optimize_ops = optimize_ops
      super().__init__()
  
imports: from collections import defaultdict
  from typing import List, Callable
  from ethosu.vela import api
  import tvm
  from tvm import relay
  from tvm.relay.backend.contrib.ethosu.tir.compiler import LowerToTIR
  from tvm.relay.backend.contrib.ethosu.tir.scheduler import copy_constants
  from tvm.contrib.ethosu.cascader import cascade, EthosuDeviceConfig, CascaderOptions, MemoryRegion, extract_memory_info
  from tvm.relay.backend.contrib.ethosu.legalize import LegalizeEthosU
  from tvm.relay.backend.contrib.ethosu import tir_to_cs_translator, util, vela_api
  from tvm.relay.expr_functor import ExprMutator, ExprVisitor, Call
  from tvm.relay import expr
  from tvm.relay.backend.contrib.ethosu.op import op_attrs
  from tvm.relay.backend.contrib.ethosu import op
  from .None import _ffi_api
label_desc: Use image node_id 1 to create a new AnalyzeConsumers object from inherited base classes: ExprVisitor with example: obj = AnalyzeConsumers(optimize_ops)