Change Log 2026
Contents for 2025 can be found here
Version 6.0.20 release on 5/1/2026
- enhancement: Net Browser highlight net cmd uses wider width for nets to make them more easily visible on schematics.
- bugfix: pin obstructions not handled correctly in schematic autorouter.
Version 6.0.21 release on 23/1/2026
- bugfix: fixes to improve schematic autorouter.
- enhancement: Display cursor coords in dbu (as opposed to microns) is now saved to settings file.
- bugfix: Import Calibre error file did not clear existing error markers; now it does.
- bugfix: Net tracer did not always trace through hierarchy.
- bugfix: Drawing hilite of a polygonal shape did not transform the polygon.
- bugfix: Net tracer did not always trace across abutting shapes.
- bugfix: Switching tab windows caused the viewport to be reset to the whole design in Windows; now the viewport is maintained.
- enhancement: Added a selection dialog option to display selected instance contents undimmed when dimming unslected was set.
Version 6.0.22 release on 08/2/2026
- bugfix: Import Skill crashed parsing TSMC28 techfile.
- enhancement: Add layer properties parsing to Skill techfiles.
- enhancement: Better reporting of incorrect labelling (net shapes which have different text labels) during extraction.
Version 6.0.23 release on 19/2/2026
- bugfix: Setting bindkeys to an empty string left them unsettable.
- enhancement: Duplicating bindkeys now gives warning and does not create duplicate.
- bugfix: documentation for ui::importGds2() missed a parameter.
- bugfix: Executing a python script with funcs that referenced other funcs failed with 'undefined function' due to error in global/local dict setting.
Version 6.0.24 release on 05/05/2026
- bugfix: Cadence techfile parser crash reading tsmcN16 techfile.
Version 6.0.25 release on 24/07/2026
- bugfix: minArea read from techfile was getting multiplied by dbu, not dbu*dbu.
Version 6.0.26 release on 09/08/2026
- bugfix: Trace Net cmd allowed labels as seed shapes, and very rarely a text on the same layer as a connect layer would cause a short.
- bugfix: Trace Net cmd speedup by ~20%.
Version 6.0.27 release on 26/09/2026
- bugfix: A fairly significant bug in the tiling algorithm for booleans fixed, which could result in false positives and/or memory corruption.
Version 6.1.0 release on 3/10/2026
- Enhancement: New documentation scheme
Version 6.1.1 release on 13/10/2026
- Bugfix: Wiring devices in schematic would show an incomplete net (shown as a dotted yellow any angle line) when the target was a pin in a device. This was because the obstacle model was not allowing access to the pin.
- Bugfix: Moving instances showed incomplete nets connected to their pins. The problem was similar i.e. the obs map of the moving instance did not have cutouts for its pins.
- Bugfix: Yanks/Paste: the pasted object(s) were not under the cursor, they were insitially shown at the coordinate where the yank was made. Now they are pasted starting at the mouse cursor.
- Bugfix: Using the rotate keys (r/x/y) while in a paste command gave an incorrect paste position.
- Bugfix: Create Pin sometimes showed the moving pin shape to be different from the cursor position.
- Bugfix: DRC area checks (minimum area, area inside a range and hole area) could read past the end of a layer's edges, which could crash with a bus error on large merged layers. Shapes with holes could also overrun the checks' working space.
- Bugfix: Export DEF wrote a pin with several shapes (e.g. VDD, VSS) as several pins with the same name, which is not legal DEF, so Floorplan->Place Cells failed with "DEF parser returns an error" from the placer. The extra shapes are now written as NAME.extra1, NAME.extra2 etc., as Import DEF expects. Reading the placement back also kept only the last shape of such pins; now it keeps them all.
- Enhancement: Global router (Floorplan->Route->Global Route). The design is divided into gcells; each net gets a Steiner tree, split into two-pin segments that are pattern routed shortest first. Segments crossing overflowed gcell edges are then ripped up and rerouted with a maze router, with history costs and a growing overflow penalty, until there is no overflow or it stops improving, and a layer is assigned to each part of each segment. The result is shown as a congestion map, and Display Globally Routed Net shows a net's route. Scripted with ui().globalRoute().
- Enhancement: Detail router (Floorplan->Route->Detail Route). Each net is routed with a multi-layer A* search on the layers' tracks, inside the gcells of its global route, and the wires and vias are written into the design. Multi-pin nets are grown as trees from pin access points worked out for each cell. Failed connections are retried in a larger area, then rip-up and reroute and pin-clearing passes route the nets still failing. Routing keeps the layer spacing, avoids end of line violations and patches pieces under the minimum area, using other via orientations where the default via would break a rule; optionally it keeps the wider spacing of spacing tables and runs design rule repair passes. Settings are in Detail Route Options. Scripted with ui().detailRoute().
- Enhancement: LEF import reads more of the technology into the techfile: each routing layer's PITCH (including PITCH x y), OFFSET, AREA, end of line spacing (SPACING ... ENDOFLINE ... WITHIN) and parallel run length spacing table (SPACINGTABLE PARALLELRUNLENGTH), and the MANUFACTURINGGRID. The techfile has new MINEOLSPACE and MINSPACETABLE rules to hold them.
- Bugfix: libgeom had a memory corruption issue when resizing working space. This could result in errors like "Can't find neighbour edge for vert edge...""
- Enhancement: KDtree made thread safe and re-entrant for router.
- Enhancement: Gemini (netlist comparison) now reads DEF files as well as CDL files, so it can compare DEF against DEF or DEF against CDL. It reads the DEF's connectivity (COMPONENTS, PINS, NETS and SPECIALNETS, including ( * pin ) wildcards) and one level of hierarchical CDL (the top .subckt and its X instances), with cells compared as black boxes. New options: -k keeps physical-only instances, -V names supply nets, -W ignores supply pins, -T sets the top cell.
- Enhancement: Detail router is now multithreaded. Nets (and design rule clips) whose areas don't meet are routed at once, and the result is the same on any number of threads. The first pass, minimum area patches, design rule clip passes and the final check use the threads; on 16 threads the ISPD-18 test2 design routes about 3x faster. The number of threads is set in Detail Route Options (default: the CPU's cores on ARM, twice its cores on x64; 0 routes one net at a time). The options dialog is now on two tabs and adds the region and clip pass settings.
- Bugfix: DEF export wrote some stacked vias in an order DEF readers can't follow, e.g. a Metal2 wire then VIA12 VIA23 in the same statement (after VIA12 the route is on Metal1, where VIA23 can't start). Reading such a DEF back put wires on the wrong layer (shorts and opens). Each via now continues a statement only from the layer the statement is on; otherwise it starts a NEW statement.
- Enhancement: Detail Route Options has a Fast flow (experimental) option for large designs: connections are routed on the threads as soon as none nearby is being routed, failed connections are retried crossing other nets at a cost, clashes are repaired in negotiating design rule clips, cuts get a via turned a quarter (_FR, written to the DEF's VIAS) where the default via's pad lies across the tracks, and searches and repair have time limits. ISPD-18 test4 routes in about 5 minutes on 16 threads with no opens or shorts.
- Enhancement: Global Route Options has Target layers by run length, which steers each run to a layer by its length and saves vias; the fast flow turns it on.
- Enhancement: Detail Route Options has Mark unrouted pins, which puts a marker (rule "Route: unrouted pin") on each unconnected pin of the failed nets at the end of routing, for the DRC marker browser. The route now reports its total time, global and detail, and logs its setup steps as they start.
- Bugfix: Cancel in the detail route's progress dialog could hang or crash while threads were routing. It now stops within a few seconds, keeps the routing finished so far and counts the unfinished nets as failed.
- Enhancement: Much faster merging of layers in the geometry engine, used by DRC, extraction and boolean operations, especially for dense or arrayed layouts. Adding an edge to the scanline no longer looks at every edge above it, stacks of identical overlapping edges are counted once rather than repeatedly, and repeated copies of the same shape (e.g. from overlapping array cells) are dropped before merging. The merged result is unchanged. Reading the layers of a 256 word SRAM for extraction went from about 340s to 6s.
- Enhancement: Faster device extraction. Each distinct device geometry now builds its device PCell once per run and identical devices share it, instead of the PCell being reloaded and rebuilt for every device. Extracting the MOS devices of a 256 word SRAM went from about 25s to 2s per device type.
- Enhancement: Much faster DRC checks on dense layouts. Each edge is now compared only with nearby edges rather than with every other edge on the scanline, and looking up the shape an edge belongs to no longer searches the whole layer. DRC violations are unchanged. On a 256 word SRAM: spacing checks are up to about 60x faster (metal1 spacing 35s to 0.6s), enclosure checks up to 25x, overlap checks about 17x and width checks about 3-6x. Extension checks, which on large layers could run for many minutes, now take under a second. Notch, line end, multiple and 2D spacing, length spacing and boolean enclosure checks get the same improvement.
Version 6.1.2 release on 20/10/2026
- Bugfix: Gui could crash on exit if there were redraw ops running in the thread during exit.
- Enhancement: Much faster net tracing (Verify > Trace Net, ui.traceNet and ui.traceLabel). Each traced shape's neighbours are now searched for once per layer rather than once per trapezoid per connect rule, shapes already traced are skipped before being broken into trapezoids, and each shape is broken into trapezoids only once. The search no longer leaks memory. Tracing a 430,000 shape net of a 256 word SRAM takes about 110s; it previously ran for over 10 minutes using 27GB of memory without finishing.
- Bugfix: The net tracer treated different shapes with the same bounding box and layer as one shape, so it could miss the shapes connected to the others.
- Bugfix: Saving traced shapes to a cellView put shapes from instances at their master cell's coordinates rather than where they are placed, and was very slow for large nets (the layer's search tree was rebuilt for every shape saved). Saving the SRAM power net now takes under a second.
- Bugfix: A techfile CONNECT rule written as CONNECT lyr1 TO lyr2 BY via (rather than CONNECT lyr1 BY via TO lyr2) had its via layer ignored, so the net tracer connected the two layers wherever they overlapped. Both orders are now read, and a CONNECT rule with an unknown token or a missing layer is reported rather than added. In the FreePDK45 techfile this joined every metal layer to the next: the SRAM power net above traced 430,000 shapes, most of the design, and now traces 2,694.
- Enhancement: The net tracer can find shorts. Given two points (or two labels) that should be on different nets, it traces from both at once and finds the shortest chain of shapes connecting them, which it highlights, with the shape where the two traces met in a second colour, and lists in the log. Use the Point 1 and Point 2 buttons, or Short trace from label1 to label2, in Verify > Trace Net, or ui.findShort and ui.findShortLabels from Python.
- Bugfix: ui.traceNet and ui.traceLabel always highlighted in yellow, ignoring their colour arguments, and assigned the traced shapes to the named net even when addConnectivity (useLabelNameForNet for traceLabel) was False. Both now do as documented.
- Bugfix: The net tracer missed a via connection when the via was as wide as the shape it lands on (the overlap test found no overlap when the two shared their left and right edges), and counted shapes that only abut as overlapping. The trapezoid overlap and touch tests are now exact. On the SRAM above this joins the vdd straps to the rest of the gnd net (293,034 shapes) that the CONNECT fix left apart.
- Enhancement: Faster net tracing of long, thin shapes such as power straps: the shapes found around each traced shape are indexed by a grid that follows its shape. Tracing the SRAM vdd net takes 6s, or about 0.02ms/shape, down from about 14ms a shape.
- Enhancement: The net tracer no longer traces again from a shape identical to one it has already traced from (the same rectangle, segment or via in overlapping cells, which in the SRAM is most of them); the copies are still part of the traced net. It also adds every via on a traced shape rather than just the first. The SRAM vdd net now traces in 19s (search results are also kept in reused buffers rather than lists).
- Bugfix: Two edges were taken as colinear when one contained just the first point of the other, rather than both of its points (used by the net tracer and in MOS and MIM cap extraction).
- Bugfix: Merging a layer could give a hole to the wrong polygon: when finding the polygon around a hole, a boundary that turned through a vertical edge on the scanline was not followed, so the hole was given to a polygon further out. Extraction then connected a via touching the hole's edges to that polygon's net. In the 256 word SRAM this joined vdd to gnd, which LVS reported as a short although the layout has none.
- Enhancement: The text editor (File->Edit Python file..., renamed from Edit Ascii File...) has a Python debugger for scripts and PCells, used like Visual Studio's: Start/Continue (F5), Step Over (F10), Step Into (F11), Step Out (Shift+F11), Stop (Shift+F5), and breakpoints set by clicking left of a line number (F9). When stopped it shows the call stack, the local variables of the selected frame and an evaluate panel, and an unhandled exception stops where it was raised. A PCell is run into a cellView chosen with its argument values, shown in a layout window that is redrawn at every stop. The editor is no longer modal. See Python Debugger.
- Bugfix: Glade could hang at 'Optimising...' after importing a layout (e.g. OASIS) with several large layers. Each large layer's search tree is built on its own thread, and building a tree started further threads from the same pool; once every thread was building a tree, those further threads never ran, so the builds waited for ever. A tree build now does the work itself when no thread is free.
- Enhancement: Exporting OASIS with repetition compression is faster: a design with 7.8M instances and 4.3M paths in its top cell now exports in 12s rather than 18s. Identical paths and polygons are now found and written as repetitions, so files can be a little smaller.
- Enhancement: Exporting OASIS or GDS2 shows a progress bar in the status bar, as importing does.
- Bugfix: Exporting OASIS with instance compression dropped instances of cells that were not found, and two different cells, or two different text strings, could rarely be written as one repetition.
- Bugfix: The width forms of geomSpace and geomSpace2 (wide metal spacing) took a shape's width as the largest distance across the whole merged polygon, so thin wires on a merged net were treated as wide and reported. They now use the shape's width at the edge, as LEF measures it, and only look as far as the spacing rule. On a routed ispd18_test1, a width > 0.75 check went from 46s and 13,608 markers to 6s and none.
- Bugfix: geom2DSpace measured a shape's width as the distance to the nearest facing edge, so a line end measured the whole line's length and was given the widest row's spacing. It now measures the width as LEF does, and is about 4 times faster.
- Bugfix: geom2DSpace and the width forms of geomSpace and geomSpace2 measured a shape's width over the whole of an edge, so a wide block at the end of a thin wire, whose edge runs on into the wire's edge, measured thin and its wide-metal spacing was not checked. The width is now measured along the edge stretch by stretch, and each stretch is checked at its own spacing.
- geomSpace2 has a two layer form, geomSpace2(layer1, layer2, rule, width, length, flags, message): spacing between shapes on two layers, both wider than width. It existed but was not available from Python; it now checks only unrelated shapes on different layers (as two layer geomSpace), and measures each shape's width on its own layer.
Version 6.1.3 release on 24/10/2026
- Enhancement: DRC and geometry operations are multithreaded. Large layers are cut into swathes that are checked, merged, sized and combined (and, or, andNot) on threads, and geomGetShapes flattens the top instances on threads; the results are the same as on one thread. geomSetThreads() with no argument uses the machine's thread count. Width, notch, enclosure, space and 2D space checks are also faster on one thread.
- Enhancement: Edge processing. geomGetEdge(layer1, layer2, flags) selects the parts of layer1's edges that are inside, outside, coincident with, butting, over or not over layer2's shapes; whole_edge outputs whole edges, joining connected edges into runs. geomGetLength and geomGetLengthRange select edges by length. geomWidth, geomSpace, geomEnclose and geomExtension accept these edge layers, so gate rules that check only the ends or sides of gates can be written.
- Bugfix: DEF import never mapped pin names when the DEF and LEF BUSBITCHARS differed, and imported CLOCK, POWER, GROUND etc. nets as signal nets.
- Bugfix: DRC could crash because the geom2DSpace spacing table typemap in the Python (SWIG) wrapper wrote one row past the end of its array on every call, and freed rows twice on an error.
- Bugfix: geomHoles, geomNoHoles, geomGetHoles and geomGetHoled overran a buffer on layers of more than 4096 polygons, giving counts that changed from run to run and later crashes. geomNoHoles now outputs polygons less their holes, as documented.
- Bugfix: Merging some any angle edges against a vertical edge could fail with "Can't find neighbour edge for vertical edge".
- Bugfix: Tracing a net from a label could start from the label itself, or from a shape on another layer, rather than the shape on the attach layer under it, and so traced nothing. On the SRAM the gnd label traced 1 shape; it now traces the whole gnd net (292,762 shapes).
- Enhancement: The Run DRC dialog has 'Multithreaded' and a number of threads (the machine's by default) to run the rules multithreaded; off, a run uses one thread. The Run Extraction dialog's 'Multithreaded' and number of threads work the same way. Both check boxes are saved in the preferences file. A rules file's own geomSetThreads() call still takes precedence.
- Bugfix: The number of threads set in the Run Extraction dialog was ignored: connectivity extraction always used all the machine's threads.
- Bugfix: The Run Extraction dialog's options were remembered as the Run DRC dialog's, and GLADE_EXT_VARS set the extraction options to the value of GLADE_DRC_VARS.
- Bugfix: GLADE_THREADED_EXTRACTION did not limit the threads connectivity extraction ran on: a smaller number was ignored, and a value that is not a number (e.g. yes) ran it on one thread. It is now the most threads to use; no or 0 runs on one thread.
- Enhancement: the Getting Started page lists the environment variables Glade uses.
- Bugfix: geomHoles, geomGetHoles and geomGetHoled treated lessthan as greaterthan, so for example geomGetHoled(layer, lessthan, 2) output polygons with more than 2 holes. The default flag is now greaterthan, and lessthan (or none, or 0) selects polygons with fewer than count holes.
- Bugfix: geomAreaIn and geomHoleAreaIn with a flag of lessthan (or none) never output a shape. Their marker message was also left unset for lessorequal and greaterorequal.
- Bugfix: Checks that need polygons (geomSize, geomLength, geomArea, geomGetNon90 and others) gave wrong results when passed an edge layer; they now stop with an error, as geomSpace and geomNotch already did. Edge layers from geomGetEdges are refused by the edge checks too.
- Bugfix: Area rules larger than about 2147 um2 (at 1000 dbu per micron) were ignored. From Python, geomArea(layer, 0.1, 10) takes 10 as flags, not a maximum area of 10; there is now a warning when the flags include bits the area checks ignore. Pass a maximum area as a float (e.g. 10.0).
- Bugfix: geomGetNon90, geomGetNon45, geomGetRectangles, geomGetPolygons and geomGetVertices treated a polygon's holes as separate shapes, and geomGetNet and geomGetText dropped holes. A polygon is now selected as a whole, holes included.
- Bugfix: Selection operations (geomInteracts, geomInside and others) with a count could count the wrong layer, and failed on layers from geomGetRawShapes.
- Bugfix: geomSetTextFile crashed on a blank line in the pin file, and now returns true only if every label was placed.
- Bugfix: Device extraction fixes: resistor W/L from uninitialised memory, crashes on unconnected MIM cap and generic device terminals, missing S pins on MOS devices with one S/D shape, and memory errors filtering bulk shapes.
- Bugfix: geomDensity ignored step_x and step_y and only also checked windows shifted by half a window diagonally; the windows are now stepped by step_x and step_y over the bounding box.
- Bugfix: extractBjt ignored bulkLayer; the substrate is now terminal S. MOS caps without a PCell had their perimeter as "perim" rather than "pj". Diodes and MOS caps lost a terminal when the first overlapping shape had no net.
- Bugfix: Markers from two-layer geomSpace, geomSpace2, geomLineEnd, geomEdgeLength and geomAllowedEncs named only the first layer, and geomEnclose2's only the second.
- Bugfix: Shapes with a bad vertex were added despite the "Skipping" warning.
- Bugfix: Crashes when an extraction was given a missing layer (from an operation that failed), when the extracted view could not be opened (e.g. locked by another user), when geomEnd was called twice, with a long GLADE_DRC_WORK_DIR, on a shape with no net in 3D parasitic extraction, and when tracing very large nets. Fastcap output that arrived in more than one piece could be misread.
Version 6.1.4 release on 29/10/2026
- Bugfix: On Linux the main window opened a little lower each time Glade was run, by the height of its title bar, until it reached the bottom of the screen. The position saved on exit was that of the window's contents rather than its frame, which is what it is restored to. The frame position is now saved, and only while the window is not maximised, minimised or full screen.
- Enhancement: A new layout canvas draws with the GPU using Qt's QCanvasPainter, through Metal on macOS, Direct3D on Windows, and Vulkan or OpenGL elsewhere. It is now the default when a usable GPU is found; otherwise (with Mesa drivers, a software renderer or no GPU) the QPainter canvas is used. The layout is drawn on a separate thread, so the GUI stays responsive while large designs redraw. Set GLADE_CANVASPAINTER=no to go back to the previous canvases (OpenGL, or QPainter if OpenGL is turned off with GLADE_USE_OPENGL). The startup log says which GPU is used.
- Enhancement: Dynamic highlighting now waits 30ms after the mouse stops moving in all canvases, so it no longer slows down mouse moves over large designs.
- Enhancement: View->Display Options has a new Drawing setting for the GPU layout canvas. Fast (the default) leaves out objects smaller than the filter threshold, as before. Accurate draws how much of each pixel they cover instead, layer by layer, so zoomed out views of dense designs are no longer misleadingly empty, at the cost of slower redraws.
- Bugfix: The World View window was blank, and could not pan or zoom the layout, with the GPU layout canvas when OpenGL was available. It now uses the same kind of canvas as the layout window. Using it also left the layout redrawing every 50ms, which made the LSW flicker; it now moves the layout only while it is dragged. For some designs it also drew nothing but the axes.
- Enhancement: DRC checks take the flags figA, figB and fig: the check then outputs the whole shapes (with their holes) that its violations lie on, of the first layer, the second layer or both, instead of the error regions. Markers are written as before. In the selection functions figA and figB are the new names of layer1 and layer2, which are still accepted.
- Enhancement: DRC check modifiers. with_perp and only_perp control whether checks measure perpendicular edges; corner, cornerA, cornerB, cornerToCorner, cornerToCorner45, cornerToCornerNot45, cornerToEdge, cornerToEdgeA, cornerToEdgeB and notCorner check only edges in (or not in) a corner relationship; shielded, shieldedA, shieldedB and shieldCoin report only the parts of violations not hidden behind other edges, and geomSetShieldLayer sets another layer to shield. Check flags are now 64 bit. The verification page now says which pairs of edges checks measure: spacing and enclosure checks measure perpendicular edges, and a spacing check stops at the nearest failing edge.
- Enhancement: geomStamp(layer, stampLayer, flags, message) copies a layer's shapes with the nets of the connected stamp layer's shapes they overlap, e.g. to give wells the nets of their taps. Shapes stamped by several nets take the commonest (floatMultiStamp: a new net), and unstamped shapes a new net. floating, multStamp and multConnect (stampErrors: all three) mark unstamped shapes, multiply stamped shapes and the stamping shapes not used.
- Enhancement: More DRC check modifiers. notParallel checks only edges that aren't parallel. appLimit and lengthLimit (lengthLimitA, lengthLimitB) check only edges whose apposition or lengths are in a range set by geomSetAppLimit or geomSetLengthLimit, e.g. geomSetAppLimit("app > 2.0"). oppositeA and oppositeB report only the first or second layer's edge's projection onto the other. geomSetErrorLimit(limit, abort) limits the markers each check writes, optionally stopping the run when one reaches it.
- Bugfix: Trapezoids (geomTrapezoid, and the tiled booleans, GDS export and net tracing that use the same code) could include thin bands outside the shapes, running from one shape to another, and leave a gap, where a shape had a point just to the right of its own apex with other shapes above and below it (regression test 89).
- Enhancement: Verify->Compare Cells is faster when comparing all layers: several layers are compared at once, each on a thread of its own, with a progress bar counting the layers done. Each layer's shapes are flattened on threads, and repeated copies of a shape (e.g. from overlapping array cells) are skipped. On a 26 layer design with 13 million shapes the compare takes 68 s, down from 106 s. GLADE_COMPARE_LAYERS sets how many layers run at once.
- Bugfix: Compare Cells did not scale the second cellView to the first's database units when a layer was compared without tiles, so cellViews with different database units could show differences that were not there.
- Bugfix: A DRC or extraction function given None for a layer (e.g. the result of a call that failed) returned None without a message, or with the extract functions, geomNumShapes and geomAddShape, crashed Glade. It now raises a ValueError naming the function and argument, e.g. "geomSpace: layer argument 2 is None". The optional layers (an extract function's bulk and isolation layers, geomSetShieldLayer) still take None.
- Enhancement: geomAntenna(gate, antenna, rule, flags, diode, diodeRule, cumulative, message) checks antenna ratios: for each net, the area of its antenna layer shapes over the area of its gates. Nets connected to a diode layer can have their own limit or be exempt, the gate area can be the sum, smallest or largest of the net's gates, and a cumulative total per gate can be kept over the checks of successive metal layers.
- Bugfix: geomStamp could miss shapes lying inside a stamping shape, such as a gate in its poly (seen with the second gate on a poly joining two transistors), which then got a new net of their own. It only looked for stamping shapes inside the shapes.
- Enhancement: DRC checks can output the edges in error instead of the error regions, as an edge layer usable with geomGetEdge, geomGetLength and the checks that take edge layers: edges (edgesA, edgesB) outputs the parts of the edges each region lies between, wholeEdges (wholeEdgesA, wholeEdgesB) the whole edges.
- Bugfix: Boolean operations (geomOr, geomAnd, geomAndNot, geomXor, geomNot) and geomSize and geomTrapezoid gave wrong results on layers whose shapes overlap one another: a check's error regions (which overlap at corners, measured by two pairs of edges), geomGetRawShapes and geomDensity's windows. They now merge such layers first.
- Bugfix: Two layer spacing (geomSpace with two layers) missed violations between shapes whose bounding boxes overlap when a vertex of one was in line with an edge of the other, which it took for the shapes touching, and between a corner and an angled edge running past it.
Version 6.1.5 release on 05/11/2026
- Enhancement: Parasitic resistance extraction. After geomConnect, the rule deck commands resConductor, resVia, resDevice and resExtract extract each net's resistor network, following Horowitz and Dutton, and the REX extractor of Hwang (see Verification). Each conductor polygon is split into convex pieces at its concave corners, and each piece's resistance between its vias, device terminals and pins found from equivalent contacts and current spreading. Polygons this models poorly, such as fat shapes with small contacts, are solved with a 2D field solver instead (resFieldSolve sets its limits). Each net's polygons are then joined by their via resistances, and the network is reduced to its terminals. Against a fine grid solution, random routed wires are within about 2% and fat shapes within about 7%.
- Enhancement: Resistance extraction also gives each net's capacitance to ground, from each layer's area and edge capacitance (resConductor's areaCap and edgeCap, or the techfile's), shared among the nodes of its network.
- Enhancement: Resistance extraction matches device terminals to the pins of the extracted devices, and a net with no name (such as a drain connected to nothing else) takes the name of the device pin it touches.
- Enhancement: resPinResistance, resPointResistance and resNetCapacitance measure a net's extracted network in the rule deck. With resExtract's save option the pieces, subnodes and resistors are drawn in the extracted view (layers resElement, resNode and resResistor), and each net's network is stored on its net.
- Enhancement: File->Export DSPF writes DSPF (it previously wrote an empty file): for each net its total capacitance, pins, device pins and other nodes, resistors and capacitors, then the devices as the CDL netlist writes them, with each device pin written as its node.
- Enhancement: A LEF cut layer's RESISTANCE (ohms per cut) is read into the techfile, and resVia uses it.
- Bugfix: Import DSPF reported "Bad resistor ... ignored" for resistors with no geometry, which DSPF allows; the resistors were kept anyway.
- Bugfix: The file field of the Export DSPF dialog was labelled CDL File.
- Bugfix: extractParasitic3D's Fastcap mesh left part of many conductor faces without panels (a whole number of panels was not used along each face), missing 3% to 15% of each net's surface in the test case. Path shapes are now meshed (they were skipped with an error), and zero length polygon edges no longer give zero area panels.
- Bugfix: extractParasitic3D's substrate plane now extends beyond the conductors by three times the highest conductor top (it was 2.5% of the cell size), and its panel size comes from conductor shapes only. A conductor layer at height 0, which would touch the substrate plane, is skipped with a warning. Panel coordinates are written with 9 significant figures.
- Bugfix: extractParasitic3D's conductor panels were one panel across each face and at most eight along it, so long wires had long thin panels close to other conductors. Fastcap then gave unphysical results, such as positive off-diagonal (negative) coupling capacitances. Panels are now no bigger than the minimum conductor feature size on either side; on the test case the results then agree within about 4% with a mesh twice as fine.
- Bugfix: extractParasitic3D took the minimum feature size, which sets the panel size, from each shape's bounding box, so an L shaped wire alone got panels as big as the L (a 200 um bent wire gave 12 fF instead of 32 fF). It now uses each polygon's narrowest run of conductor.
- Bugfix: A second extractParasitic3D in one session returned at once, while Fastcap was still running, and if Fastcap could not be started the command waited for ever.
- Enhancement: extractParasitic3D divides each conductor face into at least two panels each way, as the charge crowds to the edges. A 5 um cube's capacitance is now 3.7% below the exact value (it was 7% low), for about 1.8 times the Fastcap time on the test case.
- Bugfix: extractParasitic3D's substrate plane was always 50 by 50 panels, so with narrow conductors its panels could be many times bigger than the conductor panels above them, and Fastcap's results were then wrong (a 200 um wire meshed at 0.25 um read 19 fF instead of 33 fF). The substrate is now meshed finely under the conductors (panels up to 1.5 conductor panels wide) and more coarsely away from them, with at most 20000 panels.
- Bugfix: resExtract on a routed LEF/DEF design ran for hours with no output. Every via in a landing pad wider than its wire made the pad a fat piece, and the whole polygon was then field solved, once per via: about 50 seconds for each 300 um power rail. A polygon is now field solved whole only if its grid's cells times its terminals is within resFieldSolve's limit; otherwise just its poorly modelled pieces are, each on its own. The test design (2454 nets) now extracts in under 6 minutes, or 1 minute with resFieldSolve(20000).
- Enhancement: resExtract shows a progress bar and a stop button in the status bar.
- Bugfix: A rule deck script that called geomBegin but not geomEnd left the canvas blank afterwards, including any view it opened (such as the extracted view), as geomBegin holds the canvas off the database until geomEnd. The hold is now released when the script ends, with a warning to add geomEnd().
- Enhancement: resInstPins(conductorLayer, pinPurpose = 'pin') makes the pins of placed cells (LEF macro pins) terminals of resistance extraction, named instance:pin, and the cell's own pins (DEF IO pins) its pins. With save the instances go to the extracted view, and Export DSPF writes a routed LEF/DEF design with *|I nodes and X lines for its cells.
- Bugfix: resExtract dropped a small polygon (such as a pad with a via and a pin) from its net when its field solve gave no terminal any cells, leaving the net open.
- Enhancement: resExtract(netName, save, reduce, verbose = False) lists a net's resistors in the log only with verbose; before, every resExtract of one net listed them, thousands of lines for a power net.
- Enhancement: resPinResistance, resPointResistance and resNetCapacitance warn why they return -1: no resExtract run yet, the net not extracted, a pin not found, or the nodes not connected.