XCircuit News and Notes of Interest

XCircuit version 3.9 Release Notes

Version 3.9 became the new development version in May 2014, with version 3.8 upgraded to stable. Version 3.9 contains a major change to the graphics, developed by Erik van der Wal, using the Cairo graphics libraries.

The Cairo graphics gives XCircuit a truly WYSIWIG interface, where fonts are rendered by the font engine from the same PostScript outline fonts used in the output, and lines and polygons are antialiased.

As of the first release, the Cairo graphics are not enabled by default and must be compiled in by selecting "--with-cairo" when running the configuration script. The first release is also on the slow side, needing some changes to the underlying database to prevent having to redraw the whole screen on any event. This is in the early development stage, so please bear that in mind.

XCircuit version 3.8 Release Notes

Version 3.8 became the new development version in April 2011, while version 3.7 was upgraded to stable. Version 3.8 is currently unchanged from the last revision of 3.7. The plan is to recast all parameterizable values as structures that may point to a parameter, much like is done currently with text segments. This allows numerical parameters to be computed on the fly like text parameters, rather than being applied in bulk prior to entering the context of an object instance. The two types of existing parameters (object parameters, or "ops", and element parameters, or "eps") will be consolidated into one. The main reason for doing this is to be able to implement an edit lock-out of non-parameterized values, so that objects can be designed that are read-only and allow only instanced parameters to be modified.

XCircuit version 3.7 Release Notes

Version 3.7 became the new development version in November 2009, while version 3.6 was upgraded to stable. The first major change to the code in quite some time, version 3.7 has a modified selection mechanism that considers both points and segments of elements as well as entire elements. This allows the "edit" function to work as a stretch function to many elements at once.

November 2010: Added linewidth invariance on objects. Object instances (such as circuit symbols) can be made linewidth-invariant, such that an instance of the object can be scaled without changing the linewidth. This allows some circuit symbols to be resized relative to others on the same schematic without a discontinuity in wire width at the pins.

April 2011: A number of useful additions, including: (1) Tracking spline control points for adjoining splines in paths, (2) Clipmasks (shapes can be used to clip the view of other elements), (3) polygon-to-curve conversion routine, (4) undo/redo on raise/lower elements, (5) single-step raise and lower elements, (6) gradient field generator---color graded fields are made from graphic image types. Version 3.7 changed to the stable distribution.

XCircuit version 3.6 Release Notes

Version 3.6 replaced version 3.5 due to the considerable changes made to the code base to support multiple schematic layout windows. Revision 8 contains the first working version supporting multiple windows. This required a complete overhaul of the key-function binding routines and the function dispatch mechanism. Several additions and corrections need to be made to make the multiple-window implementation work properly: Certain menu items need to be shared among all windows (like the Library and Page lists), and it needs a close-window routine, and a routine to allow transfers (move and copy functions) between windows.

From revision 45 on, version 3.6 changes the way libraries are handled by making the distinction between library pages and files using the concept of "technology namespaces". Each object has a name composed of a "technology prefix", a double colon ("::"), and the object's name. Each library file declares a technology name, which is used as the prefix for all objects in that file. The prefixes are used by XCircuit to track which objects came from which file, regardless of the library page onto which they were loaded.

From revision 53 on, version 3.6 adds an option where wires connected to symbol pins remain connected while the symbol is moved. It also expands upon the "Attach-to" function, allowing wires to be (semi-) automatically attached to pin labels or symbol pins. The key macro for "attach-to" (key "A") can also be used like the "wire" function (key "w") to start a wire with its start-point attached to a symbol pin or pin label.

XCircuit version 3.5 Release Notes

Version 3.5 was very short-lived. It started out as the development branch after 3.4 was declared the new stable release. Most of the work on this branch involved getting XCircuit to work well with large projects involving deep hierarchies of circuits, with each circuit in a separate file.

XCircuit version 3.4 Release Notes

XCircuit-3.4 is considered the current stable distribution version. Version 3.5 was branched off of this version as the new development branch, and further changes to the 3.4 branch will only reflect necessary bug fixes.

