siepic-forge 1.0.0__py3-none-any.whl

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 (37) hide show
  1. siepic_forge/__init__.py +4 -0
  2. siepic_forge/component.py +416 -0
  3. siepic_forge/library/EBeam/GCs_BB.gds +0 -0
  4. siepic_forge/library/EBeam/ebeam_adiabatic_te1550.gds +0 -0
  5. siepic_forge/library/EBeam/ebeam_adiabatic_tm1550.gds +0 -0
  6. siepic_forge/library/EBeam/ebeam_bdc_te1550.gds +0 -0
  7. siepic_forge/library/EBeam/ebeam_crossing4.gds +0 -0
  8. siepic_forge/library/EBeam/ebeam_gc_te1550.gds +0 -0
  9. siepic_forge/library/EBeam/ebeam_gc_tm1550.gds +0 -0
  10. siepic_forge/library/EBeam/ebeam_splitter_swg_assist_te1310.gds +0 -0
  11. siepic_forge/library/EBeam/ebeam_splitter_swg_assist_te1550.gds +0 -0
  12. siepic_forge/library/EBeam/ebeam_terminator_te1310.gds +0 -0
  13. siepic_forge/library/EBeam/ebeam_terminator_te1550.gds +0 -0
  14. siepic_forge/library/EBeam/ebeam_terminator_tm1550.gds +0 -0
  15. siepic_forge/library/EBeam/ebeam_y_1550.gds +0 -0
  16. siepic_forge/library/EBeam/ebeam_y_adiabatic.gds +0 -0
  17. siepic_forge/library/EBeam/ebeam_y_adiabatic_500pin.gds +0 -0
  18. siepic_forge/library/EBeam/taper_si_simm_1310.gds +0 -0
  19. siepic_forge/library/EBeam/taper_si_simm_1550.gds +0 -0
  20. siepic_forge/library/EBeam_SiN/ANT_MMI_1x2_te1550_3dB_BB.gds +0 -0
  21. siepic_forge/library/EBeam_SiN/GC_SiN_TE_1550_8degOxide_BB.gds +0 -0
  22. siepic_forge/library/EBeam_SiN/ULaval.gds +0 -0
  23. siepic_forge/library/EBeam_SiN/ebeam_BondPad.gds +0 -0
  24. siepic_forge/library/EBeam_SiN/ebeam_DC_2-1_te895.gds +0 -0
  25. siepic_forge/library/EBeam_SiN/ebeam_DC_te895.gds +0 -0
  26. siepic_forge/library/EBeam_SiN/ebeam_Polarizer_TM_1550_UQAM.gds +0 -0
  27. siepic_forge/library/EBeam_SiN/ebeam_YBranch_895.gds +0 -0
  28. siepic_forge/library/EBeam_SiN/ebeam_gc_te895.gds +0 -0
  29. siepic_forge/library/EBeam_SiN/ebeam_terminator_SiN_1550.gds +0 -0
  30. siepic_forge/library/EBeam_SiN/ebeam_terminator_SiN_te895.gds +0 -0
  31. siepic_forge/library/EBeam_SiN/taper_SiN_750_3000.gds +0 -0
  32. siepic_forge/technology.py +291 -0
  33. siepic_forge-1.0.0.dist-info/LICENSE +19 -0
  34. siepic_forge-1.0.0.dist-info/METADATA +99 -0
  35. siepic_forge-1.0.0.dist-info/RECORD +37 -0
  36. siepic_forge-1.0.0.dist-info/WHEEL +5 -0
  37. siepic_forge-1.0.0.dist-info/top_level.txt +1 -0
