Skip to content

Sample Pixel Structures

This guide documents a set of representative CMOS image sensor pixel architectures spanning the 0.56–1.6 µm pitch range and shows how to simulate them in COMPASS. Each sample ships as a ready-to-run YAML config under configs/pixel/, and a Python helper (compass.geometry.derive_parameters) generates a complete config from a small set of headline inputs.

Why filling in a pixel config is non-trivial

Public information about modern flagship pixels is typically limited to headline parameters — pixel pitch, color-filter binning, OCL sharing, and the marketing names of structural innovations (split-substrate transistors, LOFIC, 4×4 super-cell binning). The internal numbers needed for an electromagnetic simulation are almost never disclosed:

  • microlens sag / radius / material refractive index
  • color-filter, planarization, BARL stack thicknesses
  • DTI trench width, depth, and fill material
  • photodiode lateral footprint and z-extent

COMPASS supplies physically reasonable defaults for these via empirical scaling rules (Section Parameter determination).

Sample pixel structures

KeyConfig filePitchCFA patternOCL sharingNotable feature
sample_p0p56um_4x4oclsample_p0p56um_4x4ocl.yaml0.56 µm4×4 super-cell1Sub-µm pixel, high-RI microlens (n ≈ 1.70), F-DTI SiO₂
sample_p1p0um_quadbayersample_p1p0um_quadbayer.yaml1.0 µmQuad Bayer (2×2)1Standard 50-MP-class main-camera pixel, F-DTI SiO₂
sample_p1p6um_split_pdsample_p1p6um_split_pd.yaml1.6 µmStandard Bayer1Split-substrate transistors → enlarged photodiode (~2× volume)
sample_p1p22um_2x2oclsample_p1p22um_2x2ocl.yaml1.22 µmQuad Bayer2One large microlens per 2×2 same-color group (all-pixel PDAF)
sample_p1p2um_loficsample_p1p2um_lofic.yaml1.2 µmQuad Bayer2LOFIC HDR — capacitor reduces PD footprint, 2×2 OCL
sample_p1p12um_nirsample_p1p12um_nir.yaml1.12 µmStandard Bayer1NIR-enhanced: backside inverted-pyramid texture, lined+tapered DTI, ML residual base

Run any of them with Hydra:

bash
python scripts/run_simulation.py pixel=sample_p0p56um_4x4ocl source=wavelength_sweep
python scripts/run_simulation.py pixel=sample_p1p6um_split_pd solver=torcwa
python scripts/run_simulation.py pixel=sample_p1p2um_lofic source=cone_illumination
python scripts/run_simulation.py pixel=sample_p1p12um_nir source=wavelength_sweep

sample_p0p56um_4x4ocl — sub-µm pixel with 4×4 binning

Smallest-pitch sample. Distinctive optical features:

  • Pitch = 0.56 µm.
  • 4×4 same-color super-cell color filter (16-cell binning); 8×8 unit cell.
  • High-refractive-index microlens modelled via the polymer_hri_n1p70 (TiO₂-doped polymer, n ≈ 1.70) entry registered in MaterialDB.
  • F-DTI with SiO₂ fill (oxide-fill DTI for lower crosstalk).
  • Rounded-rectangle CF grid (grid.corner_radius = 0.05 µm) approximating photolithography corner rounding at sub-µm pitches.

sample_p1p0um_quadbayer — 1.0 µm Quad Bayer

Generic 50-MP-class main-camera pixel. Quad Bayer + per-pixel OCL + F-DTI SiO₂.

sample_p1p6um_split_pd — 1.6 µm split-substrate pixel

Large-pitch sample with photodiode and pixel transistors placed on different substrate layers, freeing up area for the photodiode and approximately doubling the saturation signal level.

Optical model: the photodiode now occupies most of the pixel footprint laterally and extends deeper, both modelled via a larger photodiode.size in silicon.

sample_p1p22um_2x2ocl — 2×2 OCL Quad Bayer

Phone main-camera-class pixel with 2×2 on-chip lens sharing: a single microlens covers a 2×2 same-color group, enabling all-pixel phase-detection autofocus. Modelled with microlens.sharing: 2.

sample_p1p2um_lofic — LOFIC HDR

50-MP-class, 1.2 µm. LOFIC (Lateral Overflow Integration Capacitor) consumes part of the in-pixel silicon real-estate for HDR, which we model as a slightly smaller photodiode footprint. Quad PD adds 2×2 OCL on top.

