From 52405a29c739a75fdbde044cfa5cb63970697f18 Mon Sep 17 00:00:00 2001 From: Stefan Frederik Date: Fri, 16 Sep 2022 17:01:59 +0200 Subject: [PATCH] restructured graph dialog box, added min/max x, adjusted sweep variables vertical aligmnent, added atof_spice() that recognizes spice suffixes (12p, 4.2MEG etc) --- src/callback.c | 4 ++-- src/draw.c | 14 ++++++------ src/editprop.c | 34 +++++++++++++++++++++++++++++ src/scheduler.c | 2 +- src/xschem.h | 1 + src/xschem.tcl | 57 ++++++++++++++++++++++++++++++++++--------------- 6 files changed, 85 insertions(+), 27 deletions(-) diff --git a/src/callback.c b/src/callback.c index 8f47213f..66a7ac45 100644 --- a/src/callback.c +++ b/src/callback.c @@ -314,9 +314,9 @@ static int waves_callback(int event, int mx, int my, KeySym key, int button, int gr->master_gx1 = 0; gr->master_gx2 = 1e-6; val = get_tok_value(xctx->rect[GRIDLAYER][xctx->graph_master].prop_ptr,"x1",0); - if(val[0]) gr->master_gx1 = atof(val); + if(val[0]) gr->master_gx1 = atof_spice(val); val = get_tok_value(xctx->rect[GRIDLAYER][xctx->graph_master].prop_ptr,"x2",0); - if(val[0]) gr->master_gx2 = atof(val); + if(val[0]) gr->master_gx2 = atof_spice(val); if(gr->master_gx1 == gr->master_gx2) gr->master_gx2 += 1e-6; gr->master_gw = gr->master_gx2 - gr->master_gx1; diff --git a/src/draw.c b/src/draw.c index 78512a6d..308afd93 100644 --- a/src/draw.c +++ b/src/draw.c @@ -1978,9 +1978,9 @@ void setup_graph_data(int i, const int flags, int skip, Graph_ctx *gr) gr->gx1 = 0; gr->gx2 = 1e-6; val = get_tok_value(r->prop_ptr,"x1",0); - if(val[0]) gr->gx1 = atof(val); + if(val[0]) gr->gx1 = atof_spice(val); val = get_tok_value(r->prop_ptr,"x2",0); - if(val[0]) gr->gx2 = atof(val); + if(val[0]) gr->gx2 = atof_spice(val); if(gr->gx1 == gr->gx2) gr->gx2 += 1e-6; gr->gw = gr->gx2 - gr->gx1; } @@ -2044,17 +2044,17 @@ void setup_graph_data(int i, const int flags, int skip, Graph_ctx *gr) val = get_tok_value(r->prop_ptr,"logy",0); if(val[0] == '1') gr->logy = 1; val = get_tok_value(r->prop_ptr,"y1",0); - if(val[0]) gr->gy1 = atof(val); + if(val[0]) gr->gy1 = atof_spice(val); val = get_tok_value(r->prop_ptr,"y2",0); - if(val[0]) gr->gy2 = atof(val); + if(val[0]) gr->gy2 = atof_spice(val); if(gr->gy1 == gr->gy2) gr->gy2 += 1.0; val = get_tok_value(r->prop_ptr,"digital",0); if(val[0]) gr->digital = atoi(val); if(gr->digital) { val = get_tok_value(r->prop_ptr,"ypos1",0); - if(val[0]) gr->ypos1 = atof(val); + if(val[0]) gr->ypos1 = atof_spice(val); val = get_tok_value(r->prop_ptr,"ypos2",0); - if(val[0]) gr->ypos2 = atof(val); + if(val[0]) gr->ypos2 = atof_spice(val); if(gr->ypos2 == gr->ypos1) gr->ypos2 += 1.0; } gr->posh = gr->ypos2 - gr->ypos1; @@ -2193,7 +2193,7 @@ static void draw_graph_variables(int wcnt, int wave_color, int n_nodes, int swee if(gr->unitx != 1.0) my_snprintf(tmpstr, S(tmpstr), "%s[%c]", stok ? stok : "" , gr->unitx_suffix); else my_snprintf(tmpstr, S(tmpstr), "%s", stok ? stok : ""); draw_string(wave_color, NOW, tmpstr, 2, 1, 0, 0, - gr->rx1 + 2 + gr->rw / n_nodes * wcnt, gr->ry2-1, gr->txtsizelab, gr->txtsizelab); + gr->rx1 + 2 + gr->rw / n_nodes * wcnt, gr->ry2-5, gr->txtsizelab, gr->txtsizelab); } /* draw node labels in graph */ if(bus_msb) { diff --git a/src/editprop.c b/src/editprop.c index 24e785d4..f71fa6c3 100644 --- a/src/editprop.c +++ b/src/editprop.c @@ -287,6 +287,40 @@ size_t my_strdup2(int id, char **dest, const char *src) /* 20150409 duplicates a return 0; } +/* recognizes spice suffixes: 12p --> 1.2e11, 3MEG --> 3e6 */ +double atof_spice(const char *s) +{ + int n; + double a = 0.0, mul=1.0; + char lower_s[100]; + const char *p; + + if(!s) return 0.0; + my_strncpy(lower_s, s, S(lower_s)); + strtolower(lower_s); + n = sscanf(lower_s, "%lf", &a); + if(n == 1) { + p = strpbrk(lower_s, "tgmkunpfa"); + if(!p) mul = 1.0; + else if(*p == 't') mul=1e12; + else if(*p == 'g') mul=1e9; + else if(*p == 'm') { + if(strstr(p, "meg") == p) mul=1e6; + else if(strstr(p, "mil") == p) mul=25.4e-6; + else mul=1e-3; + } + else if(*p == 'k') mul=1e3; + else if(*p == 'u') mul=1e-6; + else if(*p == 'n') mul=1e-9; + else if(*p == 'p') mul=1e-12; + else if(*p == 'f') mul=1e-15; + else if(*p == 'a') mul=1e-18; + else mul = 1.0; + a *= mul; + } + return a; +} + char *my_itoa(int i) { static char s[30]; diff --git a/src/scheduler.c b/src/scheduler.c index 73ff0d94..f40b1ccd 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -3080,7 +3080,7 @@ double tclgetdoublevar(const char *s) dbg(0, "%s\n", tclresult()); return 0.0; } - return atof(p); + return atof_spice(p); } int tclgetintvar(const char *s) diff --git a/src/xschem.h b/src/xschem.h index ad5e1021..841b70c4 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -1315,6 +1315,7 @@ extern void my_free(int id, void *ptr); extern size_t my_strcat(int id, char **, const char *); extern size_t my_mstrcat(int id, char **str, const char *append_str, ...); extern char *my_itoa(int i); +extern double atof_spice(const char *s); extern char *dtoa(double i); extern char *dtoa_prec(double i); extern double my_round(double a); diff --git a/src/xschem.tcl b/src/xschem.tcl index f86052e2..7632a913 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -1690,7 +1690,6 @@ proc graph_edit_properties {n} { # center right frame label .graphdialog.center.right.lab1 -text {Signals in graph} - checkbutton .graphdialog.center.right.unlocked -text {Unlocked X axis} -variable graph_unlocked text .graphdialog.center.right.text1 -wrap none -width 50 -height 10 -bg grey70 -fg black \ -insertbackground grey40 -exportselection 1 \ -yscrollcommand {.graphdialog.center.right.yscroll set} \ @@ -1698,7 +1697,7 @@ proc graph_edit_properties {n} { scrollbar .graphdialog.center.right.yscroll -command {.graphdialog.center.right.text1 yview} scrollbar .graphdialog.center.right.xscroll -orient horiz -command {.graphdialog.center.right.text1 xview} - grid .graphdialog.center.right.lab1 .graphdialog.center.right.unlocked + grid .graphdialog.center.right.lab1 grid .graphdialog.center.right.text1 - .graphdialog.center.right.yscroll -sticky nsew grid .graphdialog.center.right.xscroll - -sticky nsew grid rowconfig .graphdialog.center.right 0 -weight 0 @@ -1716,8 +1715,10 @@ proc graph_edit_properties {n} { if { [xschem get schname] eq $graph_schname } { update_graph_node [string trim [.graphdialog.center.right.text1 get 1.0 {end - 1 chars}] " \n"] - xschem setprop rect 2 $graph_selected y1 [.graphdialog.top.min get] fast - xschem setprop rect 2 $graph_selected y2 [.graphdialog.top.max get] fast + xschem setprop rect 2 $graph_selected x1 [.graphdialog.top3.xmin get] fast + xschem setprop rect 2 $graph_selected x2 [.graphdialog.top3.xmax get] fast + xschem setprop rect 2 $graph_selected y1 [.graphdialog.top3.min get] fast + xschem setprop rect 2 $graph_selected y2 [.graphdialog.top3.max get] fast if {$graph_unlocked} { xschem setprop rect 2 $graph_selected flags {graph,unlocked} fast @@ -1737,8 +1738,10 @@ proc graph_edit_properties {n} { if { [xschem get schname] eq $graph_schname } { update_graph_node [string trim [.graphdialog.center.right.text1 get 1.0 {end - 1 chars}] " \n"] - xschem setprop rect 2 $graph_selected y1 [.graphdialog.top.min get] fast - xschem setprop rect 2 $graph_selected y2 [.graphdialog.top.max get] fast + xschem setprop rect 2 $graph_selected x1 [.graphdialog.top3.xmin get] fast + xschem setprop rect 2 $graph_selected x2 [.graphdialog.top3.xmax get] fast + xschem setprop rect 2 $graph_selected y1 [.graphdialog.top3.min get] fast + xschem setprop rect 2 $graph_selected y2 [.graphdialog.top3.max get] fast if {$graph_unlocked} { xschem setprop rect 2 $graph_selected flags {graph,unlocked} fast } else { @@ -1849,6 +1852,7 @@ proc graph_edit_properties {n} { checkbutton .graphdialog.top.bus -text Bus -padx 2 -variable graph_bus checkbutton .graphdialog.top.incr -text {Incr. sort} -variable graph_sort -indicatoron 1 \ -command fill_graph_listbox + checkbutton .graphdialog.top.unlocked -text {Unlocked X axis} -variable graph_unlocked checkbutton .graphdialog.top.dig -text {Digital} -variable graph_digital -indicatoron 1 \ -command { if { [xschem get schname] eq $graph_schname } { @@ -1857,17 +1861,32 @@ proc graph_edit_properties {n} { } } - label .graphdialog.top.labmin -text { Min Value:} - entry .graphdialog.top.min -width 5 - bind .graphdialog.top.min { - xschem setprop rect 2 $graph_selected y1 [.graphdialog.top.min get] + label .graphdialog.top3.xlabmin -text { X min:} + entry .graphdialog.top3.xmin -width 7 + bind .graphdialog.top3.xmin { + xschem setprop rect 2 $graph_selected x1 [.graphdialog.top3.xmin get] xschem draw_graph $graph_selected } - label .graphdialog.top.labmax -text { Max Value:} - entry .graphdialog.top.max -width 5 - bind .graphdialog.top.max { - xschem setprop rect 2 $graph_selected y2 [.graphdialog.top.max get] + label .graphdialog.top3.xlabmax -text { X max:} + entry .graphdialog.top3.xmax -width 7 + bind .graphdialog.top3.xmax { + xschem setprop rect 2 $graph_selected x2 [.graphdialog.top3.xmax get] + xschem draw_graph $graph_selected + } + + + label .graphdialog.top3.labmin -text { Y min:} + entry .graphdialog.top3.min -width 7 + bind .graphdialog.top3.min { + xschem setprop rect 2 $graph_selected y1 [.graphdialog.top3.min get] + xschem draw_graph $graph_selected + } + + label .graphdialog.top3.labmax -text { Y max:} + entry .graphdialog.top3.max -width 7 + bind .graphdialog.top3.max { + xschem setprop rect 2 $graph_selected y2 [.graphdialog.top3.max get] xschem draw_graph $graph_selected } @@ -1880,9 +1899,11 @@ proc graph_edit_properties {n} { pack .graphdialog.top.incr -side left pack .graphdialog.top.bus -side left pack .graphdialog.top.dig -side left - pack .graphdialog.top.labmin .graphdialog.top.min .graphdialog.top.labmax .graphdialog.top.max -side left - .graphdialog.top.min insert 0 [xschem getprop rect 2 $graph_selected y1] - .graphdialog.top.max insert 0 [xschem getprop rect 2 $graph_selected y2] + pack .graphdialog.top.unlocked -side left + .graphdialog.top3.min insert 0 [xschem getprop rect 2 $graph_selected y1] + .graphdialog.top3.max insert 0 [xschem getprop rect 2 $graph_selected y2] + .graphdialog.top3.xmin insert 0 [xschem getprop rect 2 $graph_selected x1] + .graphdialog.top3.xmax insert 0 [xschem getprop rect 2 $graph_selected x2] # top3 frame set graph_logx [xschem getprop rect 2 $graph_selected logx] @@ -1923,6 +1944,8 @@ proc graph_edit_properties {n} { } } pack .graphdialog.top3.logx .graphdialog.top3.logy -side left + pack .graphdialog.top3.xlabmin .graphdialog.top3.xmin .graphdialog.top3.xlabmax .graphdialog.top3.xmax -side left + pack .graphdialog.top3.labmin .graphdialog.top3.min .graphdialog.top3.labmax .graphdialog.top3.max -side left # binding bind .graphdialog.top.search { fill_graph_listbox