OpenTCAD

An open-source Python framework for semiconductor process and device simulation — contributors welcome

Commercial TCAD is expensive, closed, and hard to script. OpenTCAD is my attempt at an open alternative: a modular Python framework where a single script defines a device structure, meshes it, solves the semiconductor equations on it, and produces IV/CV characteristics — with the data provenance carried along at every step.

Rather than write yet another solver, it stitches together mature open libraries — Gmsh for meshing, DEVSIM for the drift-diffusion/Poisson solve, PyVista for visualization, with ViennaPS and FiPy planned for the process side. The piece that doesn’t exist anywhere in open source, and the reason the project is interesting, is the glue: a geometry DSL that speaks in semiconductor terms, and a process-to-device mesh translator.

The design

Every layer communicates through one data object, the MeshField — a pyvista.UnstructuredGrid carrying per-cell material IDs, per-node doping, named electrical contacts, and a process-step history. There is no raw-array interface between modules, which is what guarantees geometry, doping, contacts, and provenance never drift apart. Units are enforced globally (µm, cm⁻³, K, eV); the µm→cm conversion the solver needs happens internally and never surfaces in the API.

Structures are built with a chained DSL — add_substrate, add_layer, add_region, add_contact — so a full four-terminal NMOS with n+ source/drain wells poked through the gate oxide is about ten lines. Material parameters live as validated YAML files, so adding a material means dropping in a new file rather than touching code.

The physics layer is pluggable: mobility, recombination, bandgap narrowing, carrier statistics, and contact boundary conditions are all swappable without going near the solver. Models compose — the full CMOS mobility stack (doping-dependent bulk, high-field velocity saturation, and surface degradation at the Si/SiO₂ interface) is a single nested expression:

physics = PhysicsConfig(
    mobility=Lombardi(base=Canali(base=Klaassen())),
    recombination=[SRH(), Auger()],
    bgn=Slotboom())

Currently implemented: Klaassen unified bulk mobility, Canali velocity saturation, Lombardi surface mobility, SRH/Auger/radiative recombination, Slotboom bandgap narrowing, Fermi-Dirac statistics, and ohmic plus Schottky contacts.

Validation

Phase 0 is complete and validated against analytics rather than vibes — a 1-D p-n junction IV within 5% of Shockley, a 2-D MOS capacitor reproducing all three regimes with surface potential saturating near 2·φ_F at strong inversion, and a 2-D NMOS Id–Vgs with clean turn-on and an on/off ratio above 10¹⁰ at Vds = 50 mV. The suite is 63 tests across geometry, materials, physics models, and full device integration.

p-n junction forward IV with a semilog slope matching q/kT; quasi-static MOS-capacitor CV; and the 2-D NMOS transfer characteristic at Vds = 50 mV.

The roadmap runs through ViennaPS-backed topography (etch, deposition, Deal-Grove oxidation with a moving boundary), Pearson IV implant and FiPy diffusion, and quantitative calibration against the SKY130 and IHP SG13G2 open PDKs, with a NEGF backend as a longer-term extension.

Contributing

OpenTCAD is Apache 2.0 licensed and openly developed, and it is at the stage where contributions compound. The most useful things to add, roughly in order:

  • Material parameter files. Each material is a single YAML file with literature citations — bandgap, effective densities of states, mobility, SRH lifetimes. Si and SiO₂ exist; Si₃N₄, poly-Si, SiGe and the III-Vs do not. Adding one needs no knowledge of the solver internals.
  • Physics models. Mobility, recombination, bandgap-narrowing and statistics models are pluggable — one new file under opentcad/device/models/ subclassing the relevant base.
  • Worked examples and notebooks, which double as documentation and as regression tests.
  • The process side. Phases 1–2 (ViennaPS topography, Pearson IV implant, FiPy diffusion, and the process-to-device mesh translator) are open, and the mesh translator in particular is the piece that does not exist anywhere in open source.

If any of that is near your work, please open an issue — I would rather talk through a change before you write it than have you discover the architecture the hard way.

Repository: github.com/abhineet-agarwal/opentcad