code: def _propagate_nonreplaceable_vars(self):
      def propagate_nonreplaceable_vars_block(block):
          for op in list(block.operations):
              for b in op.blocks:
                  propagate_nonreplaceable_vars_block(b)
              if op.outputs is None:
                  continue
              for o in op.outputs:
                  o._reset_nonreplaceable_vars_upstream()
                  o._set_nonreplaceable_vars_upstream()
  
      propagate_nonreplaceable_vars_block(self)
  
imports: import copy
  from collections import Counter, OrderedDict
  from typing import Tuple
  from coremltools import _OPSET
  from coremltools import _logger
  from coremltools.converters.mil._deployment_compatibility import AvailableTarget
  from .None import SPACES, types
  from .operation import Operation
  from .types.symbolic import is_symbolic, k_used_symbols
  from .var import ComplexVar, InternalVar, Var
  from .visitors.dot_visitor import DotVisitor
label_desc: Use image node_id 21 for calling the Block obj's underlying member method code with example usage: obj._propagate_nonreplaceable_vars() without return types