class_docstr: Target device information, use through TVM API.
  
  Note
  ----
  You can create target using the constructor or the following functions
  
  - :py:func:`tvm.target.arm_cpu` create arm_cpu target
  - :py:func:`tvm.target.cuda` create CUDA target
  - :py:func:`tvm.target.rocm` create ROCM target
  - :py:func:`tvm.target.mali` create Mali target
  - :py:func:`tvm.target.intel_graphics` create Intel Graphics target
class_docstr_tok: ["Target","device","information",",","use","through","TVM","API",".","Note","--","--","You","can","create","target","using","the","constructor","or","the","following","functions","-",":","py",":","func",":","`","tvm.target.arm_cpu","`","create","arm_cpu","target","-",":","py",":","func",":","`","tvm.target.cuda","`","create","CUDA","target","-",":","py",":","func",":","`","tvm.target.rocm","`","create","ROCM","target","-",":","py",":","func",":","`","tvm.target.mali","`","create","Mali","target","-",":","py",":","func",":","`","tvm.target.intel_graphics","`","create","Intel","Graphics","target"]
docstr: Returns a TVM Target capturing target and target_host. Also returns the host in
  canonical form. The given target can be in any form recognized by
  Target.canon_target. If given, target_host can be in any form recognized by
  Target.canon_target. If target_host is given it will be set as the 'host' in the
  result Target object (and a warning given).
  
  Note that this method does not support heterogeneous compilation targets.
docstr_tok: ["Returns","a","TVM","Target","capturing","target","and","target_host",".","Also","returns","the","host","in","canonical","form",".","The","given","target","can","be","in","any","form","recognized","by","Target.canon_target",".","If","given",",","target_host","can","be","in","any","form","recognized","by","Target.canon_target",".","If","target_host","is","given","it","will","be","set","as","the","'host","'","in","the","result","Target","object","(","and","a","warning","given",")",".","Note","that","this","method","does","not","support","heterogeneous","compilation","targets","."]
code: def canon_target_and_host(target, target_host=None):
      """Returns a TVM Target capturing target and target_host. Also returns the host in
      canonical form. The given target can be in any form recognized by
      Target.canon_target. If given, target_host can be in any form recognized by
      Target.canon_target. If target_host is given it will be set as the 'host' in the
      result Target object (and a warning given).
  
      Note that this method does not support heterogeneous compilation targets.
      """
      target = Target.canon_target(target)
      if target is None:
          assert (
              target_host is None
          ), "Target host is not empty when target is empty."
          return target, target_host
      if target.host is None and target_host is not None:
          warnings.warn(
              "target_host parameter is going to be deprecated. "
              "Please pass in tvm.target.Target(target, host=target_host) instead."
          )
          target_host = Target.canon_target(target_host)
          target = target.with_host(target_host)
      if target is not None:
          # In case the target already had a host, extract it here.
          target_host = target.host
      return target, target_host
  
imports: import json
  import re
  import warnings
  from typing import Union
  import tvm._ffi
  from tvm._ffi import register_func
  from tvm._ffi.runtime_ctypes import Device
  from tvm.runtime import Object, convert
  from tvm.runtime.container import String
  from tvm.ir.container import Map, Array
  from .None import _ffi_api
label_desc: Use image node_id 29 for calling the Target obj's underlying member method code with example usage: obj.canon_target_and_host(target, target_host) and returns: target,  target_host, target,  target_host