more consistent naming for some xschem subcommands, added and updated "xschem help" command (still wip)
This commit is contained in:
parent
fe549c0f5c
commit
887c546d00
|
|
@ -22,14 +22,19 @@ p{padding: 15px 30px 10px;}
|
||||||
<h1>XSCHEM REMOTE INTERFACE SPECIFICATION</h1><br>
|
<h1>XSCHEM REMOTE INTERFACE SPECIFICATION</h1><br>
|
||||||
<h3>GENERAL INFORMATIONS</h3>
|
<h3>GENERAL INFORMATIONS</h3>
|
||||||
<p>
|
<p>
|
||||||
XSCHEM embeds a tcl shell, when running xschem the terminal will present a tcl prompt allowing to send / get commands through it.
|
XSCHEM embeds a tcl shell, when running xschem the terminal will present a tcl prompt allowing to
|
||||||
|
send / get commands through it.
|
||||||
Most user actions done in the drawing window can be done by sending tcl commands through the tcl shell.
|
Most user actions done in the drawing window can be done by sending tcl commands through the tcl shell.
|
||||||
Since I/O is simply done through stdin/stdout this allows XSCHEM to be controlled by another application, by piping XSCHEM
|
A tcp socket can be activated to allow sending remote commands to xschem, for this to work you
|
||||||
commands to XSCHEM stdin and getting XSCHEM answers piped from XSCHEM stdout.
|
must the <kbd>xschem_listen_port</kbd> tcl variable in xschemrc, specifying an unused port number.
|
||||||
|
Xschem will listen to this port number for commands and send back results, as if commands were given
|
||||||
|
directly from the tcl console.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
XSCHEM implements a TCL <kbd>xschem</kbd> command that accepts additional arguments. This command implements all the XSCHEM remote interface.
|
XSCHEM implements a TCL <kbd>xschem</kbd> command that accepts additional arguments.
|
||||||
Of course all Tck-Tk commands are available, for example, if this command is sent to XSCHEM: '<kbd>wm withdraw .</kbd>' the xschem main window
|
This command implements all the XSCHEM remote interface.
|
||||||
|
Of course all Tck-Tk commands are available, for example, if this command is sent to XSCHEM: '<kbd>wm withdraw .</kbd>'
|
||||||
|
the xschem main window
|
||||||
will be withdrawn by the window manager, while '<kbd>wm state . normal</kbd>' will show again the window.<br>
|
will be withdrawn by the window manager, while '<kbd>wm state . normal</kbd>' will show again the window.<br>
|
||||||
This command: '<kbd>puts $XSCHEM_LIBRARY_PATH</kbd>' will print the content of the <kbd>XSCHEM_LIBRARY_PATH</kbd> tcl variable
|
This command: '<kbd>puts $XSCHEM_LIBRARY_PATH</kbd>' will print the content of the <kbd>XSCHEM_LIBRARY_PATH</kbd> tcl variable
|
||||||
containing the search path.
|
containing the search path.
|
||||||
|
|
|
||||||
|
|
@ -552,7 +552,7 @@ void enable_layers(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void attach_labels_to_inst() /* offloaded from callback.c 20171005 */
|
void attach_labels_to_inst(int interactive) /* offloaded from callback.c 20171005 */
|
||||||
{
|
{
|
||||||
xSymbol *symbol;
|
xSymbol *symbol;
|
||||||
int npin, i, j;
|
int npin, i, j;
|
||||||
|
|
@ -593,13 +593,12 @@ void attach_labels_to_inst() /* offloaded from callback.c 20171005 */
|
||||||
first_call=1; /* 20171214 for place_symbol--> new_prop_string */
|
first_call=1; /* 20171214 for place_symbol--> new_prop_string */
|
||||||
prepare_netlist_structs(0);
|
prepare_netlist_structs(0);
|
||||||
for(j=0;j<k;j++) if(xctx->sel_array[j].type==ELEMENT) {
|
for(j=0;j<k;j++) if(xctx->sel_array[j].type==ELEMENT) {
|
||||||
|
|
||||||
found=1;
|
found=1;
|
||||||
my_strdup(5, &prop, xctx->inst[xctx->sel_array[j].n].instname);
|
my_strdup(5, &prop, xctx->inst[xctx->sel_array[j].n].instname);
|
||||||
my_strcat(6, &prop, "_");
|
my_strcat(6, &prop, "_");
|
||||||
tclsetvar("custom_label_prefix",prop);
|
tclsetvar("custom_label_prefix",prop);
|
||||||
|
|
||||||
if(!do_all_inst) {
|
if(interactive && !do_all_inst) {
|
||||||
dbg(1,"attach_labels_to_inst(): invoking tcl attach_labels_to_inst\n");
|
dbg(1,"attach_labels_to_inst(): invoking tcl attach_labels_to_inst\n");
|
||||||
tcleval("attach_labels_to_inst");
|
tcleval("attach_labels_to_inst");
|
||||||
if(!strcmp(tclgetvar("rcode"),"") ) {
|
if(!strcmp(tclgetvar("rcode"),"") ) {
|
||||||
|
|
@ -608,18 +607,21 @@ void attach_labels_to_inst() /* offloaded from callback.c 20171005 */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(interactive == 0 ) {
|
||||||
|
tclsetvar("rcode", "yes");
|
||||||
|
tclsetvar("use_lab_wire", "0");
|
||||||
|
tclsetvar("use_label_prefix", "0");
|
||||||
|
tclsetvar("do_all_inst", "1");
|
||||||
|
tclsetvar("rotated_text", "0");
|
||||||
|
}
|
||||||
use_label_prefix = atoi(tclgetvar("use_label_prefix"));
|
use_label_prefix = atoi(tclgetvar("use_label_prefix"));
|
||||||
|
|
||||||
rot_txt = tclgetvar("rotated_text");
|
rot_txt = tclgetvar("rotated_text");
|
||||||
if(strcmp(rot_txt,"")) rotated_text=atoi(rot_txt);
|
if(strcmp(rot_txt,"")) rotated_text=atoi(rot_txt);
|
||||||
|
|
||||||
my_strdup(7, &type,(xctx->inst[xctx->sel_array[j].n].ptr+ xctx->sym)->type);
|
my_strdup(7, &type,(xctx->inst[xctx->sel_array[j].n].ptr+ xctx->sym)->type);
|
||||||
if( type && IS_LABEL_OR_PIN(type) ) {
|
if( type && IS_LABEL_OR_PIN(type) ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!do_all_inst && !strcmp(tclgetvar("do_all_inst"),"1")) do_all_inst=1;
|
if(!do_all_inst && !strcmp(tclgetvar("do_all_inst"),"1")) do_all_inst=1;
|
||||||
|
|
||||||
dbg(1, "attach_labels_to_inst(): 1--> %s %.16g %.16g %s\n",
|
dbg(1, "attach_labels_to_inst(): 1--> %s %.16g %.16g %s\n",
|
||||||
xctx->inst[xctx->sel_array[j].n].name,
|
xctx->inst[xctx->sel_array[j].n].name,
|
||||||
xctx->inst[xctx->sel_array[j].n].x0,
|
xctx->inst[xctx->sel_array[j].n].x0,
|
||||||
|
|
|
||||||
|
|
@ -489,7 +489,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(key=='H' && state==ShiftMask) { /* attach labels to selected instances */
|
if(key=='H' && state==ShiftMask) { /* attach labels to selected instances */
|
||||||
attach_labels_to_inst();
|
attach_labels_to_inst(1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (key == 'H' && state == (ControlMask | ShiftMask)) { /* create schematic and symbol from selected components */
|
if (key == 'H' && state == (ControlMask | ShiftMask)) { /* create schematic and symbol from selected components */
|
||||||
|
|
|
||||||
|
|
@ -271,7 +271,7 @@ void create_plot_cmd(void)
|
||||||
}
|
}
|
||||||
fprintf(fd, "*ngspice plot file\n.control\n");
|
fprintf(fd, "*ngspice plot file\n.control\n");
|
||||||
}
|
}
|
||||||
if(viewer == GAW) tcleval("if { ![info exists gaw_fd] } { gaw_setup_tcp }\n");
|
if(viewer == GAW) tcleval("if { ![info exists gaw_fd] } { setup_tcp_gaw }\n");
|
||||||
idx = 1;
|
idx = 1;
|
||||||
first = 1;
|
first = 1;
|
||||||
for(i=0;i<HASHSIZE;i++) /* set ngspice colors */
|
for(i=0;i<HASHSIZE;i++) /* set ngspice colors */
|
||||||
|
|
@ -915,7 +915,7 @@ static void send_net_to_gaw(int simtype, const char *node)
|
||||||
sprintf(color_str, "%02x%02x%02x", xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8,
|
sprintf(color_str, "%02x%02x%02x", xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8,
|
||||||
xctx->xcolor_array[c].blue>>8);
|
xctx->xcolor_array[c].blue>>8);
|
||||||
expanded_tok = expandlabel(tok, &tok_mult);
|
expanded_tok = expandlabel(tok, &tok_mult);
|
||||||
tcleval("if { ![info exists gaw_fd] } { gaw_setup_tcp }\n");
|
tcleval("if { ![info exists gaw_fd] } { setup_tcp_gaw }\n");
|
||||||
for(k=1; k<=tok_mult; k++) {
|
for(k=1; k<=tok_mult; k++) {
|
||||||
my_strdup(246, &t, find_nth(expanded_tok, ',', k));
|
my_strdup(246, &t, find_nth(expanded_tok, ',', k));
|
||||||
my_strdup2(254, &p, xctx->sch_path[xctx->currsch]+1);
|
my_strdup2(254, &p, xctx->sch_path[xctx->currsch]+1);
|
||||||
|
|
@ -1018,7 +1018,7 @@ static void send_current_to_gaw(int simtype, const char *node)
|
||||||
sprintf(color_str, "%02x%02x%02x", xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8,
|
sprintf(color_str, "%02x%02x%02x", xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8,
|
||||||
xctx->xcolor_array[c].blue>>8);
|
xctx->xcolor_array[c].blue>>8);
|
||||||
expanded_tok = expandlabel(tok, &tok_mult);
|
expanded_tok = expandlabel(tok, &tok_mult);
|
||||||
tcleval("if { ![info exists gaw_fd] } { gaw_setup_tcp }\n");
|
tcleval("if { ![info exists gaw_fd] } { setup_tcp_gaw }\n");
|
||||||
for(k=1; k<=tok_mult; k++) {
|
for(k=1; k<=tok_mult; k++) {
|
||||||
my_strdup(1179, &t, find_nth(expanded_tok, ',', k));
|
my_strdup(1179, &t, find_nth(expanded_tok, ',', k));
|
||||||
my_strdup2(1180, &p, xctx->sch_path[xctx->currsch]+1);
|
my_strdup2(1180, &p, xctx->sch_path[xctx->currsch]+1);
|
||||||
|
|
|
||||||
470
src/scheduler.c
470
src/scheduler.c
|
|
@ -61,6 +61,202 @@ int get_instance(const char *s)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void xschem_cmd_help(int argc, const char **argv)
|
||||||
|
{
|
||||||
|
Tcl_ResetResult(interp);
|
||||||
|
Tcl_AppendResult(interp,
|
||||||
|
"Xschem command language:\n",
|
||||||
|
" xschem subcommand [args]\n",
|
||||||
|
"\"xschem\" subcommands available:\n",
|
||||||
|
/* "add_symbol_pin\n", */
|
||||||
|
"align\n",
|
||||||
|
" Align selected part of schematic to current gid snap setting\n",
|
||||||
|
/* "arc\n", */
|
||||||
|
"attach_pins\n",
|
||||||
|
" Attach labels to selected instance pins\n",
|
||||||
|
"bbox [begin | end]\n",
|
||||||
|
" bbox begin: start a bounding box drawing area setting\n",
|
||||||
|
" bbox end: end a bounding box drawing area setting, draw stuff and reset bbox\n",
|
||||||
|
"break_wires\n",
|
||||||
|
"build_colors\n",
|
||||||
|
"callback\n",
|
||||||
|
"check_symbols\n",
|
||||||
|
"check_unique_names\n",
|
||||||
|
"circle\n",
|
||||||
|
"clear\n",
|
||||||
|
"clear_drawing\n",
|
||||||
|
"color_dim\n",
|
||||||
|
"connected_nets\n",
|
||||||
|
"copy\n",
|
||||||
|
"copy_objects\n",
|
||||||
|
"create_plot_cmd\n",
|
||||||
|
"cut\n",
|
||||||
|
"debug\n",
|
||||||
|
"delete\n",
|
||||||
|
"delete_files\n",
|
||||||
|
"descend\n",
|
||||||
|
"descend_symbol\n",
|
||||||
|
"display_hilights\n",
|
||||||
|
"edit_file\n",
|
||||||
|
"edit_prop\n",
|
||||||
|
"edit_vi_prop\n",
|
||||||
|
"enable_layers\n",
|
||||||
|
"exit\n",
|
||||||
|
"expandlabel\n",
|
||||||
|
"find_nth\n",
|
||||||
|
"flip\n",
|
||||||
|
"fullscreen\n",
|
||||||
|
"get var\n",
|
||||||
|
" where \"var\" is one of:\n",
|
||||||
|
" schname [n]\n",
|
||||||
|
" get name of schematic, optionally of upper levels if (negative) n is provided\n",
|
||||||
|
" sch_path [n]\n",
|
||||||
|
" get pathname of schematic, optionally of upper levels if (negative) n is provided\n",
|
||||||
|
" backlayer\n",
|
||||||
|
" bbox_hilighted\n",
|
||||||
|
" bbox_selected\n",
|
||||||
|
" cadlayers\n",
|
||||||
|
" color_ps\n",
|
||||||
|
" current_dirname\n",
|
||||||
|
" currsch\n",
|
||||||
|
" debug_var\n",
|
||||||
|
" draw_window\n",
|
||||||
|
" flat_netlist\n",
|
||||||
|
" gridlayer\n",
|
||||||
|
" help\n",
|
||||||
|
" instances\n",
|
||||||
|
" lastsel\n",
|
||||||
|
" line_width\n",
|
||||||
|
" netlist_name\n",
|
||||||
|
" netlist_type\n",
|
||||||
|
" no_draw\n",
|
||||||
|
" pinlayer\n",
|
||||||
|
" rectcolor\n",
|
||||||
|
" sellayer\n",
|
||||||
|
" semaphore\n",
|
||||||
|
" temp_dir\n",
|
||||||
|
" text_svg\n",
|
||||||
|
" textlayer\n",
|
||||||
|
" topwindow\n",
|
||||||
|
" version\n",
|
||||||
|
" wirelayer\n",
|
||||||
|
"get_tok\n",
|
||||||
|
"get_tok_size\n",
|
||||||
|
"getprop\n",
|
||||||
|
"globals\n",
|
||||||
|
"go_back\n",
|
||||||
|
"help\n",
|
||||||
|
"hier_psprint\n",
|
||||||
|
"hilight\n",
|
||||||
|
"hilight_netname\n",
|
||||||
|
"instance\n",
|
||||||
|
"instance_bbox\n",
|
||||||
|
"instance_net\n",
|
||||||
|
"instance_nodemap\n",
|
||||||
|
"instance_pin_coord\n",
|
||||||
|
"instance_pins\n",
|
||||||
|
"instance_pos\n",
|
||||||
|
"instances_to_net\n",
|
||||||
|
"line\n",
|
||||||
|
"line_width\n",
|
||||||
|
"list_tokens\n",
|
||||||
|
"load\n",
|
||||||
|
"load_new_window\n",
|
||||||
|
"load_symbol\n",
|
||||||
|
"load_symbol\n",
|
||||||
|
"log\n",
|
||||||
|
"logic_set\n",
|
||||||
|
"make_sch\n",
|
||||||
|
"make_symbol\n",
|
||||||
|
"merge\n",
|
||||||
|
"move_objects\n",
|
||||||
|
"net_label\n",
|
||||||
|
"net_pin_mismatch\n",
|
||||||
|
"netlist\n",
|
||||||
|
"new_schematic\n",
|
||||||
|
"new_symbol_window\n",
|
||||||
|
"new_window\n",
|
||||||
|
"only_probes\n",
|
||||||
|
"origin\n",
|
||||||
|
"parselabel\n",
|
||||||
|
"paste\n",
|
||||||
|
"pinlist\n",
|
||||||
|
"place_symbol\n",
|
||||||
|
"place_text\n",
|
||||||
|
"polygon\n",
|
||||||
|
"preview_window\n",
|
||||||
|
"print\n",
|
||||||
|
"print_hilight_net\n",
|
||||||
|
"print_spice_element\n",
|
||||||
|
"propagate_hilights\n",
|
||||||
|
"push_undo\n",
|
||||||
|
"rebuild_connectivity\n",
|
||||||
|
"rect\n",
|
||||||
|
"redo\n",
|
||||||
|
"redraw\n",
|
||||||
|
"reload\n",
|
||||||
|
"reload_symbols\n",
|
||||||
|
"remove_symbols\n",
|
||||||
|
"replace_symbol\n",
|
||||||
|
"rotate\n",
|
||||||
|
"save\n",
|
||||||
|
"saveas\n",
|
||||||
|
"schematic_in_new_window\n",
|
||||||
|
"search\n",
|
||||||
|
"searchmenu\n",
|
||||||
|
"select\n",
|
||||||
|
"select_all\n",
|
||||||
|
"select_hilight_net\n",
|
||||||
|
"selected_set\n",
|
||||||
|
"selected_wire\n",
|
||||||
|
"send_to_viewer\n",
|
||||||
|
"set var value\n",
|
||||||
|
" where \"var\" is one of:\n",
|
||||||
|
" cadgrid\n",
|
||||||
|
" cadsnap\n",
|
||||||
|
" color_ps\n",
|
||||||
|
" constrained_move\n",
|
||||||
|
" draw_window\n",
|
||||||
|
" flat_netlist\n",
|
||||||
|
" hide_symbols\n",
|
||||||
|
" netlist_name\n",
|
||||||
|
" netlist_type\n",
|
||||||
|
" no_draw\n",
|
||||||
|
" no_undo\n",
|
||||||
|
" rectcolor\n",
|
||||||
|
" text_svg\n",
|
||||||
|
" semaphore\n",
|
||||||
|
" sym_txt\n",
|
||||||
|
"set_different_tok\n",
|
||||||
|
"set_modify\n",
|
||||||
|
"setprop\n",
|
||||||
|
"show_pin_net_names\n",
|
||||||
|
"simulate\n",
|
||||||
|
"snap_wire\n",
|
||||||
|
"subst_tok\n",
|
||||||
|
"symbol_in_new_window\n",
|
||||||
|
"symbols\n",
|
||||||
|
"test\n",
|
||||||
|
"toggle_colorscheme\n",
|
||||||
|
"translate\n",
|
||||||
|
"trim_wires\n",
|
||||||
|
"undo\n",
|
||||||
|
"undo_type\n",
|
||||||
|
"unhilight_all\n",
|
||||||
|
"unhilight\n",
|
||||||
|
"unselect_all\n",
|
||||||
|
"view_prop\n",
|
||||||
|
/* "windowid\n", */
|
||||||
|
"windows\n",
|
||||||
|
"wire\n",
|
||||||
|
"zoom_box\n",
|
||||||
|
"zoom_full\n",
|
||||||
|
"zoom_hilighted\n",
|
||||||
|
"zoom_in\n",
|
||||||
|
"zoom_out\n",
|
||||||
|
"zoom_selected\n",
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/* can be used to reach C functions from the Tk shell. */
|
/* can be used to reach C functions from the Tk shell. */
|
||||||
int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * argv[])
|
int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * argv[])
|
||||||
|
|
@ -124,7 +320,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
||||||
else if(!strcmp(argv[1],"attach_pins")) /* attach pins to selected component 20171005 */
|
else if(!strcmp(argv[1],"attach_pins")) /* attach pins to selected component 20171005 */
|
||||||
{
|
{
|
||||||
cmd_found = 1;
|
cmd_found = 1;
|
||||||
attach_labels_to_inst();
|
attach_labels_to_inst(0);
|
||||||
Tcl_ResetResult(interp);
|
Tcl_ResetResult(interp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -151,6 +347,13 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
||||||
break_wires_at_pins();
|
break_wires_at_pins();
|
||||||
Tcl_ResetResult(interp);
|
Tcl_ResetResult(interp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if(!strcmp(argv[1],"build_colors"))
|
||||||
|
{
|
||||||
|
cmd_found = 1;
|
||||||
|
build_colors(tclgetdoublevar("dim_value"), tclgetdoublevar("dim_bg"));
|
||||||
|
Tcl_ResetResult(interp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(argv[1][0] == 'c') {
|
else if(argv[1][0] == 'c') {
|
||||||
|
|
@ -163,13 +366,6 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
||||||
Tcl_ResetResult(interp);
|
Tcl_ResetResult(interp);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(!strcmp(argv[1],"build_colors"))
|
|
||||||
{
|
|
||||||
cmd_found = 1;
|
|
||||||
build_colors(tclgetdoublevar("dim_value"), tclgetdoublevar("dim_bg"));
|
|
||||||
Tcl_ResetResult(interp);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if(!strcmp(argv[1],"check_symbols"))
|
else if(!strcmp(argv[1],"check_symbols"))
|
||||||
{
|
{
|
||||||
char sympath[PATH_MAX];
|
char sympath[PATH_MAX];
|
||||||
|
|
@ -460,18 +656,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(argv[1][0] == 'f') {
|
else if(argv[1][0] == 'f') {
|
||||||
if(!strcmp(argv[1],"find_nth") )
|
if(!strcmp(argv[1],"flip"))
|
||||||
{
|
|
||||||
cmd_found = 1;
|
|
||||||
if(argc>4) {
|
|
||||||
char *r = NULL;
|
|
||||||
my_strdup(1202, &r, find_nth(argv[2], argv[3][0], atoi(argv[4])));
|
|
||||||
Tcl_SetResult(interp, r ? r : "<NULL>", TCL_VOLATILE);
|
|
||||||
my_free(1203, &r);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else if(!strcmp(argv[1],"flip"))
|
|
||||||
{
|
{
|
||||||
cmd_found = 1;
|
cmd_found = 1;
|
||||||
if(! (xctx->ui_state & (STARTMOVE | STARTCOPY) ) ) {
|
if(! (xctx->ui_state & (STARTMOVE | STARTCOPY) ) ) {
|
||||||
|
|
@ -509,6 +694,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
||||||
Tcl_SetResult(interp, xctx->sch[x], TCL_VOLATILE);
|
Tcl_SetResult(interp, xctx->sch[x], TCL_VOLATILE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if( argc >= 3 && !strcmp(argv[1],"get") && !strcmp(argv[2],"sch_path"))
|
else if( argc >= 3 && !strcmp(argv[1],"get") && !strcmp(argv[2],"sch_path"))
|
||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
|
|
@ -521,6 +707,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
||||||
Tcl_SetResult(interp, xctx->sch_path[x], TCL_VOLATILE);
|
Tcl_SetResult(interp, xctx->sch_path[x], TCL_VOLATILE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(!strcmp(argv[1],"get") && argc==3)
|
else if(!strcmp(argv[1],"get") && argc==3)
|
||||||
{
|
{
|
||||||
cmd_found = 1;
|
cmd_found = 1;
|
||||||
|
|
@ -717,29 +904,8 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
||||||
else {
|
else {
|
||||||
fprintf(errfp, "xschem get %s: invalid command.\n", argv[2]);
|
fprintf(errfp, "xschem get %s: invalid command.\n", argv[2]);
|
||||||
}
|
}
|
||||||
}
|
} /* else if(!strcmp(argv[1],"get") && argc==3) */
|
||||||
|
|
||||||
else if(!strcmp(argv[1],"get_tok") )
|
|
||||||
{
|
|
||||||
char *s=NULL;
|
|
||||||
int t;
|
|
||||||
cmd_found = 1;
|
|
||||||
if(argc < 4) {Tcl_SetResult(interp, "Missing arguments", TCL_STATIC);return TCL_ERROR;}
|
|
||||||
if(argc == 5) t = atoi(argv[4]);
|
|
||||||
else t = 0;
|
|
||||||
my_strdup(648, &s, get_tok_value(argv[2], argv[3], t));
|
|
||||||
Tcl_SetResult(interp, s, TCL_VOLATILE);
|
|
||||||
my_free(649, &s);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if(!strcmp(argv[1],"get_tok_size") )
|
|
||||||
{
|
|
||||||
char s[30];
|
|
||||||
cmd_found = 1;
|
|
||||||
my_snprintf(s, S(s), "%d", (int)xctx->get_tok_size);
|
|
||||||
Tcl_SetResult(interp, s, TCL_VOLATILE);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if(!strcmp(argv[1],"getprop"))
|
else if(!strcmp(argv[1],"getprop"))
|
||||||
{
|
{
|
||||||
cmd_found = 1;
|
cmd_found = 1;
|
||||||
|
|
@ -842,51 +1008,75 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if(!strcmp(argv[1],"get_tok") )
|
||||||
|
{
|
||||||
|
char *s=NULL;
|
||||||
|
int t;
|
||||||
|
cmd_found = 1;
|
||||||
|
if(argc < 4) {Tcl_SetResult(interp, "Missing arguments", TCL_STATIC);return TCL_ERROR;}
|
||||||
|
if(argc == 5) t = atoi(argv[4]);
|
||||||
|
else t = 0;
|
||||||
|
my_strdup(648, &s, get_tok_value(argv[2], argv[3], t));
|
||||||
|
Tcl_SetResult(interp, s, TCL_VOLATILE);
|
||||||
|
my_free(649, &s);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if(!strcmp(argv[1],"get_tok_size") )
|
||||||
|
{
|
||||||
|
char s[30];
|
||||||
|
cmd_found = 1;
|
||||||
|
my_snprintf(s, S(s), "%d", (int)xctx->get_tok_size);
|
||||||
|
Tcl_SetResult(interp, s, TCL_VOLATILE);
|
||||||
|
}
|
||||||
|
|
||||||
else if(!strcmp(argv[1],"globals"))
|
else if(!strcmp(argv[1],"globals"))
|
||||||
{
|
{
|
||||||
|
static char res[8192];
|
||||||
cmd_found = 1;
|
cmd_found = 1;
|
||||||
printf("*******global variables:*******\n");
|
|
||||||
printf("INT_WIDTH(lw)=%d\n", INT_WIDTH(xctx->lw));
|
Tcl_ResetResult(interp);
|
||||||
printf("wires=%d\n", xctx->wires);
|
my_snprintf(res, S(res), "*******global variables:*******\n"); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("instances=%d\n", xctx->instances);
|
my_snprintf(res, S(res), "INT_WIDTH(lw)=%d\n", INT_WIDTH(xctx->lw)); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("symbols=%d\n", xctx->symbols);
|
my_snprintf(res, S(res), "wires=%d\n", xctx->wires); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("lastsel=%d\n", xctx->lastsel);
|
my_snprintf(res, S(res), "instances=%d\n", xctx->instances); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("texts=%d\n", xctx->texts);
|
my_snprintf(res, S(res), "symbols=%d\n", xctx->symbols); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("maxt=%d\n", xctx->maxt);
|
my_snprintf(res, S(res), "lastsel=%d\n", xctx->lastsel); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("maxw=%d\n", xctx->maxw);
|
my_snprintf(res, S(res), "texts=%d\n", xctx->texts); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("maxi=%d\n", xctx->maxi);
|
my_snprintf(res, S(res), "maxt=%d\n", xctx->maxt); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("maxsel=%d\n", xctx->maxsel);
|
my_snprintf(res, S(res), "maxw=%d\n", xctx->maxw); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("zoom=%.16g\n", xctx->zoom);
|
my_snprintf(res, S(res), "maxi=%d\n", xctx->maxi); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("xorigin=%.16g\n", xctx->xorigin);
|
my_snprintf(res, S(res), "maxsel=%d\n", xctx->maxsel); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("yorigin=%.16g\n", xctx->yorigin);
|
my_snprintf(res, S(res), "zoom=%.16g\n", xctx->zoom); Tcl_AppendResult(interp, res, NULL);
|
||||||
|
my_snprintf(res, S(res), "xorigin=%.16g\n", xctx->xorigin); Tcl_AppendResult(interp, res, NULL);
|
||||||
|
my_snprintf(res, S(res), "yorigin=%.16g\n", xctx->yorigin); Tcl_AppendResult(interp, res, NULL);
|
||||||
for(i=0;i<8;i++)
|
for(i=0;i<8;i++)
|
||||||
{
|
{
|
||||||
printf("rects[%d]=%d\n", i, xctx->rects[i]);
|
my_snprintf(res, S(res), "rects[%d]=%d\n", i, xctx->rects[i]); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("lines[%d]=%d\n", i, xctx->lines[i]);
|
my_snprintf(res, S(res), "lines[%d]=%d\n", i, xctx->lines[i]); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("maxr[%d]=%d\n", i, xctx->maxr[i]);
|
my_snprintf(res, S(res), "maxr[%d]=%d\n", i, xctx->maxr[i]); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("maxl[%d]=%d\n", i, xctx->maxl[i]);
|
my_snprintf(res, S(res), "maxl[%d]=%d\n", i, xctx->maxl[i]); Tcl_AppendResult(interp, res, NULL);
|
||||||
}
|
}
|
||||||
printf("current_name=%s\n", xctx->current_name);
|
my_snprintf(res, S(res), "current_name=%s\n", xctx->current_name); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("currsch=%d\n", xctx->currsch);
|
my_snprintf(res, S(res), "currsch=%d\n", xctx->currsch); Tcl_AppendResult(interp, res, NULL);
|
||||||
for(i=0;i<=xctx->currsch;i++)
|
for(i=0;i<=xctx->currsch;i++)
|
||||||
{
|
{
|
||||||
printf("previous_instance[%d]=%d\n",i,xctx->previous_instance[i]);
|
my_snprintf(res, S(res), "previous_instance[%d]=%d\n",i,xctx->previous_instance[i]); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("sch_path[%d]=%s\n",i,xctx->sch_path[i]? xctx->sch_path[i]:"<NULL>");
|
my_snprintf(res, S(res), "sch_path[%d]=%s\n",i,xctx->sch_path[i]? xctx->sch_path[i]:"<NULL>"); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("sch[%d]=%s\n",i,xctx->sch[i]);
|
my_snprintf(res, S(res), "sch[%d]=%s\n",i,xctx->sch[i]); Tcl_AppendResult(interp, res, NULL);
|
||||||
}
|
}
|
||||||
printf("modified=%d\n", xctx->modified);
|
my_snprintf(res, S(res), "modified=%d\n", xctx->modified); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("areaw=%d\n", xctx->areaw);
|
my_snprintf(res, S(res), "areaw=%d\n", xctx->areaw); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("areah=%d\n", xctx->areah);
|
my_snprintf(res, S(res), "areah=%d\n", xctx->areah); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("color_ps=%d\n", color_ps);
|
my_snprintf(res, S(res), "color_ps=%d\n", color_ps); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("hilight_nets=%d\n", xctx->hilight_nets);
|
my_snprintf(res, S(res), "hilight_nets=%d\n", xctx->hilight_nets); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("semaphore=%d\n", xctx->semaphore);
|
my_snprintf(res, S(res), "semaphore=%d\n", xctx->semaphore); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("prep_net_structs=%d\n", xctx->prep_net_structs);
|
my_snprintf(res, S(res), "prep_net_structs=%d\n", xctx->prep_net_structs); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("prep_hi_structs=%d\n", xctx->prep_hi_structs);
|
my_snprintf(res, S(res), "prep_hi_structs=%d\n", xctx->prep_hi_structs); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("prep_hash_inst=%d\n", xctx->prep_hash_inst);
|
my_snprintf(res, S(res), "prep_hash_inst=%d\n", xctx->prep_hash_inst); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("prep_hash_wires=%d\n", xctx->prep_hash_wires);
|
my_snprintf(res, S(res), "prep_hash_wires=%d\n", xctx->prep_hash_wires); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("need_reb_sel_arr=%d\n", xctx->need_reb_sel_arr);
|
my_snprintf(res, S(res), "need_reb_sel_arr=%d\n", xctx->need_reb_sel_arr); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("undo_type=%d\n", xctx->undo_type);
|
my_snprintf(res, S(res), "undo_type=%d\n", xctx->undo_type); Tcl_AppendResult(interp, res, NULL);
|
||||||
printf("******* end global variables:*******\n");
|
my_snprintf(res, S(res), "******* end global variables:*******\n"); Tcl_AppendResult(interp, res, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(!strcmp(argv[1],"go_back"))
|
else if(!strcmp(argv[1],"go_back"))
|
||||||
|
|
@ -901,128 +1091,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
||||||
if(!strcmp(argv[1],"help"))
|
if(!strcmp(argv[1],"help"))
|
||||||
{
|
{
|
||||||
cmd_found = 1;
|
cmd_found = 1;
|
||||||
printf("xschem : function used to communicate with the C program\n");
|
xschem_cmd_help(argc, argv);
|
||||||
printf("Usage:\n");
|
|
||||||
printf(" xschem callback X-event_type mousex mousey Xkeysym mouse_button Xstate\n");
|
|
||||||
printf(" can be used to send any event to the application\n");
|
|
||||||
printf(" xschem netlist\n");
|
|
||||||
printf(" generates a netlist in the selected format for the current schematic\n");
|
|
||||||
printf(" xschem simulate\n");
|
|
||||||
printf(" launches the currently set simulator on the generated netlist\n");
|
|
||||||
printf(" xschem redraw\n");
|
|
||||||
printf(" Redraw the window\n");
|
|
||||||
printf(" xschem new_window library/cell\n");
|
|
||||||
printf(" start a new window optionally with specified cell\n");
|
|
||||||
printf(" xschem schematic_in_new_window \n");
|
|
||||||
printf(" start a new window with selected element schematic\n");
|
|
||||||
printf(" xschem symbol_in_new_window \n");
|
|
||||||
printf(" start a new window with selected element schematic\n");
|
|
||||||
printf(" xschem globals\n");
|
|
||||||
printf(" print information about global variables\n");
|
|
||||||
printf(" xschem inst_ptr n\n");
|
|
||||||
printf(" return inst_ptr of inst[n]\n");
|
|
||||||
printf(" xschem netlist\n");
|
|
||||||
printf(" perform a global netlist on current schematic\n");
|
|
||||||
printf(" xschem netlist_type type\n");
|
|
||||||
printf(" set netlist type to <type>, currently spice, vhdl, verilog or tedax\n");
|
|
||||||
printf(" xschem save [library/name]\n");
|
|
||||||
printf(" save current schematic, optionally a lib/name can be given\n");
|
|
||||||
printf(" xschem saveas\n");
|
|
||||||
printf(" save current schematic, asking for a filename\n");
|
|
||||||
printf(" xschem load library/cell\n");
|
|
||||||
printf(" load specified cell from library\n");
|
|
||||||
printf(" xschem load_symbol library/cell\n");
|
|
||||||
printf(" load specified cell symbol view from library\n");
|
|
||||||
printf(" xschem reload\n");
|
|
||||||
printf(" reload current cell from library\n");
|
|
||||||
printf(" xschem instance library/cell x y rot flip [property string]\n");
|
|
||||||
printf(" place instance cell of the given library at x,y, rot, flip\n");
|
|
||||||
printf(" can also be given a property string\n");
|
|
||||||
printf(" xschem rect x1 y1 x2 y2 [pos]\n");
|
|
||||||
printf(" place rectangle, optionally at pos (position in database)\n");
|
|
||||||
printf(" xschem line x1 y1 x2 y2 [pos]\n");
|
|
||||||
printf(" place line, optionally at pos (position in database)\n");
|
|
||||||
printf(" xschem wire x1 y1 x2 y2 [pos]\n");
|
|
||||||
printf(" place wire, optionally at pos (position in database)\n");
|
|
||||||
printf(" xschem select instance|wire|text n\n");
|
|
||||||
printf(" select instance or text or wire number n\n");
|
|
||||||
printf(" xschem select_all\n");
|
|
||||||
printf(" select all objects\n");
|
|
||||||
printf(" xschem descend\n");
|
|
||||||
printf(" descend into schematic of selected element\n");
|
|
||||||
printf(" xschem descend_symbol\n");
|
|
||||||
printf(" descend into symbol of selected element\n");
|
|
||||||
printf(" xschem go_back\n");
|
|
||||||
printf(" back from selected element\n");
|
|
||||||
printf(" xschem unselect\n");
|
|
||||||
printf(" unselect selected objects\n");
|
|
||||||
printf(" xschem zoom_out\n");
|
|
||||||
printf(" zoom out\n");
|
|
||||||
printf(" xschem zoom_in\n");
|
|
||||||
printf(" zoom in\n");
|
|
||||||
printf(" xschem zoom_full\n");
|
|
||||||
printf(" zoom full\n");
|
|
||||||
printf(" xschem zoom_box\n");
|
|
||||||
printf(" zoom box\n");
|
|
||||||
printf(" xschem paste\n");
|
|
||||||
printf(" paste selection from clipboard\n");
|
|
||||||
printf(" xschem merge\n");
|
|
||||||
printf(" merge external file into current schematic\n");
|
|
||||||
printf(" xschem cut\n");
|
|
||||||
printf(" cut selection to clipboard\n");
|
|
||||||
printf(" xschem copy\n");
|
|
||||||
printf(" copy selection to clipboard\n");
|
|
||||||
printf(" xschem copy_objects\n");
|
|
||||||
printf(" duplicate selected objects\n");
|
|
||||||
printf(" xschem move_objects [deltax deltay]\n");
|
|
||||||
printf(" move selected objects\n");
|
|
||||||
printf(" xschem line_width n\n");
|
|
||||||
printf(" set line width to (float) n\n");
|
|
||||||
printf(" xschem delete\n");
|
|
||||||
printf(" delete selected objects\n");
|
|
||||||
printf(" xschem unhilight\n");
|
|
||||||
printf(" unlight selected nets/pins\n");
|
|
||||||
printf(" xschem hilight\n");
|
|
||||||
printf(" hilight selected nets/pins\n");
|
|
||||||
printf(" xschem clear_hilights\n");
|
|
||||||
printf(" unhilight all nets/pins\n");
|
|
||||||
printf(" xschem print [color]\n");
|
|
||||||
printf(" print schematic (optionally in color)\n");
|
|
||||||
printf(" xschem search regex|exact <select> token value\n");
|
|
||||||
printf(" hilight instances which match tok=val property,\n");
|
|
||||||
printf(" exact search or regex\n");
|
|
||||||
printf(" select: 0-> highlight, 1-> select, -1-> unselect\n");
|
|
||||||
printf(" xschem log file\n");
|
|
||||||
printf(" open a log file to write messages to\n");
|
|
||||||
printf(" xschem get variable\n");
|
|
||||||
printf(" return global variable\n");
|
|
||||||
printf(" xschem set variable value\n");
|
|
||||||
printf(" set global variable\n");
|
|
||||||
printf(" xschem clear\n");
|
|
||||||
printf(" clear current schematic\n");
|
|
||||||
printf(" xschem exit\n");
|
|
||||||
printf(" exit program gracefully\n");
|
|
||||||
printf(" xschem view_prop\n");
|
|
||||||
printf(" view properties of currently selected element\n");
|
|
||||||
printf(" xschem edit_prop\n");
|
|
||||||
printf(" edit properties of currently selected element\n");
|
|
||||||
printf(" xschem edit_vi_prop\n");
|
|
||||||
printf(" edit properties of currently selected element in a vim window\n");
|
|
||||||
printf(" xschem place_symbol\n");
|
|
||||||
printf(" place new symbol, asking filename\n");
|
|
||||||
printf(" xschem make_symbol\n");
|
|
||||||
printf(" make symbol view from current schematic\n");
|
|
||||||
printf(" xschem make_sch_from_sel\n");
|
|
||||||
printf(" make schematic view from selected components\n");
|
|
||||||
printf(" xschem place_text\n");
|
|
||||||
printf(" place new text\n");
|
|
||||||
printf(" xschem debug n\n");
|
|
||||||
printf(" set debug level to n: 1, 2, 3 for C Program \n");
|
|
||||||
printf(" -1,-2,-3 for Tcl frontend\n");
|
|
||||||
#ifndef __unix__
|
|
||||||
printf(" xschem temp_dir\n");
|
|
||||||
printf(" get a valid temp folder path\n");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(!strcmp(argv[1],"hier_psprint"))
|
else if(!strcmp(argv[1],"hier_psprint"))
|
||||||
|
|
@ -1037,7 +1106,6 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
||||||
xctx->enable_drill = 0;
|
xctx->enable_drill = 0;
|
||||||
if(argc >=3 && !strcmp(argv[2], "drill")) xctx->enable_drill = 1;
|
if(argc >=3 && !strcmp(argv[2], "drill")) xctx->enable_drill = 1;
|
||||||
hilight_net(0);
|
hilight_net(0);
|
||||||
/* draw_hilight_net(1); */
|
|
||||||
redraw_hilights(0);
|
redraw_hilights(0);
|
||||||
Tcl_ResetResult(interp);
|
Tcl_ResetResult(interp);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1051,7 +1051,7 @@ extern void descend_symbol(void);
|
||||||
extern int place_symbol(int pos, const char *symbol_name, double x, double y, short rot, short flip,
|
extern int place_symbol(int pos, const char *symbol_name, double x, double y, short rot, short flip,
|
||||||
const char *inst_props, int draw_sym, int first_call, int to_push_undo);
|
const char *inst_props, int draw_sym, int first_call, int to_push_undo);
|
||||||
extern void place_net_label(int type);
|
extern void place_net_label(int type);
|
||||||
extern void attach_labels_to_inst(void);
|
extern void attach_labels_to_inst(int interactive);
|
||||||
extern void delete_files(void);
|
extern void delete_files(void);
|
||||||
extern int sym_vs_sch_pins(void);
|
extern int sym_vs_sch_pins(void);
|
||||||
extern int match_symbol(const char name[]);
|
extern int match_symbol(const char name[]);
|
||||||
|
|
|
||||||
|
|
@ -980,7 +980,7 @@ proc gaw_echoline {} {
|
||||||
puts "gaw -> $line"
|
puts "gaw -> $line"
|
||||||
}
|
}
|
||||||
|
|
||||||
proc gaw_setup_tcp {} {
|
proc setup_tcp_gaw {} {
|
||||||
global gaw_fd gaw_tcp_address netlist_dir has_x
|
global gaw_fd gaw_tcp_address netlist_dir has_x
|
||||||
|
|
||||||
simuldir
|
simuldir
|
||||||
|
|
@ -4425,15 +4425,18 @@ proc source_user_tcl_files {} {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
proc setup_tcp_ports {} {
|
proc setup_tcp_xschem {} {
|
||||||
global xschem_listen_port bespice_listen_port
|
global xschem_listen_port
|
||||||
if { [info exists xschem_listen_port] && ($xschem_listen_port ne {}) } {
|
if { [info exists xschem_listen_port] && ($xschem_listen_port ne {}) } {
|
||||||
if {[catch {socket -server xschem_server $xschem_listen_port} err]} {
|
if {[catch {socket -server xschem_server $xschem_listen_port} err]} {
|
||||||
puts "problems listening to TCP port: $xschem_listen_port"
|
puts "problems listening to TCP port: $xschem_listen_port"
|
||||||
puts $err
|
puts $err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
proc setup_tcp_bespice {} {
|
||||||
|
global bespice_listen_port
|
||||||
if { [info exists bespice_listen_port] && ($bespice_listen_port ne {}) } {
|
if { [info exists bespice_listen_port] && ($bespice_listen_port ne {}) } {
|
||||||
if {[catch {socket -server bespice_server $bespice_listen_port} err]} {
|
if {[catch {socket -server bespice_server $bespice_listen_port} err]} {
|
||||||
puts "problems listening to TCP port: $bespice_listen_port"
|
puts "problems listening to TCP port: $bespice_listen_port"
|
||||||
|
|
@ -4721,5 +4724,6 @@ if { $show_infowindow } { wm deiconify .infotext }
|
||||||
source_user_tcl_files
|
source_user_tcl_files
|
||||||
|
|
||||||
# xschem listen and bespice listen
|
# xschem listen and bespice listen
|
||||||
setup_tcp_ports
|
setup_tcp_xschem
|
||||||
|
setup_tcp_bespice
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue