code: def wrap(tensor, books=None, tensor_shape=None):
    
    if books is None:
      books = bookkeeper.for_default_graph()
    if isinstance(tensor, PrettyTensor):
      return tensor.as_layer()
    elif isinstance(tensor, UnboundVariable):
  
      def set_input_from_unbound_var(data):
        """Sets the input from the given unbound_var."""
        if data is not None:
          return wrap(data, books)
        else:
          return None
  
      return _DeferredLayer(books, set_input_from_unbound_var, [tensor], {})
    else:
      tensor = tf.convert_to_tensor(tensor, name='input')
      if tensor_shape:
        _set_shape_on_tensor(tensor, tensor_shape)
      return Layer(books, tensor=tensor, name=tensor.name)
docs: Creates an input layer representing the given tensor.
  
    Args:
      tensor: The tensor.
      books: The bookkeeper; this is usually not required unless you are building
        multiple `tf.Graphs.`
      tensor_shape: An optional shape that will be set on the Tensor or verified
        to match the tensor.
    Returns:
      A layer.