        Xml Technology Files in Electric Version 8.06

Layout technologies in Electric are described by Xml technology files.
These files can be edited graphically by the technology editor.
Some users may prefer to edit Xml technology files as text.
Here is a descriptor of the technology file format for these users.

Electric version 8.06 has Xml technology files that are unparameterized
(all values are explicitly entered, no symbolic information).
Technology distances are specified as double-precision numbers in display units.
Future versions of Electric may implement a symbolic style of Xml technology files.

Currently technology files contain two kinds of information:
1) Electric-independent information.
   This includes physical and electrical details of the foundry process.
   Most of these details are attached to Layers and includes
   design rules, simulation information, etc.
2) Electric-specific information.
   This includes the primitive nodes and arcs that Electric uses for design.
   It also has connectivity rules, display and print styles,
   component menus for the technology, etc.

Primitive nodes and arcs can be considered to be layout macros.
Node description consists of a set of two-dimentional shapes.
Arcs description consists of a set of one-dimentional intervals, which are stretched in the other dimension.
The technology file describes primitive nodes and arcs of a standard size (usually
the DRC minimum) and also includes information about how they can grow larger.
Instances of these nodes and arcs in Libraries can be larger than standard.

A primitive nodes or arc can consists of many shapes in different technology Layers.
Each shape in a primitive node is called a 'NodeLayer'.
Each interval in a primitive arc is called an 'ArcLayer'.

The Minimum Bounding Box (MBB) of all NodeLayers of a primitive node is called its 'FullRectangle'.
Description of a primitive node can also define the 'FullRectangle' explicitly.
The largest of all ArcLayers in a primitive arc defines its 'FullWidth'.

Primitive nodes and arcs also have the notion of a 'BaseRectangle' and a 'BaseWidth'.
They relate to the shape of the most important layer in this node or arc.
The 'BaseRectangle' of a primitive node is described explicitely.
The 'BaseWidth' of primitive arc is the width of the first 'ArcLayer' in the arc description.
The 'BaseRectangle' and 'BaseWidth' are highlighed in the EditWindow and they appear
in Properties dialogs.

Instances of nodes and arcs in a library can have sizes larger than standard.
Electric writes size information of each instance in the library files.
Since release 8.05 of Electric (or more precisely since the 8.05o development version)
library files contain the extent of the node/arc over its standard size
described in the technology file.  When you switch a design library from one technology
to another compatable technology, the standard size node/arc in old technology is
converted to the standard size node/arc in the new technology. The node/arc which extends
by 1 unit beyond the standard node/arc in old technology is converted to a node/arc which
extends by 1 unit beyond the standard node/arc in new technology.

Older Electric releases wrote sizes of node/arc instances in another way.
Jelib format before Electric 8.05 (actually, the 8.05g developement version) and all Elib files
saved the size of the 'FullRectangle' and 'FullWidth'.
Jelib format between 8.05g and 8.05n wrote sizes of 'BaseRectangle' and 'BaseWidth'.
The 'Full' and 'Base' sizes can be redefined in future versions of technology file.  To be
able to read older Jelib formats correctly after redefinition of 'Full' and 'Base',
Technology file can containe explicit sizes of standard nodes and arcs in older library files.

All sizes in technology files are in display units. There is a scale declaration which
relates this unit to nanometers.

======================== Version 8.06 =================================================

Here is a description of Xml technology file in Electric relreases 8.05 and 8.06.

----------------------------------------

