Skip to main content

Open-source computational lithography benchmarking and workflow tool

Project description

OpenLithoHub

OpenLithoHub

Open-source computational lithography benchmarking and workflow toolkit for advanced EUV/curvilinear mask processes.

License Python 3.10+ CI Open In Colab

Website: openlithohub.com | Docs: docs.openlithohub.com | Playground: HuggingFace Space

中文版 / Chinese Version


What is OpenLithoHub?

OpenLithoHub provides a unified evaluation and workflow framework for computational lithography research. It bridges the gap between academic tensor-based optimization and industrial mask manufacturing by offering:

  • Unified dataset access — single interface to LithoBench, LithoSim, GAN-OPC, ICCAD'16 hotspot, ASAP7, FreePDK45 + NanGate OCL, and ORFS-routed RISC-V layouts
  • Standardized metrics — EPE, PV Band, shot count, EUV stochastic robustness, hotspot detection (recall / precision / F1)
  • Manufacturing compliance — MRC/DRC rule checking as hard-fail gating
  • OASIS workflow — end-to-end pipeline from tensor to fab-ready mask (manhattan & curvilinear)
  • Model-agnostic evaluation — plug any OPC/ILT model into the benchmark via a minimal interface
┌─────────────────────────────────────────────────────────────────┐
│                       OpenLithoHub                              │
├─────────────┬──────────────┬──────────────┬───────────┬─────────┤
│  Data Layer │  Benchmark   │   Workflow   │ Vis & UX  │   CLI   │
│ LithoBench  │  EPE/PVBand  │ Tiling/Stitch│ Paper figs│ eval    │
│ LithoSim    │  MRC/DRC     │ Contour Ext. │ Jupyter   │ optimize│
│ Transforms  │  Stochastic  │ OASIS Export │ EDA bridge│leaderbd │
│ Dummy gen.  │  Shot Count  │ B-spline Fit │           │         │
└─────────────┴──────────────┴──────────────┴───────────┴─────────┘

Installation

# Core (metrics + CLI)
pip install openlithohub

# With dataset support (HuggingFace, parquet)
pip install openlithohub[data]

# With full workflow (KLayout, scipy for B-spline)
pip install openlithohub[workflow]

# Everything
pip install openlithohub[all]

From source (development):

git clone https://github.com/OpenLithoHub/OpenLithoHub.git
cd OpenLithoHub
pip install -e ".[dev]"

Quick Start

Evaluate a model

openlithohub eval run \
  --model dummy-identity \
  --dataset lithobench \
  --data-root ./data/lithobench \
  --format table

Output:

┌──────────────────┬────────────────┐
│ Metric           │ Value          │
├──────────────────┼────────────────┤
│ epe_mean_nm      │ 0.0000         │
│ epe_max_nm       │ 0.0000         │
│ mrc_violation_rate│ 0.0000        │
│ mrc_passed       │ 1.0000         │
└──────────────────┴────────────────┘

Run end-to-end optimization

openlithohub optimize run \
  --input design.oas \
  --model your-model \
  --writer mbmw \
  --node 3nm-euv \
  --drc-check \
  --output optimized.oas

Use as a Python library

import torch
from openlithohub.benchmark.metrics import compute_epe, compute_pvband
from openlithohub.benchmark.compliance import check_mrc, check_drc

predicted = torch.load("predicted_mask.pt")
target = torch.load("target_mask.pt")

# Edge Placement Error
epe = compute_epe(predicted, target, pixel_size_nm=1.0)
print(f"EPE mean: {epe['epe_mean_nm']:.2f} nm")

# Process Variation Band
pvb = compute_pvband(predicted, defocus_range_nm=20.0)
print(f"PV Band: {pvb['pvband_mean_nm']:.2f} nm")

# Manufacturing compliance
mrc = check_mrc(predicted, min_width_nm=40.0, min_spacing_nm=40.0)
print(f"MRC passed: {mrc.passed} ({mrc.violation_count} violations)")

Register a custom model

from openlithohub.models.base import LithographyModel, PredictionResult
from openlithohub.models.registry import registry

@registry.register
class MyOPCModel(LithographyModel):
    @property
    def name(self) -> str:
        return "my-opc"

    @property
    def supports_curvilinear(self) -> bool:
        return True

    def predict(self, design: torch.Tensor, **kwargs) -> PredictionResult:
        mask = my_optimization_algorithm(design)
        return PredictionResult(mask=mask)

Paper-ready figures

from openlithohub.vis import plot_contours

# Vector PDF, IEEE column-width, colorblind-safe palette
plot_contours(target, predicted, save_path="fig.pdf", style="ieee")

Hermetic dummy layouts (for CI / Colab)

from openlithohub.data import generate_dummy_layout

mask = generate_dummy_layout(size=256, seed=0)  # numpy + torch only, no KLayout

EDA bridge (Calibre / IC Validator)

