From 203cf38e1e903a1c97a0a69867be763dcd4f1485 Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Sat, 24 Feb 2024 13:15:43 +0100 Subject: [PATCH] add option `keep_symbols in xschemrc to avoid purging symbols when netlisting /descending hierarchy. Add functions atan, asin,acos, cosh, sinh, atanh,acosh,asinh in wave processor --- src/actions.c | 4 ++-- src/save.c | 55 +++++++++++++++++++++++++++++++++++++++---- src/spice_netlist.c | 5 ++-- src/tedax_netlist.c | 5 ++-- src/verilog_netlist.c | 7 +++--- src/vhdl_netlist.c | 7 +++--- src/xschem.tcl | 4 +++- src/xschemrc | 4 ++++ 8 files changed, 74 insertions(+), 17 deletions(-) diff --git a/src/actions.c b/src/actions.c index 74a3c70d..972d20f3 100644 --- a/src/actions.c +++ b/src/actions.c @@ -2246,7 +2246,7 @@ int descend_schematic(int instnumber, int fallback, int alert) unselect_all(1); dbg(1, "descend_schematic(): filename=%s\n", filename); /* we are descending from a parent schematic downloaded from the web */ - remove_symbols(); + if(!tclgetboolvar("keep_symbols")) remove_symbols(); load_schematic(1, filename, 1, alert); if(xctx->hilight_nets) { prepare_netlist_structs(0); @@ -2293,7 +2293,7 @@ void go_back(int confirm) /* 20171006 add confirm */ } if(save_ok==0) return; unselect_all(1); - remove_symbols(); + if(!tclgetboolvar("keep_symbols")) remove_symbols(); from_embedded_sym=0; if(strstr(xctx->sch[xctx->currsch], ".xschem_embedded_")) { /* when returning after editing an embedded symbol diff --git a/src/save.c b/src/save.c index 2a0722ba..c1571b43 100644 --- a/src/save.c +++ b/src/save.c @@ -1451,6 +1451,15 @@ static double ravg_store(int what , int i, int p, int last, double value) #define DEL 27 /* delay by an anount of sweep axis distance */ #define MAX 28 /* clip data above given argument */ #define MIN 29 /* clip data below given argument */ +#define ATAN 30 +#define ASIN 31 +#define ACOS 32 +#define COSH 33 +#define SINH 34 +#define ATANH 35 +#define ACOSH 36 +#define ASINH 37 + #define ORDER_DERIV 1 /* 1 or 2: 1st order or 2nd order differentiation. 1st order is faster */ @@ -1499,13 +1508,21 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr, c else if(!strcmp(n, "*")) stack1[stackptr1++].i = MULT; else if(!strcmp(n, "/")) stack1[stackptr1++].i = DIVIS; else if(!strcmp(n, "**")) stack1[stackptr1++].i = POW; + else if(!strcmp(n, "atan()")) stack1[stackptr1++].i = ATAN; + else if(!strcmp(n, "asin()")) stack1[stackptr1++].i = ASIN; + else if(!strcmp(n, "acos()")) stack1[stackptr1++].i = ACOS; + else if(!strcmp(n, "tan()")) stack1[stackptr1++].i = TAN; else if(!strcmp(n, "sin()")) stack1[stackptr1++].i = SIN; else if(!strcmp(n, "cos()")) stack1[stackptr1++].i = COS; else if(!strcmp(n, "abs()")) stack1[stackptr1++].i = ABS; else if(!strcmp(n, "sgn()")) stack1[stackptr1++].i = SGN; else if(!strcmp(n, "sqrt()")) stack1[stackptr1++].i = SQRT; - else if(!strcmp(n, "tan()")) stack1[stackptr1++].i = TAN; else if(!strcmp(n, "tanh()")) stack1[stackptr1++].i = TANH; + else if(!strcmp(n, "cosh()")) stack1[stackptr1++].i = COSH; + else if(!strcmp(n, "sinh()")) stack1[stackptr1++].i = SINH; + else if(!strcmp(n, "atanh()")) stack1[stackptr1++].i = ATANH; + else if(!strcmp(n, "acosh()")) stack1[stackptr1++].i = ACOSH; + else if(!strcmp(n, "asinh()")) stack1[stackptr1++].i = ASINH; else if(!strcmp(n, "exp()")) stack1[stackptr1++].i = EXP; else if(!strcmp(n, "ln()")) stack1[stackptr1++].i = LN; else if(!strcmp(n, "log10()")) stack1[stackptr1++].i = LOG10; @@ -1809,18 +1826,48 @@ int plot_raw_custom_data(int sweep_idx, int first, int last, const char *expr, c case SQRT: stack2[stackptr2 - 1] = sqrt(stack2[stackptr2 - 1]); break; - case TAN: - stack2[stackptr2 - 1] = tan(stack2[stackptr2 - 1]); - break; case TANH: stack2[stackptr2 - 1] = tanh(stack2[stackptr2 - 1]); break; + case COSH: + stack2[stackptr2 - 1] = cosh(stack2[stackptr2 - 1]); + break; + case SINH: + stack2[stackptr2 - 1] = sinh(stack2[stackptr2 - 1]); + break; + case ATANH: + tmp = stack2[stackptr2 - 1]; + tmp = 0.5 * log( (1 + tmp) / (1 - tmp) ); + stack2[stackptr2 - 1] = tmp; + break; + case ACOSH: + tmp = stack2[stackptr2 - 1]; + tmp = log(tmp + sqrt(tmp * tmp - 1)); + stack2[stackptr2 - 1] = tmp; + break; + case ASINH: + tmp = stack2[stackptr2 - 1]; + tmp = log(tmp + sqrt(tmp * tmp + 1)); + stack2[stackptr2 - 1] = tmp; + break; + case TAN: + stack2[stackptr2 - 1] = tan(stack2[stackptr2 - 1]); + break; case SIN: stack2[stackptr2 - 1] = sin(stack2[stackptr2 - 1]); break; case COS: stack2[stackptr2 - 1] = cos(stack2[stackptr2 - 1]); break; + case ATAN: + stack2[stackptr2 - 1] = atan(stack2[stackptr2 - 1]); + break; + case ASIN: + stack2[stackptr2 - 1] = asin(stack2[stackptr2 - 1]); + break; + case ACOS: + stack2[stackptr2 - 1] = acos(stack2[stackptr2 - 1]); + break; case ABS: stack2[stackptr2 - 1] = fabs(stack2[stackptr2 - 1]); break; diff --git a/src/spice_netlist.c b/src/spice_netlist.c index 412222b3..5a9eb0cd 100644 --- a/src/spice_netlist.c +++ b/src/spice_netlist.c @@ -422,7 +422,8 @@ int global_spice_netlist(int global) /* netlister driver */ my_strdup2(_ALLOC_ID_, ¤t_dirname_save, xctx->current_dirname); unselect_all(1); - remove_symbols(); /* 20161205 ensure all unused symbols purged before descending hierarchy */ + /* ensure all unused symbols purged before descending hierarchy */ + if(!tclgetboolvar("keep_symbols")) remove_symbols(); /* reload data without popping undo stack, this populates embedded symbols if any */ dbg(1, "global_spice_netlist(): invoking pop_undo(2, 0)\n"); xctx->pop_undo(2, 0); @@ -485,7 +486,7 @@ int global_spice_netlist(int global) /* netlister driver */ xctx->currsch--; unselect_all(1); dbg(1, "global_spice_netlist(): invoking pop_undo(0, 0)\n"); - remove_symbols(); + if(!tclgetboolvar("keep_symbols")) remove_symbols(); xctx->pop_undo(4, 0); xctx->prev_set_modify = save_prev_mod; if(web_url) { diff --git a/src/tedax_netlist.c b/src/tedax_netlist.c index ceb0e521..852f4d61 100644 --- a/src/tedax_netlist.c +++ b/src/tedax_netlist.c @@ -199,7 +199,8 @@ int global_tedax_netlist(int global) /* netlister driver */ char *current_dirname_save = NULL; unselect_all(1); - remove_symbols(); /* 20161205 ensure all unused symbols purged before descending hierarchy */ + /* ensure all unused symbols purged before descending hierarchy */ + if(!tclgetboolvar("keep_symbols")) remove_symbols(); /* reload data without popping undo stack, this populates embedded symbols if any */ xctx->pop_undo(2, 0); /* link_symbols_to_instances(-1); */ /* done in xctx->pop_undo() */ @@ -243,7 +244,7 @@ int global_tedax_netlist(int global) /* netlister driver */ my_free(_ALLOC_ID_, &xctx->sch[xctx->currsch]); xctx->currsch--; unselect_all(1); - remove_symbols(); + if(!tclgetboolvar("keep_symbols")) remove_symbols(); xctx->pop_undo(4, 0); xctx->prev_set_modify = save_prev_mod; if(web_url) { diff --git a/src/verilog_netlist.c b/src/verilog_netlist.c index cddaa7d8..462273a2 100644 --- a/src/verilog_netlist.c +++ b/src/verilog_netlist.c @@ -149,7 +149,7 @@ int global_verilog_netlist(int global) /* netlister driver */ fprintf(fd,"module %s (\n", get_cell( xctx->sch[xctx->currsch], 0) ); /* flush data structures (remove unused symbols) */ unselect_all(1); - remove_symbols(); /* removed 25122002, readded 04112003 */ + if(!tclgetboolvar("keep_symbols")) remove_symbols(); /* reload data without popping undo stack, this populates embedded symbols if any */ xctx->pop_undo(2, 0); /* link_symbols_to_instances(-1); */ /* done in xctx->pop_undo() */ @@ -316,7 +316,8 @@ int global_verilog_netlist(int global) /* netlister driver */ char *current_dirname_save = NULL; unselect_all(1); - remove_symbols(); /* 20161205 ensure all unused symbols purged before descending hierarchy */ + /* ensure all unused symbols purged before descending hierarchy */ + if(!tclgetboolvar("keep_symbols")) remove_symbols(); /* reload data without popping undo stack, this populates embedded symbols if any */ xctx->pop_undo(2, 0); /* link_symbols_to_instances(-1); */ /* done in xctx->pop_undo() */ @@ -364,7 +365,7 @@ int global_verilog_netlist(int global) /* netlister driver */ my_free(_ALLOC_ID_, &xctx->sch[xctx->currsch]); xctx->currsch--; unselect_all(1); - remove_symbols(); + if(!tclgetboolvar("keep_symbols")) remove_symbols(); xctx->pop_undo(4, 0); xctx->prev_set_modify = save_prev_mod; if(web_url) { diff --git a/src/vhdl_netlist.c b/src/vhdl_netlist.c index 114d8660..e3c50f60 100644 --- a/src/vhdl_netlist.c +++ b/src/vhdl_netlist.c @@ -184,7 +184,7 @@ int global_vhdl_netlist(int global) /* netlister driver */ /* flush data structures (remove unused symbols) */ unselect_all(1); - remove_symbols(); /* removed 25122002, readded 04112003.. this removes unused symbols */ + if(!tclgetboolvar("keep_symbols")) remove_symbols(); /* reload data without popping undo stack, this populates embedded symbols if any */ xctx->pop_undo(2, 0); /* link_symbols_to_instances(-1); */ /* done in xctx->pop_undo() */ @@ -404,7 +404,8 @@ int global_vhdl_netlist(int global) /* netlister driver */ str_hash_init(&subckt_table, HASHSIZE); unselect_all(1); - remove_symbols(); /* 20161205 ensure all unused symbols purged before descending hierarchy */ + /* ensure all unused symbols purged before descending hierarchy */ + if(!tclgetboolvar("keep_symbols")) remove_symbols(); /* reload data without popping undo stack, this populates embedded symbols if any */ xctx->pop_undo(2, 0); /* link_symbols_to_instances(-1); */ /* done in xctx->pop_undo() */ @@ -453,7 +454,7 @@ int global_vhdl_netlist(int global) /* netlister driver */ my_free(_ALLOC_ID_, &xctx->sch[xctx->currsch]); xctx->currsch--; unselect_all(1); - remove_symbols(); + if(!tclgetboolvar("keep_symbols")) remove_symbols(); xctx->pop_undo(4, 0); xctx->prev_set_modify = save_prev_mod; if(web_url) { diff --git a/src/xschem.tcl b/src/xschem.tcl index 51650804..45cc1909 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -6705,7 +6705,7 @@ set tctx::global_list { graph_change_done graph_digital graph_linewidth_mult graph_logx graph_logy graph_rainbow graph_schname graph_sel_color graph_sel_wave graph_selected graph_sort graph_unlocked hide_empty_graphs hide_symbols tctx::hsize - incr_hilight incremental_select infowindow_text launcher_default_program + incr_hilight incremental_select infowindow_text keep_symbols launcher_default_program light_colors line_width live_cursor2_backannotate local_netlist_dir lvs_ignore lvs_netlist measure_text netlist_dir netlist_show netlist_type no_ask_save no_change_attrs nolist_libs noprint_libs old_selected_tok only_probes path pathlist @@ -8165,6 +8165,8 @@ set_ne xschem_listen_port {} # set a port number in xschemrc if you want xschem to be able to cross-probe to bespice set_ne bespice_listen_port {} +set_ne keep_symbols 0 ;# if set loaded symbols will not be purged when descending/netlisting. + # hide instance details (show only bbox) set_ne hide_symbols 0 # show net names if symbol has attributes like @#n:net_name (where n = pin number or pin name) diff --git a/src/xschemrc b/src/xschemrc index 2d81a2bc..f4d01122 100644 --- a/src/xschemrc +++ b/src/xschemrc @@ -247,6 +247,10 @@ #### instead of looking only in symbol directory. Default: disabled (0). # set search_schematic 0 +#### keep symbols encountered while netlisting / descending the hierarchy. +#### Default: not enabled (0) +# set keep_symbols 0 + #### focus the schematic window if mouse goes over it, even if a dialog box #### is displayed, without needing to click. #### This allows to move/zoom/pan the schematic while editing attributes.