diff --git a/src/draw.c b/src/draw.c index 8a9f817c..11af3682 100644 --- a/src/draw.c +++ b/src/draw.c @@ -1283,7 +1283,8 @@ void arc_bbox(double x, double y, double r, double a, double b, /* Convex Nonconvex Complex */ #define Polygontype Nonconvex -/* 20180914 added fill param */ +/* Unused 'what' parameter used in spice data draw_graph() + * to avoid unnecessary clipping (what = 0) */ void drawpolygon(int c, int what, double *x, double *y, int points, int poly_fill, int dash) { double x1,y1,x2,y2; @@ -1303,10 +1304,16 @@ void drawpolygon(int c, int what, double *x, double *y, int points, int poly_fil if( !xctx->only_probes && (x2-x1)<3.0 && (y2-y1)<3.0) return; p = my_malloc(38, sizeof(XPoint) * points); - for(i=0;irect[c][i].x1; @@ -1671,7 +1679,8 @@ void draw_graph(int c, int i) x1 = rx1 + marginx; x2 = rx2 - marginx/1.3; y1 = ry1 + marginy; - y2 = ry2 - marginy; + tmp = marginy < 28 ? 28 : marginy; + y2 = ry2 - tmp; /* some more space to accomodate x-axis label */ w = (x2 - x1); h = (y2 - y1); @@ -1688,6 +1697,11 @@ void draw_graph(int c, int i) if(val[0]) wx2 = atof(val); val = get_tok_value(xctx->rect[c][i].prop_ptr,"y2",0); if(val[0]) wy2 = atof(val); + val = get_tok_value(xctx->rect[c][i].prop_ptr,"sweep",0); + if(val[0]) { + entry = int_hash_lookup(xctx->raw_table, val, 0, XLOOKUP); + if(entry && entry->value) sweep_idx = entry->value; + } /* cache coefficients for faster graph coord transformations */ cx = (x2 - x1) / (wx2 - wx1); @@ -1749,13 +1763,16 @@ void draw_graph(int c, int i) my_strdup2(1390, &color, get_tok_value(xctx->rect[c][i].prop_ptr,"color",0)); nptr = node; cptr = color; + /* draw sweep variable on x-axis */ + draw_string(3, NOW, xctx->names[sweep_idx], 2, 1, 0, 0, rx1+2, ry2-1, txtsizelab, txtsizelab); /* process each node given in "node" attribute, get also associated color if any*/ while( (ntok = my_strtok_r(nptr, " ", &saven)) ) { ctok = my_strtok_r(cptr, " ", &savec); nptr = cptr = NULL; dbg(1, "ntok=%s ctok=%s\n", ntok, ctok? ctok: "NULL"); if(ctok && ctok[0]) wave_color = atoi(ctok); - draw_string(wave_color, NOW, ntok, 0, 0, 0, 0, rx1 + rw/6 * wcnt, ry1, txtsizelab, txtsizex); + /* draw node labels in graph */ + draw_string(wave_color, NOW, ntok, 0, 0, 0, 0, rx1 + rw/6 * wcnt, ry1, txtsizelab, txtsizelab); /* clipping everything outside graph area */ bbox(START, 0.0, 0.0, 0.0, 0.0); bbox(ADD,x1, y1, x2, y2); @@ -1773,11 +1790,11 @@ void draw_graph(int c, int i) double end = (wx1 <= wx2) ? wx2 : wx1; /* skip if nothing in viewport */ - if(xctx->values[0][xctx->npoints -1] > start) { + 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[0][p]; + xx = xctx->values[sweep_idx][p]; if(xx > end) { break; } @@ -1798,7 +1815,7 @@ void draw_graph(int c, int i) poly_npoints++; } /* plot data */ - drawpolygon(wave_color, NOW, xarr, yarr, poly_npoints, 0, 0); + drawpolygon(wave_color, 0, xarr, yarr, poly_npoints, 0, 0); } } } diff --git a/xschem_library/ngspice/autozero_comp.sch b/xschem_library/ngspice/autozero_comp.sch index 8409cbd1..2077e055 100644 --- a/xschem_library/ngspice/autozero_comp.sch +++ b/xschem_library/ngspice/autozero_comp.sch @@ -18,6 +18,24 @@ 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 -900 {flags=1 +y1 = 0 +y2 = 1 +divy = 5 +x1=1e-7 +x2=5e-7 +divx=8 +node="v(cal) v(saout)" +color="4 5"} +B 2 260 -1270 720 -1090 {flags=1 +y1 = 0.64 +y2 = 0.66 +divy = 5 +x1=1e-7 +x2=5e-7 +divx=8 +node="v(minus) v(plus)" +color="4 5"} T {CAL} 140 -180 0 1 0.4 0.4 {} T {EN} 140 -130 0 1 0.4 0.4 {} T {CALIBRATION @@ -32,8 +50,10 @@ Output on SAOUT Gaussian Threshold variation (via delvto parameter) is added to all MOS transistors.} 1110 -240 0 0 0.6 0.6 {} T {.param ABSVAR=0.05 delvto='agauss(0,ABSVAR,3)'} 1390 -120 0 0 0.6 0.6 {layer=8} +T {Select one or more graphs (and no other objects) +and use arrow keys to zoom / pan waveforms} 300 -1310 0 0 0.3 0.3 {} N 120 -470 120 -450 {lab=TEMPERAT} -N 160 -1180 190 -1180 {lab=VSS} +N 160 -1180 190 -1180 {lab=#net1} N 160 -1150 160 -1130 {lab=VSS} N 160 -1230 160 -1210 {lab=VSSI} N 1120 -1100 1150 -1100 {lab=VSS} @@ -149,28 +169,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 590 -680 620 -680 {lab=VCC} +N 420 -740 420 -710 {lab=SP} +N 520 -740 620 -740 {lab=SP} +N 620 -740 620 -710 {lab=SP} +N 420 -740 520 -740 {lab=SP} +N 420 -680 450 -680 {lab=VCC} +N 390 -550 420 -550 {lab=VSS} +N 620 -550 650 -550 {lab=VSS} +N 460 -550 580 -550 {lab=GP} +N 460 -580 460 -550 {lab=GP} +N 420 -580 460 -580 {lab=GP} +N 420 -650 420 -580 {lab=GP} +N 620 -650 620 -580 {lab=OUTDIFF} +N 620 -520 620 -500 {lab=VSSI} +N 420 -500 620 -500 {lab=VSSI} +N 420 -520 420 -500 {lab=VSSI} +N 490 -460 520 -460 {lab=VSSI} +N 520 -500 520 -460 {lab=VSSI} +N 530 -810 560 -810 {lab=VCC} +N 530 -780 530 -740 {lab=SP} +N 530 -860 530 -840 {lab=VCC} +N 620 -610 680 -610 {lab=OUTDIFF} C {title.sym} 160 -30 0 0 {name=l1 author="Stefan Schippers"} C {ipin.sym} 110 -850 0 0 { name=p92 lab=CAL } C {ipin.sym} 110 -910 0 0 { name=p93 lab=PLUS } @@ -324,28 +344,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} 640 -680 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 -680 0 0 {name=p20 lab=VCC} +C {pmos4-v.sym} 400 -680 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 -680 0 1 {name=p21 lab=VCC} +C {lab_pin.sym} 390 -550 0 0 {name=p22 lab=VSS} +C {lab_pin.sym} 650 -550 0 1 {name=p23 lab=VSS} +C {lab_pin.sym} 490 -460 0 0 {name=p24 lab=VSSI} +C {pmos4-v.sym} 510 -810 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 -810 0 1 {name=p25 lab=VCC} +C {lab_pin.sym} 530 -860 0 0 {name=p26 lab=VCC} +C {lab_pin.sym} 490 -810 0 0 {name=l7 lab=GP} +C {lab_pin.sym} 460 -580 0 1 {name=l9 lab=GP} +C {lab_pin.sym} 380 -680 0 0 {name=l10 lab=MINUS} +C {lab_pin.sym} 660 -680 0 1 {name=l11 lab=PLUS} +C {lab_pin.sym} 680 -610 0 1 {name=l12 lab=OUTDIFF} +C {nmos4-v.sym} 600 -550 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 -550 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 -540 0 0 {name=c2 value=4f} +C {lab_pin.sym} 530 -760 0 0 {name=l13 lab=SP} C {launcher.sym} 930 -260 0 0 {name=h2 descr="Simulate" 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 +descr="Select arrow and +Ctrl-Right-Click to load waveforms" +tclcommand="xschem raw_read $netlist_dir/[file rootname [xschem get current_name]].raw"}