<technology> is the main element of the Xml technology file. It has many Xml-specific attributes:
    "name" contains the name of this technology inside Electric.
    "class" (optional) contains the name of a Java class which is a subclass of "com.sun.electric.technology.Technology".
        It can be used to describe things which are not described by the Xml technology class yet.
        The interface with this class is not specified and can be changed.
        If you need a non-standard technology feature, the better way is to contact Electric developers about this.
    Example:
        <technology name="mocmos" class="com.sun.electric.technology.technologies.MoCMOS"
             xmlns="http://electric.sun.com/Technology"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://electric.sun.com/Technology ../../technology/Technology.xsd">
    Inside of the <technology> element are these subelements:
        <shortName> a more descriptive name for the technology (optional)
        <description> the most descriptive name for the technology
        <version> describes Electric versions when Jelib changed and how it affects sizes.
            The "tech" attribute contains an identifier of this version used in subsequent <diskOffset> subelements
            of <arcProto> and <primitiveNode> descriptions. The "electric" attribute is a corresponding Electric version.
            These elements are usually fixed in all technology files.
            Examples:
                <version tech="1" electric="8.05g"/>
                <version tech="2" electric="8.05o"/>
        <numMetals> describes a possible range for the number of metall layers in the technology.
            There is no good support for Xml technology files with a variable number of metal layers.
            Therefore, this element should contains the same value for all three attributes.
            Example:
                <numMetals min="6" max="6" default="6"/>
        <scale> defines how many nanometers are in a display unit.
            Electric uses dimensionless "units" in its interface, where a transistor may be "2x3"
            without specifying actual distances.  This scale converts the units to real spacings.
            The "relevant" attribute should be true for layout technologies.
            Example:
                <scale value="200.0" relevant="true"/>
        <defaultFoundry> is a name of the default foundry for this technology.
            The name references one of the <foundry> elements found later in the Xml file.
            Example:
                <defaultFoundry value="MOSIS"/>
        <minResistance> - global minimum resistance (for parasitics)
            Example:
                <minResistance value="4.0"/>
        <minCapacitance> - global minimum capacitance (for parasitics)
            Example:
                <minCapacitance value="0.1"/>
        <transparentLayer> defines the transparent layers in the technology.  All layers can be drawn
            in either a "transparent" or "opaque" style.  Transparent layers can overlap other transparent
            layers without obscuring each other (they blend where they overlap).  Opaque layers cover all
            other layers without blending.  Because the system needs to store all combination of transparent
            layers, it is not possible to make every layer transparent.  Instead, less-used layers should
            be opaque and use a stipple-pattern so that they do not cover everything.
            This element lists the number of transparent layers, and provides the color of each.  The system
            automatically determines the blending colors where multiple transparent layers overlap.
            Example:
                <transparentLayer transparent="1">
                    <r>96</r>
                    <g>209</g>
                    255
                </transparentLayer>
         a list of layer descriptions (see below).
        <arcProto> a list of primitive arc descriptions (see below).
        <primitiveNode> a list of primitive node descriptions (see below).
        <spiceHeader> default spice models.
        <menuPalette> description of the default component menu (optional).
        <foundry> information for the Foundry. Each has default DRC rules and default GDS mapping.

----------------------------------------

 elements define layers in the technology.  They contains these attributes:
    "name" the name of this layer. Layer names are not referenced in Library files.
        They are used only in the description of primtive nodes and arcs and in DRC rules.
    "fun" the function of this layer, taken from this list:
       UNKNOWN
       METAL1 METAL2 METAL3 METAL4 METAL5 METAL6
       METAL7 METAL8 METAL9 METAL10 METAL11 METAL12
       POLY1 POLY2 POLY3
       GATE
       DIFF DIFFP DIFFN
       IMPLANT IMPLANTP IMPLANTN
       CONTACT1 CONTACT2 CONTACT3 CONTACT4 CONTACT5 CONTACT6
       CONTACT7 CONTACT8 CONTACT9 CONTACT10 CONTACT11 CONTACT12
       PLUG OVERGLASS
       RESISTOR CAP
       TRANSISTOR
       EMITTER BASE COLLECTOR SUBSTRATE
       WELL WELLP WELLN
       GUARD SOLATION
       BUS ART
       CONTROL
       TILENOT
    "extraFun" optional functions for this layer, taken from this list:
       nonelectrical
       connects-metal connects-poly connects-diff
       heavy light depletion_heavy depletion_light enhancement_heavy enhancement_light
       vt
       thick
       native
    Example:
        
    Inside of the  element are these subelements:
        <transparentColor> - the transparent color to use (if omitted, this is an opaque layer).
        <opaqueColor> - the opaque color to use.
        <patternedOnDisplay> - true to use the <pattern> when drawing on the screen.
        <patternedOnPrinter> - true to use the <pattern> when printing.
        <pattern> - the stipple pattern to use (if requested on either the screen or printed page).
        <outlined> - true to outline the layer (sensible only for patterned layers).
        <opacity> - intensity of this layer (from 0 to 1).
        <foreground> - true to place this layer in the foreground.
        <display3D> - defines thickness and height above the substrate for 3D display and parasitics.
            The element has these attributes:
            "thick" - 3D thickness of the layer in display units
            "height" - 3D height of the bottom of the layer in display units
            "mode" - 3D display style
            "factor" - 3D display style
            Example:
                <display3D thick="0.75" height="15.75" mode="NONE" factor="0.2"/>
        <cifLayer> - CIF layer name.
        <skillLayer> - Skill layer name.
        <parasitic> - parasitic extractor subelements.
        <pureLayerNode> - description of the pure-layer node for this layer.
            This node is used to represent arbitrary polygons of this Layer.
            It is also used when importing from external formats like GDS.
             The standard pure-layer node has zero FullRectangle and BaseRectangle.
             So library files contain exact geometric information for instances of pure-layer node.
             All the shape of pure-layer node is considered a port shape of the single port of the node.
             There are these optional subelements:
                 <oldName> if the pure-layer node has another name in older versions of the technology
                 <lambda> the default width of this pure-layer-node when it is placed manually
                 <portArc> the list of arc names which can connect to this pure-layer node
             Example:
                 <pureLayerNode name="Transistor-Poly-Node" port="trans-poly-1">
                     <lambda>2.0</lambda>
                     <portArc>Polysilicon-1</portArc>
                 </pureLayerNode>

