📄 loadsig.c
字号:
}
/* test to see if more ascii header remains */
if (strcmp(simsource,"hspice_win") == 0)
{
if (term_seq == 0x23252624)
break;
}
else
{
if (term_seq == 0x24262523)
break;
}
/* old method:
if (ibuf[1] == 2048)
break;
*/
}
ahdrsize += 20*i;
if (i == MAX_HEADER_BLOCKS)
{
mexPrintf("error in hs_allocate_sf: too many header blocks!\n");
mexPrintf(" must increase MAX_HEADER_BLOCKS value in source code\n");
return(NULL);
}
rewind(fp);
fseek(fp,16,SEEK_CUR);
if ((ahdr = (char *) mxCalloc(ahdrsize+1,sizeof(char))) == NULL)
{
mexPrintf("error in hs_allocate_sf: mxCalloc call failed - \n");
mexPrintf(" not enough memory!!\n");
return(NULL);
}
if(fread(ahdr, sizeof(char), ahdrsize, fp) != ahdrsize) {
mexPrintf("error in hs_allocate_sf: EOF reading block1\n");
return(NULL);
}
ahdr[ahdrsize] = '\0';
/* remove false '\0' characters */
for (k = 0; k < ahdrsize; k++)
if (ahdr[k] == '\0')
ahdr[k] = ' ';
/* remove block information from header */
char_position = 0;
for (j = 0; j < i; j++)
{
char_position += header_seg_length[j];
for (k = 0; k < 20; k++)
ahdr[char_position+k] = ' ';
char_position += 20;
}
if(fread_int_values(simsource,ibuf,1, fp) != 1) {
mexPrintf("error in hs_allocate_sf: EOF reading block1 trailer\n");
return(NULL);
}
if(ibuf[0] != header_seg_length[i]) {
mexPrintf("error in hs_allocate_sf: block1 trailer mismatch\n");
return(NULL);
}
if(fread_int_values(simsource,ibuf, 4, fp) != 4)
{
mexPrintf("error in rdhdr_hsbin: EOF reading block2 header\n");
return(NULL);
}
if(ibuf[0] != 4 || ibuf[2] != 4)
{
mexPrintf("error in rdhdr_hsbin: unexepected values in block2 header\n");
return(NULL);
}
block_size = ibuf[3]/sizeof(float);
/* mexPrintf("block size = %d\n",block_size); */
/* ahdr is an ascii header that describes the variables in
* much the same way that the first lines of the ascii format do,
* except that there are no newlines
*/
strncpy(version, &ahdr[16], 4);
version[4] = '\0';
strncpy(full_version, &ahdr[16], 43);
full_version[43] = '\0';
if (strncmp(full_version,"9601 Output Signals from C++ Simulation.",43) == 0)
sprintf(simsource,"cppsim");
else if (strncmp(full_version, "9601",4) == 0)
; /* no action necessary */
else /* wrong version of post format */
{
mexPrintf("error in hs_allocate_sf: wrong binary format\n");
mexPrintf(" only hspice post format '9601' or cppsim output is supported\n");
mexPrintf(" in this case, the input file is version '%s'\n",version);
return(NULL);
}
strncpy(nbuf, &ahdr[0], 4);
nbuf[4] = 0;
nauto = atoi(nbuf); /* number of automaticly-included variables,
first one is independent variable */
strncpy(nbuf, &ahdr[4], 4);
nbuf[4] = 0;
nprobe = atoi(nbuf); /* number of user-requested columns */
/* mexPrintf("nprobe = %d, nauto = %d\n",nprobe,nauto);
return(NULL); */
num_signals = nprobe + nauto;
/*
mexPrintf("num_signals = %d, nprobe = %d, nauto = %d\n",num_signals,
nprobe,nauto);
*/
/* mexPrintf("%s",ahdr); */
strncpy(nbuf, &ahdr[8], 4);
nbuf[4] = 0;
nsweep_names = atoi(nbuf);
data_rows = hs_determine_num_data_rows(&ahdr[256],num_signals,nauto,
&sig_type,nsweep_names,&nsweep_var);
mxFree(ahdr);
/* count data lines */
i = 0;
sweep_count = 0;
col_count = 0;
while(1)
{
val_flag = hs_validate_column(fp,data_rows,i,nsweep_var,block_size,
simsource,col_count++);
if (val_flag == 1)
break;
else if (val_flag == 2)
{
/* mexPrintf("i = %d\n",i); */
if (sweep_count == 0)
data_cols = i;
else
{
if (data_cols > i)
data_cols = i;
}
i = -1;
fseek(fp,20,SEEK_CUR);
sweep_count += 1;
}
i++;
}
if (sweep_count < 1)
{
data_cols = i;
sweep_count=1;
}
return(init_SpiceData(num_signals,nauto,data_rows,data_cols,sweep_count,nsweep_var,nsweep_names,block_size));
}
int hs_determine_num_data_rows(char *line, int num_signals, int nauto,
int *ind_sig_type, int num_sweep_names, int *num_sweep_vars)
{
char *cp;
char *signam;
int i;
int hstype;
int signal_type;
int current_row;
current_row = 0;
/* mexPrintf("%s\n",line); */
/* type of independent variable */
cp = strtok(line, " \t\n");
if(!cp)
{
mexPrintf("error in hs_determine_num_data_rows: initial vartype not found on header line\n");
return(-1);
}
hstype = atoi(cp);
switch(hstype) {
case 1:
signal_type = TIME;
break;
case 2:
signal_type = FREQUENCY;
break;
case 3:
signal_type = VOLTAGE;
break;
default:
signal_type = UNKNOWN;
break;
}
*ind_sig_type = signal_type;
current_row++;
/* dependent variable types */
for(i = 1; i < num_signals; i++)
{
cp = strtok(NULL, " \t\n");
if(!cp) {
mexPrintf("error in hs_determine_num_data_rows: not enough vartypes on header line\n");
return(-1);
}
if(!isdigit(cp[0])) {
mexPrintf("error in hs_determine_num_data_rows: bad vartype %d [%s] on header line\n", i, cp);
return(-1);
}
/* how many columns comprise this variable? */
current_row++;
if(i < nauto && signal_type == FREQUENCY)
current_row++;
}
/* independent variable name */
signam = strtok(NULL, " \t\n");
if(!signam) {
mexPrintf("error in hs_determine_num_data_rows: no IV name found on header line");
return(-1);
}
/* dependent variable names */
for(i = 1; i < num_signals; i++)
{
if((signam = strtok(NULL, " \t\n")) == NULL)
{
mexPrintf("error in hs_determine_num_data_rows: not enough DV names found on header line\n");
mexPrintf(" num_signals = %d, got to %d\n",num_signals-1,i);
return(-1);
}
/* mexPrintf("(%d) dv = %s\n",i,signam); */
}
if (num_sweep_names > 0)
{
if((signam = strtok(NULL, " \t\n")) == NULL)
{
mexPrintf("error in hs_determine_num_data_rows: not enough sweep parameter names found on header line\n");
return(-1);
}
if (strcmp(signam,"MONTE_CARLO") == 0)
*num_sweep_vars = num_sweep_names;
else if (num_sweep_names > 1)
*num_sweep_vars = num_sweep_names-1;
else
*num_sweep_vars = num_sweep_names;
}
else
*num_sweep_vars = 0;
return(current_row);
}
/* Read spice-type file header - hspice binary */
int hs_determine_variables(FILE *fp, SpiceData *sf, char *simsource)
{
char *ahdr;
int ahdrsize;
int nprobe,nsweep_var;
char nbuf[16];
int char_position, header_seg_length[MAX_HEADER_BLOCKS],i,j,k;
unsigned int ibuf[4],term_seq;
rewind(fp);
if(fread_int_values(simsource,ibuf, 4, fp) != 4)
{
mexPrintf("error in hs_determine_variables: EOF reading block1 header\n");
return(0);
}
ahdrsize = 0;
for (i = 0; i < MAX_HEADER_BLOCKS; i++)
{
header_seg_length[i] =ibuf[3];
ahdrsize += header_seg_length[i];
fseek(fp,header_seg_length[i]-8,SEEK_CUR);
if(fread_int_values(simsource,&term_seq,1, fp) != 1)
{
mexPrintf("error in hs_determine_variables: EOF reading block trailer\n");
return(0);
}
fseek(fp,4,SEEK_CUR);
if(fread_int_values(simsource,ibuf,1, fp) != 1)
{
mexPrintf("error in hs_determine_variables: EOF reading block trailer\n");
return(0);
}
if (ibuf[0] != header_seg_length[i])
{
mexPrintf("error in hs_determine_variables: block trailer mismatch\n");
return(0);
}
if(fread_int_values(simsource,ibuf, 4, fp) != 4)
{
mexPrintf("error in hs_determine_variables: EOF reading block header\n");
return(0);
}
if(ibuf[0] != 4 || ibuf[2] != 4)
{
mexPrintf("error in hs_determine_variables: unexepected values in block header\n");
return(0);
}
/* test to see if more ascii header remains */
if (strcmp(simsource,"hspice_win") == 0)
{
if (term_seq == 0x23252624)
break;
}
else
{
if (term_seq == 0x24262523)
break;
}
/* old method:
if (ibuf[1] == 2048)
break;
*/
}
ahdrsize += 20*i;
if (i == MAX_HEADER_BLOCKS)
{
mexPrintf("error in hs_determine_variables: too many header blocks!\n");
mexPrintf(" must increase MAX_HEADER_BLOCKS value in source code\n");
return(0);
}
rewind(fp);
fseek(fp,16,SEEK_CUR);
if ((ahdr = (char *) mxCalloc(ahdrsize+1,sizeof(char))) == NULL)
{
mexPrintf("error in hs_determine_variables: mxCalloc call failed - \n");
mexPrintf(" not enough memory!!\n");
return(0);
}
if(fread(ahdr, sizeof(char), ahdrsize, fp) != ahdrsize) {
mexPrintf("error in hs_determine_variables: EOF reading block1\n");
return(0);
}
ahdr[ahdrsize] = '\0';
/* remove false '\0' characters */
for (k = 0; k < ahdrsize; k++)
if (ahdr[k] == '\0')
ahdr[k] = ' ';
/* remove block information from header */
char_position = 0;
for (j = 0; j < i; j++)
{
char_position += header_seg_length[j];
for (k = 0; k < 20; k++)
ahdr[char_position+k] = ' ';
char_position += 20;
}
if(fread_int_values(simsource,ibuf,1, fp) != 1) {
mexPrintf("error in hs_determine_variables: EOF reading block1 trailer\n");
return(0);
}
if(ibuf[0] != header_seg_length[i]) {
mexPrintf("error in hs_determine_variables: block1 trailer mismatch\n");
return(0);
}
hs_process_header(&ahdr[256], sf);
if(fread_int_values(simsource,ibuf, 4, fp) != 4) {
mexPrintf("error in hs_determine_variables: EOF reading block2 header\n");
return(0);
}
sf->current_column = 0;
mxFree(ahdr);
return(1);
}
void hs_process_header(char *line, SpiceData *sf)
{
char *cp;
char *signam;
int i,j;
int hstype;
int current_row;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -