{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "e54c1eca", "metadata": {}, "outputs": [], "source": [ "import viennaps as ps # Import the ViennaPS Python bindings\n", "ps.setDimension(3) # Set the simulation dimension to 3D" ] }, { "cell_type": "code", "execution_count": null, "id": "0aa6790f", "metadata": {}, "outputs": [], "source": [ "extent = 30\n", "gridDelta = 0.3\n", "\n", "# Create a simulation domain with square XY extent and specified grid spacing\n", "domain = ps.Domain(xExtent=extent, yExtent=extent, gridDelta=gridDelta, boundary=ps.BoundaryType.REFLECTIVE_BOUNDARY)" ] }, { "cell_type": "markdown", "id": "5e5897f0", "metadata": {}, "source": [ "Add a rectangular [fin](https://viennatools.github.io/ViennaPS/geo/basic/fin.html) structure to the domain:\n", "- finWidth = 6 units\n", "- finHeight = 0 (just a mask feature)\n", "- maskHeight = 10 units (height of the resist/mask layer)" ] }, { "cell_type": "code", "execution_count": null, "id": "898f156c", "metadata": {}, "outputs": [], "source": [ "ps.MakeFin(domain, finWidth=6., finHeight=0., maskHeight=10.0).apply()" ] }, { "cell_type": "code", "execution_count": null, "id": "19ba0ee1", "metadata": {}, "outputs": [], "source": [ "domain.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "fd59fbb9", "metadata": {}, "outputs": [], "source": [ "# Save current geometry as volume mesh\n", "# domain.saveVolumeMesh(\"emulation_1\")\n", "domain.saveSurfaceMesh(\"emulation_1\", addInterfaces=True)" ] }, { "cell_type": "markdown", "id": "a3a4072d", "metadata": {}, "source": [ "Run a deposition process using [IsotropicProcess](https://viennatools.github.io/ViennaPS/models/prebuilt/isotropic.html)." ] }, { "cell_type": "code", "execution_count": null, "id": "69be2067", "metadata": {}, "outputs": [], "source": [ "# Duplicate the top-level set and assign it to SiO2 material\n", "domain.duplicateTopLevelSet(ps.Material.SiO2) # add new material layer\n", "\n", "# Apply an isotropic deposition process (e.g., CVD)\n", "# with a constant rate of 1.0 for a duration of 4.0 time units\n", "isoDepo = ps.IsotropicProcess(rate=1.0)\n", "ps.Process(domain, isoDepo, 4.0).apply()" ] }, { "cell_type": "code", "execution_count": null, "id": "9028bb27", "metadata": {}, "outputs": [], "source": [ "# Save the structure after isotropic deposition\n", "domain.saveVolumeMesh(\"emulation_2\")\n", "domain.show()" ] }, { "cell_type": "markdown", "id": "2b33e5a0", "metadata": {}, "source": [ "Etch the structure using a [DirectionalProcess](https://viennatools.github.io/ViennaPS/models/prebuilt/directional.html)." ] }, { "cell_type": "code", "execution_count": null, "id": "4485ea88", "metadata": {}, "outputs": [], "source": [ "# Apply directional (anisotropic) etching in Z direction\n", "# - This mimics vertical etching to remove top parts of the conformal layer\n", "# - calculateVisibility=False means no shadowing is considered\n", "matRates = ps.RateSet()\n", "matRates.direction = [0., 0., -1.]\n", "matRates.directionalVelocity = -1.0\n", "matRates.isotropicVelocity = 0.0\n", "matRates.calculateVisibility = False\n", "\n", "directionalEtch = ps.DirectionalProcess(matRates)\n", "ps.Process(domain, directionalEtch, 5.0).apply()" ] }, { "cell_type": "code", "execution_count": null, "id": "0aeedcf7", "metadata": {}, "outputs": [], "source": [ "# Save geometry after directional etch\n", "domain.saveVolumeMesh(\"emulation_3\")\n", "domain.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "874b371a", "metadata": {}, "outputs": [], "source": [ "# Remove the original resist/mask material\n", "# This mimics stripping the mask after sidewall transfer\n", "domain.removeMaterial(ps.Material.Mask)\n", "domain.saveVolumeMesh(\"emulation_4\")\n", "domain.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "719842aa", "metadata": {}, "outputs": [], "source": [ "# Final directional etch using the SiO2 sidewalls as a hardmask\n", "# - Directional component: 1.0 in Z\n", "# - Isotropic component: 0.1 to add some tapering\n", "# - Masking is enabled for SiO2\n", "directionalEtch = ps.DirectionalProcess(\n", " direction=[0., 0., 1.],\n", " directionalVelocity=1.0,\n", " isotropicVelocity=0.0,\n", " maskMaterial=ps.Material.SiO2,\n", " calculateVisibility=False\n", ")\n", "ps.Process(domain, directionalEtch, 20.0).apply()" ] }, { "cell_type": "code", "execution_count": null, "id": "a2f23dd0", "metadata": {}, "outputs": [], "source": [ "# Save the final result of the emulation\n", "domain.saveVolumeMesh(\"emulation_5\")\n", "domain.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "21b2f5b9", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.7" } }, "nbformat": 4, "nbformat_minor": 5 }