class_docstr: Var represents the outputs of an Operation. Most Vars are derived from an
  Operation (including const), and all Vars must have `sym_type`.
  
  Example Usage:
  
  from coremltools.converters.mil.mil import Builder as mb
  from coremltools.converters.mil.mil import Function
  from coremltools.converters.mil.mil import types
  
  func_inputs = {"a": mb.placeholder(shape=(1,2)),
                 "b": mb.placeholder(shape=(1,2)) }
  with Function(func_inputs) as ssa_func:
      a, b = ssa_func.inputs["a"], ssa_func.inputs["b"]
      res = mb.add(x=a, y=b) # res is Var
      assert types.is_tensor(res.sym_type)
      assert res.rank == 2
      assert res.dtype == types.float # since a, b are by default float
  
      # value is not available at compile time in this  case. If
      # materializable, res.val would be a numpy / primitive value
      assert res.val is None
  
  
  Comment: Except InternalVar and Vars created in while_loop and by
  placeholder, all Var should only be constructed by Operation to represent
  outputs.
  
  Comment: Var hides the details of sym_type vs sym_val vs materialized
  value, which was represented by 2 objects prior to refactoring.
  
  
  # Properties:
  
  name: (str)
      name in MIL proto NamedValueType. Name is assigned by the parent
      Operation.
  
  sym_type [_sym_type]: (builtin type class)
      All Var must have a (possibly symbolic) type, usually derived from
      type inference of upstream ops or from default values in _Input.
  
  sym_val [_sym_val]: (builtin type instance)
      Possibly symbolic value.
  
  val [_sym_val]: (np.ndarray or python primitive scalar)
      Numpy (scalar / tensor) value. `val` is not None iff `sym_val` is
      not None and does not contain symbols.  Read-only.
  
  op [_op]: (Operation)
      The Operation this Var is derived from. May not be None except
      for InternalVar. Read-only.
  
  op_output_idx: (int)
      Idx of the output from Operation corresponding to _Input.  May be
      None.
  
  child_ops [_child_ops]: list[Operation]
      Ops that take this Var as an input.
code: def val(self):
      if self._sym_val is None or any_symbolic(self._sym_val.val):
          return None
      return self._sym_val.val
  
imports: from coremltools.converters.mil.mil import types
  from coremltools.converters.mil.mil.types.symbolic import is_symbolic, any_symbolic
label_desc: Use image node_id 7 for calling the Var obj's underlying member method code with example usage: obj.val() and returns: self, None