call translate(-1, ..) for text objects containing @... and referencing no valid instance (floater=true) so non instance-related @vars are resolved. translate(): resolve @spice_get_voltage(net) without trying to calculated fqnet from net if no valid inst (-1) is given

This commit is contained in:
stefan schippers 2024-02-26 16:05:11 +01:00
parent 783b5c7aaa
commit 354f027b9b
6 changed files with 67 additions and 24 deletions

View File

@ -123,9 +123,11 @@ const char *get_text_floater(int i)
dbg(1, "floater: %s\n",txt_ptr);
} else {
/* do just a tcl substitution if floater does not reference an existing instance
* (but name=something attribute must be present) and text matches tcleval(...) */
if(strstr(txt_ptr, "tcleval(") == txt_ptr) {
my_strdup2(_ALLOC_ID_, &xctx->text[i].floater_ptr, tcl_hook2(xctx->text[i].txt_ptr));
* (but name=something or floater=something attribute must be present) and text
* matches tcleval(...) or contains '@' */
if(strstr(txt_ptr, "tcleval(") == txt_ptr || strchr(txt_ptr, '@')) {
/* my_strdup2(_ALLOC_ID_, &xctx->text[i].floater_ptr, tcl_hook2(xctx->text[i].txt_ptr)); */
my_strdup2(_ALLOC_ID_, &xctx->text[i].floater_ptr, translate(-1, xctx->text[i].txt_ptr));
txt_ptr = xctx->text[i].floater_ptr;
}
}

View File

@ -1188,6 +1188,33 @@ void drawline(int c, int what, double linex1, double liney1, double linex2, doub
i=0;
}
}
void drawbezier(void)
{
XPoint p[512];
int i = 0;
double t;
double x1=100.0;
double y1=-400.0;
double x2=500.0;
double y2=-800.0;
double x3=800.0;
double y3=-200.0;
double x4=1100.0;
double y4=-400.0;
double x, y;
i = 0;
for(t = 0; t <= 1.0; t += 0.00390625 /* 1/256 */) {
x = pow(1-t, 3) * x1 + 3 * pow(1-t, 2) * t * x2 + 3 * (1-t) * pow(t, 2) * x3 + pow(t, 3) * x4;
y = pow(1-t, 3) * y1 + 3 * pow(1-t, 2) * t * y2 + 3 * (1-t) * pow(t, 2) * y3 + pow(t, 3) * y4;
p[i].x = (short)X_TO_SCREEN(x);
p[i].y = (short)Y_TO_SCREEN(y);
i++;
}
XDrawLines(display, xctx->window, xctx->gc[4], p, i, CoordModeOrigin);
XDrawLines(display, xctx->save_pixmap, xctx->gc[4], p, i, CoordModeOrigin);
}
void drawtempline(GC gc, int what, double linex1,double liney1,double linex2,double liney2)
{

View File

@ -5263,6 +5263,9 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
dbg(0, "graph_flags=%d\n", xctx->graph_flags);
Tcl_ResetResult(interp);
}
else if(argc > 2 && atoi(argv[2]) == 3) {
drawbezier();
}
}
/* text x y rot flip text props size draw

View File

@ -3601,7 +3601,11 @@ const char *translate(int inst, const char* s)
my_free(_ALLOC_ID_, &translated_tok);
return empty;
}
instname = xctx->inst[inst].instname ? xctx->inst[inst].instname : "";
if(inst >= xctx->instances) {
dbg(0, "translate(): instance number out of bounds: %d\n", inst);
return empty;
}
instname = (inst >=0 && xctx->inst[inst].instname) ? xctx->inst[inst].instname : "";
sim_is_xyce = tcleval("sim_is_xyce")[0] == '1' ? 1 : 0;
level = xctx->currsch;
lcc = xctx->hier_attr;
@ -3639,14 +3643,14 @@ const char *translate(int inst, const char* s)
STR_ALLOC(&result, tmp + result_pos, &size);
memcpy(result+result_pos, instname, tmp+1);
result_pos+=tmp;
} else if(strcmp(token,"@symref")==0) {
} else if(inst >= 0 && strcmp(token,"@symref")==0) {
tmp_sym_name = get_sym_name(inst, 9999, 1);
tmp_sym_name=tmp_sym_name ? tmp_sym_name : "";
tmp=strlen(tmp_sym_name);
STR_ALLOC(&result, tmp + result_pos, &size);
memcpy(result+result_pos,tmp_sym_name, tmp+1);
result_pos+=tmp;
} else if(strcmp(token,"@symname")==0) {
} else if(inst >= 0 && strcmp(token,"@symname")==0) {
tmp_sym_name = get_sym_name(inst, 0, 0);
tmp_sym_name=tmp_sym_name ? tmp_sym_name : "";
tmp=strlen(tmp_sym_name);
@ -3659,7 +3663,7 @@ const char *translate(int inst, const char* s)
STR_ALLOC(&result, tmp + result_pos, &size);
memcpy(result+result_pos, path, tmp+1);
result_pos+=tmp;
} else if(strcmp(token,"@symname_ext")==0) {
} else if(inst >= 0 && strcmp(token,"@symname_ext")==0) {
tmp_sym_name = get_sym_name(inst, 0, 1);
tmp_sym_name=tmp_sym_name ? tmp_sym_name : "";
tmp=strlen(tmp_sym_name);
@ -3667,7 +3671,7 @@ const char *translate(int inst, const char* s)
memcpy(result+result_pos,tmp_sym_name, tmp+1);
result_pos+=tmp;
/* recognize single pins 15112003 */
} else if(token[0]=='@' && token[1]=='@' && xctx->inst[inst].ptr >= 0) {
} else if(inst >= 0 && token[0]=='@' && token[1]=='@' && xctx->inst[inst].ptr >= 0) {
int i, multip;
int no_of_pins= (xctx->inst[inst].ptr + xctx->sym)->rects[PINLAYER];
prepare_netlist_structs(0);
@ -3683,7 +3687,7 @@ const char *translate(int inst, const char* s)
break;
}
}
} else if(token[0]=='@' && token[1]=='#') {
} else if(inst >= 0 && token[0]=='@' && token[1]=='#') {
value = get_pin_attr(token, inst, s_pnetname);
if(value) {
tmp=strlen(value);
@ -3692,7 +3696,7 @@ const char *translate(int inst, const char* s)
result_pos+=tmp;
my_free(_ALLOC_ID_, &value);
}
} else if(strcmp(token,"@sch_last_modified")==0 && xctx->inst[inst].ptr >= 0) {
} else if(inst >= 0 && strcmp(token,"@sch_last_modified")==0 && xctx->inst[inst].ptr >= 0) {
get_sch_from_sym(file_name, xctx->inst[inst].ptr + xctx->sym, inst, 0);
if(!stat(file_name , &time_buf)) {
@ -3702,7 +3706,7 @@ const char *translate(int inst, const char* s)
memcpy(result+result_pos, date, tmp+1);
result_pos+=tmp;
}
} else if(strcmp(token,"@sym_last_modified")==0) {
} else if(inst >= 0 && strcmp(token,"@sym_last_modified")==0) {
my_strncpy(file_name, abs_sym_path(tcl_hook2(xctx->inst[inst].name), ""), S(file_name));
if(!stat(file_name , &time_buf)) {
tm=localtime(&(time_buf.st_mtime) );
@ -3740,13 +3744,13 @@ const char *translate(int inst, const char* s)
STR_ALLOC(&result, tmp + result_pos, &size);
memcpy(result+result_pos, topsch, tmp+1);
result_pos+=tmp;
} else if(strcmp(token,"@prop_ptr")==0 && xctx->inst[inst].prop_ptr) {
} else if(inst >= 0 && strcmp(token,"@prop_ptr")==0 && xctx->inst[inst].prop_ptr) {
tmp=strlen(xctx->inst[inst].prop_ptr);
STR_ALLOC(&result, tmp + result_pos, &size);
memcpy(result+result_pos,xctx->inst[inst].prop_ptr, tmp+1);
result_pos+=tmp;
}
else if(strcmp(token,"@spice_get_voltage")==0 && xctx->inst[inst].ptr >= 0)
else if(inst >= 0 && strcmp(token,"@spice_get_voltage")==0 && xctx->inst[inst].ptr >= 0)
{
int start_level; /* hierarchy level where waves were loaded */
int live = tclgetboolvar("live_cursor2_backannotate");
@ -3841,7 +3845,7 @@ const char *translate(int inst, const char* s)
if(global_net == NULL) global_net = net;
else global_net++;
if(record_global_node(3, NULL, global_net)) {
if(inst < 0 || record_global_node(3, NULL, global_net)) {
strtolower(net);
my_snprintf(fqnet, len, "%s", global_net);
} else {
@ -3849,7 +3853,7 @@ const char *translate(int inst, const char* s)
my_snprintf(fqnet, len, "%s%s.%s", path, instname, net);
}
strtolower(fqnet);
dbg(1, "translate(): net=%s, fqnet=%s start_level=%d\n", net, fqnet, start_level);
dbg(1, "translate(): inst=%d, net=%s, fqnet=%s start_level=%d\n", inst, net, fqnet, start_level);
idx = get_raw_index(fqnet, NULL);
if(idx >= 0) {
val = xctx->raw->cursor_b_val[idx];
@ -3867,7 +3871,7 @@ const char *translate(int inst, const char* s)
memcpy(result+result_pos, valstr, len+1);
result_pos += len;
}
dbg(1, "inst %d, net=%s, fqnet=%s idx=%d valstr=%s\n", inst, net, fqnet, idx, valstr);
dbg(1, "instname %s, net=%s, fqnet=%s idx=%d valstr=%s\n", instname, net, fqnet, idx, valstr);
my_free(_ALLOC_ID_, &fqnet);
}
my_free(_ALLOC_ID_, &net);
@ -3937,14 +3941,14 @@ const char *translate(int inst, const char* s)
memcpy(result+result_pos, valstr, len+1);
result_pos += len;
}
dbg(1, "inst %d, dev=%s, fqdev=%s idx=%d valstr=%s\n", inst, dev, fqdev, idx, valstr);
dbg(1, "instname %s, dev=%s, fqdev=%s idx=%d valstr=%s\n", instname, dev, fqdev, idx, valstr);
my_free(_ALLOC_ID_, &fqdev);
} /* if(n == 1) */
my_free(_ALLOC_ID_, &dev);
} /* if(path) */
} /* if((start_level = sch_waves_loaded()) >= 0 && xctx->raw->annot_p>=0) */
}
else if(strcmp(token,"@spice_get_diff_voltage")==0 && xctx->inst[inst].ptr >= 0)
else if(inst >= 0 && strcmp(token,"@spice_get_diff_voltage")==0 && xctx->inst[inst].ptr >= 0)
{
int start_level; /* hierarchy level where waves were loaded */
int live = tclgetboolvar("live_cursor2_backannotate");
@ -4065,7 +4069,7 @@ const char *translate(int inst, const char* s)
memcpy(result+result_pos, valstr, len+1);
result_pos += len;
}
dbg(1, "inst %d, dev=%s, fqdev=%s idx=%d valstr=%s\n", inst, dev, fqdev, idx, valstr);
dbg(1, "instname %s, dev=%s, fqdev=%s idx=%d valstr=%s\n", instname, dev, fqdev, idx, valstr);
my_free(_ALLOC_ID_, &fqdev);
my_free(_ALLOC_ID_, &dev);
}
@ -4113,7 +4117,7 @@ const char *translate(int inst, const char* s)
/* if spiceprefix==0 and token == @spiceprefix then set empty value */
} else if(!sp_prefix && !strcmp(token, "@spiceprefix")) {
/* add nothing */
} else {
} else if(inst >= 0) {
value = get_tok_value(xctx->inst[inst].prop_ptr, token+1, 0);
if(!xctx->tok_size && xctx->inst[inst].ptr >= 0) {
value=get_tok_value((xctx->inst[inst].ptr + xctx->sym)->templ, token+1, 0);

View File

@ -1391,6 +1391,7 @@ extern void drawarc(int c, int what, double x, double y, double r, double a, dou
extern void filledarc(int c, int what, double x, double y, double r, double a, double b);
extern void drawtemppolygon(GC gc, int what, double *x, double *y, int points);
extern void drawpolygon(int c, int what, double *x, double *y, int points, int poly_fill, int dash);
extern void drawbezier(void);
extern void draw_temp_symbol(int what, GC gc, int n,int layer,
short tmp_flip, short tmp_rot, double xoffset, double yoffset);
extern void draw_temp_string(GC gc,int what, const char *str, short rot, short flip, int hcenter, int vcenter,

View File

@ -69,8 +69,8 @@ dataset=-1
B 2 1050 -470 1680 -190 {flags=graph,unlocked
rawfile=$netlist_dir/cmos_example_ngspice.raw
sim_type=tran
y1=0.578703
y2=5.5787
y1=1.4
y2=5
divy=5
subdivy=1
x1=0
@ -90,7 +90,7 @@ xlabmag=1.4}
B 2 1050 -740 1680 -530 {flags=graph,unlocked
rawfile=$netlist_dir/cmos_example_ngspice.raw
sim_type=ac
y1=-53
y1=-34
y2=43
subdivy=1
@ -114,7 +114,7 @@ ylabmag=1.2}
B 2 1050 -960 1680 -750 {flags=graph,unlocked
rawfile=$netlist_dir/cmos_example_ngspice.raw
sim_type=ac
y1=37
y1=21
y2=180
divy=4
subdivy=1
@ -177,6 +177,10 @@ T {AC Analysis} 1060 -1010 0 0 0.6 0.6 { layer=6}
T {Transient Analysis} 1060 -510 0 0 0.6 0.6 { layer=6}
T {DC Analysis} 1690 -1000 0 0 0.6 0.6 { layer=6}
T {Loaded Raw files:} 20 -1010 0 0 0.6 0.6 {}
T {tcleval(Power: [to_eng [xschem raw value power 0]]W)} 820 -570 0 0 0.4 0.4 {floater=-1 layer=15}
T {Example of fetching a user
parameter saved in raw file.} 730 -630 0 0 0.4 0.4 { layer=15}
T {Power: @spice_get_voltage(power)\\W} 820 -540 0 0 0.4 0.4 {floater=true layer=15}
N 30 -310 30 -280 {
lab=VCC}
N 30 -310 60 -310 {
@ -331,6 +335,8 @@ value=".temp 30
.control
save all alli
op
let power=-v(vcc) * i(vvcc)
settype power power
write cmos_example_ngspice.raw
set appendwrite
dc vminus 2.3 2.7 0.001