Team Slytherin - Software emulation source code
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); } }