code: async def aspirate(self, mount: top_types.Mount, volume: float = None,
                         rate: float = 1.0):
          
          this_pipette = self._attached_instruments[mount]
          if not this_pipette:
              raise top_types.PipetteNotAttachedError(
                  "No pipette attached to {} mount".format(mount.name))
          if volume is None:
              asp_vol = this_pipette.available_volume
              mod_log.debug(
                  "No aspirate volume defined. Aspirating up to pipette "
                  "max_volume ({}uL)".format(this_pipette.config.max_volume))
          else:
              asp_vol = volume
  
          assert this_pipette.ok_to_add_volume(asp_vol), \
              "Cannot aspirate more than pipette max volume"
          if asp_vol == 0:
              return
  
          self._backend.set_active_current(
               Axis.of_plunger(mount), this_pipette.config.plunger_current)
          dist = self._plunger_position(
                  this_pipette,
                  this_pipette.current_volume + asp_vol,
                  'aspirate')
          speed = this_pipette.config.aspirate_flow_rate * rate
          try:
              await self._move_plunger(mount, dist, speed=speed)
          except Exception:
              self._log.exception('Aspirate failed')
              this_pipette.set_current_volume(0)
              raise
          else:
              this_pipette.add_current_volume(asp_vol)
docs: Aspirate a volume of liquid (in microliters/uL) using this pipette
          from the *current location*. If no volume is passed, `aspirate` will
          default to max available volume (after taking into account the volume
          already present in the tip).
  
          mount : Mount.LEFT or Mount.RIGHT
          volume : [float] The number of microliters to aspirate
          rate : [float] Set plunger speed for this aspirate, where
              speed = rate * aspirate_speed