Team Slytherin - Software emulation source code

From Cpre584
Revision as of 21:37, 22 February 2012 by Bhavani (talk | contribs) (New page: === Software Emulation == #include <convey/usr/cny_comp.h> #include <ctype.h> #include <stdlib.h> #include <string.h> #include <stdio.h> //added #include <math.h> //ad...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

= Software Emulation

  #include <convey/usr/cny_comp.h>
  #include <ctype.h>
  #include <stdlib.h>
  #include <string.h>
  #include <stdio.h> //added 
  #include <math.h>  //added
  #undef DEBUG
  typedef unsigned long long uint64;
  /*-------STRUCTURES---------*/
  typedef struct {int rows; int cols; unsigned char* data;} sImage;
  extern long cpVadd();
  extern int cpXbar();
  void usage (char *);
  /*-------PROTOTYPES---------*/
  long getImageInfo(FILE*, long, int);
  void copyImageInfo(FILE* inputFile, FILE* outputFile);
  void copyColorTable(FILE* inputFile, FILE* outputFile, int nColors);
  int main(int argc, char *argv[])
 {
  FILE			*bmpInput, *bmpOutput;
  sImage		originalImage;
  sImage		edgeImage;
  unsigned int		X, Y;
  int			I, J;
  long			sumX, sumY;
  int			nColors, SUM;
  unsigned long	vectorSize;
  unsigned long	fileSize;
  int			GX[3][3];
  int			GY[3][3];
  unsigned char 	*pChar, someChar;
  unsigned int		row, col;
  long i;
  long size;
  uint64  *a1, *a2, *a3, *a4;
  uint64 act_sum;
  uint64 exp_sum=0;
 //Sobel
  someChar = '0'; pChar = &someChar;
  /* 3x3 GX Sobel mask.  Ref: www.cee.hw.ac.uk/hipr/html/sobel.html */
  GX[0][0] = -1; GX[0][1] = 0; GX[0][2] = 1;
  GX[1][0] = -2; GX[1][1] = 0; GX[1][2] = 2;
  GX[2][0] = -1; GX[2][1] = 0; GX[2][2] = 1;
  /* 3x3 GY Sobel mask.  Ref: www.cee.hw.ac.uk/hipr/html/sobel.html */
  GY[0][0] =  1; GY[0][1] =  2; GY[0][2] =  1;
  GY[1][0] =  0; GY[1][1] =  0; GY[1][2] =  0;
  GY[2][0] = -1; GY[2][1] = -2; GY[2][2] = -1;
  if(argc < 2) {
    printf("Usage: %s bmpInput.bmp\n", argv[0]);
    exit(0);
   };
 // Get personality signature
 // The "pdk" personality is the PDK sample vadd personality
 cny_image_t        sig2;
 cny_image_t        sig;
 int stat;
 if (cny_get_signature)
   cny_get_signature("pdk", &sig, &sig2, &stat);
 else 
   fprintf(stderr,"ERROR:  cny_get_signature not found\n");
 if (stat) {
   printf("***ERROR: cny_get_signature() Failure: %d\n", stat);
   exit(1);
 }
 // check interleave
 // this example requires binary interleave
 if (cny_cp_interleave() == CNY_MI_3131) {
   printf("ERROR - interleave set to 3131, this personality requires binary interleave\n");
   exit (1);
 }
 // read AEG control register to see if crossbar is present
 int crossbar_enabled = 0;
 crossbar_enabled = i_copcall_fmt(sig, cpXbar, "");
 #ifdef DEBUG
 printf("UserApp:  crossbar_enabled = %d\n", crossbar_enabled);
 #endif
   /*-------DECLARE INPUT & OUTPUT FILES-------*/
   bmpInput = fopen(argv[1], "rb");
   bmpOutput = fopen("edgeSob.bmp", "wb");    
   /*---SET POINTER TO BEGINNING OF FILE----*/
   fseek(bmpInput, 0L, SEEK_END);   
   /*-------GET INPUT BMP DATA--------*/
   fileSize = getImageInfo(bmpInput, 2, 4);
   originalImage.cols = (int)getImageInfo(bmpInput, 18, 4);
   originalImage.rows = (int)getImageInfo(bmpInput, 22, 4);
   edgeImage.rows = originalImage.rows;
   edgeImage.cols = originalImage.cols;
   size=originalImage.cols;  
 // Allocate memory
 // if the crossbar is enabled in the hardware, use malloc
 // if no crossbar, the memory must be aligned on MC 0
 if (crossbar_enabled)  {
     if (cny_cp_malloc)  {
    a1 = (uint64 *) (cny_cp_malloc)(size*8);
    a2 = (uint64 *) (cny_cp_malloc)(size*8); 
    a3 = (uint64 *) (cny_cp_malloc)(size*8);
    a4 = (uint64 *) (cny_cp_malloc)(size*8);
     }
    else 
    printf("malloc failed\n");
 }
 else {

cny_cp_posix_memalign((void**)&a1, 512, size*8); cny_cp_posix_memalign((void**)&a2, 512, size*8); cny_cp_posix_memalign((void**)&a3, 512, size*8);

       cny_cp_posix_memalign((void**)&a4, 512, size*8);
 }
#ifdef DEBUG
 printf("a1 = %llx MC = %lld \n", a1, ((uint64)a1>>6)&7);
 printf("a2 = %llx MC = %lld \n", a2, ((uint64)a2>>6)&7);
 printf("a3 = %llx MC = %lld \n", a3, ((uint64)a3>>6)&7);
#endif
 /*--------PRINT DATA TO SCREEN----------*/
  printf("Width: %d\n", originalImage.cols);
  printf("Height: %d\n", originalImage.rows);
  printf("File size: %lu\n", fileSize);
  nColors = (int)getImageInfo(bmpInput, 46, 4);
  printf("nColors: %d\n", nColors);
  /*------ALLOCATE MEMORY FOR FILES--------*/
  vectorSize = fileSize - (14+40+4*nColors);
  printf("vectorSize: %lu\n", vectorSize);   
  edgeImage.data = (unsigned char*) malloc(vectorSize*sizeof(unsigned char));
  if(edgeImage.data == NULL) {

printf("Failed to malloc edgeImage.data\n"); exit(0);

  }
  printf("%lu bytes malloc'ed for edgeImage.data\n", vectorSize);
  originalImage.data = (unsigned char*) malloc(vectorSize*sizeof(unsigned char));
  if(originalImage.data == NULL) {

printf("Failed to malloc originalImage.data\n"); exit(0);

  }
  printf("%lu bytes malloc'ed for originalImage.datt\n", vectorSize);
  /*------COPY HEADER AND COLOR TABLE---------*/
  copyImageInfo(bmpInput, bmpOutput);
  copyColorTable(bmpInput, bmpOutput, nColors);
  fseek(bmpInput, (14+40+4*nColors), SEEK_SET);
  fseek(bmpOutput, (14+40+4*nColors), SEEK_SET);
  for(row=0; row<=originalImage.rows-1; row++) {

for(col=0; col<=originalImage.cols-1; col++) { fread(pChar, sizeof(char), 1, bmpInput); *(originalImage.data + row*originalImage.cols + col) = *pChar; }

  }
 // populate operand arrays, initialize a3  
  for (row=0; row < (originalImage.rows-2); row++){
   for(i=0; i< size; i++){
   a1[i]=*(originalImage.data + row*originalImage.cols +i);
   a2[i]=*(originalImage.data + (row+1)*originalImage.cols +i);
   a3[i]=*(originalImage.data + (row+2)*originalImage.cols +i);}
   // sobel copcall
   act_sum = l_copcall_fmt(sig, cpVSobel, "AAAAA", a1, a2, a3, a4, size);
   for(i=0; i< size; i++){
   *(edgeImage.data +(row+1)*size+i)=a4[i];}
  }  
   fwrite(a4, sizeof(char)*originalImage.cols*originalImage.rows, 1, bmpOutput);
 }
 return 0;
}
/*----------GET IMAGE INFO SUBPROGRAM--------------*/
long getImageInfo(FILE* inputFile, long offset, int numberOfChars)
{
 unsigned char			*ptrC;
 long				value = 0L;
 unsigned char			dummy;
 int				i;
 dummy = '0';
 ptrC = &dummy;
 fseek(inputFile, offset, SEEK_SET);
 for(i=1; i<=numberOfChars; i++)
 {
   fread(ptrC, sizeof(char), 1, inputFile);
   /* calculate value based on adding bytes */
   value = (long)(value + (*ptrC)*(pow(256, (i-1))));
 }
 return(value);
} /* end of getImageInfo */
/*-------------COPIES HEADER AND INFO HEADER----------------*/
void copyImageInfo(FILE* inputFile, FILE* outputFile)
{
 unsigned char		*ptrC;
 unsigned char		dummy;
 int				i;
 dummy = '0';
 ptrC = &dummy;
 fseek(inputFile, 0L, SEEK_SET);
 fseek(outputFile, 0L, SEEK_SET);
 for(i=0; i<=50; i++)
 {
   fread(ptrC, sizeof(char), 1, inputFile);
   fwrite(ptrC, sizeof(char), 1, outputFile);
 }
}
/*----------------COPIES COLOR TABLE-----------------------------*/
void copyColorTable(FILE* inputFile, FILE* outputFile, int nColors)
{
 unsigned char		*ptrC;
 unsigned char		dummy;
 int				i;
 dummy = '0';
 ptrC = &dummy;
 fseek(inputFile, 54L, SEEK_SET);
 fseek(outputFile, 54L, SEEK_SET);
 for(i=0; i<=(4*nColors); i++)  /* there are (4*nColors) bytesin color table */
 {
   fread(ptrC, sizeof(char), 1, inputFile); 
   fwrite(ptrC, sizeof(char), 1, outputFile);
 }
}