ChipNDale FOR INTERNAL XEROX USE ONLY ChipNDale 2.5 An interactive editor and database for VLSI designs MOS Designer's introduction Release 2.5 Ch. Jacobi, Kim Rachmeler (March 8, 1988) Filed on: [DATools]CDDoc25>ChipNDaleDoc.tioga c Copyright 1983, 1986, 1987, 1988 Xerox Corporation. All rights reserved. Abstract: ChipNDale is an interactive graphic layout tool made to run in Cedar. This document is an introductory reference for users creating or editing VLSI designs; there will be other documentation describing additional utilities like creating checkplots, masks, or CIF output, and doing design rule checking. Programmers who want to access ChipNDale from a program should read the additional documentation available for these purposes. XEROX Xerox Corporation Palo Alto Research Center 3333 Coyote Hill Road Palo Alto, California 94304 For Internal Xerox Use Only Contents 0. Introduction 1. General Definitions and Descriptions 2. ChipNDale Viewer Commands 3. ComandTool commands 4. User Profile Options 5. The Outside World 6. Usage Hints ChipNDale's documentation is divided into several main files: ChipNDaleDoc.tioga This text. Reference guide for interactive use of the ChipNDale editor for the technologies CMos, NMos, and ChipNSil. ChipNDaleIntroduction.tioga An introduction for the very first hour of interactive ChipNDale usage. Read that documentation and play with ChipNDale at the same time. ChipNDaleToolsDoc.tioga Reference guide for interactive use of some other ChipNDale related tools. Other tools will have separate documentation, stored with the tool directly. This document tells you for example how to make hardcopies. ChipNDaleProgramsDoc.tioga Reference guide for creation of ChipNDale designs from programs. That guide is a mixture of a guide for tool creation, technology creation and simple creation of particular ChipNDale designs from programs. CDCrib.tioga Crib sheet. ChipNDale-RegistrationDoc.tioga To be used by implementors. Meta documentation about registered features telling where the real truth is stored. ChipNDaleMessages... Unstructured list of messages about ChipNDale; available for ChipNDaleMessages1983.tioga ChipNDaleMessages1984.tioga ChipNDaleMessages1985.tioga ChipNDaleMessages1986.tioga ChipNDaleMessages1987.tioga Further tools may have their own documentation. Since ChipNDale is an open system it is not posssible to completely list all its available tools. Uncomplete list: CDExtrasDoc.tioga Doc for some extra modules. 0. Introduction 0.1. History ChipNDale1 is the ultimate interactive VLSI layout editor written in Cedar. It is normally used interactively, but all its operations can be accessed by other programs. In early design stages called Chipmonk II, ChipNDale is the Cedar successor to Chipmonk, an interactive layout editor written for the Alto world. But although ChipNDale looks a good deal like Chipmonk, there are quite distinct dissimilarities. Like Chipmonk, combinations of keyboard and mouse commands allow creation and modification of both primitive (contacts, transistors) and constructed (cells) objects. Multiple views of a design are available on both the color and B&W displays. ChipNDale can read in old Chipmonk files and some ChipNDale designs can be written out in Chipmonk format. Unlike Chipmonk, ChipNDale incorporates the concept of "technology independence", the idea that separate technologies (NMOS, CMOS, PC boards, etc.) do not interfere with the basic ChipNDale kernel, nor do they interfere with one another. New technologies may be created with their own definitions of commands and structures, allowing ChipNDale to expand to accommodate new methods and applications. There are three main sections to the ChipNDale documentation. The first is the user's manual, the file you are currently reading. The second is a guide to the additional tools that can be loaded along with ChipNDale; this document can be found in the file ChipNDaleTools.tioga. The third section is a set of hints for programmers of ChipNDale clients; this file can be found under ChipNDalePrograms.tioga. The rest of this introduction will provide you with step-by-step information to start ChipNDale and read in design files. The rest of the document is intended as a reference manual; use the "Levels" button to scan the document for the general section you are interested in reading. The amount of descriptive detail increases with the number of visible levels. The notes in small print at the deepest nested level are usually examples or explanations that the inexperienced user might need. The "Find" button can also be useful if you are searching for a particular topic. 1 The name ChipNDale comes from neither the fine furniture in England nor the fine figures in LA but from Chip 'n Dale, the two furry characters created by Walt Disney (two chipmunks -- Chipmonk II, get it? wrong!) Subnote: "Chip <-> Dale" also referred to the split between a technology independent kernel and all the add-ons, technologies and commands. 0.2. How to start The file ChipNDaleIntroduction.tioga might be better for first time readers. Installing the program Bringover /DATools/DATools7.0/Top/CDDesign25.df This DF file will equip the machine with all the information it needs to run the NMOS-A, CMOS-A, CMOS-B, and ChipNSil versions of ChipNDale. The current version is called 2.5 and runs on top of Cedar 7.0. Be carefull about what subdirectory to use: ChipNDale really doesn't like it if the technology and the the kernel run in different subdirectories. It is usually best to create a separate subdirectory for ChipNDale; this allows you to remove it easily when you want to upgrade to a new version. If you use ///7.0/Commands/ everything works, but you have no way to remove ChipNDale anymore except by deleting everything in ///7.0/Commands/. Start the program With the standard user profile entries the program is started when you read or create a design. If your user profile inhibits automatic start, you can use the following load files: % CDCMosA or % CDCMosB or % CDNMosA or % CDChipNSilOnly When ChipNDale is started a Terminal monitor viewer is created (hereafter referred to as "Terminal"). Terminal keeps a log of all the commands issued concerning ChipNDale; it is where you will look to find information about what ChipNDale is trying to execute and how that execution is progressing. When you use ChipNDale for the first time, just go ahead. Playing with ChipNDale is not dangerous: when ChipNDale reads in an existing design it will not overwrite the file unless you explicitly issue an output or save command. When you are an old Chipmonk user: ChipNDale is able to read in Chipmonk files; look in the documentation about additional tools. Get a design to work with To get an existing design up on the screen, use % CDRead . You might try: [DATools]CellLibraries>Logic.dale. ChipNDale design files contain the technology of their design. If no filename was given to the read command, Terminal will respond with the request to type a file name in. The file may either be present locally or on one of the file servers; default extension is ".dale". You do not need to type in the extension. To create a fresh design use one of the commands: % CDNewCMosA or % CDNewCMosB or % CDNewNMosA or % CDNewChipNSil or % CDRead ^ These commands will display the design (or new viewer) on the screen. 1. General Definitions and Descriptions 1.1. The Terminal The Terminal viewer is one of the main communication points between the user and ChipNDale. Terminal not only keeps a log of commands executed but also prompts the user for input and displays error messages. There is only one Terminal for any invocation of ChipNDale, regardless of the number of designs displayed. The Terminal viewer may be destroyed anytime, ChipNDale creates a new viewer when it is needed. 1.2. Technologies One of ChipNDale's main features is its ability to adapt to new technologies without changes to the core of the program. This feature is called "technology independence"; it means that new fabrication techniques or applications can be described in modules and plugged into the existing system. But this capability also means that the user must make sure that the appropriate technology is loaded so that ChipNDale can access features unique to that technology. For MOS designs, ChipNDale distinguishes between the NMosA, the CMosA, and the CMosB technology. The "technology independence" of ChipNDale goes that far that even a technology ChipNSil is available, describing schematics or arbitrary drawings. ChipNSil: A simple technology for non VLSI related drawings. ChipNSil is really exactly like ChipNDale! You don't have to learn any new command except the commands to draw text or exchange fonts. (See in chapter 2.12. "Text in ChipnSil") NMosA: The old nmos of 1983-1985; it is kept so people can still read in older designs. CMosA: The old cmos of 1983-1985; it is kept so people can still read in older designs. CMosB: The new cmos of 1986; it has nicer features then CMOSA, but atomic objects which have been declared as unsafe for the Dragon project have not made it into CMOSB. Fine point: Technology for ChipNDale does not mean exactly the same thing as technology or process in the context of VLSI fabrication. In ChipNDale, Technology is used as set of features which are handled together. Technology defines the layers, the atomic objects used, and is used to define a context in which to read files. It is also used in the other [real] sense, to describe design rules, but not too precise: a design rule checker might be parametrized for different processes in the same ChipNDale Technology. 1.3. Design A design is what a designer creates; it is the unit stored as a file, and also the unit used in synchronization of concurrent acceses. Every design is in a particular technology and consists of some geometry and a directory. 1.4. Objects Primitive objects are the "atoms", if you will, of the ChipNDale world. The existing primitives are transistors (straight and angle), contacts (buried and butting), and wires. These different kinds of objects are called classes. Composite objects are cells, repetitions or imports. These are the building blocks of the more complex structures used to construct designs. All the composite objects must be listed in the design's directory. Cells are the most basic building blocks. The types [classes] of objects which can be included in a design are specified by the technology. However some classes of objects, cells and rectangles, exist in all technologies. 1.5. Additional Tools ChipNDale makes it easy to write additional tools, causing a large variety of extra utilities to spring up around the core program. It is not possible to describe all additional tools in this document; you can find that description in ChipNDaleTools.tioga. The list of additional tools starts with "design rule checking", "making checkplots", "CIF generation", "mask generation"... 1.6. Tip Tables Often used as the real truth of the user interface, users are invited to browse the tip table. The tip table is alphabetically sorted and it has comments. ChipNDale typically uses two tiptables, one which describes the general ChipNDale user interface, and a second one which describes the technology dependent commands; But ChipNDale lets you nest an arbitrary number of tip tables. Menu-Tables and load tables: ChipNDale uses a similar concept like tip tables to define the entries of the menus, and another table to find and load the code of commands which are found in either tip or menu table but is not yet implemented. 2. ChipNDale Viewer Commands 2.0. In General ChipNDale commands are grouped such that those most frequently applied use the lefthand side of the keyboard. This grouping allows easy finger placement without having to move your right hand away from the mouse. This speedy access, however, has outweighed mnemonics, which is why "Q" draws a transistor, not "T". Infrequently used commands have been shuffled off to the righthand side of the keyboard. Commands are executed in the ChipNDale viewer with the input focus. If the viewer does not have the input focus, the cursor will appear as a fat arrow pointing down. Click any mouse button to obtain the proper cursor. The mouse buttons are ordered such that the middle button controls drawing objects, the left and right buttons control modifications. Drawing only occurs when the middle button is pressed or held down; alterations only occur when the left or right button goes up. Most commands that affect selected objects can be performed with either the left or the right button, or with the CTRL key; the left button only affects the object pointed to, the right button or CTRL applies all currently selected objects. These commands are indicated in the documentation with the choice {Left or Right or CTRL}, meaning that the command will be applied to a different set of objects depending on the button used. The CTRL key can be applied only to execute those commands which do not depend on a mouse position. The following commands refer to the default CMOS and NMOS ChipNDale tip tables. All of the technology independent commands work also for ChipNSil; There are some paragraphs describing ChipNSil particularly. 2.1. The Pop-up menus and the control panel Pop up menus ChipNDale has real many commands, more than you are willing to remember. Pop up menus allow you to call commands, without having to know lots of exotic key combinations. There are many pop up menus available, and the menus can get additional entries when more programs are loaded. You can always try what commands a pop up menu has; mouse clicking outside of it discards the menu. To get a pop up menu, push the space key together with its letter key. Most entries in the pop up menus have a help information; to display the help information move the mouse verticically over the header line of the menu. - the global menu; allows to call other menus - the properties menu - the cell menu; creation etc of cell - the directory menu; get an object, clean the directory... - the IO menu - the DRC menu

