added wave @ cursor measurement feature
This commit is contained in:
parent
625495e27a
commit
31ba4ce0d6
|
|
@ -40,10 +40,14 @@ static int waves_selected(int event, int key, int state, int button)
|
|||
if( (xctx->ui_state & GRAPHPAN) ||
|
||||
POINTINSIDE(xctx->mousex, xctx->mousey, r->x1 + 40, r->y1 + 20, r->x2 - 30, r->y2 - 10) ) {
|
||||
is_inside = 1;
|
||||
tclvareval(xctx->top_path, ".drw configure -cursor tcross" , NULL);
|
||||
}
|
||||
}
|
||||
if(!is_inside && (xctx->graph_flags & 64) ) {
|
||||
tcleval("graph_stop_measure");
|
||||
if(!is_inside) {
|
||||
tclvareval(xctx->top_path, ".drw configure -cursor arrow" , NULL);
|
||||
if(xctx->graph_flags & 64) {
|
||||
tcleval("graph_show_measure stop");
|
||||
}
|
||||
}
|
||||
return is_inside;
|
||||
}
|
||||
|
|
@ -211,7 +215,7 @@ static int waves_callback(int event, int mx, int my, KeySym key, int button, int
|
|||
if(!(r->flags & 1) ) continue;
|
||||
/* check if this is the master graph (the one containing the mouse pointer) */
|
||||
/* determine if mouse pointer is below xaxis or left of yaxis in some graph */
|
||||
if( POINTINSIDE(xctx->mousex_snap, xctx->mousey_snap, r->x1, r->y1, r->x2, r->y2)) {
|
||||
if( POINTINSIDE(xctx->mousex, xctx->mousey, r->x1, r->y1, r->x2, r->y2)) {
|
||||
val = get_tok_value(r->prop_ptr,"x1",0);
|
||||
if(val[0]) wx1 = atof(val);
|
||||
else wx1 = 0;
|
||||
|
|
@ -285,7 +289,7 @@ static int waves_callback(int event, int mx, int my, KeySym key, int button, int
|
|||
else if((key == 'm') ) {
|
||||
xctx->graph_flags ^= 64;
|
||||
if(!(xctx->graph_flags & 64)) {
|
||||
tcleval("graph_stop_measure");
|
||||
tcleval("graph_show_measure stop");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -363,13 +367,13 @@ static int waves_callback(int event, int mx, int my, KeySym key, int button, int
|
|||
/* destroy / show measurement widget */
|
||||
if(i == xctx->graph_master) {
|
||||
if(xctx->graph_flags & 64) {
|
||||
if( POINTINSIDE(xctx->mousex_snap, xctx->mousey_snap, x1, y1, x2, y2)) {
|
||||
if( POINTINSIDE(xctx->mousex, xctx->mousey, x1, y1, x2, y2)) {
|
||||
char sx[100], sy[100];
|
||||
double yval;
|
||||
if(digital) {
|
||||
double deltag = wy2 - wy1;
|
||||
double s1 = 0.1; /* 10 waveforms fit in graph if unscaled vertically */
|
||||
double s2 = .08; /* 20% spacing between traces */
|
||||
double s1 = DIG_NWAVES; /* 1/DIG_NWAVES waveforms fit in graph if unscaled vertically */
|
||||
double s2 = DIG_SPACE; /* (DIG_NWAVES - DIG_SPACE) spacing between traces */
|
||||
double c = s1 * deltag;
|
||||
deltag = deltag * s1 / s2;
|
||||
yval=(DG_Y(xctx->mousey) - c) / s2;
|
||||
|
|
@ -384,7 +388,7 @@ static int waves_callback(int event, int mx, int my, KeySym key, int button, int
|
|||
tclvareval("set measure_text \"y=", sy, "\nx=", sx, "\"", NULL);
|
||||
tcleval("graph_show_measure");
|
||||
} else {
|
||||
tcleval("graph_stop_measure");
|
||||
tcleval("graph_show_measure stop");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -407,11 +411,11 @@ static int waves_callback(int event, int mx, int my, KeySym key, int button, int
|
|||
if(xctx->graph_left) {
|
||||
if(i == xctx->graph_master) {
|
||||
if(digital) {
|
||||
delta = (ypos2 - ypos1) / divy;
|
||||
delta = (ypos2 - ypos1);
|
||||
delta_threshold = 0.01;
|
||||
if(fabs(xctx->my_double_save - xctx->mousey_snap) > fabs(cy * delta) * delta_threshold) {
|
||||
yy1 = ypos1 + (xctx->my_double_save - xctx->mousey_snap) / cy;
|
||||
yy2 = ypos2 + (xctx->my_double_save - xctx->mousey_snap) / cy;
|
||||
if(fabs(xctx->my_double_save - xctx->mousey_snap) > fabs(dcy * delta) * delta_threshold) {
|
||||
yy1 = ypos1 + (xctx->my_double_save - xctx->mousey_snap) / dcy;
|
||||
yy2 = ypos2 + (xctx->my_double_save - xctx->mousey_snap) / dcy;
|
||||
my_snprintf(s, S(s), "%g", yy1);
|
||||
my_strdup(1424, &r->prop_ptr, subst_token(r->prop_ptr, "ypos1", s));
|
||||
my_snprintf(s, S(s), "%g", yy2);
|
||||
|
|
|
|||
252
src/draw.c
252
src/draw.c
|
|
@ -1701,8 +1701,8 @@ void calc_graph_area(int c, int i, int digital, double *x1, double *y1,double *x
|
|||
/* set margins */
|
||||
tmp = rw * 0.14;
|
||||
*marginx = tmp < 30 ? 30 : tmp;
|
||||
tmp = rh * 0.13;
|
||||
*marginy = tmp < 30 ? 30 : tmp;
|
||||
tmp = rh * 0.14;
|
||||
*marginy = tmp < 35 ? 35 : tmp;
|
||||
|
||||
/* calculate graph bounding box (container - margin)
|
||||
* This is the box where plot is done */
|
||||
|
|
@ -1792,6 +1792,62 @@ int schematic_waves_loaded(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int get_bus_value(int n_bits, int *idx_arr, int p, char *busval, double wy1, double wy2)
|
||||
{
|
||||
int hex_digits = ((n_bits - 1) >> 2) + 1;
|
||||
double vth = (wy1 + wy2) * 0.5;
|
||||
double val;
|
||||
int i;
|
||||
int hexdigit = 0;
|
||||
int bin = 0;
|
||||
int hex = 0;
|
||||
|
||||
for(i = n_bits - 1; i >= 0; i--) {
|
||||
val = xctx->graph_values[idx_arr[i]][p];
|
||||
hexdigit = hexdigit + ((val > vth) << bin);
|
||||
if( bin >= 3) {
|
||||
hex++;
|
||||
busval[hex_digits - hex] = (hexdigit < 10) ? '0' + hexdigit : 'A' + hexdigit - 10;
|
||||
hexdigit = 0;
|
||||
bin = 0;
|
||||
} else bin++;
|
||||
}
|
||||
if(bin) {
|
||||
hex++;
|
||||
busval[hex_digits - hex] = (hexdigit < 10) ? '0' + hexdigit : 'A' + hexdigit - 10;
|
||||
hexdigit = 0;
|
||||
}
|
||||
|
||||
busval[hex_digits] = '\0';
|
||||
|
||||
/* my_strncpy(busval, "AA", 3); */
|
||||
return hex_digits;
|
||||
}
|
||||
|
||||
|
||||
/* idx_arr malloc-ated and returned, caller must free! */
|
||||
static int *get_bus_idx_array(const char *ntok, int *n_bits)
|
||||
{
|
||||
int *idx_arr =NULL;
|
||||
int p;
|
||||
char *ntok_savep, *ntok_ptr, *ntok_copy = NULL;
|
||||
const char *bit_name;
|
||||
*n_bits = count_items(ntok, ",") - 1;
|
||||
idx_arr = my_malloc(1454, (*n_bits) * sizeof(int));
|
||||
p = 0;
|
||||
my_strdup2(1402, &ntok_copy, ntok);
|
||||
ntok_ptr = ntok_copy;
|
||||
my_strtok_r(ntok_ptr, ",", &ntok_savep); /*strip off bus name (1st field) */
|
||||
while( (bit_name = my_strtok_r(NULL, ",", &ntok_savep)) ) {
|
||||
int idx;
|
||||
if( (idx = get_raw_index(bit_name)) != -1) {
|
||||
idx_arr[p] = idx;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
my_free(1404, &ntok_copy);
|
||||
return idx_arr;
|
||||
}
|
||||
|
||||
/* coordinate transformations graph to xschem */
|
||||
#define W_X(x) (cx * (x) + dx)
|
||||
|
|
@ -1809,91 +1865,60 @@ int schematic_waves_loaded(void)
|
|||
* following are bits that are bundled together:
|
||||
LDA,LDA[3],LDA[2],LDA1],LDA[0]
|
||||
*/
|
||||
static void draw_graph_bus_points(const char *ntok, int first, int last,
|
||||
static void draw_graph_bus_points(const char *ntok, int n_bits, int *idx_arr,
|
||||
int first, int last,
|
||||
double cx, double dx, double dcy, double ddy,
|
||||
int wave_col, int sweep_idx,
|
||||
int wcnt, int n_nodes,
|
||||
double wy1, double wy2, double ypos1, double ypos2)
|
||||
{
|
||||
int p, i;
|
||||
int p;
|
||||
double deltag = wy2 - wy1;
|
||||
double s1 = 0.1; /* 10 waveforms fit in graph if unscaled vertically */
|
||||
double s2 = .08; /* 20% spacing between traces */
|
||||
double s1 = DIG_NWAVES; /* 1/DIG_NWAVES waveforms fit in graph if unscaled vertically */
|
||||
double s2 = DIG_SPACE; /* (DIG_NWAVES - DIG_SPACE) spacing between traces */
|
||||
double c = (n_nodes - wcnt) * s1 * deltag - wy1 * s2;
|
||||
double x1 = W_X(xctx->graph_values[sweep_idx][first]);
|
||||
double x2 = W_X(xctx->graph_values[sweep_idx][last-1]);
|
||||
double ylow = DW_Y(c + wy2 * s2); /* swapped as xschem Y coordinates are top-bottom */
|
||||
double yhigh = DW_Y(c + wy1 * s2);
|
||||
const char *bit_name;
|
||||
char *ntok_savep, *ntok_ptr, *ntok_copy = NULL;
|
||||
int n_bits = count_items(ntok, ",") - 1;
|
||||
int *idx_arr = NULL;
|
||||
unsigned long busval, old_busval;
|
||||
double vth = (wy1 + wy2) * 0.5; /* A to D threshold */
|
||||
double val, xval, xval_old;
|
||||
char busval[1024], old_busval[1024];
|
||||
double xval, xval_old;
|
||||
double ydelta = fabs(yhigh - ylow);
|
||||
double labsize = 0.015 * ydelta;
|
||||
double charwidth = labsize * 38.0;
|
||||
char str[100];
|
||||
int hex_digits = (n_bits - 1) * 0.25 + 1;
|
||||
double x_size = 1.5 * xctx->zoom;
|
||||
idx_arr = my_malloc(1454, (n_bits) * sizeof(int));
|
||||
p = 0;
|
||||
dbg(1, "n_bits = %d\n", n_bits);
|
||||
my_strdup2(1402, &ntok_copy, ntok);
|
||||
ntok_ptr = ntok_copy;
|
||||
my_strtok_r(ntok_ptr, ",", &ntok_savep); /*strip off bus name (1st field) */
|
||||
while( (bit_name = my_strtok_r(NULL, ",", &ntok_savep)) ) {
|
||||
int idx;
|
||||
dbg(1, "draw_graph_bus_points(): bit %d : %s: ", p, bit_name);
|
||||
if( (idx = get_raw_index(bit_name)) != -1) {
|
||||
dbg(1, "%d\n", idx);
|
||||
idx_arr[p] = idx;
|
||||
} else {
|
||||
dbg(1, "\n");
|
||||
}
|
||||
p++;
|
||||
}
|
||||
my_free(1404, &ntok_copy);
|
||||
drawline(wave_col, NOW, x1, ylow, x2, ylow, 0);
|
||||
drawline(wave_col, NOW, x1, yhigh, x2, yhigh, 0);
|
||||
for(p = first ; p <= last; p++) {
|
||||
/* calculate value of bus by adding all binary bits */
|
||||
busval = 0;
|
||||
for(i = 0; i < n_bits; i++) {
|
||||
val = xctx->graph_values[idx_arr[i]][p];
|
||||
busval = (busval << 1) + (val > vth);
|
||||
}
|
||||
/* hex_digits = */
|
||||
get_bus_value(n_bits, idx_arr, p, busval, wy1, wy2);
|
||||
xval = W_X(xctx->graph_values[sweep_idx][p]);
|
||||
/* used to draw bus value before 1st transition */
|
||||
if(p == first) {
|
||||
old_busval = busval;
|
||||
my_strncpy(old_busval, busval, strlen(busval)+1);
|
||||
xval_old = xval;
|
||||
}
|
||||
if(p > first && busval != old_busval) {
|
||||
if(p > first && strcmp(busval, old_busval)) {
|
||||
/* draw transition ('X') */
|
||||
drawline(BACKLAYER, NOW, xval-x_size, yhigh, xval+x_size, yhigh, 0);
|
||||
drawline(BACKLAYER, NOW, xval-x_size, ylow, xval+x_size, ylow, 0);
|
||||
drawline(wave_col, NOW, xval-x_size, ylow, xval+x_size, yhigh, 0);
|
||||
drawline(wave_col, NOW, xval-x_size, yhigh, xval+x_size, ylow, 0);
|
||||
/* build hex string for bus value */
|
||||
sprintf(str, "%0*lX", hex_digits, old_busval);
|
||||
/* draw hex bus value if there is enough room */
|
||||
if( fabs(xval - xval_old) > strlen(str) * charwidth) {
|
||||
draw_string(wave_col, NOW, str, 2, 0, 1, 0, (xval + xval_old) * 0.5,
|
||||
if( fabs(xval - xval_old) > strlen(old_busval) * charwidth) {
|
||||
draw_string(wave_col, NOW, old_busval, 2, 0, 1, 0, (xval + xval_old) * 0.5,
|
||||
yhigh, labsize, labsize);
|
||||
}
|
||||
old_busval = busval;
|
||||
my_strncpy(old_busval, busval, strlen(busval)+1);
|
||||
xval_old = xval;
|
||||
} /* if(p > first && busval != old_busval) */
|
||||
} /* for(p = first ; p < last; p++) */
|
||||
/* draw hex bus value after last transition */
|
||||
sprintf(str, "%0*lX", hex_digits, busval);
|
||||
if( fabs(xval - xval_old) > strlen(str) * charwidth) {
|
||||
draw_string(wave_col, NOW, str, 2, 0, 1, 0, (xval + xval_old) * 0.5,
|
||||
if( fabs(xval - xval_old) > strlen(old_busval) * charwidth) {
|
||||
draw_string(wave_col, NOW, old_busval, 2, 0, 1, 0, (xval + xval_old) * 0.5,
|
||||
yhigh, labsize, labsize);
|
||||
}
|
||||
my_free(1455, &idx_arr);
|
||||
}
|
||||
|
||||
static void draw_graph_points(int v, int first, int last,
|
||||
|
|
@ -1911,8 +1936,8 @@ static void draw_graph_points(int v, int first, int last,
|
|||
double c;
|
||||
|
||||
if(digital) {
|
||||
s1 = 0.1; /* 10 waveforms fit in graph if unscaled vertically */
|
||||
s2 = .08; /* 20% spacing between traces */
|
||||
s1 = DIG_NWAVES; /* 1/DIG_NWAVES waveforms fit in graph if unscaled vertically */
|
||||
s2 = DIG_SPACE; /* (DIG_NWAVES - DIG_SPACE) spacing between traces */
|
||||
c = (n_nodes - wcnt) * s1 * deltag - wy1 * s2;
|
||||
}
|
||||
if( !digital || (c >= ypos1 && c <= ypos2) ) {
|
||||
|
|
@ -2078,7 +2103,7 @@ void draw_graph(int c, int i, int flags)
|
|||
int sweep_idx = 0;
|
||||
int n_nodes; /* number of variables to display in a single graph */
|
||||
xRect *r = &xctx->rect[c][i];
|
||||
char tmpstr[200];
|
||||
char tmpstr[1024];
|
||||
char *saven, *savec, *saves, *nptr, *cptr, *sptr;
|
||||
const char *ntok, *ctok, *stok;
|
||||
char *bus_msb = NULL;
|
||||
|
|
@ -2140,10 +2165,11 @@ void draw_graph(int c, int i, int flags)
|
|||
/* set margins */
|
||||
calc_graph_area(c, i, digital, &x1, &y1, &x2, &y2, &marginx, &marginy);
|
||||
|
||||
txtsizelab = marginy * 0.014;
|
||||
txtsizelab = marginy * 0.009;
|
||||
tmp = (x2 - x1) * 0.00036;
|
||||
if(tmp < txtsizelab) txtsizelab = tmp;
|
||||
digtxtsizelab = txtsizelab * 0.73;
|
||||
/* digtxtsizelab = txtsizelab * 0.85 * fabs( (wy2 - wy1) / (ypos2 - ypos1)); */
|
||||
digtxtsizelab = 0.300 * fabs( (wy2 - wy1) / (ypos2 - ypos1));
|
||||
/* cache coefficients for faster graph --> xschem coord transformations */
|
||||
cx = (x2 - x1) / (wx2 - wx1);
|
||||
dx = x1 - wx1 * cx;
|
||||
|
|
@ -2217,15 +2243,20 @@ void draw_graph(int c, int i, int flags)
|
|||
if(digital) {
|
||||
double xt = x1 - 10 * txtsizelab;
|
||||
double deltag = wy2 - wy1;
|
||||
double s1 = 0.1; /* 10 waveforms fit in graph if unscaled vertically */
|
||||
double s2 = .08; /* 20% spacing between traces */
|
||||
double yt = s1 * (double)(n_nodes - wcnt) * deltag - wy1 * s2;
|
||||
double s1 = DIG_NWAVES; /* 1/DIG_NWAVES waveforms fit in graph if unscaled vertically */
|
||||
double s2 = DIG_SPACE; /* (DIG_NWAVES - DIG_SPACE) spacing between traces */
|
||||
double yt;
|
||||
if(flags &2)
|
||||
yt = s1 * (double)(n_nodes - wcnt) * deltag - (wy1 - deltag * 0.4) * s2;
|
||||
else
|
||||
yt = s1 * (double)(n_nodes - wcnt) * deltag - (wy1 - deltag * 0.1) * s2;
|
||||
|
||||
if(yt <= ypos2 && yt >= ypos1) {
|
||||
draw_string(wave_color, NOW, tmpstr, 2, 0, 0, 0, xt, DW_Y(yt), digtxtsizelab, digtxtsizelab);
|
||||
}
|
||||
} else {
|
||||
draw_string(wave_color, NOW, tmpstr, 0, 0, 0, 0, rx1 + rw / n_nodes * wcnt, ry1, txtsizelab, txtsizelab);
|
||||
draw_string(wave_color, NOW, tmpstr, 0, 0, 0, 0,
|
||||
rx1 + 2 + rw / n_nodes * wcnt, ry1, txtsizelab, txtsizelab);
|
||||
}
|
||||
bbox(END, 0.0, 0.0, 0.0, 0.0);
|
||||
|
||||
|
|
@ -2237,16 +2268,17 @@ void draw_graph(int c, int i, int flags)
|
|||
double xx;
|
||||
double start;
|
||||
double end;
|
||||
int n_bits;
|
||||
int *idx_arr = NULL;
|
||||
|
||||
XPoint *point = NULL;
|
||||
|
||||
/* clipping everything outside graph area */
|
||||
bbox(START, 0.0, 0.0, 0.0, 0.0);
|
||||
bbox(ADD,x1, y1, x2, y2);
|
||||
bbox(SET, 0.0, 0.0, 0.0, 0.0);
|
||||
|
||||
ofs = 0;
|
||||
start = (wx1 <= wx2) ? wx1 : wx2;
|
||||
end = (wx1 <= wx2) ? wx2 : wx1;
|
||||
|
||||
if(bus_msb) {
|
||||
idx_arr = get_bus_idx_array(ntok, &n_bits); /* idx_arr allocated by function, must free! */
|
||||
}
|
||||
/* loop through all datasets found in raw file */
|
||||
for(dset = 0 ; dset < xctx->graph_datasets; dset++) {
|
||||
if(dataset == -1 || dset == dataset) {
|
||||
|
|
@ -2265,26 +2297,79 @@ void draw_graph(int c, int i, int flags)
|
|||
if(xx > end || xx < start || /* ... and we ran out of graph area ... */
|
||||
((sweep_idx == 0 && cnt > 1) && /* ... or sweep variable changed direction */
|
||||
SIGN(xx - prev_x) != SIGN(prev_x - prev_prev_x) ) ) {
|
||||
/* get y-axis points */
|
||||
if(bus_msb) {
|
||||
if(digital) {
|
||||
draw_graph_bus_points(ntok, first, last, cx, dx, dcy, ddy, wave_color,
|
||||
sweep_idx, wcnt, n_nodes,
|
||||
wy1, wy2, ypos1, ypos2);
|
||||
}
|
||||
} else {
|
||||
draw_graph_points(idx, first, last, scy, sdy, dscy, dsdy, point, wave_color,
|
||||
digital, wcnt, n_nodes, wy1, wy2, ypos1, ypos2);
|
||||
/* clipping everything outside graph area */
|
||||
bbox(START, 0.0, 0.0, 0.0, 0.0);
|
||||
bbox(ADD,x1, y1, x2, y2);
|
||||
bbox(SET, 0.0, 0.0, 0.0, 0.0);
|
||||
/* get y-axis points */
|
||||
if(bus_msb) {
|
||||
if(digital) {
|
||||
draw_graph_bus_points(ntok, n_bits, idx_arr, first, last, cx, dx, dcy, ddy, wave_color,
|
||||
sweep_idx, wcnt, n_nodes,
|
||||
wy1, wy2, ypos1, ypos2);
|
||||
}
|
||||
poly_npoints = 0;
|
||||
first = -1;
|
||||
cnt = 0;
|
||||
} else {
|
||||
draw_graph_points(idx, first, last, scy, sdy, dscy, dsdy, point, wave_color,
|
||||
digital, wcnt, n_nodes, wy1, wy2, ypos1, ypos2);
|
||||
}
|
||||
bbox(END, 0.0, 0.0, 0.0, 0.0);
|
||||
poly_npoints = 0;
|
||||
first = -1;
|
||||
cnt = 0;
|
||||
}
|
||||
}
|
||||
if(xx >= start && xx <= end) {
|
||||
if(first == -1) first = p;
|
||||
/* Build poly x array. Translate from graph coordinates to screen coords */
|
||||
point[poly_npoints].x = S_X(xx); /* CLIP(S_X(xx), xctx->areax1, xctx->areax2); */
|
||||
if(flags & 2 && p > ofs) { /* cursor1: show measurements on analog nodes in graph */
|
||||
if(SIGN(xx - xctx->graph_cursor1_x) != SIGN(prev_x - xctx->graph_cursor1_x)) {
|
||||
double yy1 = xctx->graph_values[idx][p-1];
|
||||
double dy = xctx->graph_values[idx][p] - yy1;
|
||||
double dx = xx - prev_x;
|
||||
double yy = yy1 + dy / dx * (xctx->graph_cursor1_x - prev_x);
|
||||
char *fmt1, *fmt2;
|
||||
|
||||
if(SIGN(wy1) != SIGN(wy2) && fabs(yy) < 1e-4 * fabs(wy2 - wy1)) yy = 0.0;
|
||||
if(yy != 0.0 && fabs(yy * unity) < 1.0e-3) {
|
||||
fmt1="%.2e";
|
||||
fmt2="%.2e%c";
|
||||
} else {
|
||||
fmt1="%.4g";
|
||||
fmt2="%.4g%c";
|
||||
}
|
||||
/* draw node values in graph */
|
||||
bbox(START, 0.0, 0.0, 0.0, 0.0);
|
||||
bbox(ADD, rx1, ry1, rx2, ry2);
|
||||
bbox(SET_INSIDE, 0.0, 0.0, 0.0, 0.0);
|
||||
if(!bus_msb) {
|
||||
if(unity != 1.0) my_snprintf(tmpstr, S(tmpstr), fmt2, yy * unity, unity_suffix);
|
||||
else my_snprintf(tmpstr, S(tmpstr), fmt1, yy);
|
||||
} else {
|
||||
|
||||
get_bus_value(n_bits, idx_arr, p, tmpstr, wy1, wy2);
|
||||
}
|
||||
if(!bus_msb && !digital) {
|
||||
draw_string(wave_color, NOW, tmpstr, 0, 0, 0, 0,
|
||||
rx1 + 2 + rw / n_nodes * wcnt, ry1 + txtsizelab * 60,
|
||||
txtsizelab * 0.8, txtsizelab * 0.8);
|
||||
dbg(1, "node: %s, x=%g, value=%g\n", ntok, xx, yy);
|
||||
}
|
||||
else if(digital) {
|
||||
double xt = x1 - 10 * txtsizelab;
|
||||
double deltag = wy2 - wy1;
|
||||
double s1 = DIG_NWAVES; /* 1/DIG_NWAVES waveforms fit in graph if unscaled vertically */
|
||||
double s2 = DIG_SPACE; /* (DIG_NWAVES - DIG_SPACE) spacing between traces */
|
||||
double yt = s1 * (double)(n_nodes - wcnt) * deltag - (wy1 - deltag * 0.4) * s2;
|
||||
if(yt <= ypos2 && yt >= ypos1) {
|
||||
draw_string(wave_color, NOW, tmpstr, 2, 0, 0, 0,
|
||||
xt, DW_Y(yt) + digtxtsizelab * 50, digtxtsizelab * 0.8, digtxtsizelab * 0.8);
|
||||
}
|
||||
|
||||
}
|
||||
bbox(END, 0.0, 0.0, 0.0, 0.0);
|
||||
}
|
||||
}
|
||||
last = p;
|
||||
poly_npoints++;
|
||||
prev_prev_x = prev_x;
|
||||
|
|
@ -2293,10 +2378,14 @@ void draw_graph(int c, int i, int flags)
|
|||
}
|
||||
}
|
||||
if(first != -1) {
|
||||
/* clipping everything outside graph area */
|
||||
bbox(START, 0.0, 0.0, 0.0, 0.0);
|
||||
bbox(ADD,x1, y1, x2, y2);
|
||||
bbox(SET, 0.0, 0.0, 0.0, 0.0);
|
||||
/* get y-axis points */
|
||||
if(bus_msb) {
|
||||
if(digital) {
|
||||
draw_graph_bus_points(ntok, first, last, cx, dx, dcy, ddy, wave_color,
|
||||
draw_graph_bus_points(ntok, n_bits, idx_arr, first, last, cx, dx, dcy, ddy, wave_color,
|
||||
sweep_idx, wcnt, n_nodes,
|
||||
wy1, wy2, ypos1, ypos2);
|
||||
}
|
||||
|
|
@ -2304,6 +2393,7 @@ void draw_graph(int c, int i, int flags)
|
|||
draw_graph_points(idx, first, last, scy, sdy, dscy, dsdy, point, wave_color,
|
||||
digital, wcnt, n_nodes, wy1, wy2, ypos1, ypos2);
|
||||
}
|
||||
bbox(END, 0.0, 0.0, 0.0, 0.0);
|
||||
}
|
||||
} /* if(dataset == -1 || dset == dataset) */
|
||||
|
||||
|
|
@ -2311,7 +2401,7 @@ void draw_graph(int c, int i, int flags)
|
|||
ofs += xctx->graph_npoints[dset];
|
||||
} /* for(dset...) */
|
||||
my_free(1403, &point);
|
||||
bbox(END, 0.0, 0.0, 0.0, 0.0);
|
||||
if(idx_arr) my_free(1455, &idx_arr);
|
||||
} /* if( (idx = get_raw_index(bus_msb ? bus_msb : ntok)) != -1 ) */
|
||||
wcnt++;
|
||||
if(bus_msb) my_free(1453, &bus_msb);
|
||||
|
|
@ -2329,14 +2419,14 @@ void draw_graph(int c, int i, int flags)
|
|||
int flip = (xctx->graph_cursor2_x > xctx->graph_cursor1_x) ? 0 : 1;
|
||||
int xoffs = flip ? 2 : -2;
|
||||
if(xx >= x1 && xx <= x2) {
|
||||
drawline(3, NOW, xx, ry1, xx, ry2, 1);
|
||||
drawline(1, NOW, xx, ry1, xx, ry2, 1);
|
||||
if(unitx != 1.0)
|
||||
my_snprintf(tmpstr, S(tmpstr), "%.4g%c", unitx * xctx->graph_cursor1_x , unitx_suffix);
|
||||
else
|
||||
my_snprintf(tmpstr, S(tmpstr), "%.4g", xctx->graph_cursor1_x);
|
||||
text_bbox(tmpstr, txtsize, txtsize, 2, flip, 0, 0, xx + xoffs, ry2-1, &tx1, &ty1, &tx2, &ty2, &tmp, &tmp);
|
||||
filledrect(0, NOW, tx1, ty1, tx2, ty2);
|
||||
draw_string(3, NOW, tmpstr, 2, flip, 0, 0, xx + xoffs, ry2-1, txtsize, txtsize);
|
||||
draw_string(1, NOW, tmpstr, 2, flip, 0, 0, xx + xoffs, ry2-1, txtsize, txtsize);
|
||||
}
|
||||
}
|
||||
if(flags & 4) { /* cursor2 */
|
||||
|
|
|
|||
|
|
@ -311,7 +311,7 @@ extern char win_temp_dir[PATH_MAX];
|
|||
strcmp(type,"show_label") && strcmp(type,"iopin")))
|
||||
#define IS_LABEL_OR_PIN(type) (!(strcmp(type,"label") && strcmp(type,"ipin") && strcmp(type,"opin") && strcmp(type,"iopin")))
|
||||
#define IS_PIN(type) (!(strcmp(type,"ipin") && strcmp(type,"opin") && strcmp(type,"iopin")))
|
||||
#define SIGN(x) ( (x) < 0 ? -1 : 1)
|
||||
#define SIGN(x) ( (x) < 0 ? -1 : (x) > 0 ? 1 : 0)
|
||||
|
||||
/* floor not needed? screen coordinates always positive <<<< */
|
||||
/* #define X_TO_SCREEN(x) ( floor(((x)+xctx->xorigin)* xctx->mooz) ) */
|
||||
|
|
@ -337,7 +337,9 @@ do { \
|
|||
|
||||
/* set do double if you need more precision at the expense of memory */
|
||||
#define SPICE_DATA float
|
||||
|
||||
#define DIG_NWAVES 0.1 /* inverse number: by default 10 digital traces per graph */
|
||||
#define DIG_SPACE 0.08 /* trace extends from 0 to DIG_SPACE, so we have DIG_WAVES-DIG_SPACE
|
||||
* spacing between traces */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1279,16 +1279,7 @@ proc waves {} {
|
|||
# ============================================================
|
||||
|
||||
|
||||
proc graph_stop_measure {} {
|
||||
global measure_id
|
||||
if { [info exists measure_id] } {
|
||||
after cancel $measure_id
|
||||
unset measure_id
|
||||
}
|
||||
destroy .measure
|
||||
}
|
||||
|
||||
proc graph_show_measure {} {
|
||||
proc graph_show_measure {{action show}} {
|
||||
global measure_id measure_text
|
||||
|
||||
set_ne measure_text "y=\nx="
|
||||
|
|
@ -1297,8 +1288,9 @@ proc graph_show_measure {} {
|
|||
unset measure_id
|
||||
}
|
||||
destroy .measure
|
||||
|
||||
if {$action eq {stop}} { return }
|
||||
set measure_id [after 400 {
|
||||
unset measure_id
|
||||
toplevel .measure -bg {}
|
||||
label .measure.lab -text $measure_text -bg black -fg yellow -justify left
|
||||
pack .measure.lab
|
||||
|
|
@ -3964,7 +3956,7 @@ global env has_x OS
|
|||
}
|
||||
}
|
||||
"
|
||||
bind $topwin <Leave> "graph_stop_measure"
|
||||
bind $topwin <Leave> "graph_show_measure stop"
|
||||
bind $topwin <Expose> "xschem callback %W %T %x %y 0 %w %h %s"
|
||||
bind $topwin <Double-Button-1> "xschem callback %W -3 %x %y 0 %b 0 %s"
|
||||
bind $topwin <Double-Button-2> "xschem callback %W -3 %x %y 0 %b 0 %s"
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ x1=0.0157884
|
|||
x2=0.0164453
|
||||
divx=8
|
||||
subdivx=1
|
||||
node="tcleval(v($\{path\}ga) v($\{path\}gb) v($\{path\}outi)) v(vnn))"
|
||||
node="tcleval($\{path\}ga $\{path\}gb $\{path\}outi vnn)"
|
||||
color="7 8 10 11 12 13 14 15 16 17"
|
||||
dataset=0
|
||||
unitx=m
|
||||
|
|
|
|||
|
|
@ -18,16 +18,17 @@ B 2 1200 -860 1880 -550 {flags=1
|
|||
y1 = -60
|
||||
y2 = 60
|
||||
divy = 12
|
||||
x1=0
|
||||
x1=6e-09
|
||||
x2=0.03
|
||||
divx=10
|
||||
node="v(outp) v(outm) v(vpp) v(vnn) v(x1.vboost) v(x0.vboost)"
|
||||
color="4 5 6 12 8 10" unitx=m}
|
||||
node="outp outm vpp vnn x1.vboost x0.vboost"
|
||||
color="4 5 6 12 8 10" unitx=m
|
||||
}
|
||||
B 2 1200 -530 1880 -340 {flags=1
|
||||
y1 = 0
|
||||
y2 = 12
|
||||
divy = 6
|
||||
x1=0
|
||||
x1=6e-09
|
||||
x2=0.03
|
||||
divx=10
|
||||
node="i(v.x1.vu) i(v.x0.vu) i(v.x1.vd) i(v.x0.vd)"
|
||||
|
|
@ -36,7 +37,7 @@ B 2 1200 -330 1880 -140 {flags=1
|
|||
y1 = 0
|
||||
y2 = .05
|
||||
divy = 5
|
||||
x1=0
|
||||
x1=6e-09
|
||||
x2=0.03
|
||||
divx=10
|
||||
node="i(v.x1.v3)"
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ y1 = -0.0039
|
|||
y2 = 0.87
|
||||
divy = 3
|
||||
subdivy=1
|
||||
x1=1.26295e-07
|
||||
x2=2.03758e-07 divx=10
|
||||
x1=1.5328e-07
|
||||
x2=1.84945e-07 divx=10
|
||||
node="
|
||||
ldbl[0] ldbl[16] ldbl[32]
|
||||
ldbl[1] ldbl[17] ldbl[33]
|
||||
|
|
@ -47,8 +47,8 @@ y1 = -0.021
|
|||
y2 = 1.5
|
||||
subdivy=1
|
||||
divy = 4
|
||||
x1=1.26295e-07
|
||||
x2=2.03758e-07
|
||||
x1=1.5328e-07
|
||||
x2=1.84945e-07
|
||||
divx=10
|
||||
subdivx=4
|
||||
node="ldcp ldyms[4] ldyms[5] ldyms[6] ldymsref"
|
||||
|
|
@ -61,8 +61,8 @@ y2 = 1.6
|
|||
divy = 3
|
||||
subdivy=0
|
||||
subdivx = 1
|
||||
x1=1.26295e-07
|
||||
x2=2.03758e-07 divx=10
|
||||
x1=1.5328e-07
|
||||
x2=1.84945e-07 divx=10
|
||||
node="
|
||||
ldwl[0] ldwl[1] ldwl[2] ldwl[3]
|
||||
ldwl[4] ldwl[5] ldwl[6] ldwl[16]
|
||||
|
|
@ -74,20 +74,20 @@ B 2 1840 -120 2890 -20 {flags=3
|
|||
y1 = -0.021
|
||||
y2 = 0.9
|
||||
divy = 1
|
||||
x1=1.26295e-07
|
||||
x2=2.03758e-07 divx=10
|
||||
x1=1.5328e-07
|
||||
x2=1.84945e-07 divx=10
|
||||
node="ldymsref"
|
||||
color=3 unitx=n subdivy=4
|
||||
}
|
||||
B 2 1840 -880 2890 -420 {flags=3
|
||||
digital=1
|
||||
y1 = -1
|
||||
y2 = 2
|
||||
ypos1=0.175559
|
||||
ypos2=3.6959
|
||||
y1 = 0
|
||||
y2 = 1.6
|
||||
ypos1=0.0890868
|
||||
ypos2=2.14223
|
||||
divy = 1
|
||||
x1=1.26295e-07
|
||||
x2=2.03758e-07
|
||||
x1=2e-12
|
||||
x2=4.8e-07
|
||||
divx=12
|
||||
subdivx=4
|
||||
node="
|
||||
|
|
@ -103,7 +103,7 @@ LDL2X,ldl2x[3],ldl2x[2],ldl2x[1],ldl2x[0]
|
|||
LDL1X,ldl1x[15],ldl1x[14],ldl1x[13],ldl1x[12],ldl1x[11],ldl1x[10],ldl1x[9],ldl1x[8],ldl1x[7],ldl1x[6],ldl1x[5],ldl1x[4],ldl1x[3],ldl1x[2],ldl1x[1],ldl1x[0]
|
||||
LDY1,ldy1[3],ldy1[2],ldy1[1],ldy1[0]
|
||||
"
|
||||
color="4 15 4 15 4 15 4 15 4 15 4 15 4 15 4 15 4 15 4 15 4 15"
|
||||
color="3 15 4 15 3 15 4 3 4 15 4 15 4 15 4 15 4 15 4 15 4 15"
|
||||
unitx=n
|
||||
ypos1=-2.20115 ypos2=2.79884
|
||||
}
|
||||
|
|
@ -111,8 +111,8 @@ B 2 1840 -1280 2890 -1090 {flags=3
|
|||
y1 = -0.022
|
||||
y2 = 1.6
|
||||
divy = 4
|
||||
x1=1.26295e-07
|
||||
x2=2.03758e-07
|
||||
x1=1.5328e-07
|
||||
x2=1.84945e-07
|
||||
divx=8
|
||||
unitx=n
|
||||
node="xsa[0].ldqib xsa[5].ldqib xsa[0].ldsali xctrl.ldq_b"
|
||||
|
|
@ -316,7 +316,7 @@ C {lab_pin.sym} 1040 -690 0 0 {name=l46 lab=vss}
|
|||
C {lab_pin.sym} 1340 -710 0 1 {name=l1 lab=LDBL[255:0]}
|
||||
C {spice_probe.sym} 1340 -830 0 0 {name=p3 analysis=tran}
|
||||
C {spice_probe.sym} 190 -850 0 0 {name=p13 analysis=tran}
|
||||
C {lab_pin.sym} 1670 -740 0 0 {name=l2 lab=LDWL[16:0]}
|
||||
C {lab_pin.sym} 1670 -740 0 0 {name=l2 lab=LDWL[511:0]}
|
||||
C {spice_probe.sym} 1670 -740 0 0 {name=p46 analysis=tran}
|
||||
C {lab_pin.sym} 1670 -790 0 0 {name=l4 lab=LDBL[0,16,32,1,17,33,2,18,34]}
|
||||
C {spice_probe.sym} 1670 -790 0 0 {name=p91 analysis=tran}
|
||||
|
|
|
|||
Loading…
Reference in New Issue