From a79af0c7e5e0c76e9be41d7ddd4bb96ff84bbaa7 Mon Sep 17 00:00:00 2001 From: Stefan Frederik Date: Sun, 30 Jan 2022 14:39:11 +0100 Subject: [PATCH] send currents to graph --- src/draw.c | 2 + src/hilight.c | 39 ++++- src/scheduler.c | 2 + xschem_library/examples/poweramp_xyce.sch | 51 +++++- xschem_library/ngspice/autozero_comp_xyce.sch | 155 ++++++++++-------- 5 files changed, 177 insertions(+), 72 deletions(-) diff --git a/src/draw.c b/src/draw.c index 15845356..fadd01e5 100644 --- a/src/draw.c +++ b/src/draw.c @@ -2365,6 +2365,8 @@ void draw_graph(int i, const int flags, Graph_ctx *gr) nptr = cptr = sptr = NULL; dbg(1, "ntok=%s ctok=%s\n", ntok, ctok? ctok: "NULL"); if(ctok && ctok[0]) wave_color = atoi(ctok); + if(wave_color < 0) wave_color = 0; + if(wave_color >= cadlayers) wave_color = cadlayers - 1; if(stok && stok[0]) { sweep_idx = get_raw_index(stok); if( sweep_idx == -1) { diff --git a/src/hilight.c b/src/hilight.c index 302972fb..7c577acb 100644 --- a/src/hilight.c +++ b/src/hilight.c @@ -859,9 +859,9 @@ static void send_net_to_bespice(int simtype, const char *node) sprintf(color_str, "%d %d %d", xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8, xctx->xcolor_array[c].blue>>8); expanded_tok = expandlabel(tok, &tok_mult); + my_strdup2(1278, &p, xctx->sch_path[xctx->currsch]+1); for(k=1; k<=tok_mult; k++) { my_strdup(1277, &t, find_nth(expanded_tok, ',', k)); - my_strdup2(1278, &p, xctx->sch_path[xctx->currsch]+1); if(simtype == 0 ) { /* spice */ tclvareval( "puts $bespice_server_getdata(sock) ", @@ -908,7 +908,7 @@ static void send_net_to_graph(char **s, int simtype, const char *node) Node_hashentry *node_entry; const char *expanded_tok; const char *tok; - char ss[1024]; + char ss[1024] = ""; if(!node || !node[0]) return; tok = node; node_entry = bus_node_hash_lookup(tok, "", XLOOKUP, 0, "", "", "", ""); @@ -917,9 +917,9 @@ static void send_net_to_graph(char **s, int simtype, const char *node) char *t=NULL, *p=NULL; c = get_color(xctx->hilight_color); expanded_tok = expandlabel(tok, &tok_mult); + my_strdup2(1499, &p, xctx->sch_path[xctx->currsch]+1); for(k=1; k<=tok_mult; k++) { my_strdup(1503, &t, find_nth(expanded_tok, ',', k)); - my_strdup2(1499, &p, xctx->sch_path[xctx->currsch]+1); if(simtype == 0 ) { /* spice */ dbg(1, "%s%s color=%d\n", strtolower(p), strtolower(t), c); my_snprintf(ss, S(ss), "%s%s %d ", strtolower(p), strtolower(t), c); @@ -951,9 +951,9 @@ static void send_net_to_gaw(int simtype, const char *node) expanded_tok = expandlabel(tok, &tok_mult); tcleval("setup_tcp_gaw"); if(tclresult()[0] == '0') return; + my_strdup2(254, &p, xctx->sch_path[xctx->currsch]+1); for(k=1; k<=tok_mult; k++) { my_strdup(246, &t, find_nth(expanded_tok, ',', k)); - my_strdup2(254, &p, xctx->sch_path[xctx->currsch]+1); if(simtype == 0 ) { /* spice */ tclvareval("puts $gaw_fd {copyvar v(", strtolower(p), strtolower(t), ") sel #", color_str, "}\nvwait gaw_fd\n", NULL); @@ -991,9 +991,9 @@ static void send_current_to_bespice(int simtype, const char *node) sprintf(color_str, "%d %d %d", xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8, xctx->xcolor_array[c].blue>>8); expanded_tok = expandlabel(tok, &tok_mult); + my_strdup2(1282, &p, xctx->sch_path[xctx->currsch]+1); for(k=1; k<=tok_mult; k++) { my_strdup(1281, &t, find_nth(expanded_tok, ',', k)); - my_strdup2(1282, &p, xctx->sch_path[xctx->currsch]+1); if(!simtype) { /* spice */ tclvareval( "puts $bespice_server_getdata(sock) ", @@ -1038,6 +1038,31 @@ static void send_current_to_bespice(int simtype, const char *node) my_free(1284, &t); } +static void send_current_to_graph(char **s, int simtype, const char *node) +{ + int c, k, tok_mult; + const char *expanded_tok; + const char *tok; + char *t=NULL, *p=NULL; + char ss[1024] = ""; + + if(!node || !node[0]) return; + tok = node; + c = get_color(xctx->hilight_color); + expanded_tok = expandlabel(tok, &tok_mult); + my_strdup2(523, &p, xctx->sch_path[xctx->currsch]+1); + for(k=1; k<=tok_mult; k++) { + my_strdup(376, &t, find_nth(expanded_tok, ',', k)); + if(!simtype) { /* ngspice */ + my_snprintf(ss, S(ss), "i(%s%s%s) %d", xctx->currsch>0 ? "v." : "", + strtolower(p), strtolower(t), c); + my_strcat(1502, s, ss); + } + } + my_free(533, &p); + my_free(534, &t); +} + static void send_current_to_gaw(int simtype, const char *node) { int c, k, tok_mult; @@ -1055,9 +1080,9 @@ static void send_current_to_gaw(int simtype, const char *node) expanded_tok = expandlabel(tok, &tok_mult); tcleval("setup_tcp_gaw"); if(tclresult()[0] == '0') return; + my_strdup2(1180, &p, xctx->sch_path[xctx->currsch]+1); for(k=1; k<=tok_mult; k++) { my_strdup(1179, &t, find_nth(expanded_tok, ',', k)); - my_strdup2(1180, &p, xctx->sch_path[xctx->currsch]+1); if(!simtype) { /* spice */ tclvareval("puts $gaw_fd {copyvar i(", xctx->currsch>0 ? "v." : "", strtolower(p), strtolower(t), @@ -1612,7 +1637,7 @@ void hilight_net(int viewer) xctx->hilight_nets=1; xctx->inst[n].color = xctx->hilight_color; if(type && (!strcmp(type, "current_probe") || !strcmp(type, "vsource")) ) { - if(viewer == XSCHEM_GRAPH) ; /* <<<<, */ + if(viewer == XSCHEM_GRAPH) send_current_to_graph(&s, sim_is_xyce, xctx->inst[n].instname); else if(viewer == GAW) send_current_to_gaw(sim_is_xyce, xctx->inst[n].instname); else if(viewer == BESPICE) send_current_to_bespice(sim_is_xyce, xctx->inst[n].instname); } diff --git a/src/scheduler.c b/src/scheduler.c index 09e8c5d3..fe34fcee 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -2495,6 +2495,8 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg } else if(!strcmp(argv[2],"rectcolor")) { xctx->rectcolor=atoi(argv[3]); + if(xctx->rectcolor < 0 ) xctx->rectcolor = 0; + if(xctx->rectcolor >= cadlayers ) xctx->rectcolor = cadlayers - 1; rebuild_selected_array(); if(xctx->lastsel) { change_layer(); diff --git a/xschem_library/examples/poweramp_xyce.sch b/xschem_library/examples/poweramp_xyce.sch index c799fff9..40b22b50 100644 --- a/xschem_library/examples/poweramp_xyce.sch +++ b/xschem_library/examples/poweramp_xyce.sch @@ -1,4 +1,4 @@ -v {xschem version=2.9.9 file_version=1.2 } +v {xschem version=3.0.0 file_version=1.2 } G {} K {} V {} @@ -14,6 +14,46 @@ L 18 900 -580 910 -580 {} L 18 880 -530 900 -580 {} L 18 880 -530 880 -450 {} L 18 900 -580 900 -400 {} +B 2 1260 -230 1940 -40 {flags=graph +y1 = 0.039127 +y2 = 0.0391312 +divy = 5 +x1=0.0257846 +x2=0.0261791 +divx=10 +node=V:X1:3#branch +color=11 unitx=m unity=m +} +B 2 1260 -430 1940 -240 {flags=graph +y1 = 0 +y2 = 12 +divy = 6 +x1=0.0257846 +x2=0.0261791 +divx=10 +node="V:X1:U#branch +V:X0:U#branch +V:X1:D#branch +V:X0:D#branch" +color="11 13 12 7" +unitx=m +} +B 2 1260 -760 1940 -450 {flags=graph +y1 = -60 +y2 = 60 +divy = 12 +x1=0.0257846 +x2=0.0261791 +divx=10 +node="OUTP +OUTM +VPP +VNN +X1.VBOOST +X0.VBOOST" +color="4 15 6 12 7 4" +unitx=m +} T {actual value 50u} 410 -820 0 0 0.4 0.4 {} T {actual value @@ -24,6 +64,8 @@ T {actual value 50u} 80 -290 0 0 0.4 0.4 {} T {actual value 200} 870 -1330 0 0 0.4 0.4 {} +T {Select one or more graphs (and no other objects) +and use arrow keys to zoom / pan waveforms} 1120 -840 0 0 0.3 0.3 {} N 160 -1250 160 -1230 {lab=#net1} N 160 -1110 160 -1090 {lab=#net2} N 280 -1170 340 -1170 {lab=VSS} @@ -220,3 +262,10 @@ C {spice_probe.sym} 740 -240 0 0 {name=p41 analysis=tran} C {spice_probe.sym} 670 -1250 0 0 {name=p42 analysis=tran} C {spice_probe.sym} 680 -1170 0 0 {name=p43 analysis=tran} C {spice_probe.sym} 960 -1250 0 0 {name=p44 analysis=tran} +C {launcher.sym} 1155 -885 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_xyce.sch b/xschem_library/ngspice/autozero_comp_xyce.sch index ce34cbea..b5e8cef6 100644 --- a/xschem_library/ngspice/autozero_comp_xyce.sch +++ b/xschem_library/ngspice/autozero_comp_xyce.sch @@ -1,5 +1,6 @@ -v {xschem version=2.9.5 file_version=1.1} +v {xschem version=3.0.0 file_version=1.2 } G {} +K {} V {} S {} E {} @@ -16,6 +17,25 @@ L 4 540 -180 540 -160 {} L 4 540 -160 700 -160 {} L 4 700 -180 700 -160 {} L 4 700 -180 820 -180 {} +B 2 10 -1500 750 -1030 {flags=graph +y1=0 +y2=0.86 +ypos1=0 +ypos2=2 +divy=5 +subdivy=1 +unity=1 +x1=-2.08023e-08 +x2=4.40002e-07 +divx=5 +subdivx=1 +node="SAOUT +SAOUTF +OUTDIFF" +color="4 7 6" +dataset=0 +unitx=u +} T {CAL} 270 -190 0 1 0.4 0.4 {} T {EN} 270 -140 0 1 0.4 0.4 {} T {OFF} 790 -310 0 1 0.4 0.4 {} @@ -27,9 +47,9 @@ T {CALIBRATION 30ns} 540 -320 0 1 0.4 0.4 {} T {SENSING 30ns} 670 -320 0 1 0.4 0.4 {} -N 160 -1180 190 -1180 {lab=VSS} -N 160 -1150 160 -1130 {lab=VSS} -N 160 -1230 160 -1210 {lab=VSSI} +N 310 -850 340 -850 {lab=VSS} +N 310 -820 310 -800 {lab=VSS} +N 310 -900 310 -880 {lab=VSSI} N 1120 -1100 1150 -1100 {lab=VSS} N 1120 -1330 1150 -1330 {lab=VCC} N 1090 -1400 1120 -1400 {lab=VCC} @@ -143,28 +163,28 @@ N 2180 -810 2210 -810 {lab=VCC} N 2150 -880 2180 -880 {lab=VCC} N 2180 -880 2180 -840 {lab=VCC} N 2180 -780 2180 -710 {lab=SAOUT} -N 590 -770 620 -770 {lab=VCC} -N 420 -830 420 -800 {lab=SP} -N 520 -830 620 -830 {lab=SP} -N 620 -830 620 -800 {lab=SP} -N 420 -830 520 -830 {lab=SP} -N 420 -770 450 -770 {lab=VCC} -N 390 -640 420 -640 {lab=VSS} -N 620 -640 650 -640 {lab=VSS} -N 460 -640 580 -640 {lab=GP} -N 460 -670 460 -640 {lab=GP} -N 420 -670 460 -670 {lab=GP} -N 420 -740 420 -670 {lab=GP} -N 620 -740 620 -670 {lab=OUTDIFF} -N 620 -610 620 -590 {lab=VSSI} -N 420 -590 620 -590 {lab=VSSI} -N 420 -610 420 -590 {lab=VSSI} -N 490 -550 520 -550 {lab=VSSI} -N 520 -590 520 -550 {lab=VSSI} -N 530 -900 560 -900 {lab=VCC} -N 530 -870 530 -830 {lab=SP} -N 530 -950 530 -930 {lab=VCC} -N 620 -700 680 -700 {lab=OUTDIFF} +N 570 -620 600 -620 {lab=VCC} +N 400 -680 400 -650 {lab=SP} +N 500 -680 600 -680 {lab=SP} +N 600 -680 600 -650 {lab=SP} +N 400 -680 500 -680 {lab=SP} +N 400 -620 430 -620 {lab=VCC} +N 370 -490 400 -490 {lab=VSS} +N 600 -490 630 -490 {lab=VSS} +N 440 -490 560 -490 {lab=GP} +N 440 -520 440 -490 {lab=GP} +N 400 -520 440 -520 {lab=GP} +N 400 -590 400 -520 {lab=GP} +N 600 -590 600 -520 {lab=OUTDIFF} +N 600 -460 600 -440 {lab=VSSI} +N 400 -440 600 -440 {lab=VSSI} +N 400 -460 400 -440 {lab=VSSI} +N 470 -400 500 -400 {lab=VSSI} +N 500 -440 500 -400 {lab=VSSI} +N 510 -750 540 -750 {lab=VCC} +N 510 -720 510 -680 {lab=SP} +N 510 -800 510 -780 {lab=VCC} +N 600 -550 660 -550 {lab=OUTDIFF} C {title.sym} 160 -30 0 0 {name=l1 author="Stefan Schippers"} C {code.sym} 970 -220 0 0 {name=STIMULI only_toplevel=true @@ -186,31 +206,31 @@ value="* .option SCALE=1e-6 .include models_autozero_comp.txt .tran 0.1n 900n uic "} -C {ipin.sym} 110 -850 0 0 { name=p92 lab=CAL } -C {ipin.sym} 110 -910 0 0 { name=p93 lab=PLUS } -C {ipin.sym} 110 -950 0 0 { name=p94 lab=MINUS } -C {ipin.sym} 110 -990 0 0 { name=p95 lab=EN } -C {ipin.sym} 110 -780 0 0 { name=p96 lab=VSS } -C {ipin.sym} 110 -810 0 0 { name=p97 lab=VCC } -C {opin.sym} 130 -900 0 0 { name=p116 lab=SAOUT } -C {lab_pin.sym} 200 -570 0 1 {name=p126 lab=CALB} -C {lab_pin.sym} 120 -570 0 0 {name=l50 lab=CAL} -C {inv-2.sym} 160 -570 0 0 {name=x14 m=1 +C {ipin.sym} 90 -700 0 0 { name=p92 lab=CAL } +C {ipin.sym} 90 -760 0 0 { name=p93 lab=PLUS } +C {ipin.sym} 90 -800 0 0 { name=p94 lab=MINUS } +C {ipin.sym} 90 -840 0 0 { name=p95 lab=EN } +C {ipin.sym} 90 -630 0 0 { name=p96 lab=VSS } +C {ipin.sym} 90 -660 0 0 { name=p97 lab=VCC } +C {opin.sym} 110 -750 0 0 { name=p116 lab=SAOUT } +C {lab_pin.sym} 180 -420 0 1 {name=p126 lab=CALB} +C {lab_pin.sym} 100 -420 0 0 {name=l50 lab=CAL} +C {inv-2.sym} 140 -420 0 0 {name=x14 m=1 + wn=0.6u ln=0.2u + wp=1u lp=0.2u + VCCPIN=VCC VCCBPIN=VCC VSSPIN=VSS VSSBPIN=VSS} -C {inv-2.sym} 160 -700 0 0 {name=x5 m=1 +C {inv-2.sym} 140 -550 0 0 {name=x5 m=1 + wn=0.6u ln=0.2u + wp=1u lp=0.2u + VCCPIN=VCC VCCBPIN=VCC VSSPIN=VSS VSSBPIN=VSS} -C {lab_pin.sym} 120 -700 0 0 {name=p15 lab=CALB} -C {lab_pin.sym} 200 -700 0 1 {name=l4 lab=CALBB} -C {lab_pin.sym} 190 -1180 0 1 {name=p283 lab=VSS} -C {lab_pin.sym} 120 -1180 0 0 {name=l56 lab=EN} -C {lab_pin.sym} 160 -1130 0 0 {name=p284 lab=VSS} -C {lab_pin.sym} 160 -1230 0 0 {name=p199 lab=VSSI} -C {nmos4-v.sym} 140 -1180 0 0 {name=M67 verilog_gate=nmos del=50,50,50 model=nmos w=5u l=0.13u extra="delvto='agauss(0,ABSVAR,3)'"} -C {parax_cap.sym} 160 -1120 0 0 {name=c38 value=2p} +C {lab_pin.sym} 100 -550 0 0 {name=p15 lab=CALB} +C {lab_pin.sym} 180 -550 0 1 {name=l4 lab=CALBB} +C {lab_pin.sym} 340 -850 0 1 {name=p283 lab=VSS} +C {lab_pin.sym} 270 -850 0 0 {name=l56 lab=EN} +C {lab_pin.sym} 310 -800 0 0 {name=p284 lab=VSS} +C {lab_pin.sym} 310 -900 0 0 {name=p199 lab=VSSI} +C {nmos4-v.sym} 290 -850 0 0 {name=M67 verilog_gate=nmos del=50,50,50 model=nmos w=5u l=0.13u extra="delvto='agauss(0,ABSVAR,3)'"} +C {parax_cap.sym} 310 -790 0 0 {name=c38 value=2p} C {passgate.sym} 860 -1260 0 1 {name=x1 m=1 + wn=0.4u ln=0.13u + wp=0.4u lp=0.13u @@ -297,25 +317,32 @@ C {pmos4-v.sym} 2160 -810 0 0 {name=M6 verilog_gate=pmos del=50,50,50 model=pmos C {lab_pin.sym} 2210 -810 0 1 {name=p18 lab=VCC} C {lab_pin.sym} 2150 -880 0 0 {name=p19 lab=VCC} C {lab_pin.sym} 2140 -810 0 0 {name=l2 lab=EN} -C {pmos4-v.sym} 640 -770 0 1 {name=M18 verilog_gate=pmos del=50,50,50 model=pmos w=4u l=0.4u extra="delvto='agauss(0,ABSVAR,3)'"} -C {lab_pin.sym} 590 -770 0 0 {name=p20 lab=VCC} -C {pmos4-v.sym} 400 -770 0 0 {name=M25 verilog_gate=pmos del=50,50,50 model=pmos w=4u l=0.4u extra="delvto='agauss(0,ABSVAR,3)'"} -C {lab_pin.sym} 450 -770 0 1 {name=p21 lab=VCC} -C {lab_pin.sym} 390 -640 0 0 {name=p22 lab=VSS} -C {lab_pin.sym} 650 -640 0 1 {name=p23 lab=VSS} -C {lab_pin.sym} 490 -550 0 0 {name=p24 lab=VSSI} -C {pmos4-v.sym} 510 -900 0 0 {name=M28 verilog_gate=pmos del=50,50,50 model=pmos w=2u l=0.5u extra="delvto='agauss(0,ABSVAR,3)'"} -C {lab_pin.sym} 560 -900 0 1 {name=p25 lab=VCC} -C {lab_pin.sym} 530 -950 0 0 {name=p26 lab=VCC} -C {lab_pin.sym} 490 -900 0 0 {name=l7 lab=GP} -C {lab_pin.sym} 460 -670 0 1 {name=l9 lab=GP} -C {lab_pin.sym} 380 -770 0 0 {name=l10 lab=MINUS} -C {lab_pin.sym} 660 -770 0 1 {name=l11 lab=PLUS} -C {lab_pin.sym} 680 -700 0 1 {name=l12 lab=OUTDIFF} -C {nmos4-v.sym} 600 -640 0 0 {name=M26 verilog_gate=nmos del=50,50,50 model=nmos w=1u l=0.5u extra="delvto='agauss(0,ABSVAR,3)'"} -C {nmos4-v.sym} 440 -640 0 1 {name=M1 verilog_gate=nmos del=50,50,50 model=nmos w=1u l=0.5u extra="delvto='agauss(0,ABSVAR,3)'"} -C {parax_cap.sym} 500 -630 0 0 {name=c2 value=4f} -C {lab_pin.sym} 530 -850 0 0 {name=l13 lab=SP} +C {pmos4-v.sym} 620 -620 0 1 {name=M18 verilog_gate=pmos del=50,50,50 model=pmos w=4u l=0.4u extra="delvto='agauss(0,ABSVAR,3)'"} +C {lab_pin.sym} 570 -620 0 0 {name=p20 lab=VCC} +C {pmos4-v.sym} 380 -620 0 0 {name=M25 verilog_gate=pmos del=50,50,50 model=pmos w=4u l=0.4u extra="delvto='agauss(0,ABSVAR,3)'"} +C {lab_pin.sym} 430 -620 0 1 {name=p21 lab=VCC} +C {lab_pin.sym} 370 -490 0 0 {name=p22 lab=VSS} +C {lab_pin.sym} 630 -490 0 1 {name=p23 lab=VSS} +C {lab_pin.sym} 470 -400 0 0 {name=p24 lab=VSSI} +C {pmos4-v.sym} 490 -750 0 0 {name=M28 verilog_gate=pmos del=50,50,50 model=pmos w=2u l=0.5u extra="delvto='agauss(0,ABSVAR,3)'"} +C {lab_pin.sym} 540 -750 0 1 {name=p25 lab=VCC} +C {lab_pin.sym} 510 -800 0 0 {name=p26 lab=VCC} +C {lab_pin.sym} 470 -750 0 0 {name=l7 lab=GP} +C {lab_pin.sym} 440 -520 0 1 {name=l9 lab=GP} +C {lab_pin.sym} 360 -620 0 0 {name=l10 lab=MINUS} +C {lab_pin.sym} 640 -620 0 1 {name=l11 lab=PLUS} +C {lab_pin.sym} 660 -550 0 1 {name=l12 lab=OUTDIFF} +C {nmos4-v.sym} 580 -490 0 0 {name=M26 verilog_gate=nmos del=50,50,50 model=nmos w=1u l=0.5u extra="delvto='agauss(0,ABSVAR,3)'"} +C {nmos4-v.sym} 420 -490 0 1 {name=M1 verilog_gate=nmos del=50,50,50 model=nmos w=1u l=0.5u extra="delvto='agauss(0,ABSVAR,3)'"} +C {parax_cap.sym} 480 -480 0 0 {name=c2 value=4f} +C {lab_pin.sym} 510 -700 0 0 {name=l13 lab=SP} 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} 185 -975 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 +" +}