XCircuit-3.4 is a relatively small change from version 3.3, but should be considered likely to have more bugs for a few revisions until most of them get ironed out. However, I have already used version 3.4 for some major drawing projects, and it seems to be stable enough.

The major change between versions 3.3 and 3.4 is the handling of button and key events. Past versions of XCircuit have always used mouse buttons for drawing wires, with the toolbar buttons used to override the wire drawing function of Button 1 for a single event, such as drawing an arc or box, or selecting an element for point editing. In version 3.4, there are multiple "modes", each of which represents a particular binding for mouse Button 1. "Wire mode" is the default and works exactly like XCircuit always has. The other toolbar buttons, though, now represent alternative Button 1 bindings, which are persistent, rather than being a way to override the default binding for a single action.

In addition to the difference in operation of toolbar buttons, there are several new toolbar buttons previously not in the xcircuit window: The Wire tool (previously just the default behavior), the Pan tool, and the Move tool.

Keys and buttons are both handled in exactly the same way, and all functions can be bound to either mouse or button events. The "press vs. tap" method that previously prevented buttons from being treated similarly to keys has been generalized as a modifier "Hold_" for press actions (either keys or buttons).

"Cancel" events were previously assigned to Button-3 and behaved differently in different circumstances. For example, when drawing a wire, "cancel" would cancel the last drawn segment, but for an arc, would abort the arc generation and revert back to "normal" mode. In version 3.4, "cancel" events are divided between segment or step cancelations ("Cancel") and element cancelation ("Abort"). Button-3 behaves as before, except that arcs and splines also do stepwise cancelations. The Escape key invokes the "Abort" function.

For users with 2-button mice, xcircuit can be started with the "-2" option, that moves all Button-2 (middle) button bindings to Button-3 (right), and moves Button-3 bindings to the BackSpace key. An alternative use is to retain the 3-button bindings and use "Shift-Button-1" as a replacement for the middle mouse button. This binding was supposed to have been supported in previous versions, but was broken until recently.

The graphic image type has been modified to use Flate encoding/decoding when saving to or loading from the PostScript output file. This saves significant space in the output for large images. Note that some printers don't handle the "reusable stream decode" function (I have a Xerox color wax-process printer that claims to run out of memory even with images less than 1MB). I've been able to work around such problems by transforming these files to PDF (using ps2pdf) and then printing from inside acroread. The transformation removes all the reusable stream decodes. The drawback is that when a single large graphic is used multiple times, it will be written multiple times into the PDF file. The purpose of using reusable stream decodes was to avoid this situation, and this is still a good thing as long as the limitation of certain printers is understood.

XCircuit version 3.3 Release Notes

XCircuit-3.3 was the previous stable, official release version. The last revision was 3.3.38. Revision 21 incorporates a new basic element type, the graphic element. This allows arbitrary graphic images to be incorporated into a drawing and independently scaled, positioned, and rotated. Previously, only one PostScript graphic could be incorporated, as a background image. The new element type is much more flexible. At the moment, however, it only handles color PPM (portable pixmap) format files. It is intended that this replace the background image feature.

Other current work-in-progress includes the integration of automatic schematic capture (ASG) with Stephen Frezza of Gannon University. This should keep us occupied for a while. The Automatic Schematic Capture (ASG) is currently disabled by default until it becomes stable enough to be considered usable. The first function to be added is an hspice parser that reads hspice files and generates schematics from the netlist. Future work includes automatically rerouting in response to moving objects around on the screen, and reading Verilog netlists. The ASG module can be enabled by specifying "--enable-asg" at configuration time. The ASG package is incorporated into revision 3.2.7 and later. XCircuit version 3.3 changed from the original C++ SPICE parser to a simpler but more stable parser by Conrad Ziesler.

Revision 7 changes the way selections are handled, getting rid of the cumbersome and oddball "click to accept/reject" method. The new method makes use of the recursive selection routine developed for selecting networks anywhere in the (visible) hierarchy of a schematic. This allows limiting selection of object instances to avoid selecting where the object instance has large amounts of whitespace, such as a border or frame object. Consequently, ambiguity about what element was intended to be selected occurs less often. The new method selects exactly one element on a button-1 press or button-2 click. If this is not the intended element to select, just select again and XCircuit will cycle to the next element found near the pointer.