- the program menu; call of additional programs. - the names and properties menu - the other program menu; call of additional programs. - the text menu - the viewer menu - the special commands menu - the generator setup menu - the draw mode menu - the imports menu - the text menu <,>- the simplification menu <.>- the ticks menu - the grid menu <->- the curves menu Some few pop up menus are reserved for commands which need a position as parameter, these commands obviously need a mouse interaction to make the pop up menu appear. - global menu; allows to call other menus which need a position - drc menu; drc options which need positions

- another program menu; programs executed on a rectangular area - special commands which need positions - the hard copy menu; the called hard copy programs do all want a rectangular area as input parameter. - the generator call menu. Note: the pop-up menus can be altered dynamically by client modules while ChipNDale is already running; Therefore the general documentation can not accurately document all entries, but contains the most important entries . Control panel commands The control panel is a graphical method of changing layout parameters. Every design has a control panel associated with it; The control panel allows the designer to select default values, mainly the layer in which he wants to draw, but also some other modes. The panels also have some technology dependent entries. The control panel can be scrolled. Commands on top of integer or layer values: Control panel commands are executed by clicking mouse buttons on top of the text (not the value). Left: increment value Right: decrement value CTRL Left: double value CTRL Right: half value Middle: (when done over a layer description) selects this layer as default for drawing wires - : shows a pop up menu, allows entry of arbitrary values. Top line commands: current layer: Changes the set of layers which are displayed in the control panel. new view: The new view command allows the user to create or split a viewer on the associated design. save: Save the design on a file; this command is for conveniance only. menu: The root pop up menu for all the commands which do not need actual positions. help: Displays some help information. Technology dependent commands: There are several buttons on the panel referring to modifications to transistors. Both NMOS and CMOS panels have width and length buttons for changing the default measurements in the horizontal and vertical dimensions respectively. The NMOS panel has three additional buttons. The 'implant' button changes the type of transistor according to the following codes: NMOS transistor codes weak allows access to weak implants, a feature which you probably don't want to use. WEAK IMPLANT MEANING 0 0 enhancement 0 1 depletion load 1 0 threshold = 0 1 1 weak depletion The other two extra buttons change the width and length of pull-up transistors. 2.1. Simple Selection Select Single Object Left Point to desired object and hit the Left mouse button. All previous selections will be removed and this object will be selected. (Note: just the condition of being selected is removed, not the object itself!) Fine point: If the mouse position is exactly the same as before, and no other key is pressed, the selection will rotate through the possible objects at that point; otherwise the command will reselect the last selected object under the mouse position. This enables you to select objects completely obscured by other overlaying structures. Select Multiple Objects Right Selections made with the Right mouse button will be added to the collection of previously selected items. Deselect Object -Right Point to a selected object, hold down and hit Right. Selection will be removed. Fine point: -Left will deselect all objects. Change selection If you are selecting an object but have not yet let the mouse button up, you can change your choice by keeping the button down, moving the mouse to the new object and hitting . This change in midstream will also work even if you are about to execute a command on the selected object. For example: Say you want to rotate something. You press R, point to the appropriate object and press the Left mouse button. As soon as you let the button up, the command will be executed. But wait! You really wanted the object just to the right! No problem. Keep the mouse button and the R down, move the cursor to the new object, and hit . The selection will be switched to the new pointed objected. Now when the mouse button is released, the new object will be rotated (either in place of or in addition to the old object, depending upon whether the Left or Right mouse button was used). 2.2. More Advanced Selection <<***>> Area Select/Deselect There are two ways to handle area selections, the common area selection selects (or deselects) all objects which are completely included in a rectangular area. Use the common selection commands, but drag the mouse while the button is down. The other method of area selection handles every object which touches the designated area. -Left other area select --Left other area de select Select single object of a particular layer In CMosB only: Sets current layer and selects a pointed object if it has this layer. <1-2-left> Except CMosB: selects a pointed object if it has the current layer Select All - selects everything in the current design Select Entire Layer -{Right or Left} all of the objects belonging to the current layer will be selected or added to the selection. 2.3. Drawing objects Wires Middle Pressing the Middle button and moving the mouse draws a wire of the current layer with the current width, releasing the button confirms the position and length of the wire. Hitting while drawing a wire draws the first segment of the outlined wire. Hitting while drawing a wire flips the orientation of the direction the wire bends. Stops the wire drawing process. Note: The current layer can be changed with either the keyboard or the control panel, the width can be set only through the control panel. Note: When you statrted drawing a wire but think differently, press ESC to discard the outlined wire. Choosing a layer All the layer commands use keys in the top row. -Middle Clicking the middle button while holding down will set the current layer to be the same as the layer of a pointed object, if it has a unique layer. Change layer by hitting the associated layer number key. (CMos and NMos only). The control panel can also be used to change layers; note that the order of the layers associated with the keys is the same as the order listed in the control panel. CMOS <1> diffusion: default N+, with P+ <2> poly <3> metal <4> diffusion contact: default P+ to N-well, with N+ to P-well <5> N-well <6> 2nd layer metal <0> comment (CMOS-B only) In general, if the or key is down, everything is done in the P-diffusion world; up indicates N-diffusion. You can change between pdif and ndif just by switching the position of the key without hitting <1>. Note: NMOS uses <4> for 2nd layer metal, it has no wells or well contacts. ChipNSil layers are select with the control panel. To change the layer of an already painted object, use '-. There are some extra colored layers to be used for comments; use to select these comment layers. Be carefull, the colors of these comment layer are indistinguishable from real mask layers. Transistors (CMos and NMos only) Q-middle Draw a n-transistor (with SHIFT or LOCK: a p-transistor) W-middle Draw an angle n-transistor(with SHIFT or LOCK: an angle p-transistor) Contacts Contact commands use the same keyboard keys as the layer commands plus the middle mouse button; the contact is made between the indicated layer and metal. The command is executed by holding down the appropriate numeric keys while hitting the middle button. (CMos and NMos only). Middle mouse button while: <1> N+ to metal, with : P+ to metal <2> poly to metal <3> Butting P+ to poly and metal; with : N+ <4> P+ to substrate, with : N+ to N-well <6> metal to metal 2 <1>-<2> Buried N+ to poly; (There are no P+ buried contacts) <1>-<2>-<3> Butting P+ to poly and metal; with : N+ This command is supposed to remind you of the three layers used in a butting contact; everybody will probably use the simpler <3>-Middle command though. I know I would. Note: NMOS uses <4> for 2nd layer metal, therefore <4> for a metal to metal 2 contact; there are no substrate contacts. Drawing objects by name (from the directory) C-Middle Draw object, placing origin at current cursor position. Terminal will prompt for name of the object to be drawn. 2.4. Simple transformations Move by a vector -{Left or Right} Move selected object(s). If done with the right button, moves entire collection of selected objects relative to the former cursor position as indicated by the vector drawn on the screen when moving the mouse. The left button reselect a single object and moves only this object. Move an incremental step A-{Left or Right or CTRL} to the left. S-{Left or Right or CTRL} to the right W-{Left or Right or CTRL} up Z-{Left or Right or CTRL} down Note that the four keys A S W and Z are arranged in the same relative positions as the directions they move the selected object(s). The size of the step can be set by the control panel; if the control panel defines a step size of zero the step size is always the same as the grid number [of the particular viewer]. Copy -{Left or Right} Copy selected objects positioned according to the drawn vector; the simple copy is similar to a move save for an additional -- however, the step moves do not have a corresponding copy version; they would not make sense. If done with the right button, copies entire collection of selected objects by choosing an origin with the left mouse button, holding that button down, and moving the cursor to the desired destination. The left button only copies the single selected object. Copy with shift left even works as inter-design copy making imports. Rotate and mirror R-{Left or Right or CTRL} Rotate selected object(s) by 90o in a clockwise direction, the bottom left corner remains fixed. T-{Left or Right or CTRL} Mirror selected object(s) across the vertical axis E-{Left or Right or CTRL} Mirror selected object(s) across the horizontal axis Rotation is the R command; for mirroring E and T were selected because they are located next to the "R" (rotate) key and have symmetries appropriate to their function. Delete D-{Left or Right or CTRL} Delete selected object(s) Un-Delete D-ESC Undelete last deleted object(s). Undelete may be repeated some times. 2.5. Stretching objects Stretch {A, S, W, Z or none}--{Left or Right} Note that stretching is very similar to the moves; instead of moving the object, only the pointed border is moved, the object is stretched. Therefore, the stretch commands are identical to the move commands except, that a modifier key, is used. The letter A, S, W, Z or Q specify the direction and the amount, as in the moves. You must be pointing to an edge of a selected object each time the mouse button is pushed. The pointed edge will be stretched. 2.6. Some exotic but useful or necessary commands <<***>> Stretchy move {--A, S, W, Z} {-}-{Left or Right} Stretchy move is a special move which maintaining primitive connectivity; The commands are like the moves, except the TAB modifier key. Stretchy move is implemented in a strictly geometric way and does not understand the electrical behavior... be gentle on imperfections. Measuring distance, counting objects, information about an object -Middle -- Click the middle key quick when is down: you get information about the selected objects. -- Draw a vector by holding down and the middle button while moving the mouse. When the mouse button is released, Terminal will display the values of the end coordinates and the distance between them. Yes, these two commands use the same keys, only the time scale is different. Cut a wire |-{Left or Right} Cut wire(s) by holding down both the "|" key and the appropriate button while moving the mouse. Command is executed by lifting the mouse button. Move to grid /-{Left or Right or CTRL} Move object(s) to a grid position Did you notice that / is the general grid key also used for the grid menu?. Grow by width G-{Left or Right or CTRL} Grow wires in length direction by the amount of their width. This is handy to draw boxes when working with a coarse grid. To shrink back to grid positions use the cut command and delete the small piece; I do nto believe that you really want to shrink to other than grid positions. Interrupt the drawing - Hold down a few seconds! Interrupts the drawing, of all viewers, immediately after the command is accepted Abort a command - Aborts the current command; works at least if the implementation of the current command is kosher and asks for the abort flag... . Of course, short commands do not ask the flag, but the abort command at least flushes the command queue. An analogue is using to abort an input on Terminal. Special commands menu -S The special commands menu is a catch-all menu for odd commands which don't really fit in elsewhere. It includes commands such as undelete, abort command, and statistics, among others. -S The special commands menu with commands which depend on particular position or area. It contains comands for setting or defaulting the interest rect of the pushed in cell. Debug command <^>-middle Enter the debugger. Shows first a pop up menu to decide whether the locking of the design should be released. It is conveniant to release the lock, this allows to issue other commands while the debugger still has a handle into the design. However, if the lock is released the debugging actions are not queued properly and it is up to the designer to prevent any problems due to concurrency. The debugger is called from a procedure which allows you to inspect easily the selected object, it's specificRef field, the instance, the design or th command. A special procedure Include may be called from the interpreter. This procedure includes any object or instance into the design. It is up to the user to make sure an included thing is correct. It is perfectly save to either abort or proceed a debugger created with the debug command. Arrow command -middle Puts down an arrow at this position. (Some commands might depend on the position pointed to by this arrow.) Don't rely on the arrow position over multiple commands, some commands might move the arrow position implicitely. Remove the arrow 2.7. Viewer commands Change scale "<", ">" Hitting <<> increases magnification; hitting <>> decreases it. It is easier to remember these commands by looking at the upper case options on the keys, but of course the real keys are <.> and <,>. Or, if you want to be visual in remembering the commands, note that the "<" starts small then gets bigger, hence it makes objects appear bigger. In the same way, ">" starts big and ends small, making objects appear smaller. Interrupt drawing Hold down for about 2 seconds. Will interrupt the drawing on all ChipNDale viewers. This command is usefull to interrupt the drawing if a complex design is drawn in excessive detail, which might need hours... The drawing can be repeated simply by zooming or paning. Change position, pan viewer -Middle Moving the mouse while holding down both the key and the middle button draws a vector on the screen. The view of the design will be moved in proportion to that vector when the mouse button is released. Show a particular area, zoom in viewer -Left --Left Drag a box to define an area. The view of the design will be scaled and moved such that this box will be displayed. This displays the drawn area on the viewer; together with SHIFT it choses another viewer. -Left (not with !) can be un-done with . Show position of other viewers <<***>> -Middle Shows the positions of the other viewers. View top cell <<***>> - Cause the viewer position and scale to change so that all objects of the top pushed cell are visible on the screen. View in previous scale  Cause the viewer position and scale to change back to a scale used before. View all selections <<***>>  Cause the viewer position and scale to change so that all selected objects are visible on the screen. Changing the simplification treshold Use the simplification menu either directly or through the viewer menu. The simplification treshold can also be changed on a per cell base (The actual treshold value is a product from the viewer and the cell treshold value). See the cell menu for this command. 2.8. Cells Note that these commands can also be accessed through the cell pop-up menu, -C. Drawing cells is not a special command but like putting down any named object which is in the directory: use the C-Middle command. Create cell X-C-Middle Create a new cell from the set of all selected objects. Terminal will prompt for a unique cell name. This double key command is easy to remember: X is just the neighbour key to C, which is used for all cell related commands. Expand (Flatten) cell Use the cell pop up menu. (C-Space) Push-Pop C-{Left or Right or CTRL} Push into cell: the rest of the design will be grayed. C- Pop out of cell. The user has the option to ignore the edits, to create a new cell, or to really edit the pushed cell (then the edits are propagated to all instances of the cell). X-{Left or Right or CTRL} Push into the cell which is designated by the selected object. E.g. if the selected object is an icon, this pushes into the corresponding schematic. The push command may also be executed for objects other than cells. A new cell with corresponding geometry will be created. On the pop out, the user has the option whether the original object should be replaced by the corresponding edited cell. Interest rect The interest rect denotes the interesting area of an object. It has been defined to denote an artificial cell boundary for routers and module generators. The interest rect can be defaulted or set to any particular value. (Use the "special commands with rectangle" menu; S- ). The interest rect should not point outside the area where ChipNDale is drawing. Even if except drawing all else works correctly, this is condidered erronous usage of ChipNDale. Directory -D Directory pop-up menu: list directory: list explicitely named objects; you can also use a pattern prune directory: list unused entries created by programs, and ask whether they should be removed from the directory. If a pattern is used only the objects matching the pattern may be removed from the directory. remove ob from dir: remove a particular entry from directory, (checked, only unused entries can be removed) replace ob: replace a perticular object in the whole design list imported object: list names of imported designs or object CELLS: calls Cells pop-up menu Cell pop up menu -C Cell pop-up menu: create cell: see create cell push in: see push-pop. pop out: see push-pop. push in corresponding: see push-pop. push in named: Requests a name. Push into any instance of of the named cell. expand: Expands (flattens) the selected cell. transform to cell: transforms the selected object into a cell. Works only for composite object classes. border mode on: the selected cells will be drawn with a border (only if also the viewer has border mode on) border mode off: the selected cells will be drawn without border visibility at this scale: set the simplification treshold for this cell such that it will be drawn at this scale, but simplified on smaller scales DIRECTORY: shows directory pop up menu. 2.9. IO, Imports, and Includes IO The IO menu allows operations on designs which already have a viewer; use the CommandTool commands to read in the files originally. -I Use the IO pop-up menu. Default extension is .dale. save (truth): Stores design using same file as for input. If the design was not created by reading in a local file it ask for a file name. output (truth): Requests filename and stores the design. output (cache): Requests filename and stores the design. load import: Requests filename and loads this design ready for doing imports. Whereas you type a FILE name for this command, it imports a design with DESIGN name as found on the file. include: Requests filename, loads this design and completely include it into the design used for the command. load all imports: Tries to load all imported files. Uses design name as default for filename; It is possible to specify other filenames using the user profile. Truth/Cache mode: A truth file contains only those features which are well supported. Objects of not well supported classes will be replaced by aequivelent objects. Properties of not well supported classes are simpoly not written on a truth file. By being restrictive at write time a truth file can certainly be read back later. [Programers: please prevent your program to store things in truth mode] A cache file contains may contain lots of additional information. BUT: It is not guaranteed that you will be able to read it back in with a different configuration of ChipNDale. These files might be used for caching computations, but not for representing a layout. Chipmonk files: How to read or write Chipmonk compatible files is described in the documentation ChipNDaleTools.tioga. If the Chipmonk compatibility program is started it will register further commands into the IO menu. Imports and Includes Include: Take some objects from some other design and copy them in. The copied objects are completely a part of the target design. Import: To import a design means to make references to objects from the imported design (the library). The imported objects are not included in the importing design but only referenced. If objects are changed in the imported design (the library), and this design then re-loaded, the changes made are propagated to our importing design. To really see imported objects it is necessary to load the design they are imported from. Think an imported design is a separate module. Objects are procedures. The size of the object corresponds to the Type of the procedure. Having an imported design not loaded corresponds to an unbound procedure... Indirect imports: If an imported object imports another object this is an indirect import. You do not have much control over indirect imports; if a configuration with indirect imports is changed you shoud do the edits in a bottom up order to get the changes propagated right. -X Use the imports pop-up menu. load import: Requests filename and loads this design ready for doing imports. Whereas you type a FILE name for this command, it imports a design with DESIGN name as found on the file. list imported objects: List the imported designs or referenced object of a particular imported design merge in imports: Request an imported DESIGN name. All the imported objects from this design will be copyed and completely included into the design used for the command. include: Requests filename, loads this design and completely include it into the design used for the command. load all imports: Tries to load all imported files. Uses design name as default for filename; It is possible to specify other filenames using the user profile. undo merge in: Ask for a design name. Tries to find all objects which came from this design and replaces those objects with imports. Easy way to draw imported objects Just try to do a simple copy command: Ignore completely that the source and the destination are in different designs. The command will ask you several simple questions with pop up menus. If those questions are answered the right way an import is made. Small restriction: Copy one object at a time. Other ways to draw imports: There is a draw imported object command which requests the name of the design and object to be drawn. One more ways to draw imports: Use generators. Once a reference to an imported object is made, it is possible to really include that object in the current cell directory. It is then no longer referenced but a part of the new design: use the "merge in" entry in the pop up menu. It is even possible to undo a merge-in (The "replace included by imports" pop up menu command). However any editing on merged-in objects makes them forget whether and where from they were included. 2.10. Repetitions Description A repetition is a set of objects placed at regular intervals along a given vector a given number of times. This feature allows the designer to create uniform structures quickly and easily. Any group of objects can be used as the basis for a repetition, even repetitions themselves. Commands =-Middle (note the repeated horizontal lines) Make a repetition of the selected objects Select the objects you want to form the basic unit of the repetition. Hold down "=" and draw a vector with the middle button. The vector indicates the spacing of the units. The vector is pointing to the position of the origin of the next unit, where the origin of any unit is defined by the tail of the vector. After the middle button is lifted, Terminal will prompt for the number of units you want in the repetition. [-{Left or Right} Increment count on selected objects (repetitions) ]-{Left or Right} (note that "[" and"]" are just below "=") Decrement count on selected objects (repetitions) =--Middle Change the repetition vector of the selected repetition. Any repeated object has the possibility to ask what index it has in the repetition. It is possible to change a repeated object into a cell; however there is no way back. 2.11. Properties, Signal Names It is possible to give arbitrary properties to any instance of any objects. These properties may or may not affect any program's behavior, or may only be comments for designers. Programs can protect their properties from designers, so the property mechanism can be used without danger of contention. SignalNames are reserved properties "$SignalName". Their value should be a ROPE. InstanceNames are reserved properties "$InstanceName". Their value should be a ROPE. -N The names and properties menu. [The letter P is reserved for Programs, not properties.] Shortcuts: N-Left Shows all the properties and values of the selected instance on terminal. N-Middle Enter signal name for the selected instance. N-Right Display signal names of all visible instances in the viewer. The Name and Properties Menu -N Name pop-up menu: Property (design): put a property on the design Property (instance): put a property on an instance (Application) Property (object): put a property on an object; this is only possible for objects which are contained in a designs directory Comment (design): look or put a coment on a design. Comment (instance): look or put a comment on an instance (Application). Comment (object): look or put a comment on an object; this is only possible for objects which are contained in a designs directory. Rename design: rename the design Instance-name: put an instance name on the selected application Rename Object: rename selected object in directory Signal-name: put an signal name on the selected application; this can have side effects if application is not using a rectangle. Show prop (design): Show the properties of the design. Show prop (i&o): Show the properties of the selected objects and applications. Display signal-names: Display signal names of top layer cell. To put a property on something: Answer the question for the property name and wethter to replace the value of the property. Properties included interactively cannot make use of all the nice Cedar types, however, a pop-up menu allows you to select the types of the property value in some limited range. Preferred types for properties are Rope.ROPE, ATOM and REF INT. The name of a property is always converted to an ATOM. Properties using these types are saved while a design is written on a file and read back. However, clientprograms may affect this and force a different behavior for properties they own. Such properties are usually reserved by the implementor for his/her exclusive use so designers will not be surprised. It may be good to load client programs first, and only thereafter use undocumented properties; they might be disabled by a client program, even if it runs later. 2.12. Texts Y-space The text menu T-middle Draw a text using the current font; requests for text in terminal Y-middle Draw a text using the current font; takes text from the text field in the panel CMosB 0-middle Draw a text using the current font. Y-{Left or Right or CTRL} Replace selected text with text in the panel. Y-R-{Left or Right or CTRL} Copy selected text into the panel. F-{Left or Right or CTRL} Change font of selected texts. F-R-{Left or Right or CTRL} Copy font of selected text into the panel. {CTRL-\} make text italic. {CTRL-SHIFT-\} make text non italic. The font selection is made using the control panel. The available fonts in the control panel are set up with the user profile. Changing the user profile changes the available fonts immediately. The user profile helps for creation of text only. Once a text is in a design, it will not change font on future user profile changes. The font of a text is remembered by storing the font name. The - menu also allows to put a font into the control panel without user profile help. ChipNDale understands both, raster fonts and spline fonts. To the user, the difference is the name and the scale factor. (The scale factors are also set up using the user profile) The font used for the default [initial font in the control panel] is dependent of the order of the font entries in the user profile. There is a special draw mode which converts raster fonts to spline fonts before drawing. See the viewers draw mode command . There are two classes of text. rigid text: These texts can be rotated and mirrorred like any other object flip text: These texts try to be readable in every orientation The user interface tries to guess what kind of text should be created; in case you want to change class of a text use the text menu. See the user profile section for more information. 2.13. Generators U-space Generator environment setup menu. Certain set up commands for different generator environments. Allows flushing the cache of a generator (make it forget an object has been already created) U-middle Calls a generator of the current generator environment (context). Depending of the selected generator context a generator is select using a pop up menu, by typing its name or by a generator context specific method. The selected generator is called and the generated object included at the mouse position of the command. The current generator environment (context) can be selected using the control panel. Generator contexts are specified with a name. Typically a new name is used for any particular project. Some names are used by certain tools. Normal user defined generator contexts have only a name to destinguish their identity. They cause selection of a generator using a pop up menu. The following tool generators are predeclared DIRECTORY: Reads a name from terminal and fetches the object from the directory INCLUDE: Reads a name as designName.objectName from terminal; the object is transfered into the design where the command was issued and included. If necessary the design designName is loaded first. The design is assumed to be found on file with name designName. IMPORT: Reads a name as designName.objectName from terminal; the object is imported into the design where the command was issued and included. If necessary the design designName is loaded and imported first. The design is assumed to be found on file with name designName. See ... for how to write generators. 2.14. Using the Color Display ChipNDale also uses the color screen as a viewer. ChipNDale's colors are set up different than the standard Cedar colors, but it does not behave as if it owns the color device; it uses whatever color display settings it finds. To set up pleasent colors for ChipNDale, the color map must be set explicitely. You might use the "8-bit-color" button to select which colors you want to install, or load a particular color map file using the command ColorMap filename in a command tool. How colors are set up internaly: Patterns and Maps To make reasonable use of the color commands, you have to understand how the colors are generated. Colors are generated in two steps, each of which can be set up separately. Only well matching combinations of these two steps can make reasonable colors. In a first step a layer causes a certain pattern of pixel values to be or-ed into a bitmap. This pattern may contain several pixels, each of several bits. In a second step each pixel in the bitmap is mapped through a color map to cause an actual color to appear on the screen. Generating the pixels can in principle be personalized on a per viewer basis. On normal usage, each technology specifies how its layers are mapped into pixels. The color map however, is part of the display hardware. Only one color map can be active at any time. Interactive color tools A interactive color tools exist (for cmos and nmos only) which allow changing of colors. See the documentation of additional tools for how to use it. 2.15. Polygons and Curves Polygons, arbitrary angled lines, splines and filled curves (using splines as outline) are called curve objects. Curve objects are not first class citizens to all ChipNDale tools. Prior to using curve objects make sure that all the tools necessary understand them. (It is easy for the tool maker; ChipNDale has all the right defaults to render those objects) Right now: CIF generation and ploting understands Polygons, but mask generation, DRC and extraction does not; most tools do not understand splines. Curve objects are defined using control points. Control points are simply alignment marks with the owner property set to the curves module. Curve control points have a name (number) which is used to sort curve control points in an alphabetic manner; This is used to find the order of the control ponts when a curve is created. <->-middle fast Draws a curve control point. (An alignment mark with a special owner). The control point gets a name such that it will be used after all the other already existing curve control points. <->-left: select; if object is an alignment mark, convert it to a curve control mark. Rename control mark so that it comes last. <->-space: The Curve popup menu There are still some older commands available which work with a Polygon pop up menu, which you get by using <->-middle slowly The Curve popup menu: <->-space split up: Takes the selected curve, and replace it by its set of curve control points. make: There are make entries for Polygons: Filled polygons in the current layer Lines: Straight lines connecting the curve control points. Uses current layer and current width. Splines: Bezier splines using the curve control points. Uses current layer and current width. Filled Curves: Uses curve control points to define the outline of a curve using Bezier splines. Fills this curve with the current layer. There are also two modes: just make: use all the selected alignment marks as curve control points. use all marks: use all the selected alignment marks and all the curve control points independent of selection to define the curve. add-select curve control marks: Select all curve control points (without any deselection) set owner to marks cc: convert ordinary alignment marks to curve control marks forget owner of marks: convert curve control marks to ordinary alignment marks count marks: gives a statistic about control marks Bezier splines: A spline segment is defined using 4 control points. The segment starts and ends at the first, respectively, fourth control point. The second and third control points define the tangents in the endpoints. To make spline objects beeing smoth, the user has to draw the control points such that the tangents will coincide. More about Bezier splines can be read in the Griffin documentation. For line objects and spline objects the drawn control points are not the theoretical control points used to define the curve; the theoretical control points are found by adding half the curve width to the x and y coordinates of the drawn control points. 2.16. Symbolic objects: Pins, Segments, and Alignment marks Pins are a mean to give rectangular areas names. Segments are a mean to give (oriented) lines names. Alignment marks are a mean to give names to points. These objects are called symbolic objects. ;-middle Draws a symbolic object on the current layer. You are supposed to give it a name. ChipNDale figures out from the mouse movement whether a pin, a segment, or an alignment mark should be drawn. Symbolic objects further may have an owner and a layer. The owner means which program specifies the semantic meaning of the specified area. Interactive drawn symbolic objects have a nil owner. Symbolic objects are the general scheme with which name-point, line or area asssociations can be made for ANY program. Multiple symbolic objects may well have the same names. To change the layer, use the general change layer command, '-. 2.17. Useful Things to Know The ESC key: Works mostly as an UN-key Stops drawing wires or any other cursor tracking command. Works as De- select on all the select commands Undelete with D. Is involved in both, the stop-draw and the stop-command commands But: It is also in the same row than the layer keys! ESC-middle picks up a layer. If output of a design crashes but you want to save it Look at ///ChipNDale/temp/...... Did you try SHIFT-SHIFT-SWAT? (hold it down for a couple of seconds). 3. ComandTool commands Note that capitalization is not significant when giving the commands 3.0 Loading the program In general it is not necessary to load the program; just issue comands. CDNMosA, CDCMosA, CDCMosB, CDSil to load the common base and a particular technologies ChipNDale to load the common base only 3.1 Creating new viewers CDNewNMosA, CDNewCMosA, CDNewCMosB, CDNewChipNSil Create a new empty design in the appropriate technology. 3.2 Reading in designs CDOpen filename If not already read then read else if the viewer is not open then open. CDRead {switches}{optional filename | (^technology name)} Read a ChipNDale design. (.dale file) If the filename is not specified, ChipNDale will query for one. The technology of the design on the file must either be loaded, or the user profile set up to allow automatic loading of the technology. switches are {+x | -x} loading imports {+p | -p} control panel {+s | -s} background saving {+r | -r} read only 3.3 Calling generators CDGenerate generator {out|*} _ {in|^technology name} generator: generator to be called; Uses a generator environment specified by the input design; The generator environment defaults to "USER". out: file name for the output design "*" for out: create viewer for output design in: file name for the input design "^technology name" for in: new design of technology "technology" will be created 3.4 Color Settings ColorMap {optional filename} Reads and installs a color map file. -n causes the the file to be installed only if the color display is already on and in 8 bit mode. To create a new color map file: Set up the color map [using any tool, none of which is loaded automatically with ChipNDale] and then create the file with the ColorMaps package. See the documentation in the ColorMaps package itself. 4. User Profile Options It is usually good to specify full path names for filenames mentioned in the user profile; user profile readings are processed with different working directories. The user profile options are shown here with their default values. WARNING: When ChipNDale is started a reasonable working directory is assumed. When the user profile is edited, NO working directory is assumed. User profile options which cause usage of files do have a version number. The version number is indicated here by the letter %. (This is needed to be able to have two different ChipNDale versions stored on one machine) 4.1. Control of the pop-up menu PopUpMenu.FontFamily: "Helvetica" PopUpMenu.FontSize: 10 PopUpMenu.FontBold: TRUE PopUpMenu.FontItalic: FALSE PopUpMenu.LineHeightChange: 0 4.2. ChipNDale kernel ChipNDale25.MenuTable: Default -- ChipNDale25.MenuTable: ChipNDale.Only.MenuTable ChipNDale.FirstViewerOnColor: TRUE ChipNDale.ControlViewerOpenIconic: FALSE ColorDisplay.Side: Left ChipNDale.RunPrograms: NIL Imports ChipNDale.ImportFor.DesignName: "FileName" Debugging ChipNDale.CatchLowLevelErrors: TRUE ChipNDale.CatchErrorsWhichCauseDeadlock: TRUE 4.3. Technology-specific user profile options Remark: Technology specific options use the key, not the name of the technology. This is not ideal, but it would not be easy to change the technology keys to match the names, since the keys are buried in old files. Loading These entries tell whether the technology can be loaded automaticely when IO is done ChipNDale%.AutoLoad: TRUE technology specific AutoLoad options ChipNDale%.AutoLoad.TechnologyKey: BOOL Tip tables In general the deafult Tip tables are the ones you should use; then you need no Tip table entries in your profile. ChipNDale%.ChipNSil.TIP: Default ChipNDale%.NMosA.TIP: Default ChipNDale%.CMosA.TIP: Default ChipNDale%.CMosB.TIP: Default Tip tables can be layered, like for Tioga; Default extends to /indigo/ChipNDale/@/#%/ChipNDale#.TIP /indigo/ChipNDale/@/cd%/ChipNDale.TIP where @ is the Cedar version number, # the ChipNDale technology, % the ChipNDale release number. 4.4. Font user profile options Not all technologies support setting up fonts from the user profile. ChipNSil and CMosB do. The technology name is part of the user profile key. [No ChipNDale version number with those profile options] ChipNDale.ChipNSil.Font0: "Xerox/TiogaFonts/Helvetica10" ChipNDale.ChipNSil.Font2: "Xerox/TiogaFonts/Gates32" ChipNDale.ChipNSil.Font3: 20 "Xerox/PressFonts/Helvetica-bir" ChipNDale.CMosB.Font19: "Xerox/TiogaFonts/Symbol64" ChipNDale.CMosB.Font0: 4 "Xerox/TiogaFonts/Helvetica10" The user profile supports 20 fonts (per technology). The user profile designates the font used on creation of text objects; once a text is created, the user profile is no more consulted. Fonts may be scaled; defaulting the scale results in a scale of 1 lambda. If not defaulted, the scale factor is expressed in units; NOT in lambdas. (This allows users to specify fractional lambda font sizes) Try what the difference between TiogaFonts and PressFonts looks like. Fonts are searched using a full path name "Xerox/TiogaFonts/Helvetica8" is searched as ///Fonts/Xerox/TiogaFonts/Helvetica8.ks "Xerox/PressFonts/Gates-mrr" is searched as ///Fonts/Xerox/PressFonts/Gates-mrr.sd Do never use fonts which are not placed in the standard directory for fonts, nor use any private fonts; When a design is read in later, a non standard font may not be available and would be substituted. There is not much sense in putting italic fonts in the font menu; italization is easy; it works exactly like tioga comment nodes. 5. The Outside World 5.1. Necessary system Dorado with Cedar 7.0; If you need ChipNDale desparately, a DandeTiger might do... 5.2. DF files "%" stands for the current ChipNDale version number, right now 25 (meaning 2.5) but the zero is seldom written. "cc" stands for the Cedar release used for the ChipNDale version, (for ChipNDale 2.5 use 7.0, since ChipNDale 2.5 is programmed in Cedar 7.0. DF files for designers /DATools/DAToolscc/Top/CDDesign%.df /DATools/DAToolscc/Top/FooTool%.df where FooTool is the actual tool It might be good to create a separate subdirectory for ChipNDale; this allows you to remove it easily when you want to upgrade to a new version. You should run ChipNDale from the same subdirectory where you store it, so you get the correct default fonts, icons, colortables... (ChipNDale does not use servers as a default because they might be down.) DF files for programmers /DATools/DAToolscc/Top/CDCommon%.df /DATools/DAToolscc/Top/CDTables%.df /DATools/DAToolscc/Top/CDCMosB%.df /DATools/DAToolscc/Top/CDCMosA%.df /DATools/DAToolscc/Top/CDNMosA%.df /DATools/DAToolscc/Top/ChipNSil%.df DF files for documentation shared by different tools /DATools/DAToolscc/Top/CDDoc%.df Contains documentations how to use some further basic ChipNDale related tools and how to program extensions to ChipNDale. Other ChipNDale related tools have their documentation directly in their df file. 5.3. Distribution-lists on the Grapevine ChipNDaleImplementors^.pa The pure creatures reading your complaints, uh, suggestions; actually we really like to get suggestions. Unhappily it happened far more often that valuable suggestions were not made then that nonsense complaints made me. ChipNDaleUsers^.pa The user society. You get release messages, status reports and thereon. If you use ChipNDale for doing VLSI you probably should also be member of DAToolsUsers^.pa. ChipNDaleDiscussion^.pa Open forum for discussion. This list will also get all messages sent to ChipNDaleUsers^.pa and some more. DAToolsUsers^.pa The general design tool user society. You can avoid beeing a member in this list if you use ChipNDale only as an illustrator program. DAToolsImplementors^.pa Like ChipNDaleImplementors^.pa, but also for non ChipNDale related tools. Note: Lists are restricted to Xerox employees, part-time employes and PARC summer students. 6. Usage Hints How to make cell libraries fast and easy to access. 1) Put menu like arrangements of icons for inter design copy to the left. When ChipNDale automaticly places some junk down this will be to the right... 2) Put mainly the public icons on top level. Put internals and schematics nested inside some large organizational cells, and set the display treshold for those organizational cells to simplify display. This will make displaying for normal usage faster. The push into icon command will find schematics even if they are nested. Alternative: do not even make instances of the organizational cells; The push into icon command places an instance down if it does not find one. 3) Put an icon to the side of the schematics So users know that they are looking at the right schematics when they did not use the push into icon command. 4) Make instances of all the schematics in some organizational cell. So the library can be pruned easy. 5) Use a large grid, at least 2l. Use the same grid for most icons. If all icons use the same, large grid, placing wires will naturally come out easier and more exact. 6) To make icons easy to rotatable, make its interset size to be size = (n * g + w) where n is an integer g is size of grid (use a large grid), [e.g. 2l in CMosB] w is width of a wire [e.g. 4/8l in CMos-B] and follow next paragraph for connection points. 7) To make all the connection points easy accessible: Put the lower left corner of the icon onto a grid point, set ticks on, and, equal to grid. Define connection points to be squares of thickness w of wire material, aligned such that lower left corner of the connection points fit on a grid point. Draw wires such that they overlap the connection points but dont stick out. To make internal wires such that they overlap connection points on the right or top of the icon, either -use the "increase wire length by width" command in the special menu, or, -start drawing the wire in L mode and confirm just a segment [not the whole wire] and interupt the drawing of further segments by hitting any key. 8) Do not make to much structure within icons. Think at the redisplay time for icons. 9) Set the display treshold right for icons in the library. So the users don't have to. 10) To make the "menu" look nice, place those icons on an extra large grid. Use to move to grid. ChipNDaleDoc.tioga Created by: Christian Jacobi Last edited by: Bland, September 5, 1986 1:06:27 pm PDT Last edited by: Christian Jacobi, March 8, 1988 10:18:33 am PST Don Curry September 9, 1988 6:30:52 pm PDT -- Tells what menu table to use -- Using the following option will not make menus entries for the Core tools -- opens ChipNDale viewers on the color screen directly, if screen is empty -- controls creation of control panel viewers --or Right; this user profile option is shared with the ColorDisplay tool. -- include a list of ropes which will be stuffed to a commandtool whenever -- ChipNDale is started. (Before a technology is initialized). -- whenever the command "import all" is called, an import of design DesignName -- will cause the file FileName to be loaded. DesignName any identifier. -- DANGEROUS, better don't set to FALSE -- set to FALSE to help debugging, usually it is possible to continue -- DANGEROUS, better don't set to FALSE -- set carefully FALSE to help debugging, but -- if errors occur, you loose all your work which is not saved onto files this options specifies the default value for the technology specific AutoLoad options. With TechnologyKey one of CMosB, CMosA, NMosA, ChipNSil... used only to override defaults set by ChipNDale%.AutoLoad. Examples Êž– "cedar" style˜code•COMMENTTRUE™Kšœ™Kšœ4Ïk™7K™?K™*—Iblock˜LšÏs ˜ L•Mark centerFooteršž˜Ititlešœ ˜ Isubtitle˜3N˜N˜ Iauthorsšœ)˜)Iabstractšž9˜9PšÐmsžJŸ˜LPšÏb œ°˜¹P˜I boilerplateš ÏqœÏoœ¢œ¢œ¢Ñbox˜Žhead1˜J˜J˜'J˜Jšœ˜Jšœ˜J˜Jšœ˜Ibody˜Jšœ=˜=Sš œx˜ŠSš œŒ˜§Sš œ×˜îSš œÏ˜éSš  œ˜Sš œr˜‘ š œ˜SšœÈ˜È—S˜— šœ¤˜¤Sš œ˜/—S˜ ˜head˜ Sšœ Ðsuœ¡˜«Sšœê˜êSšœ˜˜˜SšœÀ˜ÀS˜InotešÏlœä˜å— šœ˜JšœL˜L šœ˜Tšœ0˜0TšœÍ˜ÍSšœº˜º— šœ˜ šœ_˜_ šœT˜TTš œ  œ  œ  œ˜9——Tšœ—˜—— šœ˜ šœ/˜/ š œ5˜7Tšœ=˜=—Tšœ¼˜¼— šœ1˜1Tš œ œ œ œv˜©———— ˜' ˜Sšœ˜— ˜SšœÈ˜ÈSšœî˜îSšœW˜WSšœW˜WSšœ·Ïi œ7¦ œ¦œ4¦ œ9¦ œû¦œ¦œ¦ œ˜·— ˜ S˜ä— ˜ Sšœæ˜æS˜ÿSšœ´˜´— ˜Sšœÿ˜ÿ— ˜Sšœ˜Sšœò˜ò—I pagebreak˜— ˜ ˜Sšœô˜ôS˜ŠS˜–SšœÓ˜Ó— ˜+ ˜ Lšœá˜áItable3š  œ,˜7Wš  œ˜ Wš  œ$˜0Wš  œ:˜FWš  œ ˜Wš  œ ˜Wš  œ/˜:Wš  œ˜)Wš  œ5˜@Wš  œ ˜Wš  œ˜Wš  œ ˜&Wš  œ ˜%Wš  œ ˜Wš  œ ˜Wš  œ  ˜Wš  œ ˜%Wš  œ ˜Wš  œ  ˜Wš  œ ˜W˜Wšœ¥˜¥Wš  œ>˜JWš  œ+˜7Wš  œ>˜JWš  œ&˜2Wš  œg ˜uWš  œ ˜&W˜UšœÞ˜Þ— šœ˜Lšœå˜åTšÏz*œ˜+Lšœa˜aJ˜Wš œ˜Wš œ˜Wš  œ˜Wš  œ˜Wš œ-˜5WšœK˜KWš ˜Wšœ  œB˜N—Tš§œ˜š¦ œ˜JšœC˜C—š¦œ˜ JšœZ˜Z—š¦œ˜Jšœ@˜@—š¦œ˜JšœM˜M—š¦œ˜Jšœ˜—˜Tš§œ˜šœí˜íšÐbz˜J˜—JšœU˜UJšÐfz˜˜Jš¥œ¥œ˜Jš¥œ¥œ˜J˜Jš¥œ¥œ˜Jš¥œ¥œ˜——J˜J˜QT˜—— ˜T˜itemš œØ˜ÜUšœÒ˜Ò—T˜Xš œk˜pT˜š  œY˜dUšœ1˜1—T˜š œ¨˜¯U˜Ý——head2˜%T˜Xšœð˜ðXšœZ˜ZXš  œ˜ Xš œ˜.Tšœ*˜*Xš  œ¢œG˜eXš  œ ¢œ6˜OTšœ ˜ Xš œ+˜:T˜Xš œa˜u— ˜T˜Xš œ¯˜µXš œU˜\Xš œ^˜eXš œ"˜'˜U˜ŠU˜e—X˜T˜X˜1š  œœ˜©X˜L˜ôJ˜Jšœ˜š œ˜Jšœ˜—Jš œ˜ Jš œ˜ š œ˜Jšœ1˜1—Jš œ ˜ Jš œÏuœ ˜J˜š œ˜J˜—Lšœë˜ëIdefault˜Lšœªœ/˜JL˜3LšœI˜ILšœÇ˜Ç—T˜ Xšœ˜Xš œ œ œ˜EXš œ# œ œ˜P ˜Lšœ˜˜˜J˜Jšœ˜Xšœ-˜-Xšœ˜Xšœ5˜5Xšœ2˜2Xšœ˜X˜Xšœ@˜@šœ>˜>U˜¨—˜Lšœªœ\˜w—J˜—T˜,Xš œt˜|— ˜T˜š œ˜3U˜ý—T˜Xš œ˜(Xš œ˜(Xš œ˜š œ˜ Z˜L˜»Z˜—Tšœ˜š œä˜ûU˜Ç—Tšœ˜Xš œ"Ðmuœ@˜|Xš œ5˜Nš œ7˜PZ˜L˜§Z˜—T˜š œ˜5J˜—Tšœ ˜ Xš œI˜N— ˜Ihead3šœ˜š *œÓ˜ýUšœ˜—— ˜:T˜ Xš œ˜Xš œ˜!šœ‰˜‰Lšœ‡˜‡— ˜Aš  ˜ X˜cX˜Ð˜L˜L———T˜ Xš œ– ˜ª[šœ  ˜ š œ$˜=Ušœ œ8˜M—[šœ  ˜š œ?˜XUšœÝ˜Ý—X˜T˜Xš  œn˜xT˜š  œï˜úX˜J˜9— ˜Xš  œ»˜ÅXš  œ­˜¸— ˜ Xš  œ‹˜–X˜ãX˜Z— ˜ Xš  œà˜ëXš œ˜—— ˜T˜ š œ  œ% œ—˜ÒU˜à—T˜Xš œ˜˜T˜Xš œÕ˜ãT˜'Xš  œ˜Xš œÓ˜çUšœB˜BT˜(Xš  œ,˜6T˜Xš  œv˜ƒT˜Xš  œM˜ZT˜Xš œh˜vT˜$—XšœL˜L ˜½T˜— ˜ IindentšœÉ œ ˜ÚT˜ š  œh˜rLšž{˜{X˜—T˜Xšœ$˜$T˜Xš œ9˜RXš  œ·˜ÀXš œ˜˜±X˜Xšœ÷˜÷X˜T˜ Xšœ‘¦ œ·˜ÒX˜ šœ ˜ Jš  ˜ ˜Jšœ˜Xš œ=˜KXš œÇ˜ÖXš œY˜kXš  œ3˜=Xš œ*˜>Xš œ˜!—— ˜Jš  ˜ ˜Jšœ˜Xš  œ˜Xš œ˜Xš œ˜Xš œ˜&Xš œ?˜PXš œ'˜-Xš œY˜jXš œ_˜mXš œ3˜BXš œ|˜”Xš  œ ˜)——— ˜ šœ˜S˜ƒS˜š  ˜ Sšœ6˜6Xš  œ˜‹Xš œ*˜8Xš œ*˜8Xš  œ­˜¸Xš œf˜mXš œ‘˜¡X˜˜J˜ƒJ˜ŒJ˜—šœ˜JšœÌ˜Ì——— šœ˜Tš œ|˜ƒLš œ©˜¯LšžÖ˜ÖLš œƒ˜”T˜—š  ˜ Sšœ ˜ Xš  œ­˜¸Xš œP˜eXš œš˜ªXš œf˜mXš œ‘˜¡Xš  œx˜…X˜J˜—L˜š !˜!L˜ÿL˜-—Lš œ˜J˜eš œ˜L˜—J˜—Lšœ¯˜¯L˜T˜ ˜ ˜ L˜ž— ˜š  œ$˜/˜)U˜¦U˜——š ˜X˜1—š œ  œ œ˜J˜Jš œ˜8Jš œ*˜FJ˜Jš  œ˜Jš œ˜$J˜Jšœà œš œc˜éJ˜Jšœ½˜½Jšœ†˜†J˜šœ˜JšœK˜KJšœ@˜@—Jšœ…˜…J˜Jšœ4˜4J˜— ˜Jš œ¿˜ÆJ˜Jš œÃ˜ËJ˜J˜TJ˜J˜ J˜J˜-J˜PJ˜ˆJ˜’J˜J˜$— šœ˜šœ¾˜¾L˜L˜—T˜2\˜\˜›\˜{\˜‰ ˜Jšœ˜˜˜J˜—— šœ˜Jšœè˜èJšœ“˜“J˜JšœÉ ˜ÊJ˜š ˜Jšœ»˜»—J˜Jš œ~˜†J˜Jš  œ˜J˜Jšœl  œ ˜}J˜Jš  œ˜!J˜Jš œN˜Vš œ˜˜J˜.J˜bJ˜_J˜Š—˜J˜HJ˜‚——Jš œ<˜ZJš œ9˜NJš œ9˜NJš  œ(˜3J˜J˜J˜ÞJ˜·J˜J˜þJ˜—T˜ šœ;˜;Jšœ2˜2Jšœ3˜3Jšœ5˜5J˜J˜*J˜Jš œÃ˜ËJ˜J˜Jšœô˜ôJ˜Jšœ; œ˜MJ˜J˜— šœ˜ šœ œ˜&TšœŒ˜Œ— šœ6˜6Jšœ ˜ J˜FV˜——— šœ˜\˜D ˜\˜G˜ \˜9—˜ \˜—— ˜˜4\˜8—— ˜˜\˜G—˜<\šœ%˜%\šœ?˜?\šœŠ˜Š˜ \šÏf œ˜\šœ®œ˜\šœ®œ˜\šœ®œ˜———˜šœ4˜4\šœŒ˜Œ\šœQ˜Q\šœu˜u——˜˜J˜$J˜aJ˜J˜ë—J˜—— šœ˜šœæ˜æJ˜\šœ˜—\šœ~¦œ_˜Þ šœ˜Xšœ!˜!Xšœ˜Xšœ˜Xšœ˜Xšœ˜X˜— šœ˜J˜šœ˜Iemptyšœ™JšœL™LJšœ2˜2—J˜šœ˜"]šœK™K—J˜šœ(˜(Jšœ.™.—J˜šœ˜JšœJ™J—J˜šœ˜JšœK™KJšœ>™>—J˜Jš ˜J˜šœ*˜*JšœO™OJšœI™I—J˜Jš  ˜ J˜šž#˜#Jšž'™'JšžE™E—J˜šž-˜-Jšž'™'Jšž-™-JšžI™I—J™— šœ-˜-JšœØ˜ØJ˜š ˜J˜TJ˜šœ ¦œ ˜JšœV™V—J˜Jšœ$˜$J˜šœ¦ œ˜(š¦aœ ¦œ ¦™uJ™———J˜Jš  ˜ J˜Jšœr˜rJ˜Jšœ ¦œ˜ Jšœ ¦œ˜Jšœ ¦œ˜šœ ¦œ˜J™J˜+Jšœ˜JšœK˜Kšœ˜Jšœ˜Jšœ˜Jšœ˜——— šœ˜JšœÌ˜ÌJšœ˜Jšœ™™Jšœ8˜8Jšœ4˜4Jšœ=˜=Jšœ3˜3Jšœ7˜7—J˜Jšœ½˜½J˜JšœÒ˜ÒJ˜J˜EJ˜šœ)˜)JšœT˜TJšœR˜R—J˜JšœÌ˜ÌJ˜Jšœƒ˜ƒJ˜J˜—— ˜ šœ˜SšœR˜R— šœ ˜ Lšœo˜oLšœÏmœŠ˜ šœ˜Sšœ¯œ˜#Sšœ¯œ4˜FLšœß˜ß—Tšœ˜Sšœ¯œ˜#Sšœ¯œ˜#Sšœ¯œ˜"Sšœ¯œ˜"Sšœ¯œ˜"Sšœ¯œ˜#Tšœ4˜4Sšœ¯œ˜ LšœÌ˜Ì— šœ(˜( šœ˜XšœÝ˜Ý— šœ˜Xšœ¥˜¥— šœ˜Xšœj˜j— šœ˜Xšœˆ˜ˆ— šœ˜XšœK˜KT˜—Jšœ[˜[J˜——Ršœ˜Jš 3˜3J˜šœD ˜IJ˜N—šœ,˜,Jšœž˜žJšœ‡˜‡Jšœ‘˜‘—˜,Jšœm˜m—šœD˜DJ˜"—šœÏgœ&˜FJšœc˜c—˜BJ˜˜J˜Jšœ-°œ°˜8Jšœ°œ ˜+—J˜0—˜5J˜ZJšœæ˜æšœg˜gJšœ ¦œ"˜IJ˜’——˜/J˜&—˜;J˜—˜MJ˜6J˜——…—ùè