----------------------------------------

<arcProto> elements describe primitive arcs in the technology.  They have these attributes:
    "name" is the name of the arc prototype.
        The instances of the primtive arc in Electric libraries reference this name.
    "fun" describes the arc function:
        UNKNOWN
        METAL1 METAL2 METAL3 METAL4 METAL5 METAL6
        METAL7 METAL8 METAL9 METAL10 METAL11 METAL12
        POLY1 POLY2 POLY3
        DIFF DIFFP DIFFN DIFFS DIFFW
        BUS
        UNROUTED NONELEC
    Example:
        <arcProto name="P-Active" fun="DIFFP">
    Inside of the <arcProto> element are these subelements:
        <oldName> - the name of this primitive arc in previous versions of the technology (optional).
        <wipable> - flag to mark that the arc erases its pins. This flag is usually present in layout technologies.
        <curvable> - flag to described round arcs. It is not supported in the current implementation.
        <special> - flag related to the component menu.
        <skipSizeInPalette> - flag related to the component menu.
        <notUsed> - flag to forbid use of this primtive arc in libraries.
        <extended> - default state of end-extension for this arc.
        <fixedAngle> - default state of the fixed-angle constraint on this arc.
        <antennaRatio> - value used by the ERC tool.
        <diskOffset> - tells how sizes were written in older library files.
            The attribute "untilVersion" references the "tech" attribute of the <version> element above.
            This disk offset is applied to Jelib libraries with Electric versions prior to the "electric" attribute
            of that <version> element.  Attribute <width> is actually half of the value written to Jelib file.
            For example, the "P-Active" arc described above will be: 
                15.0 wide with Jelib prior to Electric version "8.05g";
                3.0 wide with Jelib prior to Electric version "8.05o";
                0.0 wide with Jelib in Electric versions since "8.05o".
            More formally:
                Let "a.extend" be the internal value associated with the arc instance in the Electric database.
                The value written to libraries prior to "diskOffset.untilVersion" was "2*(a.extend + diskOffset.width)".
                The <diskOffset> element is necessary only in legacy technologies.
            Example:
                <diskOffset untilVersion="1" width="7.5"/>
        <defaultWidth> - factory default value of arc width. This element is not used now and should be omitted.
        <arcLayer> - a list of ArcLayers that comprise this Arc.
            The attribute "layer" references the layer of the ArcLayer.
            The attribute "style" is either "FILLED" or "CLOSED". Layout arcs should be "FILLED".
            The <lambda> subelement describes extent (half width) of the ArcLayer from the central line of the arc.
            More formally:
                Let "a.extend" be the internal value associated with the arc instance in the Electric database.
                The width of the "P-Select" <arcLayer> below is "2*(a.extend + 3.5)"
                The FullWidth of the arc instance is the width of the widest ArcLayer.
                It is "2*(a.extend + 7.5)" in the above "P-Active" arc.
                The BaseWidth of the arc instance is the width of the first ArcLayer in the list.
                It is "2*(a.extennd + 1.5)" in the above "P-Active" arc.
            Example:
                <arcLayer layer="P-Select" style="FILLED">
                    <lambda>3.5</lambda>
                </arcLayer>
    Example:
        <arcProto name="P-Active" fun="DIFFP">
            <wipable/>
            <extended>true</extended>
            <fixedAngle>true</fixedAngle>
            <angleIncrement>90</angleIncrement>
            <antennaRatio>200.0</antennaRatio>
            <diskOffset untilVersion="1" width="7.5"/>
            <diskOffset untilVersion="2" width="1.5"/>
            <arcLayer layer="P-Active" style="FILLED">
                <lambda>1.5</lambda>
            </arcLayer>
            <arcLayer layer="N-Well" style="FILLED">
                <lambda>7.5</lambda>
            </arcLayer>
            <arcLayer layer="P-Select" style="FILLED">
                <lambda>3.5</lambda>
            </arcLayer>
        </arcProto>

