siepic-forge 1.0.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.
Files changed (44) hide show
  1. siepic_forge-1.0.0/CHANGELOG.md +6 -0
  2. siepic_forge-1.0.0/LICENSE +19 -0
  3. siepic_forge-1.0.0/MANIFEST.in +2 -0
  4. siepic_forge-1.0.0/PKG-INFO +103 -0
  5. siepic_forge-1.0.0/README.md +90 -0
  6. siepic_forge-1.0.0/pyproject.toml +24 -0
  7. siepic_forge-1.0.0/setup.cfg +4 -0
  8. siepic_forge-1.0.0/siepic_forge/__init__.py +4 -0
  9. siepic_forge-1.0.0/siepic_forge/component.py +416 -0
  10. siepic_forge-1.0.0/siepic_forge/library/EBeam/GCs_BB.gds +0 -0
  11. siepic_forge-1.0.0/siepic_forge/library/EBeam/ebeam_adiabatic_te1550.gds +0 -0
  12. siepic_forge-1.0.0/siepic_forge/library/EBeam/ebeam_adiabatic_tm1550.gds +0 -0
  13. siepic_forge-1.0.0/siepic_forge/library/EBeam/ebeam_bdc_te1550.gds +0 -0
  14. siepic_forge-1.0.0/siepic_forge/library/EBeam/ebeam_crossing4.gds +0 -0
  15. siepic_forge-1.0.0/siepic_forge/library/EBeam/ebeam_gc_te1550.gds +0 -0
  16. siepic_forge-1.0.0/siepic_forge/library/EBeam/ebeam_gc_tm1550.gds +0 -0
  17. siepic_forge-1.0.0/siepic_forge/library/EBeam/ebeam_splitter_swg_assist_te1310.gds +0 -0
  18. siepic_forge-1.0.0/siepic_forge/library/EBeam/ebeam_splitter_swg_assist_te1550.gds +0 -0
  19. siepic_forge-1.0.0/siepic_forge/library/EBeam/ebeam_terminator_te1310.gds +0 -0
  20. siepic_forge-1.0.0/siepic_forge/library/EBeam/ebeam_terminator_te1550.gds +0 -0
  21. siepic_forge-1.0.0/siepic_forge/library/EBeam/ebeam_terminator_tm1550.gds +0 -0
  22. siepic_forge-1.0.0/siepic_forge/library/EBeam/ebeam_y_1550.gds +0 -0
  23. siepic_forge-1.0.0/siepic_forge/library/EBeam/ebeam_y_adiabatic.gds +0 -0
  24. siepic_forge-1.0.0/siepic_forge/library/EBeam/ebeam_y_adiabatic_500pin.gds +0 -0
  25. siepic_forge-1.0.0/siepic_forge/library/EBeam/taper_si_simm_1310.gds +0 -0
  26. siepic_forge-1.0.0/siepic_forge/library/EBeam/taper_si_simm_1550.gds +0 -0
  27. siepic_forge-1.0.0/siepic_forge/library/EBeam_SiN/ANT_MMI_1x2_te1550_3dB_BB.gds +0 -0
  28. siepic_forge-1.0.0/siepic_forge/library/EBeam_SiN/GC_SiN_TE_1550_8degOxide_BB.gds +0 -0
  29. siepic_forge-1.0.0/siepic_forge/library/EBeam_SiN/ULaval.gds +0 -0
  30. siepic_forge-1.0.0/siepic_forge/library/EBeam_SiN/ebeam_BondPad.gds +0 -0
  31. siepic_forge-1.0.0/siepic_forge/library/EBeam_SiN/ebeam_DC_2-1_te895.gds +0 -0
  32. siepic_forge-1.0.0/siepic_forge/library/EBeam_SiN/ebeam_DC_te895.gds +0 -0
  33. siepic_forge-1.0.0/siepic_forge/library/EBeam_SiN/ebeam_Polarizer_TM_1550_UQAM.gds +0 -0
  34. siepic_forge-1.0.0/siepic_forge/library/EBeam_SiN/ebeam_YBranch_895.gds +0 -0
  35. siepic_forge-1.0.0/siepic_forge/library/EBeam_SiN/ebeam_gc_te895.gds +0 -0
  36. siepic_forge-1.0.0/siepic_forge/library/EBeam_SiN/ebeam_terminator_SiN_1550.gds +0 -0
  37. siepic_forge-1.0.0/siepic_forge/library/EBeam_SiN/ebeam_terminator_SiN_te895.gds +0 -0
  38. siepic_forge-1.0.0/siepic_forge/library/EBeam_SiN/taper_SiN_750_3000.gds +0 -0
  39. siepic_forge-1.0.0/siepic_forge/technology.py +291 -0
  40. siepic_forge-1.0.0/siepic_forge.egg-info/PKG-INFO +103 -0
  41. siepic_forge-1.0.0/siepic_forge.egg-info/SOURCES.txt +42 -0
  42. siepic_forge-1.0.0/siepic_forge.egg-info/dependency_links.txt +1 -0
  43. siepic_forge-1.0.0/siepic_forge.egg-info/requires.txt +4 -0
  44. siepic_forge-1.0.0/siepic_forge.egg-info/top_level.txt +1 -0
