From c4e9310d45d957c66a1e13bf82af2e74cd990e64 Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Sun, 26 Nov 2023 12:54:37 +0100 Subject: [PATCH] allow to load raw files even if netlist type set to `symbol`. Better to_eng function, `xschem raw_query value node {}` returns value at cursor b position --- doc/xschem_man/developer_info.html | 33 +++--- src/scheduler.c | 27 +++-- src/xschem.tcl | 34 +++--- xschem_library/ngspice/pv_ngspice.sch | 144 ++++++++++---------------- 4 files changed, 104 insertions(+), 134 deletions(-) diff --git a/doc/xschem_man/developer_info.html b/doc/xschem_man/developer_info.html index b0d5f73f..d211b8b9 100644 --- a/doc/xschem_man/developer_info.html +++ b/doc/xschem_man/developer_info.html @@ -504,6 +504,22 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns" + + + + + + + + + + + + + + + + @@ -1053,7 +1069,8 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns" xschem raw_query list: get list of saved simulation variables xschem raw_query vars: get number of simulation variables xschem raw_query datasets: get number of datasets (simulation runs) - xschem raw_query value node n: return n-th value of 'node' in raw file + xschem raw_query value node n [dataset]: return n-th value of 'node' in raw file + If n is egiven as empty string {} return value at cursor b, dataset not used in this case xschem raw_query loaded: return hierarchy level where raw file was loaded or -1 if no raw loaded xschem raw_query rawfile: return raw filename @@ -1415,20 +1432,6 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns" - - - - - - - - - - - - - - diff --git a/src/scheduler.c b/src/scheduler.c index 95f7f6e8..d6d6003f 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -3248,7 +3248,8 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg * xschem raw_query list: get list of saved simulation variables * xschem raw_query vars: get number of simulation variables * xschem raw_query datasets: get number of datasets (simulation runs) - * xschem raw_query value node n: return n-th value of 'node' in raw file + * xschem raw_query value node n [dataset]: return n-th value of 'node' in raw file + * If n is egiven as empty string {} return value at cursor b, dataset not used in this case * xschem raw_query loaded: return hierarchy level * where raw file was loaded or -1 if no raw loaded * xschem raw_query rawfile: return raw filename @@ -3271,22 +3272,20 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg /* xschem rawfile_query value v(ldcp) 123 */ if(argc > 4 && !strcmp(argv[2], "value")) { int dataset = -1; - int point = atoi(argv[4]); + int point = argv[4][0] ? atoi(argv[4]) : -1; const char *node = argv[3]; int idx = -1; if(argc > 5) dataset = atoi(argv[5]); - if((dataset >= 0 && point >= 0 && point < raw->npoints[dataset]) || - (point >= 0 && point < raw->allpoints)) { - if(isonlydigit(node)) { - int i = atoi(node); - if(i >= 0 && i < raw->nvars) { - idx = i; - } - } else { - idx = get_raw_index(node); - } - if(idx >= 0) { - double val = get_raw_value(dataset, idx, point); + idx = get_raw_index(node); + if(idx >= 0) { + double val; + if( (dataset >=0 && point >= 0 && point < raw->npoints[dataset]) || + (dataset == -1 && point >= 0 && point < raw->allpoints) + ) { + val = get_raw_value(dataset, idx, point); + Tcl_SetResult(interp, dtoa(val), TCL_VOLATILE); + } else if(xctx->raw->cursor_b_val) { + val = xctx->raw->cursor_b_val[idx]; Tcl_SetResult(interp, dtoa(val), TCL_VOLATILE); } } diff --git a/src/xschem.tcl b/src/xschem.tcl index 774bf75a..6348dc24 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -608,8 +608,9 @@ proc from_eng {i} { } ## convert number to engineering form -proc to_eng {i} { +proc to_eng {args} { set suffix {} + set i [expr [join $args]] set absi [expr {abs($i)}] if {$absi == 0.0} { set mult 1 ; set suffix {} @@ -1916,6 +1917,10 @@ proc waves {{type {}}} { global netlist_dir terminal sim XSCHEM_SHAREDIR has_x global bespice_listen_port env simulate_bg execute + if {$type ne {external} } { + load_raw $type + return + } set netlist_type [xschem get netlist_type] set_sim_defaults if { [set_netlist_dir 0] ne {}} { @@ -1936,7 +1941,7 @@ proc waves {{type {}}} { set N ${n}.${tool} } set tool ${tool}wave - if { ![info exists sim($tool,default)] } { + if {![info exists sim($tool,default)] } { if { [info exists has_x] } {alert_ "Warning: viewer for $tool is not configured"} puts "Warning: viewer for $tool is not configured" return @@ -1949,23 +1954,18 @@ proc waves {{type {}}} { } else { set fg {execute} } + set cmd [subst -nobackslashes $sim($tool,$def,cmd)] - if {$type ne {external} } { - load_raw $type - } else { - set cmd [subst -nobackslashes $sim($tool,$def,cmd)] + set save [pwd] + cd $netlist_dir + set id [eval execute $st $cmd] + cd $save - set save [pwd] - cd $netlist_dir - set id [eval execute $st $cmd] - cd $save - - if {$fg eq {execute_wait}} { - if {$id >= 0} { - xschem set semaphore [expr {[xschem get semaphore] +1}] - vwait execute(pipe,$id) - xschem set semaphore [expr {[xschem get semaphore] -1}] - } + if {$fg eq {execute_wait}} { + if {$id >= 0} { + xschem set semaphore [expr {[xschem get semaphore] +1}] + vwait execute(pipe,$id) + xschem set semaphore [expr {[xschem get semaphore] -1}] } } } diff --git a/xschem_library/ngspice/pv_ngspice.sch b/xschem_library/ngspice/pv_ngspice.sch index 702a1d14..b9b9f5d8 100644 --- a/xschem_library/ngspice/pv_ngspice.sch +++ b/xschem_library/ngspice/pv_ngspice.sch @@ -24,7 +24,7 @@ K {} V {} S {} E {} -B 2 860 -550 1360 -160 {flags=graph +B 2 920 -580 1420 -190 {flags=graph y1 = -0.115954 y2 = 11.9983 divy = 4 @@ -40,7 +40,7 @@ dataset=-1 color=4 node=i(vload)} -B 2 860 -790 1360 -550 {flags=graph +B 2 920 -820 1420 -580 {flags=graph y1 = -34.3253 y2 = 449.01 divy = 4 @@ -54,96 +54,64 @@ divx=8 dataset=-1 color=4 node="\\"power; i(vload) v(plus) *\\""} -B 2 860 -1040 1360 -800 {flags=graph -y1 = -0.208022 -y2 = 0.916906 -divy = 4 -subdivy=1 -x1=0 -x2=48 -divx=8 - unitx=1 - - -dataset=-1 -color="4 15" -node="a -b"} -B 2 860 -1290 1360 -1050 {flags=graph -y1 = -10.063 -y2 = 4.38019 -divy = 8 -subdivy=0 -x1=0 -x2=48 -divx=8 - unitx=1 - - -dataset=-1 - -color=15 -node=i(@d1[id]) -logy=1 -subdivx=0} T {position the mouse close to one of the curves and press 't' to display only that curve. This allows you to annotate the active -waveform in the schematic.} 480 -370 0 0 0.3 0.3 {} -T {tcleval(SUN=[expr \{[xschem getprop rect 2 0 dataset] == -1 ? \{N/A\} : ([xschem getprop rect 2 0 dataset] + 1)*20\}]%)} 710 -460 0 0 0.4 0.4 {name=xxxx} -T {@name} 485 -686.25 2 1 0.2 0.2 { +waveform in the schematic.} 710 -150 0 0 0.3 0.3 {} +T {tcleval(SUN=[expr \{[xschem getprop rect 2 0 dataset] == -1 ? \{N/A\} : ([xschem getprop rect 2 0 dataset] + 1)*20\}]%)} 720 -540 0 0 0.4 0.4 {name=xxxx} +T {@name} 495 -766.25 2 1 0.2 0.2 { name=Rs} -T {@value} 495 -646.25 2 0 0.2 0.2 { +T {@value} 505 -726.25 2 0 0.2 0.2 { name=Rs} -T {m=@m} 485 -701.25 2 1 0.2 0.2 { +T {m=@m} 495 -781.25 2 1 0.2 0.2 { name=Rs} -T {@spice_get_current} 406.25 -657.5 1 0 0.2 0.2 {layer=15 +T {@spice_get_current} 416.25 -737.5 1 0 0.2 0.2 {layer=15 name=Rs} -N 630 -480 630 -420 { +N 640 -560 640 -500 { lab=minus} -N 630 -800 630 -780 { +N 640 -880 640 -860 { lab=plus} -N 200 -670 200 -650 { +N 210 -750 210 -730 { lab=A} -N 160 -670 200 -670 { +N 170 -750 210 -750 { lab=A} -N 590 -610 590 -570 { +N 600 -690 600 -650 { lab=0} -N 590 -670 590 -650 { +N 600 -750 600 -730 { lab=B} -N 530 -670 530 -650 { +N 540 -750 540 -730 { lab=B} -N 630 -600 630 -540 { +N 640 -680 640 -620 { lab=im} -N 630 -720 630 -660 { +N 640 -800 640 -740 { lab=ip} -N 100 -670 100 -650 { +N 110 -750 110 -730 { lab=#net1} -N 100 -570 590 -570 { +N 110 -650 600 -650 { lab=0} -N 70 -570 100 -570 { +N 80 -650 110 -650 { lab=0} -N 100 -590 100 -570 { +N 110 -670 110 -650 { lab=0} -N 200 -590 200 -570 { +N 210 -670 210 -650 { lab=0} -N 330 -590 330 -570 { +N 340 -670 340 -650 { lab=0} -N 530 -590 530 -570 { +N 540 -670 540 -650 { lab=0} -N 330 -670 330 -650 { +N 340 -750 340 -730 { lab=#net2} -N 330 -670 360 -670 { +N 340 -750 370 -750 { lab=#net2} -N 200 -670 270 -670 { +N 210 -750 280 -750 { lab=A} -N 420 -670 430 -670 { +N 430 -750 440 -750 { lab=#net3} -N 520 -670 590 -670 { +N 530 -750 600 -750 { lab=B} -N 490 -670 520 -670 { +N 500 -750 530 -750 { lab=B} -C {code_shown.sym} 40 -400 0 0 {name=CONTROL_400w_voc_43 +C {code_shown.sym} 360 -420 0 0 {name=CONTROL_400w_voc_43 spice_ignore=false only_toplevel=true value=".param isc=11.5 @@ -162,12 +130,12 @@ write pv_ngspice.raw quit .endc "} -C {iopin.sym} 630 -420 2 1 {name=p2 lab=minus} +C {iopin.sym} 640 -500 2 1 {name=p2 lab=minus} C {title.sym} 160 -40 0 0 {name=l1 author="Stefan Schippers" net_name=true} -C {ipin.sym} 90 -760 2 1 {name=p2 lab=fade} -C {ammeter.sym} 130 -670 3 0 {name=Vf} -C {iopin.sym} 630 -800 2 1 {name=p1 lab=plus} -C {launcher.sym} 930 -140 0 0 {name=h3 +C {ipin.sym} 100 -840 2 1 {name=p2 lab=fade} +C {ammeter.sym} 140 -750 3 0 {name=Vf} +C {iopin.sym} 640 -880 2 1 {name=p1 lab=plus} +C {launcher.sym} 1250 -160 0 0 {name=h3 descr="Netlist, Simulate, Reload waves" tclcommand=" if \{![info exists sim]\} \{set_sim_defaults\} @@ -180,7 +148,7 @@ xschem simulate xschem raw_read $netlist_dir/[file tail [file rootname [xschem get current_name]]].raw " } -C {launcher.sym} 930 -100 0 0 {name=h1 +C {launcher.sym} 1250 -120 0 0 {name=h1 descr="Load embedded waves" tclcommand="xschem raw_read_from_attr" spice_data=" @@ -1092,39 +1060,39 @@ AAAAAAAAACCo+3TfgJ3BIKj7dN+AncEgqPt034CdwRIAAAAAgEdAAAAAAAAAAAAAAAAAAAAAABIAAAAA AAAAAAAAAEYzMzMzs0dARjMzMzOzR0AAAAAAAAAAAGBdUguLJqbBYF1SC4smpsFgXVILiyamweDMzMzMzEdAAAAAAAAAAAAAAAAAAAAAAODMzMzMzEdA4MzMzMzMR0AA AAAAAAAAAACASGFmXanBAIBIYWZdqcEAgEhhZl2pwXpmZmZm5kdAAAAAAAAAAAAAAAAAAAAAAHpmZmZm5kdAemZmZmbmR0AAAAAAAAAAAEBcFH2pC63BQFwUfakLrcFA XBR9qQutwRQAAAAAAEhAAAAAAAAAAAAAAAAAAAAAABQAAAAAAEhAFAAAAAAASEAAAAAAAAAAAICJiQpUobDBgImJClShsMGAiYkKVKGwwQ=="} -C {launcher.sym} 1300 -90 0 0 {name=h2 +C {launcher.sym} 1250 -70 0 0 {name=h2 descr="Reload waves" tclcommand=" xschem raw_read $netlist_dir/[file tail [file rootname [xschem get current_name]]].raw " } -C {ammeter.sym} 630 -510 2 0 {name=Vm savecurrent=true} -C {ammeter.sym} 630 -750 2 0 {name=Vp savecurrent=true} -C {diode.sym} 200 -620 0 0 {name=D1 model=DPANEL area='area' +C {ammeter.sym} 640 -590 2 0 {name=Vm savecurrent=true} +C {ammeter.sym} 640 -830 2 0 {name=Vp savecurrent=true} +C {diode.sym} 210 -700 0 0 {name=D1 model=DPANEL area='area' device_model=".model DPANEL D IS=1n N=1"} -C {res.sym} 330 -620 0 0 {name=Rp +C {res.sym} 340 -700 0 0 {name=Rp value='rp' footprint=1206 device=resistor m=1} -C {res.sym} 460 -670 1 0 {name=Rs +C {res.sym} 470 -750 1 0 {name=Rs value='rs' footprint=1206 device=resistor m=1 hide_texts=true} -C {lab_pin.sym} 70 -570 2 1 {name=l2 sig_type=std_logic lab=0} -C {cccs.sym} 530 -620 2 0 {name=F1 vnam=e1 value=1} -C {vcvs.sym} 630 -630 0 0 {name=E1 value="'n'"} -C {lab_wire.sym} 250 -670 0 0 {name=p3 sig_type=std_logic lab=A} -C {lab_wire.sym} 550 -670 0 0 {name=p4 sig_type=std_logic lab=B} -C {ammeter.sym} 120 -760 3 0 {name=Vf1} -C {lab_pin.sym} 150 -760 0 1 {name=p5 sig_type=std_logic lab=F} -C {bsource.sym} 100 -620 2 0 {name=B1 VAR=I FUNC="v(f) * isc"} -C {ammeter.sym} 300 -670 3 0 {name=Vr} -C {ammeter.sym} 390 -670 3 0 {name=Vm1 savecurrent=true} -C {code_shown.sym} -320 -390 0 0 {name=CONTROL_100w_voc_22 +C {lab_pin.sym} 80 -650 2 1 {name=l2 sig_type=std_logic lab=0} +C {cccs.sym} 540 -700 2 0 {name=F1 vnam=e1 value=1} +C {vcvs.sym} 640 -710 0 0 {name=E1 value="'n'"} +C {lab_wire.sym} 260 -750 0 0 {name=p3 sig_type=std_logic lab=A} +C {lab_wire.sym} 560 -750 0 0 {name=p4 sig_type=std_logic lab=B} +C {ammeter.sym} 130 -840 3 0 {name=Vf1} +C {lab_pin.sym} 160 -840 0 1 {name=p5 sig_type=std_logic lab=F} +C {bsource.sym} 110 -700 2 0 {name=B1 VAR=I FUNC="v(f) * isc"} +C {ammeter.sym} 310 -750 3 0 {name=Vr} +C {ammeter.sym} 400 -750 3 0 {name=Vm1 savecurrent=true} +C {code_shown.sym} 0 -410 0 0 {name=CONTROL_100w_voc_22 spice_ignore=true only_toplevel=true value=".param isc=6 @@ -1143,5 +1111,5 @@ write pv_ngspice.raw quit .endc "} -C {lab_wire.sym} 630 -690 0 0 {name=p6 sig_type=std_logic lab=ip} -C {lab_wire.sym} 630 -560 0 0 {name=p7 sig_type=std_logic lab=im} +C {lab_wire.sym} 640 -770 0 0 {name=p6 sig_type=std_logic lab=ip} +C {lab_wire.sym} 640 -640 0 0 {name=p7 sig_type=std_logic lab=im}