URL
https://opencores.org/ocsvn/raytrac/raytrac/trunk
Subversion Repositories raytrac
Compare Revisions
- This comparison shows the changes necessary to convert path
/raytrac/trunk
- from Rev 56 to Rev 57
- ↔ Reverse comparison
Rev 56 → Rev 57
/msimtest.c
0,0 → 1,282
/* |
* msimtest.c |
* memoryMaker |
* |
* Created by julian on 21/03/11. |
* Copyright 2011 __MyCompanyName__. All rights reserved. |
* |
*/ |
|
#include "msimtest.h" |
|
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <ctype.h> |
#include <unistd.h> |
|
|
altrom_reg innuendo[RESULT_LINES]; |
|
FILE * fprom, *fpdec, *fpmul, *fpresults; |
|
|
|
#define LB '{' |
#define RB '}' |
#define CM ',' |
|
|
|
|
|
|
ssize_t getline(char ** lptr, size_t n, FILE * stream){ |
|
int cnt; |
char *pc; |
|
if (feof(stream)) |
return -1; |
|
|
|
//clear buffer |
for (cnt=0,pc=lptr[0]; cnt<(int)n; cnt++) |
*((char*)(pc+cnt))=0; |
|
cnt=0; |
|
//till end of line |
do { |
//check if buffer size is appropiate |
if (cnt>=(int)n){ |
pc=(char*)realloc(lptr[0],cnt+1); |
|
lptr[0]=pc; |
} |
|
//read one byte should not be any problem |
if (!fread(pc+cnt, 1, 1, stream)) |
return -1; |
|
if (pc[cnt]==0x0a || pc[cnt]==0x0 || feof(stream)) |
return cnt+1; |
|
cnt++; |
|
} while (1); |
} |
#define ONEPAD(x,s) x |= (1<<(s-1))&x?(-1<<s):0 |
void onespadding(int s){ |
|
|
int index0,index1; |
for (index0=0; index0<ROM_LINES; index0++) |
for (index1=0; index1<15; index1++) |
ONEPAD(innuendo[index0].rom[index1],s); |
|
} |
|
|
#define SEARCHTOKEN(pc,t) while(*(pc++)!=t) |
void vph(void*v,void*r,char e){ |
|
//find { |
char ** pv=(char**)v; |
char * c=pv[0]; |
long int * Pv=r; |
|
//SEARCHTOKEN(c,s); |
*Pv=0; |
do{ |
if (isxdigit(*c)){ |
*Pv<<=4; |
(*Pv)+=((*c)>=0x30 && (*c)<0x40)?(*c)-0x30:(islower(*c)?(*c)-82:(*c)-55); |
} |
|
}SEARCHTOKEN(c,e); |
|
pv[0]=c; |
|
} |
void vpi(void*v,void*r,char e){ |
|
char ** pv=(char**)v; |
char * c=pv[0]; |
long int * Pv=r; |
|
//SEARCHTOKEN(c,s); |
*Pv=0; |
do{ |
if (isdigit(*c)){ |
*Pv*=10; |
(*Pv)+=*c-0x30; |
} |
|
}SEARCHTOKEN(c,e); |
pv[0]=c; |
} |
#undef SEARCHTOKEN |
|
#define ROM_DELAY 0 |
#define DEC_DELAY 1 |
#define MUL_DELAY 2 |
#define CROSS_DELAY 3 |
#define DOTP_DELAY 4 |
|
//parsing method model |
vvp pmodelrom[] = {vpi,vph,vpi,vph,vph,vph,vph,vph,vph,vph,vph,vph,vph,vph,vph,0x0}; |
vvp pmodeldec[] = {vpi,vph,vph,vph,vph,vph,vph,vph,vph,vph,vph,vph,vph,0x0}; |
vvp pmodelmult[]= {vpi,vph,vph,vph,vph,vph,vph,0x0}; |
vvp pmodelresult[]= {vpi,vph,vph,vph,vph,vph,0x0}; |
|
void * pmodel[]={pmodelrom,pmodeldec,pmodelmult,pmodelresult}; |
|
char edrom[]= {RB,RB,RB,CM,CM,RB,CM,CM,RB,CM,CM,RB,CM,CM,RB}; |
char eddec[]= {RB,CM,RB,CM,RB,CM,RB,CM,RB,CM,RB,CM,RB}; |
char edmult[]= {RB,RB,RB,RB,RB,RB,RB}; |
char edresult[]= {RB,CM,CM,RB,RB,RB}; |
|
char *enddelimiter[]= {edrom,eddec,edmult,edresult}; |
|
|
//slots |
int psmodel[]={ROM_SLOTS,DEC_SLOTS,MUL_SLOTS,RESULT_SLOTS,0x0}; |
//lines |
int plmodel[]={ROM_LINES, DEC_LINES, MULT_LINES, RESULT_LINES, 0x0}; |
|
//delay model |
int dmodel[]={0,20,60,60,80,0x0}; |
|
|
typedef struct parce{ |
vvp ** pfunc; |
int * smodel; |
int * lmodel; |
FILE * fp[4]; |
}xparser; |
|
typedef xparser* pxparser; |
|
pxparser xp; |
|
void quickgetfile(int i){ |
|
unsigned char padthai; |
|
long int * slot[]={&innuendo[0].rom[0],&innuendo[0].dec[0],&innuendo[0].mul[0],&innuendo[0].res[0]}; |
|
long int * xslot=slot[i]; |
vvp * pfunc = (vvp*)pmodel[i]; |
|
int smodel = psmodel[i]; |
int lmodel = plmodel[i]; |
FILE * fp = xp->fp[i]; |
|
|
int index=0,index1,nread; |
char * b[1]; |
char * c; |
|
|
long int * pv; |
*b=0x0; |
do{ |
|
/* |
This function reads an entire line from stream, storing the text (including the newline and a terminating null character) in a buffer and storing the buffer address in *lineptr. |
Before calling getline, you should place in *lineptr the address of a buffer *n bytes long, allocated with malloc. If this buffer is long enough to hold the line, getline stores the line in this buffer. |
Otherwise, getline makes the buffer bigger using realloc, storing the new buffer address back in *lineptr and the increased size back in *n. See Unconstrained Allocation. |
If you set *lineptr to a null pointer, and *n to zero, before the call, then getline allocates the initial buffer for you by calling malloc. |
In either case, when getline returns, *lineptr is a char * which points to the text of the line. |
When getline is successful, it returns the number of characters read (including the newline, but not including the terminating null). This value enables you to distinguish null characters that are part of the line from the null character inserted as a terminator. |
This function is a GNU extension, but it is the recommended way to read lines from a stream. The alternative standard functions are unreliable. |
If an error occurs or end of file is reached without any bytes read, getline returns -1. |
*/ |
|
do { |
if (*b) |
free(*b); |
*b=(char*)malloc(1); |
if (!b) |
exit(EXIT_FAILURE); |
nread=getline(b,1,fp); |
if (nread==-1) |
exit(EXIT_FAILURE); |
c=b[0]; |
|
} while (*c=='#'); |
|
for (index1=0;pfunc[index1];index1++){ |
pfunc[index1](&c,&(xslot[index1]),enddelimiter[i][index1]); |
if (i==1 || i==3) { |
padthai=(i==1)?18:32; |
ONEPAD(xslot[index1],padthai); |
} |
|
} |
xslot+=(sizeof(altrom_reg)/4); |
|
|
|
index++; |
|
}while (index<plmodel[i]); |
fclose(fp); |
return; |
|
} |
|
|
int main (int argc, char ** argv){ |
|
int index,openingerror; |
|
int size=sizeof(long int); |
|
xp=(pxparser)malloc(sizeof(xparser)); |
|
//Open files |
for (index=1,openingerror=0;index>0 && index<5;){ |
if (!openingerror) { |
xp->fp[index-1]=fopen(argv[index],"r"); |
if (!(xp->fp[index-1])) { |
openingerror=1; |
index--; |
} |
else |
index++; |
|
} |
else |
fclose(xp->fp[--index]); |
|
} |
|
if (openingerror){ |
fprintf(stdout,"error: no se encontro(aron) el(los) archivo(s) con la informacion\n"); |
return -1; |
} |
|
memset(innuendo,0,sizeof(altrom_reg)*RESULT_LINES); |
|
|
|
|
quickgetfile(0); |
quickgetfile(1); |
quickgetfile(2); |
quickgetfile(3); |
|
onespadding(18); |
|
return 1; |
} |
|
|
|
|
|
|
|
/msimtest.h
0,0 → 1,35
/* |
* msimtest.h |
* memoryMaker |
* |
* Created by Julian Andres Guarin Reyes on 21/03/11. |
* Copyright 2011 __MyCompanyName__. All rights reserved. |
* |
*/ |
|
#define ROM_SLOTS 15 |
#define DEC_SLOTS 13 |
#define MUL_SLOTS 7 |
#define RESULT_SLOTS 6 |
|
#define ROM_LINES 1536 |
#define DEC_LINES 1537 |
#define MULT_LINES 1539 |
#define RESULT_LINES 1540 |
|
typedef struct altrom { |
long int rom[ROM_SLOTS]; |
long int dec[DEC_SLOTS]; |
long int mul[MUL_SLOTS]; |
long int res[RESULT_SLOTS]; |
|
|
}altrom_reg; |
|
typedef void (*vvp)(void*,void*,char); |
void vph(void *v, void*r, char e); |
void vpi(void *i, void*r, char e); |
|
|
|
|