#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xbram.h"
#include "xparameters.h"
#include "xil_io.h"

XBram_Config *bram_config;
XBram bram;


void bram_init(){
   bram_config = XBram_LookupConfig(XPAR_AXI_BRAM_CTRL_0_DEVICE_ID);
   int status = XBram_CfgInitialize(&bram, bram_config, bram_config->CtrlBaseAddress);

   if(status == XST_SUCCESS)
	   xil_printf("BRAM INIT SUCCESSFUL\n");
   else
	   xil_printf("BRAM INIT FAILED\n");


   status = XBram_SelfTest(&bram, 0);

   if(status == XST_SUCCESS)
	   xil_printf("BRAM SELF TEST SUCCESSFUL\n");
   else
	   xil_printf("BRAM SELF TEST FAILED\n");


}




int main()
{
    init_platform();
    bram_init();

    u32 *data;
    u32 dataRead = 0;
    u32 dataReadXIL = 0;
    int i = 0;

    data = XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR;

    for(i = 0; i<50; i++)
    {
    	*(data + 4*i) = 5*i;

    }

   xil_printf("DATA WRITE SUCCESSFUL : POINTER METHOD\n");

   for(i = 0; i< 50;i++)
   {
	   dataRead = *(data + 4*i);
	   xil_printf("Value Read : %0d\n", dataRead);

   }

   xil_printf("DATA READ SUCCESSFUL : POINTER METHOD\n");


   for(i =0 ; i < 50; i++)
   {
	   Xil_Out32((data + 4*i), 5*i);

   }
   xil_printf("DATA WRITE SUCCESSFUL : XIL_IO METHOD\n");

   for(i=0; i< 50; i++)
   {

	   dataReadXIL =  Xil_In32((data + 4*i));
	   xil_printf("Value Read : %0d\n", dataReadXIL);
   }

   xil_printf("DATA READ SUCCESSFUL : XIL_IO METHOD\n");



    cleanup_platform();
    return 0;
}