← SSC (spot size converter)

2.5% 3 µm × 3 µm SSC @ 1550 nm

2.5% Δ silica channel waveguide (3×3 µm) ↔ SMF-28 at 1550 nm — segments that gradually widen on the narrowest pitch the mask rule allows (every tooth and gap ≥ 0.5 µm), optimized with a genetic algorithm driving a 3D BPM through the real tooth/gap geometry. Coupling loss 0.239 dB.

Target & SMF parameters

The last field is the mode-field diameter the SSC facet presents to the SMF (the optimized device delivers ≈ 11.5 × 10.0 µm, geometric mean ≈ 10.7 µm). Set it equal to the bare WG MFD to see the loss without a converter.

n_core (from Δ)
—
n_clad (silica, Sellmeier)
—
Bare WG mode field diameter (D4σ)
—
Coupling loss — bare WG ↔ SMF
—
Coupling loss — SSC tip ↔ SMF
—
Improvement
—
SSC quality
—

Gaussian–Gaussian overlap model for a quick estimate; the reported design numbers below come from the true-segment 3D BPM.

Mode field cross-section — blue: SMF Gaussian, red dashed: bare WG mode, green: expanded SSC-tip mode. Larger overlap with the SMF means lower loss.

Why a spot size converter

Structure & design variables

Chip waveguide 3 µm solid (20 µm lead) → segmented section whose segments widen from 3 µm toward the SMF facet while their duty falls. Each period starts with a gap, then a tooth; the facet is cut at the end of the last tooth. The segment list is generated from a small gene vector:

VariableMeaningSearch rangeOptimized
LSegmented-section length400 – 1500 µm819 µm
W_facetSegment width at the SMF facet (start = 3 µm)4.5 – 9.0 µm7.10 µm
p_wWidth ramp exponent, w(s) = 3 + (W_facet − 3)·s^p_w0.4 – 2.51.19
d_startDuty of the first segment0.70 – 0.900.846
d_facetDuty at the facet0.15 – 0.350.167
p_dDuty ramp exponent, d(s) = d_start + (d_facet − d_start)·s^p_d0.4 – 2.50.65
P_minGlobal pitch floor (above the 2nd-order Bragg band)1.15 – 1.50 µm1.21 µm
Local pitch rule:   Pk = max( P_min , 0.5 µm / (1 − d) , 0.5 µm / d )  → nudged out of the Bragg bands m·λ / (2 neff), m = 2…6 (±0.03 µm guard)

So the gap is pinned at 0.5 µm near the chip (high duty), the pitch drops to P_min = 1.21 µm through the mid-duty region where scattering would be strongest, and the tooth is pinned at 0.5 µm near the facet (low duty). Every tooth and gap is ≥ 0.5 µm by construction (1 nm grid, rounded up). The BPM is one-way, so contra-directional Bragg reflection is screened analytically by the band rule.

Optimization workflow (GA ⇄ 3D BPM)

Objective: minimize   f(g) = −10·log₁₀ η(g),   η = |∫ Eout·ESMF* dA|² / ∫|ESMF|² dA   (input = unit-power chip mode)
# ga_widen.py (excerpt)
def fitness(genes):
    des   = from_genes(genes)                      # WideningSSC: tooth list, DRC by construction
    psi,_ = bpm.run(chip_mode, segmented_slices(des, grid, plat, dz=0.25))
    return -10*log10(grid.overlap_raw(psi, smf))   # dB, smaller is better

# The mode solver and the BPM share the same 5-point Laplacian, so an eigenmode
# propagates unchanged (500 um self-overlap 0.99999999) -- no mode-beating artefact.

GA optimization result @ 1550 nm

A pure-Python pipeline (tooth-list generator → self-written ADI 3D BPM with numba → genetic algorithm → gdstk) was run for the target spec: chip waveguide 3 µm × 3 µm solid on the left, 7.1 µm-wide low-duty SMF facet on the right, thickness fixed at 3 µm, every tooth and gap ≥ 0.5 µm.

