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.
Files changed (35) hide show
  1. siepic_sin_forge-1.2.0/LICENSE +19 -0
  2. siepic_sin_forge-1.2.0/PKG-INFO +105 -0
  3. siepic_sin_forge-1.2.0/README.md +91 -0
  4. siepic_sin_forge-1.2.0/pyproject.toml +55 -0
  5. siepic_sin_forge-1.2.0/setup.cfg +4 -0
  6. siepic_sin_forge-1.2.0/siepic_sin_forge/__init__.py +34 -0
  7. siepic_sin_forge-1.2.0/siepic_sin_forge/_component_data.py +189 -0
  8. siepic_sin_forge-1.2.0/siepic_sin_forge/_layers.py +116 -0
  9. siepic_sin_forge-1.2.0/siepic_sin_forge/component.py +107 -0
  10. siepic_sin_forge-1.2.0/siepic_sin_forge/library/ANT_MMI_1x2_te1550_3dB_BB.gds +0 -0
  11. siepic_sin_forge-1.2.0/siepic_sin_forge/library/GC_SiN_TE_1310_8degOxide_BB.gds +0 -0
  12. siepic_sin_forge-1.2.0/siepic_sin_forge/library/GC_SiN_TE_1550_8degOxide_BB.gds +0 -0
  13. siepic_sin_forge-1.2.0/siepic_sin_forge/library/ULaval.gds +0 -0
  14. siepic_sin_forge-1.2.0/siepic_sin_forge/library/crossing_SiN_1550.gds +0 -0
  15. siepic_sin_forge-1.2.0/siepic_sin_forge/library/crossing_SiN_1550_extended.gds +0 -0
  16. siepic_sin_forge-1.2.0/siepic_sin_forge/library/crossing_horizontal.gds +0 -0
  17. siepic_sin_forge-1.2.0/siepic_sin_forge/library/crossing_manhattan.gds +0 -0
  18. siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_BondPad.gds +0 -0
  19. siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_DC_2-1_te895.gds +0 -0
  20. siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_DC_te895.gds +0 -0
  21. siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_Polarizer_TM_1550_UQAM.gds +0 -0
  22. siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_YBranch_895.gds +0 -0
  23. siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_gc_te895.gds +0 -0
  24. siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_terminator_SiN_1310.gds +0 -0
  25. siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_terminator_SiN_1550.gds +0 -0
  26. siepic_sin_forge-1.2.0/siepic_sin_forge/library/ebeam_terminator_SiN_te895.gds +0 -0
  27. siepic_sin_forge-1.2.0/siepic_sin_forge/library/port_SiN_800.gds +0 -0
  28. siepic_sin_forge-1.2.0/siepic_sin_forge/library/taper_SiN_750_3000.gds +0 -0
  29. siepic_sin_forge-1.2.0/siepic_sin_forge/library/taper_SiN_750_800.gds +0 -0
  30. siepic_sin_forge-1.2.0/siepic_sin_forge/technology.py +215 -0
  31. siepic_sin_forge-1.2.0/siepic_sin_forge.egg-info/PKG-INFO +105 -0
  32. siepic_sin_forge-1.2.0/siepic_sin_forge.egg-info/SOURCES.txt +33 -0
  33. siepic_sin_forge-1.2.0/siepic_sin_forge.egg-info/dependency_links.txt +1 -0
  34. siepic_sin_forge-1.2.0/siepic_sin_forge.egg-info/requires.txt +4 -0
  35. 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,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -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
@@ -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,4 @@
1
+ photonforge>=1.4.0
2
+
3
+ [test]
4
+ pytest>=7.2
@@ -0,0 +1 @@
1
+ siepic_sin_forge