switch statements vs if-else-if in plot_raw_custom_data(); do not try to measure non existing waveforms due to expression syntax errors
This commit is contained in:
parent
c08cc359f3
commit
e3fe1029cd
|
|
@ -2189,6 +2189,7 @@ static void show_node_measures(int measure_p, double measure_x, double measure_p
|
||||||
char tmpstr[1024];
|
char tmpstr[1024];
|
||||||
double yy;
|
double yy;
|
||||||
/* show values of signals if cursor1 active */
|
/* show values of signals if cursor1 active */
|
||||||
|
if(idx == -1) return;
|
||||||
if(measure_p >= 0) {
|
if(measure_p >= 0) {
|
||||||
|
|
||||||
/* draw node values in graph */
|
/* draw node values in graph */
|
||||||
|
|
|
||||||
244
src/save.c
244
src/save.c
|
|
@ -521,11 +521,13 @@ int get_raw_index(const char *node)
|
||||||
#define LOG10 -11
|
#define LOG10 -11
|
||||||
#define ABS -12
|
#define ABS -12
|
||||||
#define SGN -13
|
#define SGN -13
|
||||||
#define INTEG -14
|
#define SQRT -14
|
||||||
#define AVG -15
|
#define TAN -15
|
||||||
#define DERIV -16
|
#define INTEG -34
|
||||||
#define EXCH -17
|
#define AVG -35
|
||||||
#define DUP -18
|
#define DERIV -36
|
||||||
|
#define EXCH -37
|
||||||
|
#define DUP -38
|
||||||
#define NUMBER -60
|
#define NUMBER -60
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
@ -542,7 +544,7 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr)
|
||||||
const char *n;
|
const char *n;
|
||||||
char *endptr, *ntok_copy = NULL, *ntok_save, *ntok_ptr;
|
char *endptr, *ntok_copy = NULL, *ntok_save, *ntok_ptr;
|
||||||
Stack1 stack1[STACKMAX];
|
Stack1 stack1[STACKMAX];
|
||||||
double v, stack2[STACKMAX];
|
double v, stack2[STACKMAX], tmp, integ, deriv, avg;
|
||||||
int stackptr1 = 0, stackptr2 = 0;
|
int stackptr1 = 0, stackptr2 = 0;
|
||||||
SPICE_DATA *y = xctx->graph_values[xctx->graph_nvars]; /* custom plot data column */
|
SPICE_DATA *y = xctx->graph_values[xctx->graph_nvars]; /* custom plot data column */
|
||||||
SPICE_DATA *x = xctx->graph_values[sweep_idx];
|
SPICE_DATA *x = xctx->graph_values[sweep_idx];
|
||||||
|
|
@ -567,6 +569,8 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr)
|
||||||
else if(!strcmp(n, "cos()")) stack1[stackptr1++].i = COS;
|
else if(!strcmp(n, "cos()")) stack1[stackptr1++].i = COS;
|
||||||
else if(!strcmp(n, "abs()")) stack1[stackptr1++].i = ABS;
|
else if(!strcmp(n, "abs()")) stack1[stackptr1++].i = ABS;
|
||||||
else if(!strcmp(n, "sgn()")) stack1[stackptr1++].i = SGN;
|
else if(!strcmp(n, "sgn()")) stack1[stackptr1++].i = SGN;
|
||||||
|
else if(!strcmp(n, "sqrt()")) stack1[stackptr1++].i = SQRT;
|
||||||
|
else if(!strcmp(n, "tan()")) stack1[stackptr1++].i = TAN;
|
||||||
else if(!strcmp(n, "exp()")) stack1[stackptr1++].i = EXP;
|
else if(!strcmp(n, "exp()")) stack1[stackptr1++].i = EXP;
|
||||||
else if(!strcmp(n, "ln()")) stack1[stackptr1++].i = LN;
|
else if(!strcmp(n, "ln()")) stack1[stackptr1++].i = LN;
|
||||||
else if(!strcmp(n, "log10()")) stack1[stackptr1++].i = LOG10;
|
else if(!strcmp(n, "log10()")) stack1[stackptr1++].i = LOG10;
|
||||||
|
|
@ -590,7 +594,7 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr)
|
||||||
stackptr1++;
|
stackptr1++;
|
||||||
}
|
}
|
||||||
dbg(1, " plot_raw_custom_data(): stack1= %d\n", stack1[stackptr1 - 1].i);
|
dbg(1, " plot_raw_custom_data(): stack1= %d\n", stack1[stackptr1 - 1].i);
|
||||||
}
|
} /* while(n = my_strtok_r(...) */
|
||||||
my_free(575, &ntok_copy);
|
my_free(575, &ntok_copy);
|
||||||
for(p = first ; p <= last; p++) {
|
for(p = first ; p <= last; p++) {
|
||||||
stackptr2 = 0;
|
stackptr2 = 0;
|
||||||
|
|
@ -603,116 +607,124 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(stackptr2 > 1) { /* 2 argument operators */
|
if(stackptr2 > 1) { /* 2 argument operators */
|
||||||
if(stack1[i].i == PLUS) {
|
switch(stack1[i].i) {
|
||||||
stack2[stackptr2 - 2] = stack2[stackptr2 - 2] + stack2[stackptr2 - 1];
|
case PLUS:
|
||||||
stackptr2--;
|
stack2[stackptr2 - 2] = stack2[stackptr2 - 2] + stack2[stackptr2 - 1];
|
||||||
}
|
stackptr2--;
|
||||||
else if(stack1[i].i == MINUS) {
|
break;
|
||||||
stack2[stackptr2 - 2] = stack2[stackptr2 - 2] - stack2[stackptr2 - 1];
|
case MINUS:
|
||||||
stackptr2--;
|
stack2[stackptr2 - 2] = stack2[stackptr2 - 2] - stack2[stackptr2 - 1];
|
||||||
}
|
stackptr2--;
|
||||||
else if(stack1[i].i == MULT) {
|
break;
|
||||||
stack2[stackptr2 - 2] = stack2[stackptr2 - 2] * stack2[stackptr2 - 1];
|
case MULT:
|
||||||
stackptr2--;
|
stack2[stackptr2 - 2] = stack2[stackptr2 - 2] * stack2[stackptr2 - 1];
|
||||||
}
|
stackptr2--;
|
||||||
else if(stack1[i].i == DIVIS) {
|
break;
|
||||||
if(p == first) stack1[i].prev = 0;
|
case DIVIS:
|
||||||
if(stack2[stackptr2 - 1]) {
|
if(p == first) stack1[i].prev = 0;
|
||||||
stack2[stackptr2 - 2] = stack2[stackptr2 - 2] / stack2[stackptr2 - 1];
|
if(stack2[stackptr2 - 1]) {
|
||||||
} else {
|
stack2[stackptr2 - 2] = stack2[stackptr2 - 2] / stack2[stackptr2 - 1];
|
||||||
stack2[stackptr2 - 2] = stack1[i].prev;
|
} else {
|
||||||
}
|
stack2[stackptr2 - 2] = stack1[i].prev;
|
||||||
stack1[i].prev = stack2[stackptr2 - 2];
|
|
||||||
stackptr2--;
|
|
||||||
}
|
|
||||||
else if(stack1[i].i == POW) {
|
|
||||||
stack2[stackptr2 - 2] = pow(stack2[stackptr2 - 2], stack2[stackptr2 - 1]);
|
|
||||||
stackptr2--;
|
|
||||||
}
|
|
||||||
else if(stack1[i].i == EXCH) {
|
|
||||||
double tmp;
|
|
||||||
tmp = stack2[stackptr2 - 2];
|
|
||||||
stack2[stackptr2 - 2] = stack2[stackptr2 - 1];
|
|
||||||
stack2[stackptr2 - 1] = tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(stackptr2 > 0) { /* 1 argument operators */
|
|
||||||
if(stack1[i].i == AVG) {
|
|
||||||
double avg = 0;
|
|
||||||
if( p == first ) {
|
|
||||||
avg = stack2[stackptr2 - 1];
|
|
||||||
stack1[i].prev = stack2[stackptr2 - 1];
|
|
||||||
stack1[i].prevy = stack2[stackptr2 - 1];
|
|
||||||
stack1[i].prevx = x[p];
|
|
||||||
} else {
|
|
||||||
if((x[p] != stack1[i].prevx)) {
|
|
||||||
avg = stack1[i].prev * (x[p - 1] - stack1[i].prevx) +
|
|
||||||
(x[p] - x[p - 1]) * (stack1[i].prevy + stack2[stackptr2 - 1]) * 0.5;
|
|
||||||
avg /= (x[p] - stack1[i].prevx);
|
|
||||||
} else {
|
|
||||||
avg = stack1[i].prev;
|
|
||||||
}
|
}
|
||||||
stack1[i].prev = avg;
|
stack1[i].prev = stack2[stackptr2 - 2];
|
||||||
stack1[i].prevy = stack2[stackptr2 - 1];
|
stackptr2--;
|
||||||
}
|
break;
|
||||||
stack2[stackptr2 - 1] = avg;
|
case POW:
|
||||||
}
|
stack2[stackptr2 - 2] = pow(stack2[stackptr2 - 2], stack2[stackptr2 - 1]);
|
||||||
else if(stack1[i].i == DUP) {
|
stackptr2--;
|
||||||
stack2[stackptr2] = stack2[stackptr2 - 1];
|
break;
|
||||||
stackptr2++;
|
case EXCH:
|
||||||
}
|
tmp = stack2[stackptr2 - 2];
|
||||||
else if(stack1[i].i == INTEG) {
|
stack2[stackptr2 - 2] = stack2[stackptr2 - 1];
|
||||||
double integ = 0;
|
stack2[stackptr2 - 1] = tmp;
|
||||||
if( p == first ) {
|
break;
|
||||||
integ = 0;
|
default:
|
||||||
stack1[i].prev = 0;
|
break;
|
||||||
stack1[i].prevy = stack2[stackptr2 - 1];
|
} /* switch(...) */
|
||||||
} else {
|
} /* if(stackptr2 > 1) */
|
||||||
integ = stack1[i].prev + (x[p] - x[p - 1]) * (stack1[i].prevy + stack2[stackptr2 - 1]) * 0.5;
|
if(stackptr2 > 0) { /* 1 argument operators */
|
||||||
stack1[i].prev = integ;
|
switch(stack1[i].i) {
|
||||||
stack1[i].prevy = stack2[stackptr2 - 1];
|
case AVG:
|
||||||
}
|
if( p == first ) {
|
||||||
stack2[stackptr2 - 1] = integ;
|
avg = stack2[stackptr2 - 1];
|
||||||
}
|
stack1[i].prev = stack2[stackptr2 - 1];
|
||||||
else if(stack1[i].i == DERIV) {
|
stack1[i].prevy = stack2[stackptr2 - 1];
|
||||||
double deriv = 0;
|
stack1[i].prevx = x[p];
|
||||||
if( p == first ) {
|
} else {
|
||||||
deriv = 0;
|
if((x[p] != stack1[i].prevx)) {
|
||||||
stack1[i].prev = 0;
|
avg = stack1[i].prev * (x[p - 1] - stack1[i].prevx) +
|
||||||
stack1[i].prevy = stack2[stackptr2 - 1];
|
(x[p] - x[p - 1]) * (stack1[i].prevy + stack2[stackptr2 - 1]) * 0.5;
|
||||||
} else {
|
avg /= (x[p] - stack1[i].prevx);
|
||||||
if((x[p] != x[p - 1]))
|
} else {
|
||||||
deriv = (stack2[stackptr2 - 1] - stack1[i].prevy) / (x[p] - x[p - 1]);
|
avg = stack1[i].prev;
|
||||||
else
|
}
|
||||||
deriv = stack1[i].prevy;
|
stack1[i].prev = avg;
|
||||||
stack1[i].prevy = stack2[stackptr2 - 1] ;
|
stack1[i].prevy = stack2[stackptr2 - 1];
|
||||||
stack1[i].prev = deriv;
|
}
|
||||||
}
|
stack2[stackptr2 - 1] = avg;
|
||||||
stack2[stackptr2 - 1] = deriv;
|
break;
|
||||||
}
|
case DUP:
|
||||||
else if(stack1[i].i == SIN) {
|
stack2[stackptr2] = stack2[stackptr2 - 1];
|
||||||
stack2[stackptr2 - 1] = sin(stack2[stackptr2 - 1]);
|
stackptr2++;
|
||||||
}
|
break;
|
||||||
else if(stack1[i].i == COS) {
|
case INTEG:
|
||||||
stack2[stackptr2 - 1] = cos(stack2[stackptr2 - 1]);
|
if( p == first ) {
|
||||||
}
|
integ = 0;
|
||||||
else if(stack1[i].i == ABS) {
|
stack1[i].prev = 0;
|
||||||
stack2[stackptr2 - 1] = fabs(stack2[stackptr2 - 1]);
|
stack1[i].prevy = stack2[stackptr2 - 1];
|
||||||
}
|
} else {
|
||||||
else if(stack1[i].i == EXP) {
|
integ = stack1[i].prev + (x[p] - x[p - 1]) * (stack1[i].prevy + stack2[stackptr2 - 1]) * 0.5;
|
||||||
stack2[stackptr2 - 1] = exp(stack2[stackptr2 - 1]);
|
stack1[i].prev = integ;
|
||||||
}
|
stack1[i].prevy = stack2[stackptr2 - 1];
|
||||||
else if(stack1[i].i == LN) {
|
}
|
||||||
stack2[stackptr2 - 1] = log(stack2[stackptr2 - 1]);
|
stack2[stackptr2 - 1] = integ;
|
||||||
}
|
break;
|
||||||
else if(stack1[i].i == LOG10) {
|
case DERIV:
|
||||||
stack2[stackptr2 - 1] = log10(stack2[stackptr2 - 1]);
|
if( p == first ) {
|
||||||
}
|
deriv = 0;
|
||||||
else if(stack1[i].i == SGN) {
|
stack1[i].prev = 0;
|
||||||
stack2[stackptr2 - 1] = stack2[stackptr2 - 1] > 0.0 ? 1 :
|
stack1[i].prevy = stack2[stackptr2 - 1];
|
||||||
stack2[stackptr2 - 1] < 0.0 ? -1 : 0;
|
} else {
|
||||||
}
|
if((x[p] != x[p - 1]))
|
||||||
} /* else if(stackptr2 > 0) */
|
deriv = (stack2[stackptr2 - 1] - stack1[i].prevy) / (x[p] - x[p - 1]);
|
||||||
|
else
|
||||||
|
deriv = stack1[i].prevy;
|
||||||
|
stack1[i].prevy = stack2[stackptr2 - 1] ;
|
||||||
|
stack1[i].prev = deriv;
|
||||||
|
}
|
||||||
|
stack2[stackptr2 - 1] = deriv;
|
||||||
|
break;
|
||||||
|
case SQRT:
|
||||||
|
stack2[stackptr2 - 1] = sqrt(stack2[stackptr2 - 1]);
|
||||||
|
break;
|
||||||
|
case TAN:
|
||||||
|
stack2[stackptr2 - 1] = tan(stack2[stackptr2 - 1]);
|
||||||
|
break;
|
||||||
|
case SIN:
|
||||||
|
stack2[stackptr2 - 1] = sin(stack2[stackptr2 - 1]);
|
||||||
|
break;
|
||||||
|
case COS:
|
||||||
|
stack2[stackptr2 - 1] = cos(stack2[stackptr2 - 1]);
|
||||||
|
break;
|
||||||
|
case ABS:
|
||||||
|
stack2[stackptr2 - 1] = fabs(stack2[stackptr2 - 1]);
|
||||||
|
break;
|
||||||
|
case EXP:
|
||||||
|
stack2[stackptr2 - 1] = exp(stack2[stackptr2 - 1]);
|
||||||
|
break;
|
||||||
|
case LN:
|
||||||
|
stack2[stackptr2 - 1] = log(stack2[stackptr2 - 1]);
|
||||||
|
break;
|
||||||
|
case LOG10:
|
||||||
|
stack2[stackptr2 - 1] = log10(stack2[stackptr2 - 1]);
|
||||||
|
break;
|
||||||
|
case SGN:
|
||||||
|
stack2[stackptr2 - 1] = stack2[stackptr2 - 1] > 0.0 ? 1 :
|
||||||
|
stack2[stackptr2 - 1] < 0.0 ? -1 : 0;
|
||||||
|
break;
|
||||||
|
} /* switch(...) */
|
||||||
|
} /* if(stackptr2 > 0) */
|
||||||
} /* for(i = 0; i < stackptr1; i++) */
|
} /* for(i = 0; i < stackptr1; i++) */
|
||||||
y[p] = stack2[0];
|
y[p] = stack2[0];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue