URL
https://opencores.org/ocsvn/csa/csa/trunk
Subversion Repositories csa
Compare Revisions
- This comparison shows the changes necessary to convert path
/csa/trunk
- from Rev 36 to Rev 37
- ↔ Reverse comparison
Rev 36 → Rev 37
/bench/csa_pli.c
177,20 → 177,16
int read; |
value_s.format = vpiVectorVal; |
vpi_get_value(arg_handle_reg, &value_s); |
i=0; |
if(read_size >= 32) |
for(i=0;i+32<=read_size;i+=32) |
{ |
for(i=0;i<read_size;i+=32) |
read=fread(&dword,4,1,fp); |
if(1!=read) |
{ |
read=fread(&dword,4,1,fp); |
if(1!=read) |
{ |
vpi_printf("warning read fail [%d] \n",read); |
break; |
} |
value_s.value.vector[i/32].bval=0x00; |
value_s.value.vector[i/32].aval=dword; |
vpi_printf("warning read fail [%d] \n",read); |
break; |
} |
value_s.value.vector[i/32].bval=0x00; |
value_s.value.vector[i/32].aval=dword; |
} |
if(i<read_size) |
{ |
233,23 → 229,107
vpi_register_systf(&tf_data); |
} |
|
// write system call |
// usage $write_data( file name , [ flags ,] reg) |
|
static int write_data_compile(char* used_data) |
{ |
vpiHandle systf_h; |
vpiHandle trarg_itr; // argument iterator |
vpiHandle trarg_h; // argument handle; |
PLI_INT32 trarg_type; // argument type |
s_vpi_value value_s; |
|
|
systf_h=vpi_handle(vpiSysTfCall,NULL); |
if(!systf_h) |
{ |
vpi_printf("ERROR: could not obtain the handle to systf call\n"); |
tf_dofinish(); |
return 0; |
} |
|
trarg_itr=vpi_iterate(vpiArgument, systf_h); |
if(!trarg_itr) |
{ |
vpi_printf("ERROR: could not obtain the iterate to argument\n"); |
tf_dofinish(); |
return 0; |
} |
|
|
// get the first argument |
trarg_h=vpi_scan(trarg_itr); |
if(vpi_get(vpiType,trarg_h)!=vpiConstant&&vpi_get(vpiConstType,trarg_h)!=vpiStringConst) |
{ |
vpi_printf("the first argument type is incorrect (not a string constant)\n"); |
tf_dofinish(); |
return 0; |
} |
|
// get flag |
trarg_h=vpi_scan(trarg_itr); |
trarg_type=vpi_get(vpiType,trarg_h); |
if(trarg_type==vpiConstant&&vpi_get(vpiConstType,trarg_h)==vpiStringConst) |
// flag |
{ |
value_s.format=vpiStringVal; |
vpi_get_value(trarg_h,&value_s); |
|
if( |
strcasecmp(value_s.value.str,"A") |
) |
{ |
vpi_printf("error, not only support addpend A flag[%s]\n",value_s.value.str); |
tf_dofinish(); |
return 0; |
} |
|
trarg_h=vpi_scan(trarg_itr); |
trarg_type=vpi_get(vpiType,trarg_h); |
} |
|
if(trarg_type!=vpiConstant&&trarg_type!=vpiReg) |
{ |
vpi_printf("error, the last argument is not a constant val [%d]\n",trarg_type); |
tf_dofinish(); |
return 0; |
} |
if(trarg_type==vpiConstant) |
{ |
if(0!=vpi_get(vpiConstType,trarg_h)) |
{ |
vpi_printf("error, the last argument is not a sub 0 type constant val \n"); |
tf_dofinish(); |
return 0; |
} |
} |
|
return 0; |
} |
|
static int write_data(char *xx) |
{ |
vpiHandle systf_handle; |
vpiHandle arg_itr; |
vpiHandle arg_handle_fn; |
vpiHandle arg_handle; |
s_vpi_value value_s; |
|
FILE *fp; |
char str[120]; |
int i; |
int n; |
|
systf_handle = vpi_handle(vpiSysTfCall, NULL); |
if(systf_handle== NULL) |
{ |
vpi_printf("ERROR: $pow failed to obtain systf call handles\n"); |
tf_dofinish(); |
return(0); |
} |
arg_itr = vpi_iterate(vpiArgument, systf_handle); |
if (arg_itr == NULL) |
{ |
vpi_printf("ERROR: $pow failed to obtain systf arg handles\n"); |
tf_dofinish(); |
return(0); |
} |
|
257,36 → 337,60
arg_handle = vpi_scan(arg_itr); |
value_s.format = vpiStringVal; |
vpi_get_value(arg_handle, &value_s); |
strcpy(str,value_s.value.str); |
|
arg_handle = vpi_scan(arg_itr); |
value_s.format = vpiStringVal; |
vpi_get_value(arg_handle, &value_s); |
if(!strcmp("a",value_s.value.str)) |
fp=fopen(str,"ab"); |
if(vpi_get(vpiType,arg_handle)==vpiConstant&&vpi_get(vpiConstType,arg_handle)==vpiStringConst) |
// flags |
{ |
fp=fopen(value_s.value.str,"ab");// if have flag, then open the file with append mode |
arg_handle = vpi_scan(arg_itr); |
} |
else |
fp=fopen(str,"wb"); |
if(fp) |
{ |
fp=fopen(value_s.value.str,"wb"); |
} |
if(!fp) |
{ |
vpi_printf("can not open file to write\n"); |
tf_dofinish(); |
return 0; |
} |
|
// write data |
{ |
unsigned int word; |
int b; |
int i; |
int vector_size; |
value_s.format = vpiVectorVal; |
arg_handle = vpi_scan(arg_itr); |
vector_size = vpi_get(vpiSize, arg_handle); |
vpi_get_value(arg_handle, &value_s); |
for(i=0;i<vector_size/32;i++) |
for(i=0;i+32<=vector_size;i+=32) |
{ |
fwrite(&value_s.value.vector[i].aval,4,1,fp); |
if(1!=fwrite(&value_s.value.vector[i/32].aval,4,1,fp)) |
{ |
vpi_printf("[%d]warning:write fail \n",__LINE__); |
} |
} |
fwrite(&value_s.value.vector[i].aval,(vector_size%32)/8,1,fp); |
if(i<vector_size) |
{ |
int n; |
unsigned char b; |
unsigned int last=value_s.value.vector[i/32].aval; |
unsigned int mask=0xff; |
PLI_INT32 reduant=vector_size-i; |
for(n=0;n<reduant;n+=8) |
{ |
b=(last&(mask<<n))>>n; |
if(1!=fwrite(&b,1,1,fp)) |
{ |
vpi_printf("[%d]warning:write fail \n",__LINE__); |
} |
} |
} |
//fwrite(&value_s.value.vector[i].aval,(vector_size%32)/8,1,fp); |
fclose(fp); |
} |
else |
{ |
vpi_printf("can't open the output file in %s \n", __FUNCTION__); |
} |
|
return 0; |
} |
297,7 → 401,7
tf_data.type = vpiSysTask; |
tf_data.tfname = "$write_data"; |
tf_data.calltf = write_data; |
tf_data.compiletf = 0; |
tf_data.compiletf = write_data_compile; |
tf_data.sizetf = 0; |
vpi_register_systf(&tf_data); |
} |