Note: Those who downloaded revisions 7 or 8 will almost certainly want to update to revision 9. The new selection mechanism was introduced in revision 7 and fixed for bugs in revision 8. However, in spite of the better underlying code, the algorithm ended up, if anything, even more cumbersome than the original. Quite a bit of optimization of the selection heuristics went into revision 9. In particular, XCircuit is now better at picking the "intended" element. Also, pointer warps to line endpoints are reverted back to the original position on a cancelation, and element edits can be undone with the "undo" command (an important part of the undo mechanism that I left uncoded for much too long).

XCircuit version 3.2 Release Notes

XCircuit has been vacationing on the shores of Lake Erie for the summer of 2003 while I have been busy working on the Magic VLSI layout program and other tools. Professor Stephen Frezza and his students at Gannon University have been incorporating automatic schematic generation (ASG) into XCircuit. ASG allows XCircuit to read a netlist file such as SPICE or (hopefully in the near future) EDIF, and create from it a schematic drawing. As part of the ASG system, the netlist code in XCircuit will be rewritten to allow networks to be tracked by the ASG system, which will reroute wires to maintain the networks as objects are moved around (to be incorporated in a future release). The first distributed revision of version 3.2 should be posted around the end of August.

Revision numbers start with 5 due to some early work last year which went through four revisions. Revision 8 reworks the PostScript background image generator to operate entirely in the background, and to handle full-page output from ghostview. It should be noted that a combination of programs pdf2ps, gv (for creating single pages from a multi-page document, or psselect also works), and xcircuit allows one to fill in PDF forms without using Acrobat.

As of revision 5, the undo/redo function duplicates the prior "delete" and "undelete" functions, and therefore behaves more or less like it has, except for the ability to re-do deletes. Functions will be added to the undo/redo code in order of importance (selections, moves, copies, element creation, and so forth) until it incorporates essentially everything. Revision 9 expands the undo/redo mechanism to encompass most of the major xcircuit functions. However, the list is not quite complete, missing a few things such as the ability to undo label creation, and the ability to remember exact point locations for undoing rotations (which also prevents the implementation of an undo method for the "snap-to" function).

Revision 11 has a script in lib/tcl that can be sourced to allow xcircuit schematics to be turned into preliminary PCB layouts for the "pcb" program (see "pcb" on SourceForge). This will be expanded in the future, as it is currently very limited (it only really understands 7400-series DIP packages). The main limitation of the script ("pcbout.tcl") is that it needs translations from xcircuit library object names to pcb part names and package names. This is very easy to expand, but I have only started on it. Currently, correct operation is only ensured when using the "diplib" libraries found on the XCircuit "Libraries" web page.

Since around revision 13, XCircuit version 3.2 appears to be quite stable, apart from the ASG stuff, so I am moving it from "pre-release" status to the current release.

Revision 14 adds a "library manager" in the TCL version, an oft-requested feature for XCircuit. Previously, to get objects from a file like the "diplib" series, it was necessary to read in the entire file. This is why the "diplib" series was broken up into a number of different files. The library manager allows objects to be imported as needed from a library file to create a personalized library of manageable size within XCircuit.

Revision 19 (note that revisions 17 and 18 were never posted) adds bus notation handling. The file "buses.ps" in the "examples" subdirectory of the source distribution gives a good example of how buses are handled by xcircuit. This is a very liberal method for dealing with buses. The normal way to create a bus is to use the new tap object, and edit the (parameterized) labels on the two ends of the tap to match the bus subnets. Buses do not otherwise need to be explicitly labeled or called out; however, buses which are labeled using the notation

do not need taps, and can actually be directly connected together. The schematic capture tutorial will be updated to include a section on buses and taps.

Up-to-date revision information is kept in the file CHANGES in the top-level directory of the source distribution.

XCircuit version 3.1 Release Notes

