From 59198f2dda5e180ebf55ff22de6f1fbc1f59cf38 Mon Sep 17 00:00:00 2001 From: Stefan Frederik Date: Wed, 10 Nov 2021 13:43:08 +0100 Subject: [PATCH] removed a whole bunch of global UI-related variables and tcl/C redundancies --- src/actions.c | 87 +++++------ src/callback.c | 91 ++++++----- src/draw.c | 42 ++--- src/editprop.c | 24 +-- src/findnet.c | 27 +++- src/globals.c | 40 +---- src/hilight.c | 32 ++-- src/move.c | 43 ++--- src/netlist.c | 12 +- src/node_hash.c | 14 +- src/paste.c | 2 +- src/psprint.c | 15 +- src/save.c | 6 +- src/scheduler.c | 354 +++++++++++++----------------------------- src/select.c | 41 ++--- src/spice_netlist.c | 44 +++--- src/svgdraw.c | 29 ++-- src/tedax_netlist.c | 2 +- src/token.c | 16 +- src/verilog_netlist.c | 18 ++- src/vhdl_netlist.c | 18 ++- src/xinit.c | 56 +++---- src/xschem.h | 54 ++----- src/xschem.tcl | 92 +++-------- 24 files changed, 489 insertions(+), 670 deletions(-) diff --git a/src/actions.c b/src/actions.c index a4ddc026..ac72c61a 100644 --- a/src/actions.c +++ b/src/actions.c @@ -108,41 +108,41 @@ void print_version() void set_snap(double newsnap) /* 20161212 set new snap factor and just notify new value */ { - char str[256]; static double default_snap = -1.0; + int cs; + cs = tclgetdoublevar("cadsnap"); if(default_snap == -1.0) { - default_snap = atof(tclgetvar("cadsnap")); + default_snap = cs; if(default_snap==0.0) default_snap = CADSNAP; } - cadsnap = newsnap ? newsnap : default_snap; - sprintf(str, "%.16g", cadsnap); - if(cadsnap == default_snap) { + cs = newsnap ? newsnap : default_snap; + if(cs == default_snap) { tcleval(".statusbar.3 configure -background PaleGreen"); } else { tcleval(".statusbar.3 configure -background OrangeRed"); } - tclsetvar("cadsnap", str); + tclsetdoublevar("cadsnap", cs); } void set_grid(double newgrid) { - char str[256]; static double default_grid = -1.0; + double cg; + cg = tclgetdoublevar("cadgrid"); if(default_grid == -1.0) { - default_grid = atof(tclgetvar("cadgrid")); + default_grid = cg; if(default_grid==0.0) default_grid = CADGRID; } - cadgrid = newgrid ? newgrid : default_grid; - sprintf(str, "%.16g", cadgrid); - dbg(1, "set_grid(): default_grid = %.16g, cadgrid=%.16g\n", default_grid, cadgrid); - if(cadgrid == default_grid) { + cg = newgrid ? newgrid : default_grid; + dbg(1, "set_grid(): default_grid = %.16g, cadgrid=%.16g\n", default_grid, cg); + if(cg == default_grid) { tcleval(".statusbar.5 configure -background PaleGreen"); } else { tcleval(".statusbar.5 configure -background OrangeRed"); } - tclsetvar("cadgrid", str); + tclsetdoublevar("cadgrid", cg); } int set_netlist_dir(int force, char *dir) @@ -199,19 +199,14 @@ const char *add_ext(const char *f, const char *ext) void toggle_only_probes() { static double save_lw; - if(!only_probes) { + + only_probes = tclgetboolvar("only_probes"); + if(only_probes) { save_lw = xctx->lw; xctx->lw=3.0; } else { xctx->lw= save_lw; } - only_probes =!only_probes; - if(only_probes) { - tclsetvar("only_probes","1"); - } - else { - tclsetvar("only_probes","0"); - } change_linewidth(xctx->lw); draw(); } @@ -226,7 +221,7 @@ void toggle_fullscreen(const char *topwin) Window rootwindow, parent_id; Window *framewin_child_ptr; unsigned int framewindow_nchildren; - + int fs; if(!strcmp(topwin, ".drw")) { @@ -243,27 +238,27 @@ void toggle_fullscreen(const char *topwin) XQueryTree(display, topwin_id, &rootwindow, &parent_id, &framewin_child_ptr, &framewindow_nchildren); - - fullscreen = (fullscreen+1)%2; - if(fullscreen==1) tclsetvar("fullscreen","1"); - else if(fullscreen==2) tclsetvar("fullscreen","2"); + fs = tclgetintvar("fullscreen"); + fs = (fs+1)%2; + if(fs==1) tclsetvar("fullscreen","1"); + else if(fs==2) tclsetvar("fullscreen","2"); else tclsetvar("fullscreen","0"); - dbg(1, "toggle_fullscreen(): fullscreen=%d\n", fullscreen); - if(fullscreen==2) { + dbg(1, "toggle_fullscreen(): fullscreen=%d\n", fs); + if(fs==2) { Tcl_VarEval(interp, "pack forget ", mytopwin, ".menubar ", mytopwin, ".statusbar; update", NULL); menu_removed = 1; } - if(fullscreen !=2 && menu_removed) { + if(fs !=2 && menu_removed) { Tcl_VarEval(interp, "pack ", mytopwin, ".menubar -anchor n -side top -fill x -before ", mytopwin, ".drw\n\ pack ", mytopwin, ".statusbar -after ", mytopwin, ".drw -anchor sw -fill x; update", NULL); menu_removed=0; } - if(fullscreen == 1) { + if(fs == 1) { window_state(display , parent_id,fullscr); - } else if(fullscreen == 2) { + } else if(fs == 2) { window_state(display , parent_id,normal); window_state(display , parent_id,fullscr); } else { @@ -885,7 +880,7 @@ int place_symbol(int pos, const char *symbol_name, double x, double y, short rot dbg(1, "place_symbol() :all inst_ptr members set\n"); /* 03-02-2000 */ if(first_call) hash_all_names(n); if(inst_props) { - new_prop_string(n, inst_props,!first_call, disable_unique_names); /* 20171214 first_call */ + new_prop_string(n, inst_props,!first_call, tclgetboolvar("disable_unique_names")); /* 20171214 first_call */ } else { set_inst_prop(n); /* no props, get from sym template, also calls new_prop_string() */ @@ -1361,7 +1356,7 @@ void zoom_full(int dr, int sel, int flags, double shrink) double bboxw, bboxh, schw, schh; if(flags & 1) { - if(change_lw) { + if(tclgetboolvar("change_lw")) { xctx->lw = 1.; } xctx->areax1 = -2*INT_WIDTH(xctx->lw); @@ -1381,7 +1376,7 @@ void zoom_full(int dr, int sel, int flags, double shrink) if(yzoom > xctx->zoom) xctx->zoom = yzoom; xctx->zoom /= shrink; /* we do this here since change_linewidth may not be called if flags & 1 == 0*/ - cadhalfdotsize = CADHALFDOTSIZE + 0.04 * (cadsnap-10); + cadhalfdotsize = CADHALFDOTSIZE + 0.04 * (tclgetdoublevar("cadsnap")-10); xctx->mooz = 1 / xctx->zoom; if(flags & 2) { @@ -1424,7 +1419,7 @@ void view_unzoom(double z) xctx->mooz=1/xctx->zoom; /* 20181022 make unzoom and zoom symmetric */ /* keeping the mouse pointer as the origin */ - if(unzoom_nodrift) { + if(tclgetboolvar("unzoom_nodrift")) { xctx->xorigin=-xctx->mousex_snap+(xctx->mousex_snap+xctx->xorigin)*factor; xctx->yorigin=-xctx->mousey_snap+(xctx->mousey_snap+xctx->yorigin)*factor; } else { @@ -1630,6 +1625,8 @@ void restore_selection(double x1, double y1, double x2, double y2) void new_wire(int what, double mx_snap, double my_snap) { int big = xctx->wires> 2000 || xctx->instances > 2000 ; + int s_pnetname; + s_pnetname = tclgetboolvar("show_pin_net_names"); if( (what & PLACE) ) { if( (xctx->ui_state & STARTWIRE) && (xctx->nl_x1!=xctx->nl_x2 || xctx->nl_y1!=xctx->nl_y2) ) { push_undo(); @@ -1676,12 +1673,12 @@ void new_wire(int what, double mx_snap, double my_snap) drawline(WIRELAYER,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2, 0); } xctx->prep_hi_structs = 0; - if(autotrim_wires) trim_wires(); - if(show_pin_net_names || xctx->hilight_nets) { + if(tclgetboolvar("autotrim_wires")) trim_wires(); + if(s_pnetname || xctx->hilight_nets) { prepare_netlist_structs(0); if(!big) { bbox(START , 0.0 , 0.0 , 0.0 , 0.0); - if(show_pin_net_names || xctx->hilight_nets) { + if(s_pnetname || xctx->hilight_nets) { int_hash_lookup(xctx->node_redraw_table, xctx->wire[xctx->wires-1].node, 0, XINSERT_NOREPLACE); find_inst_to_be_redrawn(); } @@ -2119,7 +2116,7 @@ int text_bbox(const char *str, double xscale, double yscale, cairo_text_extents_t ext; cairo_font_extents_t fext; double ww, hh, maxw; - + /* will not match exactly font metrics when doing ps/svg output , but better than nothing */ if(!has_x) return text_bbox_nocairo(str, xscale, yscale, rot, flip, hcenter, vcenter, x1, y1, rx1, ry1, rx2, ry2, cairo_lines, cairo_longest_line); @@ -2158,7 +2155,7 @@ int text_bbox(const char *str, double xscale, double yscale, if(maxw > ww) ww= maxw; } my_free(1159, &s); - hh = hh*fext.height*cairo_font_line_spacing; + hh = hh*fext.height * cairo_font_line_spacing; *cairo_longest_line = ww; *rx1=x1;*ry1=y1; @@ -2205,7 +2202,7 @@ int text_bbox(const char *str,double xscale, double yscale, { register int c=0, length =0; double w, h; - + w=0;h=1; *cairo_lines = 1; if(str!=NULL) while( str[c] ) @@ -2215,9 +2212,9 @@ int text_bbox(const char *str,double xscale, double yscale, if(length > w) w = length; } - w *= (FONTWIDTH+FONTWHITESPACE)*xscale*nocairo_font_xscale; + w *= (FONTWIDTH+FONTWHITESPACE)*xscale* tclgetdoublevar("nocairo_font_xscale"); *cairo_longest_line = w; - h *= (FONTHEIGHT+FONTDESCENT+FONTWHITESPACE)*yscale*nocairo_font_yscale; + h *= (FONTHEIGHT+FONTDESCENT+FONTWHITESPACE)*yscale* tclgetdoublevar("nocairo_font_yscale"); *rx1=x1;*ry1=y1; if( rot==0) *ry1-=nocairo_vert_correct; else if(rot==1) *rx1+=nocairo_vert_correct; @@ -2260,7 +2257,7 @@ int place_text(int draw_text, double mx, double my) int save_draw; xText *t = &xctx->text[xctx->texts]; #if HAS_CAIRO==1 - char *textfont; + const char *textfont; #endif tclsetvar("props",""); @@ -2318,7 +2315,7 @@ int place_text(int draw_text, double mx, double my) if((textfont && textfont[0]) || t->flags) { cairo_font_slant_t slant; cairo_font_weight_t weight; - textfont = (t->font && t->font[0]) ? t->font : cairo_font_name; + textfont = (t->font && t->font[0]) ? t->font : tclgetvar("cairo_font_name"); weight = ( t->flags & TEXT_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL; slant = CAIRO_FONT_SLANT_NORMAL; if(t->flags & TEXT_ITALIC) slant = CAIRO_FONT_SLANT_ITALIC; diff --git a/src/callback.c b/src/callback.c index 7e931429..8926c750 100644 --- a/src/callback.c +++ b/src/callback.c @@ -144,17 +144,18 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, char str[PATH_MAX + 100]; /* overflow safe 20161122 */ struct stat buf; unsigned short sel; + int c_snap; #ifndef __unix__ - short cstate = GetKeyState(VK_CAPITAL); - short nstate = GetKeyState(VK_NUMLOCK); + short cstate = GetKeyState(VK_CAPITAL); + short nstate = GetKeyState(VK_NUMLOCK); - if(cstate & 0x0001) { /* caps lock */ - tcleval(".statusbar.8 configure -state active -text {CAPS LOCK SET! }"); - } else if (nstate & 0x0001) { /* num lock */ - tcleval(".statusbar.8 configure -state active -text {NUM LOCK SET! }"); - } else { /* normal state */ - tcleval(".statusbar.8 configure -state normal -text {}"); - } + if(cstate & 0x0001) { /* caps lock */ + tcleval(".statusbar.8 configure -state active -text {CAPS LOCK SET! }"); + } else if (nstate & 0x0001) { /* num lock */ + tcleval(".statusbar.8 configure -state active -text {NUM LOCK SET! }"); + } else { /* normal state */ + tcleval(".statusbar.8 configure -state normal -text {}"); + } #else XKeyboardState kbdstate; XGetKeyboardControl(display, &kbdstate); @@ -167,6 +168,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, tcleval(".statusbar.8 configure -state normal -text {}"); } #endif + c_snap = tclgetdoublevar("cadsnap"); state &=~Mod2Mask; /* 20170511 filter out NumLock status */ if(xctx->semaphore) { @@ -184,8 +186,8 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, xctx->semaphore++; /* used to debug Tcl-Tk frontend */ xctx->mousex=X_TO_XSCHEM(mx); xctx->mousey=Y_TO_XSCHEM(my); - xctx->mousex_snap=ROUND(xctx->mousex / cadsnap) * cadsnap; - xctx->mousey_snap=ROUND(xctx->mousey / cadsnap) * cadsnap; + xctx->mousex_snap=ROUND(xctx->mousex / c_snap) * c_snap; + xctx->mousey_snap=ROUND(xctx->mousey / c_snap) * c_snap; my_snprintf(str, S(str), "mouse = %.16g %.16g - selected: %d path: %s", xctx->mousex_snap, xctx->mousey_snap, xctx->lastsel, xctx->sch_path[xctx->currsch] ); statusmsg(str,1); @@ -354,8 +356,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, } if(key == '_' ) /* toggle change line width */ { - change_lw =!change_lw; - if(change_lw) { + if(!tclgetboolvar("change_lw")) { tcleval("alert_ { enabling change line width} {}"); tclsetvar("change_lw","1"); } @@ -382,8 +383,10 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, } if(key == '%' ) /* toggle draw grid */ { - draw_grid =!draw_grid; - if(draw_grid) { + int dr_gr; + dr_gr = tclgetboolvar("draw_grid"); + dr_gr =!dr_gr; + if(dr_gr) { /* tcleval("alert_ { enabling draw grid} {}"); */ tclsetvar("draw_grid","1"); draw(); @@ -559,8 +562,8 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, if(xctx->semaphore >= 2) break; if(!(xctx->ui_state & STARTWIRE)){ find_closest_net_or_symbol_pin(xctx->mousex, xctx->mousey, &x, &y); - xctx->mx_double_save = ROUND(x / cadsnap) * cadsnap; - xctx->my_double_save = ROUND(y / cadsnap) * cadsnap; + xctx->mx_double_save = ROUND(x / c_snap) * c_snap; + xctx->my_double_save = ROUND(y / c_snap) * c_snap; new_wire(PLACE, x, y); } else { @@ -639,6 +642,8 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, break; } if(key=='5' && state == 0) { /* 20110112 display only probes */ + only_probes = !only_probes; + tclsetboolvar("only_probes", only_probes); toggle_only_probes(); break; } /* /20110112 */ @@ -796,9 +801,11 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, } if(key=='y' && state == 0) /* toggle stretching */ { - enable_stretch=!enable_stretch; + int en_s; + en_s = tclgetboolvar("enable_stretch"); + en_s = !en_s; - if(enable_stretch) { + if(en_s) { tcleval("alert_ { enabling stretch mode } {}"); tclsetvar("enable_stretch","1"); } @@ -852,10 +859,12 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, } if(key=='O' && state == ShiftMask) /* toggle light/dark colorscheme 20171113 */ { - dark_colorscheme=!dark_colorscheme; - tclsetvar("dark_colorscheme", dark_colorscheme ? "1" : "0"); - color_dim=0.0; - build_colors(color_dim); + int d_c; + d_c = tclgetboolvar("dark_colorscheme"); + d_c = !d_c; + tclsetboolvar("dark_colorscheme", d_c); + tclsetdoublevar("color_dim", 0.0); + build_colors(0.0); draw(); break; } @@ -1012,20 +1021,20 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, } if(key=='g' && state==0) /* half snap factor */ { - set_snap(cadsnap / 2.0); + set_snap(c_snap / 2.0); break; } if(key=='g' && state==ControlMask) /* set snap factor 20161212 */ { my_snprintf(str, S(str), "input_line {Enter snap value (default: %.16g current: %.16g)} {xschem set cadsnap} {%g} 10", - CADSNAP, cadsnap, cadsnap); + CADSNAP, c_snap, c_snap); tcleval(str); break; } if(key=='G' && state==ShiftMask) /* double snap factor */ { - set_snap(cadsnap * 2.0); + set_snap(c_snap * 2.0); break; } if(key=='*' && state==(Mod1Mask|ShiftMask) ) /* svg print , 20121108 */ @@ -1050,9 +1059,9 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, { if(xctx->semaphore >= 2) break; push_undo(); - round_schematic_to_grid(cadsnap); + round_schematic_to_grid(c_snap); set_modify(1); - if(autotrim_wires) trim_wires(); + if(tclgetboolvar("autotrim_wires")) trim_wires(); xctx->prep_hash_inst=0; xctx->prep_hash_wires=0; xctx->prep_net_structs=0; @@ -1280,8 +1289,10 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, } if(key=='A' && state==ShiftMask) /* toggle show netlist */ { - netlist_show = !netlist_show; - if(netlist_show) { + int net_s; + net_s = tclgetboolvar("netlist_show"); + net_s = !net_s; + if(net_s) { tcleval("alert_ { enabling show netlist window} {}"); tclsetvar("netlist_show","1"); } @@ -1327,7 +1338,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, if(xctx->semaphore >= 2) break; hide_symbols++; if(hide_symbols >= 3) hide_symbols = 0; - tclsetvar("hide_symbols", hide_symbols == 2 ? "2" : hide_symbols == 1 ? "1" : "0"); + tclsetintvar("hide_symbols", hide_symbols); draw(); break; } @@ -1607,7 +1618,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, } else if(button==Button1) { - if(persistent_command && xctx->last_command) { + if(tclgetboolvar("persistent_command") && xctx->last_command) { if(xctx->last_command == STARTLINE) start_line(mx, my); if(xctx->last_command == STARTWIRE) start_wire(mx, my); break; @@ -1623,8 +1634,8 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, double x, y; find_closest_net_or_symbol_pin(xctx->mousex, xctx->mousey, &x, &y); - xctx->mx_double_save = ROUND(x / cadsnap) * cadsnap; - xctx->my_double_save = ROUND(y / cadsnap) * cadsnap; + xctx->mx_double_save = ROUND(x / c_snap) * c_snap; + xctx->my_double_save = ROUND(y / c_snap) * c_snap; new_wire(PLACE, x, y); xctx->ui_state &=~MENUSTARTSNAPWIRE; break; @@ -1678,7 +1689,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, break; } if(xctx->ui_state & STARTWIRE) { - if(persistent_command) { + if(tclgetboolvar("persistent_command")) { if(constrained_move != 2) { xctx->mx_double_save=xctx->mousex_snap; } @@ -1701,7 +1712,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, break; } if(xctx->ui_state & STARTLINE) { - if(persistent_command) { + if(tclgetboolvar("persistent_command")) { if(constrained_move != 2) { xctx->mx_double_save=xctx->mousex_snap; } @@ -1766,13 +1777,13 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, launcher(); } if( !(state & ShiftMask) ) { - if(auto_hilight && xctx->hilight_nets && sel == 0 ) { /* 20160413 20160503 */ + if(tclgetboolvar("auto_hilight") && xctx->hilight_nets && sel == 0 ) { /* 20160413 20160503 */ if(!prev_last_sel) { redraw_hilights(1); /* 1: clear all hilights, then draw */ } } } - if(auto_hilight) { + if(tclgetboolvar("auto_hilight")) { hilight_net(0); if(xctx->lastsel) { redraw_hilights(0); @@ -1796,9 +1807,9 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, if(xctx->semaphore >= 2) break; if(xctx->ui_state & STARTSELECT) { if(state & ControlMask) { - enable_stretch=1; + tclsetvar("enable_stretch", "1"); select_rect(END,-1); - enable_stretch=0; + tclsetvar("enable_stretch", "0"); break; } else { /* 20150927 filter out button4 and button5 events */ diff --git a/src/draw.c b/src/draw.c index 67701ce0..9ef1e092 100644 --- a/src/draw.c +++ b/src/draw.c @@ -74,8 +74,8 @@ void print_image() * } * XSetClipRectangles(display, xctx->gctiled, 0,0, xctx->xrect, 1, Unsorted); #endif - save_draw_grid = draw_grid; - draw_grid=0; + save_draw_grid = tclgetboolvar("draw_grid"); + tclsetvar("draw_grid", "0"); xctx->draw_pixmap=1; draw(); #ifdef __unix__ @@ -94,7 +94,7 @@ void print_image() } else tcleval( "convert_to_png {%s} plot.png", psfile); #endif my_strncpy(xctx->plotfile,"", S(xctx->plotfile)); - draw_grid=save_draw_grid; + tclsetboolvar("draw_grid", save_draw_grid); xctx->draw_pixmap=1; } @@ -114,13 +114,13 @@ void set_cairo_color(int layer) /* remember to call cairo_restore(xctx->cairo_ctx) when done !! */ int set_text_custom_font(xText *txt) /* 20171122 for correct text_bbox calculation */ { - char *textfont; + const char *textfont; textfont = txt->font; if((textfont && textfont[0]) || txt->flags) { cairo_font_slant_t slant; cairo_font_weight_t weight; - textfont = (txt->font && txt->font[0]) ? txt->font : cairo_font_name; + textfont = (txt->font && txt->font[0]) ? txt->font : tclgetvar("cairo_font_name"); weight = ( txt->flags & TEXT_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL; slant = CAIRO_FONT_SLANT_NORMAL; if(txt->flags & TEXT_ITALIC) slant = CAIRO_FONT_SLANT_ITALIC; @@ -150,6 +150,7 @@ static void cairo_draw_string_line(cairo_t *c_ctx, char *s, int line_delta; double lines; double vc; /* 20171121 vert correct */ + if(s==NULL) return; if(llength==0) return; @@ -283,8 +284,8 @@ void draw_string(int layer, int what, const char *str, short rot, short flip, in else { text_bbox(str, xscale, yscale, rot, flip, hcenter, vcenter, x1,y1, &textx1,&texty1,&textx2,&texty2, &no_of_lines, &longest_line); - xscale*=nocairo_font_xscale; - yscale*=nocairo_font_yscale; + xscale*=tclgetdoublevar("nocairo_font_xscale"); + yscale*=tclgetdoublevar("nocairo_font_yscale"); if(!textclip(xctx->areax1,xctx->areay1,xctx->areax2,xctx->areay2, textx1,texty1,textx2,texty2)) return; x1=textx1;y1=texty1; @@ -357,7 +358,7 @@ void draw_symbol(int what,int c, int n,int layer,short tmp_flip, short rot, double angle; char *type; #if HAS_CAIRO==1 - char *textfont; + const char *textfont; #endif if(xctx->inst[n].ptr == -1) return; @@ -495,7 +496,8 @@ void draw_symbol(int what,int c, int n,int layer,short tmp_flip, short rot, if((textfont && textfont[0]) || symptr->text[j].flags) { cairo_font_slant_t slant; cairo_font_weight_t weight; - textfont = (symptr->text[j].font && symptr->text[j].font[0]) ? symptr->text[j].font : cairo_font_name; + textfont = (symptr->text[j].font && symptr->text[j].font[0]) ? + symptr->text[j].font : tclgetvar("cairo_font_name"); weight = ( symptr->text[j].flags & TEXT_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL; slant = CAIRO_FONT_SLANT_NORMAL; if(symptr->text[j].flags & TEXT_ITALIC) slant = CAIRO_FONT_SLANT_ITALIC; @@ -658,8 +660,11 @@ void drawgrid() double x,y; double delta,tmp; int i=0; - if( !draw_grid || !has_x) return; - delta=cadgrid*xctx->mooz; + int big_gr; + + big_gr = tclgetboolvar("big_grid_points"); + if( !tclgetboolvar("draw_grid") || !has_x) return; + delta=tclgetdoublevar("cadgrid")*xctx->mooz; while(delta < CADGRIDTHRESHOLD) delta*=CADGRIDMULTIPLY; /* <-- to be improved,but works */ x = xctx->xorigin*xctx->mooz; y = xctx->yorigin*xctx->mooz; if(y>xctx->areay1 && y < xctx->areay2) { @@ -677,14 +682,14 @@ void drawgrid() for(y=tmp; y < xctx->areay2; y += delta) { if(i>=CADMAXGRIDPOINTS) { if(draw_window) { - if(big_grid_points) { + if(big_gr) { XDrawSegments(display,xctx->window,gc[GRIDLAYER],xctx->biggridpoint,i); } else { XDrawPoints(display,xctx->window,gc[GRIDLAYER],xctx->gridpoint,i,CoordModeOrigin); } } if(xctx->draw_pixmap) { - if(big_grid_points) { + if(big_gr) { XDrawSegments(display,xctx->save_pixmap,gc[GRIDLAYER],xctx->biggridpoint,i); } else { XDrawPoints(display,xctx->save_pixmap,gc[GRIDLAYER],xctx->gridpoint,i,CoordModeOrigin); @@ -692,7 +697,7 @@ void drawgrid() } i=0; } - if(big_grid_points) { + if(big_gr) { xctx->biggridpoint[i].x1 = xctx->biggridpoint[i].x2 = (short)(x); xctx->biggridpoint[i].y1 = xctx->biggridpoint[i].y2 = (short)(y); i++; @@ -704,14 +709,14 @@ void drawgrid() } } if(draw_window) { - if(big_grid_points) { + if(big_gr) { XDrawSegments(display,xctx->window,gc[GRIDLAYER],xctx->biggridpoint,i); } else { XDrawPoints(display,xctx->window,gc[GRIDLAYER],xctx->gridpoint,i,CoordModeOrigin); } } if(xctx->draw_pixmap) { - if(big_grid_points) { + if(big_gr) { XDrawSegments(display,xctx->save_pixmap,gc[GRIDLAYER],xctx->biggridpoint,i); } else { XDrawPoints(display,xctx->save_pixmap,gc[GRIDLAYER],xctx->gridpoint,i,CoordModeOrigin); @@ -1483,7 +1488,7 @@ void draw(void) int textlayer; #if HAS_CAIRO==1 - char *textfont; + const char *textfont; #endif if(xctx->no_draw) return; rebuild_selected_array(); @@ -1595,7 +1600,8 @@ void draw(void) if( (textfont && textfont[0]) || xctx->text[i].flags) { cairo_font_slant_t slant; cairo_font_weight_t weight; - textfont = (xctx->text[i].font && xctx->text[i].font[0]) ? xctx->text[i].font : cairo_font_name; + textfont = (xctx->text[i].font && xctx->text[i].font[0]) ? + xctx->text[i].font : tclgetvar("cairo_font_name"); weight = ( xctx->text[i].flags & TEXT_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL; slant = CAIRO_FONT_SLANT_NORMAL; if(xctx->text[i].flags & TEXT_ITALIC) slant = CAIRO_FONT_SLANT_ITALIC; diff --git a/src/editprop.c b/src/editprop.c index d8ee1555..75a8cb5d 100644 --- a/src/editprop.c +++ b/src/editprop.c @@ -387,7 +387,7 @@ void set_inst_prop(int i) my_strdup2(70, &xctx->inst[i].instname, get_tok_value(ptr, "name",0)); if(xctx->inst[i].instname[0]) { my_strdup(101, &tmp, xctx->inst[i].prop_ptr); - new_prop_string(i, tmp, 0, disable_unique_names); + new_prop_string(i, tmp, 0, tclgetboolvar("disable_unique_names")); my_free(724, &tmp); } } @@ -766,6 +766,8 @@ void edit_text_property(int x) tclgetvar("props"), tclgetvar("retval") ); if(text_changed) { + double cg; + cg = tclgetdoublevar("cadgrid"); c = xctx->rects[PINLAYER]; for(l=0;lrect[PINLAYER][l].prop_ptr, "name",0)), @@ -784,11 +786,11 @@ void edit_text_property(int x) pcy = (xctx->rect[PINLAYER][l].y1+xctx->rect[PINLAYER][l].y2)/2.0; if( /* 20171206 20171221 */ - (fabs( (yy1+yy2)/2 - pcy) < cadgrid/2 && - (fabs(xx1 - pcx) < cadgrid*3 || fabs(xx2 - pcx) < cadgrid*3) ) + (fabs( (yy1+yy2)/2 - pcy) < cg/2 && + (fabs(xx1 - pcx) < cg*3 || fabs(xx2 - pcx) < cg*3) ) || - (fabs( (xx1+xx2)/2 - pcx) < cadgrid/2 && - (fabs(yy1 - pcy) < cadgrid*3 || fabs(yy2 - pcy) < cadgrid*3) ) + (fabs( (xx1+xx2)/2 - pcx) < cg/2 && + (fabs(yy1 - pcy) < cg*3 || fabs(yy2 - pcy) < cg*3) ) ) { if(x==0) my_strdup(71, &xctx->rect[PINLAYER][l].prop_ptr, @@ -915,7 +917,9 @@ void update_symbol(const char *result, int x) char *type; int cond; int pushed=0; + int s_pnetname; + s_pnetname = tclgetboolvar("show_pin_net_names"); dbg(1, "update_symbol(): entering\n"); i=xctx->sel_array[0].n; if(!result) { @@ -965,7 +969,7 @@ void update_symbol(const char *result, int x) if(xctx->sel_array[k].type!=ELEMENT) continue; i=xctx->sel_array[k].n; - if(show_pin_net_names || xctx->hilight_nets) { + if(s_pnetname || xctx->hilight_nets) { int j; prepare_netlist_structs(0); for(j = 0; j < (xctx->inst[i].ptr + xctx->sym)->rects[PINLAYER]; j++) { @@ -1031,7 +1035,7 @@ void update_symbol(const char *result, int x) /* set name of current inst */ if(!pushed) { push_undo(); pushed=1;} if(!k) hash_all_names(i); - new_prop_string(i, ptr, k, disable_unique_names); /* set new prop_ptr */ + new_prop_string(i, ptr, k, tclgetboolvar("disable_unique_names")); /* set new prop_ptr */ } my_strdup2(90, &xctx->inst[i].instname, get_tok_value(xctx->inst[i].prop_ptr, "name",0)); @@ -1051,14 +1055,14 @@ void update_symbol(const char *result, int x) xctx->prep_hash_inst=0; xctx->prep_net_structs=0; xctx->prep_hi_structs=0; - if(show_pin_net_names || xctx->hilight_nets) prepare_netlist_structs(0); + if(s_pnetname || xctx->hilight_nets) prepare_netlist_structs(0); for(k=0;klastsel;k++) { if(xctx->sel_array[k].type!=ELEMENT) continue; i=xctx->sel_array[k].n; type=xctx->sym[xctx->inst[i].ptr].type; symbol_bbox(i, &xctx->inst[i].x1, &xctx->inst[i].y1, &xctx->inst[i].x2, &xctx->inst[i].y2); bbox(ADD, xctx->inst[i].x1, xctx->inst[i].y1, xctx->inst[i].x2, xctx->inst[i].y2); - if((show_pin_net_names || xctx->hilight_nets) && type && IS_LABEL_OR_PIN(type)) { + if((s_pnetname || xctx->hilight_nets) && type && IS_LABEL_OR_PIN(type)) { for(j = 0; j < (xctx->inst[i].ptr + xctx->sym)->rects[PINLAYER]; j++) { /* <<< only .node[0] ? */ if( xctx->inst[i].node && xctx->inst[i].node[j]) { int_hash_lookup(xctx->node_redraw_table, xctx->inst[i].node[j], 0, XINSERT_NOREPLACE); @@ -1069,7 +1073,7 @@ void update_symbol(const char *result, int x) if(xctx->hilight_nets) { propagate_hilights(1, 1, XINSERT_NOREPLACE); } - if(show_pin_net_names || xctx->hilight_nets) find_inst_to_be_redrawn(); + if(s_pnetname || xctx->hilight_nets) find_inst_to_be_redrawn(); } /* redraw symbol with new props */ bbox(SET,0.0,0.0,0.0,0.0); diff --git a/src/findnet.c b/src/findnet.c index 15af0419..f7c562c7 100644 --- a/src/findnet.c +++ b/src/findnet.c @@ -31,7 +31,10 @@ void find_closest_net(double mx,double my) { double tmp; int i,w=-1; - double threshold = CADWIREMINDIST * CADWIREMINDIST * cadgrid * cadgrid / 400; + double threshold; + double cg; + cg = tclgetdoublevar("cadgrid"); + threshold = CADWIREMINDIST * CADWIREMINDIST * cg * cg / 400; for(i=0;iwires;i++) { @@ -53,7 +56,10 @@ void find_closest_polygon(double mx,double my) double tmp; int i, c, j, l=-1, col = 0; double x1, y1, x2, y2; - double threshold = CADWIREMINDIST * CADWIREMINDIST * cadgrid * cadgrid / 400; + double threshold; + double cg; + cg = tclgetdoublevar("cadgrid"); + threshold = CADWIREMINDIST * CADWIREMINDIST * cg * cg / 400; for(c=0;carc[col][r].r,2)) */ + if( r!=-1 && distance <= threshold ) /* * pow(xctx->arc[col][r].r,2)) */ { sel.n = r; sel.type = ARC; sel.col = col; } @@ -274,10 +286,13 @@ void find_closest_text(double mx,double my) short rot,flip; double xx1,xx2,yy1,yy2; int i,r=-1, tmp; - double threshold = CADWIREMINDIST * CADWIREMINDIST * cadgrid * cadgrid / 400; + double threshold; + double cg; #if HAS_CAIRO==1 int customfont; #endif + cg = tclgetdoublevar("cadgrid"); + threshold = CADWIREMINDIST * CADWIREMINDIST * cg * cg / 400; for(i=0;itexts;i++) { rot = xctx->text[i].rot; diff --git a/src/globals.c b/src/globals.c index 61b80966..366a9ff0 100644 --- a/src/globals.c +++ b/src/globals.c @@ -114,52 +114,22 @@ xcb_visualtype_t *visual_xcb; #endif /*HAS_XCB */ /* these variables are mirrored in tcl code */ -int fullscreen=0; char *netlist_dir=NULL; /* user set netlist directory via cmd-option or menu or xschemrc */ char initial_netlist_name[PATH_MAX]={0}; -int top_subckt = 0; -int spiceprefix = 1; -int unzoom_nodrift=1; -int change_lw=0; /* allow change lw */ -int incr_hilight=1; -unsigned short enable_stretch=0; -int auto_hilight=0; int has_x=1; -int split_files=0; /* split netlist files 20081202 */ -double cadgrid = CADGRID; -double cadsnap = CADSNAP; -int draw_grid=1; -int big_grid_points=0; -int rainbow_colors=0; -int disable_unique_names=0; /* if set allow instances with duplicate names */ -int persistent_command=0; /* remember last command 20181022 */ -int autotrim_wires = 0; int color_ps=-1; -int transparent_svg=-1; -int only_probes=0; -int netlist_show=0; -int flat_netlist=0; +int flat_netlist = 0; int cadlayers=0; -int hide_symbols = 0; /* draw only a bounding box for component instances and @symname, @name texts */ -int dark_colorscheme=1; -char cairo_font_name[80]="Sans-Serif"; -char svg_font_name[80]="Sans-Serif"; +int rainbow_colors = 0; double cairo_font_scale=1.0; /* default: 1.0, allows to adjust font size */ -double nocairo_font_xscale=0.85; /* match with cairo sizing */ -double nocairo_font_yscale=0.88; /* match with cairo sizing */ -double cairo_font_line_spacing=1.0; /* allows to change line spacing: default: 1.0 */ /* lift up the text by 'n' pixels (zoom corrected) within the bbox. */ /* This correction is used to better align existing schematics */ /* compared to the nocairo xschem version. */ /* allowed values should be in the range [-4, 4] */ double cairo_vert_correct=0.0; double nocairo_vert_correct=0.0; -int sym_txt=1; +double cairo_font_line_spacing = 1.0; /* value taken from xschemrc / xschem.tcl */ int netlist_type=-1; -int show_pin_net_names = 0; -/* enable hilight instances attached to hilighted nets if they have the "highlight=true attr set */ -int en_hilight_conn_inst = 0; - int help=0; /* help option set to global scope, printing help is deferred */ /* when configuration ~/.schem has been read 20140406 */ @@ -184,6 +154,9 @@ int tcp_port = 0; int do_print=0; int no_readline=0; int draw_window=0; +int only_probes = 0; +int hide_symbols = 0; +int sym_txt = 1; int text_svg=1; /* use svg element for text instead of xschem's internal vector font */ int text_ps=1; /* use ps font for text instead of xschem's internal vector font */ double cadhalfdotsize = CADHALFDOTSIZE; @@ -196,7 +169,6 @@ int screendepth; char **color_array; int *fill_type; int fill_pattern = 1; -double color_dim = 0.0; char *xschem_executable=NULL; double *character[256]; /* array or per-char coordinates of xschem internal vector font */ Tcl_Interp *interp; diff --git a/src/hilight.c b/src/hilight.c index cd1239b7..ad8c7e29 100644 --- a/src/hilight.c +++ b/src/hilight.c @@ -410,7 +410,9 @@ void hilight_net_pin_mismatches(void) char *netname=NULL; int mult; xRect *rct; - + int incr_hi; + + incr_hi = tclgetboolvar("incr_hilight"); rebuild_selected_array(); prepare_netlist_structs(0); for(k=0; klastsel; k++) { @@ -430,7 +432,7 @@ void hilight_net_pin_mismatches(void) if(netname && strcmp(lab, netname)) { dbg(1, "hilight_net_pin_mismatches(): hilight: %s\n", netname); bus_hilight_lookup(netname, xctx->hilight_color, XINSERT_NOREPLACE); - if(incr_hilight) incr_hilight_color(); + if(incr_hi) incr_hilight_color(); } } @@ -586,7 +588,7 @@ int search(const char *tok, const char *val, int sub, int sel) dbg(1, "search():val=%s\n", val); if(!sel) { col=xctx->hilight_color; - if(incr_hilight) incr_hilight_color(); + if(tclgetboolvar("incr_hilight")) incr_hilight_color(); } has_token = 0; prepare_netlist_structs(0); @@ -766,7 +768,9 @@ void drill_hilight(int mode) char *propagate_str = NULL; int propagate, hilight_connected_inst; struct hilight_hashentry *entry, *propag_entry; + int en_hi; + en_hi = tclgetboolvar("en_hilight_conn_inst"); prepare_netlist_structs(0); while(1) { found=0; @@ -774,7 +778,7 @@ void drill_hilight(int mode) symbol = xctx->inst[i].ptr+xctx->sym; npin = symbol->rects[PINLAYER]; rct=symbol->rect[PINLAYER]; - hilight_connected_inst = en_hilight_conn_inst && + hilight_connected_inst = en_hi && ( (xctx->inst[i].flags & 4) || ((xctx->inst[i].ptr+ xctx->sym)->flags & 4) ); for(j=0; jhilight_nets=1 */ if(node_entry && !bus_hilight_lookup(name, xctx->hilight_color, XINSERT_NOREPLACE)) { - if(incr_hilight) incr_hilight_color(); + if(tclgetboolvar("incr_hilight")) incr_hilight_color(); propagate_hilights(1, 0, XINSERT_NOREPLACE); redraw_hilights(0); } @@ -1045,7 +1049,9 @@ void propagate_hilights(int set, int clear, int mode) int i, hilight_connected_inst; struct hilight_hashentry *entry; char *type; + int en_hi; + en_hi = tclgetboolvar("en_hilight_conn_inst"); prepare_netlist_structs(0); for(i = 0; i < xctx->instances; i++) { if(xctx->inst[i].ptr < 0 ) { @@ -1053,7 +1059,7 @@ void propagate_hilights(int set, int clear, int mode) continue; } type = (xctx->inst[i].ptr+ xctx->sym)->type; - hilight_connected_inst = en_hilight_conn_inst && + hilight_connected_inst = en_hi && ( (xctx->inst[i].flags & 4) || ((xctx->inst[i].ptr+ xctx->sym)->flags & 4) ); if(hilight_connected_inst && type && !IS_LABEL_SH_OR_PIN(type)) { int rects, j, nohilight_pins; @@ -1528,7 +1534,9 @@ void hilight_net(int viewer) int i, n; char *type; int sim_is_xyce; + int incr_hi; + incr_hi = tclgetboolvar("incr_hilight"); prepare_netlist_structs(0); dbg(1, "hilight_net(): entering\n"); rebuild_selected_array(); @@ -1542,7 +1550,7 @@ void hilight_net(int viewer) if(!bus_hilight_lookup(xctx->wire[n].node, xctx->hilight_color, XINSERT_NOREPLACE)) { if(viewer == GAW) send_net_to_gaw(sim_is_xyce, xctx->wire[n].node); if(viewer == BESPICE) send_net_to_bespice(sim_is_xyce, xctx->wire[n].node); - if(incr_hilight) incr_hilight_color(); + if(incr_hi) incr_hilight_color(); } break; case ELEMENT: @@ -1552,7 +1560,7 @@ void hilight_net(int viewer) if(!bus_hilight_lookup(xctx->inst[n].node[0], xctx->hilight_color, XINSERT_NOREPLACE)) { if(viewer == GAW) send_net_to_gaw(sim_is_xyce, xctx->inst[n].node[0]); if(viewer == BESPICE) send_net_to_bespice(sim_is_xyce, xctx->inst[n].node[0]); - if(incr_hilight) incr_hilight_color(); + if(incr_hi) incr_hilight_color(); } } else { dbg(1, "hilight_net(): setting hilight flag on inst %d\n",n); @@ -1562,14 +1570,14 @@ void hilight_net(int viewer) if(viewer == GAW) send_current_to_gaw(sim_is_xyce, xctx->inst[n].instname); if(viewer == BESPICE) send_current_to_bespice(sim_is_xyce, xctx->inst[n].instname); } - if(incr_hilight) incr_hilight_color(); + if(incr_hi) incr_hilight_color(); } break; default: break; } } - if(!incr_hilight) incr_hilight_color(); + if(!incr_hi) incr_hilight_color(); propagate_hilights(1, 0, XINSERT_NOREPLACE); tcleval("if { [info exists gaw_fd] } {close $gaw_fd; unset gaw_fd}\n"); } @@ -1638,8 +1646,10 @@ void select_hilight_net(void) int i; struct hilight_hashentry *entry; int hilight_connected_inst; + int en_hi; if(!xctx->hilight_nets) return; + en_hi = tclgetboolvar("en_hilight_conn_inst"); prepare_netlist_structs(0); for(i=0;iwires;i++) { if( (entry = bus_hilight_lookup(xctx->wire[i].node, 0, XLOOKUP)) ) { @@ -1649,7 +1659,7 @@ void select_hilight_net(void) for(i=0;iinstances;i++) { type = (xctx->inst[i].ptr+ xctx->sym)->type; - hilight_connected_inst = en_hilight_conn_inst && + hilight_connected_inst = en_hi && ( (xctx->inst[i].flags & 4) || ((xctx->inst[i].ptr+ xctx->sym)->flags & 4) ); if( xctx->inst[i].color != -10000) { dbg(1, "select_hilight_net(): instance %d flags &4 true\n", i); diff --git a/src/move.c b/src/move.c index 7b3da077..4d3122d8 100644 --- a/src/move.c +++ b/src/move.c @@ -528,9 +528,10 @@ void copy_objects(int what) #if HAS_CAIRO==1 int customfont; #endif - xInstance * const inst = xctx->inst; - + int s_pnetname; + + s_pnetname = tclgetboolvar("show_pin_net_names"); if(what & START) { xctx->rotatelocal=0; @@ -597,7 +598,7 @@ void copy_objects(int what) symbol_bbox(n, &inst[n].x1, &inst[n].y1, &inst[n].x2, &inst[n].y2 ); bbox(ADD, inst[n].x1, inst[n].y1, inst[n].x2, inst[n].y2 ); /* hash all nodes of copied objects before the copy, they might need update if net_name=true */ - if((show_pin_net_names || xctx->hilight_nets) && type && IS_LABEL_OR_PIN(type)) { + if((s_pnetname || xctx->hilight_nets) && type && IS_LABEL_OR_PIN(type)) { for(p = 0; p < (inst[n].ptr + xctx->sym)->rects[PINLAYER]; p++) { if( inst[n].node && inst[n].node[p]) { int_hash_lookup(xctx->node_redraw_table, xctx->inst[n].node[p], 0, XINSERT_NOREPLACE); @@ -605,12 +606,12 @@ void copy_objects(int what) } } } - if((show_pin_net_names || xctx->hilight_nets) && xctx->sel_array[i].type == WIRE) { + if((s_pnetname || xctx->hilight_nets) && xctx->sel_array[i].type == WIRE) { int_hash_lookup(xctx->node_redraw_table, xctx->wire[n].node, 0, XINSERT_NOREPLACE); } } draw_selection(xctx->gctiled,0); - if(show_pin_net_names || xctx->hilight_nets) find_inst_to_be_redrawn(); + if(s_pnetname || xctx->hilight_nets) find_inst_to_be_redrawn(); for(i=0;ilastsel;i++) { @@ -932,7 +933,8 @@ void copy_objects(int what) /* the newpropcnt argument is zero for the 1st call and used in */ /* new_prop_string() for cleaning some internal caches. */ if(!newpropcnt) hash_all_names(xctx->instances); - new_prop_string(xctx->instances, xctx->inst[n].prop_ptr,newpropcnt++, disable_unique_names); + new_prop_string(xctx->instances, xctx->inst[n].prop_ptr,newpropcnt++, + tclgetboolvar("disable_unique_names")); my_strdup2(235, &xctx->inst[xctx->instances].instname, get_tok_value(xctx->inst[xctx->instances].prop_ptr, "name", 0)); xctx->instances++; @@ -947,7 +949,7 @@ void copy_objects(int what) xctx->prep_net_structs=0; xctx->prep_hi_structs=0; } - if(show_pin_net_names || xctx->hilight_nets) { + if(s_pnetname || xctx->hilight_nets) { prepare_netlist_structs(0); } for(i = 0; i < xctx->lastsel; i++) { @@ -957,7 +959,7 @@ void copy_objects(int what) char *type=xctx->sym[xctx->inst[n].ptr].type; symbol_bbox(n, &xctx->inst[n].x1, &xctx->inst[n].y1, &xctx->inst[n].x2, &xctx->inst[n].y2 ); bbox(ADD, xctx->inst[n].x1, xctx->inst[n].y1, xctx->inst[n].x2, xctx->inst[n].y2 ); - if((show_pin_net_names || xctx->hilight_nets) && type && IS_LABEL_OR_PIN(type)) { + if((s_pnetname || xctx->hilight_nets) && type && IS_LABEL_OR_PIN(type)) { for(p = 0; p < (xctx->inst[n].ptr + xctx->sym)->rects[PINLAYER]; p++) { if( xctx->inst[n].node && xctx->inst[n].node[p]) { int_hash_lookup(xctx->node_redraw_table, xctx->inst[n].node[p], 0, XINSERT_NOREPLACE); @@ -965,13 +967,13 @@ void copy_objects(int what) } } } - if((show_pin_net_names || xctx->hilight_nets) && xctx->sel_array[i].type == WIRE) { + if((s_pnetname || xctx->hilight_nets) && xctx->sel_array[i].type == WIRE) { int_hash_lookup(xctx->node_redraw_table, xctx->wire[n].node, 0, XINSERT_NOREPLACE); } } /* for(i = 0; i < xctx->lastsel; i++) */ - if(show_pin_net_names || xctx->hilight_nets) find_inst_to_be_redrawn(); + if(s_pnetname || xctx->hilight_nets) find_inst_to_be_redrawn(); check_collapsing_objects(); - if(autotrim_wires) trim_wires(); + if(tclgetboolvar("autotrim_wires")) trim_wires(); /* update_conn_cues(1, 1); */ xctx->ui_state &= ~STARTCOPY; xctx->x1=xctx->y_1=xctx->x2=xctx->y_2=xctx->move_rot=xctx->move_flip=xctx->deltax=xctx->deltay=0; @@ -994,11 +996,12 @@ void move_objects(int what, int merge, double dx, double dy) #if HAS_CAIRO==1 int customfont; #endif - xInstance * const inst = xctx->inst; xLine ** const line = xctx->line; xWire * const wire = xctx->wire; + int s_pnetname; + s_pnetname = tclgetboolvar("show_pin_net_names"); if(what & START) { xctx->rotatelocal=0; @@ -1071,7 +1074,7 @@ void move_objects(int what, int merge, double dx, double dy) bbox(ADD, inst[n].x1, inst[n].y1, inst[n].x2, inst[n].y2 ); /* hash all nodes of copied objects before the copy, they might need update if net_name=true */ - if((show_pin_net_names || xctx->hilight_nets) && type && IS_LABEL_OR_PIN(type)) { + if((s_pnetname || xctx->hilight_nets) && type && IS_LABEL_OR_PIN(type)) { for(p = 0; p < (inst[n].ptr + xctx->sym)->rects[PINLAYER]; p++) { if( inst[n].node && inst[n].node[p]) { int_hash_lookup(xctx->node_redraw_table, xctx->inst[n].node[p], 0, XINSERT_NOREPLACE); @@ -1079,12 +1082,12 @@ void move_objects(int what, int merge, double dx, double dy) } } } - if((show_pin_net_names || xctx->hilight_nets) && xctx->sel_array[i].type == WIRE) { + if((s_pnetname || xctx->hilight_nets) && xctx->sel_array[i].type == WIRE) { int_hash_lookup(xctx->node_redraw_table, xctx->wire[n].node, 0, XINSERT_NOREPLACE); } } draw_selection(xctx->gctiled,0); - if(show_pin_net_names || xctx->hilight_nets) find_inst_to_be_redrawn(); + if(s_pnetname || xctx->hilight_nets) find_inst_to_be_redrawn(); for(k=0;klastsel;i++) @@ -1486,7 +1489,7 @@ void move_objects(int what, int merge, double dx, double dy) xctx->prep_net_structs=0; xctx->prep_hi_structs=0; } - if(show_pin_net_names || xctx->hilight_nets) { + if(s_pnetname || xctx->hilight_nets) { prepare_netlist_structs(0); } for(i = 0; i < xctx->lastsel; i++) { @@ -1496,7 +1499,7 @@ void move_objects(int what, int merge, double dx, double dy) char *type=xctx->sym[xctx->inst[n].ptr].type; symbol_bbox(n, &inst[n].x1, &inst[n].y1, &inst[n].x2, &inst[n].y2 ); bbox(ADD, inst[n].x1, inst[n].y1, inst[n].x2, inst[n].y2 ); - if((show_pin_net_names || xctx->hilight_nets) && type && IS_LABEL_OR_PIN(type)) { + if((s_pnetname || xctx->hilight_nets) && type && IS_LABEL_OR_PIN(type)) { for(p = 0; p < (inst[n].ptr + xctx->sym)->rects[PINLAYER]; p++) { if( inst[n].node && inst[n].node[p]) { int_hash_lookup(xctx->node_redraw_table, xctx->inst[n].node[p], 0, XINSERT_NOREPLACE); @@ -1504,13 +1507,13 @@ void move_objects(int what, int merge, double dx, double dy) } } } - if((show_pin_net_names || xctx->hilight_nets) && xctx->sel_array[i].type == WIRE) { + if((s_pnetname || xctx->hilight_nets) && xctx->sel_array[i].type == WIRE) { int_hash_lookup(xctx->node_redraw_table, xctx->wire[n].node, 0, XINSERT_NOREPLACE); } } - if(show_pin_net_names || xctx->hilight_nets) find_inst_to_be_redrawn(); + if(s_pnetname || xctx->hilight_nets) find_inst_to_be_redrawn(); check_collapsing_objects(); - if(autotrim_wires) trim_wires(); + if(tclgetboolvar("autotrim_wires")) trim_wires(); /* update_conn_cues(1, 1); */ if(xctx->hilight_nets) { diff --git a/src/netlist.c b/src/netlist.c index 559f94ee..da9aa689 100644 --- a/src/netlist.c +++ b/src/netlist.c @@ -394,15 +394,15 @@ void netlist_options(int i) str = get_tok_value(xctx->inst[i].prop_ptr, "top_subckt", 0); if(str[0]) { - top_subckt = 0; /* fprintf(errfp, "netlist_options(): prop_ptr=%s\n", xctx->inst[i].prop_ptr); */ - if(!strcmp(str, "true")) top_subckt = 1; + if(!strcmp(str, "true")) tclsetintvar("top_subckt", 1); + else tclsetintvar("top_subckt", 0); } str = get_tok_value(xctx->inst[i].prop_ptr, "spiceprefix", 0); if(str[0]) { - spiceprefix = 1; /* fprintf(errfp, "netlist_options(): prop_ptr=%s\n", xctx->inst[i].prop_ptr); */ - if(!strcmp(str, "false")) spiceprefix = 0; + if(!strcmp(str, "false")) tclsetvar("spiceprefix", "0"); + else tclsetvar("spiceprefix", "1"); } str = get_tok_value(xctx->inst[i].prop_ptr, "hiersep", 0); @@ -450,9 +450,9 @@ static void signal_short( char *n1, char *n2) tcleval("wm deiconify .infotext"); /* critical error: force ERC window showing */ if(!xctx->netlist_count) { bus_hilight_lookup(n1, xctx->hilight_color, XINSERT); - if(incr_hilight) incr_hilight_color(); + if(tclgetboolvar("incr_hilight")) incr_hilight_color(); bus_hilight_lookup(n2, xctx->hilight_color, XINSERT); - if(incr_hilight) incr_hilight_color(); + if(tclgetboolvar("incr_hilight")) incr_hilight_color(); } } } diff --git a/src/node_hash.c b/src/node_hash.c index 90242691..aabc2430 100644 --- a/src/node_hash.c +++ b/src/node_hash.c @@ -292,7 +292,9 @@ void traverse_node_hash() int i; struct node_hashentry *entry; char str[2048]; /* 20161122 overflow safe */ - + int incr_hi; + + incr_hi = tclgetboolvar("incr_hilight"); for(i=0;inode_table[i]; @@ -303,14 +305,14 @@ void traverse_node_hash() { my_snprintf(str, S(str), "open net: %s", entry->token); if(!xctx->netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT_NOREPLACE); - if(incr_hilight) incr_hilight_color(); + if(incr_hi) incr_hilight_color(); statusmsg(str,2); } else if(entry->d.out ==0 && entry->d.inout == 0) { my_snprintf(str, S(str), "undriven node: %s", entry->token); if(!xctx->netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT_NOREPLACE); - if(incr_hilight) incr_hilight_color(); + if(incr_hi) incr_hilight_color(); statusmsg(str,2); tcleval("wm deiconify .infotext"); /* critical error: force ERC window showing */ } @@ -318,21 +320,21 @@ void traverse_node_hash() { my_snprintf(str, S(str), "shorted output node: %s", entry->token); if(!xctx->netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT_NOREPLACE); - if(incr_hilight) incr_hilight_color(); + if(incr_hi) incr_hilight_color(); statusmsg(str,2); } else if(entry->d.in ==0 && entry->d.inout == 0) { my_snprintf(str, S(str), "node: %s goes nowhere", entry->token); if(!xctx->netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT_NOREPLACE); - if(incr_hilight) incr_hilight_color(); + if(incr_hi) incr_hilight_color(); statusmsg(str,2); } else if(entry->d.out >=2 && entry->d.inout == 0 && entry->d.port>=0) /* era d.port>=2 03102001 */ { my_snprintf(str, S(str), "shorted output node: %s", entry->token); if(!xctx->netlist_count) bus_hilight_lookup(entry->token, xctx->hilight_color, XINSERT_NOREPLACE); - if(incr_hilight) incr_hilight_color(); + if(incr_hi) incr_hilight_color(); statusmsg(str,2); } } diff --git a/src/paste.c b/src/paste.c index f231b7a0..305c0271 100644 --- a/src/paste.c +++ b/src/paste.c @@ -263,7 +263,7 @@ void merge_inst(int k,FILE *fd) ptr[i].node=NULL; load_ascii_string(&prop_ptr,fd); if(!k) hash_all_names(i); - new_prop_string(i, prop_ptr, k, disable_unique_names); + new_prop_string(i, prop_ptr, k, tclgetboolvar("disable_unique_names")); /* the final tmp argument is zero for the 1st call and used in */ /* new_prop_string() for cleaning some internal caches. */ my_strdup2(306, &xctx->inst[i].instname, get_tok_value(xctx->inst[i].prop_ptr, "name", 0)); diff --git a/src/psprint.c b/src/psprint.c index e4ea0bc2..95a344bc 100644 --- a/src/psprint.c +++ b/src/psprint.c @@ -417,8 +417,8 @@ static void old_ps_draw_string(int gctext, const char *str, text_bbox(str, xscale, yscale, rot, flip, hcenter, vcenter, x1,y1, &rx1,&ry1,&rx2,&ry2, &no_of_lines, &longest_line); #endif - xscale*=nocairo_font_xscale; - yscale*=nocairo_font_yscale; + xscale*=tclgetdoublevar("nocairo_font_xscale"); + yscale*=tclgetdoublevar("nocairo_font_yscale"); if(!textclip(xctx->areax1,xctx->areay1,xctx->areax2,xctx->areay2,rx1,ry1,rx2,ry2)) return; set_ps_colors(gctext); @@ -457,8 +457,8 @@ static void ps_drawgrid() { double x,y; double delta,tmp; - if(!draw_grid) return; - delta=cadgrid* xctx->mooz; + if( !tclgetboolvar("draw_grid")) return; + delta=tclgetdoublevar("cadgrid")* xctx->mooz; while(deltaxorigin* xctx->mooz;y = xctx->yorigin* xctx->mooz; set_ps_colors(GRIDLAYER); @@ -676,8 +676,9 @@ void create_ps(char **psfile, int what) } fill_ps_colors(); - old_grid=draw_grid; - draw_grid=0; + old_grid=tclgetboolvar("draw_grid"); + tclsetvar("draw_grid", "0"); + boundbox.x1 = xctx->areax1; boundbox.x2 = xctx->areax2; @@ -870,7 +871,7 @@ void create_ps(char **psfile, int what) fprintf(fd, "%%%%EOF\n"); fclose(fd); } - draw_grid=old_grid; + tclsetboolvar("draw_grid", old_grid); my_free(879, &ps_colors); } diff --git a/src/save.c b/src/save.c index 747b6aee..c0da6382 100644 --- a/src/save.c +++ b/src/save.c @@ -1107,7 +1107,7 @@ void load_schematic(int load_symbols, const char *filename, int reset_undo) /* 2 tcleval( "wm iconname . \"xschem - [file tail [xschem get schname]]\""); } } - if(autotrim_wires) trim_wires(); + if(tclgetboolvar("autotrim_wires")) trim_wires(); update_conn_cues(0, 0); } @@ -2372,8 +2372,8 @@ void descend_symbol(void) } /* 20111023 align selected object to current grid setting */ -#define SNAP_TO_GRID(a) (a=ROUND(( a)/cadsnap)*cadsnap ) -void round_schematic_to_grid(double cadsnap) +#define SNAP_TO_GRID(a) (a=ROUND(( a)/c_snap)*c_snap ) +void round_schematic_to_grid(double c_snap) { int i, c, n, p; rebuild_selected_array(); diff --git a/src/scheduler.c b/src/scheduler.c index 0219f95b..0bb7bc67 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -109,8 +109,8 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg { cmd_found = 1; push_undo(); - round_schematic_to_grid(cadsnap); - if(autotrim_wires) trim_wires(); + round_schematic_to_grid(tclgetdoublevar("cadsnap")); + if(tclgetvar("autotrim_wires")) trim_wires(); set_modify(1); xctx->prep_hash_inst=0; xctx->prep_hash_wires=0; @@ -170,7 +170,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg else if(!strcmp(argv[1],"change_colors")) { cmd_found = 1; - build_colors(color_dim); + build_colors(tclgetdoublevar("color_dim")); draw(); Tcl_ResetResult(interp); } @@ -263,7 +263,6 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg if(argc==3) { d = atof(argv[2]); build_colors(d); - color_dim = d; draw(); Tcl_ResetResult(interp); } @@ -457,7 +456,6 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg else if(!strcmp(argv[1],"fullscreen")) { cmd_found = 1; - dbg(1, "scheduler(): xschem fullscreen, fullscreen=%d\n", fullscreen); toggle_fullscreen(argv[2]); Tcl_ResetResult(interp); } @@ -496,13 +494,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg else if(!strcmp(argv[1],"get") && argc==3) { cmd_found = 1; - if(!strcmp(argv[2],"auto_hilight")) { - if( auto_hilight != 0 ) - Tcl_SetResult(interp, "1",TCL_STATIC); - else - Tcl_SetResult(interp, "0",TCL_STATIC); - } - else if(!strcmp(argv[2],"backlayer")) { + if(!strcmp(argv[2],"backlayer")) { char s[30]; /* overflow safe 20161122 */ my_snprintf(s, S(s), "%d",BACKLAYER); Tcl_SetResult(interp, s,TCL_VOLATILE); @@ -521,27 +513,11 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg my_snprintf(res, S(res), "%g %g %g %g", boundbox.x1, boundbox.y1, boundbox.x2, boundbox.y2); Tcl_SetResult(interp, res, TCL_VOLATILE); } - else if(!strcmp(argv[2],"big_grid_points")) { - if( big_grid_points != 0 ) - Tcl_SetResult(interp, "1",TCL_STATIC); - else - Tcl_SetResult(interp, "0",TCL_STATIC); - } else if(!strcmp(argv[2],"cadlayers")) { char s[30]; /* overflow safe 20161212 */ my_snprintf(s, S(s), "%d",cadlayers); Tcl_SetResult(interp, s,TCL_VOLATILE); } - else if(!strcmp(argv[2],"cadsnap")) { - char s[30]; /* overflow safe 20161212 */ - my_snprintf(s, S(s), "%.9g",cadsnap); - Tcl_SetResult(interp, s,TCL_VOLATILE); - } - else if(!strcmp(argv[2],"change_lw")) { - char s[30]; /* overflow safe 20161122 */ - my_snprintf(s, S(s), "%d",change_lw); - Tcl_SetResult(interp, s,TCL_VOLATILE); - } else if(!strcmp(argv[2],"color_ps")) { if( color_ps != 0 ) Tcl_SetResult(interp, "1",TCL_STATIC); @@ -561,28 +537,11 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg my_snprintf(s, S(s), "%d",debug_var); Tcl_SetResult(interp, s,TCL_VOLATILE); } - else if(!strcmp(argv[2],"dim")) { - char s[40]; - my_snprintf(s, S(s), "%.2g", color_dim); - Tcl_SetResult(interp, s, TCL_VOLATILE); - } - else if(!strcmp(argv[2],"draw_grid")) { - if( draw_grid != 0 ) - Tcl_SetResult(interp, "1",TCL_STATIC); - else - Tcl_SetResult(interp, "0",TCL_STATIC); - } else if(!strcmp(argv[2],"draw_window")) { char s[30]; /* overflow safe 20161122 */ my_snprintf(s, S(s), "%d",draw_window); Tcl_SetResult(interp, s,TCL_VOLATILE); } - else if(!strcmp(argv[2],"enable_stretch")) { - if( enable_stretch != 0 ) - Tcl_SetResult(interp, "1",TCL_STATIC); - else - Tcl_SetResult(interp, "0",TCL_STATIC); - } else if(!strcmp(argv[2],"flat_netlist")) { if( flat_netlist != 0 ) Tcl_SetResult(interp, "1",TCL_STATIC); @@ -600,12 +559,6 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg else Tcl_SetResult(interp, "0",TCL_STATIC); } - else if(!strcmp(argv[2],"incr_hilight")) { - if( incr_hilight != 0 ) - Tcl_SetResult(interp, "1",TCL_STATIC); - else - Tcl_SetResult(interp, "0",TCL_STATIC); - } else if(!strcmp(argv[2],"instances")) { char s[30]; /* overflow safe 20161122 */ my_snprintf(s, S(s), "%d",xctx->instances); @@ -629,24 +582,12 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg else if(!strcmp(argv[2],"netlist_name")) { Tcl_SetResult(interp, xctx->netlist_name, TCL_VOLATILE); } - else if(!strcmp(argv[2],"netlist_show")) { - if( netlist_show != 0 ) - Tcl_SetResult(interp, "1",TCL_STATIC); - else - Tcl_SetResult(interp, "0",TCL_STATIC); - } else if(!strcmp(argv[2],"no_draw")) { if( xctx->no_draw != 0 ) Tcl_SetResult(interp, "1",TCL_STATIC); else Tcl_SetResult(interp, "0",TCL_STATIC); } - else if(!strcmp(argv[2],"only_probes")) { - if( only_probes != 0 ) - Tcl_SetResult(interp, "1",TCL_STATIC); - else - Tcl_SetResult(interp, "0",TCL_STATIC); - } else if(!strcmp(argv[2],"pinlayer")) { char s[30]; /* overflow safe 20161122 */ my_snprintf(s, S(s), "%d",PINLAYER); @@ -667,24 +608,6 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg my_snprintf(s, S(s), "%d",xctx->semaphore); Tcl_SetResult(interp, s,TCL_VOLATILE); } - else if(!strcmp(argv[2],"show_pin_net_names")) { - if( show_pin_net_names != 0 ) - Tcl_SetResult(interp, "1",TCL_STATIC); - else - Tcl_SetResult(interp, "0",TCL_STATIC); - } - else if(!strcmp(argv[2],"split_files")) { - if( split_files != 0 ) - Tcl_SetResult(interp, "1",TCL_STATIC); - else - Tcl_SetResult(interp, "0",TCL_STATIC); - } - else if(!strcmp(argv[2],"sym_txt")) { - if( sym_txt != 0 ) - Tcl_SetResult(interp, "1",TCL_STATIC); - else - Tcl_SetResult(interp, "0",TCL_STATIC); - } #ifndef __unix__ else if(!strcmp(argv[2], "temp_dir")) { if(win_temp_dir[0] != '\0') Tcl_SetResult(interp, win_temp_dir, TCL_VOLATILE); @@ -728,17 +651,6 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg my_snprintf(s, S(s), "%d",TEXTLAYER); Tcl_SetResult(interp, s,TCL_VOLATILE); } - else if(!strcmp(argv[2],"transparent_svg")) { - if( transparent_svg != 0 ) - Tcl_SetResult(interp, "1",TCL_STATIC); - else - Tcl_SetResult(interp, "0",TCL_STATIC); - } - else if(!strcmp(argv[2],"ui_state")) { - char s[30]; /* overflow safe 20161122 */ - my_snprintf(s, S(s), "%d",xctx->ui_state); - Tcl_SetResult(interp, s,TCL_VOLATILE); - } else if(!strcmp(argv[2],"version")) { char s[30]; /* overflow safe 20161122 */ my_snprintf(s, S(s), "XSCHEM V%s",XSCHEM_VERSION); @@ -960,8 +872,6 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg printf(" perform a global netlist on current schematic\n"); printf(" xschem netlist_type type\n"); printf(" set netlist type to , currently spice, vhdl, verilog or tedax\n"); - printf(" xschem netlist_show yes|no\n"); - printf(" show or not netlist in a window\n"); printf(" xschem save [library/name]\n"); printf(" save current schematic, optionally a lib/name can be given\n"); printf(" xschem saveas\n"); @@ -1961,7 +1871,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg my_strdup(371, &ptr,subst_token(xctx->inst[inst].prop_ptr, "name", name) ); hash_all_names(inst); - new_prop_string(inst, ptr,0, disable_unique_names); /* set new prop_ptr */ + new_prop_string(inst, ptr,0, tclgetboolvar("disable_unique_names")); /* set new prop_ptr */ my_strdup2(517, &newname, get_tok_value(xctx->inst[inst].prop_ptr, "name",0)); my_strdup2(372, &xctx->inst[inst].instname, newname); @@ -2180,146 +2090,43 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg * ********** xschem set subcommands */ cmd_found = 1; - if(!strcmp(argv[2],"svg_font_name")) { - if( strlen(argv[3]) < sizeof(svg_font_name) ) { - my_strncpy(svg_font_name, argv[3], S(svg_font_name)); - } - } else - #if HAS_CAIRO==1 - if(!strcmp(argv[2],"cairo_font_name")) { - if( strlen(argv[3]) < sizeof(cairo_font_name) ) { - my_strncpy(cairo_font_name, argv[3], S(cairo_font_name)); - } - } else - #endif - if(!strcmp(argv[2],"no_undo")) { - int s = atoi(argv[3]); - xctx->no_undo=s; + if(!strcmp(argv[2],"cadgrid")) { + set_grid( atof(argv[3]) ); + } + else if(!strcmp(argv[2],"cadsnap")) { + set_snap( atof(argv[3]) ); + } + else if(!strcmp(argv[2],"color_ps")) { + color_ps=atoi(argv[3]); + } + else if(!strcmp(argv[2],"constrained_move")) { + constrained_move = atoi(argv[3]); + } + else if(!strcmp(argv[2],"dim")) { + double s = atof(argv[3]); + build_colors(s); + draw(); + Tcl_ResetResult(interp); + } + else if(!strcmp(argv[2],"draw_window")) { + draw_window=atoi(argv[3]); + } + else if(!strcmp(argv[2],"flat_netlist")) { + flat_netlist=atoi(argv[3]); + } + else if(!strcmp(argv[2],"hide_symbols")) { + hide_symbols=atoi(argv[3]); + } + else if(!strcmp(argv[2],"netlist_name")) { + my_strncpy(xctx->netlist_name, argv[3], S(xctx->netlist_name)); } else if(!strcmp(argv[2],"no_draw")) { int s = atoi(argv[3]); xctx->no_draw=s; } - else if(!strcmp(argv[2],"hide_symbols")) { + else if(!strcmp(argv[2],"no_undo")) { int s = atoi(argv[3]); - hide_symbols=s; - } - else if(!strcmp(argv[2],"show_pin_net_names")) { - int i, s = atoi(argv[3]); - show_pin_net_names=s; - for(i = 0; i < xctx->instances; i++) { - symbol_bbox(i, &xctx->inst[i].x1, &xctx->inst[i].y1, &xctx->inst[i].x2, &xctx->inst[i].y2); - } - } - else if(!strcmp(argv[2],"netlist_name")) { - my_strncpy(xctx->netlist_name, argv[3], S(xctx->netlist_name)); - } - else if(!strcmp(argv[2],"dim")) { - double s = atof(argv[3]); - build_colors(s); - color_dim = s; - draw(); - Tcl_ResetResult(interp); - } - else if(!strcmp(argv[2],"en_hilight_conn_inst")) { - en_hilight_conn_inst=atoi(argv[3]); - } - else if(!strcmp(argv[2],"big_grid_points")) { - big_grid_points=atoi(argv[3]); - } - else if(!strcmp(argv[2],"cairo_font_scale")) { - double s = atof(argv[3]); - if(s>0.1 && s<10.0) cairo_font_scale = s; - } - else if(!strcmp(argv[2],"nocairo_font_xscale")) { - double s = atof(argv[3]); - if(s>0.1 && s<10.0) nocairo_font_xscale = s; - } - else if(!strcmp(argv[2],"nocairo_font_yscale")) { - double s = atof(argv[3]); - if(s>0.1 && s<10.0) nocairo_font_yscale = s; - } - else if(!strcmp(argv[2],"cairo_font_line_spacing")) { - double s = atof(argv[3]); - if(s>0.1 && s<10.0) cairo_font_line_spacing = s; - } - else if(!strcmp(argv[2],"cairo_vert_correct")) { - double s = atof(argv[3]); - if(s>-20. && s<20.) cairo_vert_correct = s; - } - else if(!strcmp(argv[2],"nocairo_vert_correct")) { - double s = atof(argv[3]); - if(s>-20. && s<20.) nocairo_vert_correct = s; - } - else if(!strcmp(argv[2],"persistent_command")) { - if(!strcmp(argv[3],"1")) { - persistent_command=1; - } else { - persistent_command=0; - } - } - else if(!strcmp(argv[2],"autotrim_wires")) { - if(!strcmp(argv[3],"1")) { - autotrim_wires=1; - } else { - autotrim_wires=0; - } - } - else if(!strcmp(argv[2],"disable_unique_names")) { - if(!strcmp(argv[3],"1")) { - disable_unique_names=1; - } else { - disable_unique_names=0; - } - } - else if(!strcmp(argv[2],"incr_hilight")) { - incr_hilight=atoi(argv[3]); - } - else if(!strcmp(argv[2],"auto_hilight")) { - auto_hilight=atoi(argv[3]); - } - else if(!strcmp(argv[2],"netlist_show")) { - netlist_show=atoi(argv[3]); - tclsetvar("netlist_show", netlist_show ? "1" : "0"); - } - else if(!strcmp(argv[2],"semaphore")) { - xctx->semaphore=atoi(argv[3]); - } - else if(!strcmp(argv[2],"cadsnap")) { - set_snap( atof(argv[3]) ); - } - else if(!strcmp(argv[2],"spiceprefix")) { - spiceprefix=atoi(argv[3]); - } - else if(!strcmp(argv[2],"cadgrid")) { - set_grid( atof(argv[3]) ); - } - else if(!strcmp(argv[2],"flat_netlist")) { - flat_netlist=atoi(argv[3]); - } - else if(!strcmp(argv[2],"split_files")) { - split_files=atoi(argv[3]); - } - else if(!strcmp(argv[2],"enable_stretch")) { - enable_stretch=atoi(argv[3]); - } - else if(!strcmp(argv[2],"color_ps")) { - color_ps=atoi(argv[3]); - } - else if(!strcmp(argv[2],"transparent_svg")) { - transparent_svg=atoi(argv[3]); - } - else if(!strcmp(argv[2],"only_probes")) { - only_probes=atoi(argv[3]); - } - else if(!strcmp(argv[2],"draw_grid")) { - draw_grid=atoi(argv[3]); - } - else if(!strcmp(argv[2],"text_svg")) { - text_svg=atoi(argv[3]); - } - else if(!strcmp(argv[2],"sym_txt")) { - sym_txt=atoi(argv[3]); + xctx->no_undo=s; } else if(!strcmp(argv[2],"rectcolor")) { xctx->rectcolor=atoi(argv[3]); @@ -2328,17 +2135,14 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg change_layer(); } } - else if(!strcmp(argv[2],"constrained_move")) { - constrained_move = atoi(argv[3]); + else if(!strcmp(argv[2],"text_svg")) { + text_svg=atoi(argv[3]); } - else if(!strcmp(argv[2],"change_lw")) { - change_lw=atoi(argv[3]); + else if(!strcmp(argv[2],"semaphore")) { + xctx->semaphore=atoi(argv[3]); } - else if(!strcmp(argv[2],"draw_window")) { - draw_window=atoi(argv[3]); - } - else if(!strcmp(argv[2],"ui_state")) { - xctx->ui_state=atoi(argv[3]); + else if(!strcmp(argv[2],"sym_txt")) { + sym_txt=atoi(argv[3]); } else { Tcl_AppendResult(interp, "xschem set ", argv[1], argv[3], ": invalid command.", NULL); @@ -2413,9 +2217,11 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg xctx->prep_hi_structs=0; if(!strcmp(argv[3], "name")) hash_all_names(inst); if(argc >= 5) { - new_prop_string(inst, subst_token(xctx->inst[inst].prop_ptr, argv[3], argv[4]),fast, disable_unique_names); + new_prop_string(inst, subst_token(xctx->inst[inst].prop_ptr, argv[3], argv[4]),fast, + tclgetboolvar("disable_unique_names")); } else {/* assume argc == 4 , delete attribute */ - new_prop_string(inst, subst_token(xctx->inst[inst].prop_ptr, argv[3], NULL),fast, disable_unique_names); + new_prop_string(inst, subst_token(xctx->inst[inst].prop_ptr, argv[3], NULL),fast, + tclgetboolvar("disable_unique_names")); } my_strdup2(367, &xctx->inst[inst].instname, get_tok_value(xctx->inst[inst].prop_ptr, "name",0)); @@ -2439,7 +2245,13 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg } Tcl_SetResult(interp, xctx->inst[inst].instname , TCL_VOLATILE); } - + else if(!strcmp(argv[1],"show_pin_net_names")) { + int i; + cmd_found = 1; + for(i = 0; i < xctx->instances; i++) { + symbol_bbox(i, &xctx->inst[i].x1, &xctx->inst[i].y1, &xctx->inst[i].x2, &xctx->inst[i].y2); + } + } else if(!strcmp(argv[1],"simulate") ) { cmd_found = 1; @@ -2493,11 +2305,13 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg else if(!strcmp(argv[1],"toggle_colorscheme")) { + int d_c; cmd_found = 1; - dark_colorscheme=!dark_colorscheme; - tclsetvar("dark_colorscheme", dark_colorscheme ? "1" : "0"); - color_dim=0.0; - build_colors(color_dim); + d_c = tclgetboolvar("dark_colorscheme"); + d_c = !d_c; + tclsetboolvar("dark_colorscheme", d_c); + tclsetdoublevar("color_dim", 0.0); + build_colors(0.0); draw(); Tcl_ResetResult(interp); } @@ -2608,7 +2422,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg save = draw_window; draw_window = 1; drawline(WIRELAYER,NOW, x1,y1,x2,y2, 0); draw_window = save; - if(autotrim_wires) trim_wires(); + if(tclgetvar("autotrim_wires")) trim_wires(); } else xctx->ui_state |= MENUSTARTWIRE; } @@ -2696,6 +2510,24 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg return TCL_OK; } +double tclgetdoublevar(const char *s) +{ + dbg(2, "tclgetdoublevar(): %s\n", s); + return atof(Tcl_GetVar(interp,s, TCL_GLOBAL_ONLY)); +} + +int tclgetintvar(const char *s) +{ + dbg(2, "tclgetintvar(): %s\n", s); + return atoi(Tcl_GetVar(interp,s, TCL_GLOBAL_ONLY)); +} + +int tclgetboolvar(const char *s) +{ + dbg(2, "tclgetboolvar(): %s\n", s); + return Tcl_GetVar(interp,s, TCL_GLOBAL_ONLY)[0] == '1' ? 1 : 0; +} + const char *tclgetvar(const char *s) { dbg(2, "tclgetvar(): %s\n", s); @@ -2722,3 +2554,33 @@ void tclsetvar(const char *s, const char *value) fprintf(errfp, "tclsetvar(): error setting variable %s to %s\n", s, value); } } + +void tclsetdoublevar(const char *s, const double value) +{ + char str[80]; + dbg(2, "tclsetdoublevar(): %s to %g\n", s, value); + sprintf(str, "%.16g", value); + if(!Tcl_SetVar(interp, s, str, TCL_GLOBAL_ONLY)) { + fprintf(errfp, "tclsetdoublevar(): error setting variable %s to %g\n", s, value); + } +} + +void tclsetintvar(const char *s, const int value) +{ + char str[80]; + dbg(2, "tclsetintvar(): %s to %d\n", s, value); + sprintf(str, "%d", value); + if(!Tcl_SetVar(interp, s, str, TCL_GLOBAL_ONLY)) { + fprintf(errfp, "tclsetintvar(): error setting variable %s to %d\n", s, value); + } +} + +void tclsetboolvar(const char *s, const int value) +{ + dbg(2, "tclsetboolvar(): %s to %d\n", s, value); + if(!Tcl_SetVar(interp, s, (value ? "1" : "0"), TCL_GLOBAL_ONLY)) { + fprintf(errfp, "tclsetboolvar(): error setting variable %s to %d\n", s, value); + } +} + + diff --git a/src/select.c b/src/select.c index 87a34eb7..874e50d8 100644 --- a/src/select.c +++ b/src/select.c @@ -323,15 +323,14 @@ void delete(int to_push_undo) #if HAS_CAIRO==1 int customfont; #endif + int s_pnetname; + s_pnetname = tclgetboolvar("show_pin_net_names"); dbg(3, "delete(): start\n"); j = 0; bbox(START, 0.0 , 0.0 , 0.0 , 0.0); rebuild_selected_array(); if(to_push_undo && xctx->lastsel) push_undo(); - - - /* first calculate bbox, because symbol_bbox() needs translate (@#0:net_name) which * needs prepare_netlist_structs which needs a consistent xctx->inst[] data structure */ @@ -339,7 +338,7 @@ void delete(int to_push_undo) * xctx->prep_net_structs=0; * xctx->prep_hi_structs=0; */ - if((show_pin_net_names || xctx->hilight_nets)) prepare_netlist_structs(0); + if((s_pnetname || xctx->hilight_nets)) prepare_netlist_structs(0); for(i = 0; i < xctx->lastsel; i++) { n = xctx->sel_array[i].n; if(xctx->sel_array[i].type == ELEMENT) { @@ -347,7 +346,7 @@ void delete(int to_push_undo) char *type = (xctx->inst[n].ptr + xctx->sym)->type; symbol_bbox(n, &xctx->inst[n].x1, &xctx->inst[n].y1, &xctx->inst[n].x2, &xctx->inst[n].y2 ); bbox(ADD, xctx->inst[n].x1, xctx->inst[n].y1, xctx->inst[n].x2, xctx->inst[n].y2 ); - if((show_pin_net_names || xctx->hilight_nets) && type && IS_LABEL_OR_PIN(type) ) { + if((s_pnetname || xctx->hilight_nets) && type && IS_LABEL_OR_PIN(type) ) { for(p = 0; p < (xctx->inst[n].ptr + xctx->sym)->rects[PINLAYER]; p++) { /* only .node[0] ? */ if( xctx->inst[n].node && xctx->inst[n].node[p]) { int_hash_lookup(xctx->node_redraw_table, xctx->inst[n].node[p], 0, XINSERT_NOREPLACE); @@ -355,11 +354,11 @@ void delete(int to_push_undo) } } } - if((show_pin_net_names || xctx->hilight_nets) && xctx->sel_array[i].type == WIRE && xctx->wire[n].node) { + if((s_pnetname || xctx->hilight_nets) && xctx->sel_array[i].type == WIRE && xctx->wire[n].node) { int_hash_lookup(xctx->node_redraw_table, xctx->wire[n].node, 0, XINSERT_NOREPLACE); } } - if(show_pin_net_names || xctx->hilight_nets) find_inst_to_be_redrawn(); + if(s_pnetname || xctx->hilight_nets) find_inst_to_be_redrawn(); /* already done above @@ -470,7 +469,7 @@ void delete(int to_push_undo) xctx->prep_net_structs=0; xctx->prep_hi_structs=0; } - if(autotrim_wires) trim_wires(); + if(tclgetboolvar("autotrim_wires")) trim_wires(); del_rect_line_arc_poly(); update_conn_cues(0, 0); if(xctx->hilight_nets) { @@ -1012,10 +1011,12 @@ void select_inside(double x1,double y1, double x2, double y2, int sel) /*added u int c,i, tmpint; double x, y, r, a, b, xa, ya, xb, yb; /* arc */ xRect tmp; + int en_s; #if HAS_CAIRO==1 int customfont; #endif + en_s = tclgetboolvar("enable_stretch"); for(i=0;iwires;i++) { if(RECTINSIDE(xctx->wire[i].x1,xctx->wire[i].y1,xctx->wire[i].x2,xctx->wire[i].y2, x1,y1,x2,y2)) @@ -1023,12 +1024,12 @@ void select_inside(double x1,double y1, double x2, double y2, int sel) /*added u xctx->ui_state |= SELECTION; /* set xctx->ui_state to SELECTION also if unselecting by area ???? */ sel ? select_wire(i,SELECTED, 1): select_wire(i,0, 1); } - else if( sel && enable_stretch && POINTINSIDE(xctx->wire[i].x1,xctx->wire[i].y1, x1,y1,x2,y2) ) + else if( sel && en_s && POINTINSIDE(xctx->wire[i].x1,xctx->wire[i].y1, x1,y1,x2,y2) ) { xctx->ui_state |= SELECTION; select_wire(i,SELECTED1, 1); } - else if( sel && enable_stretch && POINTINSIDE(xctx->wire[i].x2,xctx->wire[i].y2, x1,y1,x2,y2) ) + else if( sel && en_s && POINTINSIDE(xctx->wire[i].x2,xctx->wire[i].y2, x1,y1,x2,y2) ) { xctx->ui_state |= SELECTION; select_wire(i,SELECTED2, 1); @@ -1090,7 +1091,7 @@ void select_inside(double x1,double y1, double x2, double y2, int sel) /*added u select_polygon(c, i, SELECTED, 1); } else if(selected_points) { /* for polygon, SELECTED1 means partial sel */ - if(sel && enable_stretch) select_polygon(c, i, SELECTED1,1); + if(sel && en_s) select_polygon(c, i, SELECTED1,1); } } @@ -1102,12 +1103,12 @@ void select_inside(double x1,double y1, double x2, double y2, int sel) /*added u xctx->ui_state |= SELECTION; sel? select_line(c,i,SELECTED,1): select_line(c,i,0,1); } - else if( sel && enable_stretch && POINTINSIDE(xctx->line[c][i].x1,xctx->line[c][i].y1, x1,y1,x2,y2) ) + else if( sel && en_s && POINTINSIDE(xctx->line[c][i].x1,xctx->line[c][i].y1, x1,y1,x2,y2) ) { xctx->ui_state |= SELECTION; /* set xctx->ui_state to SELECTION also if unselecting by area ???? */ select_line(c, i,SELECTED1,1); } - else if( sel && enable_stretch && POINTINSIDE(xctx->line[c][i].x2,xctx->line[c][i].y2, x1,y1,x2,y2) ) + else if( sel && en_s && POINTINSIDE(xctx->line[c][i].x2,xctx->line[c][i].y2, x1,y1,x2,y2) ) { xctx->ui_state |= SELECTION; select_line(c, i,SELECTED2,1); @@ -1128,17 +1129,17 @@ void select_inside(double x1,double y1, double x2, double y2, int sel) /*added u xctx->ui_state |= SELECTION; /* set xctx->ui_state to SELECTION also if unselecting by area ???? */ sel? select_arc(c, i, SELECTED,1): select_arc(c, i, 0,1); } - else if( sel && enable_stretch && POINTINSIDE(x, y, x1, y1, x2, y2) ) + else if( sel && en_s && POINTINSIDE(x, y, x1, y1, x2, y2) ) { xctx->ui_state |= SELECTION; /* set xctx->ui_state to SELECTION also if unselecting by area ???? */ select_arc(c, i,SELECTED1,1); } - else if( sel && enable_stretch && POINTINSIDE(xb, yb, x1, y1, x2, y2) ) + else if( sel && en_s && POINTINSIDE(xb, yb, x1, y1, x2, y2) ) { xctx->ui_state |= SELECTION; /* set xctx->ui_state to SELECTION also if unselecting by area ???? */ select_arc(c, i,SELECTED3,1); } - else if( sel && enable_stretch && POINTINSIDE(xa, ya, x1, y1, x2, y2) ) + else if( sel && en_s && POINTINSIDE(xa, ya, x1, y1, x2, y2) ) { xctx->ui_state |= SELECTION; /* set xctx->ui_state to SELECTION also if unselecting by area ???? */ select_arc(c, i,SELECTED2,1); @@ -1152,22 +1153,22 @@ void select_inside(double x1,double y1, double x2, double y2, int sel) /*added u sel? select_box(c,i, SELECTED, 1): select_box(c,i, 0, 1); } else { - if( sel && enable_stretch && POINTINSIDE(xctx->rect[c][i].x1,xctx->rect[c][i].y1, x1,y1,x2,y2) ) + if( sel && en_s && POINTINSIDE(xctx->rect[c][i].x1,xctx->rect[c][i].y1, x1,y1,x2,y2) ) { /*20070302 added stretch select */ xctx->ui_state |= SELECTION; select_box(c, i,SELECTED1,1); } - if( sel && enable_stretch && POINTINSIDE(xctx->rect[c][i].x2,xctx->rect[c][i].y1, x1,y1,x2,y2) ) + if( sel && en_s && POINTINSIDE(xctx->rect[c][i].x2,xctx->rect[c][i].y1, x1,y1,x2,y2) ) { xctx->ui_state |= SELECTION; select_box(c, i,SELECTED2,1); } - if( sel && enable_stretch && POINTINSIDE(xctx->rect[c][i].x1,xctx->rect[c][i].y2, x1,y1,x2,y2) ) + if( sel && en_s && POINTINSIDE(xctx->rect[c][i].x1,xctx->rect[c][i].y2, x1,y1,x2,y2) ) { xctx->ui_state |= SELECTION; select_box(c, i,SELECTED3,1); } - if( sel && enable_stretch && POINTINSIDE(xctx->rect[c][i].x2,xctx->rect[c][i].y2, x1,y1,x2,y2) ) + if( sel && en_s && POINTINSIDE(xctx->rect[c][i].x2,xctx->rect[c][i].y2, x1,y1,x2,y2) ) { xctx->ui_state |= SELECTION; select_box(c, i,SELECTED4,1); diff --git a/src/spice_netlist.c b/src/spice_netlist.c index 51210e10..26db981c 100644 --- a/src/spice_netlist.c +++ b/src/spice_netlist.c @@ -116,7 +116,11 @@ void global_spice_netlist(int global) /* netlister driver */ char cellname[PATH_MAX]; /* 20081211 overflow safe 20161122 */ char *subckt_name; char *abs_path = NULL; + int top_sub; + int split_f; + split_f = tclgetboolvar("split_files"); + top_sub = tclgetboolvar("top_subckt"); xctx->netlist_unconn_cnt=0; /* unique count of unconnected pins while netlisting */ statusmsg("",2); /* clear infowindow */ if(xctx->modified) { @@ -126,8 +130,8 @@ void global_spice_netlist(int global) /* netlister driver */ free_hash(subckt_table); free_hash(model_table); record_global_node(2, NULL, NULL); /* delete list of global nodes */ - top_subckt = 0; - spiceprefix=1; + top_sub = 0; + tclsetvar("spiceprefix", "1"); bus_char[0] = bus_char[1] = '\0'; xctx->hiersep[0]='.'; xctx->hiersep[1]='\0'; str_tmp = tclgetvar("bus_replacement_char"); @@ -184,10 +188,9 @@ void global_spice_netlist(int global) /* netlister driver */ netlist_options(i); } } - if(!strcmp(tclgetvar("top_subckt"), "1")) top_subckt = 1; - if(!strcmp(tclgetvar("spiceprefix"), "0")) spiceprefix = 0; + top_sub = tclgetboolvar("top_subckt"); - if(!top_subckt) fprintf(fd,"**"); + if(!top_sub) fprintf(fd,"**"); fprintf(fd,".subckt %s", skip_dir( xctx->sch[xctx->currsch]) ); /* print top subckt ipin/opins */ @@ -245,11 +248,11 @@ void global_spice_netlist(int global) /* netlister driver */ if(first) fprintf(fd,"**** end user architecture code\n"); /* /20100217 */ - if(!top_subckt) fprintf(fd,"**"); + if(!top_sub) fprintf(fd,"**"); fprintf(fd, ".ends\n"); - if(split_files) { + if(split_f) { fclose(fd); my_snprintf(tcl_cmd_netlist, S(tcl_cmd_netlist), "netlist {%s} noshow {%s}", netl_filename, cellname); override_netlist_type(CAD_SPICE_NETLIST); @@ -288,9 +291,9 @@ void global_spice_netlist(int global) /* netlister driver */ if (str_hash_lookup(subckt_table, subckt_name, "", XLOOKUP)==NULL) { str_hash_lookup(subckt_table, subckt_name, "", XINSERT); - if( split_files && strcmp(get_tok_value(xctx->sym[i].prop_ptr,"vhdl_netlist",0),"true")==0 ) + if( split_f && strcmp(get_tok_value(xctx->sym[i].prop_ptr,"vhdl_netlist",0),"true")==0 ) vhdl_block_netlist(fd, i); - else if(split_files && strcmp(get_tok_value(xctx->sym[i].prop_ptr,"verilog_netlist",0),"true")==0 ) + else if(split_f && strcmp(get_tok_value(xctx->sym[i].prop_ptr,"verilog_netlist",0),"true")==0 ) verilog_block_netlist(fd, i); else if( strcmp(get_tok_value(xctx->sym[i].prop_ptr,"spice_primitive",0),"true") ) @@ -323,7 +326,7 @@ void global_spice_netlist(int global) /* netlister driver */ /* =================================== 20121223 */ first = 0; - if(!split_files) { + if(!split_f) { for(i=0;iinstances;i++) /* print netlist_commands of top level cell with 'place=end' property */ { if( strcmp(get_tok_value(xctx->inst[i].prop_ptr,"spice_ignore",0),"true")==0 ) continue; @@ -365,14 +368,14 @@ void global_spice_netlist(int global) /* netlister driver */ /* 20150922 added split_files check */ - if(!split_files) fprintf(fd, ".end\n"); + if(!split_f) fprintf(fd, ".end\n"); dbg(1, "global_spice_netlist(): starting awk on netlist!\n"); - if(!split_files) { + if(!split_f) { fclose(fd); - if(netlist_show) { + if(tclgetboolvar("netlist_show")) { my_snprintf(tcl_cmd_netlist, S(tcl_cmd_netlist), "netlist {%s} show {%s}", netl_filename, cellname); tcleval(tcl_cmd_netlist); } @@ -422,6 +425,9 @@ void spice_block_netlist(FILE *fd, int i) /* int multip; */ char *extra=NULL; char *sch = NULL; + int split_f; + + split_f = tclgetboolvar("split_files"); if(!strcmp( get_tok_value(xctx->sym[i].prop_ptr,"spice_stop",0),"true") ) spice_stop=1; @@ -434,7 +440,7 @@ void spice_block_netlist(FILE *fd, int i) } else { my_strncpy(filename, add_ext(abs_sym_path(xctx->sym[i].name, ""), ".sch"), S(filename)); } - if(split_files) { + if(split_f) { my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d", netlist_dir, skip_dir(xctx->sym[i].name), getpid()); dbg(1, "spice_block_netlist(): split_files: netl_filename=%s\n", netl_filename); fd=fopen(netl_filename, "w"); @@ -468,7 +474,7 @@ void spice_block_netlist(FILE *fd, int i) fprintf(fd,"**** end user architecture code\n"); } fprintf(fd, ".ends\n\n"); - if(split_files) { + if(split_f) { fclose(fd); my_snprintf(tcl_cmd_netlist, S(tcl_cmd_netlist), "netlist {%s} noshow {%s}", netl_filename, cellname); override_netlist_type(CAD_SPICE_NETLIST); @@ -482,7 +488,9 @@ void spice_netlist(FILE *fd, int spice_stop ) { int i, flag = 0; char *type=NULL; + int top_sub; + top_sub = tclgetboolvar("top_subckt"); if(!spice_stop) { xctx->prep_net_structs = 0; prepare_netlist_structs(1); @@ -496,11 +504,11 @@ void spice_netlist(FILE *fd, int spice_stop ) } my_strdup(388, &type,(xctx->inst[i].ptr+ xctx->sym)->type); if( type && IS_PIN(type) ) { - if(top_subckt && !flag) { + if(top_sub && !flag) { fprintf(fd, "*.PININFO "); flag = 1; } - if(top_subckt) { + if(top_sub) { int d = 'X'; if(!strcmp(type, "ipin")) d = 'I'; if(!strcmp(type, "opin")) d = 'O'; @@ -511,7 +519,7 @@ void spice_netlist(FILE *fd, int spice_stop ) } } } - if(top_subckt) fprintf(fd, "\n"); + if(top_sub) fprintf(fd, "\n"); for(i=0;iinstances;i++) /* ... then print other lines */ { if( strcmp(get_tok_value(xctx->inst[i].prop_ptr,"spice_ignore",0),"true")==0 ) continue; diff --git a/src/svgdraw.c b/src/svgdraw.c index 53fbea27..33e77820 100644 --- a/src/svgdraw.c +++ b/src/svgdraw.c @@ -197,7 +197,7 @@ static void svg_draw_string_line(int layer, char *s, double x, double y, double if(color_ps) my_snprintf(col, S(col), "#%02x%02x%02x", svg_colors[layer].red, svg_colors[layer].green, svg_colors[layer].blue); - else if(dark_colorscheme) + else if(tclgetboolvar("dark_colorscheme")) my_snprintf(col, S(col), "#%02x%02x%02x", 255, 255, 255); else my_snprintf(col, S(col), "#%02x%02x%02x", 0, 0, 0); @@ -225,7 +225,7 @@ static void svg_draw_string_line(int layer, char *s, double x, double y, double fprintf(fd,"mooz); if(strcmp(svg_font_weight, "normal")) fprintf(fd, "font-weight=\"%s\" ", svg_font_weight); if(strcmp(svg_font_style, "normal")) fprintf(fd, "font-style=\"%s\" ", svg_font_style); - if(strcmp(svg_font_family, svg_font_name)) fprintf(fd, "style=\"font-family:%s;\" ", svg_font_family); + if(strcmp(svg_font_family, tclgetvar("svg_font_name"))) fprintf(fd, "style=\"font-family:%s;\" ", svg_font_family); if(rot1) fprintf(fd, "transform=\"translate(%g, %g) rotate(%d)\" ", ix, iy, rot1*90); else fprintf(fd, "transform=\"translate(%g, %g)\" ", ix, iy); fprintf(fd, ">"); @@ -329,8 +329,8 @@ static void old_svg_draw_string(int layer, const char *str, text_bbox(str, xscale, yscale, rot, flip, hcenter, vcenter, x,y, &rx1,&ry1,&rx2,&ry2, &no_of_lines, &longest_line); #endif - xscale*=nocairo_font_xscale; - yscale*=nocairo_font_yscale; + xscale*=tclgetdoublevar("nocairo_font_xscale"); + yscale*=tclgetdoublevar("nocairo_font_yscale"); if(!textclip(xctx->areax1,xctx->areay1,xctx->areax2,xctx->areay2,rx1,ry1,rx2,ry2)) return; x=rx1;y=ry1; if(rot&1) {y=ry2;rot=3;} @@ -367,8 +367,8 @@ static void svg_drawgrid() { double x,y; double delta,tmp; - if(!draw_grid) return; - delta=cadgrid* xctx->mooz; + if(!tclgetboolvar("draw_grid")) return; + delta=tclgetdoublevar("cadgrid")* xctx->mooz; while(deltaxorigin* xctx->mooz;y = xctx->yorigin* xctx->mooz; if(y>xctx->areay1 && yareay2) @@ -490,7 +490,7 @@ static void svg_draw_symbol(int c, int n,int layer,short tmp_flip, short rot, } /* display PINLAYER colored instance texts even if PINLAYER disabled */ if(xctx->inst[n].color == PINLAYER || enable_layer[textlayer]) { - my_snprintf(svg_font_family, S(svg_font_family), svg_font_name); + my_snprintf(svg_font_family, S(svg_font_family), tclgetvar("svg_font_name")); my_snprintf(svg_font_style, S(svg_font_style), "normal"); my_snprintf(svg_font_weight, S(svg_font_weight), "normal"); textfont = symptr->text[j].font; @@ -534,7 +534,7 @@ static void fill_svg_colors() svg_colors[i].red = (c & 0xff0000) >> 16; svg_colors[i].green = (c & 0x00ff00) >> 8; svg_colors[i].blue = (c & 0x0000ff); - } else if(dark_colorscheme) { + } else if(tclgetboolvar("dark_colorscheme")) { svg_colors[i].red = 255; svg_colors[i].green = 255; svg_colors[i].blue = 255; @@ -579,8 +579,8 @@ void svg_draw(void) fprintf(errfp, "svg_draw(): calloc error\n");tcleval( "exit"); } fill_svg_colors(); - old_grid=draw_grid; - draw_grid=0; + old_grid=tclgetboolvar("draw_grid"); + tclsetvar("draw_grid", "0"); dx=xctx->xschem_w; dy=xctx->xschem_h; dbg(1, "svg_draw(): dx=%g dy=%g\n", dx, dy); @@ -662,14 +662,14 @@ void svg_draw(void) fprintf(fd, " stroke-linecap:round;\n"); fprintf(fd, " stroke-linejoin:round;\n"); fprintf(fd, " stroke-width: %g;\n", svg_linew); - if(i == 0 && transparent_svg) { + if(i == 0 && tclgetboolvar("transparent_svg")) { fprintf(fd, " fill-opacity: 0;\n"); fprintf(fd, " stroke-opacity: 0;\n"); } fprintf(fd, "}\n"); } - fprintf(fd, "text {font-family: %s;}\n", svg_font_name); + fprintf(fd, "text {font-family: %s;}\n", tclgetvar("svg_font_name")); fprintf(fd, "\n"); /* background */ @@ -679,7 +679,7 @@ void svg_draw(void) { textlayer = xctx->text[i].layer; if(textlayer < 0 || textlayer >= cadlayers) textlayer = TEXTLAYER; - my_snprintf(svg_font_family, S(svg_font_family), svg_font_name); + my_snprintf(svg_font_family, S(svg_font_family), tclgetvar("svg_font_name")); my_snprintf(svg_font_style, S(svg_font_style), "normal"); my_snprintf(svg_font_weight, S(svg_font_weight), "normal"); textfont = xctx->text[i].font; @@ -767,8 +767,7 @@ void svg_draw(void) dbg(1, "svg_draw(): INT_WIDTH(lw)=%d\n",INT_WIDTH(xctx->lw)); fprintf(fd, "\n"); fclose(fd); - - draw_grid=old_grid; + tclsetboolvar("draw_grid", old_grid); my_free(964, &svg_colors); my_free(1217, &unused_layer); Tcl_SetResult(interp,"",TCL_STATIC); diff --git a/src/tedax_netlist.c b/src/tedax_netlist.c index e4658893..b46e5dd8 100644 --- a/src/tedax_netlist.c +++ b/src/tedax_netlist.c @@ -135,7 +135,7 @@ void global_tedax_netlist(int global) /* netlister driver */ dbg(1, "global_tedax_netlist(): starting awk on netlist!\n"); fclose(fd); - if(netlist_show) { + if(tclgetboolvar("netlist_show")) { my_snprintf(tcl_cmd_netlist, S(tcl_cmd_netlist), "netlist {%s} show {%s}", netl_filename, cellname); tcleval(tcl_cmd_netlist); } diff --git a/src/token.c b/src/token.c index 8d239e18..8bd52e72 100644 --- a/src/token.c +++ b/src/token.c @@ -658,7 +658,7 @@ char *get_pin_attr_from_inst(int inst, int pin, const char *attr) return pin_attr_value; /* caller is responsible for freeing up storage for pin_attr_value */ } -void new_prop_string(int i, const char *old_prop, int fast, int disable_unique_names) +void new_prop_string(int i, const char *old_prop, int fast, int dis_uniq_names) { /* given a old_prop property string, return a new */ /* property string in xctx->inst[i].prop_ptr such that the element name is */ @@ -696,7 +696,7 @@ void new_prop_string(int i, const char *old_prop, int fast, int disable_unique_n } prefix=old_name[0]; /* don't change old_prop if name does not conflict. */ - if(disable_unique_names || (entry = inst_hash_lookup(table, old_name, i, XLOOKUP, old_name_len))==NULL || + if(dis_uniq_names || (entry = inst_hash_lookup(table, old_name, i, XLOOKUP, old_name_len))==NULL || entry->value == i) { inst_hash_lookup(table, old_name, i, XINSERT, old_name_len); @@ -1633,7 +1633,7 @@ int print_spice_element(FILE *fd, int inst) token_pos=0; /* if spiceprefix==0 and token == @spiceprefix then set empty value */ - if (!spiceprefix && !strcmp(token, "@spiceprefix")) { + if (!tclgetboolvar("spiceprefix") && !strcmp(token, "@spiceprefix")) { value=NULL; } else { int tok_val_len; @@ -2774,7 +2774,11 @@ const char *translate(int inst, const char* s) int escape=0; char date[200]; char *sch = NULL; + int sp_prefix; + int s_pnetname; + s_pnetname = tclgetboolvar("show_pin_net_names"); + sp_prefix = tclgetboolvar("spiceprefix"); if(!s) { my_free(1063, &result); return empty; @@ -2814,7 +2818,7 @@ const char *translate(int inst, const char* s) /* dbg(2, "translate(): token=%s\n", token);*/ /* if spiceprefix==0 and token == @spiceprefix then set empty value */ - if(!spiceprefix && !strcmp(token, "@spiceprefix")) { + if(!sp_prefix && !strcmp(token, "@spiceprefix")) { value = NULL; xctx->get_tok_size = 0; } else { @@ -2900,7 +2904,7 @@ const char *translate(int inst, const char* s) if( !pin_attr_value && !strcmp(pin_attr, "net_name")) { char *instprop = xctx->inst[inst].prop_ptr; char *symprop = (xctx->inst[inst].ptr + xctx->sym)->prop_ptr; - if(show_pin_net_names && (!strcmp(get_tok_value(instprop, "net_name", 0), "true") || + if(s_pnetname && (!strcmp(get_tok_value(instprop, "net_name", 0), "true") || !strcmp(get_tok_value(symprop, "net_name", 0), "true"))) { prepare_netlist_structs(0); my_strdup2(1175, &pin_attr_value, @@ -3085,7 +3089,7 @@ const char *translate2(struct Lcc *lcc, int level, char* s) token_pos = 0; /* if spiceprefix==0 and token == @spiceprefix then set empty value */ - if(!spiceprefix && !strcmp(token, "@spiceprefix")) { + if(!tclgetboolvar("spiceprefix") && !strcmp(token, "@spiceprefix")) { my_free(1069, &value1); xctx->get_tok_size = 0; } else { diff --git a/src/verilog_netlist.c b/src/verilog_netlist.c index 207f6db0..17dbe099 100644 --- a/src/verilog_netlist.c +++ b/src/verilog_netlist.c @@ -39,7 +39,9 @@ void global_verilog_netlist(int global) /* netlister driver */ struct stat buf; char *subckt_name; char *abs_path = NULL; + int split_f; + split_f = tclgetboolvar("split_files"); xctx->netlist_unconn_cnt=0; /* unique count of unconnected pins while netlisting */ statusmsg("",2); /* clear infowindow */ if(xctx->modified) { @@ -262,7 +264,7 @@ void global_verilog_netlist(int global) /* netlister driver */ fprintf(fd,"---- end user architecture code\n"); fprintf(fd, "endmodule\n"); - if(split_files) { + if(split_f) { fclose(fd); my_snprintf(tcl_cmd_netlist, S(tcl_cmd_netlist), "netlist {%s} noshow {%s}", netl_filename, cellname); override_netlist_type(CAD_VERILOG_NETLIST); @@ -301,9 +303,9 @@ void global_verilog_netlist(int global) /* netlister driver */ if (str_hash_lookup(subckt_table, subckt_name, "", XLOOKUP)==NULL) { str_hash_lookup(subckt_table, subckt_name, "", XINSERT); - if( split_files && strcmp(get_tok_value(xctx->sym[i].prop_ptr,"vhdl_netlist",0),"true")==0 ) + if( split_f && strcmp(get_tok_value(xctx->sym[i].prop_ptr,"vhdl_netlist",0),"true")==0 ) vhdl_block_netlist(fd, i); - else if(split_files && strcmp(get_tok_value(xctx->sym[i].prop_ptr,"spice_netlist",0),"true")==0 ) + else if(split_f && strcmp(get_tok_value(xctx->sym[i].prop_ptr,"spice_netlist",0),"true")==0 ) spice_block_netlist(fd, i); else if( strcmp(get_tok_value(xctx->sym[i].prop_ptr,"verilog_primitive",0), "true")) @@ -331,9 +333,9 @@ void global_verilog_netlist(int global) /* netlister driver */ my_free(1074, &stored_flags); dbg(1, "global_verilog_netlist(): starting awk on netlist!\n"); - if(!split_files) { + if(!split_f) { fclose(fd); - if(netlist_show) { + if(tclgetboolvar("netlist_show")) { my_snprintf(tcl_cmd_netlist, S(tcl_cmd_netlist), "netlist {%s} show {%s}", netl_filename, cellname); tcleval(tcl_cmd_netlist); } @@ -366,7 +368,9 @@ void verilog_block_netlist(FILE *fd, int i) char cellname[PATH_MAX]; const char *str_tmp; char *sch = NULL; + int split_f; + split_f = tclgetboolvar("split_files"); if(!strcmp( get_tok_value(xctx->sym[i].prop_ptr,"verilog_stop",0),"true") ) verilog_stop=1; else @@ -378,7 +382,7 @@ void verilog_block_netlist(FILE *fd, int i) } else { my_strncpy(filename, add_ext(abs_sym_path(xctx->sym[i].name, ""), ".sch"), S(filename)); } - if(split_files) { + if(split_f) { my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d", netlist_dir, skip_dir(xctx->sym[i].name), getpid()); dbg(1, "global_vhdl_netlist(): split_files: netl_filename=%s\n", netl_filename); @@ -491,7 +495,7 @@ void verilog_block_netlist(FILE *fd, int i) } fprintf(fd,"---- end user architecture code\n"); fprintf(fd, "endmodule\n"); - if(split_files) { + if(split_f) { fclose(fd); my_snprintf(tcl_cmd_netlist, S(tcl_cmd_netlist), "netlist {%s} noshow {%s}", netl_filename, cellname); override_netlist_type(CAD_VERILOG_NETLIST); diff --git a/src/vhdl_netlist.c b/src/vhdl_netlist.c index 11682a00..0d57930a 100644 --- a/src/vhdl_netlist.c +++ b/src/vhdl_netlist.c @@ -39,7 +39,9 @@ void global_vhdl_netlist(int global) /* netlister driver */ struct stat buf; char *subckt_name; char *abs_path = NULL; + int split_f; + split_f = tclgetboolvar("split_files"); xctx->netlist_unconn_cnt=0; /* unique count of unconnected pins while netlisting */ statusmsg("",2); /* clear infowindow */ /* top sch properties used for library use declarations and type definitions */ @@ -316,7 +318,7 @@ void global_vhdl_netlist(int global) /* netlister driver */ } fprintf(fd, "end arch_%s ;\n\n", skip_dir( xctx->sch[xctx->currsch]) ); - if(split_files) { + if(split_f) { fclose(fd); my_snprintf(tcl_cmd_netlist, S(tcl_cmd_netlist), "netlist {%s} noshow {%s}", netl_filename, cellname); override_netlist_type(CAD_VHDL_NETLIST); @@ -356,9 +358,9 @@ void global_vhdl_netlist(int global) /* netlister driver */ if (str_hash_lookup(subckt_table, subckt_name, "", XLOOKUP)==NULL) { str_hash_lookup(subckt_table, subckt_name, "", XINSERT); - if( split_files && strcmp(get_tok_value(xctx->sym[i].prop_ptr,"verilog_netlist",0),"true")==0 ) + if( split_f && strcmp(get_tok_value(xctx->sym[i].prop_ptr,"verilog_netlist",0),"true")==0 ) verilog_block_netlist(fd, i); - else if( split_files && strcmp(get_tok_value(xctx->sym[i].prop_ptr,"spice_netlist",0),"true")==0 ) + else if( split_f && strcmp(get_tok_value(xctx->sym[i].prop_ptr,"spice_netlist",0),"true")==0 ) spice_block_netlist(fd, i); else if( strcmp(get_tok_value(xctx->sym[i].prop_ptr,"vhdl_primitive",0),"true")) @@ -386,9 +388,9 @@ void global_vhdl_netlist(int global) /* netlister driver */ draw_hilight_net(1); my_free(1088, &stored_flags); dbg(1, "global_vhdl_netlist(): starting awk on netlist!\n"); - if(!split_files) { + if(!split_f) { fclose(fd); - if(netlist_show) { + if(tclgetboolvar("netlist_show")) { my_snprintf(tcl_cmd_netlist, S(tcl_cmd_netlist), "netlist {%s} show {%s}", netl_filename, cellname); tcleval(tcl_cmd_netlist); } @@ -420,7 +422,9 @@ void vhdl_block_netlist(FILE *fd, int i) const char *str_tmp; char *abs_path = NULL; char *sch = NULL; + int split_f; + split_f = tclgetboolvar("split_files"); if(!strcmp( get_tok_value(xctx->sym[i].prop_ptr,"vhdl_stop",0),"true") ) vhdl_stop=1; else @@ -432,7 +436,7 @@ void vhdl_block_netlist(FILE *fd, int i) } else { my_strncpy(filename, add_ext(abs_sym_path(xctx->sym[i].name, ""), ".sch"), S(filename)); } - if(split_files) { + if(split_f) { my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d", netlist_dir, skip_dir(xctx->sym[i].name), getpid()); dbg(1, "vhdl_block_netlist(): split_files: netl_filename=%s\n", netl_filename); fd=fopen(netl_filename, "w"); @@ -606,7 +610,7 @@ void vhdl_block_netlist(FILE *fd, int i) if(xctx->schvhdlprop && xctx->schvhdlprop[0]) fprintf(fd, "%s\n", xctx->schvhdlprop); fprintf(fd, "end arch_%s ;\n\n", skip_dir(xctx->sym[i].name) ); /* skip_dir( xctx->sch[xctx->currsch]) ); */ - if(split_files) { + if(split_f) { fclose(fd); my_snprintf(tcl_cmd_netlist, S(tcl_cmd_netlist), "netlist {%s} noshow {%s}", netl_filename, cellname); override_netlist_type(CAD_VHDL_NETLIST); diff --git a/src/xinit.c b/src/xinit.c index f53dc2fe..499b9c73 100644 --- a/src/xinit.c +++ b/src/xinit.c @@ -267,7 +267,7 @@ void init_color_array(double dim) double rr, gg, bb; static int done=0; - dim_bg = tclgetvar("color_dim")[0] == '1' ? 1: 0; + dim_bg = tclgetboolvar("color_dim"); for(i=0;i=cadlayers){ tcleval("set colors $dark_colors"); @@ -920,9 +920,11 @@ void change_linewidth(double w) changed=0; /* choose line width automatically based on zoom */ if(w<0.) { - if(change_lw) { - xctx->lw=xctx->mooz * 0.09 * cadsnap; - cadhalfdotsize = CADHALFDOTSIZE + 0.04 * (cadsnap-10); + int cs; + cs = tclgetdoublevar("cadsnap"); + if(tclgetboolvar("change_lw")) { + xctx->lw=xctx->mooz * 0.09 * cs; + cadhalfdotsize = CADHALFDOTSIZE + 0.04 * (cs-10); changed=1; } /* explicitly set line width */ @@ -979,7 +981,8 @@ void resetcairo(int create, int clear, int force_or_resize) fprintf(errfp, "ERROR: invalid cairo xcb surface\n"); } xctx->cairo_save_ctx = cairo_create(xctx->cairo_save_sfc); - cairo_select_font_face(xctx->cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_select_font_face(xctx->cairo_save_ctx, tclgetvar("cairo_font_name"), + CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size(xctx->cairo_save_ctx, 20); cairo_set_line_width(xctx->cairo_save_ctx, 1); cairo_set_line_join(xctx->cairo_save_ctx, CAIRO_LINE_JOIN_ROUND); @@ -1001,7 +1004,8 @@ void resetcairo(int create, int clear, int force_or_resize) fprintf(errfp, "ERROR: invalid cairo surface\n"); } xctx->cairo_ctx = cairo_create(xctx->cairo_sfc); - cairo_select_font_face(xctx->cairo_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_select_font_face(xctx->cairo_ctx, tclgetvar("cairo_font_name"), + CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size(xctx->cairo_ctx, 20); cairo_set_line_width(xctx->cairo_ctx, 1); cairo_set_line_join(xctx->cairo_ctx, CAIRO_LINE_JOIN_ROUND); @@ -1108,6 +1112,7 @@ int Tcl_AppInit(Tcl_Interp *inter) struct stat buf; const char *home_buff; int running_in_src_dir; + int fs; /* XVisualInfo vinfo; */ #if HAS_XCB==1 @@ -1399,8 +1404,6 @@ int Tcl_AppInit(Tcl_Interp *inter) dbg(1, "Tcl_AppInit(): resolved xschem_executable=%s\n", xschem_executable); /* set global variables fetching data from tcl code 25122002 */ - if(tclgetvar("dark_colorscheme")[0] == '1') dark_colorscheme = 1; - else dark_colorscheme = 0; if(netlist_type==-1) { if(!strcmp(tclgetvar("netlist_type"),"vhdl") ) netlist_type=CAD_VHDL_NETLIST; else if(!strcmp(tclgetvar("netlist_type"),"verilog") ) netlist_type=CAD_VERILOG_NETLIST; @@ -1411,33 +1414,26 @@ int Tcl_AppInit(Tcl_Interp *inter) override_netlist_type(-1); /* set tcl netlist_type */ } - split_files=atoi(tclgetvar("split_files")); - netlist_show=atoi(tclgetvar("netlist_show")); - unzoom_nodrift=atoi(tclgetvar("unzoom_nodrift")); - show_pin_net_names = atoi(tclgetvar("show_pin_net_names")); - + cairo_font_line_spacing = tclgetdoublevar("cairo_font_line_spacing"); if(color_ps==-1) color_ps=atoi(tclgetvar("color_ps")); else { my_snprintf(tmp, S(tmp), "%d",color_ps); tclsetvar("color_ps",tmp); } - if(transparent_svg==-1) - transparent_svg=atoi(tclgetvar("transparent_svg")); - else { - my_snprintf(tmp, S(tmp), "%d",transparent_svg); - tclsetvar("transparent_svg",tmp); - } - change_lw=atoi(tclgetvar("change_lw")); l_width=atoi(tclgetvar("line_width")); - if(change_lw == 1) l_width = 0.0; + if(tclgetboolvar("change_lw")) l_width = 0.0; draw_window=atoi(tclgetvar("draw_window")); - incr_hilight=atoi(tclgetvar("incr_hilight")); - enable_stretch=atoi(tclgetvar("enable_stretch")); - big_grid_points=atoi(tclgetvar("big_grid_points")); - draw_grid=atoi(tclgetvar("draw_grid")); cadlayers=atoi(tclgetvar("cadlayers")); if(debug_var==-10) debug_var=0; + my_snprintf(tmp, S(tmp), "%.16g",CADGRID); + Tcl_VarEval(interp, "set_ne cadgrid ", tmp, NULL); + my_snprintf(tmp, S(tmp), "%.16g",CADSNAP); + Tcl_VarEval(interp, "set_ne cadsnap ", tmp, NULL); + cairo_vert_correct = tclgetdoublevar("cairo_vert_correct"); + nocairo_vert_correct = tclgetdoublevar("nocairo_vert_correct"); + cairo_font_scale = tclgetdoublevar("cairo_font_scale"); + only_probes = tclgetdoublevar("only_probes"); /* */ /* [m]allocate dynamic memory */ @@ -1571,8 +1567,6 @@ int Tcl_AppInit(Tcl_Interp *inter) resetwin(1, 0, 1, 0, 0); #if HAS_CAIRO==1 /* load font from tcl 20171112 */ - tcleval("xschem set svg_font_name $svg_font_name"); - tcleval("xschem set cairo_font_name $cairo_font_name"); tclsetvar("has_cairo","1"); #endif @@ -1618,9 +1612,9 @@ int Tcl_AppInit(Tcl_Interp *inter) /* */ if(has_x) tcleval("pack_widgets"); - fullscreen=atoi(tclgetvar("fullscreen")); - if(fullscreen) { - fullscreen = 0; + fs=tclgetintvar("fullscreen"); + if(fs) { + tclsetvar("fullscreen", "0"); tcleval("update"); toggle_fullscreen("."); } diff --git a/src/xschem.h b/src/xschem.h index 43f79fed..b1b67e69 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -712,47 +712,21 @@ extern Xschem_ctx *xctx; extern int cadlayers; extern int has_x; extern int rainbow_colors; -extern int persistent_command; -extern int autotrim_wires; -extern int disable_unique_names; -extern int change_lw; /* allow change line width*/ -extern int incr_hilight; -extern int auto_hilight; -extern int big_grid_points; -extern int draw_grid; -extern double cadgrid; -extern double cadsnap; extern int draw_window; -extern unsigned short enable_stretch; -extern int split_files; -extern char *netlist_dir; -extern int sym_txt; -extern int fullscreen; -extern int en_hilight_conn_inst; -extern int transparent_svg; -extern int color_ps; extern int only_probes; -extern int unzoom_nodrift; -extern int spiceprefix; -extern int netlist_show; -extern double nocairo_vert_correct; -extern double nocairo_font_xscale; -extern double nocairo_font_yscale; -extern char svg_font_name[80]; -extern int top_subckt; +extern char *netlist_dir; +extern int color_ps; extern int constrained_move; extern int netlist_type; -extern int dark_colorscheme; extern int flat_netlist; -extern int hide_symbols; /* draw only a bounding box for component instances and @symname, @name texts */ -extern int show_pin_net_names; extern int *enable_layer; +extern int hide_symbols; +extern int sym_txt; extern double cairo_font_scale; /* default: 1.0, allows to adjust font size */ -extern char cairo_font_name[80]; -extern double cairo_font_line_spacing; /* allows to change line spacing: default: 1.0 */ extern double cairo_vert_correct; +extern double nocairo_vert_correct; +extern double cairo_font_line_spacing; extern int debug_var; -extern double color_dim; /* can not be put in Xctx unless all X11 colors are reset on window change */ /*********** End of variables backed in xschem.tcl ***********/ extern int help; extern char *cad_icon[]; @@ -778,11 +752,6 @@ extern int fill_pattern; /* fill rectangles, can not be put in Xctx, since it s extern int text_svg; extern int text_ps; extern double cadhalfdotsize; -extern XEvent xev; -extern KeySym key; -extern unsigned int button; -extern unsigned int state; /* status of shift,ctrl etc.. */ -extern char *xschem_version_string; extern char initial_netlist_name[PATH_MAX]; extern char bus_char[]; extern int yyparse_error; @@ -802,11 +771,10 @@ extern Window pre_window; extern Window parent_of_topwindow; extern unsigned char **pixdata; extern unsigned char pixdata_init[22][32]; -extern GC *gc, *gcstipple, gctiled; +extern GC *gc, *gcstipple; extern Display *display; extern int screen_number; extern int screendepth; -extern XRectangle *rectangle; extern Pixmap cad_icon_pixmap, cad_icon_mask, *pixmap; extern XColor xcolor_array[]; extern Visual *visual; @@ -1046,7 +1014,13 @@ extern int xschem(ClientData clientdata, Tcl_Interp *interp, extern const char *tcleval(const char str[]); extern const char *tclresult(void); extern const char *tclgetvar(const char *s); +extern int tclgetboolvar(const char *s); +extern int tclgetintvar(const char *s); +extern double tclgetdoublevar(const char *s); extern void tclsetvar(const char *s, const char *value); +extern void tclsetdoublevar(const char *s, const double value); +extern void tclsetboolvar(const char *s, const int value); +extern void tclsetintvar(const char *s, const int value); extern const char *tcl_hook2(char **res); extern void statusmsg(char str[],int n); extern int place_text(int draw_text, double mx, double my); @@ -1092,7 +1066,7 @@ extern void *my_calloc(int id, size_t nmemb, size_t size); extern void my_free(int id, void *ptr); extern size_t my_strcat(int id, char **, const char *); extern const char *subst_token(const char *s, const char *tok, const char *new_val); -extern void new_prop_string(int i, const char *old_prop,int fast, int disable_unique_names); +extern void new_prop_string(int i, const char *old_prop,int fast, int dis_uniq_names); extern void hash_name(char *token, int remove); extern void hash_all_names(int n); extern void symbol_bbox(int i, double *x1,double *y1, double *x2, double *y2); diff --git a/src/xschem.tcl b/src/xschem.tcl index fde55c92..220d0189 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -2011,6 +2011,7 @@ proc select_layers {} { } proc color_dim {} { + global color_dim toplevel .dim -class dialog wm title .dim {Dim colors} checkbutton .dim.bg -text {Dim background} -variable color_dim @@ -2018,7 +2019,7 @@ proc color_dim {} { -showvalue 1 -command {xschem color_dim} -orient horizontal \ -from -5 -to 5 -resolution 0.1 button .dim.ok -text OK -command {destroy .dim} - .dim.scale set [xschem get dim] + .dim.scale set $color_dim pack .dim.scale pack .dim.bg -side left pack .dim.ok -side right -anchor e @@ -3603,34 +3604,22 @@ proc build_widgets { {topwin {} } } { -command { if { $color_ps==1 } {xschem set color_ps 1} else { xschem set color_ps 0} } - $topwin.menubar.option.menu add checkbutton -label "Transparent SVG background" -variable transparent_svg \ - -command { - if { $transparent_svg==1 } {xschem set transparent_svg 1} else { xschem set transparent_svg 0} - } + $topwin.menubar.option.menu add checkbutton -label "Transparent SVG background" -variable transparent_svg $topwin.menubar.option.menu add checkbutton -label "Debug mode" -variable menu_debug_var \ -command { if { $menu_debug_var==1 } {xschem debug 1} else { xschem debug 0} } $topwin.menubar.option.menu add checkbutton -label "Enable stretch" -variable enable_stretch \ - -accelerator Y \ - -command { - if { $enable_stretch==1 } {xschem set enable_stretch 1} else { xschem set enable_stretch 0} - } + -accelerator Y $topwin.menubar.option.menu add checkbutton -label "Show netlist win" -variable netlist_show \ - -accelerator {Shift+A} \ - -command { - if { $netlist_show==1 } {xschem set netlist_show 1} else { xschem set netlist_show 0} - } + -accelerator {Shift+A} $topwin.menubar.option.menu add checkbutton -label "Flat netlist" -variable flat_netlist \ -accelerator : \ -command { if { $flat_netlist==1 } {xschem set flat_netlist 1} else { xschem set flat_netlist 0} } $topwin.menubar.option.menu add checkbutton -label "Split netlist" -variable split_files \ - -accelerator {} \ - -command { - if { $split_files==1 } {xschem set split_files 1} else { xschem set split_files 0} - } + -accelerator {} $topwin.menubar.option.menu add checkbutton -label "hspice / ngspice netlist" -variable hspice_netlist \ -accelerator {} \ -command { @@ -3647,32 +3636,15 @@ proc build_widgets { {topwin {} } } { $topwin.menubar.option.menu add checkbutton -label "Draw grid" -variable draw_grid \ -accelerator {%} \ -command { - if { $draw_grid == 1} { xschem set draw_grid 1; xschem redraw} else { xschem set draw_grid 0; xschem redraw} + xschem redraw } $topwin.menubar.option.menu add checkbutton -label "Variable grid point size" -variable big_grid_points \ - -command { - if { $big_grid_points == 1} { - xschem set big_grid_points 1 - xschem redraw - } else { - xschem set big_grid_points 0 - xschem redraw - } - } + -command { xschem redraw } $topwin.menubar.option.menu add checkbutton -label "Symbol text" -variable sym_txt \ - -accelerator {Ctrl+B} \ - -command { - if { $sym_txt == 1} { xschem set sym_txt 1; xschem redraw} else { xschem set sym_txt 0; xschem redraw} - } + -accelerator {Ctrl+B} -command { xschem set sym_txt $sym_txt; xschem redraw } $topwin.menubar.option.menu add checkbutton -label "Toggle variable line width" -variable change_lw \ - -accelerator {_} \ - -command { - if { $change_lw == 1} { xschem set change_lw 1} else { xschem set change_lw 0} - } - $topwin.menubar.option.menu add checkbutton -label "Increment Hilight Color" -variable incr_hilight \ - -command { - if { $incr_hilight == 1} { xschem set incr_hilight 1} else { xschem set incr_hilight 0} - } + -accelerator {_} + $topwin.menubar.option.menu add checkbutton -label "Increment Hilight Color" -variable incr_hilight $topwin.menubar.option.menu add command -label "Set line width" \ -command { @@ -3814,7 +3786,7 @@ proc build_widgets { {topwin {} } } { } $topwin.menubar.view.menu add checkbutton -label "Show net names on symbol pins" -variable show_pin_net_names \ -command { - xschem set show_pin_net_names $show_pin_net_names + xschem show_pin_net_names xschem redraw } $topwin.menubar.view.menu add checkbutton -label "Show Toolbar" -variable toolbar_visible \ @@ -3830,7 +3802,8 @@ proc build_widgets { {topwin {} } } { $topwin.menubar.prop.menu add command -label "View" -command "xschem view_prop" -accelerator Ctrl+Shift+Q $topwin.menubar.prop.menu add command -background red -label "Edit file (danger!)" \ -command "xschem edit_file" -accelerator Alt+Q - $topwin.menubar.sym.menu add radiobutton -label "Show Symbols" -variable hide_symbols -value 0 \ + $topwin.menubar.sym.menu add radiobutton -label "Show Symbols" \ + -variable hide_symbols -value 0 \ -command {xschem set hide_symbols $hide_symbols; xschem redraw} -accelerator Alt+B $topwin.menubar.sym.menu add radiobutton -label "Show instance Bounding boxes for subcircuit symbols" \ -variable hide_symbols -value 1 \ @@ -3859,11 +3832,8 @@ proc build_widgets { {topwin {} } } { $topwin.menubar.sym.menu add command -label "Create pins from highlight nets" \ -command "xschem print_hilight_net 0" -accelerator Ctrl-J $topwin.menubar.sym.menu add checkbutton -label "Allow duplicated instance names (refdes)" \ - -variable disable_unique_names -command { - xschem set disable_unique_names $disable_unique_names - } - $topwin.menubar.tools.menu add checkbutton -label "Remember last command" -variable persistent_command \ - -command {xschem set persistent_command $persistent_command} + -variable disable_unique_names + $topwin.menubar.tools.menu add checkbutton -label "Remember last command" -variable persistent_command $topwin.menubar.tools.menu add command -label "Insert symbol" -command "xschem place_symbol" -accelerator {Ins, Shift-I} toolbar_create ToolInsertSymbol "xschem place_symbol" "Insert Symbol" $topwin $topwin.menubar.tools.menu add command -label "Insert wire label" -command "xschem net_label 1" -accelerator {Alt-L} @@ -3896,7 +3866,6 @@ proc build_widgets { {topwin {} } } { toolbar_create ToolBreak "xschem break_wires" "Break wires at selected\ninstance pin intersections" $topwin $topwin.menubar.tools.menu add checkbutton -label "Auto Join/Trim Wires" -variable autotrim_wires \ -command { - xschem set autotrim_wires $autotrim_wires if {$autotrim_wires == 1} { xschem trim_wires xschem redraw @@ -3927,16 +3896,9 @@ proc build_widgets { {topwin {} } } { $topwin.menubar.hilight.menu add command -label {Un-highlight selected net/pins} \ -command "xschem unhilight" -accelerator Ctrl+K # 20160413 - $topwin.menubar.hilight.menu add checkbutton -label {Auto-highlight net/pins} -variable auto_hilight \ - -command { - if { $auto_hilight == 1} { - xschem set auto_hilight 1 - } else { - xschem set auto_hilight 0 - } - } + $topwin.menubar.hilight.menu add checkbutton -label {Auto-highlight net/pins} -variable auto_hilight $topwin.menubar.hilight.menu add checkbutton -label {Enable highlight connected instances} \ - -variable en_hilight_conn_inst -command {xschem set en_hilight_conn_inst $en_hilight_conn_inst} + -variable en_hilight_conn_inst $topwin.menubar.simulation.menu add command -label "Set netlist Dir" \ -command { @@ -3969,7 +3931,7 @@ proc build_widgets { {topwin {} } } { $topwin.menubar.simulation.menu add separator $topwin.menubar.simulation.menu add checkbutton -label "LVS netlist: Top level is a .subckt" -variable top_subckt $topwin.menubar.simulation.menu add checkbutton -label "Use 'spiceprefix' attribute" -variable spiceprefix \ - -command {xschem set spiceprefix $spiceprefix; xschem save; xschem reload} + -command {xschem save; xschem reload} toolbar_create Netlist { xschem netlist } "Create netlist" $topwin toolbar_create Simulate " @@ -4235,8 +4197,6 @@ set_ne enable_stretch 0 set_ne constrained_move 0 set_ne draw_grid 1 set_ne big_grid_points 0 -set_ne cadsnap 10 -set_ne cadgrid 20 set_ne persistent_command 0 set_ne autotrim_wires 0 set_ne disable_unique_names 0 @@ -4301,7 +4261,7 @@ set_ne svg_font_name {Sans-Serif} set has_cairo 0 set rotated_text {} ;#20171208 set_ne dark_colorscheme 1 -set_ne color_dim 1 +set_ne color_dim 0.0 ##### set colors if {!$rainbow_colors} { set_ne cadlayers 22 @@ -4382,22 +4342,10 @@ set_initial_dirs set custom_token {lab} set search_value {} set search_exact 0 -xschem set persistent_command $persistent_command -xschem set autotrim_wires $autotrim_wires -xschem set disable_unique_names $disable_unique_names # 20171005 set custom_label_prefix {} -# 20171112 cairo stuff -xschem set cairo_font_scale $cairo_font_scale -xschem set nocairo_font_xscale $nocairo_font_xscale -xschem set nocairo_font_yscale $nocairo_font_yscale -xschem set cairo_font_line_spacing $cairo_font_line_spacing -xschem set cairo_vert_correct $cairo_vert_correct -xschem set nocairo_vert_correct $nocairo_vert_correct -# font name can not be set here as we need to wait for X-initialization -# to complete. Done in xinit.c ### ### build Tk widgets