|
|
(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);
| |
| }
| |
| }
| |