@@ -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
Binary file
@@ -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,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,99 @@
1
+ Metadata-Version: 2.1
2
+ Name: siepic-forge
3
+ Version: 1.0.0
4
+ Author-email: "Flexcompute Inc." <info@flexcompute.com>
5
+ Description-Content-Type: text/markdown
6
+ License-File: LICENSE
7
+ Requires-Dist: photonforge ~=1.0.0rc1
8
+ Provides-Extra: test
9
+ Requires-Dist: pytest >=7.2 ; extra == 'test'
10
+
11
+ # SiEPIC Forge
12
+
13
+ This python module implements the [SiEPIC EBeam
14
+ PDK](https://github.com/SiEPIC/SiEPIC_EBeam_PDK) PDK as components and
15
+ technology specification for
16
+ [PhotonForge](https://docs.flexcompute.com/projects/photonforge/)
17
+
18
+
19
+ ## Installation
20
+
21
+ ### Python interface
22
+
23
+ Installation via `pip`:
24
+
25
+ pip install siepic-forge
26
+
27
+ ### PhotonForge Web UI
28
+
29
+ In the Tidy3D web interface, go to your [*Account
30
+ Center*](https://tidy3d.simulation.cloud/account) and upload the token file
31
+ (.tok) under *PhotonForge Libraries* to enable this module.
32
+
33
+
34
+ ## Usage
35
+
36
+ The simplest way to use the this PDK in PhotonForge is to set its technology as
37
+ default:
38
+
39
+ import photonforge as pf
40
+ import siepic_forge as siepic
41
+
42
+ tech = siepic.ebeam()
43
+ pf.config.default_technology = tech
44
+
45
+
46
+ The `ebeam` function creates a parametric technology and accepts a number of
47
+ parameters to fine-tune the technology.
48
+
49
+ PDK components are available through the `component` function, which takes a
50
+ component name as first argument. The list of component names is available as a
51
+ set `component_names`:
52
+
53
+ print(siepic.component_names)
54
+
55
+ pdk_component = siepic.component("ebeam_y_1550")
56
+
57
+
58
+ More information can be obtained in the documentation for each function:
59
+
60
+ help(siepic.ebeam)
61
+
62
+ help(siepic.component)
63
+
64
+
65
+ ## Warnings
66
+
67
+ Please note that the 3D structures obtained by extrusion through this module's
68
+ technologies are a best approximation of the intended fabricated structures,
69
+ but the actual final dimensions may differ due to several fabrication-specific
70
+ effects. In particular, doping profiles are represented with hard-boundary,
71
+ homogeneous solids, but, in practice will present process-dependent variations
72
+ with smooth boundaries.
73
+
74
+
75
+ ## Third-Party Licenses
76
+
77
+ - [`SiEPIC_EBeam_PDK`](https://github.com/SiEPIC/SiEPIC_EBeam_PDK)
78
+
79
+ > This project is licensed under the terms of the MIT license.
80
+ >
81
+ > Copyright (c) 2016-2020, Lukas Chrostowski and contributors
82
+ >
83
+ > Permission is hereby granted, free of charge, to any person obtaining a
84
+ > copy of this software and associated documentation files (the "Software"),
85
+ > to deal in the Software without restriction, including without limitation
86
+ > the rights to use, copy, modify, merge, publish, distribute, sublicense,
87
+ > and/or sell copies of the Software, and to permit persons to whom the
88
+ > Software is furnished to do so, subject to the following conditions:
89
+ >
90
+ > The above copyright notice and this permission notice shall be included in
91
+ > all copies or substantial portions of the Software.
92
+ >
93
+ > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
94
+ > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
95
+ > FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
96
+ > AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
97
+ > LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
98
+ > FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
99
+ > DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,37 @@
1
+ siepic_forge/__init__.py,sha256=pLMxZqzR5bbVHcUQpzSA6DZYpPLeNbYYz2jqOotLod4,103
2
+ siepic_forge/component.py,sha256=1mliBavvE53OvRMOI0su2J80acAByH3PPovt-i5ulbs,11926
3
+ siepic_forge/technology.py,sha256=1XfM4me4XRrgFimKXpTiRDtqUjSBiiRiOArAgNECTwA,11130
4
+ siepic_forge/library/EBeam/GCs_BB.gds,sha256=bM4YdbvNZJovRI2TB3yl5_LrOmJsWu2277tMu1UUrF8,29234
5
+ siepic_forge/library/EBeam/ebeam_adiabatic_te1550.gds,sha256=KXrOtatWZ4OuHg1DXRqiwvtafK8KWhvSpC2yTieWmL8,5072
6
+ siepic_forge/library/EBeam/ebeam_adiabatic_tm1550.gds,sha256=aZpiw-C0KaYhI5b4kb2BU0sBbI9p7o6BRszGWgkkgls,5072
7
+ siepic_forge/library/EBeam/ebeam_bdc_te1550.gds,sha256=t-c-HG_-xoKTT9BC0FC3xf3nr7ErPAyRyq-12lyPSuU,7674
8
+ siepic_forge/library/EBeam/ebeam_crossing4.gds,sha256=mF55TxZzLMBqIWyYHJbqDAdxmyaRG-mgFhDjENYb83M,1566
9
+ siepic_forge/library/EBeam/ebeam_gc_te1550.gds,sha256=J7X5g1iLgR9bCe_IsKQw10sAFEB7aCVu33Gj1EkvOrg,115348
10
+ siepic_forge/library/EBeam/ebeam_gc_tm1550.gds,sha256=J1PWiHFO5yQxq1h4SZLOtDTipuXQiggddaHg6qrPhxU,92308
11
+ siepic_forge/library/EBeam/ebeam_splitter_swg_assist_te1310.gds,sha256=mnCzNgGccWy_SjQ0k44eM6hB2jx-_owLT9s4_qTDoek,36446
12
+ siepic_forge/library/EBeam/ebeam_splitter_swg_assist_te1550.gds,sha256=S3AdXfgC6OI_nF_ajLexOK4HIv_gdPND1J1p4Ompvv8,36438
13
+ siepic_forge/library/EBeam/ebeam_terminator_te1310.gds,sha256=kMkyK1gfYthM1CVGXRnu2rmgYgBL70n8uRrWQiykx10,756
14
+ siepic_forge/library/EBeam/ebeam_terminator_te1550.gds,sha256=tjzqkKHBjK3QmNqNY2S26tCsn-zHO2-ah4RhtdNR-kQ,756
15
+ siepic_forge/library/EBeam/ebeam_terminator_tm1550.gds,sha256=Jw3c735tR8C-R3ka4jJXzkNs5R1HDrMK49eT55CdtRg,692
16
+ siepic_forge/library/EBeam/ebeam_y_1550.gds,sha256=pGbtG0Fv46yqM359J7Vh0JPA3DtV41tCprMQmBOdJLU,12006
17
+ siepic_forge/library/EBeam/ebeam_y_adiabatic.gds,sha256=hDDdtByXcTUra6YCO_wZHJKSDjjprYkTLyjh-mxvMZM,15170
18
+ siepic_forge/library/EBeam/ebeam_y_adiabatic_500pin.gds,sha256=yw8oymx5nDV2-3UPY4tSTRd0lf7t6GDAGG4Az9_VCDk,15176
19
+ siepic_forge/library/EBeam/taper_si_simm_1310.gds,sha256=DYXflob03z33_wNtx49Z52Uczn0-9Pf2KnHyy4kmm4c,638
20
+ siepic_forge/library/EBeam/taper_si_simm_1550.gds,sha256=9OA2ze0oY_IS336qYuwaYufkccTKI7aNL8oAIkUvHlw,650
21
+ siepic_forge/library/EBeam_SiN/ANT_MMI_1x2_te1550_3dB_BB.gds,sha256=PIMEx_KvWEmugrqgBZ8Wu2ihWh65uUi6TJ3NPL59CKk,41142
22
+ siepic_forge/library/EBeam_SiN/GC_SiN_TE_1550_8degOxide_BB.gds,sha256=1hKkk-QoC-JxmdNorUBeYaAZYAtyIjbALFUz2TNtI_A,5272
23
+ siepic_forge/library/EBeam_SiN/ULaval.gds,sha256=x4oF8esrQVN5_LtSiqbnqgM_dCqEhZp-9aoIS6_NxD4,3752
24
+ siepic_forge/library/EBeam_SiN/ebeam_BondPad.gds,sha256=B3gcdcetfAC3lj8wYyHZbs3DLf4BOGzGo6Hr5Nq_5CY,844
25
+ siepic_forge/library/EBeam_SiN/ebeam_DC_2-1_te895.gds,sha256=YJ2sygEo6sPGWTY55BA--Z9IDRJdMRJzm5kUvZ9p1rE,3776
26
+ siepic_forge/library/EBeam_SiN/ebeam_DC_te895.gds,sha256=ehKkD98Ez0mgrNyucYRJdqB_Q29ZB8jd0wPxVT02S-I,3852
27
+ siepic_forge/library/EBeam_SiN/ebeam_Polarizer_TM_1550_UQAM.gds,sha256=eymP8D1ddwuSAB0h6Pd1sIlJovaU9cYDYMIRlTwN_ss,14970
28
+ siepic_forge/library/EBeam_SiN/ebeam_YBranch_895.gds,sha256=q8tT6ozGYCOyA-Nh3qApty-ZCob4EAgld9qedDfcXt8,11994
29
+ siepic_forge/library/EBeam_SiN/ebeam_gc_te895.gds,sha256=xplHRpcrynwhCNy9WceSr2Y3K24JbKeYziPP383OcDY,48184
30
+ siepic_forge/library/EBeam_SiN/ebeam_terminator_SiN_1550.gds,sha256=dwngVtq0dIUSOQmA1HOWL7rj842ZjPXva-V_1vDFngQ,532
31
+ siepic_forge/library/EBeam_SiN/ebeam_terminator_SiN_te895.gds,sha256=GkoGhSOWmqbdj17xQGe1Jn_YHuHxk7hoJ_5T_ayE8go,710
32
+ siepic_forge/library/EBeam_SiN/taper_SiN_750_3000.gds,sha256=AroOmi_wcpgWhJlb0nU0nRCUXDwKCifEpQssvS7jlz4,480
33
+ siepic_forge-1.0.0.dist-info/LICENSE,sha256=_IcpRPkknVPr3mMG9iaMPIX6PrxrgRwohBs5mAGclzU,1064
34
+ siepic_forge-1.0.0.dist-info/METADATA,sha256=wYgp50rtWJfh6pcbhRYcTIbhD4X4Xyz1bsek9EgniwA,3322
35
+ siepic_forge-1.0.0.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
36
+ siepic_forge-1.0.0.dist-info/top_level.txt,sha256=LHN4bZ2Us-Hi-TnKa-7zcWISQj7vFkvttWv5PTdVJxo,13
37
+ siepic_forge-1.0.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (74.1.2)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ siepic_forge