code: def _parse_name(name: str, as_qvm: bool, noisy: bool) -> Tuple[str, str, bool]:
      
      parts = name.split('-')
      if len(parts) >= 2 and parts[-2] == 'noisy' and parts[-1] in ['qvm', 'pyqvm']:
          if as_qvm is not None and (not as_qvm):
              raise ValueError("The provided qc name indicates you are getting a noisy QVM, "
                               "but you have specified `as_qvm=False`")
  
          if noisy is not None and (not noisy):
              raise ValueError("The provided qc name indicates you are getting a noisy QVM, "
                               "but you have specified `noisy=False`")
  
          qvm_type = parts[-1]
          noisy = True
          prefix = '-'.join(parts[:-2])
          return prefix, qvm_type, noisy
  
      if len(parts) >= 1 and parts[-1] in ['qvm', 'pyqvm']:
          if as_qvm is not None and (not as_qvm):
              raise ValueError("The provided qc name indicates you are getting a QVM, "
                               "but you have specified `as_qvm=False`")
          qvm_type = parts[-1]
          if noisy is None:
              noisy = False
          prefix = '-'.join(parts[:-1])
          return prefix, qvm_type, noisy
  
      if as_qvm is not None and as_qvm:
          qvm_type = 'qvm'
      else:
          qvm_type = None
  
      if noisy is None:
          noisy = False
  
      return name, qvm_type, noisy
docs: Try to figure out whether we're getting a (noisy) qvm, and the associated qpu name.
  
      See :py:func:`get_qc` for examples of valid names + flags.