pyedb 0.9.0__py3-none-any.whl → 0.10.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.
Potentially problematic release.
This version of pyedb might be problematic. Click here for more details.
- pyedb/__init__.py +1 -1
- pyedb/configuration/__init__.py +0 -0
- pyedb/configuration/cfg_data.py +45 -0
- pyedb/configuration/cfg_ports.py +149 -0
- pyedb/{dotnet/edb_core → configuration}/configuration.py +68 -32
- pyedb/dotnet/edb.py +4 -3
- pyedb/dotnet/edb_core/components.py +19 -8
- pyedb/dotnet/edb_core/edb_data/hfss_simulation_setup_data.py +4 -0
- pyedb/dotnet/edb_core/edb_data/layer_data.py +164 -62
- pyedb/dotnet/edb_core/edb_data/simulation_configuration.py +49 -0
- pyedb/dotnet/edb_core/hfss.py +29 -11
- pyedb/dotnet/edb_core/materials.py +73 -81
- pyedb/dotnet/edb_core/stackup.py +289 -84
- {pyedb-0.9.0.dist-info → pyedb-0.10.0.dist-info}/METADATA +5 -5
- {pyedb-0.9.0.dist-info → pyedb-0.10.0.dist-info}/RECORD +17 -14
- {pyedb-0.9.0.dist-info → pyedb-0.10.0.dist-info}/LICENSE +0 -0
- {pyedb-0.9.0.dist-info → pyedb-0.10.0.dist-info}/WHEEL +0 -0
pyedb/dotnet/edb_core/stackup.py
CHANGED
|
@@ -68,16 +68,253 @@ if not is_ironpython:
|
|
|
68
68
|
logger = logging.getLogger(__name__)
|
|
69
69
|
|
|
70
70
|
|
|
71
|
-
class
|
|
71
|
+
class LayerCollection(object):
|
|
72
|
+
auto_refresh = True
|
|
73
|
+
|
|
74
|
+
def __init__(self, pedb, edb_object=None):
|
|
75
|
+
self._pedb = pedb
|
|
76
|
+
self._edb_object = (
|
|
77
|
+
self._pedb.edb_api.cell._cell.LayerCollection(edb_object)
|
|
78
|
+
if edb_object
|
|
79
|
+
else self._pedb.edb_api.cell._cell.LayerCollection()
|
|
80
|
+
)
|
|
81
|
+
self._layer_type_set_mapping = {
|
|
82
|
+
"stackup_layer_set": self._pedb.edb_api.cell.layer_type_set.StackupLayerSet,
|
|
83
|
+
"signal_ayer_et": self._pedb.edb_api.cell.layer_type_set.SignalLayerSet,
|
|
84
|
+
"non_stackup_layer_set": self._pedb.edb_api.cell.layer_type_set.NonStackupLayerSet,
|
|
85
|
+
"all_layer_et": self._pedb.edb_api.cell.layer_type_set.AllLayerSet,
|
|
86
|
+
}
|
|
87
|
+
self._lc_mode_mapping = {
|
|
88
|
+
"laminate": self._pedb.edb_api.cell._cell.LayerCollectionMode.Laminate,
|
|
89
|
+
"overlapping": self._pedb.edb_api.cell._cell.LayerCollectionMode.Overlapping,
|
|
90
|
+
"multizone": self._pedb.edb_api.cell._cell.LayerCollectionMode.MultiZone,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
def update_layout(self, stackup=None):
|
|
94
|
+
"""Set layer collection into edb.
|
|
95
|
+
|
|
96
|
+
Parameters
|
|
97
|
+
----------
|
|
98
|
+
stackup
|
|
99
|
+
"""
|
|
100
|
+
if stackup:
|
|
101
|
+
self._edb_object = stackup._edb_object
|
|
102
|
+
self._pedb.layout.layer_collection = self._edb_object
|
|
103
|
+
|
|
104
|
+
@pyedb_function_handler
|
|
105
|
+
def _add_layer(self, add_method, base_layer_name="", **kwargs):
|
|
106
|
+
"""Add a layer to edb.
|
|
107
|
+
|
|
108
|
+
Parameters
|
|
109
|
+
----------
|
|
110
|
+
add_method
|
|
111
|
+
base_layer_name
|
|
112
|
+
"""
|
|
113
|
+
layer_clone = kwargs.get("layer_clone", None)
|
|
114
|
+
if layer_clone:
|
|
115
|
+
obj = layer_clone
|
|
116
|
+
else:
|
|
117
|
+
obj = StackupLayerEdbClass(self._pedb, edb_object=None, **kwargs)
|
|
118
|
+
method_top_bottom = None
|
|
119
|
+
method_above_below = None
|
|
120
|
+
if add_method == "add_layer_top":
|
|
121
|
+
method_top_bottom = self._edb_object.AddLayerTop
|
|
122
|
+
elif add_method == "add_layer_bottom":
|
|
123
|
+
method_top_bottom = self._edb_object.AddLayerBottom
|
|
124
|
+
elif add_method == "add_layer_above":
|
|
125
|
+
method_above_below = self._edb_object.AddLayerAbove
|
|
126
|
+
elif add_method == "add_layer_below":
|
|
127
|
+
method_above_below = self._edb_object.AddLayerBelow
|
|
128
|
+
else: # pragma: no cover
|
|
129
|
+
logger.error("The way of defining layer addition is not correct")
|
|
130
|
+
return False
|
|
131
|
+
|
|
132
|
+
if method_top_bottom:
|
|
133
|
+
obj = obj if method_top_bottom(obj._edb_object) else False
|
|
134
|
+
elif method_above_below:
|
|
135
|
+
obj = obj if method_above_below(obj._edb_object, base_layer_name) else False
|
|
136
|
+
if self.auto_refresh:
|
|
137
|
+
self.update_layout()
|
|
138
|
+
return obj
|
|
139
|
+
|
|
140
|
+
@pyedb_function_handler
|
|
141
|
+
def add_layer_top(self, name, layer_type="signal", **kwargs):
|
|
142
|
+
"""Add a layer on top of the stackup.
|
|
143
|
+
|
|
144
|
+
Parameters
|
|
145
|
+
----------
|
|
146
|
+
name : str
|
|
147
|
+
Name of the layer.
|
|
148
|
+
layer_type: str, optional
|
|
149
|
+
Type of the layer. The default to ``"signal"``. Options are ``"signal"``, ``"dielectric"``
|
|
150
|
+
kwargs
|
|
151
|
+
|
|
152
|
+
Returns
|
|
153
|
+
-------
|
|
154
|
+
|
|
155
|
+
"""
|
|
156
|
+
kwargs["name"] = name
|
|
157
|
+
kwargs["layer_type"] = layer_type
|
|
158
|
+
return self._add_layer(add_method="add_layer_top", **kwargs)
|
|
159
|
+
|
|
160
|
+
@pyedb_function_handler
|
|
161
|
+
def add_layer_bottom(self, name, layer_type="signal", **kwargs):
|
|
162
|
+
"""Add a layer on bottom of the stackup.
|
|
163
|
+
|
|
164
|
+
Parameters
|
|
165
|
+
----------
|
|
166
|
+
name : str
|
|
167
|
+
Name of the layer.
|
|
168
|
+
layer_type: str, optional
|
|
169
|
+
Type of the layer. The default to ``"signal"``. Options are ``"signal"``, ``"dielectric"``
|
|
170
|
+
kwargs
|
|
171
|
+
|
|
172
|
+
Returns
|
|
173
|
+
-------
|
|
174
|
+
|
|
175
|
+
"""
|
|
176
|
+
kwargs["name"] = name
|
|
177
|
+
kwargs["layer_type"] = layer_type
|
|
178
|
+
return self._add_layer(add_method="add_layer_bottom", **kwargs)
|
|
179
|
+
|
|
180
|
+
@pyedb_function_handler
|
|
181
|
+
def add_layer_below(self, name, base_layer_name, layer_type="signal", **kwargs):
|
|
182
|
+
"""Add a layer below a layer.
|
|
183
|
+
|
|
184
|
+
Parameters
|
|
185
|
+
----------
|
|
186
|
+
name : str
|
|
187
|
+
Name of the layer.
|
|
188
|
+
base_layer_name: str
|
|
189
|
+
Name of the base layer.
|
|
190
|
+
layer_type: str, optional
|
|
191
|
+
Type of the layer. The default to ``"signal"``. Options are ``"signal"``, ``"dielectric"``
|
|
192
|
+
kwargs
|
|
193
|
+
|
|
194
|
+
Returns
|
|
195
|
+
-------
|
|
196
|
+
|
|
197
|
+
"""
|
|
198
|
+
kwargs["name"] = name
|
|
199
|
+
kwargs["layer_type"] = layer_type
|
|
200
|
+
return self._add_layer(add_method="add_layer_below", base_layer_name=base_layer_name, **kwargs)
|
|
201
|
+
|
|
202
|
+
@pyedb_function_handler
|
|
203
|
+
def add_layer_above(self, name, base_layer_name, layer_type="signal", **kwargs):
|
|
204
|
+
"""Add a layer above a layer.
|
|
205
|
+
|
|
206
|
+
Parameters
|
|
207
|
+
----------
|
|
208
|
+
name : str
|
|
209
|
+
Name of the layer.
|
|
210
|
+
base_layer_name: str
|
|
211
|
+
Name of the base layer.
|
|
212
|
+
layer_type: str, optional
|
|
213
|
+
Type of the layer. The default to ``"signal"``. Options are ``"signal"``, ``"dielectric"``
|
|
214
|
+
kwargs
|
|
215
|
+
|
|
216
|
+
Returns
|
|
217
|
+
-------
|
|
218
|
+
|
|
219
|
+
"""
|
|
220
|
+
kwargs["name"] = name
|
|
221
|
+
kwargs["layer_type"] = layer_type
|
|
222
|
+
return self._add_layer(add_method="add_layer_above", base_layer_name=base_layer_name, **kwargs)
|
|
223
|
+
|
|
224
|
+
@pyedb_function_handler
|
|
225
|
+
def add_document_layer(self, name, layer_type="UndefinedLayerType", **kwargs):
|
|
226
|
+
"""Add a document layer.
|
|
227
|
+
|
|
228
|
+
Parameters
|
|
229
|
+
----------
|
|
230
|
+
name : str
|
|
231
|
+
Name of the layer.
|
|
232
|
+
layer_type: str, optional
|
|
233
|
+
Type of the layer. The default to ``"signal"``. Options are ``"signal"``, ``"dielectric"``
|
|
234
|
+
kwargs
|
|
235
|
+
|
|
236
|
+
Returns
|
|
237
|
+
-------
|
|
238
|
+
|
|
239
|
+
"""
|
|
240
|
+
kwargs["name"] = name
|
|
241
|
+
kwargs["layer_type"] = layer_type
|
|
242
|
+
return self._add_layer(add_method="add_layer_bottom", **kwargs)
|
|
243
|
+
|
|
244
|
+
@pyedb_function_handler
|
|
245
|
+
def set_layer_clone(self, layer_clone):
|
|
246
|
+
lc = self._pedb.edb_api.cell._cell.LayerCollection() # empty layer collection
|
|
247
|
+
lc.SetMode(self._edb_object.GetMode())
|
|
248
|
+
if self.mode.lower() == "laminate":
|
|
249
|
+
add_method = lc.AddLayerBottom
|
|
250
|
+
else:
|
|
251
|
+
add_method = lc.AddStackupLayerAtElevation
|
|
252
|
+
|
|
253
|
+
obj = False
|
|
254
|
+
# Add stackup layers
|
|
255
|
+
for _, i in self.stackup_layers.items():
|
|
256
|
+
if i.id == layer_clone.id: # replace layer
|
|
257
|
+
add_method(layer_clone._edb_object)
|
|
258
|
+
obj = layer_clone
|
|
259
|
+
else: # keep existing layer
|
|
260
|
+
add_method(i._edb_object)
|
|
261
|
+
# Add non stackup layers
|
|
262
|
+
for _, i in self.non_stackup_layers.items():
|
|
263
|
+
if i.id == layer_clone.id:
|
|
264
|
+
lc.AddLayerBottom(layer_clone._edb_object)
|
|
265
|
+
obj = layer_clone
|
|
266
|
+
else:
|
|
267
|
+
lc.AddLayerBottom(i._edb_object)
|
|
268
|
+
|
|
269
|
+
self._edb_object = lc
|
|
270
|
+
if self.auto_refresh:
|
|
271
|
+
self.update_layout()
|
|
272
|
+
|
|
273
|
+
if not obj:
|
|
274
|
+
logger.info("Layer clone was not found in stackup or non stackup layers.")
|
|
275
|
+
return obj
|
|
276
|
+
|
|
277
|
+
@property
|
|
278
|
+
def stackup_layers(self):
|
|
279
|
+
"""Retrieve the dictionary of signal and dielectric layers."""
|
|
280
|
+
temp = list(self._edb_object.Layers((self._pedb.edb_api.cell.layer_type_set.StackupLayerSet)))
|
|
281
|
+
layers = OrderedDict()
|
|
282
|
+
for i in temp:
|
|
283
|
+
name = i.GetName()
|
|
284
|
+
layers[name] = StackupLayerEdbClass(self._pedb, i.Clone(), name=name)
|
|
285
|
+
return layers
|
|
286
|
+
|
|
287
|
+
@property
|
|
288
|
+
def non_stackup_layers(self):
|
|
289
|
+
"""Retrieve the dictionary of signal layers."""
|
|
290
|
+
temp = list(self._edb_object.Layers(self._layer_type_set_mapping["non_stackup_layer_set"]))
|
|
291
|
+
layers = OrderedDict()
|
|
292
|
+
for i in temp:
|
|
293
|
+
name = i.GetName()
|
|
294
|
+
layers[name] = LayerEdbClass(self._pedb, i, name=name)
|
|
295
|
+
return layers
|
|
296
|
+
|
|
297
|
+
@property
|
|
298
|
+
def layers_by_id(self):
|
|
299
|
+
"""Retrieve the list of layers with their ids."""
|
|
300
|
+
layer_list = list(self._layer_collection.Layers(self._pedb.edb_api.cell.layer_type_set.AllLayerSet))
|
|
301
|
+
temp = []
|
|
302
|
+
for i in layer_list:
|
|
303
|
+
obj = StackupLayerEdbClass(self._pedb, i.Clone(), name=i.GetName)
|
|
304
|
+
temp.append([obj.id, obj.name])
|
|
305
|
+
return temp
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
class Stackup(LayerCollection):
|
|
72
309
|
"""Manages EDB methods for stackup accessible from `Edb.stackup` property."""
|
|
73
310
|
|
|
74
311
|
def __getitem__(self, item):
|
|
75
312
|
return self.layers[item]
|
|
76
313
|
|
|
77
|
-
def __init__(self, pedb):
|
|
314
|
+
def __init__(self, pedb, edb_object=None):
|
|
315
|
+
super().__init__(pedb, edb_object)
|
|
78
316
|
# parent caller class
|
|
79
|
-
self.
|
|
80
|
-
self._lc = None
|
|
317
|
+
self._lc = self._edb_object
|
|
81
318
|
|
|
82
319
|
@property
|
|
83
320
|
def _logger(self):
|
|
@@ -323,27 +560,8 @@ class Stackup(object):
|
|
|
323
560
|
@pyedb_function_handler()
|
|
324
561
|
def refresh_layer_collection(self):
|
|
325
562
|
"""Refresh layer collection from Edb. This method is run on demand after all edit operations on stackup."""
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
i.Clone() for i in list(list(lc_readonly.Layers(self._pedb.edb_api.cell.layer_type_set.StackupLayerSet)))
|
|
329
|
-
]
|
|
330
|
-
non_stackup = [
|
|
331
|
-
i.Clone() for i in list(list(lc_readonly.Layers(self._pedb.edb_api.cell.layer_type_set.NonStackupLayerSet)))
|
|
332
|
-
]
|
|
333
|
-
self._lc = self._pedb.edb_api.cell._cell.LayerCollection()
|
|
334
|
-
mode = lc_readonly.GetMode()
|
|
335
|
-
self._lc.SetMode(lc_readonly.GetMode())
|
|
336
|
-
if str(mode) == "Overlapping":
|
|
337
|
-
for layer in layers:
|
|
338
|
-
self._lc.AddStackupLayerAtElevation(layer)
|
|
339
|
-
elif str(mode) == "Laminate":
|
|
340
|
-
for layer in layers:
|
|
341
|
-
self._lc.AddLayerBottom(layer)
|
|
342
|
-
else:
|
|
343
|
-
self._lc.AddLayers(convert_py_list_to_net_list(layers, self._pedb.edb_api.cell.layer))
|
|
344
|
-
for layer in non_stackup:
|
|
345
|
-
self._lc.AddLayerBottom(layer)
|
|
346
|
-
self._lc.SetMode(lc_readonly.GetMode())
|
|
563
|
+
self._lc = self._pedb.edb_api.cell._cell.LayerCollection(self._pedb.layout.layer_collection)
|
|
564
|
+
self._edb_object = self._lc
|
|
347
565
|
|
|
348
566
|
@property
|
|
349
567
|
def _layer_collection(self):
|
|
@@ -414,11 +632,6 @@ class Stackup(object):
|
|
|
414
632
|
layer_list = list(self._layer_collection.Layers(self._pedb.edb_api.cell.layer_type_set.AllLayerSet))
|
|
415
633
|
return [i.Clone() for i in layer_list]
|
|
416
634
|
|
|
417
|
-
@property
|
|
418
|
-
def _edb_layer_list_nonstackup(self):
|
|
419
|
-
layer_list = list(self._layer_collection.Layers(self._pedb.edb_api.cell.layer_type_set.NonStackupLayerSet))
|
|
420
|
-
return [i.Clone() for i in layer_list]
|
|
421
|
-
|
|
422
635
|
@property
|
|
423
636
|
def layers(self):
|
|
424
637
|
"""Retrieve the dictionary of layers.
|
|
@@ -431,9 +644,9 @@ class Stackup(object):
|
|
|
431
644
|
for l in self._edb_layer_list:
|
|
432
645
|
name = l.GetName()
|
|
433
646
|
if not l.IsStackupLayer():
|
|
434
|
-
_lays[name] = LayerEdbClass(self, name)
|
|
647
|
+
_lays[name] = LayerEdbClass(self._pedb, l, name=name)
|
|
435
648
|
else:
|
|
436
|
-
_lays[name] = StackupLayerEdbClass(self, name)
|
|
649
|
+
_lays[name] = StackupLayerEdbClass(self._pedb, l, name=name)
|
|
437
650
|
return _lays
|
|
438
651
|
|
|
439
652
|
@property
|
|
@@ -451,24 +664,6 @@ class Stackup(object):
|
|
|
451
664
|
_lays[name] = obj
|
|
452
665
|
return _lays
|
|
453
666
|
|
|
454
|
-
@property
|
|
455
|
-
def stackup_layers(self):
|
|
456
|
-
"""Retrieve the dictionary of signal and dielectric layers.
|
|
457
|
-
|
|
458
|
-
Returns
|
|
459
|
-
-------
|
|
460
|
-
Dict[str, :class:`dotnet.edb_core.edb_data.layer_data.LayerEdbClass`]
|
|
461
|
-
"""
|
|
462
|
-
layer_type = [
|
|
463
|
-
self._pedb.edb_api.cell.layer_type.SignalLayer,
|
|
464
|
-
self._pedb.edb_api.cell.layer_type.DielectricLayer,
|
|
465
|
-
]
|
|
466
|
-
_lays = OrderedDict()
|
|
467
|
-
for name, obj in self.layers.items():
|
|
468
|
-
if obj._edb_layer.GetLayerType() in layer_type:
|
|
469
|
-
_lays[name] = obj
|
|
470
|
-
return _lays
|
|
471
|
-
|
|
472
667
|
@property
|
|
473
668
|
def dielectric_layers(self):
|
|
474
669
|
"""Dielectric layers.
|
|
@@ -485,16 +680,6 @@ class Stackup(object):
|
|
|
485
680
|
_lays[name] = obj
|
|
486
681
|
return _lays
|
|
487
682
|
|
|
488
|
-
@property
|
|
489
|
-
def non_stackup_layers(self):
|
|
490
|
-
"""Retrieve the dictionary of signal layers.
|
|
491
|
-
|
|
492
|
-
Returns
|
|
493
|
-
-------
|
|
494
|
-
Dict[str, :class:`dotnet.edb_core.edb_data.layer_data.LayerEdbClass`]
|
|
495
|
-
"""
|
|
496
|
-
return {l.GetName(): LayerEdbClass(self, l.GetName()) for l in self._edb_layer_list_nonstackup}
|
|
497
|
-
|
|
498
683
|
@pyedb_function_handler()
|
|
499
684
|
def _edb_value(self, value):
|
|
500
685
|
return self._pedb.edb_value(value)
|
|
@@ -1860,7 +2045,8 @@ class Stackup(object):
|
|
|
1860
2045
|
|
|
1861
2046
|
layer.material = layer_info.Material
|
|
1862
2047
|
layer.thickness = layer_info.Thickness
|
|
1863
|
-
|
|
2048
|
+
if not str(layer_info.Dielectric_Fill) == "nan":
|
|
2049
|
+
layer.dielectric_fill = layer_info.Dielectric_Fill
|
|
1864
2050
|
|
|
1865
2051
|
lc_new = self._pedb.edb_api.Cell.LayerCollection()
|
|
1866
2052
|
for name, _ in df.iterrows():
|
|
@@ -2122,34 +2308,51 @@ class Stackup(object):
|
|
|
2122
2308
|
stackup = root.find("Stackup")
|
|
2123
2309
|
stackup_dict = {}
|
|
2124
2310
|
if stackup.find("Materials"):
|
|
2125
|
-
|
|
2311
|
+
mats = []
|
|
2126
2312
|
for m in stackup.find("Materials").findall("Material"):
|
|
2127
|
-
|
|
2313
|
+
temp = dict()
|
|
2128
2314
|
for i in list(m):
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2315
|
+
value = list(i)[0].text
|
|
2316
|
+
temp[i.tag] = value
|
|
2317
|
+
mat = {"name": m.attrib["Name"]}
|
|
2318
|
+
temp_dict = {
|
|
2319
|
+
"Permittivity": "permittivity",
|
|
2320
|
+
"Conductivity": "conductivity",
|
|
2321
|
+
"DielectricLossTangent": "dielectric_loss_tangent",
|
|
2322
|
+
}
|
|
2323
|
+
for i in temp_dict.keys():
|
|
2324
|
+
value = temp.get(i, None)
|
|
2325
|
+
if value:
|
|
2326
|
+
mat[temp_dict[i]] = value
|
|
2327
|
+
mats.append(mat)
|
|
2328
|
+
stackup_dict["materials"] = mats
|
|
2329
|
+
|
|
2132
2330
|
stackup_section = stackup.find("Layers")
|
|
2133
2331
|
if stackup_section:
|
|
2134
2332
|
length_unit = stackup_section.attrib["LengthUnit"]
|
|
2135
|
-
|
|
2333
|
+
layers = []
|
|
2136
2334
|
for l in stackup.find("Layers").findall("Layer"):
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2335
|
+
temp = l.attrib
|
|
2336
|
+
layer = dict()
|
|
2337
|
+
temp_dict = {
|
|
2338
|
+
"Name": "name",
|
|
2339
|
+
"Color": "color",
|
|
2340
|
+
"Material": "material",
|
|
2341
|
+
"Thickness": "thickness",
|
|
2342
|
+
"Type": "type",
|
|
2343
|
+
"FillMaterial": "fill_material",
|
|
2344
|
+
}
|
|
2345
|
+
for i in temp_dict.keys():
|
|
2346
|
+
value = temp.get(i, None)
|
|
2347
|
+
if value:
|
|
2348
|
+
value = "signal" if value == "conductor" else value
|
|
2349
|
+
if i == "Color":
|
|
2350
|
+
value = [int(x * 255) for x in list(colors.to_rgb(value))]
|
|
2351
|
+
layer[temp_dict[i]] = value
|
|
2352
|
+
layers.append(layer)
|
|
2353
|
+
stackup_dict["layers"] = layers
|
|
2354
|
+
cfg = {"stackup": stackup_dict}
|
|
2355
|
+
return self._pedb.configuration.load(cfg, apply_file=True)
|
|
2153
2356
|
|
|
2154
2357
|
@pyedb_function_handler()
|
|
2155
2358
|
def _export_xml(self, file_path):
|
|
@@ -2204,7 +2407,9 @@ class Stackup(object):
|
|
|
2204
2407
|
|
|
2205
2408
|
@pyedb_function_handler()
|
|
2206
2409
|
def load(self, file_path, rename=False):
|
|
2207
|
-
"""Import stackup from a file. The file format can be XML, CSV, or JSON.
|
|
2410
|
+
"""Import stackup from a file. The file format can be XML, CSV, or JSON. Valid control file must
|
|
2411
|
+
have the same number of signal layers. Signals layers can be renamed. Dielectric layers can be
|
|
2412
|
+
added and deleted.
|
|
2208
2413
|
|
|
2209
2414
|
|
|
2210
2415
|
Parameters
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pyedb
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.10.0
|
|
4
4
|
Summary: Higher-Level Pythonic Ansys Electronics Data Base
|
|
5
5
|
Author-email: "ANSYS, Inc." <pyansys.core@ansys.com>
|
|
6
6
|
Maintainer-email: PyEDB developers <simon.vandenbrouck@ansys.com>
|
|
@@ -24,7 +24,7 @@ Requires-Dist: toml == 0.10.2
|
|
|
24
24
|
Requires-Dist: Rtree >= 1.2.0
|
|
25
25
|
Requires-Dist: ansys-sphinx-theme>=0.10.0,<0.16 ; extra == "doc"
|
|
26
26
|
Requires-Dist: imageio>=2.30.0,<2.35 ; extra == "doc"
|
|
27
|
-
Requires-Dist: ipython>=8.13.0,<8.
|
|
27
|
+
Requires-Dist: ipython>=8.13.0,<8.25 ; extra == "doc"
|
|
28
28
|
Requires-Dist: jupyterlab>=4.0.0,<4.3 ; extra == "doc"
|
|
29
29
|
Requires-Dist: matplotlib>=3.5.0,<3.9 ; extra == "doc"
|
|
30
30
|
Requires-Dist: nbsphinx>=0.9.0,<0.10 ; extra == "doc"
|
|
@@ -35,7 +35,7 @@ Requires-Dist: Sphinx>=7.1.0,<7.4 ; extra == "doc"
|
|
|
35
35
|
Requires-Dist: sphinx-autobuild==2024.2.4 ; extra == "doc" and ( python_version == '3.8')
|
|
36
36
|
Requires-Dist: sphinx-autobuild==2024.2.4 ; extra == "doc" and ( python_version > '3.8')
|
|
37
37
|
Requires-Dist: sphinx-copybutton>=0.5.0,<0.6 ; extra == "doc"
|
|
38
|
-
Requires-Dist: sphinx-gallery>=0.14.0,<0.
|
|
38
|
+
Requires-Dist: sphinx-gallery>=0.14.0,<0.17 ; extra == "doc"
|
|
39
39
|
Requires-Dist: sphinx_design>=0.4.0,<0.6 ; extra == "doc"
|
|
40
40
|
Requires-Dist: matplotlib>=3.5.0,<3.9 ; extra == "full"
|
|
41
41
|
Requires-Dist: numpy>=1.20.0,<2 ; extra == "full"
|
|
@@ -44,9 +44,9 @@ Requires-Dist: matplotlib>=3.5.0,<3.9 ; extra == "tests"
|
|
|
44
44
|
Requires-Dist: numpy>=1.20.0,<2 ; extra == "tests"
|
|
45
45
|
Requires-Dist: mock>=5.1.0,<5.2 ; extra == "tests"
|
|
46
46
|
Requires-Dist: pandas>=1.1.0,<2.3 ; extra == "tests"
|
|
47
|
-
Requires-Dist: pytest>=7.4.0,<8.
|
|
47
|
+
Requires-Dist: pytest>=7.4.0,<8.3 ; extra == "tests"
|
|
48
48
|
Requires-Dist: pytest-cov>=4.0.0,<5.1 ; extra == "tests"
|
|
49
|
-
Requires-Dist: pytest-xdist>=3.5.0,<3.
|
|
49
|
+
Requires-Dist: pytest-xdist>=3.5.0,<3.7 ; extra == "tests"
|
|
50
50
|
Project-URL: Bugs, https://github.com/ansys/pyedb/issues
|
|
51
51
|
Project-URL: Discussions, https://github.com/ansys/pyedb/discussions
|
|
52
52
|
Project-URL: Documentation, https://edb.docs.pyansys.com
|
|
@@ -1,26 +1,29 @@
|
|
|
1
|
-
pyedb/__init__.py,sha256
|
|
1
|
+
pyedb/__init__.py,sha256=5-P7oUIpF3yu26BfJgM34yCkHvXZnwPf9deV8_7JSe8,1521
|
|
2
2
|
pyedb/edb_logger.py,sha256=yNkXnoL2me7ubLT6O6r6ElVnkZ1g8fmfFYC_2XJZ1Sw,14950
|
|
3
3
|
pyedb/exceptions.py,sha256=n94xluzUks6BA24vd_L6HkrvoP_H_l6__hQmqzdCyPo,111
|
|
4
4
|
pyedb/siwave.py,sha256=ilUsA74QKy7VpRfmfvRrcVZhPAsyfgXHZm0SDDHiGBE,11576
|
|
5
|
+
pyedb/configuration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
+
pyedb/configuration/cfg_data.py,sha256=5zkqMMfEWWYnAwXFVYZA4f-SRogpvXWvN3UOMGXDFUo,1887
|
|
7
|
+
pyedb/configuration/cfg_ports.py,sha256=Pj30RbsbgY7_kpSdANXDGUbhaPBqQXGO7pSLBZ3bK7Y,5569
|
|
8
|
+
pyedb/configuration/configuration.py,sha256=UqeR6Io8SJAZWVeVA4S6rxVq9DIHc4heoeUubmx5xt4,35124
|
|
5
9
|
pyedb/dotnet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
10
|
pyedb/dotnet/clr_module.py,sha256=Mo13Of3DVSA5HR-5xZEXOiHApIKy52CUxtJ2gPkEu1A,3406
|
|
7
|
-
pyedb/dotnet/edb.py,sha256=
|
|
11
|
+
pyedb/dotnet/edb.py,sha256=ezzRRR9pcpKtTSZA7DqyAHXXXB3uNPO7SHoNlFeOJ2E,171743
|
|
8
12
|
pyedb/dotnet/application/Variables.py,sha256=nov1kIyJO25iz8pvbU3MK1meMpRLwtISmzYqJhc7Ouo,79042
|
|
9
13
|
pyedb/dotnet/application/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
14
|
pyedb/dotnet/edb_core/__init__.py,sha256=nIRLJ8VZLcMAp12zmGsnZ5x2BEEl7q_Kj_KAOXxVjpQ,52
|
|
11
|
-
pyedb/dotnet/edb_core/components.py,sha256=
|
|
12
|
-
pyedb/dotnet/edb_core/configuration.py,sha256=huxXAAfRUFarJQbuoAEhH3JnmNylb2r__lfrEd8oMaA,33626
|
|
15
|
+
pyedb/dotnet/edb_core/components.py,sha256=guxNCJalAnVEVjxSdxTvoaqgLtn9YGuu9Velh4aJu-0,103685
|
|
13
16
|
pyedb/dotnet/edb_core/general.py,sha256=QP6lqNEcqCdj_hSKhfKbmJ2hGBOYkhjPtsVEmyrO8KU,4726
|
|
14
|
-
pyedb/dotnet/edb_core/hfss.py,sha256=
|
|
17
|
+
pyedb/dotnet/edb_core/hfss.py,sha256=pKq46cZ08nKHc1s__hkco-tA3AiBi4vV0T7w6RyQrEI,69696
|
|
15
18
|
pyedb/dotnet/edb_core/layout.py,sha256=Sde2-8E-sGiO0JvjY31ydlq0QZrVkutbT_afp1FkK0w,50907
|
|
16
19
|
pyedb/dotnet/edb_core/layout_validation.py,sha256=7Wj_VSAJOSA-RKOPgJXO-y9i6vfgJ4V9vxx0M1g1NUI,11798
|
|
17
|
-
pyedb/dotnet/edb_core/materials.py,sha256=
|
|
20
|
+
pyedb/dotnet/edb_core/materials.py,sha256=xgXImJ0gcOqCL3p0uQ1hdey_hBK4rkTIhj4MERDbS7E,43987
|
|
18
21
|
pyedb/dotnet/edb_core/net_class.py,sha256=lr-7Z0Q1A2fshxwjrIOmQSZnEBYe0NoxuUuJT6vYdyA,11857
|
|
19
22
|
pyedb/dotnet/edb_core/nets.py,sha256=EK-jjRFvRX_NtqMQ46ebJbv9HOvP1uYK_EZ3jPnmxB0,43882
|
|
20
23
|
pyedb/dotnet/edb_core/obj_base.py,sha256=lufR0sZj0QfZ2wlNvLL6aM1KVqCNY2A7taPPdWcK20w,3312
|
|
21
24
|
pyedb/dotnet/edb_core/padstack.py,sha256=h9NYecM5_Z00KeMkli-Sm97btbvnJsz2COSmyWfoVHA,56581
|
|
22
25
|
pyedb/dotnet/edb_core/siwave.py,sha256=wdLAKiz0Qhiktz3OPekBQtw_y2Kb8Vyk19QdF-FcUVU,62356
|
|
23
|
-
pyedb/dotnet/edb_core/stackup.py,sha256=
|
|
26
|
+
pyedb/dotnet/edb_core/stackup.py,sha256=7LpRWcE8V_zT5tZiZfvwV2e-C-wj3Lo4TA2rvbiCxoU,122296
|
|
24
27
|
pyedb/dotnet/edb_core/cell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
28
|
pyedb/dotnet/edb_core/cell/hierarchy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
26
29
|
pyedb/dotnet/edb_core/cell/hierarchy/model.py,sha256=cJzNJLiuuoesfCL8-jWo8LbgGbfXrTYNQqmeeE38ieM,3309
|
|
@@ -41,14 +44,14 @@ pyedb/dotnet/edb_core/edb_data/control_file.py,sha256=2Gfrs8qW3N7y0A8ynAlKQpA6q9
|
|
|
41
44
|
pyedb/dotnet/edb_core/edb_data/design_options.py,sha256=RO9ip-T5Bfxpsl97_QEk0qDZsza3tLzIX2t25XLutys,2057
|
|
42
45
|
pyedb/dotnet/edb_core/edb_data/edbvalue.py,sha256=Vj_11HXsQUNavizKp5FicORm6cjhXRh9uvxhv_D_RJc,1977
|
|
43
46
|
pyedb/dotnet/edb_core/edb_data/hfss_extent_info.py,sha256=5koQSKdYC6Deh4haLUDAxnHlRa-j5S6g4eyAfiGgZP8,13190
|
|
44
|
-
pyedb/dotnet/edb_core/edb_data/hfss_simulation_setup_data.py,sha256=
|
|
45
|
-
pyedb/dotnet/edb_core/edb_data/layer_data.py,sha256=
|
|
47
|
+
pyedb/dotnet/edb_core/edb_data/hfss_simulation_setup_data.py,sha256=rXzh95N_jLf6a3OEEJRm50qFX0rM6lS5B5osnKlVzf4,49037
|
|
48
|
+
pyedb/dotnet/edb_core/edb_data/layer_data.py,sha256=HVPmE_Rny29J1c8qlJ3TSNZaMOTSxTgE9_vIiQJG0cE,25900
|
|
46
49
|
pyedb/dotnet/edb_core/edb_data/nets_data.py,sha256=iULEOUsn3sfLT5FVY_4lMWTm0KzC-01AZ-aYIkM0U-k,9933
|
|
47
50
|
pyedb/dotnet/edb_core/edb_data/padstacks_data.py,sha256=T7m7s5KAZB-gZ9wrPw6k2Yoon6uwCfJSOeg2hvyX1LI,78754
|
|
48
51
|
pyedb/dotnet/edb_core/edb_data/ports.py,sha256=FYxB2rDUtN_OsYAbodXbc5mA_d0BUebmin_B5kkUw3U,9223
|
|
49
52
|
pyedb/dotnet/edb_core/edb_data/primitives_data.py,sha256=veMDPCb6T84KZ_xgo52g7vHxObsx-Y2ysWXBS2CqZpQ,48155
|
|
50
53
|
pyedb/dotnet/edb_core/edb_data/raptor_x_simulation_setup_data.py,sha256=FPQ1myUhmBAyyAsqPQZnr0Y-_k-tvq-JhQtESp3ea0g,21065
|
|
51
|
-
pyedb/dotnet/edb_core/edb_data/simulation_configuration.py,sha256=
|
|
54
|
+
pyedb/dotnet/edb_core/edb_data/simulation_configuration.py,sha256=FVytbP5wx1lWS6708_JfB2aVXjAeTzTH0-3CeMLMdv8,101304
|
|
52
55
|
pyedb/dotnet/edb_core/edb_data/siwave_simulation_setup_data.py,sha256=fPmdhh6t6HM2pE_mQCT0ZQYO-PkqhwumwiuRUNEn00Q,42354
|
|
53
56
|
pyedb/dotnet/edb_core/edb_data/sources.py,sha256=XmdpOdlpBa3QiYFY0cRtVIolt4nvUR9Ptk5YnRVvU4c,15342
|
|
54
57
|
pyedb/dotnet/edb_core/edb_data/terminals.py,sha256=m2kch7Md-MSGUEbKFW8m8RpBzq6lNMFdgPgOtDUbsMA,25287
|
|
@@ -132,7 +135,7 @@ pyedb/misc/siw_feature_config/emc/net_tags.py,sha256=HVYOQacmaLr6Mvf7FqZhqbhtqJL
|
|
|
132
135
|
pyedb/misc/siw_feature_config/emc/tag_library.py,sha256=yUK4w3hequU017E2DbkA4KE2MWIh1R6bfJBrevlDx6g,1557
|
|
133
136
|
pyedb/misc/siw_feature_config/emc/xml_generic.py,sha256=55X-V0OxWq-v7FTiDVjaZif8V_2xxsvJlJ8bs9Bf61I,2521
|
|
134
137
|
pyedb/modeler/geometry_operators.py,sha256=LDqEaeerw9H8Yva-SJhX3Afdni08OciO9t5G0c_tdqs,66820
|
|
135
|
-
pyedb-0.
|
|
136
|
-
pyedb-0.
|
|
137
|
-
pyedb-0.
|
|
138
|
-
pyedb-0.
|
|
138
|
+
pyedb-0.10.0.dist-info/LICENSE,sha256=qQWivZ12ETN5l3QxvTARY-QI5eoRRlyHdwLlAj0Bg5I,1089
|
|
139
|
+
pyedb-0.10.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
|
140
|
+
pyedb-0.10.0.dist-info/METADATA,sha256=6ABWvAvsx7L7NwDNJDbBCT9pZCm4rTH1_eN-lQ-Gerc,8351
|
|
141
|
+
pyedb-0.10.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|