Team Slytherin - Software emulation source code: Difference between revisions

From Cpre584
Jump to navigation Jump to search
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...
 
Bhavani (talk | contribs)
Replacing page with '=== Software Emulation ==='
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
=== Software Emulation ==
=== 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);
  }
}

Latest revision as of 22:47, 22 February 2012

Software Emulation