diff --git a/src/draw.c b/src/draw.c index e01cbb6f..9a3445ef 100644 --- a/src/draw.c +++ b/src/draw.c @@ -2300,12 +2300,15 @@ int graph_fullxzoom(int i, Graph_ctx *gr, int dataset) char *custom_rawfile = NULL; /* "rawfile" attr. set in graph: load and switch to specified raw */ char *sim_type = NULL; int k, save_datasets = -1, save_npoints = -1; + int autoload = 0; Raw *raw = NULL; + autoload = !strboolcmp(get_tok_value(r->prop_ptr,"autoload",0), "1"); + if(autoload == 0) autoload = 2; my_strdup2(_ALLOC_ID_, &custom_rawfile, get_tok_value(r->prop_ptr,"rawfile",0)); my_strdup2(_ALLOC_ID_, &sim_type, get_tok_value(r->prop_ptr,"sim_type",0)); if((i == xctx->graph_master) && custom_rawfile[0]) { - extra_rawfile(1, custom_rawfile, sim_type[0] ? sim_type : xctx->raw->sim_type, -1.0, -1.0); + extra_rawfile(autoload, custom_rawfile, sim_type[0] ? sim_type : xctx->raw->sim_type, -1.0, -1.0); } idx = get_raw_index(find_nth(get_tok_value(r->prop_ptr, "sweep", 0), ", ", "\"", 0, 1), NULL); dbg(1, "graph_fullxzoom(): sweep idx=%d\n", idx); @@ -2316,7 +2319,7 @@ int graph_fullxzoom(int i, Graph_ctx *gr, int dataset) my_strdup2(_ALLOC_ID_, &sim_type, get_tok_value(xctx->rect[GRIDLAYER][xctx->graph_master].prop_ptr,"sim_type",0)); if(custom_rawfile[0]) { - extra_rawfile(1, custom_rawfile, sim_type[0] ? sim_type : xctx->raw->sim_type, -1.0, -1.0); + extra_rawfile(autoload, custom_rawfile, sim_type[0] ? sim_type : xctx->raw->sim_type, -1.0, -1.0); } } @@ -2382,9 +2385,10 @@ int graph_fullyzoom(xRect *r, Graph_ctx *gr, int graph_dataset) Raw *raw = NULL; char *tmp_ptr = NULL; int save_extra_idx = -1; - int save_datasets = -1, save_npoints = -1; - + int autoload = 0, save_datasets = -1, save_npoints = -1; + autoload = !strboolcmp(get_tok_value(r->prop_ptr,"autoload",0), "1"); + if(autoload == 0) autoload = 2; dbg(1, "graph_fullyzoom(): graph_dataset=%d\n", graph_dataset); my_strdup2(_ALLOC_ID_, &node, get_tok_value(r->prop_ptr,"node",0)); my_strdup2(_ALLOC_ID_, &sweep, get_tok_value(r->prop_ptr,"sweep",0)); @@ -2404,7 +2408,7 @@ int graph_fullyzoom(xRect *r, Graph_ctx *gr, int graph_dataset) char str_extra_idx[30]; if(sch_waves_loaded() != -1 && custom_rawfile[0]) { - extra_rawfile(1, custom_rawfile, sim_type[0] ? sim_type : xctx->raw->sim_type, -1.0, -1.0); + extra_rawfile(autoload, custom_rawfile, sim_type[0] ? sim_type : xctx->raw->sim_type, -1.0, -1.0); } raw = xctx->raw; @@ -2423,7 +2427,7 @@ int graph_fullyzoom(xRect *r, Graph_ctx *gr, int graph_dataset) sim_type[0] ? sim_type : xctx->raw->sim_type); dbg(1, "node_rawfile=|%s| node_sim_type=|%s|\n", node_rawfile, node_sim_type); if(node_rawfile && node_rawfile[0]) { - extra_rawfile(1, node_rawfile, node_sim_type, -1.0, -1.0); + extra_rawfile(autoload, node_rawfile, node_sim_type, -1.0, -1.0); raw = xctx->raw; } my_free(_ALLOC_ID_, &node_rawfile); @@ -3411,7 +3415,7 @@ int find_closest_wave(int i, Graph_ctx *gr) int wcnt = 0, idx, expression; char *express = NULL; xRect *r = &xctx->rect[GRIDLAYER][i]; - int closest_dataset = -1; + int autoload = 0, closest_dataset = -1; double min=-1.0; Raw *raw = NULL; char *custom_rawfile = NULL; /* "rawfile" attr. set in graph: load and switch to specified raw */ @@ -3422,6 +3426,9 @@ int find_closest_wave(int i, Graph_ctx *gr) return -1; } if(gr->digital) return -1; + + autoload = !strboolcmp(get_tok_value(r->prop_ptr,"autoload",0), "1"); + if(autoload == 0) autoload = 2; yval = G_Y(xctx->mousey); xval = G_X(xctx->mousex); /* get data to plot */ @@ -3431,7 +3438,7 @@ int find_closest_wave(int i, Graph_ctx *gr) my_strdup2(_ALLOC_ID_, &custom_rawfile, get_tok_value(r->prop_ptr,"rawfile",0)); my_strdup2(_ALLOC_ID_, &sim_type, get_tok_value(r->prop_ptr,"sim_type",0)); if(sch_waves_loaded()!= -1 && custom_rawfile[0]) { - extra_rawfile(1, custom_rawfile, sim_type[0] ? sim_type : xctx->raw->sim_type, -1.0, -1.0); + extra_rawfile(autoload, custom_rawfile, sim_type[0] ? sim_type : xctx->raw->sim_type, -1.0, -1.0); } raw = xctx->raw; @@ -3597,6 +3604,7 @@ void draw_graph(int i, const int flags, Graph_ctx *gr, void *ct) /* draw stuff */ if(flags & 8) { + int autoload = 0; char *tmp_ptr = NULL; int save_datasets = -1, save_npoints = -1; #if !defined(__unix__) && HAS_CAIRO==1 @@ -3605,6 +3613,8 @@ void draw_graph(int i, const int flags, Graph_ctx *gr, void *ct) clear_cairo_surface(xctx->cairo_save_ctx, gr->sx1, gr->sy1, sw, sh); clear_cairo_surface(xctx->cairo_ctx, gr->sx1, gr->sy1, sw, sh); #endif + autoload = !strboolcmp(get_tok_value(r->prop_ptr,"autoload",0), "1"); + if(autoload == 0) autoload = 2; /* graph box, gridlines and axes */ draw_graph_grid(gr, ct); /* get data to plot */ @@ -3626,11 +3636,14 @@ void draw_graph(int i, const int flags, Graph_ctx *gr, void *ct) char *nd = NULL; char str_extra_idx[30]; + nptr = NULL; measure_p = -1; measure_x = 0.0; measure_prev_x = 0.0; if(sch_waves_loaded()!= -1 && custom_rawfile[0]) { - extra_rawfile(1, custom_rawfile, sim_type[0] ? sim_type : xctx->raw->sim_type, -1.0, -1.0); + if(extra_rawfile(autoload, custom_rawfile, sim_type[0] ? sim_type : xctx->raw->sim_type, -1.0, -1.0) == 0) { + continue; + } } raw = xctx->raw; @@ -3656,7 +3669,12 @@ void draw_graph(int i, const int flags, Graph_ctx *gr, void *ct) sim_type[0] ? sim_type : xctx->raw->sim_type); dbg(1, "node_rawfile=|%s| node_sim_type=|%s|\n", node_rawfile, node_sim_type); if(node_rawfile && node_rawfile[0]) { - extra_rawfile(1, node_rawfile, node_sim_type, -1.0, -1.0); + if(extra_rawfile(autoload, node_rawfile, node_sim_type, -1.0, -1.0) == 0) { + my_free(_ALLOC_ID_, &node_rawfile); + my_free(_ALLOC_ID_, &node_sim_type); + my_free(_ALLOC_ID_, &nd); + continue; + } raw = xctx->raw; } my_free(_ALLOC_ID_, &node_rawfile); @@ -3692,7 +3710,7 @@ void draw_graph(int i, const int flags, Graph_ctx *gr, void *ct) dbg(1, "ntok_copy=|%s|, bus_msb=|%s|\n", ntok_copy, bus_msb ? bus_msb : "NULL"); ctok = my_strtok_r(cptr, " ", "", 0, &savec); stok = my_strtok_r(sptr, "\t\n ", "\"", 0, &saves); - nptr = cptr = sptr = NULL; + cptr = sptr = NULL; dbg(1, "ntok_copy=%s ctok=%s\n", ntok_copy, ctok? ctok: "NULL"); if(ctok && ctok[0]) wc = atoi(ctok); if(wc < 0) wc = 4; diff --git a/src/save.c b/src/save.c index d3e13870..86615bff 100644 --- a/src/save.c +++ b/src/save.c @@ -531,7 +531,7 @@ static int read_dataset(FILE *fd, Raw **rawptr, const char *type) tcleval("alert_ {read_dataset(): ASCII raw files can not be read. " "Use binary format in ngspice (set filetype=binary)}"); extra_rawfile(3, NULL, NULL, -1.0, -1.0); - free_rawfile(rawptr, 0); + /* free_rawfile(rawptr, 0); */ exit_status = 0; goto read_dataset_done; } @@ -614,7 +614,7 @@ static int read_dataset(FILE *fd, Raw **rawptr, const char *type) if(n < 1) { dbg(0, "read_dataset(): WAARNING: malformed raw file, aborting\n"); extra_rawfile(3, NULL, NULL, -1.0, -1.0); - free_rawfile(rawptr, 0); + /* free_rawfile(rawptr, 0); */ exit_status = 0; goto read_dataset_done; } @@ -643,7 +643,7 @@ static int read_dataset(FILE *fd, Raw **rawptr, const char *type) if(n < 1) { dbg(0, "read_dataset(): WAARNING: malformed raw file, aborting\n"); extra_rawfile(3, NULL, NULL, -1.0, -1.0); - free_rawfile(rawptr, 0); + /* free_rawfile(rawptr, 0); */ exit_status = 0; goto read_dataset_done; } @@ -656,7 +656,7 @@ static int read_dataset(FILE *fd, Raw **rawptr, const char *type) if(n < 1) { dbg(0, "read_dataset(): WAARNING: malformed raw file, aborting\n"); extra_rawfile(3, NULL, NULL, -1.0, -1.0); - free_rawfile(rawptr, 0); + /* free_rawfile(rawptr, 0); */ exit_status = 0; goto read_dataset_done; } @@ -679,7 +679,7 @@ static int read_dataset(FILE *fd, Raw **rawptr, const char *type) if(n < 2) { dbg(0, "read_dataset(): WAARNING: malformed raw file, aborting\n"); extra_rawfile(3, NULL, NULL, -1.0, -1.0); - free_rawfile(rawptr, 0); + /* free_rawfile(rawptr, 0); */ exit_status = 0; goto read_dataset_done; } @@ -728,6 +728,7 @@ void free_rawfile(Raw **rawptr, int dr) Raw *raw; if(!rawptr || !*rawptr) { + dbg(0, "free_rawfile(): no raw file to clear\n"); if(dr) draw(); return; } diff --git a/src/scheduler.c b/src/scheduler.c index 84a6c7fd..ec520d50 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -327,7 +327,8 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg tclsetboolvar("live_cursor2_backannotate", 1); /* clear all raw files */ extra_rawfile(3, NULL, NULL, -1.0, -1.0); - free_rawfile(&xctx->raw, 1); + /* free_rawfile(&xctx->raw, 1); */ + draw(); raw_read(f, &xctx->raw, "op", -1.0, -1.0); if(level >= 0) { xctx->raw->level = level; @@ -3934,7 +3935,8 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg { if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} extra_rawfile(3, NULL, NULL, -1.0, -1.0); /* unload additional raw files */ - free_rawfile(&xctx->raw, 1); /* unload base (current) raw file */ + /* free_rawfile(&xctx->raw, 1); */ /* unload base (current) raw file */ + draw(); Tcl_ResetResult(interp); } @@ -3960,7 +3962,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg double sweep1 = -1.0, sweep2 = -1.0; tcleval("array unset ngspice::ngspice_data"); extra_rawfile(3, NULL, NULL, -1.0, -1.0); - free_rawfile(&xctx->raw, 0); + /* free_rawfile(&xctx->raw, 0); */ my_snprintf(f, S(f),"regsub {^~/} {%s} {%s/}", argv[2], home_dir); tcleval(f); my_strncpy(f, tclresult(), S(f)); @@ -3988,10 +3990,11 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} if(sch_waves_loaded() >= 0) { extra_rawfile(3, NULL, NULL, -1.0, -1.0); - free_rawfile(&xctx->raw, 1); + /* free_rawfile(&xctx->raw, 1); */ + draw(); } else { extra_rawfile(3, NULL, NULL, -1.0, -1.0); - free_rawfile(&xctx->raw, 0); + /* free_rawfile(&xctx->raw, 0); */ if(argc > 2) raw_read_from_attr(&xctx->raw, argv[2], -1.0, -1.0); else raw_read_from_attr(&xctx->raw, NULL, -1.0, -1.0); if(sch_waves_loaded() >= 0) { @@ -5466,13 +5469,14 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} if(sch_waves_loaded() >= 0) { extra_rawfile(3, NULL, NULL, -1.0, -1.0); - free_rawfile(&xctx->raw, 1); + /* free_rawfile(&xctx->raw, 1); */ + draw(); } else if(argc > 2) { my_snprintf(f, S(f),"regsub {^~/} {%s} {%s/}", argv[2], home_dir); tcleval(f); my_strncpy(f, tclresult(), S(f)); extra_rawfile(3, NULL, NULL, -1.0, -1.0); - free_rawfile(&xctx->raw, 0); + /* free_rawfile(&xctx->raw, 0); */ table_read(f); if(sch_waves_loaded() >= 0) { draw(); diff --git a/src/xinit.c b/src/xinit.c index 7cd61a9a..e45281ac 100644 --- a/src/xinit.c +++ b/src/xinit.c @@ -719,7 +719,7 @@ static void delete_schematic_data(int delete_pixmap) sanitize(NULL); is_generator(NULL); extra_rawfile(3, NULL, NULL, -1.0, -1.0); - free_rawfile(&xctx->raw, 0); + /* free_rawfile(&xctx->raw, 0); */ statusmsg("", 1); /* clear allocated string */ record_global_node(2, NULL, NULL); /* delete global node array */ free_xschem_data(); /* delete the xctx struct */ diff --git a/src/xschem.tcl b/src/xschem.tcl index d6cb8455..b0b8fe62 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -2567,22 +2567,24 @@ proc graph_fill_listbox {} { global graph_selected set retval [.graphdialog.top.search get] + set autoload [uplevel #0 {subst [xschem getprop rect 2 $graph_selected autoload 2]}] set rawfile [uplevel #0 {subst [xschem getprop rect 2 $graph_selected rawfile 2]}] set sim_type [uplevel #0 {subst [xschem getprop rect 2 $graph_selected sim_type 2]}] + if {$autoload ne {} && $autoload } { set autoload read} else {set autoload switch} # puts "graph_fill_listbox: $rawfile $sim_type" if {$rawfile ne {}} { if {$sim_type eq {table}} { set res [xschem raw table_read $rawfile $sim_type] } else { - set res [xschem raw read $rawfile $sim_type] + set res [xschem raw $autoload $rawfile $sim_type] } if {$res} { set retval [graph_get_signal_list [xschem raw_query list] $retval] + xschem raw switch_back } else { set retval {} } # puts "switch back" - xschem raw switch_back } else { set retval [graph_get_signal_list [xschem raw_query list] $retval] } @@ -2652,6 +2654,7 @@ proc graph_edit_properties {n} { global graph_bus graph_sort graph_digital graph_selected graph_sel_color global graph_unlocked graph_schname graph_logx graph_logy cadlayers graph_rainbow global graph_linewidth_mult graph_change_done has_x graph_dialog_default_geometry + global graph_autoload if { ![info exists has_x]} {return} set graph_change_done 0 @@ -2676,11 +2679,19 @@ proc graph_edit_properties {n} { if {[xschem getprop rect 2 $n logy] == 1} {set graph_logy 1} set graph_digital 0 if {[xschem getprop rect 2 $n digital] == 1} {set graph_digital 1} + if {[regexp {unlocked} [xschem getprop rect 2 $n flags]]} { set graph_unlocked 1 } else { set graph_unlocked 0 } + + set autoload [xschem getprop rect 2 $n autoload] + if {$autoload ne {} && $autoload} { + set graph_autoload 1 + } else { + set graph_autoload 0 + } frame .graphdialog.top # another row of buttons @@ -2698,7 +2709,7 @@ proc graph_edit_properties {n} { pack .graphdialog.bottom -side top -fill x # center-left frame - label .graphdialog.center.left.lab1 -text {Signal list} + label .graphdialog.center.left.lab1 -text {Sig. list} button .graphdialog.center.left.add -text Add -command { graph_add_nodes; graph_update_nodelist } @@ -2717,7 +2728,15 @@ proc graph_edit_properties {n} { grid columnconfig .graphdialog.center.left 1 -weight 1 # center right frame - label .graphdialog.center.right.lab1 -text { Signals in graph } + label .graphdialog.center.right.lab1 -text { Signals } + checkbutton .graphdialog.center.right.autoload -text {Auto load} -variable graph_autoload \ + -command { + if {$graph_autoload} { + xschem setprop rect 2 $graph_selected autoload 1 fast + } else { + xschem setprop rect 2 $graph_selected autoload 0 fast + } + } label .graphdialog.center.right.lab2 -text { Sim type:} if { [info tclversion] > 8.4} { ttk::combobox .graphdialog.center.right.list -values {dc ac tran op sp spectrum noise table} -width 9 @@ -2782,11 +2801,12 @@ proc graph_edit_properties {n} { scrollbar .graphdialog.center.right.yscroll -command {.graphdialog.center.right.text1 yview} scrollbar .graphdialog.center.right.xscroll -orient horiz -command {.graphdialog.center.right.text1 xview} - grid .graphdialog.center.right.lab1 .graphdialog.center.right.lab2 .graphdialog.center.right.list \ + grid .graphdialog.center.right.lab1 .graphdialog.center.right.autoload \ + .graphdialog.center.right.lab2 .graphdialog.center.right.list \ .graphdialog.center.right.rawbut .graphdialog.center.right.rawentry - grid configure .graphdialog.center.right.rawentry -sticky ew - grid .graphdialog.center.right.text1 - - - - .graphdialog.center.right.yscroll -sticky nsew - grid .graphdialog.center.right.xscroll - - - - - -sticky ew + grid .graphdialog.center.right.text1 - - - - - .graphdialog.center.right.yscroll -sticky nsew + grid .graphdialog.center.right.xscroll - - - - - - -sticky ew grid rowconfig .graphdialog.center.right 0 -weight 0 grid rowconfig .graphdialog.center.right 1 -weight 1 -minsize 3c grid rowconfig .graphdialog.center.right 2 -weight 0 @@ -2794,8 +2814,9 @@ proc graph_edit_properties {n} { grid columnconfig .graphdialog.center.right 1 -weight 0 grid columnconfig .graphdialog.center.right 2 -weight 0 grid columnconfig .graphdialog.center.right 3 -weight 0 - grid columnconfig .graphdialog.center.right 4 -weight 1 - grid columnconfig .graphdialog.center.right 5 -weight 0 + grid columnconfig .graphdialog.center.right 4 -weight 0 + grid columnconfig .graphdialog.center.right 5 -weight 1 + grid columnconfig .graphdialog.center.right 6 -weight 0 # bottom frame button .graphdialog.bottom.cancel -text Cancel -command {