sample_p1p12um_nir — NIR-enhanced BSI pixel

1.12 µm pixel that showcases the structural-realism features described in Pixel Structure Realism. It enables a backside inverted-pyramid array for long-wavelength light trapping, a DTI trench with a conformal high-k (Al₂O₃) liner and a tapered sidewall, a microlens residual base layer, and a deep (4 µm) silicon photodiode for NIR capture. See the Pixel Structure Realism report for cross-sections rendered from the actual solver permittivity.

Parameter determination

There are three complementary approaches to filling in the layer parameters that are not publicly disclosed.

1. Empirical scaling rules (default)

compass.geometry.derive_parameters ships pitch-based scaling rules derived from public ISSCC, IEDM, SPIE pixel-architecture papers (2018–2024) and reverse-engineering cross-section reports for sub-µm to 2 µm BSI pixels:

python
from compass.geometry import derive_parameters, PixelStack

cfg = derive_parameters(sample="sample_p0p56um_4x4ocl", cra_deg=20.0)
stack = PixelStack({"pixel": cfg})

The rules currently used are:

QuantityDefault rule
Microlens sagmin(0.95, 0.42·pitch + 0.20) µm
Microlens semi-axis(sharing·pitch − 2·gap) / 2 µm
Microlens gap0.02 + 0.02·min(pitch, 2) µm
Color-filter thicknesspiecewise: 0.35 + 0.25·(pitch/0.7) for sub-µm; min(0.90, 0.45·pitch + 0.15) otherwise
Planarization thickness0.20 + 0.10·min(pitch, 2)/2 µm
DTI trench width0.05 + 0.025·min(pitch, 2) µm (process-limited)
Silicon epi thicknessmin(4.5, 1.4 + 1.5·pitch) µm
Photodiode footprint0.70·pitch (0.88·pitch for split-PD, 0.65·pitch for LOFIC)
Photodiode z-extent0.67·t_Si (0.85·t_Si for split-PD)

Architecture flags (split_pd, lofic) drive the photodiode geometry adjustments. These defaults reproduce typical published cross-sections to within ~30%.

2. Calibration to measured QE / crosstalk

If you have measured QE(λ) per color or measured spatial crosstalk, fit the unknown parameters with the optimization framework:

python
from compass.geometry import derive_parameters
from compass.optimization import (
    ParameterSpace, MicrolensHeight, BARLThicknesses, Optimizer
)

base = derive_parameters(sample="sample_p1p0um_quadbayer", cra_deg=0.0)

space = ParameterSpace([
    MicrolensHeight(min=0.4, max=0.8),
    BARLThicknesses(min=0.005, max=0.05, n_layers=4),
])

# Custom objective: L2 distance to measured QE curves.
optimizer = Optimizer(method="L-BFGS-B", parameter_space=space)
best = optimizer.minimize(
    objective=lambda params: l2_to_measured(params, measured_qe),
    base_config=base,
)

This is the recommended workflow when matching a real product.

3. Direct measurement (SEM / die-shot cross-section)

When a die-shot SEM image is available, measure layer thicknesses directly and override the heuristic via the overrides argument:

python
cfg = derive_parameters(
    sample="sample_p0p56um_4x4ocl",
    overrides={
        "layers.silicon.thickness": 1.85,      # measured Si thickness
        "layers.color_filter.red.thickness": 0.43,
        "layers.color_filter.green.thickness": 0.42,
        "layers.color_filter.blue.thickness": 0.45,
        "layers.silicon.dti.width": 0.075,
    },
)

overrides accepts dotted keys at any depth and wins over the heuristic.

Sample headlines reference

The headline values are stored in compass.geometry.SAMPLE_HEADLINES and can be used as the entry point for derive_parameters:

python
>>> from compass.geometry import SAMPLE_HEADLINES
>>> SAMPLE_HEADLINES["sample_p0p56um_4x4ocl"]
{'pitch': 0.56, 'megapixels': 200, 'cf_pattern': 'tetra2cell',
 'ocl_sharing': 1, 'microlens_material': 'polymer_hri_n1p70',
 'dti_fill': 'sio2', 'year': 2024}

References

The sample structures above are inspired by publicly-available descriptions of recent commercial CIS products. The configs are intentionally generic — values are derived from the empirical scaling rules in this guide rather than from any single vendor process — but the following links provide background reading for the technologies they illustrate: