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:
parent
783b5c7aaa
commit
354f027b9b
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
27
src/draw.c
27
src/draw.c
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
38
src/token.c
38
src/token.c
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue