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