code: def reset(self, reset_type=None):
          
          self.notify(Notification(event=Target.EVENT_PRE_RESET, source=self))
  
          reset_type = self._get_actual_reset_type(reset_type)
  
          self._run_token += 1
  
          # Give the delegate a chance to overide reset. If the delegate returns True, then it
          # handled the reset on its own.
          if not self.call_delegate('will_reset', core=self, reset_type=reset_type):
              self._perform_reset(reset_type)
  
          self.call_delegate('did_reset', core=self, reset_type=reset_type)
          
          # Now wait for the system to come out of reset. Keep reading the DHCSR until
          # we get a good response with S_RESET_ST cleared, or we time out.
          with timeout.Timeout(2.0) as t_o:
              while t_o.check():
                  try:
                      dhcsr = self.read32(CortexM.DHCSR)
                      if (dhcsr & CortexM.S_RESET_ST) == 0:
                          break
                  except exceptions.TransferError:
                      self.flush()
                      sleep(0.01)
  
          self.notify(Notification(event=Target.EVENT_POST_RESET, source=self))
docs: ! @brief Reset the core.
          
          The reset method is selectable via the reset_type parameter as well as the reset_type
          session option. If the reset_type parameter is not specified or None, then the reset_type
          option will be used. If the option is not set, or if it is set to a value of 'default', the
          the core's default_reset_type property value is used. So, the session option overrides the
          core's default, while the parameter overrides everything.
          
          Note that only v7-M cores support the `VECTRESET` software reset method. If this method
          is chosen but the core doesn't support it, the the reset method will fall back to an
          emulated software reset.
          
          After a call to this function, the core is running.