Skip to main content

Layout scripting for photonic and electronic chip design

Project description

Lumicron API

Layout scripting for photonic and electronic chip design.

Define cells, place components, route waveguides, and export to GDS/OASIS — all in Python.

Install

pip install lumicron_api

Requires Python 3.12+.

Quick Start

import lumicron_api.all as lm
import lumicron_api.pdks.elyon_demo.all as pdk

@lm.cell_params
def MZI(arm_length: float = 100, arm_spacing: float = 10):
    c = lm.CELL("MZI")

    # Components
    splitter = pdk.YSplitter(layer=pdk.LAYER.SILC)
    combiner = pdk.YSplitter(layer=pdk.LAYER.SILC)

    # Add and place
    s = c.add(splitter)
    k = c.add(combiner)
    c.Place(s).at((0, 0))
    c.Place(k).using("i1").at((arm_length + 50, 0)).rotate_by(180)

    # Route
    c.Route(s.port["o1"], k.port["o1"], radius=10)
    c.Route(s.port["o2"], k.port["o2"], radius=10)

    return c

mzi = MZI()
mzi.to_layout().to_gds("mzi.gds")

Features

  • Hierarchical cells — build complex designs from reusable parametric components
  • Placement system — anchor-based positioning with directional helpers (.above(), .below(), .right_of())
  • Routing — auto-router with manual override via .go(), bend radius validation, tapers with positional placement
  • Bend types — circular (default), euler (clothoid), and custom bend PCells with adjustable p parameter
  • Custom bend PCells — use your own 90° bend cells in routes: c.Route(a, b, bend=my_bend)
  • Waveguide — standalone path primitive for spirals, delay lines, and tapered structures
  • Arrays — 1D and 2D arrays with per-element rotation
  • Port promotion — access deeply nested ports from any level in the hierarchy
  • Port types — optical and electrical ports for future auto layer transitions
  • Shapes — Rectangle, Circle, Ring, Oval, Arc, Triangle, Parallelogram, Trapezoid
  • PDK support — ships with Elyon Demo PDK (17 layers, 11 components, 3 route profiles)
  • Export — GDS-II, OASIS, and JSON formats

Placement

# Absolute
c.Place(shape).at((100, 200))

# Relative
c.Place(pad).right_of(coupler)
c.Place(stalk).below(segment).move_by(dy=5)

# Anchor + rotate
c.Place(splitter).using("i1").at(frame.NW).rotate_by(90)

Routing

# Auto-route with circular bends
c.Route(port_a, port_b, radius=10)

# Euler bends (smooth curvature transition)
c.Route(port_a, port_b, radius=10, bend="euler")
c.Route(port_a, port_b, radius=10, bend="euler", p=0.3)  # adjust euler fraction

# Custom bend PCell (user-defined 90° bend geometry)
c.Route(port_a, port_b, bend=my_euler_bend_cell)

# Manual with GPS-style directions
c.Route(port_a, port_b, radius=15) \
    .go("E", by=50) \
    .go("N", to=port_b, dy=-20)

# Positional taper — place taper 50µm from port A
c.Route(port_a, port_b, radius=10).start_taper(length=10, at=50)

# With route profile
c.Route(port_a, port_b, profile=pdk.RPROF.siln_strip)

Waveguide

# Standalone path from points — auto-generates i1/o1 ports
wg = lm.Waveguide(
    points=[(0, 0), (50, 0), (50, 100), (100, 100)],
    layer=pdk.LAYER.SILC, width=0.5, radius=10,
)

# Tapered waveguide (width interpolates linearly)
wg = lm.Waveguide(
    points=spiral_points,
    layer=pdk.LAYER.SILC, width=0.2, width_end=1.0, radius=10,
)

ref = c.add(wg)
c.Route(some_port, ref.port["o1"], radius=10)

Arrays

couplers = lm.ARRAY(coupler, count=8, pitch=(0, 127), rotation=90)
arr = c.add(couplers)
c.Place(arr).at((0, 0))

# Access individual element ports
arr[0].port["o1"]
arr[3].C

Parametric Cells

@lm.cell_params
def Ring(radius: float = 50, width: float = 5):
    c = lm.CELL("Ring")
    c.add(lm.Ring(outer_radius=radius, width=width, layer=pdk.LAYER.SILC))
    return c

Ring()              # cell name: "Ring"
Ring(radius=100)    # cell name: "Ring_radius=100"

Documentation

See docs/user_guide.md for the full API reference.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lumicron_api-0.1.0.tar.gz (82.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lumicron_api-0.1.0-py3-none-any.whl (71.3 kB view details)

Uploaded Python 3

File details

Details for the file lumicron_api-0.1.0.tar.gz.

File metadata

  • Download URL: lumicron_api-0.1.0.tar.gz
  • Upload date:
  • Size: 82.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for lumicron_api-0.1.0.tar.gz
Algorithm Hash digest
SHA256 85e67f24a135f8cfa4520e80f9ce58f05dcdc73dde59e94b587714a3223aa1b2
MD5 3da0476bdf8bb232a9f8482ecc148082
BLAKE2b-256 458ad5fe3a179f168de8da1b62e2b6f6a0c3bff33af00ab09ba1f9c2cbd85a9b

See more details on using hashes here.

File details

Details for the file lumicron_api-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: lumicron_api-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 71.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for lumicron_api-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e29b947342c6d55c0a1b17ea289ea56596c81f381f2f5f0811f1a179fc5e27ea
MD5 9a3014787d7dd59045c14b4eb25293fc
BLAKE2b-256 da9493eb3b8911e7576cab61c369af22e1c2b8506e9c490e58c50011d5fb4ddc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page