/* * DBWCommands.c -- * * This file contains the dispatch tables for layout commands. * * ********************************************************************* * * Copyright (C) 1985, 1990 Regents of the University of California. * * * Permission to use, copy, modify, and distribute this * * * software and its documentation for any purpose and without * * * fee is hereby granted, provided that the above copyright * * * notice appear in all copies. The University of California * * * makes no representations about the suitability of this * * * software for any purpose. It is provided "as is" without * * * express or implied warranty. Export of this software outside * * * of the United States of America may require an export license. * * ********************************************************************* */ #ifndef lint 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 $"; #endif /* not lint */ #include #include "utils/magic.h" #include "utils/geometry.h" #include "tiles/tile.h" #include "utils/hash.h" #include "database/database.h" #include "windows/windows.h" #include "dbwind/dbwind.h" #include "utils/main.h" #include "commands/commands.h" #include "textio/textio.h" #include "textio/txcommands.h" /* * Standard DBWind command set */ extern void CmdAddPath(), CmdAntennaCheck(), CmdArchive(), CmdArray(); extern void CmdBox(), CmdCellname(), CmdClockwise(); extern void CmdContact(), CmdCopy(), CmdCorner(); extern void CmdCrash(), CmdCrosshair(); extern void CmdDelete(), CmdDown(), CmdDrc(), CmdDrop(), CmdDump(); extern void CmdEdit(), CmdElement(), CmdErase(), CmdExpand(), CmdExtract(); extern void CmdFeedback(), CmdFill(), CmdFindBox(), CmdFindLabel(), CmdFlush(); extern void CmdGetcell(), CmdGrid(), CmdIdentify(); extern void CmdLabel(), CmdLoad(); extern void CmdLocking(); extern void CmdMove(), CmdNetlist(), CmdOrient(), CmdPaint(), CmdPath(); extern void CmdPlow(), CmdPolygon(), CmdPort(), CmdProperty(); extern void CmdRandom(), CmdSave(), CmdScaleGrid(), CmdSee(); extern void CmdSelect(), CmdSetLabel(), CmdSideways(); extern void CmdShell(), CmdSnap(); extern void CmdStretch(), CmdStraighten(); extern void CmdTech(), CmdTool(), CmdUnexpand(); extern void CmdUpsidedown(), CmdWhat(), CmdWire(), CmdWriteall(); extern void CmdGoto(), CmdFlatten(), CmdXload(), CmdXor(); /* * Nonmanhattan geometry extensions */ extern void CmdSplit(); extern void CmdSplitErase(); /* * Wizard commands */ extern void CmdCoord(); extern void CmdExtractTest(); extern void CmdExtResis(); extern void CmdPsearch(); extern void CmdPlowTest(); extern void CmdShowtech(); extern void CmdShowmem(); extern void CmdTilestats(); extern void CmdTsearch(); extern void CmdWatch(); /* * CIF and GDS commands */ #ifdef CIF_MODULE extern void CmdCif(); #endif #ifdef CALMA_MODULE extern void CmdCalma(); #endif /* * Plot module commands */ #ifdef PLOT_MODULE extern void CmdPlot(); #endif #ifdef PLOT_AUTO extern void CmdAutoPlot(); #endif /* * SIM module commands */ #ifndef NO_SIM_MODULE extern void CmdGetnode(); #ifdef RSIM_MODULE extern void CmdRsim(), CmdSimCmd(), CmdStartRsim(); #endif #endif /* * Router module commands */ #ifdef ROUTE_MODULE extern void CmdGARouterTest(), CmdGRouterTest(), CmdIRouterTest(); extern void CmdMZRouterTest(), CmdSeeFlags(); extern void CmdChannel(), CmdGaRoute(), CmdIRoute(), CmdRoute(); #endif #ifdef ROUTE_AUTO extern void CmdAutoRoute(); #endif /* * LEF module commands */ #ifdef LEF_MODULE extern void CmdLef(); #endif #ifdef LEF_AUTO extern void CmdAutoLef(); #endif /* * Wrapper commands for ext2spice and ext2sim */ #ifdef MAGIC_WRAPPER #ifdef EXT2SIM_AUTO extern void CmdAutoExtToSim(); #else extern void CmdExtToSim(); #endif #ifdef EXT2SPICE_AUTO extern void CmdAutoExtToSpice(); #else extern void CmdExtToSpice(); #endif #endif /* * Readline extension history command */ #ifdef USE_READLINE extern void CmdHistory(); #endif /* * Commands only in the Lawrence Livermore Version */ #ifdef LLNL extern void CmdMakeSW(); extern void CmdSgraph(); #endif /* LLNL */ /* * -------------------------------------------------------------- * DBWInitCommands -- * * Add commands to the dbw command-line interface. As of * Magic 7.2.41, this has been changed from a statically-pre- * allocated array to a dynamically allocated array, allowing * individual modules to add their commands outside of the * scope of the "commands" subdirectory, and inside of their * own initialization functions. The bulk of the dbwind * interface functions is still in this file, however, with * only a few functions moved out to improve modularization * of the source code. It would be preferable to move every- * thing out and remove the "commands" subdirectory altogether, * but this is unlikely to happen. * * Results: * None. * * SideEffects: * DBWind commands are registered with the command interpreter. * * -------------------------------------------------------------- */ void DBWInitCommands() { /* Add wizard commands */ WindAddCommand(DBWclientID, "*coord show coordinates of various things", CmdCoord, FALSE); WindAddCommand(DBWclientID, "*extract [args] debug the circuit extractor", CmdExtractTest, FALSE); WindAddCommand(DBWclientID, "*plow cmd [args] debug plowing", CmdPlowTest, FALSE); WindAddCommand(DBWclientID, "*psearch plane count invoke point search over box area", CmdPsearch, FALSE); WindAddCommand(DBWclientID, "*showmem [file] print internal memory usage", CmdShowmem, FALSE); WindAddCommand(DBWclientID, "*showtech [file] print internal technology tables", CmdShowtech, FALSE); WindAddCommand(DBWclientID, "*tilestats [file] print statistics on tile utilization", CmdTilestats, FALSE); WindAddCommand(DBWclientID, "*tsearch plane count invoke area search over box area", CmdTsearch, FALSE); WindAddCommand(DBWclientID, "*watch [plane] enable verbose tile plane redisplay", CmdWatch, FALSE); WindAddCommand(DBWclientID, "addpath [path] append to current search path", CmdAddPath, FALSE); #ifdef LEF_MODULE WindAddCommand(DBWclientID, "antennacheck [path] check for antenna violations", CmdAntennaCheck, FALSE); #endif WindAddCommand(DBWclientID, "archive write|read file\n" " write or read the archive file \"file\".", CmdArchive, FALSE); WindAddCommand(DBWclientID, "array xsize ysize OR\n" "array xlo xhi ylo yhi\n" " array everything in selection", CmdArray, FALSE); WindAddCommand(DBWclientID, "box [dir [amount]] move box dist units in direction or (with\n" " no arguments) show box size", CmdBox, FALSE); WindAddCommand(DBWclientID, "cellname [list] children|parents|exists|self [name] OR\n" "cellname [list] allcells|topcells\n" " list cells by relationship to cell \"name\", or\n" " the current selection if no name given. \"list\"\n" " returns result as a list. \"exists + name\" returns\n" " true or false (also see command instance)", CmdCellname, FALSE); WindAddCommand(DBWclientID, "clockwise [deg] rotate selection and box clockwise", CmdClockwise, FALSE); WindAddCommand(DBWclientID, "contact type paint contact type on the intersection of its\n" " residues", CmdContact, FALSE); WindAddCommand(DBWclientID, "copy [dir [amount]] OR\n" "copy to x y copy selection: what used to be at box\n" " lower-left will be copied at cursor location (or,\n" " copy will appear amount units in dir from original);\n" " second form will copy to location x y", CmdCopy, FALSE); WindAddCommand(DBWclientID, "corner d1 d2 [layers] make L-shaped wires inside box, filling\n" " first in direction d1, then in d2", CmdCorner, FALSE); WindAddCommand(DBWclientID, "crash save|recover [file]\n" " recover the crash file \"file\", or the first\n" " crash file discovered.", CmdCrash, FALSE); WindAddCommand(DBWclientID, "crosshair x y | off enable and move or disable the screen crosshair", CmdCrosshair, FALSE); WindAddCommand(DBWclientID, "delete delete everything in selection", CmdDelete, FALSE); WindAddCommand(DBWclientID, "down load selected cell into a window", CmdDown, FALSE); WindAddCommand(DBWclientID, "drc option design rule checker; type \"drc help\"\n" " for information on options", CmdDrc, FALSE); WindAddCommand(DBWclientID, "drop layers copy layers from edit cell into\n" " subcells containing selected paint", CmdDrop, FALSE); WindAddCommand(DBWclientID, "dump cell [child refPointC] [parent refPointP]\n\ copy contents of cell into edit cell, so that\n\ refPointC (or lower left) of cell is at refPointP\n\ (or box lower-left); refPoints are either labels\n\ or a pair of coordinates (e.g, 100 200)", CmdDump, FALSE); WindAddCommand(DBWclientID, "edit use selected cell as new edit cell", CmdEdit, FALSE); WindAddCommand(DBWclientID, "element option add a generic drawing element to the layout", CmdElement, FALSE); WindAddCommand(DBWclientID, "erase [layers]|cursor erase mask information", CmdErase, FALSE); WindAddCommand(DBWclientID, "expand [toggle] expand everything under box, or toggle\n\ expanded/unexpanded cells in selection", CmdExpand, FALSE); WindAddCommand(DBWclientID, "ext option OR", CmdExtract, FALSE); /* For "ext" abbreviation */ WindAddCommand(DBWclientID, "extract option circuit extractor; type \"extract help\"\n\ for information on options", CmdExtract, FALSE); /* For "extract" */ WindAddCommand(DBWclientID, "extresist [args] patch .ext file with resistance info", CmdExtResis, FALSE); WindAddCommand(DBWclientID, "feedback option find out about problems; " "type \"feedback help\"\n\t\t\tfor information on options", CmdFeedback, FALSE); WindAddCommand(DBWclientID, "fill dir [layers] fill layers from one side of box to other", CmdFill, FALSE); WindAddCommand(DBWclientID, "findbox [zoom] center the window on the box and optionally zoom in", CmdFindBox, FALSE); WindAddCommand(DBWclientID, "findlabel lab set the box to the location of this label", CmdFindLabel, FALSE); WindAddCommand(DBWclientID, "flatten destname flatten edit cell into cell destname", CmdFlatten, FALSE); WindAddCommand(DBWclientID, "flush [cellname] flush changes to cellname (edit cell default)", CmdFlush, FALSE); WindAddCommand(DBWclientID, "get OR", CmdGetcell, FALSE); WindAddCommand(DBWclientID, "getcell cell [child refPointC] [parent refPointP]\n\ get cell as a subcell of the edit cell, so that\n\ refPointC (or lower left) of cell is at refPointP\n\ (or box lower-left); refPoints are either labels\n\ or a pair of coordinates (e.g, 100 200)", CmdGetcell, FALSE); WindAddCommand(DBWclientID, "goto nodename goto the node named nodename", CmdGoto, FALSE); WindAddCommand(DBWclientID, "grid [xSpacing [ySpacing [xOrigin yOrigin]]]\n\ toggle grid on/off (and set parameters)", CmdGrid, FALSE); WindAddCommand(DBWclientID, "id OR", CmdIdentify, FALSE); WindAddCommand(DBWclientID, "identify use_id set the use identifier of the selected cell", CmdIdentify, FALSE); WindAddCommand(DBWclientID, "instance [list] children|parents|exists|self [name] OR\n" "instance [list] allcells|topcells\n\ List cells by relationship to cell \"name\", or\n\ the current selection if no name given. \"list\"\n\ returns result as a list. \"exists + name\" returns\n\ true or false (also see command cellname)", CmdCellname, FALSE); WindAddCommand(DBWclientID, "label str [pos [layer]]\n\ place a label", CmdLabel, FALSE); WindAddCommand(DBWclientID, "load [cellname] load a cell into a window", CmdLoad, FALSE); WindAddCommand(DBWclientID, "locking [enable|disable] enable or disable file locking", CmdLocking, FALSE); WindAddCommand(DBWclientID, "move [dir [amount]] OR\n" "move to x y move box and selection, either by amount\n\ in dir, or pick up by box lower-left and put\n\ down at cursor position; second form will\n\ put box at location x y", CmdMove, FALSE); /* Added by NP 10/28/2004 */ WindAddCommand(DBWclientID, "netlist option netlist operation; type \"netlist help\"\n\ for information on options", CmdNetlist, FALSE); WindAddCommand(DBWclientID, "orient [orientation] orient selection and box", CmdOrient, FALSE); WindAddCommand(DBWclientID, "paint layers|cursor paint mask information", CmdPaint, FALSE); WindAddCommand(DBWclientID, "path [search|cell|sys] [[+]path]\n\ set or print search paths", CmdPath, FALSE); WindAddCommand(DBWclientID, "plow option [args] stretching and compaction; type \"plow help\"\n\ for information on options", CmdPlow, FALSE); WindAddCommand(DBWclientID, "port [index] [direction...]\n\ declare a label to be a subcircuit port", CmdPort, FALSE); WindAddCommand(DBWclientID, "polygon type x1 y1 x2 y2 [x3 y3. . .] xn yn\n\ draw a polygon from a list of point pairs", CmdPolygon, FALSE); WindAddCommand(DBWclientID, "property [name] [value]\n\ add a property (string) to the edit cell", CmdProperty, FALSE); WindAddCommand(DBWclientID, "rotate [+/-][deg] rotate selection and box (counter)clockwise", CmdClockwise, FALSE); /* "rotate" is alias for "clockwise" */ WindAddCommand(DBWclientID, "random [seed [value]] generate random number or set random seed", CmdRandom, FALSE); WindAddCommand(DBWclientID, "save [filename] save edit cell on disk", CmdSave, FALSE); WindAddCommand(DBWclientID, "scalegrid a b scale magic units vs. lambda by a / b", CmdScaleGrid, FALSE); WindAddCommand(DBWclientID, "see [no] layers|allSame change what's displayed in the window", CmdSee, FALSE); WindAddCommand(DBWclientID, "select [option] change selection; type \"select help\"\n\ for information on options", CmdSelect, FALSE); WindAddCommand(DBWclientID, "setlabel [option [value]] place a label", CmdSetLabel, FALSE); WindAddCommand(DBWclientID, "shell [command] execute a command in a subshell", CmdShell, FALSE); WindAddCommand(DBWclientID, "sideways flip selection and box sideways", CmdSideways, FALSE); WindAddCommand(DBWclientID, "snap [internal|lambda|user]\n\ cause box to snap to the selected grid when moved\n\ by the cursor", CmdSnap, FALSE); WindAddCommand(DBWclientID, "straighten direction straighten jogs by pulling in direction", CmdStraighten, FALSE); WindAddCommand(DBWclientID, "stretch [dir [amount]] stretch box and selection", CmdStretch, FALSE); WindAddCommand(DBWclientID, "tech option technology handling; type \"tech help\"\n\ for information on options", CmdTech, FALSE); #ifndef MAGIC_WRAPPER WindAddCommand(DBWclientID, "tool [name|info] change layout tool or print info about what\n\ buttons mean for current tool", CmdTool, FALSE); #endif WindAddCommand(DBWclientID, "unexpand unexpand subcells under box", CmdUnexpand, FALSE); WindAddCommand(DBWclientID, "upsidedown flip selection and box upside down", CmdUpsidedown, FALSE); WindAddCommand(DBWclientID, "what print out information about what's selected", CmdWhat, FALSE); WindAddCommand(DBWclientID, "wire option [args] wiring-style user interface; type\n\ \"wire help\" for information on options", CmdWire, FALSE); WindAddCommand(DBWclientID, "writeall [force] write out all modified cells to disk", CmdWriteall, FALSE); WindAddCommand(DBWclientID, "xload [cellname] load a cell into a window unexpanded", CmdXload, FALSE); WindAddCommand(DBWclientID, "xor destname flatten current top level cell into destname\n\ and xor with existing contents", CmdXor, FALSE); #ifdef CIF_MODULE /* Add the CIF extension commands */ WindAddCommand(DBWclientID, "cif option CIF processor; type \"cif help\"\n\ for information on options", CmdCif, FALSE); #endif #ifdef CALMA_MODULE /* Add the GDS extension commands */ WindAddCommand(DBWclientID, "calma option Calma GDS-II stream file processor; type\n\ \"calma help\" for information on options", CmdCalma, FALSE); /* "gds" is an alias for "calma" */ WindAddCommand(DBWclientID, "gds option alias for the \"calma\" command", CmdCalma, FALSE); #endif /* Add the NonManhattan Geometry extension commands */ WindAddCommand(DBWclientID, "splitpaint dir layer [layer2]\n\ split box diagonally with layer in corner dir and\n\ layer2 in the opposite corner (default layer2 is space)", CmdSplit, FALSE); WindAddCommand(DBWclientID, "spliterase dir [layer] erase layers from diagonal corner dir of the\n\ edit box", CmdSplitErase, FALSE); #ifdef MAGIC_WRAPPER /* Add the Tcl commands for exttospice, exttosim, and aliases ext2spice, ext2sim */ #ifdef EXT2SIM_AUTO WindAddCommand(DBWclientID, "exttosim [args] convert extracted file(s) to a sim format file;" " type\n\t\t\t\"exttosim help\" for information on options", CmdAutoExtToSim, FALSE); WindAddCommand(DBWclientID, "ext2sim [args] convert extracted file(s) to a sim format file;" " type\n\t\t\t\"ext2sim help\" for information on options", CmdAutoExtToSim, FALSE); #else WindAddCommand(DBWclientID, "exttosim [args] convert extracted file(s) to a sim format file;" " type\n\t\t\t\"exttosim help\" for information on options", CmdExtToSim, FALSE); WindAddCommand(DBWclientID, "ext2sim [args] convert extracted file(s) to a sim format file;" " type\n\t\t\t\"ext2sim help\" for information on options", CmdExtToSim, FALSE); #endif /* EXT2SIM_AUTO */ #ifdef EXT2SPICE_AUTO WindAddCommand(DBWclientID, "exttospice [args] convert extracted file(s) to a SPICE format file;" " type\n\t\t\t\"exttospice help\" for information on options", CmdAutoExtToSpice, FALSE); WindAddCommand(DBWclientID, "ext2spice [args] convert extracted file(s) to a SPICE format file;" " type\n\t\t\t\"ext2spice help\" for information on options", CmdAutoExtToSpice, FALSE); #else WindAddCommand(DBWclientID, "exttospice [args] convert extracted file(s) to a SPICE format file;" " type\n\t\t\t\"exttospice help\" for information on options", CmdExtToSpice, FALSE); WindAddCommand(DBWclientID, "ext2spice [args] convert extracted file(s) to a SPICE format file;" " type\n\t\t\t\"ext2spice help\" for information on options", CmdExtToSpice, FALSE); #endif /* EXT2SPICE_AUTO */ #endif /* MAGIC_WRAPPER */ #ifdef USE_READLINE /* Add the Readline extension history command */ WindAddCommand(DBWclientID, "history print out the command history list", CmdHistory, FALSE); #endif #ifdef LLNL /* Add the Lawrence Livermore extensions */ WindAddCommand(DBWclientID, "makesw options generate scan window for LP apparatus", CmdMakeSW, FALSE); WindAddCommand(DBWclientID, "sgraph [options] manipulate a cell's stretch graphs", CmdSgraph, FALSE); #endif #ifndef NO_SIM_MODULE /* Add the IRSIM commands */ WindAddCommand(DBWclientID, "getnode option get node names of all selected paint", CmdGetnode, FALSE); #ifdef RSIM_MODULE WindAddCommand(DBWclientID, "rsim [options] filename run Rsim under Magic", CmdRsim, FALSE); WindAddCommand(DBWclientID, "simcmd cmd send a command to Rsim, applying it to selected paint", CmdSimCmd, FALSE); WindAddCommand(DBWclientID, "startrsim [options] file start Rsim and return to Magic", CmdStartRsim, FALSE); #endif #endif #ifdef PLOT_MODULE /* Add the plot extensions */ WindAddCommand(DBWclientID, "plot type [args] hardcopy plotting; type \"plot help\"\n\ for information on types and args", CmdPlot, FALSE); #endif #ifdef PLOT_AUTO /* Placeholder for plot extensions */ WindAddCommand(DBWclientID, "plot type [args] hardcopy plotting; type \"plot help\"\n\ for information on types and args", CmdAutoPlot, FALSE); #endif #ifdef LEF_MODULE /* Add the LEF/DEF extensions */ WindAddCommand(DBWclientID, "lef [options] LEF-format input/output; type \"lef help\"\n\ for information on options", CmdLef, FALSE); WindAddCommand(DBWclientID, "def [options] DEF-format input; type \"def help\"\n\ for information on options", CmdLef, FALSE); #endif #ifdef LEF_AUTO /* Placeholder for LEF/DEF extensions */ WindAddCommand(DBWclientID, "lef [options] LEF-format input/output; type \"lef help\"\n\ for information on options", CmdAutoLef, FALSE); WindAddCommand(DBWclientID, "def [options] DEF-format input; type \"def help\"\n\ for information on options", CmdAutoLef, FALSE); #endif #ifdef ROUTE_MODULE /* Add the router extensions */ WindAddCommand(DBWclientID, "*garoute [cmd [args]] debug the gate-array router", CmdGARouterTest, FALSE); WindAddCommand(DBWclientID, "*groute [cmd [args]] debug the global router", CmdGRouterTest, FALSE); WindAddCommand(DBWclientID, "*iroute [cmd [args]] debug the interactive router", CmdIRouterTest, FALSE); WindAddCommand(DBWclientID, "*mzroute [cmd [args]] debug the maze router", CmdMZRouterTest, FALSE); WindAddCommand(DBWclientID, "*seeflags [flag] display channel flags over channel", CmdSeeFlags, FALSE); WindAddCommand(DBWclientID, "channels see channels (feedback) without doing routing", CmdChannel, FALSE); WindAddCommand(DBWclientID, "garoute [cmd [args]] gate-array router", CmdGaRoute, FALSE); WindAddCommand(DBWclientID, "iroute [cmd [args]] do interactive point to point route", CmdIRoute, FALSE); WindAddCommand(DBWclientID, "route route the current cell", CmdRoute, FALSE); #endif #ifdef ROUTE_AUTO /* Placeholder for router extensions */ WindAddCommand(DBWclientID, "*garoute [cmd [args]] debug the gate-array router", CmdAutoRoute, FALSE); WindAddCommand(DBWclientID, "*groute [cmd [args]] debug the global router", CmdAutoRoute, FALSE); WindAddCommand(DBWclientID, "*iroute [cmd [args]] debug the interactive router", CmdAutoRoute, FALSE); WindAddCommand(DBWclientID, "*mzroute [cmd [args]] debug the maze router", CmdAutoRoute, FALSE); WindAddCommand(DBWclientID, "*seeflags [flag] display channel flags over channel", CmdAutoRoute, FALSE); WindAddCommand(DBWclientID, "channels see channels (feedback) without doing routing", CmdAutoRoute, FALSE); WindAddCommand(DBWclientID, "garoute [cmd [args]] gate-array router", CmdAutoRoute, FALSE); WindAddCommand(DBWclientID, "iroute [cmd [args]] do interactive point to point route", CmdAutoRoute, FALSE); WindAddCommand(DBWclientID, "route route the current cell", CmdAutoRoute, FALSE); #endif }