From 18afca425e60aa067b1ae00b340053ac8f7ec311 Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Tue, 21 Apr 2026 19:21:32 +0200 Subject: [PATCH] expr(): introduced conditional ( ... ? ... :... ) operator, translate(): introduced @lvs_ignore token, fix wrong resetwin() restore after rasterizing graphs for svg print --- src/draw.c | 2 +- src/eval_expr.y | 3 +++ src/psprint.c | 2 +- src/scheduler.c | 16 ++++++++++------ src/token.c | 6 ++++++ xschem_library/examples/cmos_example.sch | 5 +++-- 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/draw.c b/src/draw.c index a76d9581..6b80d779 100644 --- a/src/draw.c +++ b/src/draw.c @@ -5273,7 +5273,7 @@ void svg_embedded_graph(FILE *fd, int i, double rx1, double ry1, double rx2, dou xctx->do_copy_area=save; tclsetboolvar("draw_grid", save_draw_grid); save_restore_zoom(0, &zi); - resetwin(1, 1, 1, 0, 0); + resetwin(1, 1, 1, xctx->xrect[0].width, xctx->xrect[0].height); h = fabs(y2 - y1); w = fabs(x2 - x1); diff --git a/src/eval_expr.y b/src/eval_expr.y index 0686cb78..eb9b5e81 100644 --- a/src/eval_expr.y +++ b/src/eval_expr.y @@ -84,6 +84,8 @@ symrec *tptr; /* For returning symbol-table pointers */ %token NUM /* Simple double precision number */ %token FNCT /* Variable and Function */ %type exp +%right ':' +%right '?' %right '=' %left '-' '+' %left '*' '/' '%' @@ -113,6 +115,7 @@ exp: NUM {$$ = $1;} | exp '/' exp {$$ = $1 / $3;} | '-' exp %prec NEG {$$ = -$2;} | exp '^' exp {$$ = pow ($1, $3);} + | exp '?' exp ':' exp {$$ = $1 ? $3 : $5;} | '(' exp ')' {$$ = $2;} ; /* End of grammar */ diff --git a/src/psprint.c b/src/psprint.c index 24c67d84..a1a5bc14 100644 --- a/src/psprint.c +++ b/src/psprint.c @@ -1651,7 +1651,7 @@ void create_ps(char **psfile, int what, int fullzoom, int eps) /* restore original size and zoom factor */ if(fullzoom == 1) { save_restore_zoom(0, &zi); - resetwin(1, 1, 1, 0, 0); + resetwin(1, 1, 1, xctx->xrect[0].width, xctx->xrect[0].height); change_linewidth(xctx->lw); zoom_full(1, 0, 0 + 2 * tclgetboolvar("zoom_full_center"), 0.97); } diff --git a/src/scheduler.c b/src/scheduler.c index 0ca0f354..d07f6e83 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -4009,7 +4009,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg resetwin(1, 1, 1, w, h); ps_draw(7, fullzoom, eps); save_restore_zoom(0, &zi); - resetwin(1, 1, 1, 0, 0); + resetwin(1, 1, 1, xctx->xrect[0].width, xctx->xrect[0].height); change_linewidth(save_lw); } else if(argc == 10 || xctx->lastsel) { if(xctx->lastsel) { @@ -4039,7 +4039,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg resetwin(1, 1, 1, w, h); ps_draw(7, fullzoom, eps); save_restore_zoom(0, &zi); - resetwin(1, 1, 1, 0, 0); + resetwin(1, 1, 1, xctx->xrect[0].width, xctx->xrect[0].height); change_linewidth(save_lw); } else { fullzoom = 0; @@ -4077,7 +4077,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg resetwin(1, 1, 1, w, h); print_image(); save_restore_zoom(0, &zi); - resetwin(1, 1, 1, 0, 0); + resetwin(1, 1, 1, xctx->xrect[0].width, xctx->xrect[0].height); change_linewidth(save_lw); } else if(argc == 10 || xctx->lastsel) { if(xctx->lastsel) { @@ -4107,7 +4107,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg resetwin(1, 1, 1, w, h); print_image(); save_restore_zoom(0, &zi); - resetwin(1, 1, 1, 0, 0); + resetwin(1, 1, 1, xctx->xrect[0].width, xctx->xrect[0].height); change_linewidth(save_lw); } else { print_image(); @@ -4137,8 +4137,11 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg unselect_all(0); } else zoom_full(0, 0, 2 * tclgetboolvar("zoom_full_center"), 0.97); + resetwin(1, 1, 1, w, h); svg_draw(); save_restore_zoom(0, &zi); + resetwin(1, 1, 1, xctx->xrect[0].width, xctx->xrect[0].height); + change_linewidth(save_lw); } else if(argc == 10 || xctx->lastsel) { if(xctx->lastsel) { xRect boundbox; @@ -4164,13 +4167,14 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg save_restore_zoom(1, &zi); set_viewport_size(w, h, xctx->lw); zoom_box(x1, y1, x2, y2, 1.0); + resetwin(1, 1, 1, w, h); svg_draw(); save_restore_zoom(0, &zi); + resetwin(1, 1, 1, xctx->xrect[0].width, xctx->xrect[0].height); + change_linewidth(save_lw); } else { svg_draw(); } - resetwin(1, 1, 1, 0, 0); - change_linewidth(save_lw); } draw(); Tcl_ResetResult(interp); diff --git a/src/token.c b/src/token.c index 883a35c7..d8702513 100644 --- a/src/token.c +++ b/src/token.c @@ -4567,6 +4567,12 @@ const char *translate(int inst, const char* s) STR_ALLOC(&result, tmp + result_pos, &size); memcpy(result+result_pos,tmp_sym_name, tmp+1); result_pos+=tmp; + } else if(inst >= 0 && strcmp(token,"@lvs_ignore")==0) { + char *lvs = tclgetboolvar("lvs_ignore") ? "1" : "0"; + tmp = strlen(lvs); + STR_ALLOC(&result, tmp + result_pos, &size); + memcpy(result+result_pos, lvs, tmp+1); + result_pos+=tmp; } else if(inst >= 0 && strcmp(token,"@symname")==0) { tmp_sym_name = get_sym_name(inst, 0, 0, 0); tmp_sym_name=tmp_sym_name ? tmp_sym_name : ""; diff --git a/xschem_library/examples/cmos_example.sch b/xschem_library/examples/cmos_example.sch index 57dfd2f1..d90a783a 100644 --- a/xschem_library/examples/cmos_example.sch +++ b/xschem_library/examples/cmos_example.sch @@ -1,4 +1,4 @@ -v {xschem version=3.4.6 file_version=1.2 +v {xschem version=3.4.8RC file_version=1.3 * * This file is part of XSCHEM, * a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit @@ -23,6 +23,7 @@ G {} K {} V {} S {} +F {} E {} B 2 1690 -960 2250 -630 {flags=graph,unlocked @@ -183,7 +184,7 @@ autoload=1} T {CMOS DIFFERENTIAL AMPLIFIER EXAMPLE. DC simulation} 30 -680 0 0 0.4 0.4 {} T {tcleval([xschem raw info])} 20 -960 0 0 0.4 0.4 {floater=true layer=16} -T {AC Analysis} 1060 -1010 0 0 0.6 0.6 { layer=6} +T {AC Analysis} 1060 -1000 0 0 0.6 0.6 { layer=6} T {Transient Analysis} 1060 -510 0 0 0.6 0.6 { layer=6} T {DC Analysis} 1690 -1000 0 0 0.6 0.6 { layer=6} T {Loaded Raw files:} 20 -1010 0 0 0.6 0.6 {}