diff --git a/doc/xschem_man/developer_info.html b/doc/xschem_man/developer_info.html index 3d64a8ee..54dfad7f 100644 --- a/doc/xschem_man/developer_info.html +++ b/doc/xschem_man/developer_info.html @@ -903,8 +903,9 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns" Highlight instance 'inst' if 'fast' is specified do not redraw 'inst' can be an instance name or number -
- Highlight net name 'net'+
+ Highlight net name 'net' + if '-fast' is given do not redraw hilights after operation
blend_white|blend_black]
Apply required changes to selected images
@@ -1596,7 +1597,9 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
Translate string 'str' replacing @xxx tokens with values in instance 'n' attributes
Example: xschem translate vref {the voltage is @value}
- the voltage is 1.8
+ the voltage is 1.8
+ If -1 is given as the instance number try to translate the string without using any
+ instance specific data
Translate string 'str' replacing @xxx tokens with values in string s1 or if
not found in string s2 or if not found in string s3
diff --git a/src/draw.c b/src/draw.c
index 9c5f9d6e..f2041244 100644
--- a/src/draw.c
+++ b/src/draw.c
@@ -2577,6 +2577,7 @@ 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];
+ register SPICE_DATA *gv0 = raw->values[0];
ofs_end = ofs + raw->npoints[dset];
/* optimization: skip unwanted datasets, if no dc no need to detect sweep variable wraps */
@@ -2584,8 +2585,8 @@ int graph_fullyzoom(xRect *r, Graph_ctx *gr, int graph_dataset)
for(p = ofs ; p < ofs_end; p++) {
if(gr->logx) xx = mylog10(gv[p]);
else xx = gv[p];
- if(p == ofs) xx0 = gv[p];
- wrap = (cnt > 1 && gv[p] == xx0);
+ if(p == ofs) xx0 = gv0[p];
+ wrap = (cnt > 1 && gv0[p] == xx0);
if(wrap) {
sweepvar_wrap++;
cnt = 0;
@@ -3596,6 +3597,7 @@ 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];
+ register SPICE_DATA *gv0 = raw->values[0];
ofs_end = ofs + raw->npoints[dset];
first = -1;
last = ofs;
@@ -3608,8 +3610,8 @@ int calc_custom_data_yrange(int sweep_idx, const char *express, Graph_ctx *gr)
else
xx = gv[p];
- if(p == ofs) xx0 = gv[p];
- wrap = ( cnt > 1 && gv[p] == xx0);
+ if(p == ofs) xx0 = gv0[p];
+ wrap = ( cnt > 1 && gv0[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 */
@@ -3737,6 +3739,7 @@ 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];
+ register 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);
@@ -3750,10 +3753,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 = gvx[p];
if(gr->logy) yy = mylog10(gvy[p]);
else yy = gvy[p];
- wrap = (cnt > 1 && gvx[p] == xx0);
+ if(p == ofs) xx0 = gv0[p];
+ wrap = (cnt > 1 && gv0[p] == xx0);
if(first != -1) {
if(xx > end || xx < start || wrap) {
dbg(1, "find_closest_wave(): last=%d\n", last);
@@ -4053,6 +4056,7 @@ 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];
+ register SPICE_DATA *gv0 = xctx->raw->values[0];
ofs_end = ofs + xctx->raw->npoints[dset];
first = -1;
@@ -4073,8 +4077,11 @@ void draw_graph(int i, const int flags, Graph_ctx *gr, void *ct)
else xx = gv[p];
xxprevious = xxfollowing = xx;
- if(p == ofs) xx0 = gv[p];
- wrap = cnt > 1 && gv[p] == xx0;
+ /* do not use sweep variable for wrap detection. sweep variables other that simulation sweep var
+ * are simulated and thos no equality test can be done, and any "approx equal" test si going
+ * to do unexpected things (liek in simulations with very dense steps) */
+ if(p == ofs) xx0 = gv0[p]; /* gv[p];*/
+ wrap = cnt > 1 && gv0[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) */
diff --git a/src/hilight.c b/src/hilight.c
index 776526c3..8f2406fb 100644
--- a/src/hilight.c
+++ b/src/hilight.c
@@ -1104,7 +1104,7 @@ static void drill_hilight(int mode)
if(propagate_str) my_free(_ALLOC_ID_, &propagate_str);
}
-int hilight_netname(const char *name)
+int hilight_netname(const char *name, int fast)
{
Node_hashentry *node_entry;
prepare_netlist_structs(0);
@@ -1113,9 +1113,11 @@ int hilight_netname(const char *name)
node_entry = bus_node_hash_lookup(name, "", XLOOKUP, 0, "", "", "", "");
/* sets xctx->hilight_nets=1 */
if(node_entry && !bus_hilight_hash_lookup(name, xctx->hilight_color, XINSERT_NOREPLACE)) {
- if(tclgetboolvar("incr_hilight")) incr_hilight_color();
propagate_hilights(1, 0, XINSERT_NOREPLACE);
- redraw_hilights(0);
+ if(!fast) {
+ if(tclgetboolvar("incr_hilight")) incr_hilight_color();
+ redraw_hilights(0);
+ }
}
return node_entry ? 1 : 0;
}
diff --git a/src/scheduler.c b/src/scheduler.c
index ffb1ff47..2bba379e 100644
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -2245,14 +2245,26 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
}
Tcl_ResetResult(interp);
}
- /* hilight_netname net
- * Highlight net name 'net' */
+ /* hilight_netname [-fast] net
+ * Highlight net name 'net'
+ * if '-fast' is given do not redraw hilights after operation */
else if(!strcmp(argv[1], "hilight_netname"))
{
- int ret = 0;
+ int ret = 0, fast = 0, i;
+ const char *net = NULL;
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
- if(argc > 2) {
- ret = hilight_netname(argv[2]);
+ for(i = 2; i < argc; i++) {
+ if(argv[i][0] == '-') {
+ if(!strcmp(argv[i], "-fast")) {
+ fast = 1;
+ }
+ } else {
+ net = argv[i];
+ break;
+ }
+ }
+ if(net) {
+ ret = hilight_netname(net, fast);
}
Tcl_SetResult(interp, ret ? "1" : "0" , TCL_STATIC);
}
@@ -5972,14 +5984,17 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
/* translate n str
* Translate string 'str' replacing @xxx tokens with values in instance 'n' attributes
* Example: xschem translate vref {the voltage is @value}
- * the voltage is 1.8 */
+ * the voltage is 1.8
+ * If -1 is given as the instance number try to translate the string without using any
+ * instance specific data */
else if(!strcmp(argv[1], "translate") )
{
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
if(argc>3) {
int i;
char *s = NULL;
- if((i = get_instance(argv[2])) < 0 ) {
+ if(!strcmp(argv[2], "-1")) i = -1;
+ else if((i = get_instance(argv[2])) < 0 ) {
Tcl_SetResult(interp, "xschem translate: instance not found", TCL_STATIC);
return TCL_ERROR;
}
diff --git a/src/xschem.h b/src/xschem.h
index de5b5f2a..7d79d48b 100644
--- a/src/xschem.h
+++ b/src/xschem.h
@@ -1700,7 +1700,7 @@ extern void print_generic(FILE *fd, char *ent_or_comp, int symbol);
extern void print_verilog_param(FILE *fd, int symbol);
extern void hilight_net(int to_waveform);
extern void logic_set(int v, int num, const char *net_name);
-extern int hilight_netname(const char *name);
+extern int hilight_netname(const char *name, int fast);
extern void unhilight_net();
extern void propagate_hilights(int set, int clear, int mode);
extern void select_connected_nets(int stop_at_junction);
diff --git a/tests/xschemtest.tcl b/tests/xschemtest.tcl
index 6e6690b5..df115782 100644
--- a/tests/xschemtest.tcl
+++ b/tests/xschemtest.tcl
@@ -190,7 +190,7 @@ proc test_xschem_simulation {{f simulate_ff.sch}} {
proc netlist_test {} {
global netlist_dir
foreach {f t h} {
- rom8k.sch spice 186669317
+ rom8k.sch spice 4198475513
greycnt.sch verilog 1945914565
autozero_comp.sch spice 1472671699
test_generators.sch spice 49312823
diff --git a/xschem_library/ngspice/solar_panel.sch b/xschem_library/ngspice/solar_panel.sch
index 046ef49c..8addbfa0 100644
--- a/xschem_library/ngspice/solar_panel.sch
+++ b/xschem_library/ngspice/solar_panel.sch
@@ -100,9 +100,10 @@ hilight_wave=-1
-autoload=1
-rawfile=$netlist_dir/solar_panel.raw
-sim_type=tran}
+autoload=0
+
+sim_type=tran
+xrawfile=$netlist_dir/solar_panel.raw}
B 2 1260 -390 1680 -220 {flags=graph
y1 = -0.0012
y2 = 6.8
@@ -118,9 +119,10 @@ i(Vled)
\\"R.Avg. I(VPANEL); i(VPANEL) 20u ravg()\\""
jpeg_quality=30
linewidth_mult=2.0
-autoload=1
-rawfile=$netlist_dir/solar_panel.raw
-sim_type=tran}
+autoload=0
+
+sim_type=tran
+xrawfile=$netlist_dir/solar_panel.raw}
B 2 1260 -750 1680 -560 {flags=graph
y1 = -2.7e-05
y2 = 100
@@ -140,9 +142,10 @@ SUN \\\\%; SUN 100 *"
hilight_wave=-1
jpeg_quality=30
linewidth_mult=2.0
-autoload=1
-rawfile=$netlist_dir/solar_panel.raw
-sim_type=tran}
+autoload=0
+
+sim_type=tran
+xrawfile=$netlist_dir/solar_panel.raw}
B 2 1260 -940 1680 -750 {flags=graph
y1 = 0
y2 = 1
@@ -162,9 +165,10 @@ ypos1=0.00261891
ypos2=0.51596
jpeg_quality=30
linewidth_mult=2.0
-autoload=1
-rawfile=$netlist_dir/solar_panel.raw
-sim_type=tran}
+autoload=0
+
+sim_type=tran
+xrawfile=$netlist_dir/solar_panel.raw}
B 2 1260 -1140 1680 -950 {flags=graph
y1 = 0
y2 = 1
@@ -185,9 +189,10 @@ color=8
node="\\"CTRL1 Duty cycle; CTRL1 20u ravg()\\""
jpeg_quality=30
linewidth_mult=2.0
-autoload=1
-rawfile=$netlist_dir/solar_panel.raw
-sim_type=tran}
+autoload=0
+
+sim_type=tran
+xrawfile=$netlist_dir/solar_panel.raw}
B 18 65 -960 320 -775 {}
A 5 320 -960 5.590169943749475 243.434948822922 360 {fill=true}
P 7 6 395 -775 340 -931.25 335 -945 322.5 -960 310 -965 65 -975 {}
diff --git a/xschem_library/rom8k/rom8k.sch b/xschem_library/rom8k/rom8k.sch
index ea849252..4c8d6082 100644
--- a/xschem_library/rom8k/rom8k.sch
+++ b/xschem_library/rom8k/rom8k.sch
@@ -1,4 +1,4 @@
-v {xschem version=3.4.5 file_version=1.2
+v {xschem version=3.4.6 file_version=1.2
*
* This file is part of XSCHEM,
* a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit
@@ -524,3 +524,7 @@ simswap
"
}
+C {spice_probe.sym} 190 -790 2 0 {name=p92 analysis=tran}
+C {spice_probe.sym} 90 -790 2 0 {name=p102 analysis=tran}
+C {spice_probe.sym} 90 -890 2 0 {name=p103 analysis=tran}
+C {spice_probe.sym} 150 -400 2 0 {name=p104 analysis=tran}