{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "# GDSII import\n", "\n", "\n", "\n", "In Tidy3D, complex structures can be defined or imported from GDSII files via the third-party [gdstk](https://heitzmann.github.io/gdstk/) package. In this tutorial, we will first illustrate how to use the package to define a structure, then we will save this to file, and then we will read that file and import the structures in a simulation.\n", "\n", "Note that this tutorial requires gdstk, so grab it with `pip install gdstk` before running the tutorial or uncomment the cell line below." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2023-02-03T01:42:31.300776Z", "iopub.status.busy": "2023-02-03T01:42:31.300304Z", "iopub.status.idle": "2023-02-03T01:42:32.491156Z", "shell.execute_reply": "2023-02-03T01:42:32.490752Z" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
[19:42:32] WARNING This version of Tidy3D was pip installed from the 'tidy3d-beta' repository on __init__.py:103\n", " PyPI. Future releases will be uploaded to the 'tidy3d' repository. From now on, \n", " please use 'pip install tidy3d' instead. \n", "\n" ], "text/plain": [ "\u001b[2;36m[19:42:32]\u001b[0m\u001b[2;36m \u001b[0m\u001b[31mWARNING \u001b[0m This version of Tidy3D was pip installed from the \u001b[32m'tidy3d-beta'\u001b[0m repository on \u001b]8;id=467878;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=198439;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/__init__.py#103\u001b\\\u001b[2m103\u001b[0m\u001b]8;;\u001b\\\n", "\u001b[2;36m \u001b[0m PyPI. Future releases will be uploaded to the \u001b[32m'tidy3d'\u001b[0m repository. From now on, \u001b[2m \u001b[0m\n", "\u001b[2;36m \u001b[0m please use \u001b[32m'pip install tidy3d'\u001b[0m instead. \u001b[2m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
INFO Using client version: 1.9.0rc1 __init__.py:121\n", "\n" ], "text/plain": [ "\u001b[2;36m \u001b[0m\u001b[2;36m \u001b[0m\u001b[34mINFO \u001b[0m Using client version: \u001b[1;36m1.9\u001b[0m.0rc1 \u001b]8;id=121716;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/__init__.py\u001b\\\u001b[2m__init__.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=739439;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/__init__.py#121\u001b\\\u001b[2m121\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# standard python imports\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import gdstk\n", "import os\n", "\n", "# tidy3d import\n", "import tidy3d as td\n", "from tidy3d import web" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating a beam splitter with gdstk\n", "\n", "First, we will construct an integrated beam splitter as in the title image in this notebook using `gdstk`. If you are only interested in importing an already existing GDSII file, just jump ahead to the next section.\n", "\n", "We first define some structural parameters. We consider the sidewall of the device to be slanted, deviating from the vertical sidewall by `sidewall_angle`. `sidewall_angle>0` corresponds to a typical fabrication scenario where the base of the device is larger than the top.\n", "\n", "We define the device by constructing the cross section of the device. The cross section can be supplied at the `top`, `bottom`, or the `middle` of the device, specified by the parameter `reference_plane`. Here we choose to define the cross section on the base. On the base, the two arms of the device start at a distance `wg_spacing_in` apart, then come together at a coupling distance `wg_spacing_coup` for a certain length `coup_length`, and then split again into separate ports. In the coupling region, the field overlap results in energy exchange between the two waveguides. Here, we will only see how to define, export, and import such a device using `gdstk`. When importing the device, we can optionally dilate or erode its cross section via `dilation`. In a later example we will simulate the device and study the frequency dependence of the transmission into each of the ports." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2023-02-03T01:42:32.493752Z", "iopub.status.busy": "2023-02-03T01:42:32.493467Z", "iopub.status.idle": "2023-02-03T01:42:32.496521Z", "shell.execute_reply": "2023-02-03T01:42:32.496162Z" }, "tags": [] }, "outputs": [], "source": [ "### Length scale in micron.\n", "\n", "# Waveguide width\n", "wg_width = 0.45\n", "# Waveguide separation in the beginning/end\n", "wg_spacing_in = 8\n", "# Length of the coupling region\n", "coup_length = 10\n", "# Angle of the sidewall deviating from the vertical ones, positive values for the base larger than the top\n", "sidewall_angle = np.pi / 6\n", "# Reference plane where the cross section of the device is defined\n", "reference_plane = \"bottom\"\n", "# Length of the bend region\n", "bend_length = 16\n", "# Waveguide separation in the coupling region\n", "wg_spacing_coup = 0.10\n", "# Total device length along propagation direction\n", "device_length = 100" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Generating Geometry\n", "To create the device, we will use the `RobustPath` class to define two parallel waveguide with a variable distance between them. First, we define a helper fuction that will give the shape of the waveguides in the S-bends that bring them together and then apart. The distance between them (described by the `offset` parameter in `RobustPath`) will follow a hyperbolic tangent function, so we create a helper function that simple produces a normalized version of _tanh_ in the unit interval." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2023-02-03T01:42:32.498638Z", "iopub.status.busy": "2023-02-03T01:42:32.498467Z", "iopub.status.idle": "2023-02-03T01:42:32.646467Z", "shell.execute_reply": "2023-02-03T01:42:32.645919Z" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "