Glade

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, as Diva's geomGetEdge; 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 Diva style gate rules 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.