⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 loadsig.c

📁 hspice toolbox with matlab.
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -