Skip to content

Changelog

[Unreleased]

Added

  • TraceRoute.port1_index / port2_index map each trace back to the caller's ports1 / ports2 lists; traces are ordered by lateral bundle slot, not input order, so use these indices to correlate results
  • doroutes.util.segments_length_um / doroutes.util.cell_length_um — route lengths are the sum of placed cells' info["length"]; cells lacking it raise ValueError
  • Composite bundle pcells (pcells.straights / pcells.bends) record info["wire_lengths"] (per-wire sums of their inner cells' info["length"]) and info["length"] (exact total over all wires)
  • Route objects: routing functions return a doroutes.Route (pydantic model, field-compatible with kfactory's ManhattanRoute for future backend integration, generalized for sbends and coordinate endpoints). It carries the wire's placed instances port-to-port (start→end), start_port/end_port, dbu backbone, n_bend90/bend90_radius/length_straights, and length (µm) via a pluggable length_function defaulting to the exact cell-info sum. corners, path_length, iteration and len() remain as backward-compatible properties; TraceRoute is a deprecated alias
  • FanLeg.instances / FanLeg.n_bend90 — each fan leg carries its placed cells in start→end order

Changed

  • Breaking: add_fan_in now returns (stops, legs) instead of just the stops array — legs is the per-wire FanLeg detail (polyline, exact length, original input index, placed instances). Existing callers should unpack: stops, _ = add_fan_in(...)
  • GDS hierarchy is unchanged from 1.1.0: bundle bodies stay composite straights_*/bends_* segment cells and fan legs stay flat. Per-wire identity lives in the returned Route objects (instances lists the leg cells plus the shared composite segments); bundle traces use a sliced length_function that reads the wire's own wire_lengths entry per composite segment — still exact sums of cells, no geometry
  • Old-style TraceRoute(corners=..., path_length=...) construction now raises a pydantic.ValidationError (the fields became read-only properties of Route)
  • add_route_astar and add_route_manual now return TraceRoute instead of a bare list of corner points; iteration (for pt in result) and len() keep working, but isinstance(result, list) checks and list concatenation do not — use result.corners for those
  • TraceRoute.path_length, bundle per-trace lengths, and FanLeg.length_um are now the exact sum of the placed cells' info["length"] (correct for euler bends; previously approximated geometrically from the corner polyline)
  • Bundle traces (BundleResult.traces) now span port-to-port including the fan-in/fan-out legs, with exact lengths for the manhattan, sbend, and lbend fan strategies

[1.1.0] — 2026-06-04

Added

  • Public add_route_from_corners_dbu API for routing in database units (#126)
  • Backwards-compatible support for passing lengths in both microns and dbu (#120)

[1.0.0] — 2026-05-26

Changed

  • Breaking: standardized public API — routing and bundle functions use micron parameters, always return corners, and follow consistent naming (#115, #119)
  • FanStrategy TypedDict replaces loose keyword arguments for fan-in/fan-out configuration (#115)
  • Deprecation wrappers added for all renamed/removed parameters — old call sites emit warnings instead of breaking (#115)

[0.6.1] — 2026-05-21

Fixed

  • Use round() instead of int() for um-to-dbu corner conversion to avoid float truncation (#118)

[0.6.0] — 2026-05-08

Added

  • return_corners kwarg on routing and bundle functions (#113)
  • A* clearance parameter for obstacle margin control (#102)
  • Separate fan-in / fan-out strategy support (#100)
  • Steps routing in microns (#99)
  • Bundle fan-in anchor control with validation (#94)
  • Fan-in strategy on add_bundle_from_corners (#92)
  • Generic PDK in notebooks, replacing cspdk (#93)
  • Configurable leading-straight on manhattan fan-in (#71)
  • Switch tree pad routing example (#74)
  • lbend and sbend fan-in demos (#51)
  • Python 3.11+ support (#41)

Fixed

  • L-bend wire clearance (#91)
  • Collapse collinear corners so consecutive same-axis steps don't insert fake bends (#70)
  • Sbend fan-in radius calculation rewritten as per-wire angle euler s-bend (#55)
  • Remove PDK.activate() calls and cspdk dependency (#98)

Changed

  • Corners routing parameter switched from dbu to microns (#87)
  • Split bundle_from_corners + manual dispatchers, unified component param name (#86)
  • Upgraded gdsfactory to 9.40.2

[0.5.0] — 2026-03-27

Added

  • 3D multilayer routing subpackage (#22)
  • 1x16 optical switch with electrical routing example
  • Interactive KLayout GDS viewer for stress test results

Fixed

  • Reduced routing runtime with coarser grid and tighter margin

[0.4.0] — 2026-02-22

Added

  • add_bundle_from_corners for explicit corner-based bundle routing (#24)
  • Array indexing support for instance port references (#23)
  • Array routing example notebook (#25)

[0.3.1] — 2026-01-07

Added

  • Python 3.14 support

Fixed

  • Fix tests and notebooks compatibility (#17)

[0.3.0] — 2025-11-25

Fixed

  • kfactory 2.0 compatibility (#13)

[0.2.6] — 2025-11-25

Fixed

  • Pin kfactory dependency version

[0.2.4] — 2025-09-01

Fixed

  • Increase bounding box search area for route finding (#10)

[0.2.3] — 2025-05-13

Added

  • Ubuntu ARM release builds

[0.2.2] — 2025-05-13

Added

  • Native ARM builds without emulation (#9)

[0.2.1] — 2025-05-13

Added

  • ARM64 Linux release builds (#7, #8)

[0.2.0] — 2025-03-09

Fixed

  • Graceful error handling instead of panicking when no route found (#6)
  • API key verification error handling

[0.1.0] — 2025-03-04

Added

  • Documentation site
  • kfactory-only routing backend (#2)
  • Bundle routing support
  • A* routing function

[0.0.1] — 2025-02-14

Added

  • Initial release
  • Corner-based and step-based routing
  • A* pathfinding with obstacle avoidance
  • Bundle routing with fan-in/fan-out
  • Circuit from YAML netlist
  • Discretization for field-based routing