@@ -0,0 +1,6 @@
1
+ # Changelog
2
+
3
+ ## v1.0.0 - 2024-02-13
4
+
5
+ ### Added
6
+ - Initial release.
@@ -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,2 @@
1
+ include CHANGELOG.md
2
+ graft siepic_forge/library
@@ -0,0 +1,103 @@
1
+ Metadata-Version: 2.1
2
+ Name: siepic-forge
3
+ Version: 1.0.0
4
+ Summary: SiEPIC 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.0.0rc1
11
+ Provides-Extra: test
12
+ Requires-Dist: pytest>=7.2; extra == "test"
13
+
14
+ # SiEPIC Forge
15
+
16
+ This python module implements the [SiEPIC EBeam
17
+ PDK](https://github.com/SiEPIC/SiEPIC_EBeam_PDK) PDK as components and
18
+ technology specification for
19
+ [PhotonForge](https://docs.flexcompute.com/projects/photonforge/)
20
+
21
+
22
+ ## Installation
23
+
24
+ ### Python interface
25
+
26
+ Installation via `pip`:
27
+
28
+ pip install siepic-forge
29
+
30
+
31
+ ### PhotonForge Web UI
32
+
33
+ In the Tidy3D web interface, go to your [*Account
34
+ Center*](https://tidy3d.simulation.cloud/account) and upload the token file
35
+ (.tok) under *PhotonForge Libraries* to enable this module.
36
+
37
+
38
+ ## Usage
39
+
40
+ The simplest way to use the this PDK in PhotonForge is to set its technology as
41
+ default:
42
+
43
+ import photonforge as pf
44
+ import siepic_forge as siepic
45
+
46
+ tech = siepic.ebeam()
47
+ pf.config.default_technology = tech
48
+
49
+
50
+ The `ebeam` function creates a parametric technology and accepts a number of
51
+ parameters to fine-tune the technology.
52
+
53
+ PDK components are available through the `component` function, which takes a
54
+ component name as first argument. The list of component names is available as a
55
+ set `component_names`:
56
+
57
+ print(siepic.component_names)
58
+
59
+ pdk_component = siepic.component("ebeam_y_1550")
60
+
61
+
62
+ More information can be obtained in the documentation for each function:
63
+
64
+ help(siepic.ebeam)
65
+
66
+ help(siepic.component)
67
+
68
+
69
+ ## Warnings
70
+
71
+ Please note that the 3D structures obtained by extrusion through this module's
72
+ technologies are a best approximation of the intended fabricated structures,
73
+ but the actual final dimensions may differ due to several fabrication-specific
74
+ effects. In particular, doping profiles are represented with hard-boundary,
75
+ homogeneous solids, but, in practice will present process-dependent variations
76
+ with smooth boundaries.
77
+
78
+
79
+ ## Third-Party Licenses
80
+
81
+ - [`SiEPIC_EBeam_PDK`](https://github.com/SiEPIC/SiEPIC_EBeam_PDK)
82
+
83
+ > This project is licensed under the terms of the MIT license.
84
+ >
85
+ > Copyright (c) 2016-2020, Lukas Chrostowski and contributors
86
+ >
87
+ > Permission is hereby granted, free of charge, to any person obtaining a
88
+ > copy of this software and associated documentation files (the "Software"),
89
+ > to deal in the Software without restriction, including without limitation
90
+ > the rights to use, copy, modify, merge, publish, distribute, sublicense,
91
+ > and/or sell copies of the Software, and to permit persons to whom the
92
+ > Software is furnished to do so, subject to the following conditions:
93
+ >
94
+ > The above copyright notice and this permission notice shall be included in
95
+ > all copies or substantial portions of the Software.
96
+ >
97
+ > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
98
+ > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
99
+ > FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
100
+ > AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
101
+ > LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
102
+ > FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
103
+ > DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,90 @@
1
+ # SiEPIC Forge
2
+
3
+ This python module implements the [SiEPIC EBeam
4
+ PDK](https://github.com/SiEPIC/SiEPIC_EBeam_PDK) PDK as components and
5
+ technology specification 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-forge
16
+
17
+
18
+ ### PhotonForge Web UI
19
+
20
+ In the Tidy3D web interface, go to your [*Account
21
+ Center*](https://tidy3d.simulation.cloud/account) and upload the token file
22
+ (.tok) under *PhotonForge Libraries* to enable this module.
23
+
24
+
25
+ ## Usage
26
+
27
+ The simplest way to use the this PDK in PhotonForge is to set its technology as
28
+ default:
29
+
30
+ import photonforge as pf
31
+ import siepic_forge as siepic
32
+
33
+ tech = siepic.ebeam()
34
+ pf.config.default_technology = tech
35
+
36
+
37
+ The `ebeam` function creates a parametric technology and accepts a number of
38
+ parameters to fine-tune the technology.
39
+
40
+ PDK components are available through the `component` function, which takes a
41
+ component name as first argument. The list of component names is available as a
42
+ set `component_names`:
43
+
44
+ print(siepic.component_names)
45
+
46
+ pdk_component = siepic.component("ebeam_y_1550")
47
+
48
+
49
+ More information can be obtained in the documentation for each function:
50
+
51
+ help(siepic.ebeam)
52
+
53
+ help(siepic.component)
54
+
55
+
56
+ ## Warnings
57
+
58
+ Please note that the 3D structures obtained by extrusion through this module's
59
+ technologies are a best approximation of the intended fabricated structures,
60
+ but the actual final dimensions may differ due to several fabrication-specific
61
+ effects. In particular, doping profiles are represented with hard-boundary,
62
+ homogeneous solids, but, in practice will present process-dependent variations
63
+ with smooth boundaries.
64
+
65
+
66
+ ## Third-Party Licenses
67
+
68
+ - [`SiEPIC_EBeam_PDK`](https://github.com/SiEPIC/SiEPIC_EBeam_PDK)
69
+
70
+ > This project is licensed under the terms of the MIT license.
71
+ >
72
+ > Copyright (c) 2016-2020, Lukas Chrostowski and contributors
73
+ >
74
+ > Permission is hereby granted, free of charge, to any person obtaining a
75
+ > copy of this software and associated documentation files (the "Software"),
76
+ > to deal in the Software without restriction, including without limitation
77
+ > the rights to use, copy, modify, merge, publish, distribute, sublicense,
78
+ > and/or sell copies of the Software, and to permit persons to whom the
79
+ > Software is furnished to do so, subject to the following conditions:
80
+ >
81
+ > The above copyright notice and this permission notice shall be included in
82
+ > all copies or substantial portions of the Software.
83
+ >
84
+ > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
85
+ > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
86
+ > FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
87
+ > AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
88
+ > LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
89
+ > FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
90
+ > DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,24 @@
1
+ [project]
2
+ name = "siepic-forge"
3
+ version = "1.0.0"
4
+ authors = [{name = "Flexcompute Inc.", email = "info@flexcompute.com"}]
5
+ description = "SiEPIC PDK implementation for PhotonForge"
6
+ readme = "README.md"
7
+ dependencies = ["photonforge ~= 1.0.0rc1"]
8
+
9
+ [project.optional-dependencies]
10
+ test = ["pytest >= 7.2"]
11
+
12
+ [project.urls]
13
+ homepage = "https://github.com/flexcompute/siepic-forge"
14
+ documentation = "https://github.com/flexcompute/siepic-forge"
15
+
16
+ [tool.setuptools]
17
+ packages = ["siepic_forge"]
18
+
19
+ [tool.black]
20
+ line-length = 100
21
+
22
+ [build-system]
23
+ requires = ["setuptools >= 45"]
24
+ build-backend = "setuptools.build_meta"
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,4 @@
1
+ from .technology import ebeam
2
+ from .component import component, component_names
3
+
4
+ __version__ = "1.0.0"
@@ -0,0 +1,416 @@
1
+ try:
2
+ from importlib.resources import files, as_file
3
+ except ImportError:
4
+ from importlib_resources import files, as_file
5
+
6
+ import math
7
+ import warnings
8
+
9
+ import photonforge as pf
10
+
11
+
12
+ _symmetries_2port = [("P0", "P1", {"P1": "P0"})]
13
+
14
+ _symmetries_3port = [("P1", "P2", {"P0": "P0", "P2": "P1"})]
15
+
16
+ _symmetries_crossing = [
17
+ ("P0", "P1", {"P1": "P0", "P2": "P3", "P3": "P2"}),
18
+ ("P0", "P2", {"P1": "P3", "P2": "P1", "P3": "P0"}),
19
+ ("P0", "P3", {"P1": "P2", "P2": "P0", "P3": "P1"}),
20
+ ]
21
+
22
+ _symmetries_directional_coupler = [
23
+ ("P0", "P1", {"P1": "P0", "P2": "P3", "P3": "P2"}),
24
+ ("P0", "P2", {"P1": "P3", "P2": "P0", "P3": "P1"}),
25
+ ("P0", "P3", {"P1": "P2", "P2": "P1", "P3": "P0"}),
26
+ ]
27
+
28
+ _symmetries_mmi12 = [("P0", "P2", {"P1": "P1", "P2": "P0"})]
29
+
30
+ _symmetries_mmi22 = _symmetries_directional_coupler
31
+
32
+ _waist = 5.0
33
+
34
+ _angle = 8 * math.pi / 180
35
+ _vx8 = math.sin(_angle)
36
+ _vy8 = -math.cos(_angle)
37
+
38
+ _angle = 7 * math.pi / 180
39
+ _tm1550_vx = math.sin(_angle)
40
+ _tm1550_vy = -math.cos(_angle)
41
+
42
+ _angle = -21 * math.pi / 180
43
+ _te1550_vx = math.sin(_angle)
44
+ _te1550_vy = -math.cos(_angle)
45
+
46
+ _angle = -7 * math.pi / 180
47
+ _te895_vx = math.sin(_angle)
48
+ _te895_vy = -math.cos(_angle)
49
+
50
+ _component_data = {
51
+ "ANT_MMI_1x2_te1550_3dB_BB": (
52
+ "EBeam_SiN",
53
+ "ANT_MMI_1x2_te1550_3dB_BB",
54
+ [
55
+ ((-12.88, 0.0), 0, "SiN_TE_1550_750"),
56
+ ((12.88, -0.975), 180, "SiN_TE_1550_750"),
57
+ ((12.88, 0.975), 180, "SiN_TE_1550_750"),
58
+ ],
59
+ None,
60
+ ),
61
+ "GC_SiN_TE_1550_8degOxide_BB": (
62
+ "EBeam_SiN",
63
+ "GC_SiN_TE_1550_8degOxide_BB",
64
+ [
65
+ ((0.0, 0.0), 180, "SiN_TE_1550_750"),
66
+ ((-29.7, 0.0), (_vx8, 0, _vy8), _waist, 90),
67
+ ],
68
+ None,
69
+ ),
70
+ "ebeam_MMI_2x2_5050_te1310": (
71
+ "EBeam_SiN",
72
+ "ULaval",
73
+ [
74
+ ((-16.72, -1.2), 0, "SiN_TE_1550_800"),
75
+ ((-16.72, 1.2), 0, "SiN_TE_1550_800"),
76
+ ((16.72, -1.2), 180, "SiN_TE_1550_800"),
77
+ ((16.72, 1.2), 180, "SiN_TE_1550_800"),
78
+ ],
79
+ {"port_symmetries": _symmetries_mmi22},
80
+ ),
81
+ # NOTE: no TE port at 1310 nm with 800 nm
82
+ "ebeam_YBranch_te1310": (
83
+ "EBeam_SiN",
84
+ "ULaval",
85
+ [
86
+ ((-7.69, 0.0), 0, "SiN_TE_1550_800"),
87
+ ((7.69, 0.7), 180, "SiN_TE_1550_800"),
88
+ ((7.69, -0.7), 180, "SiN_TE_1550_800"),
89
+ ],
90
+ {"port_symmetries": _symmetries_3port},
91
+ ),
92
+ "ebeam_BondPad": (
93
+ "EBeam_SiN",
94
+ "ebeam_BondPad",
95
+ [],
96
+ None,
97
+ ),
98
+ "ebeam_DC_2-1_te895": (
99
+ "EBeam_SiN",
100
+ "ebeam_DC_2-1_te895",
101
+ [
102
+ ((-14.56, -2.285), 0, "SiN_TE_895_450"),
103
+ ((-14.56, 2.285), 0, "SiN_TE_895_450"),
104
+ ((14.56, -2.285), 180, "SiN_TE_895_450"),
105
+ ((14.56, 2.285), 180, "SiN_TE_895_450"),
106
+ ],
107
+ {"port_symmetries": _symmetries_directional_coupler},
108
+ ),
109
+ "ebeam_DC_te895": (
110
+ "EBeam_SiN",
111
+ "ebeam_DC_te895",
112
+ [
113
+ ((-14.137, -2.285), 0, "SiN_TE_895_450"),
114
+ ((-14.137, 2.285), 0, "SiN_TE_895_450"),
115
+ ((14.137, -2.285), 180, "SiN_TE_895_450"),
116
+ ((14.137, 2.285), 180, "SiN_TE_895_450"),
117
+ ],
118
+ {"port_symmetries": _symmetries_directional_coupler},
119
+ ),
120
+ # WARN: Missing port (-6.0, 0.0).
121
+ # WARN: Missing port (6.0, 0.0).
122
+ # "ebeam_Polarizer_TM_1550_UQAM": (
123
+ # "EBeam_SiN",
124
+ # "ebeam_Polarizer_TM_1550_UQAM",
125
+ # [],
126
+ # None,
127
+ # ),
128
+ "ebeam_YBranch_895": (
129
+ "EBeam_SiN",
130
+ "ebeam_YBranch_895",
131
+ [
132
+ ((0.0, 0.0), 0, "SiN_TE_895_450"),
133
+ ((15.0, -2.75), 180, "SiN_TE_895_450"),
134
+ ((15.0, 2.75), 180, "SiN_TE_895_450"),
135
+ ],
136
+ {"port_symmetries": _symmetries_3port},
137
+ ),
138
+ "ebeam_gc_te895": (
139
+ "EBeam_SiN",
140
+ "ebeam_gc_te895",
141
+ [
142
+ ((-24.2, 0.0), 0, "SiN_TE_895_450"),
143
+ ((8, 0), (_te895_vx, 0, _te895_vy), _waist, 90),
144
+ ],
145
+ {"symmetry": (0, -1, 0), "bounds": ((None, -10, None), (25, 10, None))},
146
+ ),
147
+ "ebeam_terminator_SiN_1550": (
148
+ "EBeam_SiN",
149
+ "ebeam_terminator_SiN_1550",
150
+ [((0.0, 0.0), 180, "SiN_TE_1550_750")],
151
+ {},
152
+ ),
153
+ "ebeam_terminator_SiN_te895": (
154
+ "EBeam_SiN",
155
+ "ebeam_terminator_SiN_te895",
156
+ [((0.0, 0.0), 180, "SiN_TE_895_450")],
157
+ {},
158
+ ),
159
+ "taper_SiN_750_3000": (
160
+ "EBeam_SiN",
161
+ "taper_SiN_750_3000",
162
+ [
163
+ ((0.0, 0.0), 0, "SiN_TE_1550_750"),
164
+ ((50.0, 0.0), 180, "MM_SiN_TE_1550_3000"),
165
+ ],
166
+ {},
167
+ ),
168
+ "GC_TE_1310_8degOxide_BB": (
169
+ "EBeam",
170
+ "GCs_BB",
171
+ [
172
+ ((0.0, 0.0), 180, "TE_1310_350"),
173
+ ((-20.4, 0.0), (_vx8, 0, _vy8), _waist, 90),
174
+ ],
175
+ None,
176
+ ),
177
+ "GC_TE_1550_8degOxide_BB": (
178
+ "EBeam",
179
+ "GCs_BB",
180
+ [
181
+ ((0.0, 0.0), 180, "TE_1550_500"),
182
+ ((-20.4, 0.0), (_vx8, 0, _vy8), _waist, 90),
183
+ ],
184
+ None,
185
+ ),
186
+ # NOTE: no TM port with width 350 nm
187
+ "GC_TM_1310_8degOxide_BB": (
188
+ "EBeam",
189
+ "GCs_BB",
190
+ [
191
+ ((0.0, 0.0), 180, "TE_1310_350"),
192
+ ((-20.4, 0.0), (_vx8, 0, _vy8), _waist, 0),
193
+ ],
194
+ None,
195
+ ),
196
+ "GC_TM_1550_8degOxide_BB": (
197
+ "EBeam",
198
+ "GCs_BB",
199
+ [
200
+ ((0.0, 0.0), 180, "TM_1550_500"),
201
+ ((-20.4, 0.0), (_vx8, 0, _vy8), _waist, 0),
202
+ ],
203
+ None,
204
+ ),
205
+ "ebeam_adiabatic_te1550": (
206
+ "EBeam",
207
+ "ebeam_adiabatic_te1550",
208
+ [
209
+ ((0.1, -1.5), 0, "TE_1550_500"),
210
+ ((0.1, 1.5), 0, "TE_1550_500"),
211
+ ((195.9, -1.5), 180, "TE_1550_500"),
212
+ ((195.9, 1.5), 180, "TE_1550_500"),
213
+ ],
214
+ {},
215
+ ),
216
+ "ebeam_adiabatic_tm1550": (
217
+ "EBeam",
218
+ "ebeam_adiabatic_tm1550",
219
+ [
220
+ ((0.1, -1.5), 0, "TM_1550_500"),
221
+ ((0.1, 1.5), 0, "TM_1550_500"),
222
+ ((217.9, -1.5), 180, "TM_1550_500"),
223
+ ((217.9, 1.5), 180, "TM_1550_500"),
224
+ ],
225
+ {},
226
+ ),
227
+ "ebeam_bdc_te1550": (
228
+ "EBeam",
229
+ "ebeam_bdc_te1550",
230
+ [
231
+ ((-35.45, -2.35), 0, "TE_1550_500"),
232
+ ((-35.45, 2.35), 0, "TE_1550_500"),
233
+ ((35.3, -2.35), 180, "TE_1550_500"),
234
+ ((35.3, 2.35), 180, "TE_1550_500"),
235
+ ],
236
+ {},
237
+ ),
238
+ "ebeam_crossing4": (
239
+ "EBeam",
240
+ "ebeam_crossing4",
241
+ [
242
+ ((-4.8, 0.0), 0, "TE_1550_500"),
243
+ ((4.8, 0.0), 180, "TE_1550_500"),
244
+ ((0.0, -4.8), 90, "TE_1550_500"),
245
+ ((0.0, 4.8), 270, "TE_1550_500"),
246
+ ],
247
+ {"port_symmetries": _symmetries_crossing},
248
+ ),
249
+ "ebeam_gc_te1550": (
250
+ "EBeam",
251
+ "ebeam_gc_te1550",
252
+ [
253
+ ((0.0, 0.0), 180, "TE_1550_500"),
254
+ ((-20.4, 0.0), (_te1550_vx, 0, _te1550_vy), _waist, 90),
255
+ ],
256
+ {"symmetry": (0, -1, 0), "bounds": ((-33, -11, None), (None, 11, None))},
257
+ ),
258
+ "ebeam_gc_tm1550": (
259
+ "EBeam",
260
+ "ebeam_gc_tm1550",
261
+ [
262
+ ((0.0, 0.0), 180, "TM_1550_500"),
263
+ ((-24.4, 0.0), (_tm1550_vx, 0, _tm1550_vy), _waist, 0),
264
+ ],
265
+ {"symmetry": (0, 1, 0), "bounds": ((None, -11, None), (None, 11, None))},
266
+ ),
267
+ "ebeam_splitter_swg_assist_te1310": (
268
+ "EBeam",
269
+ "ebeam_splitter_swg_assist_te1310",
270
+ [
271
+ ((-63.001, -2.0), 0, "TE_1310_350"),
272
+ ((-63.001, 2.0), 0, "TE_1310_350"),
273
+ ((63.001, -2.0), 180, "TE_1310_350"),
274
+ ((63.001, 2.0), 180, "TE_1310_350"),
275
+ ],
276
+ {},
277
+ ),
278
+ "ebeam_splitter_swg_assist_te1550": (
279
+ "EBeam",
280
+ "ebeam_splitter_swg_assist_te1550",
281
+ [
282
+ ((-63.001, -1.975), 0, "TE_1550_500"),
283
+ ((-63.001, 1.975), 0, "TE_1550_500"),
284
+ ((63.001, -1.975), 180, "TE_1550_500"),
285
+ ((63.001, 1.975), 180, "TE_1550_500"),
286
+ ],
287
+ {},
288
+ ),
289
+ "ebeam_terminator_te1310": (
290
+ "EBeam",
291
+ "ebeam_terminator_te1310",
292
+ [((0.0, 0.0), 180, "TE_1310_350")],
293
+ {},
294
+ ),
295
+ "ebeam_terminator_te1550": (
296
+ "EBeam",
297
+ "ebeam_terminator_te1550",
298
+ [((0.0, 0.0), 180, "TE_1550_500")],
299
+ {},
300
+ ),
301
+ "ebeam_terminator_tm1550": (
302
+ "EBeam",
303
+ "ebeam_terminator_tm1550",
304
+ [((0.0, 0.0), 180, "TM_1550_500")],
305
+ {},
306
+ ),
307
+ "ebeam_y_1550": (
308
+ "EBeam",
309
+ "ebeam_y_1550",
310
+ [
311
+ ((-7.4, 0.0), 0, "TE_1550_500"),
312
+ ((7.4, -2.75), 180, "TE_1550_500"),
313
+ ((7.4, 2.75), 180, "TE_1550_500"),
314
+ ],
315
+ {"port_symmetries": _symmetries_3port},
316
+ ),
317
+ "ebeam_y_adiabatic": (
318
+ "EBeam",
319
+ "ebeam_y_adiabatic",
320
+ [
321
+ ((0.05, 0.0), 0, "TE-TM_1550_450"),
322
+ ((50.05, -1.25), 180, "TE-TM_1550_450"),
323
+ ((50.05, 1.25), 180, "TE-TM_1550_450"),
324
+ ],
325
+ {"port_symmetries": _symmetries_3port},
326
+ ),
327
+ "ebeam_y_adiabatic_500pin": (
328
+ "EBeam",
329
+ "ebeam_y_adiabatic_500pin",
330
+ [
331
+ ((-1.0, 0.0), 0, "TE_1550_500"),
332
+ ((51.0, -1.25), 180, "TE_1550_500"),
333
+ ((51.0, 1.25), 180, "TE_1550_500"),
334
+ ],
335
+ {"port_symmetries": _symmetries_3port},
336
+ ),
337
+ "taper_si_simm_1310": (
338
+ "EBeam",
339
+ "taper_si_simm_1310",
340
+ # NOTE: no MM TM port at 1310 nm
341
+ [((50.0, 0.0), 180, "MM_TE_1550_3000"), ((0.0, 0.0), 0, "TE_1310_350")],
342
+ {},
343
+ ),
344
+ "taper_si_simm_1550": (
345
+ "EBeam",
346
+ "taper_si_simm_1550",
347
+ [((50.0, 0.0), 180, "MM_TE_1550_3000"), ((0.0, 0.0), 0, "TE_1550_500")],
348
+ {},
349
+ ),
350
+ }
351
+
352
+ component_names = set(_component_data.keys())
353
+
354
+
355
+ def component(
356
+ cell_name: str, technology: pf.Technology = None, tidy3d_model_kwargs: dict = {}
357
+ ) -> pf.Component:
358
+ """Load a component from the default PDK library.
359
+
360
+ Args:
361
+ cell_name (str): Name of the component to load.
362
+ technology (Technology): Technology for the created component.
363
+ tidy3d_model_kwargs (dict): Keyword arguments passed to the Tidy3D
364
+ model of the created component.
365
+
366
+ Returns:
367
+ Component: Component loaded from the default PDK library.
368
+
369
+ Note:
370
+ The available component names are listed in the module-level tuple
371
+ ``component_names``.
372
+ """
373
+ family, libname, port_data, kwargs = _component_data.get(cell_name, (None, None, None, None))
374
+ if family is None:
375
+ raise KeyError(f"{cell_name} is not a library component.")
376
+
377
+ if technology is None:
378
+ technology = pf.config.default_technology
379
+ if not technology.name.startswith("SiEPIC EBeam"):
380
+ warnings.warn(
381
+ f"Current default technology {technology.name} does not seem supported by the "
382
+ "SiEPIC EBeam UW component library",
383
+ RuntimeWarning,
384
+ 1,
385
+ )
386
+
387
+ # Load library cell
388
+ gdsii = files("siepic_forge") / "library" / family / (libname + ".gds")
389
+ with as_file(gdsii) as fname:
390
+ c = pf.load_layout(fname, technology=technology)[cell_name]
391
+
392
+ # Add ports
393
+ z = technology.parametric_kwargs.get("top_oxide_thickness", -1.0)
394
+ if z > 0:
395
+ z += 0.1
396
+ else:
397
+ z = 1.0
398
+ for data in port_data:
399
+ if len(data) == 3:
400
+ port = pf.Port(data[0], data[1], technology.ports[data[2]])
401
+ else:
402
+ port = pf.GaussianPort(
403
+ data[0] + (z,),
404
+ data[1],
405
+ waist_radius=data[2],
406
+ polarization_angle=data[3],
407
+ )
408
+ c.add_port(port)
409
+
410
+ # Add model
411
+ if kwargs is not None:
412
+ kwargs = dict(kwargs)
413
+ kwargs.update(tidy3d_model_kwargs)
414
+ c.add_model(pf.Tidy3DModel(**kwargs), "Tidy3D")
415
+
416
+ return c
@@ -0,0 +1,291 @@
1
+ import tidy3d as td
2
+ import photonforge as pf
3
+
4
+
5
+ _Medium = td.components.medium.MediumType
6
+
7
+
8
+ @pf.parametric_technology
9
+ def ebeam(
10
+ *,
11
+ si_thickness: float = 0.220,
12
+ si_slab_thickness: float = 0.090,
13
+ sin_thickness: float = 0.400,
14
+ si_mask_dilation: float = 0.0,
15
+ si_slab_mask_dilation: float = 0.0,
16
+ sin_mask_dilation: float = 0.0,
17
+ sidewall_angle: float = 0.0,
18
+ top_oxide_thickness: float = 2.0,
19
+ bottom_oxide_thickness: float = 3.017,
20
+ include_top_opening: bool = False,
21
+ include_substrate: bool = False,
22
+ sio2: _Medium = td.material_library["SiO2"]["Palik_Lossless"],
23
+ si: _Medium = td.material_library["cSi"]["Li1993_293K"],
24
+ sin: _Medium = td.material_library["Si3N4"]["Luke2015PMLStable"],
25
+ opening: _Medium = td.Medium(permittivity=1.0),
26
+ ) -> pf.Technology:
27
+ """Create a technology for the e-beam PDK.
28
+
29
+ The current version does not extrude heaters or metal layers, nor oxide
30
+ opening windows.
31
+
32
+ Args:
33
+ si_thickness (float): Full silicon layer thickness.
34
+ si_slab_thickness (float): Partially etched slab thickness in
35
+ silicon.
36
+ sin_thickness (float): SiN layer thinckness.
37
+ si_mask_dilation (float): Mask dilation for the full-thickness Si
38
+ layer.
39
+ si_slab_mask_dilation (float): Mask dilation for the partially
40
+ etched Si layer.
41
+ sin_mask_dilation (float): Mask dilation for the SiN layer.
42
+ sidewall_angle (float): Sidewall angle (in degrees) for Si and SiN
43
+ etching.
44
+ top_oxide_thickness (float): Thickness of the top oxide clad,
45
+ measured from the substrate.
46
+ bottom_oxide_thickness (float): Thickness of the bottom oxide clad.
47
+ include_top_opening (bool): Flag indicating wether or not to include
48
+ the region above the top oxide.
49
+ include_substrate (bool): Flag indicating wether or not to include
50
+ the silicon substrate.
51
+ sio2 (Medium): Background medium.
52
+ si (Medium): Silicon medium.
53
+ sin (Medium): Silicon nitride medium.
54
+ opening (Medium): Medium for openings.
55
+
56
+ Returns:
57
+ Technology: E-Beam PDK technology definition.
58
+ """
59
+
60
+ layers = {
61
+ "Waveguide": pf.LayerSpec((1, 99), "Waveguides", "#ff80a818", "\\"),
62
+ "Si": pf.LayerSpec((1, 0), "Waveguides", "#ff80a818", "\\\\"),
63
+ "SiN": pf.LayerSpec((1, 5), "Waveguides", "#a6cee318", "\\\\"),
64
+ "Si slab": pf.LayerSpec((2, 0), "Waveguides", "#80a8ff18", "/"),
65
+ "Si_Litho193nm": pf.LayerSpec((1, 69), "Waveguides", "#cc80a818", "\\"),
66
+ "Oxide open (to BOX)": pf.LayerSpec((6, 0), "Waveguides", "#ffae0018", "\\"),
67
+ "Text": pf.LayerSpec((10, 0), "", "#0000ff18", "\\"),
68
+ "Si N": pf.LayerSpec((20, 0), "Doping", "#7000FF18", "\\\\"),
69
+ "Si N++": pf.LayerSpec((24, 0), "Doping", "#0000ff18", ":"),
70
+ "M1_heater": pf.LayerSpec((11, 0), "Metal", "#ebc63418", "xx"),
71
+ "M2_router": pf.LayerSpec((12, 0), "Metal", "#3471eb18", "xx"),
72
+ "M_Open": pf.LayerSpec((13, 0), "Metal", "#00000018", "xx"),
73
+ "VC": pf.LayerSpec((40, 0), "Metal", "#3a027f18", "xx"),
74
+ "FloorPlan": pf.LayerSpec((99, 0), "Misc", "#8000ff18", "hollow"),
75
+ "Deep Trench": pf.LayerSpec((201, 0), "Misc", "#c0c0c018", "solid"),
76
+ "Dicing": pf.LayerSpec((210, 0), "Misc", "#a0a0c018", "solid"),
77
+ "Chip design area": pf.LayerSpec((290, 0), "Misc", "#80005718", "hollow"),
78
+ "Keep out": pf.LayerSpec((202, 0), "Misc", "#a0a0c018", "//"),
79
+ "SEM": pf.LayerSpec((200, 0), "Misc", "#ff00ff18", "\\"),
80
+ "DevRec": pf.LayerSpec((68, 0), "SiEPIC", "#00408018", "hollow"),
81
+ "PinRec": pf.LayerSpec((1, 10), "SiEPIC", "#00408018", "/"),
82
+ "PinRecM": pf.LayerSpec((1, 11), "SiEPIC", "#00408018", "/"),
83
+ "FbrTgt": pf.LayerSpec((81, 0), "SiEPIC", "#00408018", "/"),
84
+ "Errors": pf.LayerSpec((999, 0), "SiEPIC", "#00008018", "/"),
85
+ "FDTD": pf.LayerSpec((733, 0), "SiEPIC", "#80005718", "hollow"),
86
+ "BlackBox": pf.LayerSpec((998, 0), "SiEPIC", "#00408018", "solid"),
87
+ }
88
+
89
+ extrusion_specs = [
90
+ pf.ExtrusionSpec(
91
+ pf.MaskSpec((1, 0), dilation=si_mask_dilation),
92
+ si,
93
+ (0, si_thickness),
94
+ sidewall_angle,
95
+ ),
96
+ pf.ExtrusionSpec(
97
+ pf.MaskSpec((2, 0), dilation=si_slab_mask_dilation),
98
+ si,
99
+ (0, si_slab_thickness),
100
+ sidewall_angle,
101
+ ),
102
+ pf.ExtrusionSpec(
103
+ pf.MaskSpec((1, 5), dilation=sin_mask_dilation),
104
+ sin,
105
+ (0, sin_thickness),
106
+ sidewall_angle,
107
+ ),
108
+ pf.ExtrusionSpec(pf.MaskSpec((201, 0), (210, 0), "+"), opening, (-pf.Z_INF, pf.Z_INF)),
109
+ ]
110
+
111
+ if include_top_opening:
112
+ extrusion_specs.insert(
113
+ 0, pf.ExtrusionSpec(pf.MaskSpec(), opening, (top_oxide_thickness, pf.Z_INF))
114
+ )
115
+
116
+ if include_substrate:
117
+ extrusion_specs.insert(
118
+ 0, pf.ExtrusionSpec(pf.MaskSpec(), si, (-pf.Z_INF, -bottom_oxide_thickness))
119
+ )
120
+
121
+ ports = {
122
+ "TE_1550_500": pf.PortSpec(
123
+ description="Strip TE 1550 nm, w=500 nm",
124
+ width=2.0,
125
+ limits=(-1, 1 + si_thickness),
126
+ num_modes=1,
127
+ target_neff=3.5,
128
+ path_profiles=((0.5, 0.0, (1, 0)),),
129
+ ),
130
+ "TE_1310_410": pf.PortSpec(
131
+ description="Strip TE 1310 nm, w=410 nm",
132
+ width=2.0,
133
+ limits=(-1, 1 + si_thickness),
134
+ num_modes=1,
135
+ target_neff=3.5,
136
+ path_profiles=((0.41, 0.0, (1, 0)),),
137
+ ),
138
+ "TE_1310_350": pf.PortSpec(
139
+ description="Strip TE 1310 nm, w=350 nm",
140
+ width=2.0,
141
+ limits=(-1, 1 + si_thickness),
142
+ num_modes=1,
143
+ target_neff=3.5,
144
+ path_profiles=((0.35, 0.0, (1, 0)),),
145
+ ),
146
+ "TM_1550_500": pf.PortSpec(
147
+ description="Strip TM 1550 nm, w=500 nm",
148
+ width=2.5,
149
+ limits=(-1, 1 + si_thickness),
150
+ num_modes=2,
151
+ target_neff=3.5,
152
+ path_profiles=((0.5, 0.0, (1, 0)),),
153
+ ),
154
+ "TE-TM_1550_450": pf.PortSpec(
155
+ description="Strip TE-TM 1550, w=450 nm",
156
+ width=2.0,
157
+ limits=(-1, 1 + si_thickness),
158
+ num_modes=2,
159
+ target_neff=3.5,
160
+ path_profiles=((0.45, 0.0, (1, 0)),),
161
+ ),
162
+ "MM_TE_1550_2000": pf.PortSpec(
163
+ description="Multimode Strip TE 1550 nm, w=2000 nm",
164
+ width=6.0,
165
+ limits=(-2, 2 + si_thickness),
166
+ num_modes=10,
167
+ target_neff=3.5,
168
+ path_profiles=((2.0, 0.0, (1, 0)),),
169
+ ),
170
+ "MM_TE_1550_3000": pf.PortSpec(
171
+ description="Multimode Strip TE 1550 nm, w=3000 nm",
172
+ width=6.0,
173
+ limits=(-2, 2 + si_thickness),
174
+ num_modes=14,
175
+ target_neff=3.5,
176
+ path_profiles=((3.0, 0.0, (1, 0)),),
177
+ ),
178
+ "Slot_TE_1550_500": pf.PortSpec(
179
+ description="Slot TE 1550 nm, w=500 nm, gap=100nm",
180
+ width=2.0,
181
+ limits=(-1, 1 + si_thickness),
182
+ num_modes=1,
183
+ target_neff=3.5,
184
+ path_profiles=((0.2, -0.15, (1, 0)), (0.2, 0.15, (1, 0))),
185
+ ),
186
+ "eskid_TE_1550": pf.PortSpec(
187
+ description="eskid TE 1550",
188
+ width=3.31,
189
+ limits=(-1, 1 + si_thickness),
190
+ num_modes=1,
191
+ target_neff=3.5,
192
+ path_profiles=(
193
+ (0.35, 0.0, (1, 0)),
194
+ (0.06, 0.265, (1, 0)),
195
+ (0.06, -0.265, (1, 0)),
196
+ (0.06, 0.385, (1, 0)),
197
+ (0.06, -0.385, (1, 0)),
198
+ (0.06, 0.505, (1, 0)),
199
+ (0.06, -0.505, (1, 0)),
200
+ (0.06, 0.625, (1, 0)),
201
+ (0.06, -0.625, (1, 0)),
202
+ ),
203
+ ),
204
+ "Rib_TE_1550_500": pf.PortSpec(
205
+ description="Rib (90 nm slab) TE 1550 nm, w=500 nm",
206
+ width=2.5,
207
+ limits=(-1, 1 + si_thickness),
208
+ num_modes=1,
209
+ target_neff=3.5,
210
+ path_profiles=((0.5, 0.0, (1, 0)), (3.0, 0.0, (2, 0))),
211
+ ),
212
+ "Rib_TE_1310_350": pf.PortSpec(
213
+ description="Rib (90 nm slab) TE 1310 nm, w=350 nm",
214
+ width=2.35,
215
+ limits=(-1, 1 + si_thickness),
216
+ num_modes=1,
217
+ target_neff=3.5,
218
+ path_profiles=((0.35, 0.0, (1, 0)), (3.0, 0.0, (2, 0))),
219
+ ),
220
+ "SiN_TE_895_450": pf.PortSpec(
221
+ description="SiN Strip TE 895 nm, w=450 nm",
222
+ width=4.0,
223
+ limits=(-2.0, 2.0 + sin_thickness),
224
+ num_modes=2,
225
+ target_neff=2.1,
226
+ path_profiles=((0.45, 0.0, (1, 5)),),
227
+ ),
228
+ "SiN_TE_1550_750": pf.PortSpec(
229
+ description="SiN Strip TE 1550 nm, w=750 nm",
230
+ width=3.0,
231
+ limits=(-1, 1 + sin_thickness),
232
+ num_modes=1,
233
+ target_neff=2.1,
234
+ path_profiles=((0.75, 0.0, (1, 5)),),
235
+ ),
236
+ "SiN_TE_1550_800": pf.PortSpec(
237
+ description="SiN Strip TE 1550 nm, w=800 nm",
238
+ width=3.0,
239
+ limits=(-1, 1 + sin_thickness),
240
+ num_modes=1,
241
+ target_neff=2.1,
242
+ path_profiles=((0.8, 0.0, (1, 5)),),
243
+ ),
244
+ "SiN_TE_1550_1000": pf.PortSpec(
245
+ description="SiN Strip TE 1550 nm, w=1000 nm",
246
+ width=3.0,
247
+ limits=(-1, 1 + sin_thickness),
248
+ num_modes=1,
249
+ target_neff=2.1,
250
+ path_profiles=((1.0, 0.0, (1, 5)),),
251
+ ),
252
+ "SiN_TM_1550_1000": pf.PortSpec(
253
+ description="SiN Strip TM 1550 nm, w=1000 nm",
254
+ width=3.0,
255
+ limits=(-1.5, 1.5 + sin_thickness),
256
+ num_modes=2,
257
+ target_neff=2.1,
258
+ path_profiles=((1.0, 0.0, (1, 5)),),
259
+ ),
260
+ "SiN_TE_1310_750": pf.PortSpec(
261
+ description="SiN Strip TE 1310 nm, w=750 nm",
262
+ width=3.0,
263
+ limits=(-1, 1 + sin_thickness),
264
+ num_modes=1,
265
+ target_neff=2.1,
266
+ path_profiles=((0.75, 0.0, (1, 5)),),
267
+ ),
268
+ "SiN_TM_1310_750": pf.PortSpec(
269
+ description="SiN Strip TM 1310 nm, w=750 nm",
270
+ width=3.0,
271
+ limits=(-1.5, 1.5 + sin_thickness),
272
+ num_modes=2,
273
+ target_neff=2.1,
274
+ path_profiles=((0.75, 0.0, (1, 5)),),
275
+ ),
276
+ "MM_SiN_TE_1550_3000": pf.PortSpec(
277
+ description="Multimode SiN Strip TE 1550 nm, w=3000 nm",
278
+ width=8.0,
279
+ limits=(-2.5, 2.5 + sin_thickness),
280
+ num_modes=6,
281
+ target_neff=2.1,
282
+ path_profiles=((3.0, 0.0, (1, 5)),),
283
+ ),
284
+ }
285
+
286
+ result = pf.Technology("SiEPIC EBeam", "0.4.11", layers, extrusion_specs, ports, sio2)
287
+ result.random_variables = [
288
+ pf.monte_carlo.RandomVariable("si_thickness", value=0.22, stdev=0.0223 / 6),
289
+ pf.monte_carlo.RandomVariable("bottom_oxide_thickness", value=3.017, stdev=0.006 / 6),
290
+ ]
291
+ return result
@@ -0,0 +1,103 @@
1
+ Metadata-Version: 2.1
2
+ Name: siepic-forge
3
+ Version: 1.0.0
4
+ Summary: SiEPIC 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.0.0rc1
11
+ Provides-Extra: test
12
+ Requires-Dist: pytest>=7.2; extra == "test"
13
+
14
+ # SiEPIC Forge
15
+
16
+ This python module implements the [SiEPIC EBeam
17
+ PDK](https://github.com/SiEPIC/SiEPIC_EBeam_PDK) PDK as components and
18
+ technology specification for
19
+ [PhotonForge](https://docs.flexcompute.com/projects/photonforge/)
20
+
21
+
22
+ ## Installation
23
+
24
+ ### Python interface
25
+
26
+ Installation via `pip`:
27
+
28
+ pip install siepic-forge
29
+
30
+
31
+ ### PhotonForge Web UI
32
+
33
+ In the Tidy3D web interface, go to your [*Account
34
+ Center*](https://tidy3d.simulation.cloud/account) and upload the token file
35
+ (.tok) under *PhotonForge Libraries* to enable this module.
36
+
37
+
38
+ ## Usage
39
+
40
+ The simplest way to use the this PDK in PhotonForge is to set its technology as
41
+ default:
42
+
43
+ import photonforge as pf
44
+ import siepic_forge as siepic
45
+
46
+ tech = siepic.ebeam()
47
+ pf.config.default_technology = tech
48
+
49
+
50
+ The `ebeam` function creates a parametric technology and accepts a number of
51
+ parameters to fine-tune the technology.
52
+
53
+ PDK components are available through the `component` function, which takes a
54
+ component name as first argument. The list of component names is available as a
55
+ set `component_names`:
56
+
57
+ print(siepic.component_names)
58
+
59
+ pdk_component = siepic.component("ebeam_y_1550")
60
+
61
+
62
+ More information can be obtained in the documentation for each function:
63
+
64
+ help(siepic.ebeam)
65
+
66
+ help(siepic.component)
67
+
68
+
69
+ ## Warnings
70
+
71
+ Please note that the 3D structures obtained by extrusion through this module's
72
+ technologies are a best approximation of the intended fabricated structures,
73
+ but the actual final dimensions may differ due to several fabrication-specific
74
+ effects. In particular, doping profiles are represented with hard-boundary,
75
+ homogeneous solids, but, in practice will present process-dependent variations
76
+ with smooth boundaries.
77
+
78
+
79
+ ## Third-Party Licenses
80
+
81
+ - [`SiEPIC_EBeam_PDK`](https://github.com/SiEPIC/SiEPIC_EBeam_PDK)
82
+
83
+ > This project is licensed under the terms of the MIT license.
84
+ >
85
+ > Copyright (c) 2016-2020, Lukas Chrostowski and contributors
86
+ >
87
+ > Permission is hereby granted, free of charge, to any person obtaining a
88
+ > copy of this software and associated documentation files (the "Software"),
89
+ > to deal in the Software without restriction, including without limitation
90
+ > the rights to use, copy, modify, merge, publish, distribute, sublicense,
91
+ > and/or sell copies of the Software, and to permit persons to whom the
92
+ > Software is furnished to do so, subject to the following conditions:
93
+ >
94
+ > The above copyright notice and this permission notice shall be included in
95
+ > all copies or substantial portions of the Software.
96
+ >
97
+ > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
98
+ > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
99
+ > FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
100
+ > AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
101
+ > LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
102
+ > FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
103
+ > DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,42 @@
1
+ CHANGELOG.md
2
+ LICENSE
3
+ MANIFEST.in
4
+ README.md
5
+ pyproject.toml
6
+ siepic_forge/__init__.py
7
+ siepic_forge/component.py
8
+ siepic_forge/technology.py
9
+ siepic_forge.egg-info/PKG-INFO
10
+ siepic_forge.egg-info/SOURCES.txt
11
+ siepic_forge.egg-info/dependency_links.txt
12
+ siepic_forge.egg-info/requires.txt
13
+ siepic_forge.egg-info/top_level.txt
14
+ siepic_forge/library/EBeam/GCs_BB.gds
15
+ siepic_forge/library/EBeam/ebeam_adiabatic_te1550.gds
16
+ siepic_forge/library/EBeam/ebeam_adiabatic_tm1550.gds
17
+ siepic_forge/library/EBeam/ebeam_bdc_te1550.gds
18
+ siepic_forge/library/EBeam/ebeam_crossing4.gds
19
+ siepic_forge/library/EBeam/ebeam_gc_te1550.gds
20
+ siepic_forge/library/EBeam/ebeam_gc_tm1550.gds
21
+ siepic_forge/library/EBeam/ebeam_splitter_swg_assist_te1310.gds
22
+ siepic_forge/library/EBeam/ebeam_splitter_swg_assist_te1550.gds
23
+ siepic_forge/library/EBeam/ebeam_terminator_te1310.gds
24
+ siepic_forge/library/EBeam/ebeam_terminator_te1550.gds
25
+ siepic_forge/library/EBeam/ebeam_terminator_tm1550.gds
26
+ siepic_forge/library/EBeam/ebeam_y_1550.gds
27
+ siepic_forge/library/EBeam/ebeam_y_adiabatic.gds
28
+ siepic_forge/library/EBeam/ebeam_y_adiabatic_500pin.gds
29
+ siepic_forge/library/EBeam/taper_si_simm_1310.gds
30
+ siepic_forge/library/EBeam/taper_si_simm_1550.gds
31
+ siepic_forge/library/EBeam_SiN/ANT_MMI_1x2_te1550_3dB_BB.gds
32
+ siepic_forge/library/EBeam_SiN/GC_SiN_TE_1550_8degOxide_BB.gds
33
+ siepic_forge/library/EBeam_SiN/ULaval.gds
34
+ siepic_forge/library/EBeam_SiN/ebeam_BondPad.gds
35
+ siepic_forge/library/EBeam_SiN/ebeam_DC_2-1_te895.gds
36
+ siepic_forge/library/EBeam_SiN/ebeam_DC_te895.gds
37
+ siepic_forge/library/EBeam_SiN/ebeam_Polarizer_TM_1550_UQAM.gds
38
+ siepic_forge/library/EBeam_SiN/ebeam_YBranch_895.gds
39
+ siepic_forge/library/EBeam_SiN/ebeam_gc_te895.gds
40
+ siepic_forge/library/EBeam_SiN/ebeam_terminator_SiN_1550.gds
41
+ siepic_forge/library/EBeam_SiN/ebeam_terminator_SiN_te895.gds
42
+ siepic_forge/library/EBeam_SiN/taper_SiN_750_3000.gds
@@ -0,0 +1,4 @@
1
+ photonforge~=1.0.0rc1
2
+
3
+ [test]
4
+ pytest>=7.2
@@ -0,0 +1 @@
1
+ siepic_forge