📄 loadsig.c
字号:
char tmp_string[MAX_NAME_LENGTH];
current_row = 0;
/* type of independent variable */
cp = strtok(line, " \t\n");
if(!cp)
{
mexPrintf("error in hs_process_header: initial vartype not found on header line\n");
return;
}
hstype = atoi(cp);
switch(hstype) {
case 1:
sf->signal_type[0] = TIME;
break;
case 2:
sf->signal_type[0] = FREQUENCY;
break;
case 3:
sf->signal_type[0] = VOLTAGE;
break;
default:
sf->signal_type[0] = UNKNOWN;
break;
}
sf->signal_first_row[0] = current_row++;
sf->signal_num_rows[0] = 1;
/* dependent variable types */
for(i = 1; i < sf->num_signals; i++)
{
cp = strtok(NULL, " \t\n");
if(!cp) {
mexPrintf("error in hs_process_header: not enough vartypes on header line\n");
return;
}
if(!isdigit(cp[0])) {
mexPrintf("error in hs_process_header: bad vartype %d [%s] on header line\n", i, cp);
return;
}
hstype = atoi(cp);
switch(hstype) {
case 1:
case 2:
sf->signal_type[i] = VOLTAGE;
break;
case 8:
case 15:
sf->signal_type[i] = CURRENT;
break;
default:
sf->signal_type[i] = UNKNOWN;
break;
}
/* how many columns comprise this variable? */
if (current_row >= sf->num_data_rows)
{
mexPrintf("error in hs_process_header: data rows exceeded\n");
return;
}
sf->signal_first_row[i] = current_row++;
if(i < (sf->nauto) && sf->signal_type[0] == FREQUENCY)
{
if (current_row >= sf->num_data_rows)
{
mexPrintf("error in hs_process_header: data rows exceeded\n");
return;
}
sf->signal_num_rows[i] = 2;
current_row++;
}
else
{
sf->signal_num_rows[i] = 1;
}
}
/* independent variable name */
signam = strtok(NULL, " \t\n");
if(!signam) {
mexPrintf("error in hs_process_header: no IV name found on header line");
return;
}
strncpy(sf->signal_name[0],signam,MAX_NAME_LENGTH-1);
/* dependent variable names */
for(i = 1; i < sf->num_signals; i++)
{
if((signam = strtok(NULL, " \t\n")) == NULL)
{
mexPrintf("error in hs_process_header: not enough DV names found on header line\n");
return;
}
strncpy(sf->signal_name[i],signam,MAX_NAME_LENGTH-1);
}
/* sweep parameter names */
j = 0;
for(i = 0; i < sf->num_sweep_names; i++)
{
if((signam = strtok(NULL, " \t\n")) == NULL)
{
mexPrintf("error in hs_process_header: not enough sweep parameter names found on header line\n");
return;
}
if (i < (sf->num_sweep_names-sf->num_sweep_vars))
continue;
sprintf(tmp_string,"sw_%s",signam);
strncpy(sf->sweep_name[j++],tmp_string,MAX_NAME_LENGTH-1);
}
}
int hs_read_column(FILE *fp, SpiceData *sf, char *simsource)
{
int i,current_row,k;
float val;
if (sf->current_column == 0)
{
for (i = 0; i < sf->num_sweep_vars; i++)
{
if(fread_float_values(simsource, &val, fp) != 1)
{
mexPrintf("error in hs_read_column: unexpected EOF at field %d\n", i);
return(1);
}
sf->sweep_data[i][sf->cur_sweep] = val;
}
}
k = sf->num_sweep_vars;
if (sf->current_column >= sf->num_data_cols)
return(1);
for(i = 0; i < sf->num_data_rows; i++)
{
if (((sf->current_column*sf->num_data_rows+i+k) % sf->block_size) == 0 &&
(sf->current_column*sf->num_data_rows+i+k) != 0)
fseek(fp,20,SEEK_CUR);
if(fread_float_values(simsource, &val, fp) != 1)
{
mexPrintf("error in hs_read_column: unexpected EOF at field %d\n", i);
return(1);
}
current_row = sf->cur_sweep*sf->num_data_rows+i;
if (current_row >= sf->num_data_rows*sf->num_sweeps)
{
mexPrintf("error in 'hs_read_column': data overflow\n");
return(1);
}
sf->signal_data[current_row][sf->current_column] = val;
}
sf->current_column++;
return(0);
}
int hs_validate_column(FILE *fp, int num_data_rows, int current_column, int num_sweep_vars, int block_size, char *simsource, int col_count)
{
int i,k;
float val;
if (current_column == 0)
{
if (num_sweep_vars > 0)
fseek(fp,4*num_sweep_vars,SEEK_CUR);
}
k = num_sweep_vars;
for(i = 0; i < num_data_rows; i++)
{
if (((current_column*num_data_rows+i+k) % block_size) == 0 &&
(current_column*num_data_rows+i+k) != 0)
fseek(fp,20,SEEK_CUR);
if(fread_float_values(simsource, &val, fp) != 1)
return(1);
if(val >= (1e30 - DBL_EPSILON))
{
if (col_count < 10) /* assume at least 10 time steps in sim */
{
if (strncmp(simsource,"hspice",6) == 0)
sprintf(simsource,"hspice_sun");
else
sprintf(simsource,"cppsim_sun");
}
else if (strcmp(simsource,"cppsim_sun") == 0)
sprintf(simsource,"cppsim");
else if (strncmp(simsource,"hspice",6) == 0)
return(2);
}
}
return(0);
}
SpiceData *init_SpiceData(int num_signals, int nauto, int num_data_rows, int num_data_cols, int num_sweeps, int num_sweep_vars, int num_sweep_names, int block_size)
{
int i,length_signal_data;
SpiceData *A;
if ((A = (SpiceData *) mxCalloc(1,sizeof(SpiceData))) == NULL)
{
mexPrintf("error in 'init_SpiceData': mxCalloc call failed\n");
mexPrintf("out of memory!\n");
return(NULL);
}
A->num_data_rows = num_data_rows;
A->num_data_cols = num_data_cols;
A->num_signals = num_signals;
A->nauto = nauto;
A->num_sweeps = num_sweeps;
A->num_sweep_vars = num_sweep_vars;
A->num_sweep_names = num_sweep_names;
A->block_size = block_size;
/*
mexPrintf("num_signals = %d, nauto = %d, num_data_rows = %d, num_data_cols = %d\n", num_signals, nauto, num_data_rows, num_data_cols);
mexPrintf("num_sweeps = %d, num_sweep_vars = %d, block size = %d\n",num_sweeps, num_sweep_vars, block_size);
*/
if ((A->signal_name = (char **) mxCalloc(num_signals,sizeof(char *))) == NULL)
{
mexPrintf("error in 'init_SpiceData': mxCalloc call failed - \n");
mexPrintf(" not enough memory!!\n");
return(NULL);
}
for (i = 0; i < num_signals; i++)
if (((A->signal_name)[i] = (char *) mxCalloc(MAX_NAME_LENGTH,sizeof(char))) == NULL)
{
mexPrintf("error in 'init_SpiceData': mxCalloc call failed - \n");
mexPrintf(" not enough memory!!\n");
return(NULL);
}
if (num_sweep_vars > 0)
{
if ((A->sweep_name = (char **) mxCalloc(num_sweep_vars,sizeof(char *))) == NULL)
{
mexPrintf("error in 'init_SpiceData': mxCalloc call failed - \n");
mexPrintf(" not enough memory!!\n");
return(NULL);
}
for (i = 0; i < num_sweep_vars; i++)
if (((A->sweep_name)[i] = (char *) mxCalloc(MAX_NAME_LENGTH,sizeof(char))) == NULL)
{
mexPrintf("error in 'init_SpiceData': mxCalloc call failed - \n");
mexPrintf(" not enough memory!!\n");
return(NULL);
}
if ((A->sweep_data = (float **) mxCalloc(num_sweep_vars,sizeof(float *))) == NULL)
{
mexPrintf("error in 'init_SpiceData': mxCalloc call failed - \n");
mexPrintf(" not enough memory!!\n");
return(NULL);
}
for (i = 0; i < num_sweep_vars; i++)
if (((A->sweep_data)[i] = (float *) mxCalloc(num_sweeps,sizeof(float))) == NULL)
{
mexPrintf("error in 'init_SpiceData': mxCalloc call failed - \n");
mexPrintf(" not enough memory!!\n");
return(NULL);
}
}
length_signal_data = num_sweeps*num_data_rows;
/* mexPrintf("length_signal_data = %d,num_data_cols=%d\n",length_signal_data,num_data_cols); */
if ((A->signal_data = (float **) mxCalloc(length_signal_data,sizeof(float *))) == NULL)
{
mexPrintf("error in 'init_SpiceData': mxCalloc call failed - \n");
mexPrintf(" not enough memory!!\n");
return(NULL);
}
for (i = 0; i < length_signal_data; i++)
if (((A->signal_data)[i] = (float *) mxCalloc(num_data_cols,sizeof(float))) == NULL)
{
mexPrintf("error in 'init_SpiceData': mxCalloc call failed - \n");
mexPrintf(" not enough memory!!\n");
return(NULL);
}
if (((A->signal_first_row) = (int *) mxCalloc(num_signals,sizeof(int))) == NULL)
{
mexPrintf("error in 'init_SpiceData': mxCalloc call failed - \n");
mexPrintf(" not enough memory!!\n");
return(NULL);
}
if (((A->signal_num_rows) = (int *) mxCalloc(num_signals,sizeof(int))) == NULL)
{
mexPrintf("error in 'init_SpiceData': mxCalloc call failed - \n");
mexPrintf(" not enough memory!!\n");
return(NULL);
}
if (((A->signal_type) = (int *) mxCalloc(num_signals,sizeof(int))) == NULL)
{
mexPrintf("error in 'init_SpiceData': mxCalloc call failed - \n");
mexPrintf(" not enough memory!!\n");
return(NULL);
}
return(A);
}
void free_SpiceData(SpiceData *A)
{
int i;
for (i = 0; i < A->num_data_rows*A->num_sweeps; i++)
mxFree((A->signal_data)[i]);
mxFree(A->signal_data);
if (A->num_sweep_vars > 0)
{
for (i = 0; i < A->num_sweep_vars; i++)
mxFree((A->sweep_data)[i]);
mxFree(A->sweep_data);
for (i = 0; i < A->num_sweep_vars; i++)
mxFree((A->sweep_name)[i]);
mxFree(A->sweep_name);
}
for (i = 0; i < A->num_signals; i++)
mxFree((A->signal_name)[i]);
mxFree(A->signal_name);
mxFree(A->signal_first_row);
mxFree(A->signal_num_rows);
mxFree(A->signal_type);
mxFree(A);
}
/* fix problem with big endian, little endian issue */
size_t fread_int_values(char *simsource,unsigned int *ibuf,
int size_of_block, FILE *fp)
{
unsigned char *charbuf;
int i;
size_t blocks_read;
if ((charbuf = (unsigned char *) mxCalloc(4*size_of_block,sizeof(unsigned char))) == NULL)
{
mexPrintf("error in 'fread_int_values': mxCalloc call failed - \n");
mexPrintf(" not enough memory!!\n");
return(-1);
}
blocks_read = fread(charbuf, sizeof(unsigned char),4*size_of_block, fp);
if (strcmp(simsource,"hspice_win") == 0)
{
for (i = 0; i < size_of_block; i++)
{
ibuf[i] = charbuf[i*4+3]*(1<<24) + charbuf[i*4+2]*(1<<16)
+ charbuf[i*4+1]*(1<<8) + charbuf[i*4];
}
}
else
{
for (i = 0; i < size_of_block; i++)
{
ibuf[i] = charbuf[i*4]*(1<<24) + charbuf[i*4+1]*(1<<16)
+ charbuf[i*4+2]*(1<<8) + charbuf[i*4+3];
}
}
mxFree(charbuf);
return(((size_t) ((int) blocks_read)/4));
}
/* fix problem with big endian, little endian issue */
int fread_float_values(char *simsource,float *fval, FILE *fp)
{
unsigned char *cptr,tmp;
if (fread(fval,4,1,fp) != 1)
return(0);
if (strcmp(simsource,"hspice_sun") == 0 ||
strcmp(simsource,"cppsim_sun") == 0)
{
cptr = (unsigned char *)fval;
tmp = cptr[0];
cptr[0] = cptr[3];
cptr[3] =tmp;
tmp = cptr[1];
cptr[1] = cptr[2];
cptr[2] = tmp;
}
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -