1 /*
2  * DBWCommands.c --
3  *
4  * 	This file contains the dispatch tables for layout commands.
5  *
6  *     *********************************************************************
7  *     * Copyright (C) 1985, 1990 Regents of the University of California. *
8  *     * Permission to use, copy, modify, and distribute this              *
9  *     * software and its documentation for any purpose and without        *
10  *     * fee is hereby granted, provided that the above copyright          *
11  *     * notice appear in all copies.  The University of California        *
12  *     * makes no representations about the suitability of this            *
13  *     * software for any purpose.  It is provided "as is" without         *
14  *     * express or implied warranty.  Export of this software outside     *
15  *     * of the United States of America may require an export license.    *
16  *     *********************************************************************
17  */
18 
19 #ifndef lint
20 static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/dbwind/DBWcommands.c,v 1.3 2010/06/24 12:37:16 tim Exp $";
21 #endif  /* not lint */
22 
23 #include <stdio.h>
24 
25 #include "utils/magic.h"
26 #include "utils/geometry.h"
27 #include "tiles/tile.h"
28 #include "utils/hash.h"
29 #include "database/database.h"
30 #include "windows/windows.h"
31 #include "dbwind/dbwind.h"
32 #include "utils/main.h"
33 #include "commands/commands.h"
34 #include "textio/textio.h"
35 #include "textio/txcommands.h"
36 
37 /*
38  * Standard DBWind command set
39  */
40 
41 extern void CmdAddPath(), CmdAntennaCheck(), CmdArray();
42 extern void CmdBox(), CmdCellname(), CmdClockwise();
43 extern void CmdContact(), CmdCopy(), CmdCorner();
44 extern void CmdCrash(), CmdCrosshair();
45 extern void CmdDelete(), CmdDown(), CmdDrc(), CmdDrop(), CmdDump();
46 extern void CmdEdit(), CmdElement(), CmdErase(), CmdExpand(), CmdExtract();
47 extern void CmdFeedback(), CmdFill(), CmdFindBox(), CmdFindLabel(), CmdFlush();
48 extern void CmdGetcell(), CmdGrid(), CmdIdentify();
49 extern void CmdLabel(), CmdLoad();
50 extern void CmdMove(), CmdNetlist(), CmdOrient(), CmdPaint(), CmdPath();
51 extern void CmdPlow(), CmdPolygon(), CmdPort(), CmdProperty();
52 extern void CmdRandom(), CmdSave(), CmdScaleGrid(), CmdSee();
53 extern void CmdSelect(), CmdSetLabel(), CmdSideways();
54 extern void CmdShell(), CmdSnap();
55 extern void CmdStretch(), CmdStraighten();
56 extern void CmdTech(), CmdTool(), CmdUnexpand();
57 extern void CmdUpsidedown(), CmdWhat(), CmdWire(), CmdWriteall();
58 extern void CmdGoto(), CmdFlatten(), CmdXload(), CmdXor();
59 
60 /*
61  * Nonmanhattan geometry extensions
62  */
63 
64 extern void CmdSplit();
65 extern void CmdSplitErase();
66 
67 /*
68  * Wizard commands
69  */
70 
71 extern void CmdCoord();
72 extern void CmdExtractTest();
73 extern void CmdExtResis();
74 extern void CmdPsearch();
75 extern void CmdPlowTest();
76 extern void CmdShowtech();
77 extern void CmdTilestats();
78 extern void CmdTsearch();
79 extern void CmdWatch();
80 
81 /*
82  * CIF and GDS commands
83  */
84 
85 #ifdef CIF_MODULE
86 extern void CmdCif();
87 #endif
88 #ifdef CALMA_MODULE
89 extern void CmdCalma();
90 #endif
91 
92 /*
93  * Plot module commands
94  */
95 #ifdef PLOT_MODULE
96 extern void CmdPlot();
97 #endif
98 #ifdef PLOT_AUTO
99 extern void CmdAutoPlot();
100 #endif
101 
102 /*
103  * SIM module commands
104  */
105 #ifndef NO_SIM_MODULE
106 extern void CmdGetnode();
107 #ifdef RSIM_MODULE
108 extern void CmdRsim(), CmdSimCmd(), CmdStartRsim();
109 #endif
110 #endif
111 
112 /*
113  * Router module commands
114  */
115 
116 #ifdef ROUTE_MODULE
117 extern void CmdGARouterTest(), CmdGRouterTest(), CmdIRouterTest();
118 extern void CmdMZRouterTest(), CmdSeeFlags();
119 extern void CmdChannel(), CmdGaRoute(), CmdIRoute(), CmdRoute();
120 #endif
121 #ifdef ROUTE_AUTO
122 extern void CmdAutoRoute();
123 #endif
124 
125 /*
126  * LEF module commands
127  */
128 #ifdef LEF_MODULE
129 extern void CmdLef();
130 #endif
131 #ifdef LEF_AUTO
132 extern void CmdAutoLef();
133 #endif
134 
135 /*
136  * Wrapper commands for ext2spice and ext2sim
137  */
138 
139 #ifdef MAGIC_WRAPPER
140 #ifdef EXT2SIM_AUTO
141 extern void CmdAutoExtToSim();
142 #else
143 extern void CmdExtToSim();
144 #endif
145 #ifdef EXT2SPICE_AUTO
146 extern void CmdAutoExtToSpice();
147 #else
148 extern void CmdExtToSpice();
149 #endif
150 #endif
151 
152 /*
153  * Readline extension history command
154  */
155 
156 #ifdef USE_READLINE
157 extern void CmdHistory();
158 #endif
159 
160 /*
161  * Commands only in the Lawrence Livermore Version
162  */
163 
164 #ifdef	LLNL
165 extern void CmdMakeSW();
166 extern void CmdSgraph();
167 #endif	/* LLNL */
168 
169 /*
170  * --------------------------------------------------------------
171  * DBWInitCommands --
172  *
173  *	Add commands to the dbw command-line interface.  As of
174  *  Magic 7.2.41, this has been changed from a statically-pre-
175  *  allocated array to a dynamically allocated array, allowing
176  *  individual modules to add their commands outside of the
177  *  scope of the "commands" subdirectory, and inside of their
178  *  own initialization functions.  The bulk of the dbwind
179  *  interface functions is still in this file, however, with
180  *  only a few functions moved out to improve modularization
181  *  of the source code.  It would be preferable to move every-
182  *  thing out and remove the "commands" subdirectory altogether,
183  *  but this is unlikely to happen.
184  *
185  * Results:
186  *	None.
187  *
188  * SideEffects:
189  *	DBWind commands are registered with the command interpreter.
190  *
191  * --------------------------------------------------------------
192  */
193 
194 void
DBWInitCommands()195 DBWInitCommands()
196 {
197     /* Add wizard commands */
198     WindAddCommand(DBWclientID,
199 	"*coord			show coordinates of various things",
200 	CmdCoord, FALSE);
201     WindAddCommand(DBWclientID,
202 	"*extract [args]	debug the circuit extractor",
203 	CmdExtractTest, FALSE);
204     WindAddCommand(DBWclientID,
205 	"*plow cmd [args]	debug plowing",
206 	CmdPlowTest, FALSE);
207     WindAddCommand(DBWclientID,
208 	"*psearch plane count	invoke point search over box area",
209 	CmdPsearch, FALSE);
210     WindAddCommand(DBWclientID,
211 	"*showtech [file]	print internal technology tables",
212 	CmdShowtech, FALSE);
213     WindAddCommand(DBWclientID,
214 	"*tilestats [file]	print statistics on tile utilization",
215 	CmdTilestats, FALSE);
216     WindAddCommand(DBWclientID,
217 	"*tsearch plane count	invoke area search over box area",
218 	CmdTsearch, FALSE);
219     WindAddCommand(DBWclientID,
220 	"*watch [plane]		enable verbose tile plane redisplay",
221 	CmdWatch, FALSE);
222     WindAddCommand(DBWclientID,
223 	"addpath [path]		append to current search path",
224 	CmdAddPath, FALSE);
225     WindAddCommand(DBWclientID,
226 	"antennacheck [path]	check for antenna violations",
227 	CmdAntennaCheck, FALSE);
228     WindAddCommand(DBWclientID,
229 	"array xsize ysize	OR\n"
230 	"array xlo xhi ylo yhi\n"
231 	"			array everything in selection",
232 	CmdArray, FALSE);
233     WindAddCommand(DBWclientID,
234 	"box [dir [amount]]	move box dist units in direction or (with\n"
235 	"			no arguments) show box size",
236 	CmdBox, FALSE);
237     WindAddCommand(DBWclientID,
238 	"cellname [list] children|parents|exists|self [name]	OR\n"
239 	"cellname [list] allcells|topcells\n"
240 	"			list cells by relationship to cell \"name\", or\n"
241 	"			the current selection if no name given.  \"list\"\n"
242 	"			returns result as a list. \"exists + name\" returns\n"
243 	"			true or false (also see command instance)",
244 	CmdCellname, FALSE);
245     WindAddCommand(DBWclientID,
246 	"clockwise [deg]		rotate selection and box clockwise",
247 	CmdClockwise, FALSE);
248     WindAddCommand(DBWclientID,
249 	"contact type		paint contact type on the intersection of its\n"
250 	"			residues",
251 	CmdContact, FALSE);
252     WindAddCommand(DBWclientID,
253 	"copy [dir [amount]]	OR\n"
254 	"copy to x y		copy selection:  what used to be at box\n"
255 	"			lower-left will be copied at cursor location (or,\n"
256 	"			copy will appear amount units in dir from original);\n"
257 	"			second form will copy to location x y",
258 	CmdCopy, FALSE);
259     WindAddCommand(DBWclientID,
260 	"corner d1 d2 [layers]	make L-shaped wires inside box, filling\n"
261 	"			first in direction d1, then in d2",
262 	CmdCorner, FALSE);
263     WindAddCommand(DBWclientID,
264 	"crash save|recover [file]\n"
265 	"			recover the crash file \"file\", or the first\n"
266 	"			crash file discovered.",
267 	CmdCrash, FALSE);
268     WindAddCommand(DBWclientID,
269 	"crosshair x y | off	enable and move or disable the screen crosshair",
270 	CmdCrosshair, FALSE);
271     WindAddCommand(DBWclientID,
272 	"delete			delete everything in selection",
273 	CmdDelete, FALSE);
274     WindAddCommand(DBWclientID,
275 	"down			load selected cell into a window",
276 	CmdDown, FALSE);
277     WindAddCommand(DBWclientID,
278 	"drc option		design rule checker; type \"drc help\"\n"
279 	"			for information on options",
280 	CmdDrc, FALSE);
281     WindAddCommand(DBWclientID,
282 	"drop layers		copy layers from edit cell into\n"
283 	"			subcells containing selected paint",
284 	CmdDrop, FALSE);
285     WindAddCommand(DBWclientID,
286 	"dump cell [child refPointC] [parent refPointP]\n\
287 			copy contents of cell into edit cell, so that\n\
288 			refPointC (or lower left) of cell is at refPointP\n\
289 			(or box lower-left); refPoints are either labels\n\
290 			or a pair of coordinates (e.g, 100 200)",
291 	CmdDump, FALSE);
292     WindAddCommand(DBWclientID,
293 	"edit		use selected cell as new edit cell",
294 	CmdEdit, FALSE);
295     WindAddCommand(DBWclientID,
296 	"element option	add a generic drawing element to the layout",
297 	CmdElement, FALSE);
298     WindAddCommand(DBWclientID,
299 	"erase [layers]|cursor		erase mask information",
300 	CmdErase, FALSE);
301     WindAddCommand(DBWclientID,
302 	"expand [toggle]		expand everything under box, or toggle\n\
303 			expanded/unexpanded cells in selection",
304 	CmdExpand, FALSE);
305     WindAddCommand(DBWclientID,
306 	"ext option		OR",
307 	CmdExtract, FALSE);		/* For "ext" abbreviation */
308     WindAddCommand(DBWclientID,
309 	"extract option		circuit extractor; type \"extract help\"\n\
310 			for information on options",
311 	CmdExtract, FALSE);		/* For "extract" */
312     WindAddCommand(DBWclientID,
313 	"extresist [args]	patch .ext file with resistance info",
314 	CmdExtResis, FALSE);
315     WindAddCommand(DBWclientID,
316 	"feedback option		find out about problems; "
317 	"type \"feedback help\"\n\t\t\tfor information on options",
318 	CmdFeedback, FALSE);
319     WindAddCommand(DBWclientID,
320 	"fill dir [layers]	fill layers from one side of box to other",
321 	CmdFill, FALSE);
322     WindAddCommand(DBWclientID,
323 	"findbox [zoom]		center the window on the box and optionally zoom in",
324 	CmdFindBox, FALSE);
325     WindAddCommand(DBWclientID,
326 	"findlabel lab		set the box to the location of this label",
327 	CmdFindLabel, FALSE);
328     WindAddCommand(DBWclientID,
329 	"flatten destname	flatten edit cell into cell destname",
330 	CmdFlatten, FALSE);
331     WindAddCommand(DBWclientID,
332 	"flush [cellname]	flush changes to cellname (edit cell default)",
333 	CmdFlush, FALSE);
334     WindAddCommand(DBWclientID,
335 	"get	OR",
336 	CmdGetcell, FALSE);
337     WindAddCommand(DBWclientID,
338 	"getcell cell [child refPointC] [parent refPointP]\n\
339 			get cell as a subcell of the edit cell, so that\n\
340 			refPointC (or lower left) of cell is at refPointP\n\
341 			(or box lower-left); refPoints are either labels\n\
342 			or a pair of coordinates (e.g, 100 200)",
343 	CmdGetcell, FALSE);
344     WindAddCommand(DBWclientID,
345 	"goto nodename		goto the node named nodename",
346 	CmdGoto, FALSE);
347     WindAddCommand(DBWclientID,
348 	"grid [xSpacing [ySpacing [xOrigin yOrigin]]]\n\
349 			toggle grid on/off (and set parameters)",
350 	CmdGrid, FALSE);
351     WindAddCommand(DBWclientID,
352 	"id	OR",
353 	CmdIdentify, FALSE);
354     WindAddCommand(DBWclientID,
355 	"identify use_id		set the use identifier of the selected cell",
356 	CmdIdentify, FALSE);
357     WindAddCommand(DBWclientID,
358 	"instance [list] children|parents|exists|self [name]	OR\n"
359 	"instance [list] allcells|topcells\n\
360 			List cells by relationship to cell \"name\", or\n\
361 			the current selection if no name given.  \"list\"\n\
362 			returns result as a list. \"exists + name\" returns\n\
363 			true or false (also see command cellname)",
364 	CmdCellname, FALSE);
365     WindAddCommand(DBWclientID,
366 	"label str [pos [layer]]\n\
367 			place a label",
368 	CmdLabel, FALSE);
369     WindAddCommand(DBWclientID,
370 	"load [cellname]	load a cell into a window",
371 	CmdLoad, FALSE);
372     WindAddCommand(DBWclientID,
373 	"move [dir [amount]]	OR\n"
374 	"move to x y		move box and selection, either by amount\n\
375 			in dir, or pick up by box lower-left and put\n\
376 			down at cursor position; second form will\n\
377 			put box at location x y",
378 	CmdMove, FALSE);
379     /* Added by NP 10/28/2004 */
380     WindAddCommand(DBWclientID,
381 	"netlist option		netlist operation; type \"netlist help\"\n\
382 			for information on options",
383 	CmdNetlist, FALSE);
384 
385     WindAddCommand(DBWclientID,
386 	"orient [orientation]		orient selection and box",
387 	CmdOrient, FALSE);
388     WindAddCommand(DBWclientID,
389 	"paint layers|cursor		paint mask information",
390 	CmdPaint, FALSE);
391     WindAddCommand(DBWclientID,
392 	"path [search|cell|sys] [[+]path]\n\
393 			set or print search paths",
394 	CmdPath, FALSE);
395     WindAddCommand(DBWclientID,
396 	"plow option [args]	stretching and compaction; type \"plow help\"\n\
397 			for information on options",
398 	CmdPlow, FALSE);
399     WindAddCommand(DBWclientID,
400 	"port [index] [direction...]\n\
401 			declare a label to be a subcircuit port",
402 	CmdPort, FALSE);
403     WindAddCommand(DBWclientID,
404 	"polygon type x1 y1 x2 y2 [x3 y3. . .] xn yn\n\
405 			draw a polygon from a list of point pairs",
406 	CmdPolygon, FALSE);
407     WindAddCommand(DBWclientID,
408 	"property [name] [value]\n\
409 			add a property (string) to the edit cell",
410 	CmdProperty, FALSE);
411     WindAddCommand(DBWclientID,
412 	"rotate [+/-][deg]	rotate selection and box (counter)clockwise",
413 	CmdClockwise, FALSE);		/* "rotate" is alias for "clockwise" */
414     WindAddCommand(DBWclientID,
415 	"random [seed [value]]		generate random number or set random seed",
416 	CmdRandom, FALSE);
417     WindAddCommand(DBWclientID,
418 	"save [filename]		save edit cell on disk",
419 	CmdSave, FALSE);
420     WindAddCommand(DBWclientID,
421 	"scalegrid a b		scale magic units vs. lambda by a / b",
422 	CmdScaleGrid, FALSE);
423     WindAddCommand(DBWclientID,
424 	"see [no] layers|allSame	change what's displayed in the window",
425 	CmdSee, FALSE);
426     WindAddCommand(DBWclientID,
427 	"select [option]		change selection; type \"select help\"\n\
428 			for information on options",
429 	CmdSelect, FALSE);
430     WindAddCommand(DBWclientID,
431 	"setlabel [option [value]]	place a label",
432 	CmdSetLabel, FALSE);
433     WindAddCommand(DBWclientID,
434 	"shell [command]		execute a command in a subshell",
435 	CmdShell, FALSE);
436     WindAddCommand(DBWclientID,
437 	"sideways		flip selection and box sideways",
438 	CmdSideways, FALSE);
439     WindAddCommand(DBWclientID,
440 	"snap [internal|lambda|user]\n\
441 			cause box to snap to the selected grid when moved\n\
442 			by the cursor",
443 	CmdSnap, FALSE);
444     WindAddCommand(DBWclientID,
445 	"straighten direction	straighten jogs by pulling in direction",
446 	CmdStraighten, FALSE);
447     WindAddCommand(DBWclientID,
448 	"stretch [dir [amount]]	stretch box and selection",
449 	CmdStretch, FALSE);
450     WindAddCommand(DBWclientID,
451 	"tech option	technology handling; type \"tech help\"\n\
452 			for information on options",
453 	CmdTech, FALSE);
454 #ifndef MAGIC_WRAPPER
455     WindAddCommand(DBWclientID,
456 	"tool [name|info]	change layout tool or print info about what\n\
457 			buttons mean for current tool",
458 	CmdTool, FALSE);
459 #endif
460     WindAddCommand(DBWclientID,
461 	"unexpand		unexpand subcells under box",
462 	CmdUnexpand, FALSE);
463     WindAddCommand(DBWclientID,
464 	"upsidedown		flip selection and box upside down",
465 	CmdUpsidedown, FALSE);
466     WindAddCommand(DBWclientID,
467 	"what			print out information about what's selected",
468 	CmdWhat, FALSE);
469     WindAddCommand(DBWclientID,
470 	"wire option [args]	wiring-style user interface; type\n\
471 			\"wire help\" for information on options",
472 	CmdWire, FALSE);
473     WindAddCommand(DBWclientID,
474 	"writeall [force]	write out all modified cells to disk",
475 	CmdWriteall, FALSE);
476     WindAddCommand(DBWclientID,
477 	"xload [cellname]	load a cell into a window unexpanded",
478 	CmdXload, FALSE);
479     WindAddCommand(DBWclientID,
480 	"xor destname		flatten current top level cell into destname\n\
481 			and xor with existing contents",
482 	CmdXor, FALSE);
483 
484 #ifdef CIF_MODULE
485     /* Add the CIF extension commands */
486     WindAddCommand(DBWclientID,
487 	"cif option		CIF processor; type \"cif help\"\n\
488 			for information on options",
489 	CmdCif, FALSE);
490 #endif
491 
492 #ifdef CALMA_MODULE
493     /* Add the GDS extension commands */
494     WindAddCommand(DBWclientID,
495 	"calma option		Calma GDS-II stream file processor; type\n\
496 			\"calma help\" for information on options",
497 	CmdCalma, FALSE);		/* "gds" is an alias for "calma" */
498     WindAddCommand(DBWclientID,
499 	"gds option		alias for the \"calma\" command",
500 	CmdCalma, FALSE);
501 #endif
502 
503 
504     /* Add the NonManhattan Geometry extension commands */
505     WindAddCommand(DBWclientID,
506 	"splitpaint dir layer [layer2]\n\
507 			split box diagonally with layer in corner dir and\n\
508 			layer2 in the opposite corner (default layer2 is space)",
509 	CmdSplit, FALSE);
510     WindAddCommand(DBWclientID,
511 	"spliterase dir [layer]	erase layers from diagonal corner dir of the\n\
512 			edit box",
513 	CmdSplitErase, FALSE);
514 
515 #ifdef MAGIC_WRAPPER
516     /* Add the Tcl commands for exttospice, exttosim, and aliases ext2spice, ext2sim */
517 #ifdef EXT2SIM_AUTO
518     WindAddCommand(DBWclientID,
519 	"exttosim [args]	convert extracted file(s) to a sim format file;"
520 	" type\n\t\t\t\"exttosim help\" for information on options",
521 	CmdAutoExtToSim, FALSE);
522     WindAddCommand(DBWclientID,
523 	"ext2sim [args]	convert extracted file(s) to a sim format file;"
524 	" type\n\t\t\t\"ext2sim help\" for information on options",
525 	CmdAutoExtToSim, FALSE);
526 #else
527     WindAddCommand(DBWclientID,
528 	"exttosim [args]	convert extracted file(s) to a sim format file;"
529 	" type\n\t\t\t\"exttosim help\" for information on options",
530 	CmdExtToSim, FALSE);
531     WindAddCommand(DBWclientID,
532 	"ext2sim [args]	convert extracted file(s) to a sim format file;"
533 	" type\n\t\t\t\"ext2sim help\" for information on options",
534 	CmdExtToSim, FALSE);
535 #endif /* EXT2SIM_AUTO */
536 #ifdef EXT2SPICE_AUTO
537     WindAddCommand(DBWclientID,
538 	"exttospice [args]	convert extracted file(s) to a SPICE format file;"
539 	" type\n\t\t\t\"exttospice help\" for information on options",
540 	CmdAutoExtToSpice, FALSE);
541     WindAddCommand(DBWclientID,
542 	"ext2spice [args]	convert extracted file(s) to a SPICE format file;"
543 	" type\n\t\t\t\"ext2spice help\" for information on options",
544 	CmdAutoExtToSpice, FALSE);
545 #else
546     WindAddCommand(DBWclientID,
547 	"exttospice [args]	convert extracted file(s) to a SPICE format file;"
548 	" type\n\t\t\t\"exttospice help\" for information on options",
549 	CmdExtToSpice, FALSE);
550     WindAddCommand(DBWclientID,
551 	"ext2spice [args]	convert extracted file(s) to a SPICE format file;"
552 	" type\n\t\t\t\"ext2spice help\" for information on options",
553 	CmdExtToSpice, FALSE);
554 #endif	/* EXT2SPICE_AUTO */
555 #endif  /* MAGIC_WRAPPER */
556 
557 
558 #ifdef USE_READLINE
559     /* Add the Readline extension history command */
560     WindAddCommand(DBWclientID,
561 	"history print out the command history list",
562 	CmdHistory, FALSE);
563 #endif
564 
565 #ifdef	LLNL
566     /* Add the Lawrence Livermore extensions */
567     WindAddCommand(DBWclientID,
568 	"makesw options		generate scan window for LP apparatus",
569 	CmdMakeSW, FALSE);
570     WindAddCommand(DBWclientID,
571 	"sgraph [options]	manipulate a cell's stretch graphs",
572 	CmdSgraph, FALSE);
573 #endif
574 
575 #ifndef NO_SIM_MODULE
576     /* Add the IRSIM commands */
577     WindAddCommand(DBWclientID,
578 	"getnode option		get node names of all selected paint",
579 	CmdGetnode, FALSE);
580 
581 #ifdef RSIM_MODULE
582     WindAddCommand(DBWclientID,
583 	"rsim [options] filename		run Rsim under Magic",
584 	CmdRsim, FALSE);
585     WindAddCommand(DBWclientID,
586 	"simcmd cmd	        send a command to Rsim, applying it to selected paint",
587 	CmdSimCmd, FALSE);
588     WindAddCommand(DBWclientID,
589 	"startrsim [options] file    start Rsim and return to Magic",
590 	CmdStartRsim, FALSE);
591 #endif
592 #endif
593 
594 #ifdef PLOT_MODULE
595     /* Add the plot extensions */
596     WindAddCommand(DBWclientID,
597 	"plot type [args]	hardcopy plotting; type \"plot help\"\n\
598 			for information on types and args",
599 	CmdPlot, FALSE);
600 
601 #endif
602 #ifdef PLOT_AUTO
603     /* Placeholder for plot extensions */
604     WindAddCommand(DBWclientID,
605 	"plot type [args]	hardcopy plotting; type \"plot help\"\n\
606 			for information on types and args",
607 	CmdAutoPlot, FALSE);
608 #endif
609 
610 #ifdef LEF_MODULE
611     /* Add the LEF/DEF extensions */
612     WindAddCommand(DBWclientID,
613 	"lef [options]	LEF-format input/output; type \"lef help\"\n\
614 			for information on options",
615 	CmdLef, FALSE);
616     WindAddCommand(DBWclientID,
617 	"def [options]	DEF-format input; type \"def help\"\n\
618 			for information on options",
619 	CmdLef, FALSE);
620 #endif
621 #ifdef LEF_AUTO
622     /* Placeholder for LEF/DEF extensions */
623     WindAddCommand(DBWclientID,
624 	"lef [options]	LEF-format input/output; type \"lef help\"\n\
625 			for information on options",
626 	CmdAutoLef, FALSE);
627     WindAddCommand(DBWclientID,
628 	"def [options]	DEF-format input; type \"def help\"\n\
629 			for information on options",
630 	CmdAutoLef, FALSE);
631 #endif
632 
633 #ifdef ROUTE_MODULE
634     /* Add the router extensions */
635     WindAddCommand(DBWclientID,
636 	"*garoute [cmd [args]]	debug the gate-array router",
637 	CmdGARouterTest, FALSE);
638     WindAddCommand(DBWclientID,
639 	"*groute [cmd [args]]	debug the global router",
640 	CmdGRouterTest, FALSE);
641     WindAddCommand(DBWclientID,
642 	"*iroute [cmd [args]]	debug the interactive router",
643 	CmdIRouterTest, FALSE);
644     WindAddCommand(DBWclientID,
645 	"*mzroute [cmd [args]]	debug the maze router",
646 	CmdMZRouterTest, FALSE);
647     WindAddCommand(DBWclientID,
648 	"*seeflags [flag]	display channel flags over channel",
649 	CmdSeeFlags, FALSE);
650     WindAddCommand(DBWclientID,
651 	"channels		see channels (feedback) without doing routing",
652 	CmdChannel, FALSE);
653     WindAddCommand(DBWclientID,
654 	"garoute [cmd [args]]	gate-array router",
655 	CmdGaRoute, FALSE);
656     WindAddCommand(DBWclientID,
657 	"iroute [cmd [args]]	do interactive point to point route",
658 	CmdIRoute, FALSE);
659     WindAddCommand(DBWclientID,
660 	"route			route the current cell",
661 	CmdRoute, FALSE);
662 #endif
663 #ifdef ROUTE_AUTO
664     /* Placeholder for router extensions */
665     WindAddCommand(DBWclientID,
666 	"*garoute [cmd [args]]	debug the gate-array router",
667 	CmdAutoRoute, FALSE);
668     WindAddCommand(DBWclientID,
669 	"*groute [cmd [args]]	debug the global router",
670 	CmdAutoRoute, FALSE);
671     WindAddCommand(DBWclientID,
672 	"*iroute [cmd [args]]	debug the interactive router",
673 	CmdAutoRoute, FALSE);
674     WindAddCommand(DBWclientID,
675 	"*mzroute [cmd [args]]	debug the maze router",
676 	CmdAutoRoute, FALSE);
677     WindAddCommand(DBWclientID,
678 	"*seeflags [flag]	display channel flags over channel",
679 	CmdAutoRoute, FALSE);
680     WindAddCommand(DBWclientID,
681 	"channels		see channels (feedback) without doing routing",
682 	CmdAutoRoute, FALSE);
683     WindAddCommand(DBWclientID,
684 	"garoute [cmd [args]]	gate-array router",
685 	CmdAutoRoute, FALSE);
686     WindAddCommand(DBWclientID,
687 	"iroute [cmd [args]]	do interactive point to point route",
688 	CmdAutoRoute, FALSE);
689     WindAddCommand(DBWclientID,
690 	"route			route the current cell",
691 	CmdAutoRoute, FALSE);
692 #endif
693 }
694