made edit_symbol_property and tcl edit_prop procedure much simpler when user clicks another instance while edit_prop dialog still open

This commit is contained in:
schippes 2020-08-16 03:34:45 +02:00
parent 58a43ccc4d
commit 9570439e16
17 changed files with 111 additions and 150 deletions

View File

@ -149,7 +149,7 @@ int set_netlist_dir(int force, char *dir)
if(dir) my_snprintf(cmd, S(cmd), "select_netlist_dir %d %s", force, dir); if(dir) my_snprintf(cmd, S(cmd), "select_netlist_dir %d %s", force, dir);
else my_snprintf(cmd, S(cmd), "select_netlist_dir %d", force); else my_snprintf(cmd, S(cmd), "select_netlist_dir %d", force);
tcleval(cmd); tcleval(cmd);
if(!strcmp("", Tcl_GetStringResult(interp)) ) { if(!strcmp("", tclresult()) ) {
return 0; return 0;
} }
return 1; return 1;
@ -161,7 +161,7 @@ const char *abs_sym_path(const char *s, const char *ext)
char c[PATH_MAX+1000]; char c[PATH_MAX+1000];
my_snprintf(c, S(c), "abs_sym_path {%s} {%s}", s, ext); my_snprintf(c, S(c), "abs_sym_path {%s} {%s}", s, ext);
tcleval(c); tcleval(c);
return Tcl_GetStringResult(interp); return tclresult();
} }
/* Wrapper to Tcl function */ /* Wrapper to Tcl function */
@ -170,7 +170,7 @@ const char *rel_sym_path(const char *s)
char c[PATH_MAX+1000]; char c[PATH_MAX+1000];
my_snprintf(c, S(c), "rel_sym_path {%s}", s); my_snprintf(c, S(c), "rel_sym_path {%s}", s);
tcleval(c); tcleval(c);
return Tcl_GetStringResult(interp); return tclresult();
} }
const char *add_ext(const char *f, const char *ext) const char *add_ext(const char *f, const char *ext)
@ -437,7 +437,7 @@ const char *get_file_path(char *f)
char tmp[2*PATH_MAX+100]; char tmp[2*PATH_MAX+100];
my_snprintf(tmp, S(tmp),"get_file_path \"%s\"", f); my_snprintf(tmp, S(tmp),"get_file_path \"%s\"", f);
tcleval(tmp); tcleval(tmp);
return Tcl_GetStringResult(interp); return tclresult();
} }
int save(int confirm) /* 20171006 add confirm */ int save(int confirm) /* 20171006 add confirm */
@ -451,8 +451,8 @@ int save(int confirm) /* 20171006 add confirm */
{ {
if(confirm) { if(confirm) {
tcleval("ask_save"); tcleval("ask_save");
if(!strcmp(Tcl_GetStringResult(interp), "") ) cancel=1; if(!strcmp(tclresult(), "") ) cancel=1;
if(!strcmp(Tcl_GetStringResult(interp), "yes") ) save_ok = save_schematic(schematic[currentsch]); if(!strcmp(tclresult(), "yes") ) save_ok = save_schematic(schematic[currentsch]);
} else { } else {
save_ok = save_schematic(schematic[currentsch]); save_ok = save_schematic(schematic[currentsch]);
} }
@ -479,7 +479,7 @@ void saveas(const char *f) /* changed name from ask_save_file to saveas 2012120
} }
tcleval(name); tcleval(name);
my_strncpy(res, Tcl_GetStringResult(interp), S(res)); my_strncpy(res, tclresult(), S(res));
} }
else if(f) { else if(f) {
my_strncpy(res, f, S(res)); my_strncpy(res, f, S(res));
@ -505,7 +505,7 @@ void ask_new_file(void)
if(save(1)) return; /* user cancels save, so do nothing. */ if(save(1)) return; /* user cancels save, so do nothing. */
} }
tcleval("load_file_dialog {Load Schematic} .sch.sym INITIALLOADDIR"); tcleval("load_file_dialog {Load Schematic} .sch.sym INITIALLOADDIR");
my_snprintf(fullname, S(fullname),"%s", Tcl_GetStringResult(interp)); my_snprintf(fullname, S(fullname),"%s", tclresult());
if( fullname[0] ) { if( fullname[0] ) {
@ -893,7 +893,7 @@ int place_symbol(int pos, const char *symbol_name, double x, double y, int rot,
if(current_type==SYMBOL) return 0; /* 20161210 dont allow components placed inside symbols */ if(current_type==SYMBOL) return 0; /* 20161210 dont allow components placed inside symbols */
if(symbol_name==NULL) { if(symbol_name==NULL) {
tcleval("load_file_dialog {Choose symbol} .sym INITIALINSTDIR"); tcleval("load_file_dialog {Choose symbol} .sym INITIALINSTDIR");
my_strncpy(name, Tcl_GetStringResult(interp), S(name)); my_strncpy(name, tclresult(), S(name));
} else { } else {
my_strncpy(name, symbol_name, S(name)); my_strncpy(name, symbol_name, S(name));
} }
@ -1094,7 +1094,7 @@ void descend_schematic(void)
my_strncpy(filename, schematic[currentsch], S(filename)); my_strncpy(filename, schematic[currentsch], S(filename));
my_snprintf(cmd, S(cmd), "save_file_dialog {Save file} .sch.sym INITIALLOADDIR {%s}", filename); my_snprintf(cmd, S(cmd), "save_file_dialog {Save file} .sch.sym INITIALLOADDIR {%s}", filename);
tcleval(cmd); tcleval(cmd);
my_strncpy(res, Tcl_GetStringResult(interp), S(res)); my_strncpy(res, tclresult(), S(res));
if(!res[0]) return; /* 20071104 */ if(!res[0]) return; /* 20071104 */
dbg(1, "descend_schematic(): saving: %s\n",res); dbg(1, "descend_schematic(): saving: %s\n",res);
save_ok = save_schematic(res); save_ok = save_schematic(res);
@ -1139,7 +1139,7 @@ void descend_schematic(void)
Tcl_VarEval(interp, "input_line ", "{input instance number (leftmost = 1) to descend into:\n" Tcl_VarEval(interp, "input_line ", "{input instance number (leftmost = 1) to descend into:\n"
"negative numbers select instance starting\nfrom the right (rightmost = -1)}" "negative numbers select instance starting\nfrom the right (rightmost = -1)}"
" {} 1 6", NULL); " {} 1 6", NULL);
inum = Tcl_GetStringResult(interp); inum = tclresult();
dbg(1, "descend_schematic(): inum=%s\n", inum); dbg(1, "descend_schematic(): inum=%s\n", inum);
if(!inum[0]) { if(!inum[0]) {
my_free(710, &sch_path[currentsch+1]); my_free(710, &sch_path[currentsch+1]);
@ -1203,8 +1203,8 @@ void go_back(int confirm) /* 20171006 add confirm */
{ {
if(confirm) { if(confirm) {
tcleval("ask_save"); tcleval("ask_save");
if(!strcmp(Tcl_GetStringResult(interp), "yes") ) save_ok = save_schematic(schematic[currentsch]); if(!strcmp(tclresult(), "yes") ) save_ok = save_schematic(schematic[currentsch]);
else if(!strcmp(Tcl_GetStringResult(interp), "") ) return; else if(!strcmp(tclresult(), "") ) return;
} else { } else {
save_ok = save_schematic(schematic[currentsch]); save_ok = save_schematic(schematic[currentsch]);
} }

View File

@ -654,7 +654,7 @@ int callback(int event, int mx, int my, KeySym key,
if(semaphore >= 2) break; if(semaphore >= 2) break;
if(modified) { if(modified) {
tcleval("tk_messageBox -type okcancel -message {UNSAVED data: want to exit?}"); tcleval("tk_messageBox -type okcancel -message {UNSAVED data: want to exit?}");
if(strcmp(Tcl_GetStringResult(interp),"ok")==0) { if(strcmp(tclresult(),"ok")==0) {
tcleval( "exit"); tcleval( "exit");
} }
} }
@ -755,7 +755,7 @@ int callback(int event, int mx, int my, KeySym key,
if(semaphore >= 2) break; /* 20180914 */ if(semaphore >= 2) break; /* 20180914 */
if(current_type==SCHEMATIC) { if(current_type==SCHEMATIC) {
tcleval("tk_messageBox -type okcancel -message {do you want to make symbol view ?}"); tcleval("tk_messageBox -type okcancel -message {do you want to make symbol view ?}");
if(strcmp(Tcl_GetStringResult(interp),"ok")==0) if(strcmp(tclresult(),"ok")==0)
{ {
save_schematic(schematic[currentsch]); save_schematic(schematic[currentsch]);
make_symbol(); make_symbol();
@ -893,7 +893,7 @@ int callback(int event, int mx, int my, KeySym key,
{ {
if(semaphore >= 2) break; if(semaphore >= 2) break;
tcleval("tk_messageBox -type okcancel -message {Are you sure you want to reload from disk?}"); tcleval("tk_messageBox -type okcancel -message {Are you sure you want to reload from disk?}");
if(strcmp(Tcl_GetStringResult(interp),"ok")==0) { if(strcmp(tclresult(),"ok")==0) {
char filename[PATH_MAX]; char filename[PATH_MAX];
unselect_all(); unselect_all();
remove_symbols(); remove_symbols();
@ -1440,9 +1440,9 @@ int callback(int event, int mx, int my, KeySym key,
ui_state |= STARTPAN2; ui_state |= STARTPAN2;
break; break;
} }
else if(semaphore >= 2) { else if(semaphore >= 2) { /* button1 click to select another instance while edit prop dialog open */
if(button==Button1 && state==0) { if(button==Button1 && state==0 && tclgetvar("edit_symbol_prop_new_sel")[0]) {
tcleval("set editprop_semaphore 2"); /* 20160423 */ tcleval("set edit_symbol_prop_new_sel 1; .dialog.f1.b1 invoke"); /* invoke 'OK' of edit prop dialog */
} }
break; break;
} }

View File

@ -51,7 +51,7 @@ void print_image()
if(!plotfile[0]) { if(!plotfile[0]) {
my_strdup(60, &tmpstring, "tk_getSaveFile -title {Select destination file} -initialdir $env(PWD)"); my_strdup(60, &tmpstring, "tk_getSaveFile -title {Select destination file} -initialdir $env(PWD)");
tcleval(tmpstring); tcleval(tmpstring);
r = Tcl_GetStringResult(interp); r = tclresult();
my_free(717, &tmpstring); my_free(717, &tmpstring);
if(r[0]) my_strncpy(plotfile, r, S(plotfile)); if(r[0]) my_strncpy(plotfile, r, S(plotfile));
else return; else return;

View File

@ -793,34 +793,6 @@ static char *old_prop=NULL;
static int i=-1; static int i=-1;
static int netlist_commands; static int netlist_commands;
void fill_symbol_editprop_form(int x)
{
/* 20160423 if no more stuff selected close editprop toplevel form */
if(lastselected==0 || selectedgroup[0].type!=ELEMENT) {
Tcl_GlobalEval(interp, "set editprop_semaphore 0");
return;
}
i=selectedgroup[0].n;
dbg(1, "fill_symbol_editprop_form(): element %d property=%s\n",i,inst_ptr[i].prop_ptr);
dbg(1, "fill_symbol_editprop_form(): modified=%d\n", modified);
dbg(1, "fill_symbol_editprop_form(): symbol=%s\n", inst_ptr[i].name);
if(inst_ptr[i].prop_ptr!=NULL) {
dbg(1, "fill_symbol_editprop_form(): element %d property=%s\n",i,inst_ptr[i].prop_ptr);
if(netlist_commands && x==1) {
/* 20070318 */
tclsetvar("retval",get_tok_value( inst_ptr[i].prop_ptr,"value",0));
} else {
tclsetvar("retval",inst_ptr[i].prop_ptr);
}
}
else {
tclsetvar("retval","");
}
my_strdup(91, &old_prop, inst_ptr[i].prop_ptr);
tclsetvar("symbol",inst_ptr[i].name);
}
/* x=0 use text widget x=1 use vim editor */ /* x=0 use text widget x=1 use vim editor */
void edit_symbol_property(int x) void edit_symbol_property(int x)
{ {
@ -831,11 +803,22 @@ void edit_symbol_property(int x)
if ((inst_ptr[i].ptr + instdef)->type!=NULL) if ((inst_ptr[i].ptr + instdef)->type!=NULL)
netlist_commands = !strcmp( (inst_ptr[i].ptr+instdef)->type, "netlist_commands"); netlist_commands = !strcmp( (inst_ptr[i].ptr+instdef)->type, "netlist_commands");
fill_symbol_editprop_form( x); if(inst_ptr[i].prop_ptr!=NULL) {
if(netlist_commands && x==1) {
tclsetvar("retval",get_tok_value( inst_ptr[i].prop_ptr,"value",0));
} else {
tclsetvar("retval",inst_ptr[i].prop_ptr);
}
}
else {
tclsetvar("retval","");
}
my_strdup(91, &old_prop, inst_ptr[i].prop_ptr);
tclsetvar("symbol",inst_ptr[i].name);
if(x==0) { if(x==0) {
tcleval("edit_prop {Input property:}"); tcleval("edit_prop {Input property:}");
my_strdup(77, &result, Tcl_GetStringResult(interp)); my_strdup(77, &result, tclresult());
} }
else { else {
/* edit_vi_netlist_prop will replace \" with " before editing, /* edit_vi_netlist_prop will replace \" with " before editing,
@ -844,7 +827,7 @@ void edit_symbol_property(int x)
if(netlist_commands && x==1) tcleval("edit_vi_netlist_prop {Input property:}"); if(netlist_commands && x==1) tcleval("edit_vi_netlist_prop {Input property:}");
else if(x==1) tcleval("edit_vi_prop {Input property:}"); else if(x==1) tcleval("edit_vi_prop {Input property:}");
else if(x==2) tcleval("viewdata $::retval"); else if(x==2) tcleval("viewdata $::retval");
my_strdup(78, &result, Tcl_GetStringResult(interp)); my_strdup(78, &result, tclresult());
} }
dbg(1, "edit_symbol_property(): before update_symbol, modified=%d\n", modified); dbg(1, "edit_symbol_property(): before update_symbol, modified=%d\n", modified);
update_symbol(result, x); update_symbol(result, x);
@ -868,6 +851,7 @@ void update_symbol(const char *result, int x)
int cond, allow_change_name; int cond, allow_change_name;
int pushed=0; /* 20150327 */ int pushed=0; /* 20150327 */
dbg(1, "update_symbol(): entering\n");
i=selectedgroup[0].n; /* 20110413 */ i=selectedgroup[0].n; /* 20110413 */
if(!result) { if(!result) {
dbg(1, "update_symbol(): edit symbol prop aborted\n"); dbg(1, "update_symbol(): edit symbol prop aborted\n");
@ -1035,14 +1019,6 @@ void update_symbol(const char *result, int x)
dbg(1, "update_symbol(): redrawing inst_ptr.txtprop string\n"); dbg(1, "update_symbol(): redrawing inst_ptr.txtprop string\n");
draw(); draw();
bbox(END,0.0,0.0,0.0,0.0); bbox(END,0.0,0.0,0.0,0.0);
/* 20160308 added if(), leave edited objects selected after updating properties */
/* unless i am clicking another element with edit property dialog box open */
/* in this latter case the last pointed element remains selected. */
if( !strcmp(tclgetvar("editprop_semaphore"), "2")) {
unselect_all();
select_object(mousex,mousey,SELECTED, 0);
}
rebuild_selected_array();
my_free(731, &name); my_free(731, &name);
my_free(732, &ptr); my_free(732, &ptr);
my_free(733, &new_prop); my_free(733, &new_prop);
@ -1147,7 +1123,7 @@ void edit_property(int x)
tcleval("edit_vi_prop {Global schematic property:}"); tcleval("edit_vi_prop {Global schematic property:}");
} }
else if(x==2) tcleval("viewdata $::retval"); else if(x==2) tcleval("viewdata $::retval");
dbg(1, "edit_property(): done executing edit_vi_prop, result=%s\n",Tcl_GetStringResult(interp)); dbg(1, "edit_property(): done executing edit_vi_prop, result=%s\n",tclresult());
dbg(1, "edit_property(): rcode=%s\n",tclgetvar("rcode") ); dbg(1, "edit_property(): rcode=%s\n",tclgetvar("rcode") );
if(strcmp(tclgetvar("rcode"),"") ) if(strcmp(tclgetvar("rcode"),"") )
{ {
@ -1202,6 +1178,17 @@ void edit_property(int x)
{ {
case ELEMENT: case ELEMENT:
edit_symbol_property(x); edit_symbol_property(x);
while( x == 0 && tclgetvar("edit_symbol_prop_new_sel")[0] == '1' ) {
unselect_all();
select_object(mousex, mousey, SELECTED, 0);
rebuild_selected_array();
if(lastselected && selectedgroup[0].type ==ELEMENT) {
edit_symbol_property(0);
} else {
break;
}
}
tclsetvar("edit_symbol_prop_new_sel", "");
break; break;
case ARC: case ARC:
edit_arc_property(); edit_arc_property();

View File

@ -373,14 +373,14 @@ int check_lib(char *s)
found=0; found=0;
tcleval("llength $xschem_libs"); tcleval("llength $xschem_libs");
range = atoi(Tcl_GetStringResult(interp)); range = atoi(tclresult());
dbg(1, "check_lib(): %s, range=%d\n", s, range); dbg(1, "check_lib(): %s, range=%d\n", s, range);
for(i=0;i<range;i++){ for(i=0;i<range;i++){
my_snprintf(str, S(str), "lindex $xschem_libs %d",i); my_snprintf(str, S(str), "lindex $xschem_libs %d",i);
tcleval(str); tcleval(str);
dbg(1, "check_lib(): xschem_libs=%s\n", Tcl_GetStringResult(interp)); dbg(1, "check_lib(): xschem_libs=%s\n", tclresult());
if( strstr(s,Tcl_GetStringResult(interp))) found=1; if( strstr(s,tclresult())) found=1;
} }
if(found) return 0; if(found) return 0;
else return 1; else return 1;

View File

@ -290,8 +290,8 @@ void merge_file(int selection_load, const char ext[])
if(!strcmp(ext,"")) { /* 20071215 */ if(!strcmp(ext,"")) { /* 20071215 */
my_snprintf(tmp, S(tmp), "load_file_dialog {Merge file} {.sch.sym} INITIALLOADDIR", ext); my_snprintf(tmp, S(tmp), "load_file_dialog {Merge file} {.sch.sym} INITIALLOADDIR", ext);
tcleval(tmp); tcleval(tmp);
if(!strcmp(Tcl_GetStringResult(interp),"")) return; if(!strcmp(tclresult(),"")) return;
my_strncpy(name, (char *)Tcl_GetStringResult(interp), S(name)); /* 20180925 */ my_strncpy(name, (char *)tclresult(), S(name)); /* 20180925 */
} }
else { /* 20071215 */ else { /* 20071215 */
my_strncpy(name, ext, S(name)); my_strncpy(name, ext, S(name));

View File

@ -367,7 +367,7 @@ static void fill_ps_colors()
for(i=0;i<cadlayers;i++) { for(i=0;i<cadlayers;i++) {
my_snprintf(s, S(s), "lindex $ps_colors %d", i); my_snprintf(s, S(s), "lindex $ps_colors %d", i);
tcleval( s); tcleval( s);
sscanf(Tcl_GetStringResult(interp),"%x", &c); sscanf(tclresult(),"%x", &c);
ps_colors[i].red = (c & 0xff0000) >> 16; ps_colors[i].red = (c & 0xff0000) >> 16;
ps_colors[i].green = (c & 0x00ff00) >> 8; ps_colors[i].green = (c & 0x00ff00) >> 8;
ps_colors[i].blue = (c & 0x0000ff); ps_colors[i].blue = (c & 0x0000ff);
@ -389,7 +389,7 @@ void ps_draw(void)
my_strdup(59, &tmp, "tk_getSaveFile -title {Select destination file} -initialdir $env(PWD)"); my_strdup(59, &tmp, "tk_getSaveFile -title {Select destination file} -initialdir $env(PWD)");
tcleval(tmp); tcleval(tmp);
my_free(878, &tmp); my_free(878, &tmp);
r = Tcl_GetStringResult(interp); r = tclresult();
if(r[0]) my_strncpy(plotfile, r, S(plotfile)); if(r[0]) my_strncpy(plotfile, r, S(plotfile));
else { else {
return; return;

View File

@ -1838,7 +1838,7 @@ void create_sch_from_sym(void)
my_strcat(354, &savecmd, schname); my_strcat(354, &savecmd, schname);
my_strcat(355, &savecmd, " ?\nWARNING: This schematic file already exists, it will be overwritten\""); my_strcat(355, &savecmd, " ?\nWARNING: This schematic file already exists, it will be overwritten\"");
tcleval(savecmd); tcleval(savecmd);
if(strcmp(Tcl_GetStringResult(interp), "yes") ) { if(strcmp(tclresult(), "yes") ) {
my_free(914, &savecmd); my_free(914, &savecmd);
return; return;
} }

View File

@ -213,7 +213,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
else if(!strcmp(argv[1],"make_symbol")) else if(!strcmp(argv[1],"make_symbol"))
{ {
if(has_x) tcleval("tk_messageBox -type okcancel -message {do you want to make symbol view ?}"); if(has_x) tcleval("tk_messageBox -type okcancel -message {do you want to make symbol view ?}");
if(!has_x || strcmp(Tcl_GetStringResult(interp),"ok")==0) if(!has_x || strcmp(tclresult(),"ok")==0)
if(current_type==SCHEMATIC) if(current_type==SCHEMATIC)
{ {
save_schematic(schematic[currentsch]); save_schematic(schematic[currentsch]);
@ -373,7 +373,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
{ {
if(modified && has_x) { if(modified && has_x) {
tcleval("tk_messageBox -type okcancel -message {UNSAVED data: want to exit?}"); tcleval("tk_messageBox -type okcancel -message {UNSAVED data: want to exit?}");
if(strcmp(Tcl_GetStringResult(interp),"ok")==0) tcleval( "exit"); if(strcmp(tclresult(),"ok")==0) tcleval( "exit");
} }
else tcleval( "exit"); else tcleval( "exit");
Tcl_ResetResult(interp); Tcl_ResetResult(interp);
@ -1109,12 +1109,9 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
} }
} }
else if(!strcmp(argv[1],"fill_symbol_editprop_form") ) {
fill_symbol_editprop_form(0);
}
else if(!strcmp(argv[1],"update_symbol") ) { else if(!strcmp(argv[1],"update_symbol") ) {
if(argc >= 3) update_symbol(argv[2],0); if(argc >= 3) update_symbol(argv[2],0);
else update_symbol(NULL, 0);
} }
else if(!strcmp(argv[1], "print_hilight_net") && argc == 3) { else if(!strcmp(argv[1], "print_hilight_net") && argc == 3) {
@ -1941,10 +1938,14 @@ void tcleval(const char str[])
{ {
dbg(2, "tcleval(): %s\n", str); dbg(2, "tcleval(): %s\n", str);
/* if( Tcl_EvalEx(interp, str, -1, TCL_EVAL_GLOBAL) != TCL_OK) {*/ /* if( Tcl_EvalEx(interp, str, -1, TCL_EVAL_GLOBAL) != TCL_OK) {*/
if( Tcl_Eval(interp, str) != TCL_OK) { if( Tcl_GlobalEval(interp, str) != TCL_OK) {
fprintf(errfp, "tcleval(): evaluation of script: %s failed\n", str); fprintf(errfp, "tcleval(): evaluation of script: %s failed\n", str);
} }
} }
const char *tclresult(void)
{
return Tcl_GetStringResult(interp);
}
void tclsetvar(const char *s, const char *value) void tclsetvar(const char *s, const char *value)
{ {

View File

@ -393,7 +393,7 @@ static void fill_svg_colors()
for(i=0;i<cadlayers;i++) { for(i=0;i<cadlayers;i++) {
my_snprintf(s, S(s), "lindex $svg_colors %d", i); my_snprintf(s, S(s), "lindex $svg_colors %d", i);
tcleval( s); tcleval( s);
sscanf(Tcl_GetStringResult(interp),"%x", &c); sscanf(tclresult(),"%x", &c);
svg_colors[i].red = (c & 0xff0000) >> 16; svg_colors[i].red = (c & 0xff0000) >> 16;
svg_colors[i].green = (c & 0x00ff00) >> 8; svg_colors[i].green = (c & 0x00ff00) >> 8;
svg_colors[i].blue = (c & 0x0000ff); svg_colors[i].blue = (c & 0x0000ff);
@ -419,7 +419,7 @@ void svg_draw(void)
if(!plotfile[0]) { if(!plotfile[0]) {
my_strdup(61, &tmpstring, "tk_getSaveFile -title {Select destination file} -initialdir $env(PWD)"); my_strdup(61, &tmpstring, "tk_getSaveFile -title {Select destination file} -initialdir $env(PWD)");
tcleval(tmpstring); tcleval(tmpstring);
r = Tcl_GetStringResult(interp); r = tclresult();
my_free(963, &tmpstring); my_free(963, &tmpstring);
if(r[0]) my_strncpy(plotfile, r, S(plotfile)); if(r[0]) my_strncpy(plotfile, r, S(plotfile));
else return; else return;

View File

@ -1544,7 +1544,7 @@ void print_spice_element(FILE *fd, int inst)
my_snprintf(tclcmd, s, "tclpropeval {%s} {%s} {%s}", token, name, inst_ptr[inst].name); my_snprintf(tclcmd, s, "tclpropeval {%s} {%s} {%s}", token, name, inst_ptr[inst].name);
dbg(1, "tclpropeval {%s} {%s} {%s}", token, name, inst_ptr[inst].name); dbg(1, "tclpropeval {%s} {%s} {%s}", token, name, inst_ptr[inst].name);
tcleval(tclcmd); tcleval(tclcmd);
fprintf(fd, "%s", Tcl_GetStringResult(interp)); fprintf(fd, "%s", tclresult());
my_free(1018, &tclcmd); my_free(1018, &tclcmd);
} /* /20171029 */ } /* /20171029 */
/* 20151028 dont print escaping backslashes */ /* 20151028 dont print escaping backslashes */
@ -1798,7 +1798,7 @@ void print_tedax_element(FILE *fd, int inst)
Tcl_ResetResult(interp); Tcl_ResetResult(interp);
my_snprintf(tclcmd, s, "tclpropeval {%s} {%s} {%s}", token, name, inst_ptr[inst].name); my_snprintf(tclcmd, s, "tclpropeval {%s} {%s} {%s}", token, name, inst_ptr[inst].name);
tcleval(tclcmd); tcleval(tclcmd);
fprintf(fd, "%s", Tcl_GetStringResult(interp)); fprintf(fd, "%s", tclresult());
my_free(1032, &tclcmd); my_free(1032, &tclcmd);
/* fprintf(errfp, "%s\n", tclcmd); */ /* fprintf(errfp, "%s\n", tclcmd); */
} /* /20171029 */ } /* /20171029 */
@ -2175,7 +2175,7 @@ void print_vhdl_primitive(FILE *fd, int inst) /* netlist primitives, 20071217 *
Tcl_ResetResult(interp); Tcl_ResetResult(interp);
my_snprintf(tclcmd, s, "tclpropeval {%s} {%s} {%s}", token, name, inst_ptr[inst].name); my_snprintf(tclcmd, s, "tclpropeval {%s} {%s} {%s}", token, name, inst_ptr[inst].name);
tcleval(tclcmd); tcleval(tclcmd);
fprintf(fd, "%s", Tcl_GetStringResult(interp)); fprintf(fd, "%s", tclresult());
my_free(1049, &tclcmd); my_free(1049, &tclcmd);
} }
@ -2347,7 +2347,7 @@ void print_verilog_primitive(FILE *fd, int inst) /* netlist switch level primiti
Tcl_ResetResult(interp); Tcl_ResetResult(interp);
my_snprintf(tclcmd, s, "tclpropeval {%s} {%s} {%s}", token, name, inst_ptr[inst].name); my_snprintf(tclcmd, s, "tclpropeval {%s} {%s} {%s}", token, name, inst_ptr[inst].name);
tcleval(tclcmd); tcleval(tclcmd);
fprintf(fd, "%s", Tcl_GetStringResult(interp)); fprintf(fd, "%s", tclresult());
my_free(1057, &tclcmd); my_free(1057, &tclcmd);
} }
/* 20180911 dont print escaping backslashes */ /* 20180911 dont print escaping backslashes */

View File

@ -17,11 +17,12 @@ END { endfile(_filename_) }
BEGIN{ BEGIN{
} }
/if(.*) *my_free/{ /Tcl_GetStringResult\(interp\)/{
$0 = gensub(/( +)(if\(.*\) +)(my_free.*)/, "\\1\\3","1")
found = 1 found = 1
gsub(/Tcl_GetStringResult\(interp\)/, "tclresult()")
} }
function replace_pattern(old, new) function replace_pattern(old, new)
{ {
if($0 ~ old) { if($0 ~ old) {

View File

@ -165,7 +165,7 @@ void windowid()
mainwindow=Tk_MainWindow(interp); mainwindow=Tk_MainWindow(interp);
display = Tk_Display(mainwindow); display = Tk_Display(mainwindow);
tcleval( "winfo id ."); tcleval( "winfo id .");
sscanf(Tcl_GetStringResult(interp), "0x%x", (unsigned int *) &ww); sscanf(tclresult(), "0x%x", (unsigned int *) &ww);
framewin = ww; framewin = ww;
XQueryTree(display, framewin, &rootwindow, &parent_of_topwindow, &framewin_child_ptr, &framewindow_nchildren); XQueryTree(display, framewin, &rootwindow, &parent_of_topwindow, &framewin_child_ptr, &framewindow_nchildren);
dbg(1,"framewinID=%x\n", (unsigned int) framewin); dbg(1,"framewinID=%x\n", (unsigned int) framewin);
@ -393,9 +393,9 @@ void init_color_array(double dim)
for(i=0;i<cadlayers;i++) { for(i=0;i<cadlayers;i++) {
my_snprintf(s, S(s), "lindex $colors %d",i); my_snprintf(s, S(s), "lindex $colors %d",i);
tcleval(s); tcleval(s);
dbg(2, "init_color_array(): color:%s\n",Tcl_GetStringResult(interp)); dbg(2, "init_color_array(): color:%s\n",tclresult());
sscanf(Tcl_GetStringResult(interp), "#%02x%02x%02x", &r, &g, &b);/* 20171123 */ sscanf(tclresult(), "#%02x%02x%02x", &r, &g, &b);/* 20171123 */
rr=r; gg=g; bb=b; rr=r; gg=g; bb=b;
if( (i!=BACKLAYER) ) { if( (i!=BACKLAYER) ) {
@ -672,17 +672,17 @@ int build_colors(double dim) /* 20171113 */
int i; int i;
if(dark_colorscheme) { if(dark_colorscheme) {
tcleval("llength $dark_colors"); tcleval("llength $dark_colors");
if(atoi(Tcl_GetStringResult(interp))>=cadlayers){ if(atoi(tclresult())>=cadlayers){
tcleval("set colors $dark_colors"); tcleval("set colors $dark_colors");
} }
} else { } else {
tcleval("llength $light_colors"); tcleval("llength $light_colors");
if(atoi(Tcl_GetStringResult(interp)) >=cadlayers){ if(atoi(tclresult()) >=cadlayers){
tcleval("set colors $light_colors"); tcleval("set colors $light_colors");
} }
} }
tcleval("llength $colors"); tcleval("llength $colors");
if(atoi(Tcl_GetStringResult(interp))<cadlayers){ if(atoi(tclresult())<cadlayers){
fprintf(errfp,"Tcl var colors not set correctly\n"); fprintf(errfp,"Tcl var colors not set correctly\n");
return -1; /* fail */ return -1; /* fail */
} }
@ -738,11 +738,11 @@ int source_tcl_file(char *s)
char tmp[1024]; char tmp[1024];
if(Tcl_EvalFile(interp, s)==TCL_ERROR) { if(Tcl_EvalFile(interp, s)==TCL_ERROR) {
fprintf(errfp, "Tcl_AppInit() error: can not execute %s, please fix:\n", s); fprintf(errfp, "Tcl_AppInit() error: can not execute %s, please fix:\n", s);
fprintf(errfp, "%s", Tcl_GetStringResult(interp)); fprintf(errfp, "%s", tclresult());
fprintf(errfp, "\n"); fprintf(errfp, "\n");
my_snprintf(tmp, S(tmp), "tk_messageBox -icon error -type ok -message \ my_snprintf(tmp, S(tmp), "tk_messageBox -icon error -type ok -message \
{Tcl_AppInit() err 1: can not execute %s, please fix:\n %s}", {Tcl_AppInit() err 1: can not execute %s, please fix:\n %s}",
s, Tcl_GetStringResult(interp)); s, tclresult());
if(has_x) { if(has_x) {
tcleval( "wm withdraw ."); /* 20161217 */ tcleval( "wm withdraw ."); /* 20161217 */
tcleval( tmp); /* 20161217 */ tcleval( tmp); /* 20161217 */
@ -882,7 +882,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
#ifdef __unix__ #ifdef __unix__
my_snprintf(tmp, S(tmp),"regsub -all {~/} {.:%s} {%s/}", XSCHEM_LIBRARY_PATH, home_dir); my_snprintf(tmp, S(tmp),"regsub -all {~/} {.:%s} {%s/}", XSCHEM_LIBRARY_PATH, home_dir);
tcleval(tmp); tcleval(tmp);
tclsetvar("XSCHEM_LIBRARY_PATH", Tcl_GetStringResult(interp)); tclsetvar("XSCHEM_LIBRARY_PATH", tclresult());
running_in_src_dir = 0; running_in_src_dir = 0;
/* test if running xschem in src/ dir (usually for testing) */ /* test if running xschem in src/ dir (usually for testing) */
@ -891,7 +891,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
tclsetvar("XSCHEM_SHAREDIR",pwd_dir); /* for testing xschem builds in src dir*/ tclsetvar("XSCHEM_SHAREDIR",pwd_dir); /* for testing xschem builds in src dir*/
my_snprintf(tmp, S(tmp), "subst .:[file normalize \"%s/../xschem_library/devices\"]", pwd_dir); my_snprintf(tmp, S(tmp), "subst .:[file normalize \"%s/../xschem_library/devices\"]", pwd_dir);
tcleval(tmp); tcleval(tmp);
tclsetvar("XSCHEM_LIBRARY_PATH", Tcl_GetStringResult(interp)); tclsetvar("XSCHEM_LIBRARY_PATH", tclresult());
} else if( !stat(XSCHEM_SHAREDIR, &buf) ) { /* 20180918 */ } else if( !stat(XSCHEM_SHAREDIR, &buf) ) { /* 20180918 */
tclsetvar("XSCHEM_SHAREDIR",XSCHEM_SHAREDIR); tclsetvar("XSCHEM_SHAREDIR",XSCHEM_SHAREDIR);
/* ... else give up searching, may set later after loading xschemrc */ /* ... else give up searching, may set later after loading xschemrc */
@ -899,12 +899,12 @@ int Tcl_AppInit(Tcl_Interp *inter)
/* create user conf dir , remove ~ if present */ /* create user conf dir , remove ~ if present */
my_snprintf(tmp, S(tmp),"regsub {^~/} {%s} {%s/}", USER_CONF_DIR, home_dir); my_snprintf(tmp, S(tmp),"regsub {^~/} {%s} {%s/}", USER_CONF_DIR, home_dir);
tcleval(tmp); tcleval(tmp);
my_snprintf(user_conf_dir, S(user_conf_dir), "%s", Tcl_GetStringResult(interp)); my_snprintf(user_conf_dir, S(user_conf_dir), "%s", tclresult());
tclsetvar("USER_CONF_DIR", user_conf_dir); tclsetvar("USER_CONF_DIR", user_conf_dir);
#else #else
my_snprintf(tmp, S(tmp),"regsub -all {~/} {.;%s} {%s/}", XSCHEM_LIBRARY_PATH, home_dir); my_snprintf(tmp, S(tmp),"regsub -all {~/} {.;%s} {%s/}", XSCHEM_LIBRARY_PATH, home_dir);
tcleval(tmp); tcleval(tmp);
tclsetvar("XSCHEM_LIBRARY_PATH", Tcl_GetStringResult(interp)); tclsetvar("XSCHEM_LIBRARY_PATH", tclresult());
char install_dir[MAX_PATH]; char install_dir[MAX_PATH];
GetModuleFileNameA(NULL, install_dir, MAX_PATH); GetModuleFileNameA(NULL, install_dir, MAX_PATH);
change_to_unix_fn(install_dir); change_to_unix_fn(install_dir);
@ -914,7 +914,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
my_snprintf(tmp, S(tmp), "regexp {bin$} \"%s\"", install_dir); /* debugging in Visual Studio will not have bin */ my_snprintf(tmp, S(tmp), "regexp {bin$} \"%s\"", install_dir); /* debugging in Visual Studio will not have bin */
tcleval(tmp); tcleval(tmp);
running_in_src_dir = 0; running_in_src_dir = 0;
if (atoi(Tcl_GetStringResult(interp)) == 0) if (atoi(tclresult()) == 0)
running_in_src_dir = 1; /* no bin, so it's running in Visual studio source directory*/ running_in_src_dir = 1; /* no bin, so it's running in Visual studio source directory*/
char* gxschem_library=NULL, *xschem_sharedir=NULL; char* gxschem_library=NULL, *xschem_sharedir=NULL;
if ((xschem_sharedir=getenv("XSCHEM_SHAREDIR")) != NULL) { if ((xschem_sharedir=getenv("XSCHEM_SHAREDIR")) != NULL) {
@ -1371,7 +1371,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
remove_symbols(); remove_symbols();
my_snprintf(s, S(s), "file normalize \"%s\"", filename); my_snprintf(s, S(s), "file normalize \"%s\"", filename);
tcleval(s); tcleval(s);
load_schematic(1, abs_sym_path(Tcl_GetStringResult(interp), ""), 1); /* 20180925.1 */ load_schematic(1, abs_sym_path(tclresult(), ""), 1); /* 20180925.1 */
} }
else { else {
char * tmp; /* 20121110 */ char * tmp; /* 20121110 */

View File

@ -872,6 +872,7 @@ extern void edit_property(int x);
extern int xschem(ClientData clientdata, Tcl_Interp *interp, extern int xschem(ClientData clientdata, Tcl_Interp *interp,
int argc, const char * argv[]); int argc, const char * argv[]);
extern void tcleval(const char str[]); extern void tcleval(const char str[]);
extern const char *tclresult(void);
extern const char *tclgetvar(const char *s); extern const char *tclgetvar(const char *s);
extern void tclsetvar(const char *s, const char *value); extern void tclsetvar(const char *s, const char *value);
extern void statusmsg(char str[],int n); extern void statusmsg(char str[],int n);
@ -983,7 +984,6 @@ extern void preview_window(const char *what, const char *tk_win_path, const char
extern int window_state (Display *disp, Window win, char *arg); extern int window_state (Display *disp, Window win, char *arg);
extern void toggle_fullscreen(); extern void toggle_fullscreen();
extern void toggle_only_probes(); /* 20110112 */ extern void toggle_only_probes(); /* 20110112 */
extern void fill_symbol_editprop_form(int x);
extern void update_symbol(const char *result, int x); extern void update_symbol(const char *result, int x);
extern void tclexit(ClientData s); extern void tclexit(ClientData s);
extern int build_colors(double dim); /* reparse the TCL 'colors' list and reassign colors 20171113 */ extern int build_colors(double dim); /* reparse the TCL 'colors' list and reassign colors 20171113 */

View File

@ -1969,12 +1969,11 @@ proc change_color {} {
} }
proc edit_prop {txtlabel} { proc edit_prop {txtlabel} {
global edit_prop_default_geometry infowindow_text selected_tok global edit_prop_size infowindow_text selected_tok edit_symbol_prop_new_sel edit_prop_pos
global prev_symbol retval symbol rcode no_change_attrs preserve_unchanged_attrs copy_cell tcl_debug editprop_semaphore global prev_symbol retval symbol rcode no_change_attrs preserve_unchanged_attrs copy_cell tcl_debug
global user_wants_copy_cell editprop_sympath global user_wants_copy_cell editprop_sympath
set user_wants_copy_cell 0 set user_wants_copy_cell 0
set rcode {} set rcode {}
set editprop_semaphore 1
if $tcl_debug<=-1 then {puts " edit_prop{}: retval=$retval"} if $tcl_debug<=-1 then {puts " edit_prop{}: retval=$retval"}
if { [winfo exists .dialog] } return if { [winfo exists .dialog] } return
toplevel .dialog -class Dialog toplevel .dialog -class Dialog
@ -1982,18 +1981,14 @@ proc edit_prop {txtlabel} {
set X [expr [winfo pointerx .dialog] - 60] set X [expr [winfo pointerx .dialog] - 60]
set Y [expr [winfo pointery .dialog] - 35] set Y [expr [winfo pointery .dialog] - 35]
# 20100203
if { $::wm_fix } { tkwait visibility .dialog }
wm geometry .dialog "${edit_prop_default_geometry}+$X+$Y"
# 20160325 change and remember widget size # 20160325 change and remember widget size
bind .dialog <Configure> { bind .dialog <Configure> {
# puts [wm geometry .dialog] # puts [wm geometry .dialog]
set geom [wm geometry .dialog] set geom [wm geometry .dialog]
regsub {\+.*} $geom {} geom regsub {\+.*} $geom {} edit_prop_size
set edit_prop_default_geometry $geom regsub {[^+]*\+} $geom {+} edit_prop_pos
} }
wm geometry .dialog "${edit_prop_size}+$X+$Y"
set prev_symbol $symbol set prev_symbol $symbol
set editprop_sympath [file dirname [abs_sym_path $symbol]] set editprop_sympath [file dirname [abs_sym_path $symbol]]
@ -2027,7 +2022,6 @@ proc edit_prop {txtlabel} {
set symbol [.dialog.f1.e2 get] set symbol [.dialog.f1.e2 get]
set abssymbol [abs_sym_path $symbol] set abssymbol [abs_sym_path $symbol]
set rcode {ok} set rcode {ok}
set editprop_semaphore 0
set user_wants_copy_cell $copy_cell set user_wants_copy_cell $copy_cell
set prev_symbol [abs_sym_path $prev_symbol] set prev_symbol [abs_sym_path $prev_symbol]
if { ($abssymbol ne $prev_symbol) && $copy_cell } { if { ($abssymbol ne $prev_symbol) && $copy_cell } {
@ -2051,19 +2045,21 @@ proc edit_prop {txtlabel} {
# puts "file copy [file rootname $prev_symbol].sym [file rootname $abssymbol].sym" # puts "file copy [file rootname $prev_symbol].sym [file rootname $abssymbol].sym"
} }
} }
## 20190326
} }
#puts "symbol: $symbol , prev_symbol: $prev_symbol" #puts "symbol: $symbol , prev_symbol: $prev_symbol"
set copy_cell 0 ;# 20120919 set copy_cell 0 ;# 20120919
destroy .dialog
} }
button .dialog.f1.b2 -text "Cancel" -command { button .dialog.f1.b2 -text "Cancel" -command {
set rcode {} set rcode {}
set editprop_semaphore 0 set edit_symbol_prop_new_sel {}
destroy .dialog
} }
wm protocol .dialog WM_DELETE_WINDOW { wm protocol .dialog WM_DELETE_WINDOW {
set rcode {} set rcode {}
set editprop_semaphore 0 set edit_symbol_prop_new_sel {}
destroy .dialog
} }
button .dialog.f1.b3 -text "Load" -command { button .dialog.f1.b3 -text "Load" -command {
@ -2106,39 +2102,12 @@ proc edit_prop {txtlabel} {
.dialog.f1.b2 invoke .dialog.f1.b2 invoke
} }
} }
#tkwait visibility .dialog
#grab set .dialog
#focus .dialog.e1
#tkwait window .dialog
while {1} {
tkwait variable editprop_semaphore
if { $editprop_semaphore == 2 } {
set retval [.dialog.e1 get 1.0 {end - 1 chars}]
set symbol [ .dialog.f1.e2 get]
xschem update_symbol ok
set editprop_semaphore 1
xschem fill_symbol_editprop_form
set editprop_sympath [file dirname [abs_sym_path $symbol]]
# 20160423 no more setected stuff--> close
if {$editprop_semaphore==0 } {
break
}
# 20110325 update symbol variable after clicking another element to avoid
# modified flag to be set even when nothing changed
## set symbol [ .dialog.f1.e2 get]
.dialog.e1 delete 1.0 end if {$edit_symbol_prop_new_sel == 1} {
.dialog.e1 insert 1.0 $retval wm geometry .dialog $edit_prop_pos
.dialog.f1.e2 delete 0 end
.dialog.f1.e2 insert 0 $symbol
} else {
break
}
} }
destroy .dialog set edit_symbol_prop_new_sel 0
set editprop_semaphore 0 tkwait window .dialog
return $rcode return $rcode
} }
@ -2602,7 +2571,9 @@ proc reconfigure_layers_menu {} {
proc get_file_path {ff} { proc get_file_path {ff} {
global env global env
if { [regexp {/} $ff] } { return $ff } # Absolute path ? return as is.
# Linux Windows
if { [regexp {^/} $ff] || [regexp {^[a-zA-Z]:} $ff] } { return $ff }
if {$::OS == "Windows"} { if {$::OS == "Windows"} {
set pathlist [split $env(PATH) \;] set pathlist [split $env(PATH) \;]
} else { } else {
@ -2612,6 +2583,7 @@ proc get_file_path {ff} {
set ii $i/$ff set ii $i/$ff
if { [file exists $ii]} {return $ii} if { [file exists $ii]} {return $ii}
} }
# nothing found, return $ff as is and hope for the best :-)
return $ff return $ff
} }
@ -2865,10 +2837,10 @@ set_ne disable_unique_names 1
set_ne sym_txt 1 set_ne sym_txt 1
set_ne show_infowindow 0 set_ne show_infowindow 0
set_ne symbol_width 150 set_ne symbol_width 150
set_ne editprop_semaphore 0
set_ne editor {gvim -f} set_ne editor {gvim -f}
set_ne rainbow_colors 0 set_ne rainbow_colors 0
set_ne initial_geometry {700x448+10+10} set_ne initial_geometry {700x448+10+10}
set_ne edit_symbol_prop_new_sel {}
#20161102 #20161102
set_ne launcher_var {} set_ne launcher_var {}
set_ne launcher_default_program {xdg-open} set_ne launcher_default_program {xdg-open}
@ -2879,7 +2851,7 @@ set_ne auto_hilight 0
set_ne to_png {gm convert} set_ne to_png {gm convert}
## 20160325 remember edit_prop widget size ## 20160325 remember edit_prop widget size
set_ne edit_prop_default_geometry 80x12 set_ne edit_prop_size 80x12
set_ne text_line_default_geometry 80x12 set_ne text_line_default_geometry 80x12
set_ne terminal xterm set_ne terminal xterm

View File

@ -1,4 +1,4 @@
v {xschem version=2.9.5_RC6 file_version=1.1} v {xschem version=2.9.7 file_version=1.2}
G {type=pnp G {type=pnp
format="@spiceprefix@name @pinlist @model area=@area" format="@spiceprefix@name @pinlist @model area=@area"
tedax_format="footprint @name @footprint tedax_format="footprint @name @footprint
@ -19,7 +19,7 @@ B 5 17.5 27.5 22.5 32.5 {name=C dir=inout pinnumber=3}
B 5 -22.5 -2.5 -17.5 2.5 {name=B dir=in pinnumber=1} B 5 -22.5 -2.5 -17.5 2.5 {name=B dir=in pinnumber=1}
B 5 17.5 -32.5 22.5 -27.5 {name=E dir=inout pinnumber=2} B 5 17.5 -32.5 22.5 -27.5 {name=E dir=inout pinnumber=2}
P 4 4 0 -10 15 -15 5 -25 0 -10 {fill=true} P 4 4 0 -10 15 -15 5 -25 0 -10 {fill=true}
T {@device} 20 -13.75 0 0 0.2 0.2 {} T {@model} 20 -13.75 0 0 0.2 0.2 {}
T {@name} 20 1.25 0 0 0.2 0.2 {} T {@name} 20 1.25 0 0 0.2 0.2 {}
T {@#2:pinnumber} 25 -28.75 0 0 0.2 0.2 {layer=13} T {@#2:pinnumber} 25 -28.75 0 0 0.2 0.2 {layer=13}
T {@#0:pinnumber} 25 17.5 0 0 0.2 0.2 {layer=13} T {@#0:pinnumber} 25 17.5 0 0 0.2 0.2 {layer=13}

View File

@ -1,4 +1,4 @@
v {xschem version=2.9.5_RC5 file_version=1.1} v {xschem version=2.9.7 file_version=1.2}
G {type=diode G {type=diode
format="@spiceprefix@name @pinlist @model" format="@spiceprefix@name @pinlist @model"
tedax_format="footprint @name @footprint tedax_format="footprint @name @footprint
@ -16,6 +16,6 @@ B 5 -2.5 -32.5 2.5 -27.5 {name=p dir=inout pinnumber=1}
B 5 -2.5 27.5 2.5 32.5 {name=m dir=inout pinnumber=2} B 5 -2.5 27.5 2.5 32.5 {name=m dir=inout pinnumber=2}
P 4 4 -0 5 -10 -5 10 -5 -0 5 {fill=true} P 4 4 -0 5 -10 -5 10 -5 -0 5 {fill=true}
T {@name} 2.5 -20 0 0 0.2 0.2 {} T {@name} 2.5 -20 0 0 0.2 0.2 {}
T {@device} 2.5 12.5 0 0 0.2 0.2 {} T {@model} 2.5 12.5 0 0 0.2 0.2 {}
T {@#0:pinnumber} -5 -26.25 0 1 0.2 0.2 {layer=13} T {@#0:pinnumber} -5 -26.25 0 1 0.2 0.2 {layer=13}
T {@#1:pinnumber} -5 17.5 0 1 0.2 0.2 {layer=13} T {@#1:pinnumber} -5 17.5 0 1 0.2 0.2 {layer=13}