code: def finish_async_rpc(self, address, rpc_id, response):
          
  
          try:
              self.emulator.finish_async_rpc(address, rpc_id, response)
              self._track_change('device.rpc_finished', (address, rpc_id, None, response, None), formatter=format_rpc)
          except Exception as exc:
              self._track_change('device.rpc_exception', (address, rpc_id, None, response, exc), formatter=format_rpc)
              raise
docs: Finish a previous asynchronous RPC.
  
          This method should be called by a peripheral tile that previously
          had an RPC called on it and chose to response asynchronously by
          raising ``AsynchronousRPCResponse`` in the RPC handler itself.
  
          The response passed to this function will be returned to the caller
          as if the RPC had returned it immediately.
  
          The rpc response will be sent in the RPC thread.  By default this
          method will block until the response is finished.  If you don't
          want to block, you can pass sync=False
  
          Args:
              address (int): The tile address the RPC was called on.
              rpc_id (int): The ID of the RPC that was called.
              response (bytes): The bytes that should be returned to
                  the caller of the RPC.