// -------------------------------------------------------------- //
//                     DMA Transfer Wrapper                       //
// -------------------------------------------------------------- //
Hint transfer_dma(void * src, void * des, Hint size) {
   XAxiCdma dma;
   Hint status = dma_create(&dma,SLAVE_LOCAL_DMA_DEVICE_ID);
   if (status != SUCCESS)
      return FAILURE;

   // Reset DMA   
   dma_reset(&dma);    
   
   status = dma_transfer(&dma, (Huint) src, (Huint) des, size);
   if (status != SUCCESS)
      return FAILURE;

   // Wait until done
   while(dma_getbusy(&dma));

   // Check for any errors
   return (dma_geterror(&dma));
}
Hint sw_crc(void * list_ptr, Huint size) {
    
    // Set up DMA structure
    dma_t local_dma;
    dma_config_t local_dma_config;
    local_dma_config.base = ACCELERATOR_DMA_BASEADDR;
    dma_create(&local_dma, &local_dma_config);
    
    // Transfer List A to local BRAM A using local dma
    if(transfer_dma(&local_dma, (void *) list_ptr, (void *) ACC_BRAM_A, size*4))
        return FAILURE;
    
    Hint *array = (Hint *) ACC_BRAM_A;

    for (array = (Hint *) ACC_BRAM_A; array < (Hint *) ACC_BRAM_A + size; array++) {
        *array = gen_crc(*array);
    }

    // Transfer results back
    if(transfer_dma(&local_dma, (void *) ACC_BRAM_A, (void *) list_ptr, size*4))
        return FAILURE;
    else
        return SUCCESS;
}