1 /* -*- tab-width: 4 -*-
2 *
3 * Electric(tm) VLSI Design System
4 *
5 * File: dblangtcl.c
6 * TCL interface module
7 * Written by: Steven M. Rubin, Static Free Software
8 *
9 * Copyright (c) 2000 Static Free Software.
10 *
11 * Electric(tm) is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * Electric(tm) is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with Electric(tm); see the file COPYING. If not, write to
23 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
24 * Boston, Mass 02111-1307, USA.
25 *
26 * Static Free Software
27 * 4119 Alpine Road
28 * Portola Valley, California 94028
29 * info@staticfreesoft.com
30 */
31
32 #include "config.h"
33 #if LANGTCL
34
35 #include "global.h"
36 #include "dblang.h"
37 #include "database.h"
38
39 #define BUFSIZE 500
40
41 CHAR *tcl_outputbuffer, *tcl_outputloc;
42 static CHAR *tcl_inputbuffer;
43 Tcl_Interp *tcl_interp = 0;
44
45 /* prototypes for local routines */
46 static void tcl_dumpoutput(CHAR *str);
47 static void tcl_converttoanyelectric(CHAR *tclstr, INTBIG *addr, INTBIG *type);
48 static void tcl_converttoscalartcl(void *infstr, INTBIG addr, INTBIG type);
49 static CHAR *tcl_converttotcl(INTBIG addr, INTBIG type);
50 static INTBIG tcl_converttowarnedelectric(CHAR *name, INTBIG want, CHAR *msg);
51 static int tcl_tkconsoleclose(ClientData instanceData, Tcl_Interp *interp);
52 static int tcl_tkconsoleinput(ClientData instanceData, char *buf, int bufSize, int *errorCode);
53 static int tcl_tkconsoleoutput(ClientData instanceData, char *buf, int toWrite, int *errorCode);
54 static void tcl_tkconsolewatch(ClientData instanceData, int mask);
55
56 static int tcl_curlib(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
57 static int tcl_curtech(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
58 static int tcl_getval(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
59 static int tcl_getparentval(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
60 static int tcl_P(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
61 static int tcl_PD(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
62 static int tcl_PAR(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
63 static int tcl_PARD(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
64 static int tcl_setval(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
65 static int tcl_setind(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
66 static int tcl_delval(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
67 static int tcl_initsearch(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
68 static int tcl_nextobject(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
69 static int tcl_gettool(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
70 static int tcl_maxtool(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
71 static int tcl_indextool(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
72 static int tcl_toolturnon(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
73 static int tcl_toolturnoff(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
74 static int tcl_getlibrary(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
75 static int tcl_newlibrary(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
76 static int tcl_killlibrary(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
77 static int tcl_eraselibrary(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
78 static int tcl_selectlibrary(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
79 static int tcl_getnodeproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
80 static int tcl_newnodeproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
81 static int tcl_killnodeproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
82 static int tcl_copynodeproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
83 static int tcl_iconview(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
84 static int tcl_contentsview(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
85 static int tcl_newnodeinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
86 static int tcl_modifynodeinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
87 static int tcl_killnodeinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
88 static int tcl_replacenodeinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
89 static int tcl_nodefunction(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
90 static int tcl_newarcinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
91 static int tcl_modifyarcinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
92 static int tcl_killarcinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
93 static int tcl_replacearcinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
94 static int tcl_newportproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
95 static int tcl_portposition(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
96 static int tcl_getportproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
97 static int tcl_killportproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
98 static int tcl_moveportproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
99 static int tcl_undoabatch(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
100 static int tcl_noundoallowed(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
101 static int tcl_getview(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
102 static int tcl_newview(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
103 static int tcl_killview(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
104 static int tcl_telltool(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
105 static int tcl_asktool(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
106 static int tcl_getarcproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
107 static int tcl_gettechnology(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
108 static int tcl_getpinproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
109 static int tcl_getnetwork(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv);
110
111 /************************* TCL: ELECTRIC ROUTINES *************************/
112 /*
113 * Routine to free all memory associated with this module.
114 */
db_freetclmemory(void)115 void db_freetclmemory(void)
116 {
117 efree((CHAR *)tcl_outputbuffer);
118 efree((CHAR *)tcl_inputbuffer);
119 }
120
el_tclinterpreter(Tcl_Interp * interp)121 void el_tclinterpreter(Tcl_Interp *interp)
122 {
123 Tcl_Channel consoleChannel;
124 CHAR *path;
125 static Tcl_ChannelType consoleChannelType =
126 {
127 "console", /* Type name. */
128 NULL, /* Always non-blocking.*/
129 tcl_tkconsoleclose, /* Close proc. */
130 tcl_tkconsoleinput, /* Input proc. */
131 tcl_tkconsoleoutput, /* Output proc. */
132 NULL, /* Seek proc. */
133 NULL, /* Set option proc. */
134 NULL, /* Get option proc. */
135 tcl_tkconsolewatch, /* Watch for events on console. */
136 NULL, /* Are events present? */
137 };
138 REGISTER void *infstr;
139
140 /* remember the interpreter */
141 tcl_interp = interp;
142
143 /* allocate terminal I/O buffers */
144 tcl_outputbuffer = (CHAR *)emalloc(BUFSIZE * SIZEOFCHAR, db_cluster);
145 tcl_inputbuffer = (CHAR *)emalloc(BUFSIZE * SIZEOFCHAR, db_cluster);
146 if (tcl_outputbuffer == 0 || tcl_inputbuffer == 0) return;
147 tcl_outputloc = tcl_outputbuffer;
148
149 /* set console channels */
150 consoleChannel = Tcl_CreateChannel(&consoleChannelType, x_("console0"), (ClientData)TCL_STDIN, TCL_READABLE);
151 if (consoleChannel != NULL)
152 {
153 Tcl_SetChannelOption(NULL, consoleChannel, x_("-translation"), x_("lf"));
154 Tcl_SetChannelOption(NULL, consoleChannel, x_("-buffering"), x_("none"));
155 }
156 Tcl_SetStdChannel(consoleChannel, TCL_STDIN);
157 consoleChannel = Tcl_CreateChannel(&consoleChannelType, x_("console1"), (ClientData)TCL_STDOUT, TCL_WRITABLE);
158 if (consoleChannel != NULL)
159 {
160 Tcl_SetChannelOption(NULL, consoleChannel, x_("-translation"), x_("lf"));
161 Tcl_SetChannelOption(NULL, consoleChannel, x_("-buffering"), x_("none"));
162 }
163 Tcl_SetStdChannel(consoleChannel, TCL_STDOUT);
164 consoleChannel = Tcl_CreateChannel(&consoleChannelType, x_("console2"), (ClientData)TCL_STDERR, TCL_WRITABLE);
165 if (consoleChannel != NULL)
166 {
167 Tcl_SetChannelOption(NULL, consoleChannel, x_("-translation"), x_("lf"));
168 Tcl_SetChannelOption(NULL, consoleChannel, x_("-buffering"), x_("none"));
169 }
170 Tcl_SetStdChannel(consoleChannel, TCL_STDERR);
171
172 /* set the system version */
173 if (Tcl_SetVar(tcl_interp, x_("el_version"), el_version, TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG) == NULL)
174 {
175 ttyputerr(_("Tcl_SetVar failed: %s"), tcl_interp->result);
176 ttyputmsg(_("couldn't set el_version variable"));
177 }
178
179 /* set the Electric library directory */
180 if (Tcl_SetVar(tcl_interp, x_("el_libdir"), el_libdir, TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG) == NULL)
181 {
182 ttyputerr(_("Tcl_SetVar failed: %s"), tcl_interp->result);
183 ttyputmsg(_("couldn't set el_libdir variable"));
184 }
185
186 /* set the Electric LISP directory */
187 infstr = initinfstr();
188 addstringtoinfstr(infstr, el_libdir);
189 addstringtoinfstr(infstr, x_("lisp"));
190 addtoinfstr(infstr, DIRSEP);
191 if (Tcl_SetVar(tcl_interp, x_("el_lispdir"), returninfstr(infstr), TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG) == NULL)
192 {
193 ttyputerr(_("Tcl_SetVar failed: %s"), tcl_interp->result);
194 ttyputmsg(_("couldn't set el_lispdir variable"));
195 }
196
197 /* set the Electric Tcl directory for extra TCL code */
198 infstr = initinfstr();
199 addstringtoinfstr(infstr, el_libdir);
200 addstringtoinfstr(infstr, x_("tcl"));
201 addtoinfstr(infstr, DIRSEP);
202 path = returninfstr(infstr);
203 if (Tcl_SetVar(tcl_interp, x_("el_tcldir"), path, TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG) == NULL)
204 {
205 ttyputerr(_("Tcl_SetVar failed: %s"), tcl_interp->result);
206 ttyputmsg(_("couldn't set el_tcldir variable"));
207 }
208
209 /* create the Electric commands */
210 Tcl_CreateCommand(tcl_interp, x_("curlib"), tcl_curlib, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
211 Tcl_CreateCommand(tcl_interp, x_("curtech"), tcl_curtech, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
212 Tcl_CreateCommand(tcl_interp, x_("getval"), tcl_getval, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
213 Tcl_CreateCommand(tcl_interp, x_("getparentval"), tcl_getparentval, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
214 Tcl_CreateCommand(tcl_interp, x_("P"), tcl_P, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
215 Tcl_CreateCommand(tcl_interp, x_("PD"), tcl_PD, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
216 Tcl_CreateCommand(tcl_interp, x_("PAR"), tcl_PAR, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
217 Tcl_CreateCommand(tcl_interp, x_("PARD"), tcl_PARD, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
218 Tcl_CreateCommand(tcl_interp, x_("setval"), tcl_setval, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
219 Tcl_CreateCommand(tcl_interp, x_("setind"), tcl_setind, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
220 Tcl_CreateCommand(tcl_interp, x_("delval"), tcl_delval, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
221 Tcl_CreateCommand(tcl_interp, x_("initsearch"), tcl_initsearch, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
222 Tcl_CreateCommand(tcl_interp, x_("nextobject"), tcl_nextobject, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
223 Tcl_CreateCommand(tcl_interp, x_("gettool"), tcl_gettool, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
224 Tcl_CreateCommand(tcl_interp, x_("maxtool"), tcl_maxtool, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
225 Tcl_CreateCommand(tcl_interp, x_("indextool"), tcl_indextool, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
226 Tcl_CreateCommand(tcl_interp, x_("toolturnon"), tcl_toolturnon, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
227 Tcl_CreateCommand(tcl_interp, x_("toolturnoff"), tcl_toolturnoff, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
228 Tcl_CreateCommand(tcl_interp, x_("getlibrary"), tcl_getlibrary, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
229 Tcl_CreateCommand(tcl_interp, x_("newlibrary"), tcl_newlibrary, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
230 Tcl_CreateCommand(tcl_interp, x_("killlibrary"), tcl_killlibrary, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
231 Tcl_CreateCommand(tcl_interp, x_("eraselibrary"), tcl_eraselibrary, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
232 Tcl_CreateCommand(tcl_interp, x_("selectlibrary"), tcl_selectlibrary, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
233 Tcl_CreateCommand(tcl_interp, x_("getnodeproto"), tcl_getnodeproto, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
234 Tcl_CreateCommand(tcl_interp, x_("newnodeproto"), tcl_newnodeproto, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
235 Tcl_CreateCommand(tcl_interp, x_("killnodeproto"), tcl_killnodeproto, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
236 Tcl_CreateCommand(tcl_interp, x_("copynodeproto"), tcl_copynodeproto, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
237 Tcl_CreateCommand(tcl_interp, x_("iconview"), tcl_iconview, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
238 Tcl_CreateCommand(tcl_interp, x_("contentsview"), tcl_contentsview, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
239 Tcl_CreateCommand(tcl_interp, x_("newnodeinst"), tcl_newnodeinst, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
240 Tcl_CreateCommand(tcl_interp, x_("modifynodeinst"), tcl_modifynodeinst, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
241 Tcl_CreateCommand(tcl_interp, x_("killnodeinst"), tcl_killnodeinst, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
242 Tcl_CreateCommand(tcl_interp, x_("replacenodeinst"), tcl_replacenodeinst, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
243 Tcl_CreateCommand(tcl_interp, x_("nodefunction"), tcl_nodefunction, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
244 Tcl_CreateCommand(tcl_interp, x_("newarcinst"), tcl_newarcinst, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
245 Tcl_CreateCommand(tcl_interp, x_("modifyarcinst"), tcl_modifyarcinst, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
246 Tcl_CreateCommand(tcl_interp, x_("killarcinst"), tcl_killarcinst, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
247 Tcl_CreateCommand(tcl_interp, x_("replacearcinst"), tcl_replacearcinst, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
248 Tcl_CreateCommand(tcl_interp, x_("newportproto"), tcl_newportproto, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
249 Tcl_CreateCommand(tcl_interp, x_("portposition"), tcl_portposition, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
250 Tcl_CreateCommand(tcl_interp, x_("getportproto"), tcl_getportproto, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
251 Tcl_CreateCommand(tcl_interp, x_("killportproto"), tcl_killportproto, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
252 Tcl_CreateCommand(tcl_interp, x_("moveportproto"), tcl_moveportproto, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
253 Tcl_CreateCommand(tcl_interp, x_("undoabatch"), tcl_undoabatch, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
254 Tcl_CreateCommand(tcl_interp, x_("noundoallowed"), tcl_noundoallowed, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
255 Tcl_CreateCommand(tcl_interp, x_("getview"), tcl_getview, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
256 Tcl_CreateCommand(tcl_interp, x_("newview"), tcl_newview, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
257 Tcl_CreateCommand(tcl_interp, x_("killview"), tcl_killview, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
258 Tcl_CreateCommand(tcl_interp, x_("telltool"), tcl_telltool, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
259 Tcl_CreateCommand(tcl_interp, x_("asktool"), tcl_asktool, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
260 Tcl_CreateCommand(tcl_interp, x_("getarcproto"), tcl_getarcproto, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
261 Tcl_CreateCommand(tcl_interp, x_("gettechnology"), tcl_gettechnology, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
262 Tcl_CreateCommand(tcl_interp, x_("getpinproto"), tcl_getpinproto, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
263 Tcl_CreateCommand(tcl_interp, x_("getnetwork"), tcl_getnetwork, (ClientData)0, (Tcl_CmdDeleteProc *)NULL);
264 }
265
tcl_converttoanyelectric(CHAR * tclstr,INTBIG * addr,INTBIG * type)266 void tcl_converttoanyelectric(CHAR *tclstr, INTBIG *addr, INTBIG *type)
267 {
268 REGISTER CHAR *pt;
269 REGISTER float fval;
270 REGISTER void *infstr;
271
272 /* simple if it is a number */
273 if (isanumber(tclstr))
274 {
275 for(pt = tclstr; *pt != 0; pt++)
276 if (*pt == '.')
277 {
278 /* with a decimal point, use floating point representation */
279 fval = (float)eatof(tclstr);
280 *addr = castint(fval);
281 *type = VFLOAT;
282 return;
283 }
284
285 /* just an integer */
286 *addr = myatoi(tclstr);
287 *type = VINTEGER;
288 return;
289 }
290
291 /* check for special Electric object names */
292 if (namesamen(tclstr, x_("#nodeinst"), 9) == 0) { *addr = myatoi(&tclstr[9]); *type = VNODEINST; return; }
293 if (namesamen(tclstr, x_("#nodeproto"), 10) == 0) { *addr = myatoi(&tclstr[10]); *type = VNODEPROTO; return; }
294 if (namesamen(tclstr, x_("#portarcinst"), 12) == 0) { *addr = myatoi(&tclstr[12]); *type = VPORTARCINST; return; }
295 if (namesamen(tclstr, x_("#portexpinst"), 12) == 0) { *addr = myatoi(&tclstr[12]); *type = VPORTEXPINST; return; }
296 if (namesamen(tclstr, x_("#portproto"), 10) == 0) { *addr = myatoi(&tclstr[10]); *type = VPORTPROTO; return; }
297 if (namesamen(tclstr, x_("#arcinst"), 8) == 0) { *addr = myatoi(&tclstr[8]); *type = VARCINST; return; }
298 if (namesamen(tclstr, x_("#arcproto"), 9) == 0) { *addr = myatoi(&tclstr[9]); *type = VARCPROTO; return; }
299 if (namesamen(tclstr, x_("#geom"), 5) == 0) { *addr = myatoi(&tclstr[5]); *type = VGEOM; return; }
300 if (namesamen(tclstr, x_("#library"), 8) == 0) { *addr = myatoi(&tclstr[8]); *type = VLIBRARY; return; }
301 if (namesamen(tclstr, x_("#technology"), 11) == 0) { *addr = myatoi(&tclstr[11]); *type = VTECHNOLOGY; return; }
302 if (namesamen(tclstr, x_("#tool"), 5) == 0) { *addr = myatoi(&tclstr[5]); *type = VTOOL; return; }
303 if (namesamen(tclstr, x_("#rtnode"), 7) == 0) { *addr = myatoi(&tclstr[7]); *type = VRTNODE; return; }
304 if (namesamen(tclstr, x_("#network"), 8) == 0) { *addr = myatoi(&tclstr[8]); *type = VNETWORK; return; }
305 if (namesamen(tclstr, x_("#view"), 5) == 0) { *addr = myatoi(&tclstr[5]); *type = VVIEW; return; }
306 if (namesamen(tclstr, x_("#window"), 7) == 0) { *addr = myatoi(&tclstr[7]); *type = VWINDOWPART; return; }
307 if (namesamen(tclstr, x_("#graphics"), 9) == 0) { *addr = myatoi(&tclstr[9]); *type = VGRAPHICS; return; }
308 if (namesamen(tclstr, x_("#constraint"), 11) == 0) { *addr = myatoi(&tclstr[11]); *type = VCONSTRAINT; return; }
309 if (namesamen(tclstr, x_("#windowframe"), 12) == 0) { *addr = myatoi(&tclstr[7]); *type = VWINDOWFRAME; return; }
310
311 /* just a string */
312 infstr = initinfstr();
313 addstringtoinfstr(infstr, tclstr);
314 *addr = (INTBIG)returninfstr(infstr);
315 *type = VSTRING;
316 }
317
tcl_converttoelectric(CHAR * tclstr,INTBIG type)318 INTBIG tcl_converttoelectric(CHAR *tclstr, INTBIG type)
319 {
320 REGISTER void *infstr;
321
322 switch (type&VTYPE)
323 {
324 case VSTRING:
325 infstr = initinfstr();
326 addstringtoinfstr(infstr, tclstr);
327 return((INTBIG)returninfstr(infstr));
328
329 case VINTEGER:
330 case VSHORT:
331 case VBOOLEAN:
332 case VADDRESS:
333 return(myatoi(tclstr));
334
335 case VFLOAT:
336 case VDOUBLE:
337 return(castint((float)eatof(tclstr)));
338
339 case VFRACT:
340 return(myatoi(tclstr) * WHOLE);
341
342 case VNODEINST: if (namesamen(tclstr, x_("#nodeinst"), 9) == 0) return(myatoi(&tclstr[9])); break;
343 case VNODEPROTO: if (namesamen(tclstr, x_("#nodeproto"), 10) == 0) return(myatoi(&tclstr[10])); break;
344 case VPORTARCINST: if (namesamen(tclstr, x_("#portarcinst"), 12) == 0) return(myatoi(&tclstr[12])); break;
345 case VPORTEXPINST: if (namesamen(tclstr, x_("#portexpinst"), 12) == 0) return(myatoi(&tclstr[12])); break;
346 case VPORTPROTO: if (namesamen(tclstr, x_("#portproto"), 10) == 0) return(myatoi(&tclstr[10])); break;
347 case VARCINST: if (namesamen(tclstr, x_("#arcinst"), 8) == 0) return(myatoi(&tclstr[8])); break;
348 case VARCPROTO: if (namesamen(tclstr, x_("#arcproto"), 9) == 0) return(myatoi(&tclstr[9])); break;
349 case VGEOM: if (namesamen(tclstr, x_("#geom"), 5) == 0) return(myatoi(&tclstr[5])); break;
350 case VLIBRARY: if (namesamen(tclstr, x_("#library"), 8) == 0) return(myatoi(&tclstr[8])); break;
351 case VTECHNOLOGY: if (namesamen(tclstr, x_("#technology"), 11) == 0) return(myatoi(&tclstr[11])); break;
352 case VTOOL: if (namesamen(tclstr, x_("#tool"), 5) == 0) return(myatoi(&tclstr[5])); break;
353 case VRTNODE: if (namesamen(tclstr, x_("#rtnode"), 7) == 0) return(myatoi(&tclstr[7])); break;
354 case VNETWORK: if (namesamen(tclstr, x_("#network"), 8) == 0) return(myatoi(&tclstr[8])); break;
355 case VVIEW: if (namesamen(tclstr, x_("#view"), 5) == 0) return(myatoi(&tclstr[5])); break;
356 case VWINDOWPART: if (namesamen(tclstr, x_("#window"), 7) == 0) return(myatoi(&tclstr[7])); break;
357 case VGRAPHICS: if (namesamen(tclstr, x_("#graphics"), 9) == 0) return(myatoi(&tclstr[9])); break;
358 case VCONSTRAINT: if (namesamen(tclstr, x_("#constraint"), 11) == 0) return(myatoi(&tclstr[11])); break;
359 case VWINDOWFRAME: if (namesamen(tclstr, x_("#windowframe"), 12) == 0) return(myatoi(&tclstr[12])); break;
360 }
361 return(-1);
362 }
363
tcl_converttowarnedelectric(CHAR * name,INTBIG want,CHAR * msg)364 INTBIG tcl_converttowarnedelectric(CHAR *name, INTBIG want, CHAR *msg)
365 {
366 INTBIG addr, type;
367
368 tcl_converttoanyelectric(name, &addr, &type);
369 if (type != want)
370 {
371 Tcl_AppendResult(tcl_interp, msg, _(" argument has the wrong type"), (CHAR *)NULL);
372 return(-1);
373 }
374 return(addr);
375 }
376
tcl_converttotcl(INTBIG addr,INTBIG type)377 CHAR *tcl_converttotcl(INTBIG addr, INTBIG type)
378 {
379 REGISTER INTBIG saddr, stype, len, i;
380 REGISTER void *infstr;
381
382 /* handle scalars easily */
383 if ((type&VISARRAY) == 0)
384 {
385 infstr = initinfstr();
386 tcl_converttoscalartcl(infstr, addr, type);
387 return(returninfstr(infstr));
388 }
389
390 /* handle arrays */
391 infstr = initinfstr();
392 len = (type&VLENGTH) >> VLENGTHSH;
393 if (len != 0)
394 {
395 stype = type & VTYPE;
396 for(i=0; i<len; i++)
397 {
398 if ((type&VTYPE) == VGENERAL)
399 {
400 stype = ((INTBIG *)addr)[i*2+1];
401 saddr = ((INTBIG *)addr)[i*2];
402 } else
403 {
404 if ((type&VTYPE) == VCHAR) saddr = ((CHAR *)addr)[i]; else
405 if ((type&VTYPE) == VDOUBLE) saddr = (INTBIG)(((double *)addr)[i]); else
406 if ((type&VTYPE) == VSHORT) saddr = ((INTSML *)addr)[i]; else
407 saddr = ((INTBIG *)addr)[i];
408 }
409 if (i != 0) addtoinfstr(infstr, ' ');
410 tcl_converttoscalartcl(infstr, saddr, stype);
411 }
412 } else
413 {
414 for(i=0; ; i++)
415 {
416 if ((type&VTYPE) == VCHAR)
417 {
418 if ((((CHAR *)addr)[i]&0377) == 0377) break;
419 saddr = ((CHAR *)addr)[i];
420 } else if ((type&VTYPE) == VDOUBLE)
421 {
422 if (((double *)addr)[i] == -1) break;
423 saddr = (INTBIG)(((double *)addr)[i]);
424 } else if ((type&VTYPE) == VSHORT)
425 {
426 if (((INTSML *)addr)[i] == -1) break;
427 saddr = ((INTSML *)addr)[i];
428 } else
429 {
430 saddr = ((INTBIG *)addr)[i];
431 if (saddr == -1) break;
432 }
433 if (i != 0) addtoinfstr(infstr, ' ');
434 tcl_converttoscalartcl(infstr, saddr, type);
435 }
436 }
437 return(returninfstr(infstr));
438 }
439
tcl_converttoscalartcl(void * infstr,INTBIG addr,INTBIG type)440 void tcl_converttoscalartcl(void *infstr, INTBIG addr, INTBIG type)
441 {
442 static CHAR line[50];
443
444 switch (type&VTYPE)
445 {
446 case VSTRING:
447 addtoinfstr(infstr, '"');
448 addstringtoinfstr(infstr, (CHAR *)addr);
449 addtoinfstr(infstr, '"');
450 return;
451 case VINTEGER:
452 case VSHORT:
453 case VBOOLEAN:
454 case VADDRESS: esnprintf(line, 50, x_("%ld"), addr); break;
455 case VFLOAT:
456 case VDOUBLE: esnprintf(line, 50, x_("%g"), castfloat(addr)); break;
457 case VFRACT: esnprintf(line, 50, x_("%g"), (float)addr / WHOLE); break;
458 case VNODEINST: esnprintf(line, 50, x_("#nodeinst%ld"), addr); break;
459 case VNODEPROTO: esnprintf(line, 50, x_("#nodeproto%ld"), addr); break;
460 case VPORTARCINST: esnprintf(line, 50, x_("#portarcinst%ld"), addr); break;
461 case VPORTEXPINST: esnprintf(line, 50, x_("#portexpinst%ld"), addr); break;
462 case VPORTPROTO: esnprintf(line, 50, x_("#portproto%ld"), addr); break;
463 case VARCINST: esnprintf(line, 50, x_("#arcinst%ld"), addr); break;
464 case VARCPROTO: esnprintf(line, 50, x_("#arcproto%ld"), addr); break;
465 case VGEOM: esnprintf(line, 50, x_("#geom%ld"), addr); break;
466 case VLIBRARY: esnprintf(line, 50, x_("#library%ld"), addr); break;
467 case VTECHNOLOGY: esnprintf(line, 50, x_("#technology%ld"), addr); break;
468 case VTOOL: esnprintf(line, 50, x_("#tool%ld"), addr); break;
469 case VRTNODE: esnprintf(line, 50, x_("#rtnode%ld"), addr); break;
470 case VNETWORK: esnprintf(line, 50, x_("#network%ld"), addr); break;
471 case VVIEW: esnprintf(line, 50, x_("#view%ld"), addr); break;
472 case VWINDOWPART: esnprintf(line, 50, x_("#window%ld"), addr); break;
473 case VGRAPHICS: esnprintf(line, 50, x_("#graphics%ld"), addr); break;
474 case VCONSTRAINT: esnprintf(line, 50, x_("#constraint%ld"), addr); break;
475 case VWINDOWFRAME: esnprintf(line, 50, x_("#windowframe%ld"), addr); break;
476 default: return;
477 }
478 addstringtoinfstr(infstr, line);
479 }
480
tcl_tkconsoleclose(ClientData instanceData,Tcl_Interp * interp)481 int tcl_tkconsoleclose(ClientData instanceData, Tcl_Interp *interp) { return 0; }
482
tcl_tkconsoleinput(ClientData instanceData,char * buf,int bufSize,int * errorCode)483 int tcl_tkconsoleinput(ClientData instanceData, char *buf, int bufSize, int *errorCode)
484 {
485 REGISTER CHAR *pt;
486 REGISTER INTBIG len, i;
487
488 *errorCode = 0;
489 *tcl_outputloc = 0;
490 pt = ttygetlinemessages(tcl_outputbuffer);
491 tcl_outputloc = tcl_outputbuffer;
492 len = estrlen(pt);
493 if (len > bufSize) len = bufSize;
494 for(i=0; i<len; i++) buf[i] = pt[i];
495 return(len);
496 }
497
tcl_tkconsoleoutput(ClientData instanceData,char * buf,int toWrite,int * errorCode)498 int tcl_tkconsoleoutput(ClientData instanceData, char *buf, int toWrite, int *errorCode)
499 {
500 CHAR save;
501
502 *errorCode = 0;
503 Tcl_SetErrno(0);
504
505 save = buf[toWrite];
506 buf[toWrite] = 0;
507 tcl_dumpoutput(buf);
508 buf[toWrite] = save;
509 return(toWrite);
510 }
511
tcl_tkconsolewatch(ClientData instanceData,int mask)512 void tcl_tkconsolewatch(ClientData instanceData, int mask) {}
513
tcl_dumpoutput(CHAR * str)514 void tcl_dumpoutput(CHAR *str)
515 {
516 while (*str != 0)
517 {
518 if (*str == '\n')
519 {
520 *tcl_outputloc = 0;
521 ttyputmsg(x_("%s"), tcl_outputbuffer);
522 tcl_outputloc = tcl_outputbuffer;
523 } else
524 {
525 if (tcl_outputloc >= tcl_outputbuffer+BUFSIZE-2)
526 {
527 *tcl_outputloc = 0;
528 ttyputmsg(x_("%s"), tcl_outputbuffer);
529 tcl_outputloc = tcl_outputbuffer;
530 }
531 *tcl_outputloc++ = *str;
532 }
533 str++;
534 }
535 }
536
537 /************************* DATABASE EXAMINATION ROUTINES *************************/
538
tcl_curlib(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)539 int tcl_curlib(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
540 {
541 if (argc != 1)
542 {
543 Tcl_AppendResult(interp, x_("Usage: curlib"), (CHAR *)NULL);
544 return TCL_ERROR;
545 }
546
547 /* convert result */
548 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)el_curlib, VLIBRARY), (CHAR *) NULL);
549 return TCL_OK;
550 }
551
tcl_curtech(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)552 int tcl_curtech(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
553 {
554 if (argc != 1)
555 {
556 Tcl_AppendResult(interp, x_("Usage: curtech"), (CHAR *)NULL);
557 return TCL_ERROR;
558 }
559
560 /* convert result */
561 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)el_curtech, VTECHNOLOGY), (CHAR *) NULL);
562 return TCL_OK;
563 }
564
tcl_getval(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)565 int tcl_getval(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
566 {
567 INTBIG addr, type;
568 CHAR *retval;
569 REGISTER VARIABLE *var;
570
571 /* get input */
572 if (argc != 3)
573 {
574 Tcl_AppendResult(interp, x_("Usage: getval OBJECT QUAL"), (CHAR *)NULL);
575 return TCL_ERROR;
576 }
577 tcl_converttoanyelectric(argv[1], &addr, &type);
578
579 /* call Electric */
580 var = getval(addr, type, -1, argv[2]);
581
582 /* convert result */
583 if (var != NOVARIABLE)
584 {
585 retval = tcl_converttotcl(var->addr, var->type);
586 Tcl_AppendResult(interp, retval, (CHAR *)NULL);
587 }
588 return TCL_OK;
589 }
590
tcl_getparentval(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)591 int tcl_getparentval(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
592 {
593 INTBIG height;
594 CHAR *retval;
595 REGISTER VARIABLE *var;
596
597 /* get input */
598 if (argc != 4)
599 {
600 Tcl_AppendResult(interp, x_("Usage: getparentval OBJECT DEFAULT HEIGHT"), (CHAR *)NULL);
601 return TCL_ERROR;
602 }
603 height = myatoi(argv[3]);
604
605 /* call Electric */
606 var = getparentval(argv[1], height);
607
608 /* convert result */
609 if (var == NOVARIABLE) retval = argv[2]; else
610 retval = tcl_converttotcl(var->addr, var->type);
611 Tcl_AppendResult(interp, retval, (CHAR *)NULL);
612 return TCL_OK;
613 }
614
tcl_P(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)615 int tcl_P(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
616 {
617 CHAR *retval, line[300];
618 REGISTER VARIABLE *var;
619
620 /* get input */
621 if (argc != 2)
622 {
623 Tcl_AppendResult(interp, x_("Usage: P OBJECT"), (CHAR *)NULL);
624 return TCL_ERROR;
625 }
626
627 /* call Electric */
628 esnprintf(line, 300, x_("ATTR_%s"), argv[1]);
629 var = getparentval(line, 1);
630
631 /* convert result */
632 if (var != NOVARIABLE)
633 {
634 retval = tcl_converttotcl(var->addr, var->type);
635 Tcl_AppendResult(interp, retval, (CHAR *)NULL);
636 }
637 return TCL_OK;
638 }
639
tcl_PD(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)640 int tcl_PD(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
641 {
642 CHAR *retval, line[300];
643 REGISTER VARIABLE *var;
644
645 /* get input */
646 if (argc != 3)
647 {
648 Tcl_AppendResult(interp, x_("Usage: PD OBJECT DEFAULT"), (CHAR *)NULL);
649 return TCL_ERROR;
650 }
651
652 /* call Electric */
653 esnprintf(line, 300, x_("ATTR_%s"), argv[1]);
654 var = getparentval(line, 1);
655
656 /* convert result */
657 if (var == NOVARIABLE) retval = argv[2]; else
658 retval = tcl_converttotcl(var->addr, var->type);
659 Tcl_AppendResult(interp, retval, (CHAR *)NULL);
660 return TCL_OK;
661 }
662
tcl_PAR(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)663 int tcl_PAR(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
664 {
665 CHAR *retval, line[300];
666 REGISTER VARIABLE *var;
667
668 /* get input */
669 if (argc != 2)
670 {
671 Tcl_AppendResult(interp, x_("Usage: PAR OBJECT"), (CHAR *)NULL);
672 return TCL_ERROR;
673 }
674
675 /* call Electric */
676 esnprintf(line, 300, x_("ATTR_%s"), argv[1]);
677 var = getparentval(line, 0);
678
679 /* convert result */
680 if (var != NOVARIABLE)
681 {
682 retval = tcl_converttotcl(var->addr, var->type);
683 Tcl_AppendResult(interp, retval, (CHAR *)NULL);
684 }
685 return TCL_OK;
686 }
687
tcl_PARD(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)688 int tcl_PARD(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
689 {
690 CHAR *retval, line[300];
691 REGISTER VARIABLE *var;
692
693 /* get input */
694 if (argc != 3)
695 {
696 Tcl_AppendResult(interp, x_("Usage: PARD OBJECT DEFAULT"), (CHAR *)NULL);
697 return TCL_ERROR;
698 }
699
700 /* call Electric */
701 esnprintf(line, 300, x_("ATTR_%s"), argv[1]);
702 var = getparentval(line, 0);
703
704 /* convert result */
705 if (var == NOVARIABLE) retval = argv[2]; else
706 retval = tcl_converttotcl(var->addr, var->type);
707 Tcl_AppendResult(interp, retval, (CHAR *)NULL);
708 return TCL_OK;
709 }
710
tcl_setval(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)711 int tcl_setval(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
712 {
713 INTBIG addr, type, naddr, ntype, i, *naddrlist;
714 REGISTER VARIABLE *ret;
715 CHAR *retval, **setArgv;
716 int setArgc;
717
718 /* get input */
719 if (argc != 4 && argc != 5)
720 {
721 Tcl_AppendResult(interp, x_("Usage: setval OBJECT QUAL NEWVALUE [OPTIONS]"), (CHAR *)NULL);
722 return TCL_ERROR;
723 }
724 tcl_converttoanyelectric(argv[1], &addr, &type);
725
726 /* see how many entries are being set */
727 i = Tcl_SplitList(interp, argv[3], &setArgc, &setArgv);
728 if (i != TCL_OK) return TCL_ERROR;
729
730 /* see if the "newvalue" is an array */
731 if (setArgc > 1)
732 {
733 /* setting an array */
734 naddrlist = (INTBIG *)emalloc(setArgc * SIZEOFINTBIG * 2, el_tempcluster);
735 if (naddrlist == 0) return TCL_ERROR;
736 for(i=0; i<setArgc; i++)
737 tcl_converttoanyelectric(setArgv[i], &naddrlist[i*2], &naddrlist[i*2+1]);
738 ckfree((CHAR *)setArgv);
739
740 /* see if the array is uniform */
741 for(i=1; i<setArgc; i++)
742 if (naddrlist[(i-1)*2+1] != naddrlist[i*2+1]) break;
743 if (i < setArgc)
744 {
745 /* general array */
746 ret = setval(addr, type, argv[2], (INTBIG)naddrlist,
747 VGENERAL|VISARRAY|((setArgc*2) << VLENGTHSH));
748 } else
749 {
750 /* a uniform array */
751 ntype = naddrlist[1];
752 for(i=1; i<setArgc; i++) naddrlist[i] = naddrlist[i*2];
753 ret = setval(addr, type, argv[2], (INTBIG)naddrlist,
754 ntype|VISARRAY|(setArgc << VLENGTHSH));
755 }
756 efree((CHAR *)naddrlist);
757 } else
758 {
759 /* just setting a single value */
760 tcl_converttoanyelectric(argv[3], &naddr, &ntype);
761
762 /* call Electric */
763 ret = setval(addr, type, argv[2], naddr, ntype);
764 }
765 if (argc == 5)
766 {
767 if (namesame(argv[4], x_("displayable")) == 0) ntype |= VDISPLAY;
768 }
769
770 /* convert result */
771 if (ret != NOVARIABLE)
772 {
773 retval = tcl_converttotcl(ret->addr, ret->type);
774 Tcl_AppendResult(interp, retval, (CHAR *)NULL);
775 }
776 return TCL_OK;
777 }
778
tcl_setind(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)779 int tcl_setind(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
780 {
781 INTBIG addr, type, aindex, naddr, ntype;
782 BOOLEAN ret;
783
784 /* get input */
785 if (argc != 5)
786 {
787 Tcl_AppendResult(interp, x_("Usage: setind OBJECT QUAL INDEX NEWVALUE"), (CHAR *)NULL);
788 return TCL_ERROR;
789 }
790 tcl_converttoanyelectric(argv[1], &addr, &type);
791 aindex = myatoi(argv[3]);
792 tcl_converttoanyelectric(argv[4], &naddr, &ntype);
793
794 /* call Electric */
795 ret = setind(addr, type, argv[2], aindex, naddr);
796
797 /* convert result */
798 Tcl_AppendResult(interp, tcl_converttotcl(ret, VINTEGER), (CHAR *) NULL);
799 return TCL_OK;
800 }
801
tcl_delval(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)802 int tcl_delval(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
803 {
804 INTBIG addr, type;
805 BOOLEAN ret;
806
807 /* get input */
808 if (argc != 3)
809 {
810 Tcl_AppendResult(interp, x_("Usage: delval OBJECT QUAL"), (CHAR *)NULL);
811 return TCL_ERROR;
812 }
813 tcl_converttoanyelectric(argv[1], &addr, &type);
814
815 /* call Electric */
816 ret = delval(addr, type, argv[2]);
817
818 /* convert result */
819 Tcl_AppendResult(interp, tcl_converttotcl(ret, VINTEGER), (CHAR *) NULL);
820 return TCL_OK;
821 }
822
tcl_initsearch(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)823 int tcl_initsearch(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
824 {
825 REGISTER INTBIG lx, hx, ly, hy, sea;
826 REGISTER NODEPROTO *np;
827
828 /* get input */
829 if (argc != 6)
830 {
831 Tcl_AppendResult(interp, x_("Usage: initsearch LX HX LY HY CELL"), (CHAR *)NULL);
832 return TCL_ERROR;
833 }
834 lx = myatoi(argv[1]);
835 hx = myatoi(argv[2]);
836 ly = myatoi(argv[3]);
837 hy = myatoi(argv[4]);
838 np = (NODEPROTO *)tcl_converttowarnedelectric(argv[5], VNODEPROTO, x_("fifth"));
839 if (np == NONODEPROTO) return TCL_ERROR;
840
841 /* call Electric */
842 sea = initsearch(lx, hx, ly, hy, np);
843
844 /* convert result */
845 Tcl_AppendResult(interp, tcl_converttotcl(sea, VINTEGER), (CHAR *) NULL);
846 return TCL_OK;
847 }
848
tcl_nextobject(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)849 int tcl_nextobject(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
850 {
851 REGISTER INTBIG sea;
852 REGISTER GEOM *g;
853
854 /* get input */
855 if (argc != 2)
856 {
857 Tcl_AppendResult(interp, x_("Usage: nextobject SEARCH"), (CHAR *)NULL);
858 return TCL_ERROR;
859 }
860 sea = myatoi(argv[1]);
861
862 /* call Electric */
863 g = nextobject(sea);
864
865 /* convert result */
866 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)g, VGEOM), (CHAR *) NULL);
867 return TCL_OK;
868 }
869
870 /****************************** TOOL ROUTINES ******************************/
871
tcl_gettool(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)872 int tcl_gettool(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
873 {
874 REGISTER TOOL *tool;
875
876 /* get input */
877 if (argc != 2)
878 {
879 Tcl_AppendResult(interp, x_("Usage: gettool NAME"), (CHAR *)NULL);
880 return TCL_ERROR;
881 }
882
883 /* call Electric */
884 tool = gettool(argv[1]);
885
886 /* convert result */
887 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)tool, VTOOL), (CHAR *) NULL);
888 return TCL_OK;
889 }
890
tcl_maxtool(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)891 int tcl_maxtool(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
892 {
893 /* get input */
894 if (argc != 1)
895 {
896 Tcl_AppendResult(interp, x_("Usage: maxtool"), (CHAR *)NULL);
897 return TCL_ERROR;
898 }
899
900 /* convert result */
901 Tcl_AppendResult(interp, tcl_converttotcl(el_maxtools, VINTEGER), (CHAR *) NULL);
902 return TCL_OK;
903 }
904
tcl_indextool(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)905 int tcl_indextool(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
906 {
907 REGISTER TOOL *tool;
908 REGISTER INTBIG aindex;
909
910 /* get input */
911 if (argc != 2)
912 {
913 Tcl_AppendResult(interp, x_("Usage: indextool INDEX"), (CHAR *)NULL);
914 return TCL_ERROR;
915 }
916 aindex = myatoi(argv[1]);
917
918 /* call Electric */
919 if (aindex < 0 || aindex >= el_maxtools) tool = NOTOOL; else tool = &el_tools[aindex];
920
921 /* convert result */
922 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)tool, VTOOL), (CHAR *) NULL);
923 return TCL_OK;
924 }
925
tcl_toolturnon(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)926 int tcl_toolturnon(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
927 {
928 REGISTER TOOL *tool;
929
930 /* get input */
931 if (argc != 2)
932 {
933 Tcl_AppendResult(interp, x_("Usage: toolturnon TOOL"), (CHAR *)NULL);
934 return TCL_ERROR;
935 }
936 tool = (TOOL *)tcl_converttowarnedelectric(argv[1], VTOOL, x_("first"));
937 if (tool == NOTOOL) return TCL_ERROR;
938
939 /* call Electric */
940 toolturnon(tool);
941 return TCL_OK;
942 }
943
tcl_toolturnoff(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)944 int tcl_toolturnoff(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
945 {
946 REGISTER TOOL *tool;
947
948 /* get input */
949 if (argc != 2)
950 {
951 Tcl_AppendResult(interp, x_("Usage: toolturnoff TOOL"), (CHAR *)NULL);
952 return TCL_ERROR;
953 }
954 tool = (TOOL *)tcl_converttowarnedelectric(argv[1], VTOOL, x_("first"));
955 if (tool == NOTOOL) return TCL_ERROR;
956
957 /* call Electric */
958 toolturnoff(tool, TRUE);
959 return TCL_OK;
960 }
961
962 /****************************** LIBRARY ROUTINES ******************************/
963
tcl_getlibrary(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)964 int tcl_getlibrary(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
965 {
966 REGISTER LIBRARY *lib;
967
968 /* get input */
969 if (argc != 2)
970 {
971 Tcl_AppendResult(interp, x_("Usage: getlibrary NAME"), (CHAR *)NULL);
972 return TCL_ERROR;
973 }
974
975 /* call Electric */
976 lib = getlibrary(argv[1]);
977
978 /* convert result */
979 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)lib, VLIBRARY), (CHAR *) NULL);
980 return TCL_OK;
981 }
982
tcl_newlibrary(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)983 int tcl_newlibrary(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
984 {
985 REGISTER LIBRARY *lib;
986
987 /* get input */
988 if (argc != 3)
989 {
990 Tcl_AppendResult(interp, x_("Usage: newlibrary NAME FILE"), (CHAR *)NULL);
991 return TCL_ERROR;
992 }
993
994 /* call Electric */
995 lib = newlibrary(argv[1], argv[2]);
996
997 /* convert result */
998 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)lib, VLIBRARY), (CHAR *) NULL);
999 return TCL_OK;
1000 }
1001
tcl_killlibrary(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1002 int tcl_killlibrary(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1003 {
1004 REGISTER LIBRARY *lib;
1005
1006 /* get input */
1007 if (argc != 2)
1008 {
1009 Tcl_AppendResult(interp, x_("Usage: killlibrary LIBRARY"), (CHAR *)NULL);
1010 return TCL_ERROR;
1011 }
1012 lib = (LIBRARY *)tcl_converttowarnedelectric(argv[1], VLIBRARY, x_("first"));
1013 if (lib == NOLIBRARY) return TCL_ERROR;
1014
1015 /* call Electric */
1016 killlibrary(lib);
1017 return TCL_OK;
1018 }
1019
tcl_eraselibrary(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1020 int tcl_eraselibrary(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1021 {
1022 REGISTER LIBRARY *lib;
1023
1024 /* get input */
1025 if (argc != 2)
1026 {
1027 Tcl_AppendResult(interp, x_("Usage: eraselibrary LIBRARY"), (CHAR *)NULL);
1028 return TCL_ERROR;
1029 }
1030 lib = (LIBRARY *)tcl_converttowarnedelectric(argv[1], VLIBRARY, x_("first"));
1031 if (lib == NOLIBRARY) return TCL_ERROR;
1032
1033 /* call Electric */
1034 eraselibrary(lib);
1035 return TCL_OK;
1036 }
1037
tcl_selectlibrary(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1038 int tcl_selectlibrary(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1039 {
1040 REGISTER LIBRARY *lib;
1041
1042 /* get input */
1043 if (argc != 2)
1044 {
1045 Tcl_AppendResult(interp, x_("Usage: selectlibrary LIBRARY"), (CHAR *)NULL);
1046 return TCL_ERROR;
1047 }
1048 lib = (LIBRARY *)tcl_converttowarnedelectric(argv[1], VLIBRARY, x_("first"));
1049 if (lib == NOLIBRARY) return TCL_ERROR;
1050
1051 /* call Electric */
1052 selectlibrary(lib, TRUE);
1053 return TCL_OK;
1054 }
1055
1056 /****************************** NODEPROTO ROUTINES ******************************/
1057
tcl_getnodeproto(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1058 int tcl_getnodeproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1059 {
1060 REGISTER NODEPROTO *np;
1061
1062 /* get input */
1063 if (argc != 2)
1064 {
1065 Tcl_AppendResult(interp, x_("Usage: getnodeproto NAME"), (CHAR *)NULL);
1066 return TCL_ERROR;
1067 }
1068
1069 /* call Electric */
1070 np = getnodeproto(argv[1]);
1071
1072 /* convert result */
1073 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)np, VNODEPROTO), (CHAR *) NULL);
1074 return TCL_OK;
1075 }
1076
tcl_newnodeproto(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1077 int tcl_newnodeproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1078 {
1079 REGISTER LIBRARY *lib;
1080 REGISTER NODEPROTO *np;
1081
1082 /* get input */
1083 if (argc != 3)
1084 {
1085 Tcl_AppendResult(interp, x_("Usage: newnodeproto NAME LIBRARY"), (CHAR *)NULL);
1086 return TCL_ERROR;
1087 }
1088 lib = (LIBRARY *)tcl_converttowarnedelectric(argv[2], VLIBRARY, x_("second"));
1089 if (lib == NOLIBRARY) return TCL_ERROR;
1090
1091 /* call Electric */
1092 np = newnodeproto(argv[1], lib);
1093
1094 /* convert result */
1095 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)np, VNODEPROTO), (CHAR *) NULL);
1096 return TCL_OK;
1097 }
1098
tcl_killnodeproto(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1099 int tcl_killnodeproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1100 {
1101 REGISTER NODEPROTO *np;
1102 REGISTER BOOLEAN ret;
1103
1104 /* get input */
1105 if (argc != 2)
1106 {
1107 Tcl_AppendResult(interp, x_("Usage: killnodeproto CELL"), (CHAR *)NULL);
1108 return TCL_ERROR;
1109 }
1110 np = (NODEPROTO *)tcl_converttowarnedelectric(argv[1], VNODEPROTO, x_("first"));
1111 if (np == NONODEPROTO) return TCL_ERROR;
1112
1113 /* call Electric */
1114 ret = killnodeproto(np);
1115
1116 /* convert result */
1117 Tcl_AppendResult(interp, tcl_converttotcl(ret?1:0, VINTEGER), (CHAR *) NULL);
1118 return TCL_OK;
1119 }
1120
tcl_copynodeproto(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1121 int tcl_copynodeproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1122 {
1123 REGISTER LIBRARY *lib;
1124 REGISTER NODEPROTO *np, *nnp;
1125
1126 /* get input */
1127 if (argc != 4)
1128 {
1129 Tcl_AppendResult(interp, x_("Usage: copynodeproto CELL LIBRARY NAME"), (CHAR *)NULL);
1130 return TCL_ERROR;
1131 }
1132 np = (NODEPROTO *)tcl_converttowarnedelectric(argv[1], VNODEPROTO, x_("first"));
1133 lib = (LIBRARY *)tcl_converttowarnedelectric(argv[2], VLIBRARY, x_("second"));
1134 if (lib == NOLIBRARY || np == NONODEPROTO) return TCL_ERROR;
1135
1136 /* call Electric */
1137 nnp = copynodeproto(np, lib, argv[3], FALSE);
1138
1139 /* convert result */
1140 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)nnp, VNODEPROTO), (CHAR *) NULL);
1141 return TCL_OK;
1142 }
1143
tcl_iconview(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1144 int tcl_iconview(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1145 {
1146 REGISTER NODEPROTO *np, *inp;
1147
1148 /* get input */
1149 if (argc != 2)
1150 {
1151 Tcl_AppendResult(interp, x_("Usage: iconview CELL"), (CHAR *)NULL);
1152 return TCL_ERROR;
1153 }
1154 np = (NODEPROTO *)tcl_converttowarnedelectric(argv[1], VNODEPROTO, x_("first"));
1155 if (np == NONODEPROTO) return TCL_ERROR;
1156
1157 /* call Electric */
1158 inp = iconview(np);
1159
1160 /* convert result */
1161 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)inp, VNODEPROTO), (CHAR *) NULL);
1162 return TCL_OK;
1163 }
1164
tcl_contentsview(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1165 int tcl_contentsview(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1166 {
1167 REGISTER NODEPROTO *np, *cnp;
1168
1169 /* get input */
1170 if (argc != 2)
1171 {
1172 Tcl_AppendResult(interp, x_("Usage: contentsview CELL"), (CHAR *)NULL);
1173 return TCL_ERROR;
1174 }
1175 np = (NODEPROTO *)tcl_converttowarnedelectric(argv[1], VNODEPROTO, x_("first"));
1176 if (np == NONODEPROTO) return TCL_ERROR;
1177
1178 /* call Electric */
1179 cnp = contentsview(np);
1180
1181 /* convert result */
1182 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)cnp, VNODEPROTO), (CHAR *) NULL);
1183 return TCL_OK;
1184 }
1185
1186 /****************************** NODEINST ROUTINES ******************************/
1187
tcl_newnodeinst(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1188 int tcl_newnodeinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1189 {
1190 REGISTER NODEINST *ni;
1191 REGISTER NODEPROTO *np, *cell;
1192 REGISTER INTBIG lx, hx, ly, hy, rot, tran;
1193
1194 /* get input */
1195 if (argc != 9)
1196 {
1197 Tcl_AppendResult(interp, x_("Usage: newnodeinst PROTO LX HX LY HY TRAN ROT CELL"), (CHAR *)NULL);
1198 return TCL_ERROR;
1199 }
1200 np = (NODEPROTO *)tcl_converttowarnedelectric(argv[1], VNODEPROTO, x_("first"));
1201 lx = myatoi(argv[2]);
1202 hx = myatoi(argv[3]);
1203 ly = myatoi(argv[4]);
1204 hy = myatoi(argv[5]);
1205 tran = myatoi(argv[6]);
1206 rot = myatoi(argv[7]);
1207 cell = (NODEPROTO *)tcl_converttowarnedelectric(argv[8], VNODEPROTO, x_("eighth"));
1208 if (np == NONODEPROTO || cell == NONODEPROTO) return TCL_ERROR;
1209
1210 /* call Electric */
1211 ni = newnodeinst(np, lx, hx, ly, hy, tran, rot, cell);
1212
1213 /* convert result */
1214 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)ni, VNODEINST), (CHAR *) NULL);
1215 return TCL_OK;
1216 }
1217
tcl_modifynodeinst(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1218 int tcl_modifynodeinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1219 {
1220 REGISTER NODEINST *ni;
1221 REGISTER INTBIG dlx, dly, dhx, dhy, drot, dtran;
1222
1223 /* get input */
1224 if (argc != 8)
1225 {
1226 Tcl_AppendResult(interp, x_("Usage: modifynodeinst NODE dLX dLY dHX dHY dROT dTRAN"), (CHAR *)NULL);
1227 return TCL_ERROR;
1228 }
1229 ni = (NODEINST *)tcl_converttowarnedelectric(argv[1], VNODEINST, x_("first"));
1230 dlx = myatoi(argv[2]);
1231 dly = myatoi(argv[3]);
1232 dhx = myatoi(argv[4]);
1233 dhy = myatoi(argv[5]);
1234 drot = myatoi(argv[6]);
1235 dtran = myatoi(argv[7]);
1236 if (ni == NONODEINST) return TCL_ERROR;
1237
1238 /* call Electric */
1239 modifynodeinst(ni, dlx, dly, dhx, dhy, drot, dtran);
1240 return TCL_OK;
1241 }
1242
tcl_killnodeinst(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1243 int tcl_killnodeinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1244 {
1245 REGISTER NODEINST *ni;
1246 REGISTER BOOLEAN ret;
1247
1248 /* get input */
1249 if (argc != 2)
1250 {
1251 Tcl_AppendResult(interp, x_("Usage: killnodeinst NODE"), (CHAR *)NULL);
1252 return TCL_ERROR;
1253 }
1254 ni = (NODEINST *)tcl_converttowarnedelectric(argv[1], VNODEINST, x_("first"));
1255 if (ni == NONODEINST) return TCL_ERROR;
1256
1257 /* call Electric */
1258 ret = killnodeinst(ni);
1259
1260 /* convert result */
1261 Tcl_AppendResult(interp, tcl_converttotcl(ret?1:0, VINTEGER), (CHAR *) NULL);
1262 return TCL_OK;
1263 }
1264
tcl_replacenodeinst(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1265 int tcl_replacenodeinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1266 {
1267 REGISTER NODEPROTO *np;
1268 REGISTER NODEINST *ni, *nni;
1269
1270 /* get input */
1271 if (argc != 3)
1272 {
1273 Tcl_AppendResult(interp, x_("Usage: replacenodeinst NODE NEWPROTO"), (CHAR *)NULL);
1274 return TCL_ERROR;
1275 }
1276 ni = (NODEINST *)tcl_converttowarnedelectric(argv[1], VNODEINST, x_("first"));
1277 np = (NODEPROTO *)tcl_converttowarnedelectric(argv[2], VNODEPROTO, x_("second"));
1278 if (ni == NONODEINST || np == NONODEPROTO) return TCL_ERROR;
1279
1280 /* call Electric */
1281 nni = replacenodeinst(ni, np, FALSE, FALSE);
1282
1283 /* convert result */
1284 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)nni, VNODEINST), (CHAR *) NULL);
1285 return TCL_OK;
1286 }
1287
tcl_nodefunction(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1288 int tcl_nodefunction(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1289 {
1290 REGISTER NODEINST *ni;
1291 REGISTER INTBIG fun;
1292
1293 /* get input */
1294 if (argc != 2)
1295 {
1296 Tcl_AppendResult(interp, x_("Usage: nodefunction NODE"), (CHAR *)NULL);
1297 return TCL_ERROR;
1298 }
1299 ni = (NODEINST *)tcl_converttowarnedelectric(argv[1], VNODEINST, x_("first"));
1300 if (ni == NONODEINST) return TCL_ERROR;
1301
1302 /* call Electric */
1303 fun = nodefunction(ni);
1304
1305 /* convert result */
1306 Tcl_AppendResult(interp, tcl_converttotcl(fun, VINTEGER), (CHAR *) NULL);
1307 return TCL_OK;
1308 }
1309
1310 /****************************** ARCINST ROUTINES ******************************/
1311
tcl_newarcinst(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1312 int tcl_newarcinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1313 {
1314 REGISTER ARCINST *ai;
1315 REGISTER NODEINST *ni1, *ni2;
1316 REGISTER PORTPROTO *pp1, *pp2;
1317 REGISTER ARCPROTO *ap;
1318 REGISTER NODEPROTO *np;
1319 REGISTER INTBIG w, bits, x1, y1, x2, y2;
1320
1321 /* get input */
1322 if (argc != 13)
1323 {
1324 Tcl_AppendResult(interp, x_("Usage: newarcinst PROTO WID BITS NODE1 PORT1 X1 Y1 NODE2 PORT2 X2 Y2 CELL"),
1325 (CHAR *)NULL);
1326 return TCL_ERROR;
1327 }
1328 ap = (ARCPROTO *)tcl_converttowarnedelectric(argv[1], VARCPROTO, x_("first"));
1329 w = myatoi(argv[2]);
1330 bits = myatoi(argv[3]);
1331 ni1 = (NODEINST *)tcl_converttowarnedelectric(argv[4], VNODEINST, x_("fourth"));
1332 pp1 = (PORTPROTO *)tcl_converttowarnedelectric(argv[5], VPORTPROTO, x_("fifth"));
1333 x1 = myatoi(argv[6]);
1334 y1 = myatoi(argv[7]);
1335 ni2 = (NODEINST *)tcl_converttowarnedelectric(argv[8], VNODEINST, x_("eighth"));
1336 pp2 = (PORTPROTO *)tcl_converttowarnedelectric(argv[9], VPORTPROTO, x_("ninth"));
1337 x2 = myatoi(argv[10]);
1338 y2 = myatoi(argv[11]);
1339 np = (NODEPROTO *)tcl_converttowarnedelectric(argv[12], VNODEPROTO, x_("twelvth"));
1340 if (ap == NOARCPROTO || ni1 == NONODEINST || pp1 == NOPORTPROTO || ni2 == NONODEINST ||
1341 pp2 == NOPORTPROTO || np == NONODEPROTO) return TCL_ERROR;
1342
1343 /* call Electric */
1344 ai = newarcinst(ap, w, bits, ni1, pp1, x1, y1, ni2, pp2, x2, y2, np);
1345
1346 /* convert result */
1347 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)ai, VARCINST), (CHAR *) NULL);
1348 return TCL_OK;
1349 }
1350
tcl_modifyarcinst(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1351 int tcl_modifyarcinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1352 {
1353 REGISTER ARCINST *ai;
1354 REGISTER INTBIG dw, dx1, dy1, dx2, dy2;
1355 REGISTER BOOLEAN ret;
1356
1357 /* get input */
1358 if (argc != 7)
1359 {
1360 Tcl_AppendResult(interp, x_("Usage: modifyarcinst ARC dW dX1 dY1 dX2 dY2"), (CHAR *)NULL);
1361 return TCL_ERROR;
1362 }
1363 ai = (ARCINST *)tcl_converttowarnedelectric(argv[1], VARCINST, x_("first"));
1364 if (ai == NOARCINST) return TCL_ERROR;
1365 dw = myatoi(argv[2]);
1366 dx1 = myatoi(argv[3]);
1367 dy1 = myatoi(argv[4]);
1368 dx2 = myatoi(argv[5]);
1369 dy2 = myatoi(argv[6]);
1370
1371 /* call Electric */
1372 ret = modifyarcinst(ai, dw, dx1, dy1, dx2, dy2);
1373
1374 /* convert result */
1375 Tcl_AppendResult(interp, tcl_converttotcl(ret?1:0, VINTEGER), (CHAR *) NULL);
1376 return TCL_OK;
1377 }
1378
tcl_killarcinst(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1379 int tcl_killarcinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1380 {
1381 REGISTER ARCINST *ai;
1382 REGISTER BOOLEAN ret;
1383
1384 /* get input */
1385 if (argc != 2)
1386 {
1387 Tcl_AppendResult(interp, x_("Usage: killarcinst ARC"), (CHAR *)NULL);
1388 return TCL_ERROR;
1389 }
1390 ai = (ARCINST *)tcl_converttowarnedelectric(argv[1], VARCINST, x_("first"));
1391 if (ai == NOARCINST) return TCL_ERROR;
1392
1393 /* call Electric */
1394 ret = killarcinst(ai);
1395
1396 /* convert result */
1397 Tcl_AppendResult(interp, tcl_converttotcl(ret?1:0, VINTEGER), (CHAR *) NULL);
1398 return TCL_OK;
1399 }
1400
tcl_replacearcinst(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1401 int tcl_replacearcinst(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1402 {
1403 REGISTER ARCPROTO *ap;
1404 REGISTER ARCINST *ai, *nai;
1405
1406 /* get input */
1407 if (argc != 3)
1408 {
1409 Tcl_AppendResult(interp, x_("Usage: replacearcinst ARC NEWPROTO"), (CHAR *)NULL);
1410 return TCL_ERROR;
1411 }
1412 ai = (ARCINST *)tcl_converttowarnedelectric(argv[1], VARCINST, x_("first"));
1413 ap = (ARCPROTO *)tcl_converttowarnedelectric(argv[2], VARCPROTO, x_("second"));
1414 if (ai == NOARCINST || ap == NOARCPROTO) return TCL_ERROR;
1415
1416 /* call Electric */
1417 nai = replacearcinst(ai, ap);
1418
1419 /* convert result */
1420 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)nai, VARCINST), (CHAR *) NULL);
1421 return TCL_OK;
1422 }
1423
1424 /****************************** PORTPROTO ROUTINES ******************************/
1425
tcl_newportproto(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1426 int tcl_newportproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1427 {
1428 REGISTER NODEPROTO *np;
1429 REGISTER NODEINST *ni;
1430 REGISTER PORTPROTO *pp, *npp;
1431
1432 /* get input */
1433 if (argc != 5)
1434 {
1435 Tcl_AppendResult(interp, x_("Usage: newportproto CELL NODE PORT NAME"), (CHAR *)NULL);
1436 return TCL_ERROR;
1437 }
1438 np = (NODEPROTO *)tcl_converttowarnedelectric(argv[1], VNODEPROTO, x_("first"));
1439 ni = (NODEINST *)tcl_converttowarnedelectric(argv[2], VNODEINST, x_("second"));
1440 pp = (PORTPROTO *)tcl_converttowarnedelectric(argv[3], VPORTPROTO, x_("third"));
1441 if (np == NONODEPROTO || ni == NONODEINST || pp == NOPORTPROTO) return TCL_ERROR;
1442
1443 /* call Electric */
1444 npp = newportproto(np, ni, pp, argv[4]);
1445
1446 /* convert result */
1447 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)npp, VPORTPROTO), (CHAR *) NULL);
1448 return TCL_OK;
1449 }
1450
tcl_portposition(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1451 int tcl_portposition(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1452 {
1453 REGISTER NODEINST *ni;
1454 REGISTER PORTPROTO *pp;
1455 INTBIG x, y;
1456 CHAR line[50];
1457
1458 /* get input */
1459 if (argc != 3)
1460 {
1461 Tcl_AppendResult(interp, x_("Usage: portposition NODE PORT"), (CHAR *)NULL);
1462 return TCL_ERROR;
1463 }
1464 ni = (NODEINST *)tcl_converttowarnedelectric(argv[1], VNODEINST, x_("first"));
1465 pp = (PORTPROTO *)tcl_converttowarnedelectric(argv[2], VPORTPROTO, x_("second"));
1466 if (ni == NONODEINST || pp == NOPORTPROTO) return TCL_ERROR;
1467
1468 /* call Electric */
1469 portposition(ni, pp, &x, &y);
1470
1471 /* convert result */
1472 (void)esnprintf(line, 50, x_("%ld %ld"), x, y);
1473 Tcl_AppendResult(interp, line, (CHAR *) NULL);
1474 return TCL_OK;
1475 }
1476
tcl_getportproto(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1477 int tcl_getportproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1478 {
1479 REGISTER NODEPROTO *np;
1480 REGISTER PORTPROTO *pp;
1481
1482 /* get input */
1483 if (argc != 3)
1484 {
1485 Tcl_AppendResult(interp, x_("Usage: getportproto CELL NAME"), (CHAR *)NULL);
1486 return TCL_ERROR;
1487 }
1488 np = (NODEPROTO *)tcl_converttowarnedelectric(argv[1], VNODEPROTO, x_("first"));
1489 if (np == NONODEPROTO) return TCL_ERROR;
1490
1491 /* call Electric */
1492 pp = getportproto(np, argv[2]);
1493
1494 /* convert result */
1495 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)pp, VPORTPROTO), (CHAR *) NULL);
1496 return TCL_OK;
1497 }
1498
tcl_killportproto(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1499 int tcl_killportproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1500 {
1501 REGISTER NODEPROTO *np;
1502 REGISTER PORTPROTO *pp;
1503 REGISTER BOOLEAN ret;
1504
1505 /* get input */
1506 if (argc != 3)
1507 {
1508 Tcl_AppendResult(interp, x_("Usage: killportproto CELL PORT"), (CHAR *)NULL);
1509 return TCL_ERROR;
1510 }
1511 np = (NODEPROTO *)tcl_converttowarnedelectric(argv[1], VNODEPROTO, x_("first"));
1512 pp = (PORTPROTO *)tcl_converttowarnedelectric(argv[2], VPORTPROTO, x_("second"));
1513 if (np == NONODEPROTO || pp == NOPORTPROTO) return TCL_ERROR;
1514
1515 /* call Electric */
1516 ret = killportproto(np, pp);
1517
1518 /* convert result */
1519 Tcl_AppendResult(interp, tcl_converttotcl(ret?1:0, VINTEGER), (CHAR *) NULL);
1520 return TCL_OK;
1521 }
1522
tcl_moveportproto(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1523 int tcl_moveportproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1524 {
1525 REGISTER NODEPROTO *np;
1526 REGISTER PORTPROTO *opp, *npp;
1527 REGISTER NODEINST *nni;
1528 REGISTER BOOLEAN ret;
1529
1530 /* get input */
1531 if (argc != 5)
1532 {
1533 Tcl_AppendResult(interp, x_("Usage: moveportproto CELL PORT NEWNODE NEWPORT"), (CHAR *)NULL);
1534 return TCL_ERROR;
1535 }
1536 np = (NODEPROTO *)tcl_converttowarnedelectric(argv[1], VNODEPROTO, x_("first"));
1537 opp = (PORTPROTO *)tcl_converttowarnedelectric(argv[2], VPORTPROTO, x_("second"));
1538 nni = (NODEINST *)tcl_converttowarnedelectric(argv[3], VNODEINST, x_("third"));
1539 npp = (PORTPROTO *)tcl_converttowarnedelectric(argv[4], VPORTPROTO, x_("fourth"));
1540 if (np == NONODEPROTO || opp == NOPORTPROTO || nni == NONODEINST || npp == NOPORTPROTO) return TCL_ERROR;
1541
1542 /* call Electric */
1543 ret = moveportproto(np, opp, nni, npp);
1544
1545 /* convert result */
1546 Tcl_AppendResult(interp, tcl_converttotcl(ret?1:0, VINTEGER), (CHAR *) NULL);
1547 return TCL_OK;
1548 }
1549
1550 /*************************** CHANGE CONTROL ROUTINES ***************************/
1551
tcl_undoabatch(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1552 int tcl_undoabatch(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1553 {
1554 TOOL *tool;
1555
1556 if (argc != 1)
1557 {
1558 Tcl_AppendResult(interp, x_("Usage: undoabatch"), (CHAR *)NULL);
1559 return TCL_ERROR;
1560 }
1561
1562 /* call Electric */
1563 if (undoabatch(&tool) == 0)
1564 {
1565 Tcl_AppendResult(interp, _("Error during undoabatch"), (CHAR *)NULL);
1566 return TCL_ERROR;
1567 }
1568
1569 /* convert result */
1570 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)tool, VTOOL), (CHAR *) NULL);
1571 return TCL_OK;
1572 }
1573
tcl_noundoallowed(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1574 int tcl_noundoallowed(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1575 {
1576 if (argc != 1)
1577 {
1578 Tcl_AppendResult(interp, x_("Usage: noundoallowed"), (CHAR *)NULL);
1579 return TCL_ERROR;
1580 }
1581
1582 /* call Electric */
1583 noundoallowed();
1584 return TCL_OK;
1585 }
1586
1587 /****************************** VIEW ROUTINES ******************************/
1588
tcl_getview(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1589 int tcl_getview(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1590 {
1591 REGISTER VIEW *v;
1592
1593 /* get input */
1594 if (argc != 2)
1595 {
1596 Tcl_AppendResult(interp, x_("Usage: getview NAME"), (CHAR *)NULL);
1597 return TCL_ERROR;
1598 }
1599
1600 /* call Electric */
1601 v = getview(argv[1]);
1602
1603 /* convert result */
1604 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)v, VVIEW), (CHAR *) NULL);
1605 return TCL_OK;
1606 }
1607
tcl_newview(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1608 int tcl_newview(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1609 {
1610 REGISTER VIEW *v;
1611
1612 /* get input */
1613 if (argc != 3)
1614 {
1615 Tcl_AppendResult(interp, x_("Usage: newview NAME SNAME"), (CHAR *)NULL);
1616 return TCL_ERROR;
1617 }
1618
1619 /* call Electric */
1620 v = newview(argv[1], argv[2]);
1621
1622 /* convert result */
1623 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)v, VVIEW), (CHAR *) NULL);
1624 return TCL_OK;
1625 }
1626
tcl_killview(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1627 int tcl_killview(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1628 {
1629 REGISTER VIEW *v;
1630 REGISTER BOOLEAN ret;
1631
1632 /* get input */
1633 if (argc != 2)
1634 {
1635 Tcl_AppendResult(interp, x_("Usage: killview VIEW"), (CHAR *)NULL);
1636 return TCL_ERROR;
1637 }
1638 v = (VIEW *)tcl_converttowarnedelectric(argv[1], VVIEW, x_("first"));
1639 if (v == NOVIEW) return TCL_ERROR;
1640
1641 /* call Electric */
1642 ret = killview(v);
1643
1644 /* convert result */
1645 Tcl_AppendResult(interp, tcl_converttotcl(ret?1:0, VINTEGER), (CHAR *) NULL);
1646 return TCL_OK;
1647 }
1648
1649 /*************************** MISCELLANEOUS ROUTINES ***************************/
1650
tcl_telltool(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1651 int tcl_telltool(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1652 {
1653 REGISTER TOOL *tool;
1654 int toolArgc, ret;
1655 CHAR **toolArgv;
1656
1657 /* get input */
1658 if (argc != 3)
1659 {
1660 Tcl_AppendResult(interp, x_("Usage: telltool TOOL {PARAMETERS}"), (CHAR *)NULL);
1661 return TCL_ERROR;
1662 }
1663 tool = (TOOL *)tcl_converttowarnedelectric(argv[1], VTOOL, x_("first"));
1664 ret = Tcl_SplitList(interp, argv[2], &toolArgc, &toolArgv);
1665 if (tool == NOTOOL || ret != TCL_OK) return TCL_ERROR;
1666
1667 /* call Electric */
1668 telltool(tool, toolArgc, toolArgv);
1669 ckfree((CHAR *)toolArgv);
1670
1671 /* convert result */
1672 ret = 0; /* actually should not return a value!!! */
1673 Tcl_AppendResult(interp, tcl_converttotcl(ret, VINTEGER), (CHAR *) NULL);
1674 return TCL_OK;
1675 }
1676
tcl_asktool(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1677 int tcl_asktool(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1678 {
1679 REGISTER TOOL *tool;
1680 INTBIG addr, addr0, addr1, addr2, addr3, type;
1681 int toolArgc, ret, i, argcS, first;
1682 CHAR **toolArgv, **argvS, *command;
1683 REGISTER void *infstr;
1684
1685 /* get input */
1686 if (argc != 3)
1687 {
1688 Tcl_AppendResult(interp, x_("Usage: asktool TOOL {PARAMETERS}"), (CHAR *)NULL);
1689 return TCL_ERROR;
1690 }
1691 tool = (TOOL *)tcl_converttowarnedelectric(argv[1], VTOOL, x_("first"));
1692 ret = Tcl_SplitList(interp, argv[2], &toolArgc, &toolArgv);
1693 if (tool == NOTOOL || ret != TCL_OK) return TCL_ERROR;
1694
1695 command = toolArgv[0];
1696 for (i=0; i<toolArgc; i++) toolArgv[i] = toolArgv[i+1];
1697 toolArgv[toolArgc] = NULL;
1698 toolArgc--;
1699
1700 /* call Electric */
1701 if (toolArgc == 0)
1702 {
1703 ret = asktool(tool, command);
1704 } else if (toolArgc == 1)
1705 {
1706 /* special case for user_tool: show-multiple command */
1707 if (estrcmp(command, x_("show-multiple")) == 0)
1708 {
1709 ret = Tcl_SplitList(interp, toolArgv[0], &argcS, &argvS);
1710 if (ret == TCL_OK)
1711 {
1712 infstr = initinfstr();
1713 first = 0;
1714 for (i=0; i<argcS; i++)
1715 {
1716 if (first != 0) addtoinfstr(infstr, '\n');
1717 first++;
1718 tcl_converttoanyelectric(argvS[i], &addr, &type);
1719 formatinfstr(infstr, x_("CELL=%s FROM=0%lo;-1;0"),
1720 describenodeproto(((GEOM *)addr)->entryaddr.ni->parent), addr);
1721 }
1722 ret = asktool(tool, command, (INTBIG)returninfstr(infstr));
1723 }
1724 } else
1725 {
1726 tcl_converttoanyelectric(toolArgv[0], &addr0, &type);
1727 ret = asktool(tool, command, addr0);
1728 }
1729 } else if (toolArgc == 2)
1730 {
1731 tcl_converttoanyelectric(toolArgv[0], &addr0, &type);
1732 tcl_converttoanyelectric(toolArgv[1], &addr1, &type);
1733 ret = asktool(tool, command, addr0, addr1);
1734 } else if (toolArgc == 3)
1735 {
1736 tcl_converttoanyelectric(toolArgv[0], &addr0, &type);
1737 tcl_converttoanyelectric(toolArgv[1], &addr1, &type);
1738 tcl_converttoanyelectric(toolArgv[2], &addr2, &type);
1739 ret = asktool(tool, command, addr0, addr1, addr2);
1740 } else if (toolArgc == 4)
1741 {
1742 tcl_converttoanyelectric(toolArgv[0], &addr0, &type);
1743 tcl_converttoanyelectric(toolArgv[1], &addr1, &type);
1744 tcl_converttoanyelectric(toolArgv[2], &addr2, &type);
1745 tcl_converttoanyelectric(toolArgv[3], &addr3, &type);
1746 ret = asktool(tool, command, addr0, addr1, addr2, addr3);
1747 }
1748 ckfree((CHAR *)toolArgv);
1749
1750 /* convert result */
1751 Tcl_AppendResult(interp, tcl_converttotcl(ret, VINTEGER), (CHAR *) NULL);
1752 return TCL_OK;
1753 }
1754
tcl_getarcproto(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1755 int tcl_getarcproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1756 {
1757 REGISTER ARCPROTO *ap;
1758
1759 /* get input */
1760 if (argc != 2)
1761 {
1762 Tcl_AppendResult(interp, x_("Usage: getarcproto NAME"), (CHAR *)NULL);
1763 return TCL_ERROR;
1764 }
1765
1766 /* call Electric */
1767 ap = getarcproto(argv[1]);
1768
1769 /* convert result */
1770 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)ap, VARCPROTO), (CHAR *) NULL);
1771 return TCL_OK;
1772 }
1773
tcl_gettechnology(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1774 int tcl_gettechnology(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1775 {
1776 REGISTER TECHNOLOGY *tech;
1777
1778 /* get input */
1779 if (argc != 2)
1780 {
1781 Tcl_AppendResult(interp, x_("Usage: gettechnology NAME"), (CHAR *)NULL);
1782 return TCL_ERROR;
1783 }
1784
1785 /* call Electric */
1786 tech = gettechnology(argv[1]);
1787
1788 /* convert result */
1789 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)tech, VTECHNOLOGY), (CHAR *) NULL);
1790 return TCL_OK;
1791 }
1792
tcl_getpinproto(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1793 int tcl_getpinproto(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1794 {
1795 REGISTER NODEPROTO *np;
1796 REGISTER ARCPROTO *ap;
1797
1798 /* get input */
1799 if (argc != 2)
1800 {
1801 Tcl_AppendResult(interp, x_("Usage: getpinproto ARCPROTO"), (CHAR *)NULL);
1802 return TCL_ERROR;
1803 }
1804 ap = (ARCPROTO *)tcl_converttowarnedelectric(argv[1], VARCPROTO, x_("first"));
1805 if (ap == NOARCPROTO) return TCL_ERROR;
1806
1807 /* call Electric */
1808 np = getpinproto(ap);
1809
1810 /* convert result */
1811 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)np, VNODEPROTO), (CHAR *) NULL);
1812 return TCL_OK;
1813 }
1814
tcl_getnetwork(ClientData dummy,Tcl_Interp * interp,int argc,CHAR ** argv)1815 int tcl_getnetwork(ClientData dummy, Tcl_Interp *interp, int argc, CHAR **argv)
1816 {
1817 REGISTER NETWORK *net;
1818 REGISTER NODEPROTO *np;
1819
1820 /* get input */
1821 if (argc != 3)
1822 {
1823 Tcl_AppendResult(interp, x_("Usage: getnetwork NAME CELL"), (CHAR *)NULL);
1824 return TCL_ERROR;
1825 }
1826 np = (NODEPROTO *)tcl_converttowarnedelectric(argv[2], VNODEPROTO, x_("second"));
1827 if (np == NONODEPROTO) return TCL_ERROR;
1828
1829 /* call Electric */
1830 net = getnetwork(argv[1], np);
1831
1832 /* convert result */
1833 Tcl_AppendResult(interp, tcl_converttotcl((INTBIG)net, VNETWORK), (CHAR *) NULL);
1834 return TCL_OK;
1835 }
1836
1837 #endif /* LANGTCL - at top */
1838