While version 3.1 does not configure the Tcl interface by default, the Tcl version has the greatest amount of command-line control, and can be run exclusively from the command line (e.g., from a script). Therefore, it is strongly suggested that you configure using the switch "--with-tcl" and compile with "make tcl" as noted in the compilation instructions.

Recent revisions (25 through 35, as of this writing) have concentrated on converting parameters to a key:value pair format and expanding the functionality of parameters to include type promotion between strings and numbers, indirectly-referenced parameters, and parameters as Tcl expressions. The use of Tcl expressions as parameters is especially powerful. See the schematic capture tutorial for details on using the new parameter features (in particular, look at Task 7).

From Revision 10, XCircuit has been made an official part of the EDA environment including Magic, IRSIM, Netgen, and Tclspice. Revision 10 addresses interoperability among these applications, including use of XCircuit in conjunction with Magic for Layout-vs.-Schematic (LVS) verification. A Magic tutorial on using XCircuit, Magic, and Netgen together for LVS is in the works. Note that this EDA environment requires that all applications be compiled with Tcl/Tk.

From this point, the embedded Python interpreter interface will not be further developed, except for essential bug fixes and such. It will continue to be possible to compile the embedded Python interpreter instead of the Tcl interpreter extension, but this may be phased out eventually, depending on demand. The new changes should make all the people happy who have had problems with the (admittedly outdated) graphics interface and complain that it needs a more "modern" GUI. The default GUI setup under Tcl has been designed to be nearly identical to the original xcircuit "look and feel". However, this "look and feel" is now entirely under script control (file "wrapper.tcl"). With the GUI completely instantiated inside a script, I can keep my GUI, and you can make yours look like whatever you want it to. Hack away. New in version 3.1: The Tcl interpreter interface is complete. Features of the Tcl version are written up on a separate web page. As of revision 3 (February 10, 2003), the Tcl interface appears to be stable and duplicates all of the features available under the last non-Tcl-based version.

Also: The default install directory has been moved from /usr/local/share back to /usr/local/lib.

Revision 25 implements a significant change in the parameterization code. Parameters are stored as key:value pairs, and parameters in an object instance may be changed without having to edit the object (at least, this can be done in the Tcl-based version). The method allows parameters to be passed down through multiple levels of the object hierarchy (implemented in revision 27, although not complete). Revsion 26 adds the simple method of keystroke "Ctrl-p" when selecting an object instance to inspect and modify all parameters of the instance.

Past releases (also see the CHANGES file in the source distribution)

New in version 2.5.3: Circuit netlists are retained until validated, so queries on the netlist do not require complete netlist regeneration.

New in version 2.5.2: Added support for displaying multiple instances of an object, with different parameters, on the same library page. This lets xcircuit conveniently handle multiple gates in a single package, such as 7400-series chips, for purposes of PCB netlisting.

