code: def tile(cls, op):
      # input tensor must have no unknown chunk shape
      if has_unknown_shape(*op.inputs):
          yield
  
      in_tensor = op.input
      is_in_tensor_tall = cls._is_tall(in_tensor)
  
      if op.val.ndim > 0:
          val = yield from cls._process_val(op.val, in_tensor, op.wrap)
      else:
          val = op.val
  
      if len(in_tensor.chunks) == 1:
          return cls._tile_one_chunk(op, val)
  
      if op.input.ndim == 2:
          if op.wrap and is_in_tensor_tall:
              from ..merge import concatenate
  
              sub_tensors = cls._split_tall_matrix(in_tensor)
              for i, sub_tensor in enumerate(sub_tensors):
                  if val.ndim > 0:
                      sub_val = val[
                          i
                          * sub_tensor.shape[1] : (i + 1)
                          * sub_tensor.shape[1]
                      ]
                  else:
                      sub_val = val
                  fill_diagonal(sub_tensor, sub_val, wrap=False)
              out_tensor = concatenate(sub_tensors)
              return [(yield from recursive_tile(out_tensor))]
          else:
              return (yield from cls._tile_2d(op, val))
      else:
          return (yield from cls._tile_nd(op, val))
  
imports: import numpy
  from ...None import opcodes
  from ...core import ENTITY_TYPE, recursive_tile
  from ...serialization.serializables import KeyField, AnyField, BoolField, Int32Field
  from ...utils import has_unknown_shape, ceildiv
  from ..operands import TensorOperand, TensorOperandMixin
  from ..datasource import tensor
  from ..array_utils import as_same_device, device
  from ..core import Tensor, TENSOR_TYPE
  from ..utils import decide_unify_split
label_desc: Use image node_id 15 for calling the TensorFillDiagonal obj's underlying member method code with example usage: obj.tile(cls, op) and returns: cls, unknown, list, unknown