from openlithohub.workflow import BridgeRules, emit_bridge_bundle

emit_bridge_bundle(
    "optimized.oas",
    BridgeRules(min_width_nm=40.0, min_spacing_nm=40.0),
)
# Writes optimized.svrf, optimized.rs, optimized.bridge.md

Try it in Colab

The notebooks/quickstart.ipynb tutorial runs end-to-end on Colab's stock runtime — install, generate a layout, score it, and produce a paper-ready figure in three minutes.

Open In Colab

For plugging your own model into the harness, use the BYOM tutorial — it walks through subclassing LithographyModel, running the standard metric suite, and formatting a leaderboard submission.

Open BYOM In Colab


Architecture

Layer Module Description
Data openlithohub.data Unified adapters for LithoBench (.npy), LithoSim (HuggingFace), GAN-OPC (paired PNGs), ICCAD'16 hotspot (OASIS via klayout)
Benchmark openlithohub.benchmark EPE, PV Band, shot count, stochastic robustness, hotspot detection, MRC/DRC compliance
Models openlithohub.models Abstract LithographyModel interface + decorator-based registry
Workflow openlithohub.workflow Layout parsing, tiling, contour extraction (manhattan/curvilinear), OASIS export
CLI openlithohub.cli eval, optimize, and leaderboard command groups via Typer

Metrics

Metric Description Reference
EPE Edge Placement Error — distance between predicted and target contour edges Standard
PV Band Process Variation Band — resist contour variation across dose/focus window Standard
Shot Count Mask write time proxy for MBMW and VSB writers Industry
Stochastic Robustness Monte Carlo photon noise simulation for bridge/break probability EUV-specific
MRC Minimum width/spacing rule check (hard-fail) EasyMRC
Curvilinear MRC Minimum curvature radius + minimum feature area for post-ILT curvilinear shapes (MBMW writability) EUV-specific
DRC Design Rule Check: area, notch, width, spacing OpenDRC

Supported Datasets

Dataset Format Process Node Task Source
LithoBench NumPy .npy 45nm Mask optimization NeurIPS'23
LithoSim HuggingFace Parquet Sub-28nm Mask optimization NeurIPS'25
GAN-OPC Paired PNGs AI-OPC training TCAD'20
ICCAD'16 Problem C OASIS + CSV N7 EUV Hotspot detection ICCAD'16
ASAP7 standard cells GDSII (klayout) 7nm predictive PDK-aware OPC The-OpenROAD-Project/asap7
FreePDK45 + NanGate OCL GDSII (klayout) 45nm predictive PDK-aware OPC mflowgen/freepdk-45nm
ORFS-routed ASAP7 GDSII (klayout) 7nm RISC-V tile-cut hotspots OpenROAD-flow-scripts

Baselines

Reference numbers for the bundled models on eight synthetic 64×64 layouts (square, line, line/space, T, L, cross, contacts, dense lines). These are generated end-to-end by scripts/generate_baselines.py and persisted under baselines/. See docs/benchmarks.md for the methodology, the Hopkins forward model, and reproduction instructions.

Model EPE mean (nm) EPE max (nm) PVB mean (nm) MRC pass
dummy-identity 0.000 0.000 2.140 0%
rule-based-opc (analytic OPC bias) 0.530 1.414 2.487 0%
levelset-ilt (Gaussian PSF, 200 iters) 0.036 0.250 2.128 0%
neural-ilt (untrained U-Net) 15.074 24.637 2.497 100%

See baselines/results.md for per-pattern breakdowns.

Reproduce locally:

python scripts/generate_baselines.py --synthetic --limit 8 --output baselines/

Optical forward models

OpenLithoHub ships two differentiable forward models, both written in pure PyTorch so the entire ILT loop is end-to-end auto-differentiable:

Model Module Notes
Gaussian PSF openlithohub._utils.forward_model.simulate_aerial_image Single-Gaussian convolution; cheap default for tests and small grids
Hopkins SOCS openlithohub._utils.simulate_aerial_image_hopkins Partial-coherent imaging via SVD-truncated Sum-Of-Coherent-Systems; supports circular / annular / dipole illumination

Switch LevelSetILTModel to Hopkins:

from openlithohub._utils import HopkinsParams
from openlithohub.models.levelset_ilt import LevelSetILTModel

model = LevelSetILTModel(
    iterations=200,
    forward_model="hopkins",
    hopkins_params=HopkinsParams(
        wavelength_nm=193.0, na=1.35, sigma=0.7, num_kernels=24, pixel_size_nm=2.0,
    ),
)

Development

# Run tests
pytest tests/ -v

# Lint
ruff check src/ tests/

# Type check
mypy src/

# Format
ruff format src/ tests/

