URL
https://opencores.org/ocsvn/csa/csa/trunk
Subversion Repositories csa
[/] [csa/] [trunk/] [bench/] [csa_pli.c] - Rev 36
Go to most recent revision | Compare with Previous | Blame | View Log
/* * ===================================================================================== * * Filename: read_ikey.c * * Description: this is a pli module to read the input key * * Version: 1.0 * Created: 07/10/2008 09:18:10 PM * Revision: none * Compiler: gcc * * Author: mengxipeng@gmail.com * Company: mengxipeng * * ===================================================================================== */ #include <string.h> #include <stdio.h> #include <errno.h> #include <vpi_user.h> char data[120*8*8]; static int read_data_compile(char* used_data) { vpiHandle systf_h; vpiHandle trarg_itr; // argument iterator vpiHandle trarg_h; // argument handle; PLI_INT32 trarg_type; // argument type PLI_INT32 reg_size; // argument type 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) { if(vpi_get(vpiConstType,trarg_h)!=vpiStringConst) { vpi_printf("the first argument type is incorrect (not a string constant)\n"); tf_dofinish(); return 0; } } // get the next argumnent trarg_h=vpi_scan(trarg_itr); trarg_type=vpi_get(vpiType,trarg_h); if(trarg_type==vpiConstant) // offset ? { if(vpi_get(vpiConstType,trarg_h)!=vpiBinaryConst) { vpi_printf("the offset must be dec constant [%d] \n",vpi_get(vpiConstType,trarg_h)); tf_dofinish(); return 0; } trarg_h=vpi_scan(trarg_itr); trarg_type=vpi_get(vpiType,trarg_h); } if(trarg_type!=vpiReg) { vpi_printf("error:the current argument's type must be reg [%d]",trarg_type); tf_dofinish(); return 0; } reg_size=vpi_get(vpiSize,trarg_h); trarg_h=vpi_scan(trarg_itr); if(trarg_h) // size argument { s_vpi_value value_s; trarg_type=vpi_get(vpiType,trarg_h); if(trarg_type!=vpiConstant || vpi_get(vpiConstType,trarg_h)!=vpiBinaryConst) { vpi_printf("error:size type must be a binary constant"); tf_dofinish(); return 0; } value_s.format=vpiIntVal; vpi_get_value(trarg_h,&value_s); if(value_s.value.integer*8>reg_size) { vpi_printf("warning:size is beyond the length of the register"); } } return 0; } static int read_data(char *fn) { vpiHandle systf_handle; vpiHandle arg_itr; vpiHandle arg_handle; vpiHandle arg_handle_reg; PLI_INT32 arg_type; PLI_INT32 arg_size; PLI_INT32 read_size; s_vpi_value value_s; FILE *fp; systf_handle = vpi_handle(vpiSysTfCall, NULL); arg_itr = vpi_iterate(vpiArgument, systf_handle); if (arg_itr == NULL) { vpi_printf("ERROR: failed to obtain systf arg handles\n"); tf_dofinish(); return(0); } /* read file name */ arg_handle = vpi_scan(arg_itr); value_s.format = vpiStringVal; vpi_get_value(arg_handle, &value_s); fp=fopen(value_s.value.str,"rb"); if(!fp) { vpi_printf("ERROR: failed to open the file [%s]\n",value_s.value.str); tf_dofinish(); return 0; } arg_handle = vpi_scan(arg_itr); arg_type=vpi_get(vpiType,arg_handle); arg_handle_reg=arg_handle; if(arg_type==vpiConstant) { value_s.format = vpiIntVal; vpi_get_value(arg_handle, &value_s); if(0<fseek(fp,value_s.value.integer,SEEK_SET)) { vpi_printf("warning: failed to seek the offset\n"); } arg_handle_reg = vpi_scan(arg_itr); } // calute the size read_size=vpi_get(vpiSize,arg_handle_reg); arg_handle = vpi_scan(arg_itr); if(arg_handle) { value_s.format = vpiIntVal; vpi_get_value(arg_handle, &value_s); if(value_s.value.integer<read_size*8) read_size=value_s.value.integer*8; } // read the value to vector { unsigned int dword; int i; int read; value_s.format = vpiVectorVal; vpi_get_value(arg_handle_reg, &value_s); i=0; if(read_size >= 32) { for(i=0;i<read_size;i+=32) { 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; } } if(i<read_size) { PLI_INT32 reduant=read_size-i; PLI_INT32 reduant_mask; int n; reduant_mask=0; for(n=0;n<reduant;n++) { reduant_mask |= (1<<n); } read=fread(&dword,reduant/8,1,fp); if(1!=read) { vpi_printf("warning fail \n"); } value_s.value.vector[i/32].bval&=~reduant_mask; value_s.value.vector[i/32].aval&=~reduant_mask; value_s.value.vector[i/32].aval|=reduant_mask&dword; } vpi_put_value(arg_handle_reg, &value_s,NULL, vpiNoDelay); } fclose(fp); return 0; } // thia vpi funciton read_data is used to read a binary to a verilog register; // usage: read_data ( file name, [ offset ] , register name ,[size ]); // note offset and size argument's unit is byte static void read_data_register() { s_vpi_systf_data tf_data; tf_data.type = vpiSysTask; tf_data.tfname = "$read_data"; tf_data.calltf = read_data; tf_data.compiletf = read_data_compile; tf_data.sizetf = 0; vpi_register_systf(&tf_data); } static int write_data(char *xx) { vpiHandle systf_handle; vpiHandle arg_itr; vpiHandle arg_handle; s_vpi_value value_s; FILE *fp; char str[120]; int i; int n; systf_handle = vpi_handle(vpiSysTfCall, NULL); arg_itr = vpi_iterate(vpiArgument, systf_handle); if (arg_itr == NULL) { vpi_printf("ERROR: $pow failed to obtain systf arg handles\n"); return(0); } /* read file name */ 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"); else fp=fopen(str,"wb"); if(fp) { 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++) { fwrite(&value_s.value.vector[i].aval,4,1,fp); } 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; } static void write_data_register() { s_vpi_systf_data tf_data; tf_data.type = vpiSysTask; tf_data.tfname = "$write_data"; tf_data.calltf = write_data; tf_data.compiletf = 0; tf_data.sizetf = 0; vpi_register_systf(&tf_data); } void (*vlog_startup_routines[])() = { read_data_register, write_data_register, 0 };
Go to most recent revision | Compare with Previous | Blame | View Log