Skip to content

COMPASSCross-solver Optical Modeling Platform for Advanced Sensor Simulation

Simulate CMOS image sensor pixels with multiple EM solvers from a single YAML config

COMPASS

Why COMPASS?

COMPASS bridges the gap between electromagnetic theory and practical CMOS image sensor design. Define your pixel stack once, run it through any solver, and compare results -- all from Python.

Multi-Solver Engine

Run the same pixel structure through RCWA (torcwa, grcwa, meent, fmmax) and FDTD (flaport, Meep, fdtdz) solvers from a single YAML config. Compare results head-to-head.

GPU Accelerated

Leverage PyTorch and JAX GPU backends for massively parallel wavelength sweeps. Achieve 10-100x speedup over CPU-only solvers on large parameter spaces.

dJ/dx

Differentiable Simulation

Automatic differentiation through the solver enables gradient-based inverse design. Optimize microlens profiles, BARL stacks, and color filter thicknesses directly.

OK

Cross-Validation

Built-in solver comparison framework ensures physics accuracy. Compare energy balance (R+T+A=1), QE spectra, and field distributions across solver backends.

Rich Analysis

Compute QE per pixel per wavelength, crosstalk matrices, energy balance, and field distributions. Plot results with built-in matplotlib and 3D PyVista viewers.

Open Source

MIT licensed. Fully documented with theory guides, cookbooks, and API references. Built on established open-source EM solver ecosystems.

Architecture

A clean five-stage pipeline takes you from YAML configuration to publication-ready results. Click any stage to learn more.

1ConfigYAMLPixel stackSourceSolver params2GeometryPixelStackMicrolensColor filterSilicon + DTI3SolverSolverBaseRCWAFDTDTMM4Analysisanalysis/QE calculatorEnergy balanceComparison5ResultsHDF5 / PlotQE spectraField mapsCrosstalk

Solver Backends

COMPASS provides a unified interface to 8 solver backends across three electromagnetic methods. Click any solver to see details.

RCWA4 backends
FDTD3 backends
TMM1 backends

Quick Example

Define your simulation in a single YAML config and run it with three lines of Python:

yaml
# config.yaml
pixel:
  pitch: 1.0          # um
  unit_cell: [2, 2]   # 2x2 Bayer pattern

solver:
  name: torcwa
  type: rcwa
  fourier_order: 9

source:
  wavelength:
    mode: sweep
    sweep: { start: 0.4, stop: 0.7, step: 0.01 }
  polarization: unpolarized
python
from compass.runners.single_run import SingleRunner

result = SingleRunner.run("config.yaml")

for pixel, qe in result.qe_per_pixel.items():
    print(f"{pixel}: peak QE = {qe.max():.2%}")