code: def validate(self, generator, axesToMove=None, **kwargs):
          # type: (AGenerator, AAxesToMove, **Any) -> AConfigureParams
          
          iterations = 10
          # We will return this, so make sure we fill in defaults
          for k, default in self._block.configure.defaults.items():
              if k not in kwargs:
                  kwargs[k] = default
          # The validated parameters we will eventually return
          params = ConfigureParams(generator, axesToMove, **kwargs)
          # Make some tasks just for validate
          part_contexts = self.create_part_contexts()
          # Get any status from all parts
          status_part_info = self.run_hooks(
              ReportStatusHook(p, c) for p, c in part_contexts.items())
          while iterations > 0:
              # Try up to 10 times to get a valid set of parameters
              iterations -= 1
              # Validate the params with all the parts
              validate_part_info = self.run_hooks(
                  ValidateHook(p, c, status_part_info, **kwargs)
                  for p, c, kwargs in self._part_params(part_contexts, params))
              tweaks = ParameterTweakInfo.filter_values(validate_part_info)
              if tweaks:
                  for tweak in tweaks:
                      deserialized = self._block.configure.takes.elements[
                          tweak.parameter].validate(tweak.value)
                      setattr(params, tweak.parameter, deserialized)
                      self.log.debug(
                          "Tweaking %s to %s", tweak.parameter, deserialized)
              else:
                  # Consistent set, just return the params
                  return params
          raise ValueError("Could not get a consistent set of parameters")
docs: Validate configuration parameters and return validated parameters.
  
          Doesn't take device state into account so can be run in any state