Magic 7.3 Download
Version 7.3 Disclaimers
Description of Version 7.3 Revisions
Features Specific to Magic Version 7.3
Technology Files for Magic Version 7.3
Things To Do
I have been working hard on the future-generation "magic" product. It is a working product and nearing a point of reliability/stability. I have updated the designation of the code from ALPHA to BETA, as I have tested several chips fabricated from GDS generated using the new features of version 7.3.
For differences between the 7.2 (BETA) development version and this one, please refer to the following sections.
Revisions starting at 75 and until further notice are undergoing some major changes in graphics handling. There may be some quirks in the graphics refreshing until all the bugs are worked out. However, these quirks are minor (they do not indicate a corrupted database) and can be eliminated with a forced screen refresh. Most people will prefer the tradeoff given that the graphics are blazingly fast compared to all previous versions of magic. Fast graphics allows more interactive graphics, so versions from 81 now incorporate such interactive graphics features as a crosshair cursor, interactive wiring, and "drag and drop" selections.
File Revision Size Date magic-7.3.123.tgz 123 (3.8MB) Februrary 9, 2006 magic-7.3.113.tgz 113 (3.8MB) November 30, 2005 magic-7.3.111.tgz 111 (3.8MB) November 23, 2005 magic-7.3.74.tgz 74 (3.7MB) April 2, 2005 magic-7.3.59.tgz 59 (3.5MB) November 3, 2004 magic-7.3.22.tgz 22 (4.0MB) June 2, 2004
IRSIM is a tool for simulating digital circuits. It is a "switch-level" simulator; that is, it treats transistors as ideal switches. Extracted capacitance and lumped resistance values are used to make the switch a little bit more realistic than the ideal, using the RC time constants to predict the relative timing of events.
IRSIM shares a history with magic, although it is an independent program. Magic was designed to produce, and IRSIM to read, the ".sim" file format, which is largely unused outside of these two programs.
For "quick" simulations of digital circuits, IRSIM is still quite useful for confirming basic operation of digital circuit layouts. For downloads and more information, refer to the IRSIM 9.7 web page.
Netgen is a tool for comparing netlists, a process known as LVS, which stands for "Layout vs. Schematic". This is an important step in the integrated circuit design flow, ensuring that the geometry that has been laid out matches the expected circuit. Very small circuits can bypass this step by confirming circuit operation through extraction and simulation. Very large digital circuits are usually generated by tools from high-level descriptions, using compilers that ensure the correct layout geometry. The greatest need for LVS is in large analog or mixed-signal circuits that cannot be simulated in reasonable time. Even for small circuits, LVS can be done much faster than simulation, and provides feedback that makes it easier to find an error than does a simulation.
Netgen was developed independently of magic, written by Massimo Sivilotti, and eventually incorporated into the beginnings of the Tanner L-Edit suite of tools. However, the original code was left open source, and so I have incorporated it into the Tcl-based suite of tools including magic, IRSIM, and xcircuit. For downloads and more information, refer to the Netgen 1.3 web page.
This version IS listed in the section above as "BETA" code. No guarantee is made to its stability. However, it can be expected to be stable. It should be expected to work as well as distribution versions of magic for chip submissions. However, for modern processes, especially deep submicron, it is always best to have a good array of backup (commercial) EDA tools. Most foundries provide DRC services (sometimes free), and it is always best to check for clean DRC before final submission, particularly in regard to antenna and density rules that magic does not check (yet).
This code is fairly well tested and free of bugs and quirky behavior in most sections. However, magic is complex and consists of many parts, and not all have been tested with the new methods. See the Magic-7.2 development version page for status explanations.
The purpose of the recent Magic development effort is, eventually, to be able to call Magic a "professional-grade" tool. Any help in this effort is greatly appreciated.
- September 12, 2003
Original version. The "only" change from version 7.2 is the method of handling contacts.
- September 22, 2003
Changed stacked contact handling such that stacked contacts are only generated in response to the keyword "stackable" in the "contact" section of the tech file. Otherwise, this version is supposed to be backwardly compatible with all technology files designed for versions 7.2 and earlier.
- September 26, 2003
Changes to match magic 7.2.51; addition of a LEF file reading routine.
- October 27, 2003
Changes to match magic 7.2.54.
- November 25, 2003
Changes to match magic 7.2.58. Also, fixed errors in the stacked-contact handling of the DRC section and selection stretching function.
- November 28, 2003
Fixed a long-standing error in the techfile DRC section which caused "no overlap" errors on all contacts whenever subcells were present. Also, fixes transferred from 7.2 with "*" notation in the tech file, and a very long- standing error with the select() function in the IRSIM I/O handler, when compiled on systems defining SYSV (such as Linux). Thanks to Mike Marcel for pointing out this problem.
- December 1, 2003
Minor changes to match magic 7.2.60---colormap and style files expanded to include metal9 and metal10 definitions and corresponding vias; LEF read routine enhanced to speed up reading files with complicated port geometries, which result in a long list of labels in the cell definition.
- December 3, 2003
Fixes to DRC routines for subcell interaction, including a new algorithm for determining exact overlap which does not require rectangular areas. Also, updated style files to format 7, removing all octal notation and replacing with "%i" notation (normally decimal, with 0x for hex and leading 0 for octal). Stipple patterns changed from 3-digit octal to 2-digit hex (for obvious reasons).
- December 5, 2003
Fixes to the extract and extresis sections for compatibility with the stacked contact method. Extraction and IRSIM simulation confirmed for the tutorial cell.
- December 11, 2003
LEF/DEF reader expanded to encompass LAYER, VIA, and VIARULE statements, and separately handle port and obstruction layers inside cells. Tech file scmos9m.tech modified to include obstruction layers on active, m1, and m2 planes.
Also: Took care of several things in the TODO file, including removing references to Void and removing the deprecated keyword register. Void references have not been entirely resolved, as some of them need to be void and others int or bool and files need to be worked through individually.
Also: Some fixes to resistor and capacitor extraction, esp. to add the SPICE semiconductor resistor and semiconductor capacitor types. Better extraction models are needed, however.
Also: Some fixes to configuration and Makefile, in particular, to add in the switch -fPIC which was defined but unused.
- December 30, 2003
Fixes to match version 7.2 revision 62, including the fixed Tcl line input method (for functions such as label entry in the "netlist" window). The input method is called by the Tcl function "magic::dialog [prompt] [prefix]", but is handled slightly differently depending on whether it is called from the command line or from a button function such as the netlist menu label input.
- March 11, 2004
Changes to the colormap reader to handle 1) color names, 2) comment lines, and 3) more than 256 entries. Colormap files have been updated to take advantage of this change. Style files can potentially use color names in place of numbers, but these have not been updated.
Also: The restriction that the tcl version must be compiled with "make tcl" and installed with "make install-tcl" has been eliminated. Now, "make" and "make-install" suffice for both the tcl and non-tcl versions.
- March 19, 2004
Changes to match magic version 7.2 revision 64, including modified SimTreeSrTiles function, enhanced command-line functions goto, getnode, findlabel, and update, and added the new command (TCL only) search. Modified the autoconf configure to compile Tcl and OpenGL by default, and rearranged directories to put the TCL scripts in subdirectory "tcltk".
- March 31, 2004
Changes to match magic version 7.2, revision 65, including handling of DOS-style Carriage-return/linefeed in technology files, and correction/extension of the "squares-grid" command in the tech file "cifoutput" section.
Also: Corrected an error in reading the "edge" rules in the technology file DRC section.
Also: Changed the behavior of coordinate parsing so that all commands can handle grid-based coordinates. The command "snap user" will cause all coordinates to be based on the grid specified by the "grid" command, by default. This includes handling the grid offset and different X and Y grid spacings.
Also: Fixed the "paint" command in the technology "compose" section so that it operates on contact types without missing planes.
- April 9, 2004
Changes to match magic version 7.2, revision 66, namely Cygwin compatibility in the make process.
- April 12, 2004
Changes to match magic version 7.2, revision 67, namely the modification of exttospice (ext2spice) to add ".subckt ... .ends" around top-level circuits that define ports, and the ability to revert to the original behavior using "exttospice subcircuits top off".
Also: Added the command "cellsearch" to the TCL-based version, that registers a TCL procedure as the callback function to a search over cells. This is similar to the "search" command for tiles. The two variants are "cellsearch
" for searching once for every cell definition, and "cellsearch instances " for searching over all cell uses. The TCL procedure in the first case takes one argument, which is the cell name. The procedure for uses takes 3 arguments, the first a list of four integer values representing the bounding box of the instance in root coordinates, followed by two string values representing the instance name and cell name, respectively.
- April 13, 2004
Fixed an error in the configure script that caused a run-time error in revision 15.
Also: Added the capability to give alias names for stacking types in the technology file. Changed the behavior of "paint" and "erase" commands to handle stacking contact type names by painting or erasing the residues (contacts) of the stacking type rather than the stacking type itself. Changed the behavior of the layout (.mag file) reader in DBio.c to handle stacked contact names in the input file, which finally provides some compatibility with layouts generated using technology files with explicitly-defined stacking types.
- (never posted)
Corrections to capacitance calculations for areas shielded from the substrate by intervening types.
- May 7, 2004
Corrections to line drawing of non-Manhattan selection areas at the screen boundary, and a very important correction to region and network selection of areas containing non-Manhattan geometry, which otherwise may hang the process (although it is interruptable).
- May 11, 2004
Makes a correction to the tech file read-in of stacked contacts that allows one layer (such as "pad") to be defined that has the same residues as one stacking type (such as "m123c") without magic's confusing their respective paint/erase tables. This avoids the necessity of having to define an extra plane (usually "oxide") just so type "pad" can have different residues than the stacked contacts. Note that this is only a problem for 3-metal-layer technologies, as four or more layers in a pad would never match any of the automatically-generated stacked contact types.
- May 13, 2004
More corrections similar to Revision 18 to complete the correct behavior on searches containing non-Manhattan tiles for the sim ("getnode") and resis ("extresis") modules. A few corrections to Revision 19, which failed to compile do to some typos in the source.
- May 24, 2004
Added an arrowhead extension to the "line" element type. Also, cleaned up the error message text for the "element" command such that it gives helpful feedback about correct syntax and available options. Element reads from a .mag file now correctly set the "persistent" flag for "line" and "rect" elements (in addition to "text", which was previously handled correctly).
- June 2, 2004
Fixed the "device capacitor" and "device resistor" extraction to operate correctly on devices with model names (other than "None") for which a device length and width is extracted instead of a value. Thanks to Mark Martin for pointing out this error.
Also: Fixed "getnode" and "extresis" (again!), this time to properly handle stacked contact types. Otherwise, these functions can hang when encountering a region containing a stacked contact.
- June 3, 2004
Removed all of the error-generating statements at the top of many the header files, and instead implemented a standard method by which each include file defines a variable indicating that it has been parsed, and makes sure that it is not read more than once. Then, each header includes any other headers that it depends on. Further, redundant declarations of TRUE and FALSE have been removed, and "bool" has been typedef'd to "unsigned char". bool variables set to negative values have been recast as "int". Thanks to Jason Schonberg for the patch file which implemented most of the above changes.
- June 15, 2004
Added a preliminary version of the DEF file writer. Documentation to be provided, eventually.
- June 18, 2004
Improvements on all the LEF/DEF methods. The current version handles VIA definitions correctly, although at the moment it reads contact CUTS and does no extra processing (i.e., CIF-to-magic boolean rules) to produce the magic contact areas. Unlike previous versions, it preserves route and via coordinates in half-internal-unit values. Still to do: 1) Handle routes with non-standard widths as "SPECIALNETS" instead of "NETS" in the "def write" function, 2) implement CIF-to-magic rules on contact cuts, 3) convert PINS section in DEF files to ports in the top-level layout for the "def read" function.
Also: Removed the restriction that no two contacts can share residues. It is now perfectly legal to define types, say, "via" and "viacut" which are treated differently by DRC and CIF I/O, but which contact the same two layers (e.g., metal1 and metal2).
- June 22, 2004
A few more improvements on LEF/DEF methods. Implements SPECIALNETS vs. NETS in the DEF output file. All named nets, and especially nets with global names or matching the TCL variables $GND and $VDD, will be treated as "special nets".
- July 2, 2004
A couple of critical fixes. The "stretch" function problems have been eliminated (thanks to Nishit at SynappsCorp).
- July 7, 2004
Expanded the "tech" command to query the DRC database. Includes command options "tech drc width <layer>" and "tech drc spacing <layer> [<layer2>]".
- July 8, 2004
Critical fixes to the stacked contact painting functions, which now appear (fingers crossed!) to be correct. There is one important caveat: Layouts created under magic-7.2 or earlier which attempt to make contact stacks by painting types that are officially not supposed to overlap (like m456c on top of m3c, in the SCN6M_DEEP.09 process) will not load correctly in magic-7.3. However, if the techfile conversion program (see download table) is applied to the original technology file, and the resulting techfile is used to view the layout, it will work correctly.
Also: Revision 23 was found to break exttospice, in that nodes would always be interpreted as floating due to the critical bit being lost in the conversion to boolean. This has also been fixed.
- July 9, 2004
Yet again, another fix to the connectivity selection mechanism for non-Manhattan geometry. This one involves coping with "(M)INFINITY" values in border tiles. "Infinite" values are handled by enforcing the special arithmetic (INFINITY + x = INFINITY) and so forth, and so all such equations must be computed separately.
- July 13, 2004
New network selection "undo" record by Nishit at SynappsCorp. This code separates network selection from other types of selections when creating the undo/redo records. The premise is that network selection 1) is virtually always for informational purposes only, 2) involves a lot of tiles, and 3) rarely ever gets undone/redone. The original selection undo mechanism remembers every single tile paint operation. This makes sense for area selections. However, for net selections, it is very easy to regenerate the network selection on the fly by knowing only a single starting position. So the new method does not gobble up huge chunks of memory for every network selection, and by avoiding all of the memory allocation overhead, actually speeds up network selection significantly.
Also: Minor but critical fixes to non-Manhattan geometry handling for extraction.
Also: "Corrected" subcircuit extraction for ports which belong to the same network. I put "corrected" in quoted because the situation is somewhat undefined. However, the newer version will write the expected number of arguments to the "X" record when writing the SPICE deck. Done this way, the method supports "thrus" in standard cells.
Also: New command option "wire segment" will draw wire segments by supplying a centerline and width. Will draw non-Manhattan segments (finally, a command to draw non-Manhattan wires!).
Also: Support added for the read-in of non-Manhattan wires in CIF and GDS input. This is specifically for the "wire" record, which is different from rectangle and polygon records, and tends to be rarely used.
- July 14, 2004
Corrects a couple more errors in non-Manhattan geometry painting/erasing.
Also: Corrects the macro rebinding of "o" and "O" for "openwrapper" and "closewrapper" by allowing macro definitions to call Tcl procedures as well as magic commands. This is a "real ugly hack" because it requires setting up a "dummy" command name to pass to the macro, with the real command set as a tag callback to the dummy command name.
Also: Used the new macros-call-procedures method to define new procedures "pushstack" and "popstack" and bind them to keys ">" and "<", enabling a more hierarchical feel for the editing.
- July 16, 2004
Very important new feature: The command option gds readonly [true|false] allows imported GDS cells to be tagged with 1) "read only" status, 2) the GDS filename, and 3) the start and end file positions for the cell. When this cell is written back into an output file, the cell definition itself will be copied verbatim from the original GDS to the new output file, regardless of what magic shows the contents of the cell to be. This is intended for handling vendor-supplied cells such as padframes and standard cells, where one does not want to risk having magic possibly alter the layout of a pre-characterized circuit through its boolean operators. With this method, one can devise a special "cifinput" section of a techfile for translating GDS into a LEF-like cell structure, wherein the standard cells have most details hidden and only show areas for routing and obstructions.
Note that one can query the information retained about the GDS file and positions using the "property" command in magic.
Also: The "hack" mentioned in revision 32 has been made more transparent by defining a new command "gmacro" (for "general-purpose macro") that has exactly the same syntax as "macro" and "imacro" but which allows Tcl procedures and statements to be called by the macro expansion.
- July 19, 2004
Non-Manhattan paint routine correction.
Also: Updated the technology file format to "30" with the addition of CIF istyle and ostyle "variants" (see the Technology web page for details).
- July 20, 2004
Non-Manhattan painting tile cleanup attempt. This prevents excessive splitting of the tile plane during non-Manhattan paint operations. It does not yet allow general merges of sub-split non-Manhattan tiles into larger, simpler tiles, so it does not completely correct the problem.
- July 21, 2004
"Wire segment" command extended to multiple segments and handles corner mitres between segments.
Also: "closewindow" command extended to include a window name, so the command can be run from the command line, with predictable results.
Also: Window-manager initiated window close commands (WM_DELETE_WINDOW message) forced to use the magic "closewindow" command (using the Tcl "wm protocol" command).
Also: Non-console startup redesigned to use a standalone executable "magicexec" which is a replacement for "wish" and works around the problem of reading the "magic.tcl" script in place of the ".wishrc" script. This allows "magic -noc" to be called from a remote machine, which is important for being able to run Tcl-based magic in batch mode.
- July 26, 2004
Removed the "DoubleInt" code (thanks to Nishit Patel for the code changes) on the assumption that most compilers will recognize "long long" as a 64-bit integer type, and handle it correctly. Also, this release defines an option "euclidean" to the "drc" command that turns on/off the Euclidean distance metric for DRC checking. Previously, this option had to be compiled in and could not be changed.
- July 28, 2004
Added the new GDS command option "gds array" which is actually the old GDS command option "gds flatten". Now, "gds flatten" indicates that "small" cells in the GDS input stream should be flattened. With "small" set to mean "10 rectangles or fewer", this method catches most instances in which contact cuts are arrayed prior to writing GDS output. By flattening these instances on read-in, magic is forced to do more processing up front, but subsequent processing, such as displaying, DRC, extract, connectivity searching, etc., will be much faster. This method will also tend to stop the generation of "generic" contact and diffusion forms, which are usually the result of the arrayed cell form for contact cuts.
- July 29, 2004
Added PROPATTR and PROPVALUE records to GDS (thanks to Nishit Patel) that allows magic to record instance names and array information that is not otherwise possible to write and read back, such as cell use IDs and array indices that do not start at zero. Some more code cleanup thanks to Jason Schonberg, including removing a copy of the whole magic tarball that managed to get into the top directory, making the whole tarball twice as big. A few corrections for compilation on FreeBSD thanks to Chris Lafrieda at Cornell, and finally, the debugging definition for file locks has been removed and changed to a configuration option (normally disabled).
- August 3, 2004
Added a "variants" extention to the cifinput, cifoutput, and extract sections of the techfile (see the Technology Files web page for details).
Also: Corrected a DRC error that causes certain rules (especially the "surround" rule) to effectively shadow other non-related rules.
Also: Corrected a small memory leak in the implementation of PROPATTR in the GDS output from revision 39.
- August 4, 2004
Fixed another DRC problem which shows false DRC errors on stacked contact types because the checker routine fails to skip "false edges". Also: All MALLOC, CALLOC, and FREE macros replaced by their respective routines mallocMagic, callocMagic, and freeMagic. Thanks to Jason Schonberg for this patch.
- August 5, 2004
Added capability to read non-Manhattan paths in the GDS input. This also corrects a problem with the original GDS path parser which would round off paths with a centerline on a half-integer boundary relative to the base GDS scale. This routine handles endcap specifications in the GDS (except for round endcaps). The endcap handling has been copied to the "wire segment" command, which may now take the switch "-noendcap" as its last argument.
- August 6, 2004
Corrected revision 42, including a complete and correct implementation of input scaling in the GDS file. Also corrected the "gds flatten" function such that if the GDS file instances cells before they are defined, these cells will not be flattened. Thanks to Johannes Grad for help with the GDS read-in problems. The result is that magic-7.3.43 is compatible with GDS produced by various commercial place-and-route tools. Example layouts were produced using the IIT standard cell library.
- August 10, 2004
Made an additional correction to revision 43 to avoid changing the GDS input multiplier scale while GDS is being read; otherwise, after a scale change, the remainder of the GDS file gets read at the wrong scale. Again, thanks to Johannes Grad for providing place-and-route examples demonstrating the error.
- August 12, 2004
A critical fix to the GDS and CIF rescaling; the plane rescaling function was using the database paint table, not the CIF paint table, causing loss of data under certain conditions when reading GDS or CIF files. Also, fixed layout (.mag file) read-ins for labels attached to stacking types, which was not covered by the handling introduced in Revision 16 (see above).
- August 17, 2004
Minor fixes and enhancements, especially for scripting procedures. "-origin" option added to the "rotate" command to rotate about the layout origin. Procedures "suspendall" and "resumeall" changed to allow nesting. "instance list self" now returns all selected instances, and that and "cellname list self" don't merge the output strings together into one glob. Procedure "pushstack" will attempt to select a cell if one is not already selected.
- August 18, 2004
Important fix to cifinput/cifoutput rule handling: This was operating on ALL planes for each rule, so rules with contacts would apply the bloat procedure to both planes containing the contact, usually giving improper results. This almost always causes select layers (n-select, p-select) to come out wrong.
- August 24, 2004
Fixes a simple but rather bad error in revision 47 which causes incorrect output for the "squares" function in CIF/GDS output.
- August 28, 2004
Another fix to extraction of contacts which was failing on occasion to connect together nodes on either side of a contact, due to the new way that magic 7.3 handles contact images.
- September 2, 2004
Revised the extraction mechanism for resistor devices to split the capacitance under the resistor, distribute it between the resistor end terminals, and then ignore the node in subsequent extract file output.
Note that the feature has the consequence of reporting missing nodes when extracting a hierarchical circuit with resistors. This approach will be abandoned soon in favor of reporting the isolated node in the "devres" line in the extract file, and handling the capacitance distribution in "ext2spice" instead of in the extractor, with appropriate flags given to the "ext2spice" command.
- September 6, 2004
A large number of changes in this revision. Corrected a number of annoyances/errors, including:
- Strict file permissions given to ".mag" files arise from changes in the GNU database for function "mkstemp". This has been corrected by changing the file permissions to match the user's umask after renaming the file.
- Characters left-bracket, backslash, and double-quote can once again be typed to the command-line (console) from inside the layout window.
- "select net" may once again be followed by a move/copy/stretch command with the expected results. This fix also prevents the loss of the net selection after "undoing" these commands.
- "select net" now properly detects a connection through a stack of four or more contacts.
- Selection of non-manhattan geometry retains the geometry through move/copy/stretch functions. Previously, if the command caused the non-manhattan regions to be blended back into manhattan geometry, the manhattan geometry would get added to the selection, an unexpected result.
- Non-manhattan "splitpaint" and "spliterase" commands translate the orientation correctly when the target edit cell is rotated or flipped.
- DRC properly handles non-manhattan geometry checks between subcells. HOWEVER, I did replace a large chunk of magic's paint code because I could not find any justification for it. A possible consequence of this change might be spurious DRC errors. I should be notified immediately if anyone discovers quirky behavior in the DRC mechanism (but I have done basic sanity checks on this).
- September 7, 2004
A correction to the extraction code that fixes errors in resistor device extraction when the contact type is defined in the tech file such that the contact abuts to the resistor type.
- September 8, 2004
As promised, replaced the Pi-network method for "device resistor" extraction with a Tee-network method that preserves all of the computed capacitance. Becauase this involves splitting the resistor into two parts, it plays havoc with LVS. Therefore, it is enabled or disabled with the command-line "ext2spice resistor tee on|off". This method is disabled by default.
- September 17, 2004
A number of minor changes, most too trivial to mention. A change to nonmanhattan DRC checking made one or two revisions ago was deemed much too lenient, and changed back to the original (which was a bit too conservative, but better that way than the other).
- October 19, 2004
A number of major changes. HTML documentation for the command reference added to the "doc/html" subdirectory (and also copied on this website). Command "findlabel" corrected (previously caused a program crash). Command option "gds contacts" added to allow contacts to be written to the output as arrayed subcells (as most EDA software does, these days) to greatly reduce the size of the resulting stream file. Command option "gds order" added to force post-order reading of data from a GDS file. This option is forced when using "gds flatten" because the contents of subcells must be known at the time of flattening. Corrected the use of the middle mouse button to pick and fill paint, and the "what" command, when multiple stacked contacts are involved.
- October 25, 2004
Overhauled the "plot pnm" function so that it is almost foolproof; the new version configures default rendering styles without requiring a section in the technology file, so it is compatible with all existing technology files. Also, it can now work on very large chip layouts without running out of memory. Finally, it does true 24-bit color blends and a number of optimizations for speed.
Also: Added a script to pull the version and revision information from the directory name, and the startup code and the "version" command now print the revision information.
Also: Removed old and unused directories, and cleaned up the directory structure such that modules with only one source file to compile are merged into the "utils" directory.
- October 29, 2004
Extended the method used for extracting annular transistors to cope with "device resistor" and "device capacitor". Also, fixed a bug in the method which was previously giving incorrect output for certain geometries of annular transistor.
Also: Added keyword "alias" to the "types" section of the technology file. This allows the declaration of macros representing multiple device types. These macros will be expanded when reading the technology file. With this addition, the magic technology file syntax is now able to handle everything that the preprocessors were used for, so there is no longer any need to write technology files requiring preprocessing. Fixed a bug in the handling of the "variant" keyword in the techfile extract, cifoutput, and cifinput sections.
- November 1, 2004
Corrected the device merging code in ext2spice and ext2sim. This had been incorrectly merging (or not merging) devices due to not re-zeroing a counter in the command version (as opposed to the standalone version, which runs from the beginning every time). A few test cases suggests that the merging works properly now both for "conservative" and "aggressive" merging.
- November 3, 2004
Fixed a couple of errors in the resistor extraction code from revision 58, and altered the algorithm so that the result is orientation-independent. Grieved over presidential election results.
Also: Added the capability to add include statements in the technology file to break up the technology file into pieces (some of which may be used by multiple technologies; this is done by the scmos techfiles but is a preprocessor option and does not make it to the final version).
Also: More code cleanup thanks to Jason Schonberg.
- November 9, 2004
Overhauled the macro handler, to use hash tables instead of a linked list, and to operate separately on different window types. Removed the "gmacro" scripted command, as the overhaul removes the problem with calling multiple commands or Tcl procedures from inside macro definitions.
Also: Overhauled the event mechanism so that buttons are treated like keys and may be bound to commands like keys. Revised several commands (notably "box") to have the command options that can mimic the button operations. Currently, the "netlist tool" is nonfunctional because there is no command-line equivalent of the button actions. This will be corrected shortly. If you need the netlist tool, use revision 59.
- November 10, 2004
Finished the overhaul of the event mechanism to include the "netlist tool" functions and also the 3D window functions. Fixed and enhanced the "render" procedure for the 3D window with a GUI wrapper. Fixed a bug in the 3D window background clearing, and another bug in the MacroRetrieve procedure call. Thanks to Nishit Patel for most of the command, procedure, and macro enhancements and rewriting for the new button event mechanism.
Also: The title bar of the GUI layout window now reports the tool in use.
- November 15, 2004
Went back and attempted a non-Tcl compile, and corrected all the errors that cropped up. It is now possible to compile and run without the Tcl interpreter.
- November 16, 2004
Corrected the .dstyle file format loading backward compatibility to versions earlier than 7. Also, lifted the limit on the number of stipples that can be in the style file.
Also: Fixed the non-GUI scrollbar in the Tcl version; fixed the system .magic file creation for the SCHEME interpreter version.
- December 3, 2004
Added the ability to handle Button4 and Button5 button bindings, which correspond (in Linux, at least) to mouse scroll wheel events.
- December 7, 2004
Corrected two segfaulting errors, one related to non-Manhattan geometry, and the other related to confusion of the "join" command between Tcl and the netlist window, since the command handling for non-layout windows was changed.
- Februrary 1, 2005
Return-value declaration fixes by Jason Schonberg. Fix to the GUI scrollbar for cases in which lambda units are larger than internal units. Fix to the new "include" statement in techfiles that checks the directory where the parent tech file is located. Added (preliminary) handling of contact cuts inside triangular areas (this feature does not extend to the "contact subcells" option for GDS output).
Also: Changed the "alias" name handling so that names declared as aliases in the technology file can be both loaded from .mag files or painted and erased on the layout (see the Technology Files web page).
- Februrary 23, 2005
Corrected an error in the CIF/GDS generation, in which contacts could not be placed on a 1/2 centimicron grid if the lambda value is odd (e.g., scalefactor 9 for a 0.18 process), resulting in off-center contacts and illegal layout where contacts in neighboring cells overlap.
Also: Added a few styles to the pattern style files.
- March 7, 2005
Rewrote the "maxwidth" rule algorithm from scratch, such that it actually now works correctly under all conditions. By integrating the new maxwidth algorithm into the "widespacing" rule, that one now works correctly, as well. This is bigger news than can be expressed in a release note.
Also: Corrected the "version" and "revision" scripts so that they work correctly when the magic directory is symbolically linked (which it is in the CVS version on opencircuitdesign.com).
- March 8, 2005
Added so-called "wizard" commands "drc *halo" and "drc *stepsize". These allow control over the DRC halo and stepsize distances. The latter can be specified in the technology file, but having on the command line lets one easily optimize the value to keep the DRC computations to a minimum. The halo is normally set to the largest dimension in a DRC rule, to ensure that all rules are checked when processing arrays and subcells. Unfortunately, pad rules, maxwidth, and widespacing rules are so large that they can slow the DRC computations down to a crawl. With the new command option, the halo distance can be forced down to a value that keeps magic running at a reasonable clip, while missing some of the rule checks (naturally, at some point, one would want to set the halo back to the original value and run a full DRC check on a design). This is a stop-gap measure; I intend to investigate what can be done to properly deal with the problem.
Also: Revised the algorithm from revision 68 (see above) for greater speed.
- March 14, 2005
Final modifications to the routine implemented above; removes cryptic and unsettling messages about "out of memory for maxwidth rule" or somesuch.
- March 16, 2005
Added two new commands:
(1) polygon type x1 y1 x2 y2...
Generates a polygon from the indicated point pairs.
(2) *bypass command...
Bypasses any redirection to the terminal that is currently in effect. Revision 60 broke the behavior that button commands can be executed while a command is halfway typed in on the command line (via the ":" macro). By mapping button commands to the *bypass command, this behavior has been reinstated. I often make use of this feature.
- March 22, 2005
Added new CIF boolean operator "bloat-all <types1> <types2>". This operator includes all material of types types1, then finds all bordering material of types types2, to the extent of connectivity (simple connectivity, on one plane only).
- March 31, 2005
Fixed a bad error with triggered (e.g., "widespacing") rules. A triggered rule followed by a rule for the same layers with a larger distance value can cause a segmentation fault.
Also: Reinstated the "Makefile.in" for the readline-4.3 directory, which was inadvertently deleted by CVS.
- April 2, 2005
Fixed an error with the new maxwidth rule, which would cause spurious error reports where no errors existed.
Also: Added a new CIF boolean operator "bbox [top]" that generates a rectangle encompassing the bounding box of the cell. If the optional keyword "top" is present, the bounding box is created in only the topmost cell.
Also: Patches from Jason Schonberg. Mostly prototypes and include statements, and one correction of a potential string boundary underrun.
- April 4, 2005
Major revisions to the graphics. Backing store implemented for caching the graphics image between the layout drawing and the highlight drawing, restoring the quick response previously enjoyed by the 8-bit graphics implementation. Extended this method to handle automatic refresh of layout areas during screen scrolling. The result is blazingly fast graphics for anything other than a full screen redraw (will have to work on that later).
Also: Fixed a few other graphics anomalies in the process, including the problem of hacked-up contact crosses, and an unnecessary redraw that was being done in the areas that would be scrollbars in the non-wrapper version.
Also: Modified tkcon.tcl to accept the environment variable MAGIC_WISH preferentially to the default value of "wish". This can be used to prevent the situation where magic is compiled for one version of wish but tkcon is starting up with another one, preventing magic from running.
Caveat: The present revision has a few quirks, the main one being that I have not dealt with border areas in the backing store implementation, so the redrawing is incorrect when magic is run without the "-w" option (which would be always, for the non-Tcl compiled version).
- April 5, 2005
Updates to revision 75: The backing store mechanism now correctly handles border areas, and operates in both the Tcl and non-Tcl based versions of magic (both for OpenGL and standard X11 graphics).
Also: Extended the backing store mechanism to handle expose events from the graphics, so the layout does not need to be redrawn when the window is moved or raised from behind another window. This is particularly noticeable when multiple expose events are generated, such as when another window is dragged across the top of the layout window.
Also: Corrected two errors with the non-Tcl compile: One of them prevents successful compilation the first time around because a symbolic link to the readline package is not created until after it is needed by commands/CmdFI.c. The other error is the sudden dysfunction of the pthread_join() routine in the threaded graphics code, which used to work but now causes magic to hang upon exit. The behavior is most likely dependent on the version of the pthreads library used, and may be system-dependent.
- April 6, 2005
A few more updates to the graphics speedups: The backing-store refresh for highlight erases was moved to the proper place, and some attempt was made to synchronize the X11 and OpenGL calls before/after backing-store operations.
Also: Added text clipping to the cell bounding box for the OpenGL graphics using glScissors(), something that was previously unimplemented.
Most of the peculiarities of the backing-store system have been eliminated except for two: 1) Scrolling needs to be adjusted to match the 8-bit stipple pitch, and 2) Areas obscured by other windows need to be tracked so that the backing store mechanism does not attempt to write into, and then recover from, an invalid window area. As it is now, placing the magic layout window halfway off the screen and then scrolling the layout view causes the window to get all screwed up. Requires catching and handling Expose and NoExpose events, and keeping an extra plane per window mapping these areas.
- April 7, 2005
And, as predicted and promised, yet more updates to the graphics: Fixed the scrolling to match stipple alignment, and fixed the area saved to backing store, which was too large and sometimes saved slivers of highlights into backing store.
- April 11, 2005
Added the capability to track VisibilityChange events in X11, so the backing store mechanism won't allow a copy from an obscured window into backing store.
Also: Major additions to the selection mechanism. Added command options select pick, select move, and select keep. These commands manipulate the selection without clearing the selection at the end of the opration, allowing "drag and drop" operations. To this end, the Tcl version adds the "pick tool" to the list of available tools.
Also: Other minor bug fixes, including replacing Makefiles in the readline subdirectories, such that readline actually compiles again.
- April 12, 2005
Corrected an error introduced into the selection highlight redraw code in the previous revision. Corrected a few errors in the interactive selection code. Removed the "tool" command from the Tcl version and switched the "changetool" script to "tool" to replace it. Created command option "cursor
" to set the tool cursor (previously done by the "tool" command). Added a new cursor for the "pick" tool, and worked out more of the button and motion bindings for "pick".
- April 14, 2005
Added a slots operator into the cifoutput code, similar to squares but allowing different sizes in tile long and short dimensions. This is somewhat experimental at the moment, but gets around certain problems in generating specific vendor geometries.
- April 15, 2005
Added a crosshair cursor, and interactive wiring. The crosshair cursor uses the new command crosshair, and the interactive wiring uses the new command option wire show, which does the same thing as wire leg but puts the result in the selection cell, so that it can be displayed prior to committing to the wire route. The two new features together make precision wiring much easier and faster than before. In the Tcl/Tk GUI wrapper, the crosshair can be turned on and off from the "Options" menu, and the interactive wiring and selection have been added to the "wire" and "pick" tools, respectively.
Also: The use of GL_LINE_SMOOTH in OpenGl has been reworked to operate only on lines that are not orthogonal to the axes (mostly contact X's). Otherwise, the operator tends to draw lines double-wide (at least in certain video driver implementations).
- April 16, 2005
Repaired a few errors in the interactive selection and wiring mechanims. Interactive selection now tracks the coordinates relative to the starting position and properly translates from edit cell to root cell coordinates. The interactive wiring does not register uncommitted routes with the "undo" mechanism.
Also: Added new command options wire incr|decr width|type for automatically bouncing up and down routing layers. In the Tcl/Tk version of the "wire" tool, the bindings are as follows:
The wire incr|decr type command takes the further step of picking the wire width for the next routing type from the DRC minimum width rules. To be done: Add a mechanism for enforcing design rules based on DRC spacing and width (need to ensure that DRCGetDefaultSpacing() works properly. . .).
- Button4 (scroll wheel): wire incr width
- Button5 (scroll wheel): wire decr width
- Shift-Button1 wire incr type
- Shift-Button3 wire decr type
- May 11, 2005
Fixed an error in the GDS read-in routine which causes it to ignore most boundary records. Thanks to Erwin Prinz for pointing out this error.
Also: Patches from Jason to fix a crash situation when an attempt is made to open the 3D window without starting magic in OpenGL graphics mode, and addition of missing include files.
Also: Fixed a problem with handling cell names containing a dollar sign character, allowing magic to import/export Cadence pcells verbatim using the "gds readonly" option.
Also: Fixed some problems arising from using the "tool" command (now script procedure) when not also using the GUI wrapper. Thanks to Mark Martin for pointing out this error.
- May 11, 2005
Fixed an error causing a crash when "gds rescale false" is used and snapping causes triangular areas to become degenerate. Also added "cellname lock|unlock" command option and "cellname flags" command option. Disabled DRC checks on read-only GDS cells.
- May 16, 2005
Corrected a problem with inter-cell CIF/GDS generation on vendor (read-only) GDS cells. Unfortunately, the root of the problem seems to be the plane fracturing algorithm, so this fix only bypasses the error. However, it is certainly true that magic should not generate any output based on the "fake" geometry in the .mag file corresponding to the vendor GDS file.
- May 31, 2005
Some minor script-level corrections. Added "*bypass" to interactive commands to prevent them from resetting the keyboard redirection to the console. Changed the name of the options file from ".magic" to ".magicrc", with the ".magicrc" file being searched first, followed by ".magic" if not found. The system-level options file was changed to ".magicrc". Also: processing the system-level ".magicrc" file in the Tcl version is now wrapped in "suspendout" and "resumeout", preventing Tcl commands in the file from being echoed to the console. Commands "set VDD vdd!" and "set GND gnd!" have been put into the system-level file to prevent the extractor from complaining that they are not set.
- June 1, 2005
Corrected an error that prevented the "alias" techfile keyword from working correctly.
- June 3, 2005
Corrected an error, discovered and reported by Wei Zhang at Princeton, in which the "extract length" function fails. There were two errors here, one of which was the failure of DBTreeCopyConnect to generate all images of a contact, and must impact some of the other connectivity search routines as well.
- June 28, 2005
Corrected one error, added one extension, and adjusted one "feature". The error, reported by Mark Martin, was that the backing-store mechanism fails on non-layout windows, causing magic to crash if any non-layout window is opened. The extension is the addition of handling non-unity magnification in GDS input files (it only handles integer magnifications, but clearly this is a huge improvement over treating all magnifications as equal to one). The feature was the behavior that closing the console window exits the application abrubtly. I modified the behavior so that closing the console window calls magic's quit routine, prompting the user to acknowledge that modified files have not been saved.
- July 17, 2005
Reworked some of the DRC code. The "drc find" command now searches the hierarchy, not just the current cell, so it does not miss errors that are in descendents of the current cell. To "drc count" I have added an option "drc count total" that reports total number of errors in the layout. This is used by a new GUI function in the wrapper that reports DRC clean/not clean/busy.
- July 19, 2005
Corrected an overflow condition that causes non-Manhattan geometry to disappear at far-out scales on large layouts. Because the problem was in the primary search routines, this fix probably applies to more than just the layout rendering. Thanks to Mike Godfrey for the bug report. Also: Corrected another overflow problem at close-in scales, reported by Mark Martin. This problem only affected layout rendering, not the internal database.
- July 24, 2005
Quick fix to a segmentation fault error discovered by Jason Schonberg; when a netlist window is closed from the window manager, the next call to "setpoint" is passed a NULL magWindow pointer.
- August 12, 2005
Added options to the "flatten" command: "-nolabels" to avoid copying labels, "-nosubcircuit", and "-novendor" to avoid flattening certain types of subcells. Modified the "def write" command to correct several errors, including a few fatal ones.
- August 14, 2005
One more serious correction to the "def write" command, an error in the algorithm that generates the wrong coordinate at the beginning of a line (overshoots the position by one endcap length). Also corrected several integer overflow problems with GDS read-in of non-Manhattan geometry. Thanks to Mike Godfrey for providing examples.
- August 15, 2005
Corrected a problem with display refreshes when an obscuring window is present, also reported by Mike Godfrey. Also corrected a problem with input redirection (":" command) being ignored while DRC is running, and a serious error caused by revision 94 changes in which all sorts of things get screwed up due to a change in the interpretation of the expansion mask (i.e., revisions 94 and 95 are essentially unusable).
- August 15, 2005
Additions and corrections to the LEF and DEF reading and writing code. The tech file format has been extended from the simple "layer" and "obs" keywords to include the class-defining keywords "masterslice", "routing", "cut", and "overlap", defining the LEF types of the same names. The syntax is the same, and "layer" is retained for backwards compatibility ("layer" indicates either "routing" or "cut", depending on the magic type). LEF-format output now includes layer information, and macro pins define port geometry (which was a potentially fatal bug as previously coded).
- August 16, 2005
Some minor code corrections. Corrected a problem where coordinate position updates could produce a Tcl error due to some race condition with the Tk window becoming valid. Also corrected the problem with the crosshair failing to erase itself after loading a new cell.
- August 20, 2005
Important corrections to the LEF/DEF reading and writing. Doing "def write" more than once now produces the same output each time. Extensions on special nets now zero by default. Via cut arrays now written out with "def write". Other changes and corrections.
- September 16, 2005
Addition of GDS techfile extentions: 1) Use of the word "angstroms" in addition to "nanometers" in the scalefactor line, and 2) The phrase "units angstroms", which sets the fundamental GDS database unit to 1 angstrom rather than 1 nanometer. This becomes increasingly necessary for processes like 90 or 65 nanometers where a quarter or half lambda is, e.g., 2.5 nanometers, where the 0.5 part requires dimensions in angstroms.
- September 16, 2005
Changed the "gds readonly" method so that it ignores the structure header and structure name for the specified input cell. Then, if the magic cell is renamed, the GDS cell gets renamed accordingly. This is necessary for the intended use of the method to handle Cadence pcells, since Cadence will write the same structure name in different GDS files.
Also: Changed the "writeall" command to take the syntax "writeall force cell1 cell2 ...". This forces only the named cells to be written to disk, and skips all other cells.
- September 20, 2005
Fixed an error that prevented execution of the command option "select top cell".
- September 27, 2005
Corrected an error with an uninitialized tiletype mask that would produce garbage output for "def write" on some machines. Also, made "-w" (GUI wrapper) the default on startup, with "-nowrapper" ("-now" for short) required to get the non-GUI version.
- September 28, 2005
Added a useful new command "contact type" that generates a contact at the intersection of the two residue types of the contact.
Also: Modified some code to avoid calculating DRC for cases like "erase label" where paint is not modified, and an incorrect case where clearing the selection cell would trigger a DRC check.
Also: Corrected DEF file input to compute subcell bounding boxes before attempting to place components. Otherwise, components not located at the origin get offset in position.
- September 30, 2005
Bug fixes: Commands "move", "stretch", and "copy" now use lambda, rather than internal, units by default when a direction is specified but not a distance (e.g., "move left", which implies "move left 1").
Also: Correction to DEF file reads to avoid segmentation faults when a cell is not defined, and correction to DEF file writes to avoid writing route layer as "space" when the first tile encountered is a contact type.
- October 2, 2005
Finally got around to ensuring correct extraction of non-Manhattan devices (transistors, capacitors, resistors). However, there remain two problems: 1) Any device made of all split tiles can result in a completely screwed up .ext file (which seems unlikely but could happen in the case of a device drawn at a 45 degree angle), and 2) capacitors that are not modeled will have an incorrect parasitic capacitance from the node to ground. Modeled devices will (presumably) model the capacitance from the bottom plate to the substrate node, but unmodeled devices need to have the device type (top plate) area added to the area of the bottom plate type when computing parasitic (or coupling) capacitance.
- October 14, 2005
Changed behavior of the DEF writing routine to handle overlapping stacked via types more-or-less correctly. The algorithm now works properly but assumes retangular areas for the vias. The whole thing needs to be rewritten to make use of the GDS output routines.
- October 26, 2005
Corrected an error in the extraction routine from revision 106 that results in incorrect plane numbers and can cause magic to crash on the "getnode" command. Also added non-Manhattan geometry handling to the "getnode" routines (the lack of which can also cause a crash on the "getnode" command).
- November 21, 2005
Corrected "extresis" to work with the stacked contact method. Thanks to Vijaya Kirti for pointing out this problem and providing an example layout.
- November 22, 2005
Added an extension to "feedback add". If the command is followed by any number of points (X Y pairs), the feedback entry will be a polygon formed by the point pairs. Argument "style" must be given in this case. As special cases, a point or a line will always use style "outline" regardless of the style argument. Both non-manhattan geometry and non-integer internal units (such as nanometer units) are handled properly.
Also: extended "feedback clear" to include "feedback clear
", which will clear all feedback entries containing a specific text substring. This allows, for example, the use of "feed clear CCA" to implement, in effect, the opposite of "cif see CCA".
Also: corrected "wire segment" so that centerline point pairs given in non-lambda units are parsed correctly.
- November 23, 2005
Revised "feedback add" to accept argument "style" as always optional, and to accept all styles from the ".dstyle" file as valid feedback styles. Also tweaked some constants (INFINITY and FEEDMAGNIFY) to keep feedback entries in nanometers (e.g., DRC errors parsed from Calibre output) from overflowing integer bounds. Also modified the feedback code to optimize both memory and computation time, especially for long lists of feedback entries.
Also: extended the "gds polygon subcells" option to include GDS wire path structures.
- November 25, 2005
Upon the revelation of Malvin Wong that magic starts behaving badly when more than 32 planes are defined, I changed the use of "int" for plane masks to a typedef'd "PlaneMask" type, which is set to "dlong" (double long, 64 bits) when MAXPLANES is > 32.
Also: fixed an error from revision 111, and changed "cif see" behavior to use styles from "render" lines in the tech "cifoutput" section, if defined (otherwise, behavior is as it has always been). Allows one to see mutiple cif layers with "cif see".
- November 30, 2005
Corrected the inevitable errors with the changes of revision 112; thanks once again to Malvin Wong for bug reporting and providing test cases.
- November 30, 2005
Added a very important fix to the CIF/GDS output routine. Previously, magic would report a warning when arrayed subcells were small and closely spaced to the effect that output might be incorrect. The array interaction routine has been modified so that this cannot happen. Array interactions are made faster than simple subcell interactions by computing the interactions only between the first two cells in the array, then copying the paint to the end of the array. An error in CIF/GDS output occurs when the area of expansion needed to check for all interactions between the first two cells is larger than the cell width or height itself, so that paint can be generated for interactions between the 2nd and 3rd (or higher) cells in the array. When this is copied up to the end, some of the paint can end up well above the array. The solution is to reduce the array to at most 2x2, compute the interaction, restore the array size, and then copy the interaction area.
- December 1, 2005
Added separate executable "magicdnull", similar to "magicexec" except that it does not invoke the Tk package (links to Tcl_Main() instead of Tk_Main()). This allows magic to run faster/more efficiently in batch mode when called with "magic -noc -dnull". Also: Changed behavior of command "windownames" so that 1) it is available in the non-Tcl version, and 2) it returns a list of window IDs when the graphics package does not define a routine to provide a window name. This ID can be used by the "setpoint" command to access a specific window (i.e., internal window structure) when using NULL graphics.
Also: Included a fix for a problem reported by Eric Wong (thanks for the test case) in which magic hangs when searching for connectivity on a network passing through a stacked contact that is split between overlapping cells.
- December 7, 2005
Revised the method magic uses for crash backups. Previously, magic would write ".save.mag" files for modified, unsaved cells upon the limited condition of receiving a SIGTERM signal. I have modified this so that magic 1) saves all cells into a single file in the /tmp directory, 2) saves and recovers such files in response to a (new) command "crash save" or "crash recover", and 3) automatically recovers the most recent crash file found when invoked on the command line as "magic -r". It also retains the behavior of writing a backup file upon receiving SIGTERM. The Tcl/Tk version contains a script which uses the sytem timer to generate a backup file every 10 minutes by default, or every $Ops(backupinterval) milliseconds. Backup files are removed upon normal execution of "quit" but are retained under all other exit conditions. Backup files are also removed after successful recovery. The implementation is very similar to what I implemented for xcircuit.
Also: Made one minor change to fix the non-Tcl compile, and checked the non-Tcl compilation for correctness.
- December 13, 2005
Corrected a bad error with the CIF array generation function in 114 due to a typo in the code. The array generation code still needs to be checked rigorously for correct operation.
- January 8, 2006
Corrected an error in drawing non-Manhattan feedback areas, which clipped the tile area incorrectly, causing the diagonal to be drawn at the wrong angle.
- January 20, 2006
Re-implemented file locking for about the fifth or sixth time. Uses Stefan Jones' implementation with fcntl() calls to generate advisory locks (works with NFS-mounted files). Because this version of file locking doesn't create extra files and directories, I have set the file-locking behavior to be compiled in by default.
Also: Corrected the crash backup mechanism so that "magic -r" ignores any backup files belonging to an active process.
Also: Corrected the configure script, which since revision 113 may refuse to compile in X11 on systems which have a linker that automatically links X11 with no special compiler flags. Thanks to Alan Davis for bringing this bug to my attention.
- January 24, 2006
A few changes to the CIF file read routines to allow magic to read the "CIF torture test" without crashing (it does not pass with flying colors, but most of it is correct).
- January 25, 2006
Finished basic changes needed to make magic pass the "CIF torture test" except for certain current impossibilities such as non-90-degree rotated cells. I won't reveal what horrible hack I did to make the "famous DD bug" go away---fortunately no program ever writes a "DD" record, so I'll probably get away with it (after all, nobody complained that magic didn't handle the DD record for 20 years, so who's going to complain that it is not handled precisely according to spec now?).
Also: For Fedora Core 4 compliance (mostly to work around problems with gcc), I have changed the "make depend" process to list only local header file dependencies. Also I have modified the top-level configure script (which calls the real configure script) to set the CFLAGS variable without the optimization flag. Thanks to Michael Godfrey for help with the FC4 compilation issues. No thanks to the developers of gcc, who haven't produced a decent version of the compiler since 2.95.
- January 29, 2006
Corrected an error with the CIF/GDS array interaction generation code changed in revision 117. If there are no interactions, the routine can exit before restoring the array bounds, causing arrays to be reduced to two elements in the layout. . . an unexpected and unwanted change! Thanks to Eric Liu Wong for reporting this error and sending a test case.
- February 9, 2006
Tracked down a subtle bug in which non-Manhattan tiles caused the paint routine to violate the "maximum horizontal stripes" rule, leading to a possible infinite loop when writing CIF/GDS output (corrupting the tile plane database and potentially producing hangs and/or crashes on any number of tile manipulation functions.
Also: Changes from Philippe Pouliquen to prevent problems with the graphics backing store mechanism in conjunction with 8-bit mode, and other changes to ensure proper compilation under NetBSD.
Note: This revision was originally posted on February 8, but one typo was found in the code, fixed, and the distribution re-posted.
- Contact Image method
Contacts in the technology file are no longer subject to the restrictions outlined in the current maintainer's manual. Contacts may connect any number of planes. The "home plane" of the contact is irrelevant, as long as it has one. Internally, magic no longer creates derived types for each "image" of each contact type on every plane connected. This relieves a lot of the problems associated with overrunning the built-in layer limit in magic for technologies with a lot of metal layers.
The paint and erase tables have also been revised and better reflect the nature of contacts as existing "between" planes. Important note (see release noted for Revision 29, above): One result of the change is that it is no longer possible to stack contacts that share one or more planes unless those contacts have been declared to be stacking. It was possible to stack contacts this way under magic-7.2 and earlier versions, although it violates the database structure and so should probably not be trusted. To ensure that layouts of this type read correctly into magic-7.3, the conversion program (see the download table) should be applied to the original technology file to create an equivalent technology file with stackable contacts, and the layout viewed with the new technology file.
The restriction that no two contact types may have the same residues has also been lifted (as of revision 25). It is now legal to define, for example, types "via" and "via_cut" as both connecting metal1 to metal2, but have them treated differently by the design rule checker and by the CIF/GDS I/O handler.
- Stacked Contact method
To alleviate the necessity of defining separate contact types for every combination of stacked contacts, magic 7.3 allows contacts to be directly stacked on each other. This is no small feat. Under this method, contacts need to only be defined as connecting two layer types. This method is completely backwardly-compatible with the original defined stacked-contact types (e.g., pm12contact or m123contact). However, it is preferred to explicitly define only contacts connecting two neighboring planes, and define all the combinations as "stackable" types, rather than to define various combinations of contacts as separate contact types.
The method has been tested on most sections of the magic code but may still break certain functions. Revision 4 corrects some of the weirdnesses with the stretch command. These weirdnesses were actually unresolvable in prior magic versions. Now, if a selection area passes between two contacts, and one contact is stretched away from the other, neither contact is resized, but the area between is filled with the residues common to both contacts. Revision 27 removed a few more problems with the selection operations such as stretch, and revision 29 has resolved (hopefully) all of the remaining problems with the paint and erase tables, especially for handling the stacking type name aliases for reading layout files drawn using an older technology file without stacking types.
Revision 1 of magic 7.3 requires the use of the keyword "stackable" to generate stackable contacts. This allows complete backwards compatibility (not counting bugs!) with versions 7.2 and earlier, and does not generate stacked contact types where they were not intended. New technology files are not required to use the stacked contact methods, but should do so simply because it's easier, more compact, and backwardly compatible. And it's the Right Thing To Do! The new syntax for the "contact" section of the techfile is:stackable type1 type2 [type3 ...]The first style allows contact type type1 to stack with one or more other contact types, as listed on the remainder of the line with a space-separated list of contact types.
stackable type1 type2 [alias12] [type3 [alias13] ...]
The second style is similar, but allows one or more aliases to be defined for each stacking type. These aliases take precedence over the default name generated internally by magic for the stacking type (which is to add a "+" between the short names for the two types, such as "pc+v"), and are used to facilitate compatibility with layouts generated using the explicitly-defined stacked types. Thus, the line "stackable pc via pm12contact,pm12c" will allow poly contact and via to stack, and will also tell magic to accept the layer name "pm12c" as equivalent to a combination of poly contact and via. Layout (.mag) files containing layer "pm12contact" will be handled appropriately, as will commands "paint pm12c" and "erase pm12c".
The third style will generate stacked contacts between type1 and all other contact types currently defined with which stacking is possible.
The fourth style will generate all possible stacking types between pairs of contacts already defined.
Normally, one would define all contacts first and use the "stackable" definitions at the end of the "contact" section. It is illegal to use a contact type name in a "stackable" definition that has not been previously defined in the "contact" section. One common situation where you would want a contact line after "stackable" is for the pad, as one normally does not allow the pad layer to be stacked with any other contact types. Regarding the pad, note that magic 7.3 eliminates the need to define pad on a couple of metal planes plus an extra plane for passivation to avoid confusing it with stacked vias. One simply defines pad as the collection of all metal layers it contains. A plane for "oxide" or "passivation" is not necessary, and generally not useful.
- General Image method
There are now composite layers in addition to contacts. These layers represent (primarily) devices such as FETs and capacitors. The idea behind composite layers (which I attribute to Philippe Pouliquen) is that certain devices should have images on multiple planes, like contacts do, but do not necessarily contact the planes. Using composite types, it is possible to separate the poly, poly2, and active planes. For example, "nfet" can be a composite type on planes active and poly, with residue types ndiffusion and polysilicon. As of magic version 7.3.21, this is not completely implemented. It is possible to define composite images in the "contact" section (which can also be called the "image" section, as being more appropriate for the general image method), using the keyword "device" or "contact" followed by the normal syntax for a contact. If the keyword is missing, "contact" is assumed, for backwards compatibility. The method, however, needs to keep track of device layers separately from contact layers; this lack of information currently leads to the inability to properly specify DRC rules for composite layers.
- General Macro method
Starting with revision 60, mouse buttons are treated like keys for the purpose of defining macros. That means there are no longer internal button handlers in magic, and button functions may be bound to any magic command, Tcl procedure, or combination of both. To facilitate this, several commands have been extended to incorporate the functions traditionally performed by button presses. In particular, the "cursor" keyword has been added to the "box" command to allow the box to be moved relative to the X11 pointer position, and the option box corner has been added to allow the box corner resizing. The button-release event is no longer supported, and the ungainly mixed-button pushing functions for manipulating the cursor box have been replaced by a somewhat more usable Shift-key-plus-button method.
Unlike earlier versions, macros are now defined as hash tables, and each window type (layout, color, netlist, wind3d) maintains its own set of macros. The "tool" command is now a script, as with this binding method, the action of the tool command is to change the button bindings in the layout windows.
As of revision 80, there is a new MacroSubstitute command that allows the graphics package to make substitutions for predefined escape sequences in the macro string. The intention is to follow the usual Tk syntax using the percent ("%") symbol to denote sequences. One such substitution has been added in revision 80, which is "%W" to indicate the drawing window reporting the key event that triggered the macro call.
- Interactive graphics
Developed largely between revisions 75 and 80, the implementation of graphics backing store overcomes pretty much all of the limitations of the 24-bit and OpenGL graphics compared to the original 8-bit pseudocolor model. This is not to be confused with the X11 backing store---magic's backing store is specifically implemented to cache the layout drawing separately from the "highlights" (box, selections, feedback), and use fast copying from backing store to erase the highlights. In addition, scrolling the layout is made faster by copying part of the backing store from one screen location to another, and redrawing only the remaining parts.
Because backing store allows the highlights to be erased and redrawn in "real time", interactive graphics are suddenly feasible. Between revisions 75 and 82, I added three interactive graphics features. These are:
- pick tool
- The first new tool in magic in decades. This tool connects the new select command options to button and pointer motion events, allowing drag-and-drop style manipulation of paint, labels, and cells.
- wire tool
- The wire tool was always cumbersome, mostly due to the inability to predict precisely where magic would put the next wire route. The new, improved wire tool adds the single important feature of tracking the next wire route using the selection box, and updating based on pointer motion.
- A crosshair cursor is extremely useful for checking vertical and horizontal alignment. Previously, it could not be implemented due to the slow refresh rate on highlights. Now it works like a good crosshair ought to. The Tcl/Tk GUI wrapper connects the crosshair command to pointer motion with a simple Options menu checkbox.
Note how readable this file is compared to existing technology files (formats 28 and earlier). This technology file has been stripped down, removing high-voltage devices, metal fill layers, metal resistor layers, and the second polysilicon layer, and defining only one or two styles for CIF/GDS input, output, and extraction. However, with the new style, adding these back in will make the file only marginally less readable.
Caution, caution, caution. This technology file does not correspond to any specific fabrication process. It was created for demonstration and test purposes. To match a specific foundry process, values will need to be tweaked, layers added, etc.
scmos9m.tech is a slight modification of the above file for use with technologies defining nine metal layers. It requires magic 7.3 revision 6 (or newer), which defines the 9th metal layer in the graphics colormap and style files. Note how this file takes advantage of the new techfile enhancements, making the addition of the new top-metal layer trivial.
Most to-do items are the same as for version 7.2, and when any of these items is dealt with, both versions will be updated accordingly. Items in the list below are specific to version 7.3.
Things to do:
- Big thing to do, one day (soon?): Change the way tiles are accessed from an unmanaged linked, um, well, maybe "glob" or "cloud" is the right term, to a list (table) per plane, with some memory manager function handling the efficient addition and removal of tiles. Instead of doubly-linked pointers to the corner stitches, each tile would supply table indices for each of the corner-stitched neighbors. Cells having fewer than 256 tiles could potentially address neighbors with 1 byte each. Potentially, this could save as much as 30 or 40 percent of them memory used for a layout. More critically, though, it would save more like 50 to 70 percent memory in 64-bit architectures. Because the basic tile structure (as written) contains mostly pointers, a move to a 64-bit architecture immediately consumes almost twice as much memory for the same layout. This is incredibly inefficient. Unfortunately, this change represents a lot of work. Most of magic's callback functions (which it uses ubiquitously) see individual tile pointers, so each callback function would need to be revised to take a pointer to the tile list head. But it's doable.
- It is not known how other EDA tools will handle the GDS property/value pairs added to SREF and AREF records to account for information in magic that cannot otherwise be written to GDS and read back again.
Known Bugs to Fix:
- At this time (revision 29), there are no known bugs remaining that are related to the stacked contact method. I will be designing a test chip on magic-7.3 to be submitted for fabrication in September. If all goes well, magic-7.3 will go from ALPHA to BETA status, and eventually make it to distribution status by the end of the year.
- Actually, the above statement is not quite true. The "stretch" command is still not quite correct in determining what types to stretch and which to leave behind. Although it is it not a fatal error, it tends to be an annoyance.
Note for AMD 64-bit users (January 2006): I had been having awful problems with the 64-bit version that seemed to be unrelated to magic but related instead to the NVidia graphics driver for the AMD 64-bit platform. Apart from magic, the server would crash on a fairly regular basis, and would crash upon exiting magic. I just updated to the version 8178 of the driver, and so far I have not seen any problems. The last buggy version of the driver that I installed was 7174; I don't know which exact version fixed the problem (there were 5 revisions between 7174 and 8178).
There should be no bug fixes between versions 7.2 and 7.3, as for the time being, any required bug fixes will be made to both versions.
As of revisions starting in the mid-twenties or so, the above statement is probably no longer true. This partly reflects the intent to make version 7.3 the main development branch shortly (before the end of 2004).
Last updated: April 4, 2006 at 5:02pm