update xschem go_back command (pas integer notitle to go_back() function; simplify wrap handling vs sweep variable in draw_graph(), graph_fullyzoom(), calc_custom_data_yrange(), find_closest_wave()

This commit is contained in:
stefan schippers 2024-12-21 13:05:33 +01:00
parent 6682965dba
commit c4ebc92aa2
4 changed files with 14 additions and 22 deletions

View File

@ -877,7 +877,7 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
Return various global variables used in the program </pre>
<li><kbd> go_back [notitle]</kbd></li><pre>
Go up one level (pop) in hierarchy
if string 'notitle' is given do not update window title (slow) </pre>
if integer 'notitle' given pass it to the go_back() function (1=do not update window title) </pre>
<li><kbd> grabscreen</kbd></li><pre>
grab root window </pre>
<li><kbd> hash_file file [skip_path_lines]</kbd></li><pre>

View File

@ -2423,7 +2423,6 @@ int graph_fullyzoom(xRect *r, Graph_ctx *gr, int graph_dataset)
end = (gr->gx1 <= gr->gx2) ? gr->gx2 : gr->gx1;
while( (ntok = my_strtok_r(nptr, "\n", "\"", 4, &saven)) ) {
int allow_wrap = 1;
char *nd = NULL;
char str_extra_idx[30];
@ -2466,7 +2465,6 @@ int graph_fullyzoom(xRect *r, Graph_ctx *gr, int graph_dataset)
if(raw && raw->sim_type && !strcmp(raw->sim_type, "op") && raw->datasets > 1 && raw->npoints[0] == 1) {
save_datasets = raw->datasets;
raw->datasets = 1;
allow_wrap = 0;
save_npoints = raw->npoints[0];
raw->npoints[0] = raw->allpoints;
}
@ -2514,13 +2512,12 @@ int graph_fullyzoom(xRect *r, Graph_ctx *gr, int graph_dataset)
double xx, xx0 = 0.0; /* gcc gives false warnings if xx0 not initialized here */
int cnt=0, wrap;
register SPICE_DATA *gv = raw->values[sweep_idx];
SPICE_DATA *gv0 = raw->values[0]; /* spice sweep variable, used to determine wrap arounds */
ofs_end = ofs + raw->npoints[dset];
for(p = ofs ; p < ofs_end; p++) {
if(gr->logx) xx = mylog10(gv[p]);
else xx = gv[p];
if(p == ofs) xx0 = gv0[p];
wrap = allow_wrap && (cnt > 1 && gv0[p] == xx0);
if(p == ofs) xx0 = gv[p];
wrap = (cnt > 1 && gv[p] == xx0);
if(wrap) {
sweepvar_wrap++;
cnt = 0;
@ -3450,7 +3447,6 @@ int calc_custom_data_yrange(int sweep_idx, const char *express, Graph_ctx *gr)
for(dset = 0 ; dset < raw->datasets; dset++) {
int cnt=0, wrap;
register SPICE_DATA *gv = raw->values[sweep_idx];
SPICE_DATA *gv0 = raw->values[0]; /* spice sweep variable, used to determine wrap arounds */
ofs_end = ofs + raw->npoints[dset];
first = -1;
last = ofs;
@ -3460,8 +3456,8 @@ int calc_custom_data_yrange(int sweep_idx, const char *express, Graph_ctx *gr)
else
xx = gv[p];
if(p == ofs) xx0 = gv0[p];
wrap = ( cnt > 1 && gv0[p] == xx0);
if(p == ofs) xx0 = gv[p];
wrap = ( cnt > 1 && gv[p] == xx0);
if(first != -1) { /* there is something to plot ... */
if(xx > end || xx < start || /* ... and we ran out of graph area ... */
wrap) { /* ... or sweep variable changed direction */
@ -3586,7 +3582,6 @@ int find_closest_wave(int i, Graph_ctx *gr)
double prev_x = 0.0;
int cnt=0, wrap;
register SPICE_DATA *gvx = raw->values[sweep_idx];
SPICE_DATA *gv0 = raw->values[0];
register SPICE_DATA *gvy;
ofs_end = ofs + raw->npoints[dset];
if(expression) plot_raw_custom_data(sweep_idx, ofs, ofs_end - 1, express, NULL);
@ -3600,10 +3595,10 @@ int find_closest_wave(int i, Graph_ctx *gr)
for(p = ofs ; p < ofs_end; p++) {
if(gr->logx) xx = mylog10(gvx[p]);
else xx = gvx[p];
if(p == ofs) xx0 = gv0[p];
if(p == ofs) xx0 = gvx[p];
if(gr->logy) yy = mylog10(gvy[p]);
else yy = gvy[p];
wrap = (cnt > 1 && gv0[p] == xx0);
wrap = (cnt > 1 && gvx[p] == xx0);
if(first != -1) {
if(xx > end || xx < start || wrap) {
dbg(1, "find_closest_wave(): last=%d\n", last);
@ -3762,7 +3757,6 @@ void draw_graph(int i, const int flags, Graph_ctx *gr, void *ct)
/* process each node given in "node" attribute, get also associated color/sweep var if any*/
while( (ntok = my_strtok_r(nptr, "\n", "\"", 4, &saven)) ) {
int valid_rawfile = 1;
int allow_wrap = 1;
char *nd = NULL;
char str_extra_idx[30];
@ -3821,7 +3815,6 @@ void draw_graph(int i, const int flags, Graph_ctx *gr, void *ct)
&& xctx->raw->datasets > 1 && xctx->raw->npoints[0] == 1) {
save_datasets = xctx->raw->datasets;
xctx->raw->datasets = 1;
allow_wrap = 0;
save_npoints = xctx->raw->npoints[0];
xctx->raw->npoints[0] = xctx->raw->allpoints;
}
@ -3902,7 +3895,6 @@ void draw_graph(int i, const int flags, Graph_ctx *gr, void *ct)
double prev_x;
int cnt=0, wrap;
register SPICE_DATA *gv = xctx->raw->values[sweep_idx];
SPICE_DATA *gv0 = xctx->raw->values[0]; /* spice sweep variable, used to determine wrap arounds */
ofs_end = ofs + xctx->raw->npoints[dset];
first = -1;
@ -3919,8 +3911,8 @@ void draw_graph(int i, const int flags, Graph_ctx *gr, void *ct)
else xx = gv[p];
xxprevious = xxfollowing = xx;
if(p == ofs) xx0 = gv0[p];
wrap = allow_wrap && (cnt > 1 && gv0[p] == xx0);
if(p == ofs) xx0 = gv[p];
wrap = cnt > 1 && gv[p] == xx0;
#if 1 /* plot one point before start and one point after end so
* waves will extend to whole graph area even if there are few points
* but NOT if we are about to wrap (missing 1st/last point in 2-var dc sweeps) */
@ -3929,7 +3921,7 @@ void draw_graph(int i, const int flags, Graph_ctx *gr, void *ct)
else xxprevious = gv[p - 1];
}
/* .................<-- next point will not wrap. */
if(p < ofs_end - 1 && gv0[p + 1] != xx0) {
if(p < ofs_end - 1 && gv[p + 1] != xx0) {
if(gr->logx) xxfollowing = mylog10(gv[p + 1]);
else xxfollowing = gv[p + 1];
}

View File

@ -2079,13 +2079,13 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
/* go_back [notitle]
* Go up one level (pop) in hierarchy
* if string 'notitle' is given do not update window title (slow) */
* if integer 'notitle' given pass it to the go_back() function (1=do not update window title) */
else if(!strcmp(argv[1], "go_back"))
{
int set_title = 1;
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
if(argc > 2 && !strcmp(argv[2], "notitle")) {
set_title = 0;
if(argc > 2 ) {
set_title = atoi(argv[2]);
}
if((xctx->semaphore == 0)) go_back(1, set_title);
Tcl_ResetResult(interp);

View File

@ -92,7 +92,7 @@ proc hier_traversal {fd {level 0} only_subckts} {
if {$descended} {
incr level
set dp [hier_traversal $fd $level $only_subckts]
xschem go_back notitle
xschem go_back 1
incr level -1
}
}