----------------------------------------

<primitiveNode> elements describe primitive node in the technology.  They have these attributes:
    "name" is the name of the node prototype.
        Instances of this primtive node in Electric libraries reference this name.
    "fun" describes the node function:
        UNKNOWN
        PIN
        CONTACT
        NODE
        CONNECT
        TRANMOS TRADMOS TRAPMOS
        TRANPN TRAPNP
        TRANJFET TRAPJFET
        TRADMES TRAEMES
        TRANSREF
        TRANS
        TRA4NMOS TRA4DMOS TRA4PMOS
        TRA4NPN TRA4PNP
        TRA4NJFET TRA4PJFET
        TRA4DMES TRA4EMES
        TRANS4
        RESIST PRESIST WRESIST ESDDEVICE
        CAPAC ECAPAC
        DIODE DIODEZ
        INDUCT
        METER
        BASE EMIT COLLECT
        BUFFER GATEAND GATEOR GATEXOR
        FLIPFLOPRSMS FLIPFLOPRSP FLIPFLOPRSN
        FLIPFLOPJKMS FLIPFLOPJKP FLIPFLOPJKN
        FLIPFLOPDMS FLIPFLOPDP FLIPFLOPDN
        FLIPFLOPTMS FLIPFLOPTP FLIPFLOPTN
        MUX
        CONPOWER CONGROUND
        SOURCE
        SUBSTRATE WELL
        ART
        ARRAY
        ALIGN
        CCVS CCCS VCVS VCCS
        TLINE
    Example:
        <primitiveNode name="Metal-1-Metal-2-Con" fun="CONTACT">
    Inside of the <primitiveNode> element are these subelements:
        <oldName> optional name of this primitive node in previous versions of the technology.
        <shrinkArcs> flag to shrink arcs connected to the node.  This flag should be "on" only for PIN nodes.
        <square> flag to restrict the node to be square. It is used in round layout technologies.
        <canBeZeroSize> flag to allow the size to become zero (not used in layout technologies).
        <wipes> flag which is not used in layout technologies.
        <lockable> flag which is used in arrayed technologies (like FPGA).
        <edgeSelect> flag which is not used in layout technologies.
        <skipSizeInPalette> flag related to the component menu.
        <notUsed> flag to forbid use of this primtive node in libraries.
        <lowVt> flag to mark a low vt transistor.
        <highVt> flag to mark a high vt transistor.
        <nativeBit> flag to mark a native transistor.
        <od18> flag to mark an od18 transistor.
        <od25> flag to mark an od25 transistor.
        <od33> flag to mark an od33 transistor.
        <diskOffset> tells how sizes were written in older library files.  It has these attributes:
            "untilVersion" references the "tech" attribute of <version> elements above.
            This disk offset is applied to Jelib libraries with Electric version prior to "electric" attribute
            of that <version> element. Attributes <x> and <y> are actually half of the values written to Jelib file.
            So the "Metal-1-Metal-2-Con" node example shown below will be written: 
                5.0 width/height with Jelib prior to Electric version "8.05g";
                4.0 width/height with Jelib prior to Electric version "8.05o";
                0.0 width/height with Jelib in Electric versions since "8.05o".
            More formally:
                Let "n.extendX" and "n.extendY" be the internal values associated with the node instance in the Electric database.
                The values written to library prior to "diskOffset.untilVersion" were
                   "2*(n.extendX + diskOffset.x)" and "2*(n.extendY + diskOffset.y)".
            The <diskOffset> element is necessary only with legacy technologies.
            Example:
                <diskOffset untilVersion="1" x="2.5" y="2.5"/>
        <defaultWidth> and <defaultHeight> factory default values of the node size.
            The subelement <lambda> contains the value of extendX/extendY in display units.
            Usually these elements are omitted because the default values of extendX and extendY are 0.
            So, the factory defaults of extendX and extendY are defaultWidth.lambda and defaultHeight.lambda
            The factory defaults of BaseWidth and BaseHeight are
                BaseRectangle.width + 2*defaultWidth.lambda and BaseRectangle.height + 2*defaultHeight.lambda .
            The factory defaults of FullWidth and FullHeight are
                FullRectangle.width + 2*defaultWidth.lambda and FullRectangle.height + 2*defaultHeight.lambda .
        <sizeOffset> defines the BaseRectangle of the node
            The attributes "lx", "hx", "ly", and "hy" are offsets from the FullRectangle to the BaseRectangle
            The BaseRectangle is
                [x = FullRectangle.minX + sizeOffset.lx, y = FullRectangle.minY + sizeOffset.ly]
            and
                [x = FullRectangle.maxX - sizeOffset.hx, y = FullRectangle.maxY - sizeOffset.hy]
            If the <sizeOffset> element is omitted then the BaseRectangle is the same as the FullRectangle.
        <nodeLayer> a list of NodeLayers (described below).
        <primitivePort> a list of primitive ports on the node.
            The "name" attribute describes the port name.
            To make a library conversion from one technology to another it would help
            to unify port names in some manner.
            Port names of single-port nodes are not very important because the library reader
            can unambiguously connect arcs to the renamed port.
            However, port names of transistors could have compatable names like
            "poly-top", "poly-bottom", "diff-left", "diff-right".
            <primtivePort> has these subelements:
                <portAngle> can restrict direction of arcs which can connect to this port
                <portTopology> is a small integer that is unique among PrimitivePorts on the PrimitiveNode.
	                When two PrimitivePorts have the same topology number, it indicates that these ports are connected.
                <box> a rectangle which constraints the position of end point of connected arc
                <portArc> a list of primitive arcs from this technology which can connect to this port
            Example:
                <primitivePort name="metal-1-metal-2">
                    <portAngle primary="0" range="180"/>
                    <portTopology>0</portTopology>
                    <box>
                        <lambdaBox klx="-1.0" khx="1.0" kly="-1.0" khy="1.0"/>
                    </box>
                    <portArc>Metal-1</portArc>
                    <portArc>Metal-2</portArc>
                </primitivePort>
        <serpTrans> marks this node as serpentine transistor. It supplies 6 special values.
        <polygonal> marks that this node can be an arbitrary polygon. Usually is not used in layout technologies.
        <minSizeRule> overrides the FullRectangle of the node and supplies the name of a minimal size rule
            The attributes "width" and "height" describe the size of the FullRectangle.
            The attribute "rule" is the name of minimal size rule. 
            By default the FullRectangle is calculated as the MBB of all points found in the NodeLayers of a standard primitive node.
            For the "Metal-1-Metal-2-Con" node example shown below, the FullRectangle is calculated as a box with endpoints
                [x = -2.0, y = -2.0] and [x = 2.0, y = 2.0].
            The FullBox of a node instance with n.extendX and n.extendY is:
                [x = FullRectangle.minX - n.extendX, y = FullRectangle.minY - n.extendY]
            and
                [x = FullRectangle.maxX + n.extendX, y = FullRectangle.maxY + n.extendY]
            This may be not accurate if shapes which made the MBB of the standard-size node grows more slowly than
            other shapes when extents are increased.
            The <minSizeRule> element defines the FullRectangle manually as a rectangle with its center at the origin.
            The FullRectangle in the presence of <minSizeRule> is
                [x = -0.5*minSizeRule.width, y = -0.5*minSizeRule.height]
            and
                [x = +0.5*minSizeRule.width, y = +0.5*minSizeRule.height]
            This element defines FullRectangle of the "Metal-1-Metal-2-Con" as
                [x = -2.5, y = -2.5] and [x = 2.5, y = 2.5]
            Example:
                <minSizeRule width="5.0" height="5.0" rule="8.3, 9.3"/>
        <spiceTemplate> optional spice template of this node
    Example:
        <primitiveNode name="Metal-1-Metal-2-Con" fun="CONTACT">
            <diskOffset untilVersion="1" x="2.5" y="2.5"/>
            <diskOffset untilVersion="2" x="2.0" y="2.0"/>
            <sizeOffset lx="0.5" hx="0.5" ly="0.5" hy="0.5"/>
            <nodeLayer layer="Metal-1" style="FILLED">
                <box>
                    <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
                </box>
            </nodeLayer>
            <nodeLayer layer="Metal-2" style="FILLED">
                <box>
                    <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
                </box>
            </nodeLayer>
            <nodeLayer layer="Via1" style="FILLED">
                <multicutbox sizex="2.0" sizey="2.0" sep1d="3.0" sep2d="3.0">
                    <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
                </multicutbox>
            </nodeLayer>
            <primitivePort name="metal-1-metal-2">
                <portAngle primary="0" range="180"/>
                <portTopology>0</portTopology>
                <box>
                    <lambdaBox klx="-1.0" khx="1.0" kly="-1.0" khy="1.0"/>
                </box>
                <portArc>Metal-1</portArc>
                <portArc>Metal-2</portArc>
            </primitivePort>
            <minSizeRule width="5.0" height="5.0" rule="8.3, 9.3"/>
        </primitiveNode>