New in version 2.5.1: Added support for numerical parameters. The object comparison routines have been cleaned up to prevent propagating appended underscores (a real bugaboo), and the XCircuit copyright has been recast to GPL (it's about time).

New in version 2.4.0: Should be mostly transparent to the end user. Fine rotations of +/- 1 degree are allowed; the behavior of some menu options (delete, unselect, copy, edit rotate) was changed to be consistent with others. Other internal changes should hopefully (?) overcome problems with unreadable X resources and timeout conflicts with the X server.

New in version 2.3.6: Filename filtering in the file list window. Flag added to pin label properties to allow a pin label to be seen outside of the object. "Edit-in-place" capability added (shows objects in the hierarchy above the edit object).

New in version 2.3.5: Some bug fixes to the netlist code, and more extensions of the Python interpreter interface. Improved handling of backup (crash) files, including saving a backup after x number of changes as well as after a lengthy (10-minute) timeout, saving library object changes in the crash file, and recovering separate multiple-page files without destroying the original file and page names. Added a method to track unsaved changes and prompt before exit.

New in version 2.3.4: Autoconf rewritten for Mac OS/X (Darwin) compile. Netlist output from xcircuit directly into Python is possible, but Python scripts to interpret the mess that comes out are not finished. Revision 2 fixed some errors with drawing modes introduced by the expanded key binding functionality, and improves the crash file mechanism (in particular, so that it is impossible to load a non-crash file when prompted for recovery, and the temporary file name is replaced by the original file name).

The change from 2.3.3 to 2.3.5 reflects a number of bug fixes and a slew of enhancements. Most of the enhancements are extensions of the Python interface, although the significant enhancement which prompted the change to subversion 2.3.5 was the handling of temporary files and checking for unsaved changes before exiting.

XCircuit 2.3.3
The embedded Python interpreter has been causing numerous problems. All the errors trace back to Python version 1.5, which (unfortunately) comes installed on certain operating systems such as RedHat 7.1 (and others). Version 1.5 has a known bug causing a segmentation fault when executing the routine convertenviron() in source Modules/posixmodule.c line 302 (in source version 1.5.2). The bug is outlined in the python bugs list. Revision 14 of xcircuit 2.3.3 avoids the problem by refusing to use the embedded interpreter if it claims to be version 1.5. The solution is to update Python; if you're wary of replacing the version your OS depends on, it can be compiled in a separate directory, and xcircuit can be linked to that version by giving the switch "--with-python=DIR" to the "configure" script, substituting the proper directory for "DIR".

Changes from 2.3.2 to 2.3.3 include corrections to netlist compilation in PCB format. In addition, the library parts list has been updated to a style which facilitates PCB netlisting for board-level components such as resistors, capacitors, inductors, and such. The syntax for "info labels" has been expanded to include parameters with default string "?" being parsed as equivalent to "%i". Device index numbers generated by "%i" are now numbered relative to the component type, not simply incremented for each component found in the object.

A major change is the switch from "imake" to GNU "automake" for the compile sequence. Autoconf is good for dealing with system-dependent things. The use of ghostscript as a rendering engine, the use of XPM (which is not standard on many systems), and the use of Python (which goes through changes about as rapidly as xcircuit, so it keeps changing versions) means that what once used to be a simple "xmkmf; make" process now requires significant amounts of staring at the Imakefile and figuring out just what exactly is on your system. The GNU make requires the alternate sequence of "./configure; make" which is supposed to find things like Python and XPM on the system and build the Makefile accordingly. It may take a few versions to get the details ironed out; meanwhile, the Imakefile is still in the distribution as a backup.

The change from minor version 2 to minor version 3 was prompted by a change in the output syntax for labels in conjunction with changes mentioned below. Problems arising from compatibility issues between 2.3 and earlier versions were ironed out between the original 2.3 release and 2.3.2.

The netlisting routines have been thoroughly overhauled and tested against "torture test" schematics. Most changes in this version are structural (that is, transparent to the end-user), but some changes to the way labels are done will be noticeable, including the addition of tab stops and tab forward/backward, the timely demise of the embedded backspace character (effectively rendered obsolete by the use of backward-tabbing), and better reporting of embedded non-printable characters when editing a label string.

The switch to linked-lists for internally describing the structure of label strings should make versions since 2.2.3 compile on some systems (most notably recent versions of RedHat) which parse pointer arithmetic strangely and caused crashes when dealing with parameterized objects in earlier versions. More testing in conjunction with the tutorial section on schematic capture and PCB led to bug fixes in code dealing with parameters. Current version 2.3.2 is probably fairly close to a new stable release.

New in 2.2.1 and 2.2.2 are assignable key and mouse button bindings. The command-line scripting language functions "bind" and "unbind" (available both in Python and the original xcircuit scripting language) allow complete reassignment of key and button macros, so users can maintain some level of compatibility with other commonly-used CAD tools.

There is a new release for March 28, 2001 of Xcircuit-2.2.0 fixing several bugs in the code, especially one bad one that would cause a segmentation violation if xcircuit was compiled without "-g" debug option. Thanks to Thanks to Kawamura Masao (kawamura@mlb.co.jp) of Media Lab. Inc., Japan, for tracking down this bug.

Version 2.2.0 is the first distribution in which the schematic capture system is considered stable and (as far as now known) error-free. There have been some changes made between versions 2.1 and 2.2, so those users who have not updated should do so. Some of the newer features have been exercised only marginally, and the adventurous are forewarned to use caution and save often.

In addition to the schematic capture, Xcircuit has a number of new features, foremost among them the capability to pass parameters to objects. Currently, only string parameters can be created/removed/edited, but later I will be adding support for integer parameters (such as the position of points and lines, or the position/rotation/justification of text).

Because the schematic capture system is somewhat more difficult to use than the drawing part of the program, there is a second tutorial, the Schematic Capture Tutorial. This teaches the basics of SPICE, sim, and pcb netlist generation: Use of parameterized strings, pin and information labels, schematics vs. symbols, and multi-page files.

Tcl Extended Interpreter

Versions 3.0 and 3.1 started implementing xcircuit as an extension of the Tcl interpreter language. Unlike the Python version (see below), the interpreter is not linked to the xcircuit executable; instead, xcircuit is linked to the Tcl executable. This greatly circumvents compatibility problems which arise when using an embedded interpreter. Another major difference is that the entire xcircuit GUI is generated using Tk widgets. This circumvents a handful of problems associated with the Xw widget interface, and makes the GUI much more flexible. Finally, the whole extended interpreter system is designed under my "ToolScript" manifesto, and is designed specifically to interface to other EDA tools such as magic, irsim, and netgen, which now can all be compiled as Tcl extensions.

Python Embedded Interpreter

Versions 2.2.1 and 2.2.2 moved toward a heavy reliance on Python as an interpreter. Python replaces the admittedly ad-hoc script "language" which was used with the .xcircuitrc file, and (in version 2.2) the "startup.script" file, and only contained enough functionality to control various aspects of the xcircuit environment on startup. Version 2.2.2 allows access to all xcircuit elements and their properties, and next versions should include access to all page and circuit netlist properties. It is intended that Python scripts will take care of writing netlists, giving more control over formatting the netlist output.

Ghostscript rendering

As of version 2.0b4, Xcircuit has a new powerful feature: the ability to read any arbitrary PostScript file and display it as a background to the xcircuit page, using ``ghostscript'' as a rendering engine. This of course requires that ghostscript be installed on your system, and that the correct path for it is given in the Imakefile at compile time. This is a particularly useful feature for VLSI designers (like me) who want to show photographs of their chips, annotated with names of circuit blocks, cutout views of the fabrication layers, and occasional subcircuit schematics. At the moment, this feature is limited to one background image per page. For small PostScript files, the rendering can be virtually instantaneous. Large images such as scanned photos incur a substantial delay; however, the image is buffered to minimize the number of times the image must be re-rendered.

Version 2.5.3 fixes an unintended ``feature'' of the renderer, so that now changes made in the output dialog box (page scale and orientation) will not alter the position of the xcircuit part of the file relative to the background. Comments made about not changing the output scale from 1.0 no longer apply (January 30, 2002).

Version 3.1 revision 11 fixes another problem that appeared somewhere in one of the 3.0 revisions.

XCircuit on SourceForge

The latest XCircuit development source is available here but is now duplicated on SourceForge, a CVS Repository for the source and downloads. See SourceForge's Web page for details about SourceForge and the services it provides. The xcircuit home page is duplicated at http://xcircuit.sourceforge.net/, though not necessarily up-to-date.

If you are interested in being an xcircuit developer, please contact me, and you can be added to the developer's list on SourceForge.

Currently, the CVS repository is set up on SourceForge, but the web page and download area are still at xcircuit.ece.jhu.edu. This state may remain for a while.

XCircuit Compatibility Status

XCircuit has been compiled successfully under XCircuit should compile out-of-the-box on Linux systems. For all other UNIX versions, check the README file for any platform-specific instructions. With the automake system, running ``configure'' should handle all platform-specific needs.

If you have portability problems (or preferably solutions!) please send me e-mail (see bottom of page for email address).

Notes of Possible Interest

Back to the xcircuit home page. . .


Last updated: August 5, 2016 at 6:55pm