siepic-sin-forge 1.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- siepic_sin_forge-1.2.0/LICENSE +19 -0
- siepic_sin_forge-1.2.0/PKG-INFO +105 -0
- siepic_sin_forge-1.2.0/README.md +91 -0
- siepic_sin_forge-1.2.0/pyproject.toml +55 -0
- siepic_sin_forge-1.2.0/setup.cfg +4 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/__init__.py +34 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/_component_data.py +189 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/_layers.py +116 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/component.py +107 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/ANT_MMI_1x2_te1550_3dB_BB.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/GC_SiN_TE_1310_8degOxide_BB.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/GC_SiN_TE_1550_8degOxide_BB.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/ULaval.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/crossing_SiN_1550.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/crossing_SiN_1550_extended.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/crossing_horizontal.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/crossing_manhattan.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_BondPad.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_DC_2-1_te895.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_DC_te895.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_Polarizer_TM_1550_UQAM.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_YBranch_895.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_gc_te895.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_terminator_SiN_1310.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_terminator_SiN_1550.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_terminator_SiN_te895.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/port_SiN_800.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/taper_SiN_750_3000.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/library/taper_SiN_750_800.gds +0 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge/technology.py +215 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge.egg-info/PKG-INFO +105 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge.egg-info/SOURCES.txt +33 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge.egg-info/dependency_links.txt +1 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge.egg-info/requires.txt +4 -0
- siepic_sin_forge-1.2.0/siepic_sin_forge.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Copyright 2024 Flexcompute Inc.
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
4
|
+
this software and associated documentation files (the “Software”), to deal in
|
|
5
|
+
the Software without restriction, including without limitation the rights to
|
|
6
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
7
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
|
8
|
+
so, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
19
|
+
SOFTWARE.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: siepic-sin-forge
|
|
3
|
+
Version: 1.2.0
|
|
4
|
+
Summary: SiEPIC EBeam SiN PDK implementation for PhotonForge
|
|
5
|
+
Author-email: "Flexcompute Inc." <info@flexcompute.com>
|
|
6
|
+
Project-URL: homepage, https://github.com/flexcompute/siepic-forge
|
|
7
|
+
Project-URL: documentation, https://github.com/flexcompute/siepic-forge
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Dist: photonforge>=1.4.0
|
|
11
|
+
Provides-Extra: test
|
|
12
|
+
Requires-Dist: pytest>=7.2; extra == "test"
|
|
13
|
+
Dynamic: license-file
|
|
14
|
+
|
|
15
|
+
# SiEPIC Forge
|
|
16
|
+
|
|
17
|
+
This python module implements the [SiEPIC EBeam SiN
|
|
18
|
+
PDK](https://github.com/SiEPIC/SiEPIC_EBeam_PDK) processes and components and
|
|
19
|
+
technology specifications for
|
|
20
|
+
[PhotonForge](https://docs.flexcompute.com/projects/photonforge/)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
### Python interface
|
|
26
|
+
|
|
27
|
+
Installation via `pip`:
|
|
28
|
+
|
|
29
|
+
pip install siepic-sin-forge
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
The simplest way to use the this PDK in PhotonForge is to set its technology as
|
|
35
|
+
default:
|
|
36
|
+
|
|
37
|
+
import photonforge as pf
|
|
38
|
+
import siepic_sin_forge as siepic
|
|
39
|
+
|
|
40
|
+
tech = siepic.ebeam()
|
|
41
|
+
pf.config.default_technology = tech
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
The `ebeam` function creates a parametric technology and accepts a number of
|
|
45
|
+
parameters to fine-tune the technology.
|
|
46
|
+
|
|
47
|
+
PDK components are available through the `component` function, which takes a
|
|
48
|
+
component name as first argument. The list of component names is available as a
|
|
49
|
+
set `component_names`:
|
|
50
|
+
|
|
51
|
+
print(siepic.component_names)
|
|
52
|
+
|
|
53
|
+
pdk_component = siepic.component("ebeam_YBranch_895")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
More information can be obtained in the documentation for each function:
|
|
57
|
+
|
|
58
|
+
help(siepic.ebeam)
|
|
59
|
+
|
|
60
|
+
help(siepic.component)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
## Warnings
|
|
64
|
+
|
|
65
|
+
Please note that the 3D structures obtained by extrusion through this module's
|
|
66
|
+
technologies are a best approximation of the intended fabricated structures,
|
|
67
|
+
but the actual final dimensions may differ due to several fabrication-specific
|
|
68
|
+
effects. In particular, doping profiles are represented with hard-boundary,
|
|
69
|
+
homogeneous solids, but, in practice will present process-dependent variations
|
|
70
|
+
with smooth boundaries.
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
## References
|
|
74
|
+
|
|
75
|
+
Process stack and other information obtained from [ANT
|
|
76
|
+
NanoSOI](https://www.appliednt.com/nanosoi/).
|
|
77
|
+
|
|
78
|
+
The GDSII cell library comes from the main PDK repository.
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
## Third-Party Licenses
|
|
82
|
+
|
|
83
|
+
- [`SiEPIC_EBeam_PDK`](https://github.com/SiEPIC/SiEPIC_EBeam_PDK)
|
|
84
|
+
|
|
85
|
+
> This project is licensed under the terms of the MIT license.
|
|
86
|
+
>
|
|
87
|
+
> Copyright (c) 2016-2020, Lukas Chrostowski and contributors
|
|
88
|
+
>
|
|
89
|
+
> Permission is hereby granted, free of charge, to any person obtaining a
|
|
90
|
+
> copy of this software and associated documentation files (the "Software"),
|
|
91
|
+
> to deal in the Software without restriction, including without limitation
|
|
92
|
+
> the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
93
|
+
> and/or sell copies of the Software, and to permit persons to whom the
|
|
94
|
+
> Software is furnished to do so, subject to the following conditions:
|
|
95
|
+
>
|
|
96
|
+
> The above copyright notice and this permission notice shall be included in
|
|
97
|
+
> all copies or substantial portions of the Software.
|
|
98
|
+
>
|
|
99
|
+
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
100
|
+
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
101
|
+
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
102
|
+
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
103
|
+
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
104
|
+
> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
105
|
+
> DEALINGS IN THE SOFTWARE.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# SiEPIC Forge
|
|
2
|
+
|
|
3
|
+
This python module implements the [SiEPIC EBeam SiN
|
|
4
|
+
PDK](https://github.com/SiEPIC/SiEPIC_EBeam_PDK) processes and components and
|
|
5
|
+
technology specifications for
|
|
6
|
+
[PhotonForge](https://docs.flexcompute.com/projects/photonforge/)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
### Python interface
|
|
12
|
+
|
|
13
|
+
Installation via `pip`:
|
|
14
|
+
|
|
15
|
+
pip install siepic-sin-forge
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
The simplest way to use the this PDK in PhotonForge is to set its technology as
|
|
21
|
+
default:
|
|
22
|
+
|
|
23
|
+
import photonforge as pf
|
|
24
|
+
import siepic_sin_forge as siepic
|
|
25
|
+
|
|
26
|
+
tech = siepic.ebeam()
|
|
27
|
+
pf.config.default_technology = tech
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
The `ebeam` function creates a parametric technology and accepts a number of
|
|
31
|
+
parameters to fine-tune the technology.
|
|
32
|
+
|
|
33
|
+
PDK components are available through the `component` function, which takes a
|
|
34
|
+
component name as first argument. The list of component names is available as a
|
|
35
|
+
set `component_names`:
|
|
36
|
+
|
|
37
|
+
print(siepic.component_names)
|
|
38
|
+
|
|
39
|
+
pdk_component = siepic.component("ebeam_YBranch_895")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
More information can be obtained in the documentation for each function:
|
|
43
|
+
|
|
44
|
+
help(siepic.ebeam)
|
|
45
|
+
|
|
46
|
+
help(siepic.component)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
## Warnings
|
|
50
|
+
|
|
51
|
+
Please note that the 3D structures obtained by extrusion through this module's
|
|
52
|
+
technologies are a best approximation of the intended fabricated structures,
|
|
53
|
+
but the actual final dimensions may differ due to several fabrication-specific
|
|
54
|
+
effects. In particular, doping profiles are represented with hard-boundary,
|
|
55
|
+
homogeneous solids, but, in practice will present process-dependent variations
|
|
56
|
+
with smooth boundaries.
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
## References
|
|
60
|
+
|
|
61
|
+
Process stack and other information obtained from [ANT
|
|
62
|
+
NanoSOI](https://www.appliednt.com/nanosoi/).
|
|
63
|
+
|
|
64
|
+
The GDSII cell library comes from the main PDK repository.
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
## Third-Party Licenses
|
|
68
|
+
|
|
69
|
+
- [`SiEPIC_EBeam_PDK`](https://github.com/SiEPIC/SiEPIC_EBeam_PDK)
|
|
70
|
+
|
|
71
|
+
> This project is licensed under the terms of the MIT license.
|
|
72
|
+
>
|
|
73
|
+
> Copyright (c) 2016-2020, Lukas Chrostowski and contributors
|
|
74
|
+
>
|
|
75
|
+
> Permission is hereby granted, free of charge, to any person obtaining a
|
|
76
|
+
> copy of this software and associated documentation files (the "Software"),
|
|
77
|
+
> to deal in the Software without restriction, including without limitation
|
|
78
|
+
> the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
79
|
+
> and/or sell copies of the Software, and to permit persons to whom the
|
|
80
|
+
> Software is furnished to do so, subject to the following conditions:
|
|
81
|
+
>
|
|
82
|
+
> The above copyright notice and this permission notice shall be included in
|
|
83
|
+
> all copies or substantial portions of the Software.
|
|
84
|
+
>
|
|
85
|
+
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
86
|
+
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
87
|
+
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
88
|
+
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
89
|
+
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
90
|
+
> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
91
|
+
> DEALINGS IN THE SOFTWARE.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools >= 45"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "siepic-sin-forge"
|
|
7
|
+
version = "1.2.0"
|
|
8
|
+
authors = [{name = "Flexcompute Inc.", email = "info@flexcompute.com"}]
|
|
9
|
+
description = "SiEPIC EBeam SiN PDK implementation for PhotonForge"
|
|
10
|
+
readme = "README.md"
|
|
11
|
+
dependencies = ["photonforge >= 1.4.0"] # Need typing submodule
|
|
12
|
+
|
|
13
|
+
[project.optional-dependencies]
|
|
14
|
+
test = ["pytest >= 7.2"]
|
|
15
|
+
|
|
16
|
+
[project.urls]
|
|
17
|
+
homepage = "https://github.com/flexcompute/siepic-forge"
|
|
18
|
+
documentation = "https://github.com/flexcompute/siepic-forge"
|
|
19
|
+
|
|
20
|
+
[tool.setuptools]
|
|
21
|
+
packages = ["siepic_sin_forge", "siepic_sin_forge.library"]
|
|
22
|
+
|
|
23
|
+
[tool.setuptools.package-data]
|
|
24
|
+
siepic_sin_forge = ["library/*.gds"]
|
|
25
|
+
|
|
26
|
+
[tool.ruff]
|
|
27
|
+
target-version = "py310"
|
|
28
|
+
line-length = 100
|
|
29
|
+
|
|
30
|
+
[tool.ruff.lint]
|
|
31
|
+
extend-select = [
|
|
32
|
+
"E", # pycodestyle errors
|
|
33
|
+
"F", # pyflakes
|
|
34
|
+
"B", # bugbear
|
|
35
|
+
"I", # isort
|
|
36
|
+
"UP", # pyupgrade
|
|
37
|
+
"W", # pycodestyle
|
|
38
|
+
"C4", # flake8-comprehensions
|
|
39
|
+
"NPY", # numpy-specific rules
|
|
40
|
+
"RUF", # ruff builtins
|
|
41
|
+
"ISC", # implicit string concatenation
|
|
42
|
+
"PIE", # flake8-pie
|
|
43
|
+
"RSE", # unnecessary parantheses on raised exceptions
|
|
44
|
+
"PLE", # pylint errors
|
|
45
|
+
"PLC", # pylint conventions
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
extend-ignore = [
|
|
49
|
+
"RUF001", # ambiguous unicode characters
|
|
50
|
+
"RUF002", # ambiguous unicode characters
|
|
51
|
+
"RUF003", # ambiguous unicode characters
|
|
52
|
+
"B006", # mutable data structures for argument defaults
|
|
53
|
+
"PLC0206", # Extracting value from dictionary without calling `.items()`
|
|
54
|
+
"UP038", # Unions instead of tuples in isinstance/issubclass
|
|
55
|
+
]
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from .component import component, component_names # noqa: F401
|
|
2
|
+
from .technology import ebeam
|
|
3
|
+
|
|
4
|
+
__version__ = "1.2.0"
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def plot_cross_section(technology=None):
|
|
8
|
+
import photonforge as pf
|
|
9
|
+
|
|
10
|
+
if technology is None:
|
|
11
|
+
technology = ebeam()
|
|
12
|
+
|
|
13
|
+
c = pf.Component("Extrusion test", technology)
|
|
14
|
+
c.add(
|
|
15
|
+
"SiN",
|
|
16
|
+
pf.Rectangle((-0.5, -1), (1, 1)),
|
|
17
|
+
"Oxide open to BOX",
|
|
18
|
+
pf.Rectangle((-2, -1), (2.5, 1)),
|
|
19
|
+
"SiN",
|
|
20
|
+
pf.Rectangle((4, -1), (5.5, 1)),
|
|
21
|
+
"M1_heater",
|
|
22
|
+
pf.Rectangle((6, -1), (12, 1)),
|
|
23
|
+
"M2_router",
|
|
24
|
+
pf.Rectangle((8, -1), (12, 1)),
|
|
25
|
+
"M_Open",
|
|
26
|
+
pf.Rectangle((9, -1), (11, 1)),
|
|
27
|
+
"Deep Trench",
|
|
28
|
+
pf.Rectangle((15, -1), (20, 1)),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
ax = pf.tidy3d_plot(c, y=0)
|
|
32
|
+
ax.set(title=technology.name)
|
|
33
|
+
|
|
34
|
+
return ax
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import math
|
|
2
|
+
|
|
3
|
+
_symmetries_3port = [("P1", "P2", {"P0": "P0", "P2": "P1"})]
|
|
4
|
+
|
|
5
|
+
_symmetries_crossing = [
|
|
6
|
+
("P0", "P1", {"P1": "P0", "P2": "P3", "P3": "P2"}),
|
|
7
|
+
("P2", "P3", {"P0": "P1", "P1": "P0", "P3": "P2"}),
|
|
8
|
+
]
|
|
9
|
+
|
|
10
|
+
_symmetries_directional_coupler = [
|
|
11
|
+
("P0", "P1", {"P1": "P0", "P2": "P3", "P3": "P2"}),
|
|
12
|
+
("P0", "P2", {"P1": "P3", "P2": "P0", "P3": "P1"}),
|
|
13
|
+
("P0", "P3", {"P1": "P2", "P2": "P1", "P3": "P0"}),
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
_symmetries_mmi22 = _symmetries_directional_coupler
|
|
17
|
+
|
|
18
|
+
_waist = 5.0
|
|
19
|
+
|
|
20
|
+
_angle = 8 * math.pi / 180
|
|
21
|
+
_vx8 = math.sin(_angle)
|
|
22
|
+
_vy8 = -math.cos(_angle)
|
|
23
|
+
|
|
24
|
+
_angle = 10 * math.pi / 180
|
|
25
|
+
_te895_vx = math.sin(_angle)
|
|
26
|
+
_te895_vy = -math.cos(_angle)
|
|
27
|
+
|
|
28
|
+
_component_data = {
|
|
29
|
+
"ANT_MMI_1x2_te1550_3dB_BB": (
|
|
30
|
+
"ANT_MMI_1x2_te1550_3dB_BB",
|
|
31
|
+
[
|
|
32
|
+
((-12.88, 0.0), 0, "SiN_TE_1550_750"),
|
|
33
|
+
((12.88, -0.975), 180, "SiN_TE_1550_750"),
|
|
34
|
+
((12.88, 0.975), 180, "SiN_TE_1550_750"),
|
|
35
|
+
],
|
|
36
|
+
None,
|
|
37
|
+
"mmi1x2",
|
|
38
|
+
),
|
|
39
|
+
"GC_SiN_TE_1310_8degOxide_BB": (
|
|
40
|
+
"GC_SiN_TE_1310_8degOxide_BB",
|
|
41
|
+
[
|
|
42
|
+
((0.0, 0.0), 180, "SiN_TE_1310_750"),
|
|
43
|
+
((-29.7, 0.0), (_vx8, 0, _vy8), _waist, 90),
|
|
44
|
+
],
|
|
45
|
+
None,
|
|
46
|
+
"grating_coupler",
|
|
47
|
+
),
|
|
48
|
+
"GC_SiN_TE_1550_8degOxide_BB": (
|
|
49
|
+
"GC_SiN_TE_1550_8degOxide_BB",
|
|
50
|
+
[
|
|
51
|
+
((0.0, 0.0), 180, "SiN_TE_1550_750"),
|
|
52
|
+
((-29.7, 0.0), (_vx8, 0, _vy8), _waist, 90),
|
|
53
|
+
],
|
|
54
|
+
None,
|
|
55
|
+
"grating_coupler",
|
|
56
|
+
),
|
|
57
|
+
"ebeam_MMI_2x2_5050_te1310": (
|
|
58
|
+
"ULaval",
|
|
59
|
+
[
|
|
60
|
+
((-16.72, -1.2), 0, "SiN_TE_1550_800"),
|
|
61
|
+
((-16.72, 1.2), 0, "SiN_TE_1550_800"),
|
|
62
|
+
((16.72, -1.2), 180, "SiN_TE_1550_800"),
|
|
63
|
+
((16.72, 1.2), 180, "SiN_TE_1550_800"),
|
|
64
|
+
],
|
|
65
|
+
{"port_symmetries": _symmetries_mmi22},
|
|
66
|
+
"mmi2x2",
|
|
67
|
+
),
|
|
68
|
+
"ebeam_YBranch_te1310": (
|
|
69
|
+
"ULaval",
|
|
70
|
+
[
|
|
71
|
+
((-7.69, 0.0), 0, "SiN_TE_1310_800"),
|
|
72
|
+
((15.5, -1.0), 180, "SiN_TE_1310_800"),
|
|
73
|
+
((15.5, 1.0), 180, "SiN_TE_1310_800"),
|
|
74
|
+
],
|
|
75
|
+
{"port_symmetries": _symmetries_3port},
|
|
76
|
+
"y-splitter",
|
|
77
|
+
),
|
|
78
|
+
"crossing_horizontal": (
|
|
79
|
+
"crossing_horizontal",
|
|
80
|
+
[
|
|
81
|
+
((-37.83, -17.12), 0, "SiN_TE_1550_750"),
|
|
82
|
+
((-37.83, 17.12), 0, "SiN_TE_1550_750"),
|
|
83
|
+
((37.83, -17.12), 180, "SiN_TE_1550_750"),
|
|
84
|
+
((37.83, 17.12), 180, "SiN_TE_1550_750"),
|
|
85
|
+
],
|
|
86
|
+
{"port_symmetries": _symmetries_directional_coupler},
|
|
87
|
+
"crossing",
|
|
88
|
+
),
|
|
89
|
+
"crossing_manhattan": (
|
|
90
|
+
"crossing_manhattan",
|
|
91
|
+
[
|
|
92
|
+
((-3.5, 0.0), 0, "SiN_TE_1550_750"),
|
|
93
|
+
((3.5, 0.0), 180, "SiN_TE_1550_750"),
|
|
94
|
+
((0.0, -3.5), 90, "SiN_TE_1550_750"),
|
|
95
|
+
((0.0, 3.5), 270, "SiN_TE_1550_750"),
|
|
96
|
+
],
|
|
97
|
+
{"port_symmetries": _symmetries_crossing},
|
|
98
|
+
"crossing",
|
|
99
|
+
),
|
|
100
|
+
"ebeam_BondPad": (
|
|
101
|
+
"ebeam_BondPad",
|
|
102
|
+
[((0, 0), (100, 100), "M2_router")],
|
|
103
|
+
None,
|
|
104
|
+
"bondpad",
|
|
105
|
+
),
|
|
106
|
+
"ebeam_DC_2-1_te895": (
|
|
107
|
+
"ebeam_DC_2-1_te895",
|
|
108
|
+
[
|
|
109
|
+
((-14.56, -2.285), 0, "SiN_TE_895_450"),
|
|
110
|
+
((-14.56, 2.285), 0, "SiN_TE_895_450"),
|
|
111
|
+
((14.56, -2.285), 180, "SiN_TE_895_450"),
|
|
112
|
+
((14.56, 2.285), 180, "SiN_TE_895_450"),
|
|
113
|
+
],
|
|
114
|
+
{"port_symmetries": _symmetries_directional_coupler},
|
|
115
|
+
"dc",
|
|
116
|
+
),
|
|
117
|
+
"ebeam_DC_te895": (
|
|
118
|
+
"ebeam_DC_te895",
|
|
119
|
+
[
|
|
120
|
+
((-14.137, -2.285), 0, "SiN_TE_895_450"),
|
|
121
|
+
((-14.137, 2.285), 0, "SiN_TE_895_450"),
|
|
122
|
+
((14.137, -2.285), 180, "SiN_TE_895_450"),
|
|
123
|
+
((14.137, 2.285), 180, "SiN_TE_895_450"),
|
|
124
|
+
],
|
|
125
|
+
{"port_symmetries": _symmetries_directional_coupler},
|
|
126
|
+
"dc",
|
|
127
|
+
),
|
|
128
|
+
"ebeam_Polarizer_TM_1550_UQAM": (
|
|
129
|
+
"ebeam_Polarizer_TM_1550_UQAM",
|
|
130
|
+
[((-6.0, 0.0), 0, "SiN_TE-TM_1550_1000"), ((6.0, 0.0), 180, "SiN_TE-TM_1550_1000")],
|
|
131
|
+
{},
|
|
132
|
+
"transition",
|
|
133
|
+
),
|
|
134
|
+
"ebeam_YBranch_895": (
|
|
135
|
+
"ebeam_YBranch_895",
|
|
136
|
+
[
|
|
137
|
+
((0.0, 0.0), 0, "SiN_TE_895_450"),
|
|
138
|
+
((15.0, -2.75), 180, "SiN_TE_895_450"),
|
|
139
|
+
((15.0, 2.75), 180, "SiN_TE_895_450"),
|
|
140
|
+
],
|
|
141
|
+
{"port_symmetries": _symmetries_3port},
|
|
142
|
+
"y-splitter",
|
|
143
|
+
),
|
|
144
|
+
"ebeam_gc_te895": (
|
|
145
|
+
"ebeam_gc_te895",
|
|
146
|
+
[
|
|
147
|
+
((0.0, 0.0), 180, "SiN_TE_895_450"),
|
|
148
|
+
((-29.0, 0), (_te895_vx, 0, _te895_vy), _waist, 90),
|
|
149
|
+
],
|
|
150
|
+
{"symmetry": (0, -1, 0), "bounds": ((None, -10, None), (None, 10, None))},
|
|
151
|
+
"grating_coupler",
|
|
152
|
+
),
|
|
153
|
+
"ebeam_terminator_SiN_1310": (
|
|
154
|
+
"ebeam_terminator_SiN_1310",
|
|
155
|
+
[((0.0, 0.0), 180, "SiN_TE_1310_800")],
|
|
156
|
+
{},
|
|
157
|
+
"termination",
|
|
158
|
+
),
|
|
159
|
+
"ebeam_terminator_SiN_1550": (
|
|
160
|
+
"ebeam_terminator_SiN_1550",
|
|
161
|
+
[((0.0, 0.0), 180, "SiN_TE_1550_750")],
|
|
162
|
+
{},
|
|
163
|
+
"termination",
|
|
164
|
+
),
|
|
165
|
+
"ebeam_terminator_SiN_te895": (
|
|
166
|
+
"ebeam_terminator_SiN_te895",
|
|
167
|
+
[((0.0, 0.0), 180, "SiN_TE_895_450")],
|
|
168
|
+
{},
|
|
169
|
+
"termination",
|
|
170
|
+
),
|
|
171
|
+
"port_SiN_800": (
|
|
172
|
+
"port_SiN_800",
|
|
173
|
+
[((1.0, 0.0), 180, "SiN_TE_1550_800")],
|
|
174
|
+
{},
|
|
175
|
+
"termination",
|
|
176
|
+
),
|
|
177
|
+
"taper_SiN_750_3000": (
|
|
178
|
+
"taper_SiN_750_3000",
|
|
179
|
+
[((0.0, 0.0), 0, "SiN_TE_1550_750"), ((50.0, 0.0), 180, "MM_SiN_TE_1550_3000")],
|
|
180
|
+
{},
|
|
181
|
+
"taper",
|
|
182
|
+
),
|
|
183
|
+
"taper_SiN_750_800": (
|
|
184
|
+
"taper_SiN_750_800",
|
|
185
|
+
[((0.0, 0.0), 0, "SiN_TE_1550_800"), ((2.0, 0.0), 180, "SiN_TE_1550_750")],
|
|
186
|
+
{},
|
|
187
|
+
"taper",
|
|
188
|
+
),
|
|
189
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import photonforge as pf
|
|
2
|
+
|
|
3
|
+
_layers = {
|
|
4
|
+
"PinRec": pf.LayerSpec((1, 10), "SiEPIC", "#ff80a818", ""),
|
|
5
|
+
"PinRecM": pf.LayerSpec((1, 11), "SiEPIC", "#80000018", ""),
|
|
6
|
+
"SiN": pf.LayerSpec((4, 0), "Silicon Nitride Full Etch", "#c080ff18", "."),
|
|
7
|
+
"Direct Metal": pf.LayerSpec((5, 0), "Dedicated Run Layers", "#80a8ff18", ""),
|
|
8
|
+
"Oxide open to BOX": pf.LayerSpec((6, 0), "Dedicated Run Layers", "#ff000018", ""),
|
|
9
|
+
"Text": pf.LayerSpec((10, 0), "Text-Not Fabricated", "#00000018", "hollow"),
|
|
10
|
+
"M1_heater": pf.LayerSpec((11, 0), "TiW Heater", "#0000ff18", "\\\\"),
|
|
11
|
+
"M2_router": pf.LayerSpec((12, 0), "TiW/Au Routing Bilayer", "#ffbf0018", "//"),
|
|
12
|
+
"M_Open": pf.LayerSpec((13, 0), "Bond Pad Open", "#80005718", "\\\\"),
|
|
13
|
+
"Si n": pf.LayerSpec((20, 0), "Dedicated Run Layers", "#afff8018", ""),
|
|
14
|
+
"Si p": pf.LayerSpec((21, 0), "Dedicated Run Layers", "#ffd9df18", ""),
|
|
15
|
+
"Si n+": pf.LayerSpec((22, 0), "Dedicated Run Layers", "#ff800018", ""),
|
|
16
|
+
"Si p+": pf.LayerSpec((23, 0), "Dedicated Run Layers", "#ddff0018", ""),
|
|
17
|
+
"Si n++": pf.LayerSpec((24, 0), "Dedicated Run Layers", "#00ffff18", ""),
|
|
18
|
+
"Si p++": pf.LayerSpec((25, 0), "Dedicated Run Layers", "#00800018", ""),
|
|
19
|
+
"ANT Reserved": pf.LayerSpec((31, 0), "SiEPIC/ANT Reserved", "#9580ff18", "/"),
|
|
20
|
+
"ANT Reserved 1": pf.LayerSpec((33, 0), "ANT Reserved", "#9580ff18", "/"),
|
|
21
|
+
"Via to silicon": pf.LayerSpec((40, 0), "Dedicated Run Layers", "#0000ff18", ""),
|
|
22
|
+
"DevRec": pf.LayerSpec((68, 0), "SiEPIC", "#00800018", ""),
|
|
23
|
+
"FbrTgt": pf.LayerSpec((81, 0), "SiEPIC/Dedicated Run Layers", "#80808018", ""),
|
|
24
|
+
"ANT Reserved 2": pf.LayerSpec((102, 0), "ANT Reserved", "#9580ff18", "/"),
|
|
25
|
+
"ANT Reserved 3": pf.LayerSpec((110, 0), "ANT Reserved", "#9580ff18", "/"),
|
|
26
|
+
"Custom Dicing": pf.LayerSpec((189, 0), "", "#00000018", "hollow"),
|
|
27
|
+
"SEM Imaging": pf.LayerSpec((200, 0), "", "#ff000018", "x"),
|
|
28
|
+
"Deep Trench": pf.LayerSpec((201, 0), "", "#00ff0018", "."),
|
|
29
|
+
"Deep Trench Handling Exclusion": pf.LayerSpec((202, 0), "", "#00760018", ":"),
|
|
30
|
+
"Thermal Isolation Trenches": pf.LayerSpec((203, 0), "", "#00800018", "\\"),
|
|
31
|
+
"Laser Integration Shelf": pf.LayerSpec((205, 0), "Dedicated Run Layers", "#69ff0518", ""),
|
|
32
|
+
"Floor Plan-Not Fabricated": pf.LayerSpec((290, 0), "", "#c080ff18", "hollow"),
|
|
33
|
+
"Error: device layer width is less than design rule": pf.LayerSpec(
|
|
34
|
+
(301, 0), "DRC Errors", "#80005718", ""
|
|
35
|
+
),
|
|
36
|
+
"Error: device layer spacing is less than design rule": pf.LayerSpec(
|
|
37
|
+
(301, 1), "DRC Errors", "#80005718", ""
|
|
38
|
+
),
|
|
39
|
+
"Warning: polygons/paths on PinRec layer (1/10) will NOT be fabricated": pf.LayerSpec(
|
|
40
|
+
(301, 2), "DRC Errors", "#80005718", ""
|
|
41
|
+
),
|
|
42
|
+
"Error: direct metal width is less than 5 microns": pf.LayerSpec(
|
|
43
|
+
(305, 0), "DRC Errors", "#80808018", ""
|
|
44
|
+
),
|
|
45
|
+
"Error: direct metal spacing is less than 10 microns": pf.LayerSpec(
|
|
46
|
+
(305, 1), "DRC Errors", "#80808018", ""
|
|
47
|
+
),
|
|
48
|
+
"Error: TiW width is less than 3 microns": pf.LayerSpec(
|
|
49
|
+
(311, 0), "DRC Errors", "#ffa08018", ""
|
|
50
|
+
),
|
|
51
|
+
"Error: TiW spacing is less than 3 microns": pf.LayerSpec(
|
|
52
|
+
(311, 1), "DRC Errors", "#ffa08018", ""
|
|
53
|
+
),
|
|
54
|
+
"Error: Al width is less than design rule": pf.LayerSpec(
|
|
55
|
+
(312, 0), "DRC Errors", "#00ffff18", ""
|
|
56
|
+
),
|
|
57
|
+
"Error: Al spacing is less than design rule": pf.LayerSpec(
|
|
58
|
+
(312, 1), "DRC Errors", "#00ffff18", ""
|
|
59
|
+
),
|
|
60
|
+
"Error: Spacing between TiW and Al is less than 5 microns": pf.LayerSpec(
|
|
61
|
+
(312, 3), "DRC Errors", "#00ffff18", ""
|
|
62
|
+
),
|
|
63
|
+
"Error: Oxide window width is less than 10 microns": pf.LayerSpec(
|
|
64
|
+
(313, 0), "DRC Errors", "#01ff6b18", ""
|
|
65
|
+
),
|
|
66
|
+
"Error: Oxide window spacing is less than 10 microns": pf.LayerSpec(
|
|
67
|
+
(313, 1), "DRC Errors", "#01ff6b18", ""
|
|
68
|
+
),
|
|
69
|
+
"Error: Oxide window is not placed over Al": pf.LayerSpec(
|
|
70
|
+
(313, 2), "DRC Errors", "#01ff6b18", ""
|
|
71
|
+
),
|
|
72
|
+
"Standard Design Area": pf.LayerSpec((350, 0), "DRC Errors", "#ddff0018", ""),
|
|
73
|
+
"Error: Features outside design area. Verify design size and centering.": pf.LayerSpec(
|
|
74
|
+
(350, 1), "DRC Errors", "#ddff0018", ""
|
|
75
|
+
),
|
|
76
|
+
"Error: Dicing lane width is less than 100 microns": pf.LayerSpec(
|
|
77
|
+
(389, 0), "DRC Errors", "#ff00ff18", ""
|
|
78
|
+
),
|
|
79
|
+
"Error: Spacing between dicing lane and devices is less than 50 microns": pf.LayerSpec(
|
|
80
|
+
(389, 1), "DRC Errors", "#ff00ff18", ""
|
|
81
|
+
),
|
|
82
|
+
"Error: SEM width is less than 500 nm": pf.LayerSpec((400, 0), "DRC Errors", "#ff9d9d18", ""),
|
|
83
|
+
"Deep Trench Design Area": pf.LayerSpec((401, 0), "DRC Errors", "#80a8ff18", ""),
|
|
84
|
+
"Error: Metal, SEM, or handling region overlap with deep trenches. Verify design centering": pf.LayerSpec(
|
|
85
|
+
(401, 1), "DRC Errors", "#80a8ff18", ""
|
|
86
|
+
),
|
|
87
|
+
"Warning: Silicon features outside deep trench design area. Verify accuracy before submission": pf.LayerSpec(
|
|
88
|
+
(401, 2), "DRC Errors", "#80a8ff18", ""
|
|
89
|
+
),
|
|
90
|
+
"Error: Spacing between metal and deep trench is less than 30 microns": pf.LayerSpec(
|
|
91
|
+
(401, 3), "DRC Errors", "#80a8ff18", ""
|
|
92
|
+
),
|
|
93
|
+
"Error: Deep trench width is less than 260 microns": pf.LayerSpec(
|
|
94
|
+
(401, 4), "DRC Errors", "#80a8ff18", ""
|
|
95
|
+
),
|
|
96
|
+
"Error: Deep trench handling area missing. Please add handling area of size shown by polygons": pf.LayerSpec(
|
|
97
|
+
(402, 0), "DRC Errors", "#ff000018", ""
|
|
98
|
+
),
|
|
99
|
+
"Error: Features inside deep trench handling area": pf.LayerSpec(
|
|
100
|
+
(402, 1), "DRC Errors", "#ff000018", ""
|
|
101
|
+
),
|
|
102
|
+
"Error: Thermal isolation width is less than design rule": pf.LayerSpec(
|
|
103
|
+
(403, 0), "DRC Errors", "#50008018", ""
|
|
104
|
+
),
|
|
105
|
+
"Error: Thermal isolation spacing is less than design rule": pf.LayerSpec(
|
|
106
|
+
(403, 1), "DRC Errors", "#50008018", ""
|
|
107
|
+
),
|
|
108
|
+
"Error: Spacing between thermal isolation and metal is less than design rule": pf.LayerSpec(
|
|
109
|
+
(403, 2), "DRC Errors", "#50008018", ""
|
|
110
|
+
),
|
|
111
|
+
"Error: Thermal isolation and device layer overlap, or spacing is less than design rule": pf.LayerSpec(
|
|
112
|
+
(403, 3), "DRC Errors", "#50008018", ""
|
|
113
|
+
),
|
|
114
|
+
"Dream Photonics Black Box-Not Fabricated": pf.LayerSpec((998, 0), "", "#00000018", "hollow"),
|
|
115
|
+
"Errors": pf.LayerSpec((999, 0), "SiEPIC", "#0000ff18", ""),
|
|
116
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import warnings
|
|
2
|
+
|
|
3
|
+
try:
|
|
4
|
+
from importlib.resources import as_file, files
|
|
5
|
+
except ImportError:
|
|
6
|
+
from importlib_resources import as_file, files
|
|
7
|
+
|
|
8
|
+
import photonforge as pf
|
|
9
|
+
import photonforge.typing as pft
|
|
10
|
+
|
|
11
|
+
from ._component_data import _component_data
|
|
12
|
+
|
|
13
|
+
component_names = set(_component_data.keys())
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def component(
|
|
17
|
+
cell_name: str,
|
|
18
|
+
technology: pf.Technology | None = None,
|
|
19
|
+
tidy3d_model_kwargs: pft.kwargs_for(pf.Tidy3DModel) = {},
|
|
20
|
+
) -> pf.Component:
|
|
21
|
+
"""Load a component from the default PDK library.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
cell_name (str): Name of the component to load.
|
|
25
|
+
technology (Technology): Technology for the created component.
|
|
26
|
+
tidy3d_model_kwargs (dict): Keyword arguments passed to the Tidy3D
|
|
27
|
+
model of the created component.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
Component: Component loaded from the default PDK library.
|
|
31
|
+
|
|
32
|
+
Note:
|
|
33
|
+
The available component names are listed in the module-level tuple
|
|
34
|
+
``component_names``.
|
|
35
|
+
"""
|
|
36
|
+
libname, port_data, kwargs, thumbnail = _component_data.get(
|
|
37
|
+
cell_name, (None, None, None, None)
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
if technology is None:
|
|
41
|
+
technology = pf.config.default_technology
|
|
42
|
+
if "SiEPIC" not in technology.name:
|
|
43
|
+
warnings.warn(
|
|
44
|
+
f"Current default technology {technology.name} does not seem compatible with the "
|
|
45
|
+
f"SiEPIC component library",
|
|
46
|
+
RuntimeWarning,
|
|
47
|
+
2,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
# Load library cell
|
|
51
|
+
gdsii = files("siepic_sin_forge") / "library" / (libname + ".gds")
|
|
52
|
+
with as_file(gdsii) as fname:
|
|
53
|
+
c = pf.load_layout(fname, technology=technology)[cell_name]
|
|
54
|
+
|
|
55
|
+
if thumbnail:
|
|
56
|
+
c.properties.__thumbnail__ = thumbnail
|
|
57
|
+
|
|
58
|
+
for layer, labels in c.labels.items():
|
|
59
|
+
for label in labels:
|
|
60
|
+
if "lumerical" in label.text.lower():
|
|
61
|
+
c.remove(label, layer=layer)
|
|
62
|
+
|
|
63
|
+
# Add ports
|
|
64
|
+
z = (
|
|
65
|
+
0.1
|
|
66
|
+
+ technology.parametric_kwargs.get("top_oxide_thickness", 3.0)
|
|
67
|
+
+ technology.parametric_kwargs.get("passivation_oxide_thickness", 0.3)
|
|
68
|
+
)
|
|
69
|
+
port_error = False
|
|
70
|
+
for data in port_data:
|
|
71
|
+
if len(data) == 3:
|
|
72
|
+
if isinstance(data[1], tuple):
|
|
73
|
+
terminal = pf.Terminal(
|
|
74
|
+
technology.layers[data[2]].layer, pf.Rectangle(center=data[0], size=data[1])
|
|
75
|
+
)
|
|
76
|
+
c.add_terminal(terminal)
|
|
77
|
+
else:
|
|
78
|
+
port_spec = technology.ports.get(data[2])
|
|
79
|
+
if port_spec is None:
|
|
80
|
+
port_error = True
|
|
81
|
+
warnings.warn(
|
|
82
|
+
f"Required port spec {data[2]} not available in technology "
|
|
83
|
+
f"{technology.name!r}. Port skipped.",
|
|
84
|
+
RuntimeWarning,
|
|
85
|
+
2,
|
|
86
|
+
)
|
|
87
|
+
else:
|
|
88
|
+
port = pf.Port(data[0], data[1], port_spec)
|
|
89
|
+
c.add_port(port)
|
|
90
|
+
else:
|
|
91
|
+
port = pf.GaussianPort(
|
|
92
|
+
data[0] + (z,),
|
|
93
|
+
data[1],
|
|
94
|
+
waist_radius=data[2],
|
|
95
|
+
polarization_angle=data[3],
|
|
96
|
+
)
|
|
97
|
+
c.add_port(port)
|
|
98
|
+
|
|
99
|
+
# Add model
|
|
100
|
+
if kwargs is not None:
|
|
101
|
+
kwargs = dict(kwargs)
|
|
102
|
+
if port_error and "port_symmetries" in kwargs:
|
|
103
|
+
del kwargs["port_symmetries"]
|
|
104
|
+
kwargs.update(tidy3d_model_kwargs)
|
|
105
|
+
c.add_model(pf.Tidy3DModel(**kwargs), "Tidy3D")
|
|
106
|
+
|
|
107
|
+
return c
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import photonforge as pf
|
|
2
|
+
import photonforge.typing as pft
|
|
3
|
+
import tidy3d as td
|
|
4
|
+
|
|
5
|
+
from ._layers import _layers
|
|
6
|
+
|
|
7
|
+
# References:
|
|
8
|
+
# https://www.appliednt.com/nanosoi-fabrication-service/
|
|
9
|
+
# https://www.appliednt.com/nanosoi/sys/
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@pf.parametric_technology
|
|
13
|
+
def ebeam(
|
|
14
|
+
*,
|
|
15
|
+
sin_thickness: pft.PositiveDimension = 0.400,
|
|
16
|
+
sin_mask_dilation: pft.Coordinate = 0.0,
|
|
17
|
+
sidewall_angle: pft.Angle = 0.0,
|
|
18
|
+
heater_thickness: pft.PositiveDimension = 0.2,
|
|
19
|
+
router_thickness: pft.PositiveDimension = 0.6,
|
|
20
|
+
bottom_oxide_thickness: pft.PositiveDimension = 4.5,
|
|
21
|
+
top_oxide_thickness: pft.PositiveDimension = 3.0,
|
|
22
|
+
passivation_oxide_thickness: pft.PositiveDimension = 0.3,
|
|
23
|
+
sio2: dict[str, pft.Medium] = {
|
|
24
|
+
"optical": td.material_library["SiO2"]["Palik_Lossless"],
|
|
25
|
+
"electrical": td.Medium(permittivity=4.2, name="SiO2"),
|
|
26
|
+
},
|
|
27
|
+
si: dict[str, pft.Medium] = {
|
|
28
|
+
"optical": td.material_library["cSi"]["Li1993_293K"],
|
|
29
|
+
"electrical": td.Medium(permittivity=12.3, name="Si"),
|
|
30
|
+
},
|
|
31
|
+
sin: dict[str, pft.Medium] = {
|
|
32
|
+
"optical": td.material_library["Si3N4"]["Luke2015PMLStable"],
|
|
33
|
+
"electrical": td.Medium(permittivity=7.5, name="Si3N4"),
|
|
34
|
+
},
|
|
35
|
+
router_metal: dict[str, pft.Medium] = {
|
|
36
|
+
"optical": td.material_library["Au"]["Olmon2012evaporated"],
|
|
37
|
+
"electrical": td.LossyMetalMedium(
|
|
38
|
+
conductivity=17,
|
|
39
|
+
frequency_range=[0.1e9, 200e9],
|
|
40
|
+
fit_param=td.SurfaceImpedanceFitterParam(max_num_poles=16),
|
|
41
|
+
),
|
|
42
|
+
},
|
|
43
|
+
heater_metal: dict[str, pft.Medium] = {
|
|
44
|
+
"optical": td.material_library["W"]["Werner2009"],
|
|
45
|
+
"electrical": td.LossyMetalMedium(
|
|
46
|
+
conductivity=1.6,
|
|
47
|
+
frequency_range=[0.1e9, 200e9],
|
|
48
|
+
fit_param=td.SurfaceImpedanceFitterParam(max_num_poles=16),
|
|
49
|
+
),
|
|
50
|
+
},
|
|
51
|
+
opening: pft.Medium = td.Medium(permittivity=1.0),
|
|
52
|
+
) -> pf.Technology:
|
|
53
|
+
"""Create a technology for the e-beam SiN PDK.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
sin_thickness: SiN layer thickness.
|
|
57
|
+
sin_mask_dilation: Mask dilation for the SiN layer.
|
|
58
|
+
sidewall_angle: Sidewall angle (in degrees) for SiN etching.
|
|
59
|
+
heater_thickness: Thickness of the heater metal layer.
|
|
60
|
+
router_thickness: Thickness of the routing metal bilayer.
|
|
61
|
+
bottom_oxide_thickness: Thickness of the bottom oxide clad.
|
|
62
|
+
top_oxide_thickness: Thickness of the top oxide clad, measured from
|
|
63
|
+
the substrate.
|
|
64
|
+
passivation_oxide_thickness: Thickness of oxide above metal layers.
|
|
65
|
+
sio2: Background medium.
|
|
66
|
+
si: Silicon medium.
|
|
67
|
+
sin: Silicon nitride medium.
|
|
68
|
+
router_metal: Routing metal medium.
|
|
69
|
+
heater_metal: Heater metal medium.
|
|
70
|
+
opening: Medium for openings.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
Technology: E-Beam PDK technology definition.
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
layers = {k: v.copy() for k, v in _layers.items()}
|
|
77
|
+
|
|
78
|
+
z_router = top_oxide_thickness + heater_thickness
|
|
79
|
+
z_open = z_router + router_thickness
|
|
80
|
+
z_top = z_open + passivation_oxide_thickness
|
|
81
|
+
|
|
82
|
+
extrusion_specs = [
|
|
83
|
+
pf.ExtrusionSpec(pf.MaskSpec(), si, (-pf.Z_INF, 0)),
|
|
84
|
+
pf.ExtrusionSpec(
|
|
85
|
+
pf.MaskSpec(),
|
|
86
|
+
sio2,
|
|
87
|
+
(-bottom_oxide_thickness, top_oxide_thickness + passivation_oxide_thickness),
|
|
88
|
+
),
|
|
89
|
+
pf.ExtrusionSpec(
|
|
90
|
+
pf.MaskSpec((11, 0), dilation=passivation_oxide_thickness),
|
|
91
|
+
sio2,
|
|
92
|
+
(top_oxide_thickness, z_router + passivation_oxide_thickness),
|
|
93
|
+
),
|
|
94
|
+
pf.ExtrusionSpec(
|
|
95
|
+
pf.MaskSpec((12, 0), dilation=passivation_oxide_thickness),
|
|
96
|
+
sio2,
|
|
97
|
+
(top_oxide_thickness, z_top),
|
|
98
|
+
),
|
|
99
|
+
pf.ExtrusionSpec(pf.MaskSpec((11, 0)), heater_metal, (top_oxide_thickness, z_router)),
|
|
100
|
+
pf.ExtrusionSpec(pf.MaskSpec((12, 0)), router_metal, (z_router, z_open)),
|
|
101
|
+
pf.ExtrusionSpec(pf.MaskSpec((13, 0)), opening, (z_open, z_top)),
|
|
102
|
+
pf.ExtrusionSpec(pf.MaskSpec((6, 0)), opening, (0, pf.Z_INF)),
|
|
103
|
+
pf.ExtrusionSpec(
|
|
104
|
+
pf.MaskSpec((4, 0), dilation=sin_mask_dilation), sin, (0, sin_thickness), sidewall_angle
|
|
105
|
+
),
|
|
106
|
+
pf.ExtrusionSpec(pf.MaskSpec([(201, 0), (203, 0)]), opening, (-pf.Z_INF, pf.Z_INF)),
|
|
107
|
+
]
|
|
108
|
+
|
|
109
|
+
ports = {
|
|
110
|
+
"SiN_TE_895_450": pf.PortSpec(
|
|
111
|
+
description="SiN Strip TE 895 nm, w=450 nm",
|
|
112
|
+
width=2.0,
|
|
113
|
+
limits=(-0.7, 0.7 + sin_thickness),
|
|
114
|
+
num_modes=1,
|
|
115
|
+
added_solver_modes=0,
|
|
116
|
+
polarization=None,
|
|
117
|
+
target_neff=2.1,
|
|
118
|
+
path_profiles=((0.45, 0.0, (4, 0)),),
|
|
119
|
+
),
|
|
120
|
+
"SiN_TE_1550_750": pf.PortSpec(
|
|
121
|
+
description="SiN Strip TE 1550 nm, w=750 nm",
|
|
122
|
+
width=4.0,
|
|
123
|
+
limits=(-1.5, 1.5 + sin_thickness),
|
|
124
|
+
num_modes=1,
|
|
125
|
+
added_solver_modes=0,
|
|
126
|
+
polarization=None,
|
|
127
|
+
target_neff=2.1,
|
|
128
|
+
path_profiles=((0.75, 0.0, (4, 0)),),
|
|
129
|
+
),
|
|
130
|
+
"SiN_TE_1550_800": pf.PortSpec(
|
|
131
|
+
description="SiN Strip TE 1550 nm, w=800 nm",
|
|
132
|
+
width=4.0,
|
|
133
|
+
limits=(-1.5, 1.5 + sin_thickness),
|
|
134
|
+
num_modes=1,
|
|
135
|
+
added_solver_modes=0,
|
|
136
|
+
polarization=None,
|
|
137
|
+
target_neff=2.1,
|
|
138
|
+
path_profiles=((0.8, 0.0, (4, 0)),),
|
|
139
|
+
),
|
|
140
|
+
"SiN_TE_1550_1000": pf.PortSpec(
|
|
141
|
+
description="SiN Strip TE 1550 nm, w=1000 nm",
|
|
142
|
+
width=4.0,
|
|
143
|
+
limits=(-1.5, 1.5 + sin_thickness),
|
|
144
|
+
num_modes=1,
|
|
145
|
+
added_solver_modes=0,
|
|
146
|
+
polarization=None,
|
|
147
|
+
target_neff=2.1,
|
|
148
|
+
path_profiles=((1.0, 0.0, (4, 0)),),
|
|
149
|
+
),
|
|
150
|
+
"SiN_TM_1550_1000": pf.PortSpec(
|
|
151
|
+
description="SiN Strip TM 1550 nm, w=1000 nm",
|
|
152
|
+
width=3.5,
|
|
153
|
+
limits=(-1.2, 1.2 + sin_thickness),
|
|
154
|
+
num_modes=1,
|
|
155
|
+
added_solver_modes=1,
|
|
156
|
+
polarization="TM",
|
|
157
|
+
target_neff=2.1,
|
|
158
|
+
path_profiles=((1.0, 0.0, (4, 0)),),
|
|
159
|
+
),
|
|
160
|
+
# Added for ebeam_Polarizer_TM_1550_UQAM
|
|
161
|
+
"SiN_TE-TM_1550_1000": pf.PortSpec(
|
|
162
|
+
description="SiN Strip TM 1550 nm, w=1000 nm",
|
|
163
|
+
width=4.0,
|
|
164
|
+
limits=(-1.8, 1.8 + sin_thickness),
|
|
165
|
+
num_modes=2,
|
|
166
|
+
added_solver_modes=0,
|
|
167
|
+
polarization=None,
|
|
168
|
+
target_neff=2.1,
|
|
169
|
+
path_profiles=((1.0, 0.0, (4, 0)),),
|
|
170
|
+
),
|
|
171
|
+
"SiN_TE_1310_750": pf.PortSpec(
|
|
172
|
+
description="SiN Strip TE 1310 nm, w=750 nm",
|
|
173
|
+
width=3.0,
|
|
174
|
+
limits=(-1, 1 + sin_thickness),
|
|
175
|
+
num_modes=1,
|
|
176
|
+
added_solver_modes=0,
|
|
177
|
+
polarization=None,
|
|
178
|
+
target_neff=2.1,
|
|
179
|
+
path_profiles=((0.75, 0.0, (4, 0)),),
|
|
180
|
+
),
|
|
181
|
+
"SiN_TE_1310_800": pf.PortSpec(
|
|
182
|
+
description="SiN Strip TE 1310 nm, w=800 nm",
|
|
183
|
+
width=3.0,
|
|
184
|
+
limits=(-1, 1 + sin_thickness),
|
|
185
|
+
num_modes=1,
|
|
186
|
+
added_solver_modes=0,
|
|
187
|
+
polarization=None,
|
|
188
|
+
target_neff=2.1,
|
|
189
|
+
path_profiles=((0.8, 0.0, (4, 0)),),
|
|
190
|
+
),
|
|
191
|
+
"SiN_TM_1310_750": pf.PortSpec(
|
|
192
|
+
description="SiN Strip TM 1310 nm, w=750 nm",
|
|
193
|
+
width=3.0,
|
|
194
|
+
limits=(-1.2, 1.2 + sin_thickness),
|
|
195
|
+
num_modes=1,
|
|
196
|
+
added_solver_modes=1,
|
|
197
|
+
polarization="TM",
|
|
198
|
+
target_neff=2.1,
|
|
199
|
+
path_profiles=((0.75, 0.0, (4, 0)),),
|
|
200
|
+
),
|
|
201
|
+
"MM_SiN_TE_1550_3000": pf.PortSpec(
|
|
202
|
+
description="Multimode SiN Strip TE 1550 nm, w=3000 nm",
|
|
203
|
+
width=8.0,
|
|
204
|
+
limits=(-2.5, 2.5 + sin_thickness),
|
|
205
|
+
num_modes=7,
|
|
206
|
+
added_solver_modes=0,
|
|
207
|
+
polarization=None,
|
|
208
|
+
target_neff=2.1,
|
|
209
|
+
path_profiles=((3.0, 0.0, (4, 0)),),
|
|
210
|
+
),
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
result = pf.Technology("SiEPIC EBeam SiN", "1.2.0", layers, extrusion_specs, ports, opening)
|
|
214
|
+
result.random_variables = []
|
|
215
|
+
return result
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: siepic-sin-forge
|
|
3
|
+
Version: 1.2.0
|
|
4
|
+
Summary: SiEPIC EBeam SiN PDK implementation for PhotonForge
|
|
5
|
+
Author-email: "Flexcompute Inc." <info@flexcompute.com>
|
|
6
|
+
Project-URL: homepage, https://github.com/flexcompute/siepic-forge
|
|
7
|
+
Project-URL: documentation, https://github.com/flexcompute/siepic-forge
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Dist: photonforge>=1.4.0
|
|
11
|
+
Provides-Extra: test
|
|
12
|
+
Requires-Dist: pytest>=7.2; extra == "test"
|
|
13
|
+
Dynamic: license-file
|
|
14
|
+
|
|
15
|
+
# SiEPIC Forge
|
|
16
|
+
|
|
17
|
+
This python module implements the [SiEPIC EBeam SiN
|
|
18
|
+
PDK](https://github.com/SiEPIC/SiEPIC_EBeam_PDK) processes and components and
|
|
19
|
+
technology specifications for
|
|
20
|
+
[PhotonForge](https://docs.flexcompute.com/projects/photonforge/)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
### Python interface
|
|
26
|
+
|
|
27
|
+
Installation via `pip`:
|
|
28
|
+
|
|
29
|
+
pip install siepic-sin-forge
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
The simplest way to use the this PDK in PhotonForge is to set its technology as
|
|
35
|
+
default:
|
|
36
|
+
|
|
37
|
+
import photonforge as pf
|
|
38
|
+
import siepic_sin_forge as siepic
|
|
39
|
+
|
|
40
|
+
tech = siepic.ebeam()
|
|
41
|
+
pf.config.default_technology = tech
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
The `ebeam` function creates a parametric technology and accepts a number of
|
|
45
|
+
parameters to fine-tune the technology.
|
|
46
|
+
|
|
47
|
+
PDK components are available through the `component` function, which takes a
|
|
48
|
+
component name as first argument. The list of component names is available as a
|
|
49
|
+
set `component_names`:
|
|
50
|
+
|
|
51
|
+
print(siepic.component_names)
|
|
52
|
+
|
|
53
|
+
pdk_component = siepic.component("ebeam_YBranch_895")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
More information can be obtained in the documentation for each function:
|
|
57
|
+
|
|
58
|
+
help(siepic.ebeam)
|
|
59
|
+
|
|
60
|
+
help(siepic.component)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
## Warnings
|
|
64
|
+
|
|
65
|
+
Please note that the 3D structures obtained by extrusion through this module's
|
|
66
|
+
technologies are a best approximation of the intended fabricated structures,
|
|
67
|
+
but the actual final dimensions may differ due to several fabrication-specific
|
|
68
|
+
effects. In particular, doping profiles are represented with hard-boundary,
|
|
69
|
+
homogeneous solids, but, in practice will present process-dependent variations
|
|
70
|
+
with smooth boundaries.
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
## References
|
|
74
|
+
|
|
75
|
+
Process stack and other information obtained from [ANT
|
|
76
|
+
NanoSOI](https://www.appliednt.com/nanosoi/).
|
|
77
|
+
|
|
78
|
+
The GDSII cell library comes from the main PDK repository.
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
## Third-Party Licenses
|
|
82
|
+
|
|
83
|
+
- [`SiEPIC_EBeam_PDK`](https://github.com/SiEPIC/SiEPIC_EBeam_PDK)
|
|
84
|
+
|
|
85
|
+
> This project is licensed under the terms of the MIT license.
|
|
86
|
+
>
|
|
87
|
+
> Copyright (c) 2016-2020, Lukas Chrostowski and contributors
|
|
88
|
+
>
|
|
89
|
+
> Permission is hereby granted, free of charge, to any person obtaining a
|
|
90
|
+
> copy of this software and associated documentation files (the "Software"),
|
|
91
|
+
> to deal in the Software without restriction, including without limitation
|
|
92
|
+
> the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
93
|
+
> and/or sell copies of the Software, and to permit persons to whom the
|
|
94
|
+
> Software is furnished to do so, subject to the following conditions:
|
|
95
|
+
>
|
|
96
|
+
> The above copyright notice and this permission notice shall be included in
|
|
97
|
+
> all copies or substantial portions of the Software.
|
|
98
|
+
>
|
|
99
|
+
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
100
|
+
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
101
|
+
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
102
|
+
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
103
|
+
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
104
|
+
> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
105
|
+
> DEALINGS IN THE SOFTWARE.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
siepic_sin_forge/__init__.py
|
|
5
|
+
siepic_sin_forge/_component_data.py
|
|
6
|
+
siepic_sin_forge/_layers.py
|
|
7
|
+
siepic_sin_forge/component.py
|
|
8
|
+
siepic_sin_forge/technology.py
|
|
9
|
+
siepic_sin_forge.egg-info/PKG-INFO
|
|
10
|
+
siepic_sin_forge.egg-info/SOURCES.txt
|
|
11
|
+
siepic_sin_forge.egg-info/dependency_links.txt
|
|
12
|
+
siepic_sin_forge.egg-info/requires.txt
|
|
13
|
+
siepic_sin_forge.egg-info/top_level.txt
|
|
14
|
+
siepic_sin_forge/library/ANT_MMI_1x2_te1550_3dB_BB.gds
|
|
15
|
+
siepic_sin_forge/library/GC_SiN_TE_1310_8degOxide_BB.gds
|
|
16
|
+
siepic_sin_forge/library/GC_SiN_TE_1550_8degOxide_BB.gds
|
|
17
|
+
siepic_sin_forge/library/ULaval.gds
|
|
18
|
+
siepic_sin_forge/library/crossing_SiN_1550.gds
|
|
19
|
+
siepic_sin_forge/library/crossing_SiN_1550_extended.gds
|
|
20
|
+
siepic_sin_forge/library/crossing_horizontal.gds
|
|
21
|
+
siepic_sin_forge/library/crossing_manhattan.gds
|
|
22
|
+
siepic_sin_forge/library/ebeam_BondPad.gds
|
|
23
|
+
siepic_sin_forge/library/ebeam_DC_2-1_te895.gds
|
|
24
|
+
siepic_sin_forge/library/ebeam_DC_te895.gds
|
|
25
|
+
siepic_sin_forge/library/ebeam_Polarizer_TM_1550_UQAM.gds
|
|
26
|
+
siepic_sin_forge/library/ebeam_YBranch_895.gds
|
|
27
|
+
siepic_sin_forge/library/ebeam_gc_te895.gds
|
|
28
|
+
siepic_sin_forge/library/ebeam_terminator_SiN_1310.gds
|
|
29
|
+
siepic_sin_forge/library/ebeam_terminator_SiN_1550.gds
|
|
30
|
+
siepic_sin_forge/library/ebeam_terminator_SiN_te895.gds
|
|
31
|
+
siepic_sin_forge/library/port_SiN_800.gds
|
|
32
|
+
siepic_sin_forge/library/taper_SiN_750_3000.gds
|
|
33
|
+
siepic_sin_forge/library/taper_SiN_750_800.gds
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
siepic_sin_forge
|