add generate function