----------------------------------------

<nodeLayer> elements describe NodeLayers in the primitive nodes.  They have these attributes:
    "layer" references the layer of the NodeLayer.
    "style" is either "FILLED", "CLOSED" or "CROSSED".
        Layout nodes should be "FILLED".  "CROSSED" is used only with pins.
    "portNum" relates a primitive port to this NodeLayer. It is the 0-based index
        of the <primitivePort> subelement of <primitiveNodeElement>. Negative values mean that this NodeLayer
        is not related to any port.
        If this attribute is omitted, the first primitive port in the list is chosen. 
    "electrical" marks this NodeLayer be used only in either electrical or non-electrical node layers.
        For example a transistor's Polysilicon is defined with electrical layers as a gate-poly and two poly-ends.
        The same transistor's Polysilicon is defined with one long stripe in non-electrical layers.
        If this attribute is omitted, the NodeLayer appears in both electrical and non-electrical lists.
        This feature may be removed in future Electric versions.
        So the recommended style is to define NodeLayers of a transistor in electrical style and
        to omit "electrical" attribute in NodeLayers.
    Example:
        <nodeLayer layer="Metal-2" style="FILLED">
    Inside of the <nodeLayer> element are these subelements:
        <box> defines a rectangular shape.  It has attributes "klx", "khx", "kly", and "khy".
            If these attributes are omitted, their default values are "klx=-1", "khx=1" "kly=-1" "khy=1".
        There is also a subelement <lambdaBox> which has attributes "klx", "khx", "kly", and "khy".
        Attributes of a <lambdaBox> describe the shape of the NodeLayer on a standard size node.
        Attributes of a <box> describe how this shape grows when the node instance is larger than standard.
        More formally:
            Let "n.extendX" and "n.extendY" be the internal values associated with the node instance in the Electric database.
            The shape of the <nodeLayer> with <box> shape is a rectangle with endPoints:
                [x = lambdaBox.klx + n.extendX*box.klx, y = lambdaBox.kly + n.extendY*box.kly]
            and 
                [x = lambdaBox.khx + n.extendX*box.khx, y = lambdaBox.khy + n.extendY*box.khy]
            For example, the shape of the "Metal-2" NodeLayer below is a rectangle with endPoints:
                [x = -2 - n.extendX, y = -2 - n.extendY] and [x = 2 + n.extendX, y = 2 + n.extendY]
            Example:
                <nodeLayer layer="Metal-2" style="FILLED">
                    <box>
                        <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
                    </box>
                </nodeLayer>
        <points> is followed by <techPoint> elements which describe vertices of a polygon.
            <techPoint> elements have attributes "xm", "xa", "ym", and "ya" which define a point:
                [x = techPoint.xa + 2*n.extendX*techPoint.xm, y = techPoint.ya + 2*n.extendY*techPoint.ym]
            Notice that meaning of techPoint.xm and techPoint.ym is inconsistent with meanding of box.klx, box.khx, box.kly, box.khy .
        <multicutbox> - a rectangular region where centers of contact-cuts are placed in a uniformly spaced array.
            This is similar to <box>, but it has additional attributes:
                "sizex" and "sizey" describe the size of a contact cut.
                "sep1d" describes the separation between contact cuts in a one-dimensional array.
                "sep2d" describes the separation between contact cuts in a two-dimentional array.
            The centers of contact cuts are constrained to be in the box defined by the <lambdaBox> subelement
            and multicutbox's attributes "klx", "khx", "kly", and "khy".
            The NodeLayer of a "Via1" layer on a standard size node will generate a single contact cut of size 2x2 with
            the center in origin.
            When the n.extendX >= (2.0 + 3.0)/2 = 2.5 or n.extendY >= 2.5 then the NodeLayer will generate
            more contact cuts.
            Example:
                <nodeLayer layer="Via1" style="FILLED">
                    <multicutbox sizex="2.0" sizey="2.0" sep1d="3.0" sep2d="3.0">
                        <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
                    </multicutbox>
                </nodeLayer>
        <serpbox> a box used in serpentine transistors.  It is similar to <box>, but it has additional attributes
            "lWidth"
            "rWidth"
            "tExtent"
            "bExtent"

