Elvis 0.2.1
Layout vs. Schematic (LVS) for GDSFactory.
User documentation: doplaydo.github.io/elvis
Development setup
# Build the Rust crates
cargo build --release
# Build and install the Python package locally
maturin develop
Crates
- gf-netlist - GDSFactory netlist schema (input .pic.yml format)
- elvis-netlist - Extracted netlist schema (simplified subset for LVS)
- elvis-rdb - KLayout Report Database (lyrdb) format
- elvis-core - Core extraction and LVS functionality
- elvis-cli - Command-line interface
- elvis-python - Python bindings via PyO3
How it works
Netlist Extraction
Elvis extracts connectivity information from GDS files through a multi-step process:
1. Parsing GDS Structure
The GDS file contains a hierarchy of cells (structures). Elvis identifies the top cell - the cell that is not instantiated by any other cell. This is the design being verified.
GDS File
├── top_cell (not referenced by others → this is extracted)
│ ├── instance: mmi (references mmi1x2 cell)
│ ├── instance: wg_in (references straight cell)
│ └── instance: wg_out1 (references straight cell)
├── mmi1x2 (component cell)
├── straight (component cell)
└── bend_euler (component cell)
2. Extracting Port Metadata
kfactory/gdsfactory stores port information in GDS PROPATTR records with a specific format:
kfactory:ports:0')={'name'=>'o1','port_type'=>'optical','trans'=>[trans:r180 -35500,625]}
Elvis parses these properties to extract:
- name: Port identifier (e.g.,
o1,o2) - position: X, Y coordinates in database units
- orientation: Rotation angle (0, 90, 180, 270)
- port_type: Optional type (e.g.,
optical,electrical)
3. Instance Name Resolution
Each cell reference (SREF) in the GDS becomes an instance. The instance name is determined by:
- Explicit name: From GDS property with
attr=0(if present) - Generated name:
{cell_name}_{x}_{y}[_r{rotation}][_m]as fallback
The generated name includes rotation and mirror suffixes to ensure uniqueness when multiple instances of the same cell exist at the same position with different transforms.
4. Port Transformation
Each instance's ports are transformed from local (cell) coordinates to global (layout) coordinates:
Global Position = Instance Position + Rotate(Local Position, Instance Rotation)
Global Orientation = Local Orientation + Instance Rotation (± mirror)
5. Connection Detection
Two ports are considered connected when ALL of the following conditions are met:
| Condition | Requirement |
|---|---|
| Position | Within tolerance (default: 1nm) |
| Orientation | Facing opposite directions (180 +/- 1) |
| Port type | Same type, or either type is unknown |
| Instance | On different instances (no self-connections) |
┌─────────┐ ┌───────┐
│ mmi │ o2 ←→ o1 │ wg │
│ │─────●─────│ │
└─────────┘ 180° 0° └───────┘
Connected: same position, opposite orientation
The port type check ensures that only compatible ports connect:
optical↔optical: Connectedelectrical↔electrical: Connectedoptical↔electrical: Not connected (will appear as open)unknown↔anything: Connected (permissive fallback)
LVS Algorithm
Elvis uses a graph-based connectivity comparison where 2-port routing instances are removed from the net-comparisons.
The Problem with Naive Comparison
A direct comparison would fail on any routed design:
Schematic (what the designer specified):
┌──────────┐ ┌──────────┐
│ splitter │──────│ arm_top │
└──────────┘ └──────────┘
2 instances, 1 net
Layout (after auto-routing):
┌──────────┐ ┌──────┐ ┌────────┐ ┌──────┐ ┌──────────┐
│ splitter │───│ bend │───│straight│───│ bend │───│ arm_top │
└──────────┘ └──────┘ └────────┘ └──────┘ └──────────┘
5 instances, 4 nets
Naive LVS: FAILED - 3 extra instances, 3 extra nets
The Solution: Graph-Based Tracing
Elvis treats the layout as a connectivity graph and traces through 2-port components (which act as "wires") to find connections between reference instances (components from the schematic).
Key insight: A 2-port component (like a waveguide or bend) doesn't change connectivity - it just extends a path. Only components with 3+ ports (like splitters, couplers) are true circuit elements that define the topology.
Algorithm Steps
Step 1: Identify Reference Instances
Reference instances are those that appear in the schematic. These are the "real" components we care about - they define the circuit topology.
reference_instances = {name for name in schematic.instances}
# e.g., {"splitter", "arm_top", "arm_bottom", "combiner"}
Step 2: Build Connectivity Graph
Create a graph from the layout where:
- Nodes are
(instance, port)pairs - Edges connect ports that are physically connected
Layout connectivity graph:
(splitter,o2) ─── (bend_1,o1)
(bend_1,o2) ─── (straight_1,o1)
(straight_1,o2) ─── (bend_2,o1)
(bend_2,o2) ─── (arm_top,o1)
Step 3: Classify Traversable Instances
An instance is traversable if:
- It has exactly 2 ports (it's a "wire-like" component)
- It is NOT a reference instance (not in the schematic)
def is_traversable(instance):
return port_count[instance] == 2 and instance not in reference_instances
Reference instances are never traversable - they are endpoints where tracing stops.
Step 4: Trace Through 2-Port Intermediates
For each connection in the schematic, verify it exists in the layout by tracing through traversable instances:
def trace_to_endpoint(start_instance, start_port):
current = get_connected_port(start_instance, start_port)
while is_traversable(current.instance):
# Find the other port on this 2-port instance
other_port = get_other_port(current.instance, current.port)
# Follow the connection from that port
current = get_connected_port(current.instance, other_port)
return current # Returns the endpoint (a reference instance)
Example trace:
Start: (splitter, o2)
→ connected to (bend_1, o1)
→ bend_1 is traversable, other port is o2
→ (bend_1, o2) connected to (straight_1, o1)
→ straight_1 is traversable, other port is o2
→ (straight_1, o2) connected to (bend_2, o1)
→ bend_2 is traversable, other port is o2
→ (bend_2, o2) connected to (arm_top, o1)
→ arm_top is NOT traversable (it's a reference instance)
End: (arm_top, o1) ✓
Step 5: Mark Valid Intermediates
All 2-port instances encountered on valid paths are marked as valid intermediates. These won't trigger "missing in schematic" errors.
Valid intermediates: {bend_1, straight_1, bend_2}
These exist in layout but not schematic - that's OK, they're routing.
Step 6: Check for Extra Connections
Also verify that the layout doesn't have extra connections between reference instances that aren't in the schematic (topological shorts).
Array Instance Support
GDS array references (AREF) are expanded into individual instances with <col.row>
naming (e.g., pads<0.0>, pads<1.0>). Schematic array instances are likewise
expanded during netlist conversion, so both sides use the same naming convention.
Visual Example
SCHEMATIC:
┌─────────┐
┌─────┤ arm_top ├─────┐
│ └─────────┘ │
┌─────┴─────┐ ┌─────┴─────┐
───○─┤ splitter │ │ combiner ├─○───
└─────┬─────┘ └─────┬─────┘
│ ┌─────────┐ │
└─────┤ arm_bot ├─────┘
└─────────┘
4 reference instances, 4 nets
LAYOUT (with routing):
╭───────────────────╮
┌────┤ arm_top ├────┐
│ └───────────────────┘ │
╭─────╯ ╰─────╮
│ (bends and straights) │
┌─────┴─────┐ ┌──────┴────┐
───○─┤ splitter │ │ combiner ├─○───
└─────┬─────┘ └─────┬─────┘
│ (bends and straights) │
╰─────╮ ╭────╯
│ ┌───────────────────┐ │
└────┤ arm_bot ├────┘
└───────────────────┘
64 instances total (4 reference + 60 routing), 64 nets
LVS RESULT: PASSED
- All 4 schematic connections verified through routing
- 60 routing instances are valid intermediates
Metadata
Release files for elvis-lvs 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size: 26.6 MB
Release files / elvis_lvs-0.2.1-cp314-cp314-win_amd64.whl
| Download URL | elvis_lvs-0.2.1-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 2.0 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
3c9ebc0c5d30dfd09cc7732d97e622b51150a01bc349d704d58a5285650b8978
|
|
BLAKE2b-256 checksum How to use checksums |
19f008183aa682f0f38cfdc647c98675fa428912a55d40858216d78a9fa0a160
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 19, 2026.
Transparency logRelease files / elvis_lvs-0.2.1-cp314-cp314-manylinux_2_28_x86_64.whl
| Download URL | elvis_lvs-0.2.1-cp314-cp314-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.14 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
0aff9b5a8335ca35de7642186d55fab76f1fdc6f17523ab7cbdbbd213e343ba5
|
|
BLAKE2b-256 checksum How to use checksums |
92d6a993bd9df3eb79675e5073454f1ab3bf43f3ffe628bb9913e14681c00175
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 19, 2026.
Transparency logRelease files / elvis_lvs-0.2.1-cp314-cp314-manylinux_2_28_aarch64.whl
| Download URL | elvis_lvs-0.2.1-cp314-cp314-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.14 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
02e0a3ad99d7b7e33d5b6952508fb52dec7c7ad3e50412162dc161d6afcfc111
|
|
BLAKE2b-256 checksum How to use checksums |
c7756faedb7c847ebb9ba0c9e10bd1f5269d31f61e2f227e00a9e68fbe2b16e0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 19, 2026.
Transparency logRelease files / elvis_lvs-0.2.1-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | elvis_lvs-0.2.1-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
ac177a73b8da615722cbef6f60d1f9407376f2ee36e596a92c3dadcfc4398346
|
|
BLAKE2b-256 checksum How to use checksums |
0f29dfc6cbc9329229b632f7acf7f32829845759e30f985ba986d78d1847cca4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 19, 2026.
Transparency logRelease files / elvis_lvs-0.2.1-cp313-cp313-win_amd64.whl
| Download URL | elvis_lvs-0.2.1-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 2.0 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
0a90ee64130bf87c6d86212a1493cdf70deb6429d12514f53d867f28af6db261
|
|
BLAKE2b-256 checksum How to use checksums |
0deed629c7f07d8ac7121df650923ab2f41fe7e6808beef9af1ce13fe2a9307c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 19, 2026.
Transparency logRelease files / elvis_lvs-0.2.1-cp313-cp313-manylinux_2_28_x86_64.whl
| Download URL | elvis_lvs-0.2.1-cp313-cp313-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.13 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
754b16d98c260c22f811bc2da3ae0ae7595818db689560b85370952dfbda81dd
|
|
BLAKE2b-256 checksum How to use checksums |
ba75e389d943080146c85813a5cec1621711b4a0aadf8d65f4b3a4470aed7b10
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 19, 2026.
Transparency logRelease files / elvis_lvs-0.2.1-cp313-cp313-manylinux_2_28_aarch64.whl
| Download URL | elvis_lvs-0.2.1-cp313-cp313-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.13 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
68774f4c62f98e6d6b1d4eac41602c3c732783ba5b039111230ff20c86e82ace
|
|
BLAKE2b-256 checksum How to use checksums |
2455a7f6c8c43da9ede03081bcbd4d6e982e4d5f29ed4c89f8c805930ea7efbb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 19, 2026.
Transparency logRelease files / elvis_lvs-0.2.1-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | elvis_lvs-0.2.1-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
38aaff4f1d8548d827f1b6fb73cd13442d2b2e1aa23af1035db55f7d3a36d453
|
|
BLAKE2b-256 checksum How to use checksums |
300cc49254ada90f469dc697a86d80abbd323e7d51b7f47a9f042119bd1ec3b5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 19, 2026.
Transparency logRelease files / elvis_lvs-0.2.1-cp312-cp312-win_amd64.whl
| Download URL | elvis_lvs-0.2.1-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 2.0 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
b3ec4c6db2b5de51c6e4b232151cd524022490787c01035ca833f2823574a5ea
|
|
BLAKE2b-256 checksum How to use checksums |
e0d0698d8711bd2b01ba996180b23bd905c7f49caa461b314ac7cd4130a4a0b0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 19, 2026.
Transparency logRelease files / elvis_lvs-0.2.1-cp312-cp312-manylinux_2_28_x86_64.whl
| Download URL | elvis_lvs-0.2.1-cp312-cp312-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.12 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
98daac2465ae70ec8bba1d48487f5975929076732faae88c701d86fd3505cd56
|
|
BLAKE2b-256 checksum How to use checksums |
dbcd675908027918d2c7084e123693fd15d40d299232bcbd8d73e68bf43ee185
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 19, 2026.
Transparency logRelease files / elvis_lvs-0.2.1-cp312-cp312-manylinux_2_28_aarch64.whl
| Download URL | elvis_lvs-0.2.1-cp312-cp312-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.12 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
8c8876d86fc9b8b870b164122fdef1ce0fd07e8b7c0e29efbcdd9a5ce3bb3e2e
|
|
BLAKE2b-256 checksum How to use checksums |
56c45053108c239ec82fa30fbd377795cc3639c2061e280fb7c84221a9d2962c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 19, 2026.
Transparency logRelease files / elvis_lvs-0.2.1-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | elvis_lvs-0.2.1-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
4c695edc42177c6ecef39bd1324f29aa24c6ed10cae5ac08be3d789427e6589c
|
|
BLAKE2b-256 checksum How to use checksums |
b6a7548a8063588049e5f7b1c1db0e5a6aadc5a5a0d270b8969351d63a7f8bd6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 19, 2026.
Transparency log