Roadmap

  • Milestone 1: Unified data adapters, EPE metric, eval CLI
  • Milestone 2: MRC compliance, Manhattan contour extraction, tiling, shot count
  • Milestone 3: OASIS workflow, PV Band, stochastic robustness, DRC, B-spline fitting, optimize CLI
  • Milestone 4: Public leaderboard, MkDocs documentation site, CI/CD for docs
  • Milestone 5: Web playground (HuggingFace Spaces)
  • Milestone 6: Real ILT models (LevelSet-ILT, Neural-ILT U-Net), DTCO process nodes, resist simulation, model hub, Jupyter integration, PyPI/Docker CI/CD
  • Milestone 7: Paper-ready visualization, dummy layout generator, EDA bridge templates, Colab quickstart
  • Milestone 8: Multi-stage KLayout Docker, AI-engineer terminology guide, Auto-Leaderboard CI, community charter (Discord), v0.1 launch announcement
  • Milestone 9: PDK-aware synthetic layout generator, vendor-neutral simulator hook API, EUV 3D-mask shadow proxy, Monte Carlo failure metric, Mini-Hackathon (2026-Q3), RFC 0001 (Layout-MAE) + RFC 0002 (Layout Tokens)
  • Milestone 10: Real PDK rollout — ASAP7 standard cells, FreePDK45 + NanGate OCL, ORFS-routed RISC-V mock-alu (issue #4)

Related Projects

Project Venue Role in Ecosystem
LithoSim NeurIPS'25 Sub-28nm industrial dataset
LithoBench NeurIPS'23 45nm evaluation framework
TorchLitho 2.0 ASICON'25 Differentiable lithography simulator
curvyILT NVIDIA arXiv'24 GPU-accelerated curvilinear ILT
EasyMRC TODAES'25 MRC reference implementation

Contributing

See CONTRIBUTING.md for guidelines.


Community

Status

A Discord server for OpenLithoHub is launching 2026-Q3 — channels for model discussion, physics simulation, help, and showcase. The place to debate model design, reproducibility, and benchmarks.

Want to be notified when the invite goes live? Open an issue with the community label or watch this repo. Charter, channel structure, etiquette, and onboarding flow are documented in docs/community.md.

📣 Read the launch announcement: v0.1 release post — includes paste-ready copy for X / LinkedIn / 知乎 / HuggingFace Forum.

🏆 Mini-hackathon launching 2026-Q3charter & rules. EPE target, frozen test split, hard MRC/DRC gate, separate leaderboard track.


Disclaimer

OpenLithoHub is a purely academic, open-source project for fundamental research in computational physics and machine learning. It relies solely on publicly available datasets and published algorithms. It does not contain, nor does it seek to reverse-engineer, any proprietary commercial EDA tools or export-controlled manufacturing processes.

License

OpenLithoHub uses a layered licensing model:

You may freely use OpenLithoHub commercially under the open-source license (attribution and the NOTICE file are the only requirements). For commercial licensing options without attribution, with patent indemnification, or with SLA-backed support, see COMMERCIAL-USE.md.

To cite OpenLithoHub in academic work, see CITATION.cff. Contributors: please review CONTRIBUTING.md and the Contributor License Agreement. Security issues: SECURITY.md.

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

openlithohub-0.1.0a2.tar.gz (976.7 kB view details)

Uploaded Source

Built Distribution

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

openlithohub-0.1.0a2-py3-none-any.whl (163.7 kB view details)

Uploaded Python 3

File details

Details for the file openlithohub-0.1.0a2.tar.gz.

File metadata

  • Download URL: openlithohub-0.1.0a2.tar.gz
  • Upload date:
  • Size: 976.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for openlithohub-0.1.0a2.tar.gz
Algorithm Hash digest
SHA256 017ab24711a6c7b077a0f7dfca8aad3e0566e7526e638e4581f2c3fbab91b34a
MD5 1a183a636f4b301bce24f8d2e7df6a27
BLAKE2b-256 0d1ddfffe38c9ea0dadf7fd31a3511a516a92582180161514acd6f7906ed2294

See more details on using hashes here.

Provenance

The following attestation bundles were made for openlithohub-0.1.0a2.tar.gz:

Publisher: publish.yml on OpenLithoHub/OpenLithoHub

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openlithohub-0.1.0a2-py3-none-any.whl.

File metadata

  • Download URL: openlithohub-0.1.0a2-py3-none-any.whl
  • Upload date:
  • Size: 163.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for openlithohub-0.1.0a2-py3-none-any.whl
Algorithm Hash digest
SHA256 53713f1abf453fdaf35907d679a24340a522c89bac5c9f157ce8daff17aaf8ed
MD5 91ceb5ed662b19516622014e78bcf244
BLAKE2b-256 6a432c9c08bfe30d40ee949a44406107cb72966075320129a4cd9efff03a19d4

See more details on using hashes here.

Provenance

The following attestation bundles were made for openlithohub-0.1.0a2-py3-none-any.whl:

Publisher: publish.yml on OpenLithoHub/OpenLithoHub

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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