======================== Version 8.07 =================================================

This text is a draft suggestion for the definition of the Technology Xml syntax in future Electric
releases.

The syntax is being protyped by
    com/sun/electric/technology/xml/Technology807.xsd - syntax of Xml language
    com/sun/electric/technology/xml/Xml807.xsd - reader/writer of Xml language
    com/sun/electric/technology/technologies/mocmos807.xml - an example in this syntax
but currently they are not at their final syntax.

Technology description will be in symbolic form, where distances are expressed
by the Xml construct "Distance".
Distance is a linear expression which is a sum of terms.
There is an arbitrary number of variable terms and an optional constant term.

<xsd:group name="Distance">
    <xsd:sequence>
        <xsd:element name="rule" minOccurs="0" maxOccurs="unbounded">
            <xsd:complexType>
                <xsd:attribute name="ruleName" type="tns:RuleName" use="required"/>
                <xsd:attribute name="layer" type="tns:LayerName">
                <xsd:attribute name="layer2" type="tns:LayerName">
                <xsd:attribute name="k" type="xsd:double"/>
            </xsd:complexType>
        </xsd:element>
        <xsd:element name="lambda" type="xsd:double" minOccurs="0"></xsd:element>
    </xsd:sequence>
</xsd:group>

The constant term is a double-precision value in display units.
The variable term is a name of a variable and constant double multiplier "k".
The name of the variable is either simple name "ruleName" or
"ruleName" indexed by one or two layers.

Examples of terms are
    <rule ruleName="width" layer="P-Active" k="0.5"/>
    <rule ruleName="overhang" layer="P-Select" layer2="P-Active">
    <lambda>3.0</lambda>

A construct to define values of rules indexed by layer is <layerRule>.
It has ruleName and a map from layers to Distance expressions.
For example:
    <layerRule ruleName="width">
          <rule ruleName="7.1"/>
          <rule ruleName="9.1"/>
    </layerRule>

There will be a section in <foundry> which defines foundry specific rules, for example:
    <Foundry name="SUBM">
        <ruleDef ruleName="7.1" value="3.0"/>
    </Foundry>

Some layer rules are used implicitly. They are:
    <rule name="width" layer="layerName"/>     used as default width of pure layer nodes
    <rule name="thick3d" layer="layerName"/>   used in Display3D and (possibly) in parasitics extraction
    <rule name="height3d" layer="layerName"/>  used in Display3D and (possibly) in parasitics extraction
