From 0d6a6c488b7b3b574cb15aa69780dc1abdfb5bc9 Mon Sep 17 00:00:00 2001 From: Stefan Frederik Date: Sat, 25 Dec 2021 05:15:52 +0100 Subject: [PATCH] handle spice simulation files with multiple datasets --- src/callback.c | 2 +- src/draw.c | 271 ++++++++++++---------- src/scheduler.c | 6 +- src/xinit.c | 2 +- src/xschem.h | 2 +- xschem_library/examples/LCC_instances.sch | 11 +- xschem_library/examples/poweramp.sch | 11 +- xschem_library/ngspice/autozero_comp.sch | 14 +- xschem_library/ngspice/solar_panel.sch | 11 +- xschem_library/rom8k/rom8k.sch | 11 +- 10 files changed, 197 insertions(+), 144 deletions(-) diff --git a/src/callback.c b/src/callback.c index f6e7ec4a..a3788d2c 100644 --- a/src/callback.c +++ b/src/callback.c @@ -266,7 +266,7 @@ static int waves_callback(int event, int mx, int my, KeySym key, int button, int else if(key == 'f') { if(xctx->values) { xx1 = 0.0; - xx2 = xctx->values[0][xctx->npoints -1]; + xx2 = xctx->values[0][xctx->npoints[0] -1]; my_snprintf(s, S(s), "%g", xx1); my_strdup(1409, &xctx->rect[c][n].prop_ptr, subst_token(xctx->rect[c][n].prop_ptr, "x1", s)); my_snprintf(s, S(s), "%g", xx2); diff --git a/src/draw.c b/src/draw.c index 52bc59a6..6fe8c6a3 100644 --- a/src/draw.c +++ b/src/draw.c @@ -1487,19 +1487,30 @@ void read_binary_block(FILE *fd) { int p, v; double *tmp; + size_t size = 0; + int offset = 0; + + + for(p = 0 ; p < xctx->datasets; p++) { + size += xctx->nvars * xctx->npoints[p]; + offset += xctx->npoints[p]; + } + + /* read buffer */ tmp = my_calloc(1405, xctx->nvars, sizeof(double *)); /* allocate storage for binary block */ - xctx->values = my_calloc(118, xctx->nvars, sizeof(RAW_FLOAT *)); + if(!xctx->values) xctx->values = my_calloc(118, xctx->nvars, sizeof(RAW_FLOAT *)); for(p = 0 ; p < xctx->nvars; p++) { - xctx->values[p] = my_calloc(372, xctx->npoints, sizeof(RAW_FLOAT)); + my_realloc(372, &xctx->values[p], (size + xctx->npoints[xctx->datasets]) * sizeof(double)); } /* read binary block */ - for(p = 0; p < xctx->npoints; p++) { + for(p = 0; p < xctx->npoints[xctx->datasets]; p++) { if(fread(tmp, sizeof(double), xctx->nvars, fd) != xctx->nvars) { dbg(0, "Warning: binary block is not of correct size\n"); } + /* assign to xschem struct, memory aligned per variable, for cache locality */ for(v = 0; v < xctx->nvars; v++) { - xctx->values[v][p] = tmp[v]; + xctx->values[v][offset + p] = tmp[v]; } } my_free(1406, &tmp); @@ -1533,62 +1544,66 @@ int read_dataset(FILE *fd) int variables = 0, i, done_points = 0; char line[PATH_MAX], varname[PATH_MAX]; char *ptr; - int transient = 0; - int dc = 0; + int sim_type = 0; /* 1: transient, 2: dc, 4: ... */ int done_header = 0; - xctx->datasets = 0; - xctx->npoints = 0; - xctx->nvars = 0; + int exit_status = 0; while((ptr = fgets(line, sizeof(line), fd)) ) { - if(!strncmp(line, "Binary:", 7)) { - done_header = 1; - break; /* start of binary block */ - } - if((dc || transient) && !done_header) { - if(variables) { - sscanf(line, "%d %s", &i, varname); /* read index and name of saved waveform */ - xctx->names[i] = my_malloc(415, strlen(varname) + 1); - strcpy(xctx->names[i], varname); - /* use hash table to store index number of variables */ - int_hash_lookup(xctx->raw_table, xctx->names[i], i, XINSERT_NOREPLACE); - dbg(1, "names[%d] = %s\n", i, xctx->names[i]); - } - if(!strncmp(line, "Variables:", 10)) { - variables = 1; - xctx->names = my_calloc(426, xctx->nvars, sizeof(char *)); + /* after this line comes the binary blob made of nvars * npoints * sizeof(double) bytes */ + if(!strcmp(line, "Binary:\n")) { + int npoints = xctx->npoints[xctx->datasets]; + if(sim_type) { + done_header = 1; + read_binary_block(fd); + dbg(0, "read_dataset(): read binary block, nvars=%d npoints=%d\n", xctx->nvars, npoints); + xctx->datasets++; + exit_status = 1; + } else { + dbg(0, "read_dataset(): skip binary block, nvars=%d npoints=%d\n", xctx->nvars, npoints); + fseek(fd, xctx->nvars * npoints * sizeof(double), SEEK_CUR); /* skip binary block */ } + done_points = 0; } - if(!strncmp(line, "No. of Data Rows :", 18)) { - sscanf(line, "No. of Data Rows : %d", &xctx->npoints); + else if(!strncmp(line, "Plotname: Transient Analysis", 28)) { + if(sim_type && sim_type != 1) sim_type = 0; + else sim_type = 1; + } + else if(!strncmp(line, "Plotname: DC transfer characteristic", 36)) { + if(sim_type && sim_type != 2) sim_type = 0; + else sim_type = 2; + } + /* points and vars are needed for all sections (also ones we are not interested in) + * to skip binary blobs */ + else if(!strncmp(line, "No. of Data Rows :", 18)) { + /* array of number of points of datasets (they are of varialbe length) */ + my_realloc(1414, &xctx->npoints, (xctx->datasets+1) * sizeof(int)); + sscanf(line, "No. of Data Rows : %d", &xctx->npoints[xctx->datasets]); done_points = 1; } - if(!strncmp(line, "No. Variables:", 14)) { + else if(!strncmp(line, "No. Variables:", 14)) { sscanf(line, "No. Variables: %d", &xctx->nvars); } - if(!strncmp(line, "Plotname: Transient Analysis", 28)) { - transient = 1; - xctx->datasets++; + else if(!done_points && !strncmp(line, "No. Points:", 11)) { + my_realloc(1415, &xctx->npoints, (xctx->datasets+1) * sizeof(int)); + sscanf(line, "No. Points: %d", &xctx->npoints[xctx->datasets]); } - if(!strncmp(line, "Plotname: DC transfer characteristic", 36)) { - dc = 1; - xctx->datasets++; + if(!done_header && variables) { + /* get the list of lines with index and node name */ + if(!xctx->names) xctx->names = my_calloc(426, xctx->nvars, sizeof(char *)); + sscanf(line, "%d %s", &i, varname); /* read index and name of saved waveform */ + xctx->names[i] = my_malloc(415, strlen(varname) + 1); + strcpy(xctx->names[i], varname); + /* use hash table to store index number of variables */ + int_hash_lookup(xctx->raw_table, xctx->names[i], i, XINSERT_NOREPLACE); + dbg(1, "read_dataset(): get node list -> names[%d] = %s\n", i, xctx->names[i]); } - if(!done_points && !strncmp(line, "No. Points:", 11)) { - sscanf(line, "No. Points: %d", &xctx->npoints); + /* after this line comes the list of indexes and associated nodes */ + if(sim_type && !strncmp(line, "Variables:", 10)) { + variables = 1 ; } } - if(!ptr) { - dbg(1, "EOF found\n"); - variables = -1; /* EOF */ - } - dbg(1, "npoints=%d, nvars=%d\n", xctx->npoints, xctx->nvars); - if(variables == 1) { - read_binary_block(fd); - } else if(variables == 0) { - dbg(1, "seeking past binary block\n"); - fseek(fd, xctx->nvars * xctx->npoints * sizeof(double), SEEK_CUR); /* skip binary block */ - } - return variables; + dbg(0, "read_dataset(): datasets=%d, last npoints=%d, nvars=%d\n", + xctx->datasets, xctx->npoints[xctx->datasets-1], xctx->nvars); + return exit_status; } void free_rawfile(void) @@ -1602,11 +1617,11 @@ void free_rawfile(void) for(i = 0 ; i < xctx->nvars; i++) { my_free(512, &xctx->values[i]); } + my_free(1413, &xctx->npoints); my_free(528, &xctx->values); my_free(968, &xctx->names); my_free(1393, &xctx->raw_schname); xctx->datasets = 0; - xctx->npoints = 0; xctx->nvars = 0; int_hash_free(xctx->raw_table); draw(); @@ -1615,26 +1630,28 @@ void free_rawfile(void) /* read a ngspice raw file (with data portion in binary format) */ int read_rawfile(const char *f) { - int res; + int res = 0; FILE *fd; - fd = fopen(f, "r"); - if(fd) for(;;) { - if((res = read_dataset(fd)) == 1) { - break; - } else if(res == -1) { /* EOF */ - dbg(0, "read_rawfile(): dataset not found in raw file\n"); - return EXIT_FAILURE; - } - } else { - dbg(0, "read_rawfile(): failed to open file for reading\n"); - return EXIT_FAILURE; + if(xctx->values || xctx->npoints || xctx->nvars || xctx->datasets) { + dbg(0, "read_rawfile(): must clear current raw file before loading new\n"); + return 0; } - if(fd) fclose(fd); - dbg(0, "Raw file data read\n"); - my_strdup2(1394, &xctx->raw_schname, xctx->current_name); - draw(); - return EXIT_SUCCESS; + fd = fopen(f, "r"); + if(fd) { + if((res = read_dataset(fd)) == 1) { + dbg(0, "Raw file data read\n"); + my_strdup2(1394, &xctx->raw_schname, xctx->sch[xctx->currsch]); + draw(); + } else { + dbg(0, "read_rawfile(): no useful data found\n"); + } + fclose(fd); + return res; + } + dbg(0, "read_rawfile(): failed to open file %s for reading\n", f); + return 0; } + void calc_graph_area(int c, int i, double *x1, double *y1,double *x2,double *y2, double *marginx, double *marginy) { @@ -1731,8 +1748,8 @@ static double get_unit(const char *val) int schematic_waves_loaded(void) { if(xctx->values && xctx->raw_schname) - if( !strcmp(xctx->raw_schname, get_cell_w_ext(xctx->sch[0], 0)) || - !strcmp(xctx->raw_schname, xctx->current_name) ) return 1; + if( !strcmp(xctx->raw_schname, xctx->sch[0]) || + !strcmp(xctx->raw_schname, xctx->sch[xctx->currsch]) ) return 1; return 0; } @@ -1781,9 +1798,7 @@ void draw_graph(int c, int i, int flags) char tmpstr[200]; char *saven, *savec, *saves, *nptr, *cptr, *sptr, *ntok, *ctok, *stok; int wcnt = 0; - double *xarr = NULL, *yarr = NULL; - - + int dataset = -1; /* container (embedding rectangle) coordinates */ rx1 = r->x1; ry1 = r->y1; @@ -1818,6 +1833,10 @@ void draw_graph(int c, int i, int flags) if(val[0]) wx2 = atof(val); val = get_tok_value(r->prop_ptr,"y2",0); if(val[0]) wy2 = atof(val); + /* plot single dataset */ + val = get_tok_value(r->prop_ptr,"dataset",0); + if(val[0]) dataset = atoi(val); + if(dataset >= xctx->datasets) dataset = xctx->datasets - 1; /* cache coefficients for faster graph coord transformations */ cx = (x2 - x1) / (wx2 - wx1); dx = x1 - wx1 * cx; @@ -1826,11 +1845,11 @@ void draw_graph(int c, int i, int flags) /* calculate dash length for grid lines */ dash_sizex = 1.5 * xctx->mooz; - dash_sizex = dash_sizex > 127.0 ? 127 : dash_sizex; - if(dash_sizex <= 1) dash_sizex = 1; + dash_sizex = dash_sizex > 2.0 ? 2.0 : dash_sizex; + if(dash_sizex <= 1.0) dash_sizex = 1.0; dash_sizey = 1.5 * xctx->mooz; - dash_sizey = dash_sizey > 127.0 ? 127 : dash_sizey; - if(dash_sizey <= 1) dash_sizey = 1; + dash_sizey = dash_sizey > 2.0 ? 2.0 : dash_sizey; + if(dash_sizey <= 1.0) dash_sizey = 1.0; /* x axis, y axis, label text sizes */ txtsizey = h / divy / 90 ; @@ -1846,8 +1865,9 @@ void draw_graph(int c, int i, int flags) /* background */ if((flags & 2) ) { filledrect(0, NOW, rx1, ry1, rx2, ry2); - drawrect(c, NOW, rx1, ry1, rx2, ry2, 1); } + /* graph bounding box */ + drawrect(c, NOW, rx1, ry1, rx2, ry2, 2); /* vertical grid lines */ deltax = axis_increment(wx1, wx2, divx); @@ -1901,8 +1921,6 @@ void draw_graph(int c, int i, int flags) if(wx1 <= 0 && wx2 >= 0) drawline(2, ADD, W_X(0), W_Y(wy2), W_X(0), W_Y(wy1), 0); drawline(2, END, 0.0, 0.0, 0.0, 0.0, 0); /* if simulation data is loaded and matches schematic draw data */ - xarr = my_malloc(1401, xctx->npoints * sizeof(double)); - yarr = my_malloc(1402, xctx->npoints * sizeof(double)); my_strdup2(1389, &node, get_tok_value(r->prop_ptr,"node",0)); my_strdup2(1390, &color, get_tok_value(r->prop_ptr,"color",0)); my_strdup2(1407, &sweep, get_tok_value(r->prop_ptr,"sweep",0)); @@ -1937,50 +1955,72 @@ void draw_graph(int c, int i, int flags) /* quickly find index number of ntok variable to be plotted */ entry = int_hash_lookup(xctx->raw_table, ntok, 0, XLOOKUP); if(entry) { - int p; - int poly_npoints = 0; - int v = entry->value; - int first = -1, last = 0; + int p, dset, ofs; + int poly_npoints; + int v; + int first, last; double xx, yy; - double start = (wx1 <= wx2) ? wx1 : wx2; - double end = (wx1 <= wx2) ? wx2 : wx1; + double start; + double end; + double *xarr = NULL, *yarr = NULL; 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); - /* skip if nothing in viewport */ - if(xctx->values[sweep_idx][xctx->npoints -1] > start) { - /* Process "npoints" simulation items - * p loop split repeated 2 timed (for xx and yy points) to preserve cache locality */ - for(p = 0 ; p < xctx->npoints; p++) { - xx = xctx->values[sweep_idx][p]; - if(xx > end) { - break; - } - if(xx >= start) { - if(first == -1) first = p; - /* Build poly x array. Translate from graph coordinates to {x1,y1} - {x2, y2} world. */ - xarr[poly_npoints] = W_X(xx); - poly_npoints++; - } - } - last = p; - if(first != -1) { + + + ofs = 0; + v = entry->value; + start = (wx1 <= wx2) ? wx1 : wx2; + end = (wx1 <= wx2) ? wx2 : wx1; + /* loop through all datasets found in raw file */ + for(dset = 0 ; dset < xctx->datasets; dset++) { + if(dataset == -1 || dset == dataset) { + first = -1; + last = 0; poly_npoints = 0; - for(p = first ; p < last; p++) { - yy = xctx->values[v][p]; - /* Build poly y array. Translate from graph coordinates to {x1,y1} - {x2, y2} world. */ - yarr[poly_npoints] = W_Y(yy); - poly_npoints++; + my_realloc(1401, &xarr, xctx->npoints[dset] * sizeof(double)); + my_realloc(1402, &yarr, xctx->npoints[dset] * sizeof(double)); + /* skip if nothing in viewport */ + if(xctx->values[sweep_idx][ofs + xctx->npoints[dset] -1] > start) { + /* Process "npoints" simulation items + * p loop split repeated 2 timed (for xx and yy points) to preserve cache locality */ + for(p = ofs ; p < ofs + xctx->npoints[dset]; p++) { + xx = xctx->values[sweep_idx][p]; + if(xx > end) { + break; + } + if(xx >= start) { + if(first == -1) first = p; + /* Build poly x array. Translate from graph coordinates to {x1,y1} - {x2, y2} world. */ + xarr[poly_npoints] = W_X(xx); + poly_npoints++; + } + } + last = p; + if(first != -1) { + poly_npoints = 0; + for(p = first ; p < last; p++) { + yy = xctx->values[v][p]; + /* Build poly y array. Translate from graph coordinates to {x1,y1} - {x2, y2} world. */ + yarr[poly_npoints] = W_Y(yy); + poly_npoints++; + } + /* plot data */ + drawpolygon(wave_color, 0, xarr, yarr, poly_npoints, 0, 0); + } } - /* plot data */ - drawpolygon(wave_color, 0, xarr, yarr, poly_npoints, 0, 0); - } - } + } /* if(dataset == -1 || dset == dataset) */ + + /* offset pointing to next dataset */ + ofs += xctx->npoints[dset]; + } /* for(dset...) */ + my_free(1403, &xarr); + my_free(1404, &yarr); bbox(END, 0.0, 0.0, 0.0, 0.0); - } + }/* if(entry) */ wcnt++; - } + } /* while( (ntok = my_strtok_r(nptr, "\n\t ", &saven)) ) */ if(flags & 1) { bbox(START, 0.0, 0.0, 0.0, 0.0); bbox(ADD, rx1, ry1, rx2, ry2); @@ -1991,8 +2031,6 @@ void draw_graph(int c, int i, int flags) } bbox(END, 0.0, 0.0, 0.0, 0.0); } - my_free(1403, &xarr); - my_free(1404, &yarr); my_free(1391, &node); my_free(1392, &color); my_free(1408, &sweep); @@ -2088,7 +2126,6 @@ void draw(void) } if(!xctx->only_probes) { struct iterator_ctx ctx; - int waves = schematic_waves_loaded(); dbg(3, "draw(): check4\n"); for(c=0;cdraw_single_layer!=-1 && c != xctx->draw_single_layer) continue; @@ -2100,7 +2137,7 @@ void draw(void) } if(xctx->enable_layer[c]) for(i=0;irects[c];i++) { xRect *r = &xctx->rect[c][i]; - if( (c != 2 || r->flags != 1) || waves ) { + if(c != 2 || r->flags != 1 ) { drawrect(c, ADD, r->x1, r->y1, r->x2, r->y2, r->dash); filledrect(c, ADD, r->x1, r->y1, r->x2, r->y2); } diff --git a/src/scheduler.c b/src/scheduler.c index 4f50b9ea..b5d32b5f 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -1954,7 +1954,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg int point = atoi(argv[4]); const char *node = argv[3]; int idx = -1; - if(point >= 0 && point < xctx->npoints) { + if(point >= 0 && point < xctx->npoints[0]) { if(isonlydigit(node)) { int i = atoi(node); if(i >= 0 && i < xctx->nvars) { @@ -1967,7 +1967,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg } } if(idx >= 0) { - double val = xctx->values[point][idx]; + double val = xctx->values[idx][point]; my_snprintf(s, S(s), "%g", val); Tcl_AppendResult(interp, s, NULL); } @@ -1985,7 +1985,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg } } else if(argc > 2) { if(!strcmp(argv[2], "points")) { - my_snprintf(s, S(s), "%d", xctx->npoints); + my_snprintf(s, S(s), "%d", xctx->npoints[0]); Tcl_AppendResult(interp, s, NULL); } else if(!strcmp(argv[2], "vars")) { my_snprintf(s, S(s), "%d", xctx->nvars); diff --git a/src/xinit.c b/src/xinit.c index 76d8b520..0779438b 100644 --- a/src/xinit.c +++ b/src/xinit.c @@ -425,7 +425,7 @@ void alloc_xschem_data(const char *top_path) xctx->names = NULL; xctx->values = NULL; xctx->nvars = 0; - xctx->npoints = 0; + xctx->npoints = NULL; xctx->datasets = 0; xctx->raw_schname = NULL; xctx->wires = 0; diff --git a/src/xschem.h b/src/xschem.h index 6e445838..4e23c000 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -694,7 +694,7 @@ typedef struct { char **names; RAW_FLOAT **values; int nvars; - int npoints; + int *npoints; int datasets; struct int_hashentry **raw_table; char *raw_schname; diff --git a/xschem_library/examples/LCC_instances.sch b/xschem_library/examples/LCC_instances.sch index 00bb0d00..406332f3 100644 --- a/xschem_library/examples/LCC_instances.sch +++ b/xschem_library/examples/LCC_instances.sch @@ -162,7 +162,10 @@ C {lab_pin.sym} 540 -760 0 0 {name=p14 lab=A} C {cmos_inv.sym} 580 -850 0 1 {name=Xinv3 WN=3u WP=5u LLN=3u LLP=3u} C {lab_pin.sym} 620 -760 0 1 {name=p2 lab=Z} C {cmos_inv.sym} 580 -760 0 0 {name=Xinv1 WN=3u WP=5u LLN=3u LLP=3u} -C {launcher.sym} 105 -1015 0 0 {name=h5 -descr="Ctrl-Left-Click on arrow -to load waveforms" -tclcommand="xschem raw_read $netlist_dir/[file rootname [xschem get current_name]].raw"} +C {launcher.sym} 85 -1015 0 0 {name=h1 +descr="Select arrow and +Ctrl-Left-Click to load/unload waveforms" +tclcommand=" +xschem raw_read $netlist_dir/[file tail [file rootname [xschem get current_name]]].raw +" +} diff --git a/xschem_library/examples/poweramp.sch b/xschem_library/examples/poweramp.sch index eff83ab9..6d239cf1 100644 --- a/xschem_library/examples/poweramp.sch +++ b/xschem_library/examples/poweramp.sch @@ -318,7 +318,10 @@ tclcommand="textwindow $netlist_dir/[file tail [file rootname [ xschem get schna } C {spice_probe.sym} 360 -1220 0 0 {name=p45 analysis=tran voltage=0.0000e+00} C {spice_probe.sym} 360 -1060 0 0 {name=p46 analysis=tran voltage=0.0000e+00} -C {launcher.sym} 1115 -985 0 0 {name=h5 -descr="Ctrl-Left-Click on arrow -to load waveforms" -tclcommand="xschem raw_read $netlist_dir/[file rootname [xschem get current_name]].raw"} +C {launcher.sym} 1095 -985 0 0 {name=h5 +descr="Select arrow and +Ctrl-Left-Click to load/unload waveforms" +tclcommand=" +xschem raw_read $netlist_dir/[file tail [file rootname [xschem get current_name]]].raw +" +} diff --git a/xschem_library/ngspice/autozero_comp.sch b/xschem_library/ngspice/autozero_comp.sch index da24d6ea..a655668f 100644 --- a/xschem_library/ngspice/autozero_comp.sch +++ b/xschem_library/ngspice/autozero_comp.sch @@ -18,7 +18,7 @@ L 4 410 -150 570 -150 {} L 4 570 -170 570 -150 {} L 4 570 -170 690 -170 {} L 7 1090 -260 2520 -260 {} -B 2 260 -1080 720 -980 {flags=1 +B 2 260 -1080 720 -920 {flags=1 y1 = 0 y2 = 1 divy = 5 @@ -26,7 +26,8 @@ x1=1.25e-07 x2=3.75e-07 divx=10 node="v(cal) v(saout)" -color="4 5"} +color="4 5" +} B 2 260 -1220 720 -1090 {flags=1 y1 = 0.645 y2 = 0.655 @@ -369,7 +370,10 @@ tclcommand="xschem netlist; xschem simulate"} C {parax_cap.sym} 980 -1090 0 0 {name=c4 value=5f} C {parax_cap.sym} 1470 -1090 0 0 {name=c6 value=5f} C {parax_cap.sym} 1960 -1090 0 0 {name=c7 value=5f} -C {launcher.sym} 325 -1355 0 0 {name=h1 +C {launcher.sym} 315 -1365 0 0 {name=h1 descr="Select arrow and -Ctrl-Right-Click to load waveforms" -tclcommand="xschem raw_read $netlist_dir/[file rootname [xschem get current_name]].raw"} +Ctrl-Left-Click to load/unload waveforms" +tclcommand=" +xschem raw_read $netlist_dir/[file tail [file rootname [xschem get current_name]]].raw +" +} diff --git a/xschem_library/ngspice/solar_panel.sch b/xschem_library/ngspice/solar_panel.sch index 31ac529a..6ee526e8 100644 --- a/xschem_library/ngspice/solar_panel.sch +++ b/xschem_library/ngspice/solar_panel.sch @@ -217,7 +217,10 @@ C {spice_probe.sym} 1160 -480 0 0 {name=p1 analysis=tran} C {spice_probe.sym} 360 -450 0 0 {name=p2 analysis=tran} C {spice_probe.sym} 860 -550 0 1 {name=p3 analysis=tran} C {spice_probe.sym} 100 -450 0 1 {name=p4 analysis=tran} -C {launcher.sym} 1185 -1055 0 0 {name=h5 -descr="Ctrl-Left-Click on arrow -to load waveforms" -tclcommand="xschem raw_read $netlist_dir/[file rootname [xschem get current_name]].raw"} +C {launcher.sym} 1125 -1045 0 0 {name=h3 +descr="Select arrow and +Ctrl-Left-Click to load/unload waveforms" +tclcommand=" +xschem raw_read $netlist_dir/[file tail [file rootname [xschem get current_name]]].raw +" +} diff --git a/xschem_library/rom8k/rom8k.sch b/xschem_library/rom8k/rom8k.sch index 138fb585..ae12c21b 100644 --- a/xschem_library/rom8k/rom8k.sch +++ b/xschem_library/rom8k/rom8k.sch @@ -359,7 +359,10 @@ C {lab_pin.sym} 1670 -740 0 0 {name=l2 lab=LDWL[16: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} -C {launcher.sym} 1565 -1135 0 0 {name=h5 -descr="Ctrl-Left-Click on arrow -to load waveforms" -tclcommand="xschem raw_read $netlist_dir/[file rootname [xschem get current_name]].raw"} +C {launcher.sym} 1475 -1135 0 0 {name=h1 +descr="Select arrow and +Ctrl-Left-Click to load/unload waveforms" +tclcommand=" +xschem raw_read $netlist_dir/[file tail [file rootname [xschem get current_name]]].raw +" +}