QuantityOptimized value
Coupling loss @ 1550 nm (fine grid, dx = 0.10 µm)0.239 dB (η = 94.7 %)
Bare 3×3 µm WG ↔ SMF (no SSC)3.32 dB
Number of segments / total length533 / 840 µm (incl. 20 µm lead)
Width ramp (start → facet)3.0 → 7.10 µm
Duty ramp (start → facet)0.846 → 0.167
Pitch (chip → middle → facet)3.25 → 1.21 → 2.98 µm
Tooth / gap (chip end)2.75 µm / 0.50 µm
Tooth / gap (facet end)0.50 µm / 2.48 µm
DRC (from the GDS tooth list)min tooth 0.500 µm · min gap 0.500 µm · min width 3.0 µm PASS
Output spot (D4σ, x × y)11.5 × 10.0 µm
Residual (non-radiated) power at the facet0.978

The chip mode (3.9 µm) expands through the widening, thinning segments to ≈ 11.5 × 10.0 µm at the facet. Compared with the earlier uniform-width (3 µm) design with a fixed 2.02 µm pitch (0.294 dB, kept below as the reference), widening the segments lowers the facet-mode limit to 0.159 dB and the dense mid-section pitch keeps the segment radiation small, so the device reaches 0.239 dB.

ToleranceConditionLoss
Wavelength1500 / 1525 / 1575 / 1600 nm0.243 / 0.237 / 0.251 / 0.268 dB
CD bias (tooth length and width)−0.10 / −0.05 / +0.05 / +0.10 µm0.304 / 0.301 / 0.267 / 0.276 dB
Facet cut position−0.25 µm … +2.0 µm0.239 – 0.248 dB
SMF offset (x / y)0.5 µm / 1.0 µm0.28 / 0.39 – 0.41 dB
Widening segmented SSC: geometry, duty/width ramps, pitch rule, GA convergence, top/side BPM field, facet field vs SMF, tolerances
GA-optimized SSC — geometry, duty / width ramps, the minimum-pitch rule (tooth and gap ≥ 0.5 µm), GA convergence, top & side |E|² propagation, the facet field against SMF-28, and wavelength / misalignment / fabrication tolerances.
Uniform-width reference SSC vs widening optimized SSC
Reference uniform-width segmented SSC (fixed pitch 2.02 µm, 0.294 dB) vs. the GA-optimized widening, minimum-pitch geometry (0.239 dB), both on the same dx = 0.10 µm grid.

Method check: a 2D full-wave FDTD of 60 µm segmented sections (pitch 2.0–2.8 µm, duty 0.3–0.75) gives segment losses within −0.06 / +0.02 dB of the paraxial BPM (fdtd2d_calibration.json), so the paraxial BPM is slightly optimistic for segment scattering — a realistic expectation is ≈ 0.24–0.27 dB. The calculation is scalar (polarization-averaged); facet Fresnel reflection is excluded (index-matched butt coupling).

Downloads

Everything needed to reproduce the result above:

Run with python3 ga_widen.py → python3 verify_widen.py → python3 make_gds_widen.py (needs numpy, scipy, numba, gdstk, matplotlib). The GA takes ≈ 40 min on 2 cores; always re-validate the final candidate on the fine grid (dx ≤ 0.10 µm). The earlier uniform-width study (scripts, solid inverse-taper alternative) is kept in archive_uniform/.

Equations

SMF mode (Gaussian): E_SMF(r) = exp(−r²/w²),   w = MFD/2 = 5.2 µm
Overlap: η = |∫ E_a·E_b* dA|² / (∫|E_a|² dA · ∫|E_b|² dA),    Loss(dB) = −10·log₁₀(η)
Index from Δ: n_core = n_clad / √(1 − 2Δ),   Δ = (n_core² − n_clad²)/(2 n_core²);   n_clad = 1.44402 (Malitson), n_core = 1.48154  (the browser panel uses n_clad/(1 − Δ) — within 0.0005)
Paraxial BPM: ∂ψ/∂z = (i / 2β₀) [ ∂²/∂x² + ∂²/∂y² + k₀² n²(x,y,z) − β₀² ] ψ   (Peaceman–Rachford ADI, Crank–Nicolson)

Reference implementations