MAGIC Magic Mailing List
 
 

From: R. Timothy Edwards (tim AT stravinsky DOT jhuapl.edu)
Date: Tue Jan 15 2002 - 10:58:29 EST

  • Next message: R. Timothy Edwards: "RPM for magic v7.1"

    Hello everyone,
    
       I've had the opportunity recently to play around a bit with the idea of
    "scriptEDA", which is one of those ideas which is amazingly simple provided
    that the resources exist to make it happen.  In this case, the person to
    recognize that the resources are in place to make possible the integration
    of many or all of our disparate open-source EDA tools is Pinhong Chen at
    UC Berkeley.  If you have not heard of "scriptEDA", I urge you to visit
    his website at http://www-cad.eecs.berkeley.edu/~pinhong/scriptEDA/, and
    read the several papers you can download from there.
    
       The following text is some thoughts I had on an implementation of
    scriptEDA which would include the major open-source EDA tools that I know
    of and/or am involved in the development of.  Please keep in mind that
    this is just a collection of first impressions, and the main thing I would
    like to get out of it, at the moment, is feedback and opinions.  I would
    like to see the open-source EDA movement become an integrated system to
    rival the big EDA companies like Cadence and Mentor Graphics; but it should
    be the Bazaar, not the Cathedral, as Eric Raymond would say, as befits the
    open-source software movement in general.  I think the scriptEDA idea may
    be the right path to take to get there.
    
    						Tim Edwards
    						January 15, 2002
    
    The scriptEDA "manifesto" v0.1
    ---------------------------------------
    
    "ScriptEDA" is a general-purpose method for integrating various CAD
    tools, envisioned by Pinhong Chen, U.C. Berkeley.  The idea is that
    many EDA tools have their own command-line interfaces, often very
    spare, usually with a unique syntax, and rarely offering capability 
    beyond executing internal commands and changing the application's
    internal state.  If all of these programs can be "wrapped" by an
    interface to a well-known interpretive scripting language, then they
    can have both a consistent interface, and a method for sharing data
    with other EDA programs.  The interface generator known as "SWIG" is
    capable of generating wrappers for the major scripting languages,
    including Tcl, Perl, and Python  (I have played around with SWIG,
    and I have found that the "stable" version 1.1p5 chokes up on
    X11-based programs, but that the development version 1.3.10 breezed
    through the entire source of XCircuit, generating a 1MB+ source file
    which compiled (eventually, after I climbed the learning curve) without
    a hitch).
    
    Visit the SWIG website (www.swig.org) for details on the implementation
    of SWIG, but in a nutshell, what SWIG does is to take a standalone
    program and a ".i" file which describes which routines should be
    accessible when called from an interpretive scripting language, and
    writes the bits of C code necessary to interface between the syntax
    of the scripting language and the indicated program subroutines.  The
    program's main() routine is ignored, and the rest of the program
    becomes a shared object (.so) library file, a module for a scripting
    language like Tcl, Perl, or Python.  Instead of being run from a
    shell, the program is run from the scripting language interpreter.
    This does not slow the program down in any way, as the only change
    from the program's standpoint is that its entry point has changed.
    There is some impact on memory usage, as the interpreter itself takes
    memory, and so does the wrapper code.  However, these are what I
    consider to be necessary tradeoffs for suddenly having an easy way
    to integrate all programs which run under the same interpreter.
    The interpreter has direct access to the internal data structures
    of the program through the selected subroutines made visible to it.
    This makes the program extendible through scripts, and provides a
    simple way for programs to share data with one another.  It also
    provides a way for users to access low-level functions in a program
    without messing with the source code.  And finally, it allows users
    to create extensions to a tool in whichever scripting language they
    like best, so they don't have to stumble along, trying to learn
    the vagaries of the syntax of the scripting language that happens
    to be the favorite of the tool's developer (like Python for me, or
    Scheme for Rajit. . .).  Although some of the resulting code will
    probably run much slower than a user would want it to, it's much
    easier and more practical to start with a working script, then
    code the equivalent directly into the source to make it run fast,
    than it is to try to code that function directly into the source
    to begin with (particularly if the script communicates between
    two different tools).
    
    Insofar as many EDA programs are command-line driven, the wrapping
    method is quite simple.  However, a number of critical EDA programs
    are GUI-driven, and may or may not have a command-line interface in
    addition to menu functions and direct GUI input (mouse or keyboard;
    e.g., X11 events).
    
    What I would like to have is a document concerning the implementation
    of all EDA programs, including those without existing command-line
    interfaces, under a "scriptEDA"-type environment.  It need consider
    only open-source programs, that is, those which can be readily modified
    to fit into the scriptEDA system.  Of major significance will be:
    
    	Magic (VLSI layout),
    	PCB (printed circuit board layout),
    	SPICE (analog simulation),
    	rsim (digital simulation),
    	gemini (LVS),
    	xcircuit (schematic capture), and the various components of
    	gEDA (gschem, acs, etc.).
    
    What's written below is not specific enough to be considered an API.  It
    is more of a overview of the things that an API is going to need to consider
    in detail.
    
    The overall intention is to create a system with the following properties:
    
    1) Every component of the system can be run independently (that is, without
       being launched from within the scripting environment), or as part of
       scriptEDA.  At compile time, each program will generate one or more shared
       libraries of its internal subroutines.  The standalone executable will only
       define the main() routine and any routines defining a command-line interface
       which are not used under the scriptEDA system.  Preferably, the shared
       library itself should be divided into several parts, one core part used
       by the standalone version and all of the interpreters, and one shared
       library for each interpreter compiled (Tcl, Perl, Python).
    
    2) In conjunction with part (1), at compile-time, each component will allow
       compilation for any of the interpreters which are declared as part of the
       API, as well as (optionally) compilation of the standalone program.
       Supported interpreters will probably be limited to Tcl, Perl, and Python,
       as the major interpretive scripting languages used today for EDA work.
       Because SWIG is defined independently of all interpreters, compilation
       can be done for any interpreter supported by SWIG, but the "glue" scripts
       which hold the system together will be developed and supported only for
       the major languages defined by the API.  This, of course, can be changed
       at any time, as warranted.  The reasoning behind this flexibility is that
       the long-term existance of any one interpreter cannot be guaranteed, but
       as all of them are capable of the same essential functions, translation
       of scripts between different languages is fairly easy to maintain.
    
    3) Each component (application) is free to be developed with minimal
       constraints as to how it must act within the scriptEDA environment.
       The scriptEDA system may not force the reimplementation of a program's
       GUI or internal data organization.  However, recommendations may be
       made which suggest development directions which enable better
       compatibility with other programs in the scriptEDA system.  An
       application may cede its GUI to the interpreter if requested, but is
       not forced to do so.  The reason that this is not made a requirement
       in the API is that many applications have GUI operations so tightly
       integrated into the program that separating them out would not be
       feasible except maybe as a long-term project (e.g., xcircuit and PCB).
       The degree to which a tool is willing to cede its non-time-critical
       functions to the interpreter will likely have a direct impact on its
       success within the scriptEDA system.
    
    4) The scriptEDA system may not *require* a particular component.  For
       example, both gschem and xcircuit are viable schematic capture
       programs;  a designer may find gschem better for digital and PCB
       design, and may find xcircuit better for analog and VLSI design.
       One tool should be able to appropriately replace the other within
       the scriptEDA system.
    
    -----------------------------------------------------------------------
    Operation
    
    The "top level" of scriptEDA consists of starting the interpreter.  The
    interpreter, in turn, generates a thread for each application program,
    and manages data transfers between all of them.  Creation of threads may
    be from the interpreter command line (e.g., a call to "magic" with
    arguments), or it may run a GUI as part of the master thread (e.g., a
    windowed environment with file load/save dialog boxes and such, and
    perhaps tabs to switch between application windows).  The application
    program might relinquish all of its callback operations to the controlling
    GUI if requested.  The application will want to keep time-critical
    operations to itself.  It will be necessary to have a naming convention
    for calling tools from the (each) interpreter.
    
    Interactive programs will require some method to return to the calling
    interpreter.  Running each application as a separate thread gives a bit
    more flexibility in choosing the communication method between the
    interpreter and the applications.  Programs may communicate data directly.
    The master thread may make calls to query the internal data structure of
    any program at any time.  This means that every application program will
    need to acquire and release mutex locks when altering data which may be
    visible to another thread.  Another method would be to have each
    application program accept a particular signal (interrupt or event such
    as an X11 event) which will cause it to suspend execution until receiving
    another signal, during which time another thread could access its data.
    
    An example of this is provided by a recent demonstration of ng-spice
    inside an interpreter environment.  Rather than run SPICE as a "batch
    job" and require ".print" statements on all nodes to be queried at
    run-time, generating huge output files, the calling interpreter
    simultaneously runs ng-spice and a graphics plotting program.  There
    are several possibilities here.  SPICE can run as usual, with a ".print"
    statement, but with the interpreter redirecting SPICE's stdout to itself,
    reading the output, and passing it as input to the graphics plotting
    program.  Alternatively, SPICE could send one value (time, most likely,
    or just a boolean value handshaking flag) and stall while the interpreter
    reads its data structures directly and passes the information to the
    plotting program.  If speed is of the essence, then a third possibility
    assumes that the plotting program is written specifically to parse SPICE
    output, and the interpreter is then responsible for linking the output
    of SPICE to the input of the plotting program via a pipe, and interrupting
    SPICE whenever a change is needed in the simulation parameters.
    
    To take this one step further, we imagine an example in which we launch
    four application programs:  magic, for VLSI layout; SPICE, for simulation;
    the plotting program, for visualizing the simulation output; and ext2spice,
    which generates SPICE decks from magic layout.  The controlling interpreter
    is running a GUI which has a tab interface, from which we choose "magic" as
    the active input window.  The GUI also has menu, which offers a selection
    "simulation" with items "start", "stop", "reset", "add node", and "remove
    node".  On choosing "reset", the interpreter sends an "extract all" message
    to magic, and then launches "ext2spice", which generates a SPICE deck, which
    is passed to the simulator as input (or, better, ext2spice can be rewritten so
    that it acts as a filter function between magic and SPICE, avoiding any file
    creation at all).  In magic, we select a node using the usual magic selection
    mechanism.  Then we choose menu item "add node", which sends a "getnode"
    command to magic, grabs the output, then sends a "print" instruction to
    SPICE.  On choosing "start", SPICE begins running, and passes values for
    the specified node to the plotting program for output.  Conversely, we
    can activate the plotting program window, highlight one of the traces
    being plotted, and execute a "go to node" function in magic which will
    move to and highlight the selected node.  The voltage value of the node
    at the current simulation timestep could be printed in magic as it
    executes.  In a way, this functionality is similar to "irsim" in Magic,
    except that components such as graphical output can be added without
    altering the source code of magic, and the entire simulator can be changed
    (repacing "ext2sim" with "ext2spice" and "irsim" with "SPICE", or ACS, or
    analog/diglog, or whatever).  In addition, the interface is smoother
    ("ext2sim" or "ext2spice" run automatically, and the tech file(s) needed
    by irsim or the models needed by SPICE can be determined from the internal
    state (technology data structures and path specifiers) of magic) than the
    existing "rsim" interface in magic.
    
    Finally, an added bonus to this method is that the "rsim" interface can be
    completely removed from magic, reducing some of its excessive `code bloat.'
    The same is true for basically ANY feature of an EDA tool which is better
    developed apart from the core program.  This applies (in my opinion) to
    all of the following tools in magic:  The routers (all of them!), the
    wire tool, irsim/rsim and the rsim tool, the netlist tool and window, and
    the color window.
    
    -----------------------------------------------------------------------
    Development
    
    Implementation of scriptEDA around programs which are inherently command-line-
    interface oriented and which do not have a GUI is straightforward and follows
    the recommendations outlined by Pinhong Chen.  Entire command sets are
    wrapped such that they are translated directly into scripting language
    equivalents.  Program output is captured from stdout where required.
    Programs with more complicated interfaces probably need to be considered on
    a case-by-case basis.  For each program, it will be necessary to determine
    which functions need to be accessed by the interpreter, and which may be
    considered "private" functions.  If SWIG is told to process every single
    routine, it will generate a wrapper for every single routine, and the
    resulting C code source file can be larger than the rest of the program
    combined.  By choosing judiciously which functions should be accessed, the
    interpreter wrapper interface can be kept reasonably small and efficient.
    
    Magic:
    Magic already has an embedded "scheme" interpreter.  Since "scheme" can be
    chosen at runtime, it is easy enough to disable it when compiling for
    scriptEDA.  The main problem with magic is its incredibly complicated
    I/O interface, using a forked process to handle X11 calls, such that it
    gets inputs from dual sources: the calling shell, and the X11 event queue.
    To further complicate things, a choice of graphics interface can be compiled
    in and selected at runtime, so the X11 interface may be bypassed altogether.
    Probably the best thing to do with magic is to leave its X11 interface in
    place and replace the interface to the terminal with a connection to the
    interpreter.  So the function which normally blocks on a "select" function
    waiting to get input will be rewritten for scriptEDA to simply return to
    the interpreter.  The interpreter, not TxDispatch(), will call magic
    functions.  In fact, the entire "textio" interface will probably be missing
    from scriptEDA magic, with the TxDispatch() calls handled as specified in
    Pinhong Chen's scriptEDA "Case Study".  It is probably not wise to tinker
    with the XHelper7 process, namely because X11 is not thread-safe, and if
    operated as a thread, it likes to rearrange X11 calls until it confuses
    itself to death.  I am not sure yet how to deal with command line entry
    from key events grabbed through the XHelper7 process.
    
    XCircuit:
    XCircuit is another program with an embedded interpreter but fortunately,
    like Magic, it can be compiled without it.  However, "without it" means
    that XCircuit runs its own pitiful scripting language.  The current
    development direction for XCircuit is to get rid of the embedded
    interpreter in favor of the scriptEDA extended interpreter, which would
    then do a lot of file handling itself, including handling of netlist
    formats and disk I/O.  Because XCircuit is inherently GUI-oriented, and
    not command-line oriented, it will need to add a method to return back
    to the interpreter for command execution and scripting-language file
    execution.  Because the widget operations are horribly intertwined with
    the rest of the code, getting XCircuit into a state where it can
    relinquish control of the GUI to the interpreter, when requested, will
    require a LOT of work.  Meanwhile, its major task within scriptEDA will
    be for netlisting and LVS in conjunction with magic and PCB.  When LVS
    is confirmed, it can receive simulation feedback in the form of voltage/
    current/digital signal values printed by specified nodes as the simulation
    progresses, and highlighting a node can simultaneously highlight the
    equivalent node in the layout and the trace for that node in the
    simulation.  If LVS is not confirmed, separate simulations can be run
    on the schematic and the layout and compared.  LVS itself should provide
    feedback directly into the layout and schematic programs.
    
    Gemini:
    Gemini is an LVS program.  When LVS is required, it will take input from
    the layout and schematic capture programs, and attempt a match.  Because
    text output from LVS is inscrutable at best, it will be preferred for
    the interpreter to have direct access to the internal state of the LVS
    program, from which it can extract the node name information necessary
    to highlight those parts of a circuit which are believed to be matched.
    Feedback can be used to resolve automorphisms (assuming anyone cares),
    and selection of a node in either the layout or schematic will highlight
    the equivalent node in the other.  The main reason for direct access to
    data structures is that while net names can be requested and shown in
    layout and schematic applications, device names (in VLSI; that is,
    transistors, resistors, capacitors, etc.) are generated by the LVS
    program on the fly.  Gemini documentation suggests that at least one
    version of gemini knows how to write feedback layer information in the
    form of a magic ".mag" file.  I have never seen this part of the code,
    but it should be recovered or rewritten.
    
    SPICE:
    ng-spice has already been modified to run in a scriptEDA environment.
    It is probably necessary to do some more work to give the calling
    interpreter greater control over internal routines, such that
    experimenting with ways to overcome convergence difficulties could
    be tried as scripts.  Too much scripting control is probably not
    advisable, because SPICE needs to run as fast as possible.  The nice
    thing about scriptEDA is that it has the potential to SPEED UP 
    simulations by bypassing all the disk accesses required by lengthy
    disk operations.
    
    PCB:
    PCB would benefit from transferring all of its rats-nest and netlist
    capabilities to the controlling interpreter.  This would allow easier
    integration with a schematic capture program.  PCB does not have a
    command-line interface, so it will need a way to return to the
    calling interpreter or else allow parallel access to its data
    structures using handshaking.  A command-line interface will be
    more-or-less built in the interpreter, with occasional code changes
    needed to support the interface and/or make it consistent and clean.
    
    rsim/irsim:
    I have not looked much at the irsim code, but since it is run
    entirely by command-line interface, wrapping it into scriptEDA
    should be straightforward and follow the procedure outlined in the
    scriptEDA papers, with little or no modification to the source.
    As mentioned above, though, it is its interface to magic, written
    into the magic source, which should be removed and transferred to
    the interpreter.
    
    Mixed-mode simulation:
    An interesting question is whether the scriptEDA system could actually
    break up a circuit into digital and analog parts, and run each part
    separately as a SPICE or irsim simulation, with each part passing its
    outputs to the others at each timestep, and the interface controlling
    the D/A and A/D conversions and the matchup of timesteps.  It's an
    interesting possibility.  I've always been annoyed that some mixed-signal
    simulations have to run excruciatingly slowly because 95% of the circuit
    is simple digital gates but has to be simulated in analog along with the
    5% of the circuit that's truly analog.  If done correctly with threads,
    the result should run efficiently in parallel on a multi-processor system.
    
    gEDA:
    I know very little about the impelentation details of the gEDA
    application programs, so I will need Ales Hvezda and others involved
    to make some comments about fitting them into the scriptEDA scheme of
    things.  Please feel free to add comments and suggestions for individual
    gEDA tools here.
    
    -----------------------------------------------------------------------
    


  •  
     
    Questions? Contact Rajit Manohar
    cornell logo