pyedb 0.49.0__py3-none-any.whl → 0.50.1__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.
Potentially problematic release.
This version of pyedb might be problematic. Click here for more details.
- pyedb/__init__.py +1 -1
- pyedb/configuration/cfg_modeler.py +42 -11
- pyedb/configuration/cfg_ports_sources.py +9 -1
- pyedb/dotnet/database/cell/hierarchy/component.py +6 -6
- pyedb/dotnet/database/components.py +3 -3
- pyedb/dotnet/database/edb_data/padstacks_data.py +13 -0
- pyedb/dotnet/database/edb_data/primitives_data.py +3 -3
- pyedb/dotnet/database/edb_data/variables.py +3 -3
- pyedb/dotnet/database/materials.py +16 -16
- pyedb/dotnet/database/modeler.py +38 -4
- pyedb/dotnet/database/sim_setup_data/data/settings.py +28 -0
- pyedb/dotnet/database/stackup.py +1 -0
- pyedb/dotnet/database/utilities/hfss_simulation_setup.py +5 -6
- pyedb/dotnet/edb.py +22 -20
- pyedb/extensions/__init__.py +0 -0
- pyedb/extensions/via_design_backend.py +681 -0
- pyedb/grpc/database/components.py +537 -686
- pyedb/grpc/database/control_file.py +458 -149
- pyedb/grpc/database/definition/component_def.py +17 -14
- pyedb/grpc/database/definition/materials.py +60 -60
- pyedb/grpc/database/definition/package_def.py +8 -8
- pyedb/grpc/database/definition/padstack_def.py +31 -33
- pyedb/grpc/database/definitions.py +6 -4
- pyedb/grpc/database/geometry/arc_data.py +5 -5
- pyedb/grpc/database/geometry/point_3d_data.py +3 -3
- pyedb/grpc/database/geometry/polygon_data.py +5 -5
- pyedb/grpc/database/hfss.py +399 -397
- pyedb/grpc/database/hierarchy/component.py +60 -58
- pyedb/grpc/database/hierarchy/pin_pair_model.py +6 -6
- pyedb/grpc/database/hierarchy/pingroup.py +13 -11
- pyedb/grpc/database/hierarchy/s_parameter_model.py +1 -1
- pyedb/grpc/database/hierarchy/spice_model.py +1 -1
- pyedb/grpc/database/layers/layer.py +2 -2
- pyedb/grpc/database/layers/stackup_layer.py +144 -44
- pyedb/grpc/database/layout/layout.py +12 -12
- pyedb/grpc/database/layout/voltage_regulator.py +8 -8
- pyedb/grpc/database/layout_validation.py +5 -5
- pyedb/grpc/database/modeler.py +248 -245
- pyedb/grpc/database/net/differential_pair.py +4 -4
- pyedb/grpc/database/net/extended_net.py +7 -8
- pyedb/grpc/database/net/net.py +57 -46
- pyedb/grpc/database/nets.py +139 -122
- pyedb/grpc/database/padstacks.py +174 -190
- pyedb/grpc/database/ports/ports.py +23 -17
- pyedb/grpc/database/primitive/padstack_instance.py +45 -30
- pyedb/grpc/database/primitive/path.py +7 -7
- pyedb/grpc/database/primitive/polygon.py +9 -9
- pyedb/grpc/database/primitive/primitive.py +21 -21
- pyedb/grpc/database/primitive/rectangle.py +1 -1
- pyedb/grpc/database/simulation_setup/hfss_advanced_settings.py +1 -1
- pyedb/grpc/database/simulation_setup/hfss_general_settings.py +1 -1
- pyedb/grpc/database/simulation_setup/hfss_settings_options.py +1 -1
- pyedb/grpc/database/simulation_setup/hfss_simulation_settings.py +6 -6
- pyedb/grpc/database/simulation_setup/hfss_simulation_setup.py +2 -2
- pyedb/grpc/database/simulation_setup/raptor_x_simulation_settings.py +2 -2
- pyedb/grpc/database/simulation_setup/raptor_x_simulation_setup.py +1 -1
- pyedb/grpc/database/simulation_setup/siwave_simulation_setup.py +3 -3
- pyedb/grpc/database/siwave.py +166 -214
- pyedb/grpc/database/source_excitations.py +156 -0
- pyedb/grpc/database/stackup.py +415 -316
- pyedb/grpc/database/terminal/bundle_terminal.py +12 -12
- pyedb/grpc/database/terminal/edge_terminal.py +6 -5
- pyedb/grpc/database/terminal/padstack_instance_terminal.py +13 -13
- pyedb/grpc/database/terminal/pingroup_terminal.py +12 -12
- pyedb/grpc/database/terminal/point_terminal.py +6 -6
- pyedb/grpc/database/terminal/terminal.py +26 -26
- pyedb/grpc/database/utility/heat_sink.py +5 -5
- pyedb/grpc/database/utility/hfss_extent_info.py +21 -21
- pyedb/grpc/database/utility/layout_statistics.py +13 -13
- pyedb/grpc/database/utility/rlc.py +3 -3
- pyedb/grpc/database/utility/sources.py +1 -1
- pyedb/grpc/database/utility/sweep_data_distribution.py +1 -1
- pyedb/grpc/edb.py +524 -764
- {pyedb-0.49.0.dist-info → pyedb-0.50.1.dist-info}/METADATA +1 -1
- {pyedb-0.49.0.dist-info → pyedb-0.50.1.dist-info}/RECORD +77 -77
- pyedb/extensions/pre_layout_design_toolkit/via_design.py +0 -1151
- pyedb/grpc/database/utility/simulation_configuration.py +0 -3305
- {pyedb-0.49.0.dist-info → pyedb-0.50.1.dist-info}/LICENSE +0 -0
- {pyedb-0.49.0.dist-info → pyedb-0.50.1.dist-info}/WHEEL +0 -0
|
@@ -48,7 +48,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
@property
|
|
51
|
-
def type(self):
|
|
51
|
+
def type(self) -> str:
|
|
52
52
|
"""Layer type.
|
|
53
53
|
|
|
54
54
|
Returns
|
|
@@ -139,7 +139,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
139
139
|
)
|
|
140
140
|
|
|
141
141
|
@property
|
|
142
|
-
def lower_elevation(self):
|
|
142
|
+
def lower_elevation(self) -> float:
|
|
143
143
|
"""Lower elevation.
|
|
144
144
|
|
|
145
145
|
Returns
|
|
@@ -155,7 +155,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
155
155
|
super(StackupLayer, self.__class__).lower_elevation.__set__(self, GrpcValue(value))
|
|
156
156
|
|
|
157
157
|
@property
|
|
158
|
-
def fill_material(self):
|
|
158
|
+
def fill_material(self) -> str:
|
|
159
159
|
"""The layer's fill material.
|
|
160
160
|
|
|
161
161
|
Returns
|
|
@@ -172,7 +172,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
172
172
|
self.set_fill_material(value)
|
|
173
173
|
|
|
174
174
|
@property
|
|
175
|
-
def upper_elevation(self):
|
|
175
|
+
def upper_elevation(self) -> float:
|
|
176
176
|
"""Upper elevation.
|
|
177
177
|
|
|
178
178
|
Returns
|
|
@@ -183,7 +183,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
183
183
|
return round(super().upper_elevation.value, 9)
|
|
184
184
|
|
|
185
185
|
@property
|
|
186
|
-
def is_negative(self):
|
|
186
|
+
def is_negative(self) -> bool:
|
|
187
187
|
"""Determine whether this layer is a negative layer.
|
|
188
188
|
|
|
189
189
|
Returns
|
|
@@ -205,7 +205,19 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
205
205
|
self.negative = value
|
|
206
206
|
|
|
207
207
|
@property
|
|
208
|
-
def
|
|
208
|
+
def is_stackup_layer(self) -> bool:
|
|
209
|
+
"""Testing if layer is stackup layer.
|
|
210
|
+
|
|
211
|
+
Returns
|
|
212
|
+
-------
|
|
213
|
+
`True` if layer type is "signal" or "dielectric".
|
|
214
|
+
"""
|
|
215
|
+
if self.type in ["signal", "dielectric", "via", "wirebond"]:
|
|
216
|
+
return True
|
|
217
|
+
return False
|
|
218
|
+
|
|
219
|
+
@property
|
|
220
|
+
def material(self) -> str:
|
|
209
221
|
"""Material.
|
|
210
222
|
|
|
211
223
|
Returns
|
|
@@ -220,7 +232,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
220
232
|
self.set_material(name)
|
|
221
233
|
|
|
222
234
|
@property
|
|
223
|
-
def conductivity(self):
|
|
235
|
+
def conductivity(self) -> float:
|
|
224
236
|
"""Material conductivity.
|
|
225
237
|
|
|
226
238
|
Returns
|
|
@@ -229,11 +241,12 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
229
241
|
Material conductivity value.
|
|
230
242
|
"""
|
|
231
243
|
if self.material in self._pedb.materials.materials:
|
|
232
|
-
|
|
244
|
+
condcutivity = self._pedb.materials[self.material].conductivity
|
|
245
|
+
return condcutivity if condcutivity else 0.0
|
|
233
246
|
return None
|
|
234
247
|
|
|
235
248
|
@property
|
|
236
|
-
def permittivity(self):
|
|
249
|
+
def permittivity(self) -> float:
|
|
237
250
|
"""Material permittivity.
|
|
238
251
|
|
|
239
252
|
Returns
|
|
@@ -242,11 +255,12 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
242
255
|
Material permittivity value.
|
|
243
256
|
"""
|
|
244
257
|
if self.material in self._pedb.materials.materials:
|
|
245
|
-
|
|
258
|
+
permittivity = self._pedb.materials[self.material].permittivity
|
|
259
|
+
return permittivity if permittivity else 0.0
|
|
246
260
|
return None
|
|
247
261
|
|
|
248
262
|
@property
|
|
249
|
-
def loss_tangent(self):
|
|
263
|
+
def loss_tangent(self) -> float:
|
|
250
264
|
"""Material loss_tangent.
|
|
251
265
|
|
|
252
266
|
Returns
|
|
@@ -255,11 +269,12 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
255
269
|
Material loss tangent value.
|
|
256
270
|
"""
|
|
257
271
|
if self.material in self._pedb.materials.materials:
|
|
258
|
-
|
|
272
|
+
loss_tangent = self._pedb.materials[self.material].loss_tangent
|
|
273
|
+
return loss_tangent if loss_tangent else 0.0
|
|
259
274
|
return None
|
|
260
275
|
|
|
261
276
|
@property
|
|
262
|
-
def dielectric_fill(self):
|
|
277
|
+
def dielectric_fill(self) -> str:
|
|
263
278
|
"""Material name of the layer dielectric fill.
|
|
264
279
|
|
|
265
280
|
Returns
|
|
@@ -270,7 +285,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
270
285
|
if self.type == "signal":
|
|
271
286
|
return self.get_fill_material()
|
|
272
287
|
else:
|
|
273
|
-
return
|
|
288
|
+
return None
|
|
274
289
|
|
|
275
290
|
@dielectric_fill.setter
|
|
276
291
|
def dielectric_fill(self, name):
|
|
@@ -280,7 +295,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
280
295
|
pass
|
|
281
296
|
|
|
282
297
|
@property
|
|
283
|
-
def thickness(self):
|
|
298
|
+
def thickness(self) -> float:
|
|
284
299
|
"""Layer thickness.
|
|
285
300
|
|
|
286
301
|
Returns
|
|
@@ -295,7 +310,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
295
310
|
super(StackupLayer, self.__class__).thickness.__set__(self, GrpcValue(value))
|
|
296
311
|
|
|
297
312
|
@property
|
|
298
|
-
def etch_factor(self):
|
|
313
|
+
def etch_factor(self) -> float:
|
|
299
314
|
"""Layer etching factor.
|
|
300
315
|
|
|
301
316
|
Returns
|
|
@@ -314,7 +329,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
314
329
|
super(StackupLayer, self.__class__).etch_factor.__set__(self, GrpcValue(value))
|
|
315
330
|
|
|
316
331
|
@property
|
|
317
|
-
def top_hallhuray_nodule_radius(self):
|
|
332
|
+
def top_hallhuray_nodule_radius(self) -> float:
|
|
318
333
|
"""Huray model nodule radius on layer top.
|
|
319
334
|
|
|
320
335
|
Returns
|
|
@@ -327,9 +342,9 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
327
342
|
if len(top_roughness_model) == 2:
|
|
328
343
|
return top_roughness_model[0].value
|
|
329
344
|
else:
|
|
330
|
-
return
|
|
345
|
+
return 0.0
|
|
331
346
|
except:
|
|
332
|
-
return
|
|
347
|
+
return 0.0
|
|
333
348
|
|
|
334
349
|
@top_hallhuray_nodule_radius.setter
|
|
335
350
|
def top_hallhuray_nodule_radius(self, value):
|
|
@@ -342,7 +357,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
342
357
|
pass
|
|
343
358
|
|
|
344
359
|
@property
|
|
345
|
-
def top_hallhuray_surface_ratio(self):
|
|
360
|
+
def top_hallhuray_surface_ratio(self) -> float:
|
|
346
361
|
"""Huray model surface ratio on layer top.
|
|
347
362
|
|
|
348
363
|
Returns
|
|
@@ -355,9 +370,9 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
355
370
|
if len(top_roughness_model) == 2:
|
|
356
371
|
return top_roughness_model[1].value
|
|
357
372
|
else:
|
|
358
|
-
return
|
|
373
|
+
return 0.0
|
|
359
374
|
except:
|
|
360
|
-
return
|
|
375
|
+
return 0.0
|
|
361
376
|
|
|
362
377
|
@top_hallhuray_surface_ratio.setter
|
|
363
378
|
def top_hallhuray_surface_ratio(self, value):
|
|
@@ -370,7 +385,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
370
385
|
pass
|
|
371
386
|
|
|
372
387
|
@property
|
|
373
|
-
def bottom_hallhuray_nodule_radius(self):
|
|
388
|
+
def bottom_hallhuray_nodule_radius(self) -> float:
|
|
374
389
|
"""Huray model nodule radius on layer bottom.
|
|
375
390
|
|
|
376
391
|
Returns
|
|
@@ -383,9 +398,9 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
383
398
|
if len(bottom_roughness_model) == 2:
|
|
384
399
|
return round(bottom_roughness_model[0].value, 9)
|
|
385
400
|
else:
|
|
386
|
-
return
|
|
401
|
+
return 0.0
|
|
387
402
|
except:
|
|
388
|
-
return
|
|
403
|
+
return 0.0
|
|
389
404
|
|
|
390
405
|
@bottom_hallhuray_nodule_radius.setter
|
|
391
406
|
def bottom_hallhuray_nodule_radius(self, value):
|
|
@@ -398,7 +413,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
398
413
|
pass
|
|
399
414
|
|
|
400
415
|
@property
|
|
401
|
-
def bottom_hallhuray_surface_ratio(self):
|
|
416
|
+
def bottom_hallhuray_surface_ratio(self) -> float:
|
|
402
417
|
"""Huray model surface ratio on layer bottom.
|
|
403
418
|
|
|
404
419
|
Returns
|
|
@@ -411,9 +426,9 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
411
426
|
if len(bottom_roughness_model) == 2:
|
|
412
427
|
return bottom_roughness_model[1].value
|
|
413
428
|
else:
|
|
414
|
-
return
|
|
429
|
+
return 0.0
|
|
415
430
|
except:
|
|
416
|
-
return
|
|
431
|
+
return 0.0
|
|
417
432
|
|
|
418
433
|
@bottom_hallhuray_surface_ratio.setter
|
|
419
434
|
def bottom_hallhuray_surface_ratio(self, value):
|
|
@@ -426,7 +441,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
426
441
|
pass
|
|
427
442
|
|
|
428
443
|
@property
|
|
429
|
-
def side_hallhuray_nodule_radius(self):
|
|
444
|
+
def side_hallhuray_nodule_radius(self) -> float:
|
|
430
445
|
"""Huray model nodule radius on layer sides.
|
|
431
446
|
|
|
432
447
|
Returns
|
|
@@ -439,9 +454,9 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
439
454
|
side_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.SIDE)
|
|
440
455
|
if len(side_roughness_model) == 2:
|
|
441
456
|
return round(side_roughness_model[0].value, 9)
|
|
442
|
-
return
|
|
457
|
+
return 0.0
|
|
443
458
|
except:
|
|
444
|
-
return
|
|
459
|
+
return 0.0
|
|
445
460
|
|
|
446
461
|
@side_hallhuray_nodule_radius.setter
|
|
447
462
|
def side_hallhuray_nodule_radius(self, value):
|
|
@@ -454,7 +469,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
454
469
|
pass
|
|
455
470
|
|
|
456
471
|
@property
|
|
457
|
-
def side_hallhuray_surface_ratio(self):
|
|
472
|
+
def side_hallhuray_surface_ratio(self) -> float:
|
|
458
473
|
"""Huray model surface ratio on layer sides.
|
|
459
474
|
|
|
460
475
|
Returns
|
|
@@ -466,9 +481,9 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
466
481
|
side_roughness_model = self.get_roughness_model(GrpcRoughnessRegion.SIDE)
|
|
467
482
|
if len(side_roughness_model) == 2:
|
|
468
483
|
return side_roughness_model[1].value
|
|
469
|
-
return
|
|
484
|
+
return 0.0
|
|
470
485
|
except:
|
|
471
|
-
return
|
|
486
|
+
return 0.0
|
|
472
487
|
|
|
473
488
|
@side_hallhuray_surface_ratio.setter
|
|
474
489
|
def side_hallhuray_surface_ratio(self, value):
|
|
@@ -481,7 +496,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
481
496
|
pass
|
|
482
497
|
|
|
483
498
|
@property
|
|
484
|
-
def top_groisse_roughness(self):
|
|
499
|
+
def top_groisse_roughness(self) -> float:
|
|
485
500
|
"""Groisse model on layer top.
|
|
486
501
|
|
|
487
502
|
Returns
|
|
@@ -494,9 +509,9 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
494
509
|
if isinstance(top_roughness_model, GrpcValue):
|
|
495
510
|
return top_roughness_model.value
|
|
496
511
|
else:
|
|
497
|
-
return
|
|
512
|
+
return 0.0
|
|
498
513
|
except:
|
|
499
|
-
return
|
|
514
|
+
return 0.0
|
|
500
515
|
|
|
501
516
|
@top_groisse_roughness.setter
|
|
502
517
|
def top_groisse_roughness(self, value):
|
|
@@ -509,7 +524,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
509
524
|
pass
|
|
510
525
|
|
|
511
526
|
@property
|
|
512
|
-
def bottom_groisse_roughness(self):
|
|
527
|
+
def bottom_groisse_roughness(self) -> float:
|
|
513
528
|
"""Groisse model on layer bottom.
|
|
514
529
|
|
|
515
530
|
Returns
|
|
@@ -522,9 +537,9 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
522
537
|
if isinstance(bottom_roughness_model, GrpcValue):
|
|
523
538
|
return bottom_roughness_model.value
|
|
524
539
|
else:
|
|
525
|
-
return
|
|
540
|
+
return 0.0
|
|
526
541
|
except:
|
|
527
|
-
return
|
|
542
|
+
return 0.0
|
|
528
543
|
|
|
529
544
|
@bottom_groisse_roughness.setter
|
|
530
545
|
def bottom_groisse_roughness(self, value):
|
|
@@ -537,7 +552,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
537
552
|
pass
|
|
538
553
|
|
|
539
554
|
@property
|
|
540
|
-
def side_groisse_roughness(self):
|
|
555
|
+
def side_groisse_roughness(self) -> float:
|
|
541
556
|
"""Groisse model on layer bottom.
|
|
542
557
|
|
|
543
558
|
Returns
|
|
@@ -550,9 +565,9 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
550
565
|
if isinstance(side_roughness_model, GrpcValue):
|
|
551
566
|
return side_roughness_model.value
|
|
552
567
|
else:
|
|
553
|
-
return
|
|
568
|
+
return 0.0
|
|
554
569
|
except:
|
|
555
|
-
return
|
|
570
|
+
return 0.0
|
|
556
571
|
|
|
557
572
|
@side_groisse_roughness.setter
|
|
558
573
|
def side_groisse_roughness(self, value):
|
|
@@ -571,7 +586,7 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
571
586
|
huray_surface_ratio="2.9",
|
|
572
587
|
groisse_roughness="1um",
|
|
573
588
|
apply_on_surface="all",
|
|
574
|
-
):
|
|
589
|
+
) -> bool:
|
|
575
590
|
"""Assign roughness model on this layer.
|
|
576
591
|
|
|
577
592
|
Parameters
|
|
@@ -588,6 +603,9 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
588
603
|
Where to assign roughness model. The default is ``"all"``. Options are ``"top"``, ``"bottom"``,
|
|
589
604
|
``"side"``.
|
|
590
605
|
|
|
606
|
+
Returns
|
|
607
|
+
-------
|
|
608
|
+
bool
|
|
591
609
|
"""
|
|
592
610
|
regions = []
|
|
593
611
|
if apply_on_surface == "all":
|
|
@@ -605,6 +623,13 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
605
623
|
else:
|
|
606
624
|
model = GrpcValue(groisse_roughness)
|
|
607
625
|
self.set_roughness_model(model, r)
|
|
626
|
+
if [
|
|
627
|
+
self.get_roughness_model(GrpcRoughnessRegion.TOP),
|
|
628
|
+
self.get_roughness_model(GrpcRoughnessRegion.BOTTOM),
|
|
629
|
+
self.get_roughness_model(GrpcRoughnessRegion.SIDE),
|
|
630
|
+
]:
|
|
631
|
+
return True
|
|
632
|
+
return False
|
|
608
633
|
|
|
609
634
|
@property
|
|
610
635
|
def properties(self):
|
|
@@ -649,3 +674,78 @@ class StackupLayer(GrpcStackupLayer):
|
|
|
649
674
|
data["roughness"] = roughness
|
|
650
675
|
data["etching"] = {"enabled": self.etch_factor_enabled, "factor": self.etch_factor}
|
|
651
676
|
return data
|
|
677
|
+
|
|
678
|
+
def _json_format(self):
|
|
679
|
+
dict_out = {
|
|
680
|
+
"color": self.color,
|
|
681
|
+
"dielectric_fill": self.dielectric_fill,
|
|
682
|
+
"etch_factor": self.etch_factor,
|
|
683
|
+
"material": self.material,
|
|
684
|
+
"loss_tangent": self.loss_tangent,
|
|
685
|
+
"permittivity": self.permittivity,
|
|
686
|
+
"conductivity": self.conductivity,
|
|
687
|
+
"zones": self.zones,
|
|
688
|
+
"transparency": self.transparency,
|
|
689
|
+
"name": self.name,
|
|
690
|
+
"roughness_enabled": self.roughness_enabled,
|
|
691
|
+
"thickness": self.thickness,
|
|
692
|
+
"lower_elevation": self.lower_elevation,
|
|
693
|
+
"upper_elevation": self.upper_elevation,
|
|
694
|
+
"type": self.type,
|
|
695
|
+
"top_hallhuray_nodule_radius": self.top_hallhuray_nodule_radius,
|
|
696
|
+
"top_hallhuray_surface_ratio": self.top_hallhuray_surface_ratio,
|
|
697
|
+
"side_hallhuray_nodule_radius": self.side_hallhuray_nodule_radius,
|
|
698
|
+
"side_hallhuray_surface_ratio": self.side_hallhuray_surface_ratio,
|
|
699
|
+
"bottom_hallhuray_nodule_radius": self.bottom_hallhuray_nodule_radius,
|
|
700
|
+
"bottom_hallhuray_surface_ratio": self.bottom_hallhuray_surface_ratio,
|
|
701
|
+
}
|
|
702
|
+
return dict_out
|
|
703
|
+
|
|
704
|
+
def _load_layer(self, layer):
|
|
705
|
+
if layer:
|
|
706
|
+
self.color = layer["color"]
|
|
707
|
+
self.type = layer["type"]
|
|
708
|
+
if isinstance(layer["material"], str):
|
|
709
|
+
self.material = layer["material"]
|
|
710
|
+
else:
|
|
711
|
+
material_data = layer["material"]
|
|
712
|
+
if material_data is not None:
|
|
713
|
+
material_name = layer["material"]["name"]
|
|
714
|
+
self._pedb.materials.add_material(material_name, **material_data)
|
|
715
|
+
self.material = material_name
|
|
716
|
+
if layer["dielectric_fill"]:
|
|
717
|
+
if isinstance(layer["dielectric_fill"], str):
|
|
718
|
+
self.dielectric_fill = layer["dielectric_fill"]
|
|
719
|
+
else:
|
|
720
|
+
dielectric_data = layer["dielectric_fill"]
|
|
721
|
+
if dielectric_data is not None:
|
|
722
|
+
self._pedb.materials.add_material(**dielectric_data)
|
|
723
|
+
self.dielectric_fill = layer["dielectric_fill"]["name"]
|
|
724
|
+
self.thickness = layer["thickness"]
|
|
725
|
+
self.etch_factor = layer["etch_factor"]
|
|
726
|
+
self.roughness_enabled = layer["roughness_enabled"]
|
|
727
|
+
if self.roughness_enabled:
|
|
728
|
+
self.top_hallhuray_nodule_radius = layer["top_hallhuray_nodule_radius"]
|
|
729
|
+
self.top_hallhuray_surface_ratio = layer["top_hallhuray_surface_ratio"]
|
|
730
|
+
self.assign_roughness_model(
|
|
731
|
+
"huray",
|
|
732
|
+
layer["top_hallhuray_nodule_radius"],
|
|
733
|
+
layer["top_hallhuray_surface_ratio"],
|
|
734
|
+
apply_on_surface="top",
|
|
735
|
+
)
|
|
736
|
+
self.bottom_hallhuray_nodule_radius = layer["bottom_hallhuray_nodule_radius"]
|
|
737
|
+
self.bottom_hallhuray_surface_ratio = layer["bottom_hallhuray_surface_ratio"]
|
|
738
|
+
self.assign_roughness_model(
|
|
739
|
+
"huray",
|
|
740
|
+
layer["bottom_hallhuray_nodule_radius"],
|
|
741
|
+
layer["bottom_hallhuray_surface_ratio"],
|
|
742
|
+
apply_on_surface="bottom",
|
|
743
|
+
)
|
|
744
|
+
self.side_hallhuray_nodule_radius = layer["side_hallhuray_nodule_radius"]
|
|
745
|
+
self.side_hallhuray_surface_ratio = layer["side_hallhuray_surface_ratio"]
|
|
746
|
+
self.assign_roughness_model(
|
|
747
|
+
"huray",
|
|
748
|
+
layer["side_hallhuray_nodule_radius"],
|
|
749
|
+
layer["side_hallhuray_surface_ratio"],
|
|
750
|
+
apply_on_surface="side",
|
|
751
|
+
)
|
|
@@ -72,7 +72,7 @@ class Layout(GrpcLayout):
|
|
|
72
72
|
return self._pedb._active_cell
|
|
73
73
|
|
|
74
74
|
@property
|
|
75
|
-
def primitives(self):
|
|
75
|
+
def primitives(self) -> list[any]:
|
|
76
76
|
prims = []
|
|
77
77
|
for prim in super().primitives:
|
|
78
78
|
if isinstance(prim, ansys.edb.core.primitive.path.Path):
|
|
@@ -90,7 +90,7 @@ class Layout(GrpcLayout):
|
|
|
90
90
|
return prims
|
|
91
91
|
|
|
92
92
|
@property
|
|
93
|
-
def terminals(self):
|
|
93
|
+
def terminals(self) -> list[any]:
|
|
94
94
|
"""Get terminals belonging to active layout.
|
|
95
95
|
|
|
96
96
|
Returns
|
|
@@ -113,7 +113,7 @@ class Layout(GrpcLayout):
|
|
|
113
113
|
return temp
|
|
114
114
|
|
|
115
115
|
@property
|
|
116
|
-
def nets(self):
|
|
116
|
+
def nets(self) -> list[Net]:
|
|
117
117
|
"""Nets.
|
|
118
118
|
|
|
119
119
|
Returns
|
|
@@ -124,7 +124,7 @@ class Layout(GrpcLayout):
|
|
|
124
124
|
return [Net(self._pedb, net) for net in super().nets]
|
|
125
125
|
|
|
126
126
|
@property
|
|
127
|
-
def bondwires(self):
|
|
127
|
+
def bondwires(self) -> list[Bondwire]:
|
|
128
128
|
"""Bondwires.
|
|
129
129
|
|
|
130
130
|
Returns
|
|
@@ -135,7 +135,7 @@ class Layout(GrpcLayout):
|
|
|
135
135
|
return [i for i in self.primitives if i.primitive_type == "bondwire"]
|
|
136
136
|
|
|
137
137
|
@property
|
|
138
|
-
def groups(self):
|
|
138
|
+
def groups(self) -> list[Component]:
|
|
139
139
|
"""Groups
|
|
140
140
|
|
|
141
141
|
Returns
|
|
@@ -147,7 +147,7 @@ class Layout(GrpcLayout):
|
|
|
147
147
|
return [Component(self._pedb, g) for g in self._pedb.active_cell.layout.groups]
|
|
148
148
|
|
|
149
149
|
@property
|
|
150
|
-
def pin_groups(self):
|
|
150
|
+
def pin_groups(self) -> list[PinGroup]:
|
|
151
151
|
"""Pin groups.
|
|
152
152
|
|
|
153
153
|
Returns
|
|
@@ -159,7 +159,7 @@ class Layout(GrpcLayout):
|
|
|
159
159
|
return [PinGroup(self._pedb, i) for i in self._pedb.active_cell.layout.pin_groups]
|
|
160
160
|
|
|
161
161
|
@property
|
|
162
|
-
def net_classes(self):
|
|
162
|
+
def net_classes(self) -> list[NetClass]:
|
|
163
163
|
"""Net classes.
|
|
164
164
|
|
|
165
165
|
Returns
|
|
@@ -171,7 +171,7 @@ class Layout(GrpcLayout):
|
|
|
171
171
|
return [NetClass(self._pedb, i) for i in self._pedb.active_cell.layout.net_classes]
|
|
172
172
|
|
|
173
173
|
@property
|
|
174
|
-
def extended_nets(self):
|
|
174
|
+
def extended_nets(self) -> list[ExtendedNet]:
|
|
175
175
|
"""Extended nets.
|
|
176
176
|
|
|
177
177
|
Returns
|
|
@@ -183,7 +183,7 @@ class Layout(GrpcLayout):
|
|
|
183
183
|
return [ExtendedNet(self._pedb, i) for i in self._pedb.active_cell.layout.extended_nets]
|
|
184
184
|
|
|
185
185
|
@property
|
|
186
|
-
def differential_pairs(self):
|
|
186
|
+
def differential_pairs(self) -> list[DifferentialPair]:
|
|
187
187
|
"""Differential pairs.
|
|
188
188
|
|
|
189
189
|
Returns
|
|
@@ -195,13 +195,13 @@ class Layout(GrpcLayout):
|
|
|
195
195
|
return [DifferentialPair(self._pedb, i) for i in self._pedb.active_cell.layout.differential_pairs]
|
|
196
196
|
|
|
197
197
|
@property
|
|
198
|
-
def padstack_instances(self):
|
|
198
|
+
def padstack_instances(self) -> list[PadstackInstance]:
|
|
199
199
|
"""Get all padstack instances in a list."""
|
|
200
200
|
return [PadstackInstance(self._pedb, i) for i in self._pedb.active_cell.layout.padstack_instances]
|
|
201
201
|
|
|
202
202
|
#
|
|
203
203
|
@property
|
|
204
|
-
def voltage_regulators(self):
|
|
204
|
+
def voltage_regulators(self) -> list[VoltageRegulator]:
|
|
205
205
|
"""Voltage regulators.
|
|
206
206
|
|
|
207
207
|
List[:class:`VoltageRegulator <pyedb.grpc.database.layout.voltage_regulator.VoltageRegulator>`.
|
|
@@ -212,7 +212,7 @@ class Layout(GrpcLayout):
|
|
|
212
212
|
|
|
213
213
|
def find_primitive(
|
|
214
214
|
self, layer_name: Union[str, list] = None, name: Union[str, list] = None, net_name: Union[str, list] = None
|
|
215
|
-
) -> list:
|
|
215
|
+
) -> list[any]:
|
|
216
216
|
"""Find a primitive objects by layer name.
|
|
217
217
|
Parameters
|
|
218
218
|
----------
|
|
@@ -25,7 +25,7 @@ from ansys.edb.core.layout.voltage_regulator import (
|
|
|
25
25
|
)
|
|
26
26
|
from ansys.edb.core.utility.value import Value as GrpcValue
|
|
27
27
|
|
|
28
|
-
from pyedb.
|
|
28
|
+
from pyedb.grpc.database.primitive.padstack_instance import PadstackInstance
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
class VoltageRegulator(GrpcVoltageRegulator):
|
|
@@ -62,7 +62,7 @@ class VoltageRegulator(GrpcVoltageRegulator):
|
|
|
62
62
|
self.group = self._pedb.components.instances[value]
|
|
63
63
|
|
|
64
64
|
@property
|
|
65
|
-
def load_regulator_current(self):
|
|
65
|
+
def load_regulator_current(self) -> float:
|
|
66
66
|
"""Load regulator current value
|
|
67
67
|
|
|
68
68
|
Returns
|
|
@@ -77,7 +77,7 @@ class VoltageRegulator(GrpcVoltageRegulator):
|
|
|
77
77
|
self.load_regulation_percent = GrpcValue(value)
|
|
78
78
|
|
|
79
79
|
@property
|
|
80
|
-
def load_regulation_percent(self):
|
|
80
|
+
def load_regulation_percent(self) -> float:
|
|
81
81
|
"""Retrieve load regulation percent value.
|
|
82
82
|
|
|
83
83
|
Returns
|
|
@@ -92,7 +92,7 @@ class VoltageRegulator(GrpcVoltageRegulator):
|
|
|
92
92
|
self.load_regulation_percent = GrpcValue(value)
|
|
93
93
|
|
|
94
94
|
@property
|
|
95
|
-
def negative_remote_sense_pin(self):
|
|
95
|
+
def negative_remote_sense_pin(self) -> PadstackInstance:
|
|
96
96
|
"""Retrieve negative remote sense pin.
|
|
97
97
|
|
|
98
98
|
Returns
|
|
@@ -107,11 +107,11 @@ class VoltageRegulator(GrpcVoltageRegulator):
|
|
|
107
107
|
if isinstance(value, int):
|
|
108
108
|
if value in self._pedb.padsatcks.instances:
|
|
109
109
|
self.neg_remote_sense_pin = self._pedb.padsatcks.instances[value]
|
|
110
|
-
elif isinstance(value,
|
|
110
|
+
elif isinstance(value, PadstackInstance):
|
|
111
111
|
self.neg_remote_sense_pin = value
|
|
112
112
|
|
|
113
113
|
@property
|
|
114
|
-
def positive_remote_sense_pin(self):
|
|
114
|
+
def positive_remote_sense_pin(self) -> PadstackInstance:
|
|
115
115
|
"""Retrieve positive remote sense pin.
|
|
116
116
|
|
|
117
117
|
Returns
|
|
@@ -128,13 +128,13 @@ class VoltageRegulator(GrpcVoltageRegulator):
|
|
|
128
128
|
self.positive_remote_sense_pin = self._pedb.padsatcks.instances[value]
|
|
129
129
|
if not self.component:
|
|
130
130
|
self.component = self._pedb.padsatcks.instances[value].component.name
|
|
131
|
-
elif isinstance(value,
|
|
131
|
+
elif isinstance(value, PadstackInstance):
|
|
132
132
|
self.positive_remote_sense_pin = value
|
|
133
133
|
if not self.component:
|
|
134
134
|
self.component = value.component.name
|
|
135
135
|
|
|
136
136
|
@property
|
|
137
|
-
def voltage(self):
|
|
137
|
+
def voltage(self) -> float:
|
|
138
138
|
"""Retrieve voltage value.
|
|
139
139
|
|
|
140
140
|
Returns
|
|
@@ -37,7 +37,7 @@ class LayoutValidation:
|
|
|
37
37
|
self._pedb = pedb
|
|
38
38
|
self._layout_instance = self._pedb.layout_instance
|
|
39
39
|
|
|
40
|
-
def dc_shorts(self, net_list=None, fix=False):
|
|
40
|
+
def dc_shorts(self, net_list=None, fix=False) -> list[list[str, str]]:
|
|
41
41
|
"""Find DC shorts on layout.
|
|
42
42
|
|
|
43
43
|
Parameters
|
|
@@ -130,7 +130,7 @@ class LayoutValidation:
|
|
|
130
130
|
clean_disjoints_less_than=0.0,
|
|
131
131
|
order_by_area=False,
|
|
132
132
|
keep_disjoint_pins=False,
|
|
133
|
-
):
|
|
133
|
+
) -> list[str]:
|
|
134
134
|
"""Find and fix disjoint nets from a given netlist.
|
|
135
135
|
|
|
136
136
|
Parameters
|
|
@@ -263,7 +263,7 @@ class LayoutValidation:
|
|
|
263
263
|
|
|
264
264
|
return new_nets
|
|
265
265
|
|
|
266
|
-
def fix_self_intersections(self, net_list=None):
|
|
266
|
+
def fix_self_intersections(self, net_list=None) -> bool:
|
|
267
267
|
"""Find and fix self intersections from a given netlist.
|
|
268
268
|
|
|
269
269
|
Parameters
|
|
@@ -306,7 +306,7 @@ class LayoutValidation:
|
|
|
306
306
|
self._pedb._logger.info("Found {} illegal net names.".format(len(renamed_nets)))
|
|
307
307
|
return
|
|
308
308
|
|
|
309
|
-
def illegal_rlc_values(self, fix=False):
|
|
309
|
+
def illegal_rlc_values(self, fix=False) -> list[str]:
|
|
310
310
|
"""Find and fix RLC illegal values."""
|
|
311
311
|
inductors = self._pedb.components.inductors
|
|
312
312
|
|
|
@@ -318,7 +318,7 @@ class LayoutValidation:
|
|
|
318
318
|
if fix:
|
|
319
319
|
v.rlc_values = [0, 1, 0]
|
|
320
320
|
self._pedb._logger.info(f"Found {len(temp)} inductors have no value.")
|
|
321
|
-
return
|
|
321
|
+
return temp
|
|
322
322
|
|
|
323
323
|
def padstacks_no_name(self, fix=False):
|
|
324
324
|
pds = self._pedb.layout.padstack_instances
|