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: