pyedb 0.8.1__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 +62 -22
- 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/raptor_x_simulation_setup_data.py +520 -0
- 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/padstack.py +53 -0
- pyedb/dotnet/edb_core/stackup.py +289 -84
- pyedb/dotnet/edb_core/utilities/simulation_setup.py +22 -13
- {pyedb-0.8.1.dist-info → pyedb-0.10.0.dist-info}/METADATA +6 -5
- {pyedb-0.8.1.dist-info → pyedb-0.10.0.dist-info}/RECORD +20 -16
- {pyedb-0.8.1.dist-info → pyedb-0.10.0.dist-info}/LICENSE +0 -0
- {pyedb-0.8.1.dist-info → pyedb-0.10.0.dist-info}/WHEEL +0 -0
|
@@ -22,29 +22,126 @@
|
|
|
22
22
|
|
|
23
23
|
from __future__ import absolute_import
|
|
24
24
|
|
|
25
|
-
import re
|
|
26
|
-
|
|
27
25
|
from pyedb.generic.general_methods import pyedb_function_handler
|
|
28
26
|
|
|
29
27
|
|
|
30
28
|
class LayerEdbClass(object):
|
|
31
29
|
"""Manages Edb Layers. Replaces EDBLayer."""
|
|
32
30
|
|
|
33
|
-
def __init__(self,
|
|
34
|
-
self.
|
|
31
|
+
def __init__(self, pedb, edb_object=None, name="", layer_type="undefined", **kwargs):
|
|
32
|
+
self._pedb = pedb
|
|
35
33
|
self._name = name
|
|
36
34
|
self._color = ()
|
|
37
35
|
self._type = ""
|
|
38
36
|
|
|
37
|
+
if edb_object:
|
|
38
|
+
self._edb_object = edb_object.Clone()
|
|
39
|
+
else:
|
|
40
|
+
self._create(layer_type)
|
|
41
|
+
self.update(**kwargs)
|
|
42
|
+
|
|
43
|
+
@pyedb_function_handler
|
|
44
|
+
def _create(self, layer_type):
|
|
45
|
+
layer_type = self._layer_name_mapping[layer_type]
|
|
46
|
+
layer_type = self._doc_layer_mapping[layer_type]
|
|
47
|
+
|
|
48
|
+
self._edb_object = self._pedb.edb_api.cell._cell.Layer(
|
|
49
|
+
self._name,
|
|
50
|
+
layer_type,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
@pyedb_function_handler
|
|
54
|
+
def update(self, **kwargs):
|
|
55
|
+
for k, v in kwargs.items():
|
|
56
|
+
if k in dir(self):
|
|
57
|
+
self.__setattr__(k, v)
|
|
58
|
+
else:
|
|
59
|
+
self._pedb.logger.error(f"{k} is not a valid layer attribute")
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def id(self):
|
|
63
|
+
return self._edb_object.GetLayerId()
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def fill_material(self):
|
|
67
|
+
"""The layer's fill material."""
|
|
68
|
+
return self._edb_object.GetFillMaterial(True)
|
|
69
|
+
|
|
70
|
+
@fill_material.setter
|
|
71
|
+
def fill_material(self, value):
|
|
72
|
+
self._edb_object.SetFillMaterial(value)
|
|
73
|
+
|
|
74
|
+
@property
|
|
75
|
+
def _stackup_layer_mapping(self):
|
|
76
|
+
return {
|
|
77
|
+
"SignalLayer": self._edb.cell.layer_type.SignalLayer,
|
|
78
|
+
"DielectricLayer": self._edb.cell.layer_type.DielectricLayer,
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def _doc_layer_mapping(self):
|
|
83
|
+
return {
|
|
84
|
+
"ConductingLayer": self._edb.cell.layer_type.ConductingLayer,
|
|
85
|
+
"AirlinesLayer": self._edb.cell.layer_type.AirlinesLayer,
|
|
86
|
+
"ErrorsLayer": self._edb.cell.layer_type.ErrorsLayer,
|
|
87
|
+
"SymbolLayer": self._edb.cell.layer_type.SymbolLayer,
|
|
88
|
+
"MeasureLayer": self._edb.cell.layer_type.MeasureLayer,
|
|
89
|
+
"AssemblyLayer": self._edb.cell.layer_type.AssemblyLayer,
|
|
90
|
+
"SilkscreenLayer": self._edb.cell.layer_type.SilkscreenLayer,
|
|
91
|
+
"SolderMaskLayer": self._edb.cell.layer_type.SolderMaskLayer,
|
|
92
|
+
"SolderPasteLayer": self._edb.cell.layer_type.SolderPasteLayer,
|
|
93
|
+
"GlueLayer": self._edb.cell.layer_type.GlueLayer,
|
|
94
|
+
"WirebondLayer": self._edb.cell.layer_type.WirebondLayer,
|
|
95
|
+
"UserLayer": self._edb.cell.layer_type.UserLayer,
|
|
96
|
+
"SIwaveHFSSSolverRegions": self._edb.cell.layer_type.SIwaveHFSSSolverRegions,
|
|
97
|
+
"PostprocessingLayer": self._edb.cell.layer_type.PostprocessingLayer,
|
|
98
|
+
"OutlineLayer": self._edb.cell.layer_type.OutlineLayer,
|
|
99
|
+
"LayerTypesCount": self._edb.cell.layer_type.LayerTypesCount,
|
|
100
|
+
"UndefinedLayerType": self._edb.cell.layer_type.UndefinedLayerType,
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
@property
|
|
104
|
+
def _layer_type_mapping(self):
|
|
105
|
+
mapping = {}
|
|
106
|
+
mapping.update(self._stackup_layer_mapping)
|
|
107
|
+
mapping.update(self._doc_layer_mapping)
|
|
108
|
+
return mapping
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
def _layer_name_mapping(self):
|
|
112
|
+
return {
|
|
113
|
+
"signal": "SignalLayer",
|
|
114
|
+
"dielectric": "DielectricLayer",
|
|
115
|
+
"conducting": "ConductingLayer",
|
|
116
|
+
"airlines": "AirlinesLayer",
|
|
117
|
+
"errors": "ErrorsLayer",
|
|
118
|
+
"symbol": "SymbolLayer",
|
|
119
|
+
"measure": "MeasureLayer",
|
|
120
|
+
"assembly": "AssemblyLayer",
|
|
121
|
+
"silkscreen": "SilkscreenLayer",
|
|
122
|
+
"soldermask": "SolderMaskLayer",
|
|
123
|
+
"solderpaste": "SolderPasteLayer",
|
|
124
|
+
"glue": "GlueLayer",
|
|
125
|
+
"wirebound": "WirebondLayer",
|
|
126
|
+
"user": "UserLayer",
|
|
127
|
+
"siwavehfsssolverregions": "SIwaveHFSSSolverRegions",
|
|
128
|
+
"postprocessing": "PostprocessingLayer",
|
|
129
|
+
"outline": "OutlineLayer",
|
|
130
|
+
"layertypescount": "LayerTypesCount",
|
|
131
|
+
"undefined": "UndefinedLayerType",
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
@property
|
|
135
|
+
def _layer_name_mapping_reversed(self):
|
|
136
|
+
return {j: i for i, j in self._layer_name_mapping.items()}
|
|
137
|
+
|
|
39
138
|
@property
|
|
40
139
|
def _edb(self):
|
|
41
|
-
return self.
|
|
140
|
+
return self._pedb.edb_api
|
|
42
141
|
|
|
43
142
|
@property
|
|
44
143
|
def _edb_layer(self):
|
|
45
|
-
|
|
46
|
-
if l.GetName() == self._name:
|
|
47
|
-
return l.Clone()
|
|
144
|
+
return self._edb_object
|
|
48
145
|
|
|
49
146
|
@property
|
|
50
147
|
def is_stackup_layer(self):
|
|
@@ -84,7 +181,7 @@ class LayerEdbClass(object):
|
|
|
84
181
|
def color(self, rgb):
|
|
85
182
|
layer_clone = self._edb_layer
|
|
86
183
|
layer_clone.SetColor(*rgb)
|
|
87
|
-
self.
|
|
184
|
+
self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
|
|
88
185
|
self._color = rgb
|
|
89
186
|
|
|
90
187
|
@property
|
|
@@ -102,7 +199,7 @@ class LayerEdbClass(object):
|
|
|
102
199
|
def transparency(self, trans):
|
|
103
200
|
layer_clone = self._edb_layer
|
|
104
201
|
layer_clone.SetTransparency(trans)
|
|
105
|
-
self.
|
|
202
|
+
self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
|
|
106
203
|
|
|
107
204
|
@property
|
|
108
205
|
def name(self):
|
|
@@ -119,35 +216,28 @@ class LayerEdbClass(object):
|
|
|
119
216
|
layer_clone = self._edb_layer
|
|
120
217
|
old_name = layer_clone.GetName()
|
|
121
218
|
layer_clone.SetName(name)
|
|
122
|
-
self.
|
|
219
|
+
self._pedb.stackup._set_layout_stackup(layer_clone, "change_name", self._name)
|
|
123
220
|
self._name = name
|
|
124
|
-
for padstack_def in list(self.
|
|
221
|
+
for padstack_def in list(self._pedb.padstacks.definitions.values()):
|
|
125
222
|
padstack_def._update_layer_names(old_name=old_name, updated_name=name)
|
|
126
223
|
|
|
127
224
|
@property
|
|
128
225
|
def type(self):
|
|
129
226
|
"""Retrieve type of the layer."""
|
|
130
|
-
return
|
|
227
|
+
return self._layer_name_mapping_reversed[self._edb_layer.GetLayerType().ToString()]
|
|
131
228
|
|
|
132
229
|
@type.setter
|
|
133
|
-
def type(self,
|
|
134
|
-
|
|
135
|
-
return
|
|
230
|
+
def type(self, value):
|
|
231
|
+
value = self._layer_name_mapping[value]
|
|
136
232
|
layer_clone = self._edb_layer
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
elif new_type == "dielectric":
|
|
141
|
-
layer_clone.SetLayerType(self._edb.cell.layer_type.DielectricLayer)
|
|
142
|
-
self._type = new_type
|
|
143
|
-
else:
|
|
144
|
-
return
|
|
145
|
-
self._pclass._set_layout_stackup(layer_clone, "change_attribute")
|
|
233
|
+
layer_clone.SetLayerType(self._layer_type_mapping[value])
|
|
234
|
+
self._type = value
|
|
235
|
+
self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
|
|
146
236
|
|
|
147
237
|
|
|
148
238
|
class StackupLayerEdbClass(LayerEdbClass):
|
|
149
|
-
def __init__(self,
|
|
150
|
-
super().__init__(
|
|
239
|
+
def __init__(self, pedb, edb_object=None, name="", layer_type="signal", **kwargs):
|
|
240
|
+
super().__init__(pedb, edb_object, name=name, layer_type=layer_type, **kwargs)
|
|
151
241
|
self._material = ""
|
|
152
242
|
self._conductivity = 0.0
|
|
153
243
|
self._permittivity = 0.0
|
|
@@ -166,6 +256,17 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
166
256
|
self._upper_elevation = 0.0
|
|
167
257
|
self._lower_elevation = 0.0
|
|
168
258
|
|
|
259
|
+
def _create(self, layer_type):
|
|
260
|
+
layer_type = self._layer_name_mapping[layer_type]
|
|
261
|
+
layer_type = self._layer_type_mapping[layer_type]
|
|
262
|
+
self._edb_object = self._pedb.edb_api.cell._cell.StackupLayer(
|
|
263
|
+
self._name,
|
|
264
|
+
layer_type,
|
|
265
|
+
self._pedb.edb_value(0),
|
|
266
|
+
self._pedb.edb_value(0),
|
|
267
|
+
"copper",
|
|
268
|
+
)
|
|
269
|
+
|
|
169
270
|
@property
|
|
170
271
|
def lower_elevation(self):
|
|
171
272
|
"""Lower elevation.
|
|
@@ -180,10 +281,10 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
180
281
|
|
|
181
282
|
@lower_elevation.setter
|
|
182
283
|
def lower_elevation(self, value):
|
|
183
|
-
if self.
|
|
284
|
+
if self._pedb.stackup.mode == "Overlapping":
|
|
184
285
|
layer_clone = self._edb_layer
|
|
185
|
-
layer_clone.SetLowerElevation(self.
|
|
186
|
-
self.
|
|
286
|
+
layer_clone.SetLowerElevation(self._pedb.stackup._edb_value(value))
|
|
287
|
+
self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
|
|
187
288
|
|
|
188
289
|
@property
|
|
189
290
|
def upper_elevation(self):
|
|
@@ -212,7 +313,7 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
212
313
|
def is_negative(self, value):
|
|
213
314
|
layer_clone = self._edb_layer
|
|
214
315
|
layer_clone.SetNegative(value)
|
|
215
|
-
self.
|
|
316
|
+
self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
|
|
216
317
|
|
|
217
318
|
@property
|
|
218
319
|
def material(self):
|
|
@@ -228,7 +329,7 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
228
329
|
def material(self, name):
|
|
229
330
|
layer_clone = self._edb_layer
|
|
230
331
|
layer_clone.SetMaterial(name)
|
|
231
|
-
self.
|
|
332
|
+
self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
|
|
232
333
|
self._material = name
|
|
233
334
|
|
|
234
335
|
@property
|
|
@@ -239,8 +340,8 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
239
340
|
-------
|
|
240
341
|
float
|
|
241
342
|
"""
|
|
242
|
-
if self.material in self.
|
|
243
|
-
self._conductivity = self.
|
|
343
|
+
if self.material in self._pedb.materials.materials:
|
|
344
|
+
self._conductivity = self._pedb.materials[self.material].conductivity
|
|
244
345
|
return self._conductivity
|
|
245
346
|
|
|
246
347
|
return None
|
|
@@ -253,8 +354,8 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
253
354
|
-------
|
|
254
355
|
float
|
|
255
356
|
"""
|
|
256
|
-
if self.material in self.
|
|
257
|
-
self._permittivity = self.
|
|
357
|
+
if self.material in self._pedb.materials.materials:
|
|
358
|
+
self._permittivity = self._pedb.materials[self.material].permittivity
|
|
258
359
|
return self._permittivity
|
|
259
360
|
return None
|
|
260
361
|
|
|
@@ -266,8 +367,8 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
266
367
|
-------
|
|
267
368
|
float
|
|
268
369
|
"""
|
|
269
|
-
if self.material in self.
|
|
270
|
-
self._loss_tangent = self.
|
|
370
|
+
if self.material in self._pedb.materials.materials:
|
|
371
|
+
self._loss_tangent = self._pedb.materials[self.material].loss_tangent
|
|
271
372
|
return self._loss_tangent
|
|
272
373
|
return None
|
|
273
374
|
|
|
@@ -282,10 +383,11 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
282
383
|
|
|
283
384
|
@dielectric_fill.setter
|
|
284
385
|
def dielectric_fill(self, name):
|
|
386
|
+
name = name.lower()
|
|
285
387
|
if self.type == "signal":
|
|
286
388
|
layer_clone = self._edb_layer
|
|
287
389
|
layer_clone.SetFillMaterial(name)
|
|
288
|
-
self.
|
|
390
|
+
self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
|
|
289
391
|
self._dielectric_fill = name
|
|
290
392
|
else:
|
|
291
393
|
pass
|
|
@@ -308,8 +410,8 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
308
410
|
if not self.is_stackup_layer: # pragma: no cover
|
|
309
411
|
return
|
|
310
412
|
layer_clone = self._edb_layer
|
|
311
|
-
layer_clone.SetThickness(self.
|
|
312
|
-
self.
|
|
413
|
+
layer_clone.SetThickness(self._pedb.stackup._edb_value(value))
|
|
414
|
+
self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
|
|
313
415
|
self._thickness = value
|
|
314
416
|
|
|
315
417
|
@property
|
|
@@ -333,8 +435,8 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
333
435
|
else:
|
|
334
436
|
layer_clone = self._edb_layer
|
|
335
437
|
layer_clone.SetEtchFactorEnabled(True)
|
|
336
|
-
layer_clone.SetEtchFactor(self.
|
|
337
|
-
self.
|
|
438
|
+
layer_clone.SetEtchFactor(self._pedb.stackup._edb_value(value))
|
|
439
|
+
self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
|
|
338
440
|
self._etch_factor = value
|
|
339
441
|
|
|
340
442
|
@property
|
|
@@ -358,12 +460,12 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
358
460
|
if set_enable:
|
|
359
461
|
layer_clone = self._edb_layer
|
|
360
462
|
layer_clone.SetRoughnessEnabled(True)
|
|
361
|
-
self.
|
|
463
|
+
self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
|
|
362
464
|
self.assign_roughness_model()
|
|
363
465
|
else:
|
|
364
466
|
layer_clone = self._edb_layer
|
|
365
467
|
layer_clone.SetRoughnessEnabled(False)
|
|
366
|
-
self.
|
|
468
|
+
self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
|
|
367
469
|
|
|
368
470
|
@property
|
|
369
471
|
def top_hallhuray_nodule_radius(self):
|
|
@@ -454,11 +556,11 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
454
556
|
if not self.is_stackup_layer: # pragma: no cover
|
|
455
557
|
return
|
|
456
558
|
if surface == "top":
|
|
457
|
-
return self._edb_layer.GetRoughnessModel(self.
|
|
559
|
+
return self._edb_layer.GetRoughnessModel(self._pedb.edb_api.Cell.RoughnessModel.Region.Top)
|
|
458
560
|
elif surface == "bottom":
|
|
459
|
-
return self._edb_layer.GetRoughnessModel(self.
|
|
561
|
+
return self._edb_layer.GetRoughnessModel(self._pedb.edb_api.Cell.RoughnessModel.Region.Bottom)
|
|
460
562
|
elif surface == "side":
|
|
461
|
-
return self._edb_layer.GetRoughnessModel(self.
|
|
563
|
+
return self._edb_layer.GetRoughnessModel(self._pedb.edb_api.Cell.RoughnessModel.Region.Side)
|
|
462
564
|
|
|
463
565
|
@pyedb_function_handler()
|
|
464
566
|
def assign_roughness_model(
|
|
@@ -492,38 +594,38 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
492
594
|
if not self.is_stackup_layer: # pragma: no cover
|
|
493
595
|
return
|
|
494
596
|
|
|
495
|
-
radius = self.
|
|
597
|
+
radius = self._pedb.stackup._edb_value(huray_radius)
|
|
496
598
|
self._hurray_nodule_radius = huray_radius
|
|
497
|
-
surface_ratio = self.
|
|
599
|
+
surface_ratio = self._pedb.stackup._edb_value(huray_surface_ratio)
|
|
498
600
|
self._hurray_surface_ratio = huray_surface_ratio
|
|
499
|
-
groisse_roughness = self.
|
|
601
|
+
groisse_roughness = self._pedb.stackup._edb_value(groisse_roughness)
|
|
500
602
|
regions = []
|
|
501
603
|
if apply_on_surface == "all":
|
|
502
604
|
self._side_roughness = "all"
|
|
503
605
|
regions = [
|
|
504
|
-
self.
|
|
505
|
-
self.
|
|
506
|
-
self.
|
|
606
|
+
self._pedb.edb_api.Cell.RoughnessModel.Region.Top,
|
|
607
|
+
self._pedb.edb_api.Cell.RoughnessModel.Region.Side,
|
|
608
|
+
self._pedb.edb_api.Cell.RoughnessModel.Region.Bottom,
|
|
507
609
|
]
|
|
508
610
|
elif apply_on_surface == "top":
|
|
509
611
|
self._side_roughness = "top"
|
|
510
|
-
regions = [self.
|
|
612
|
+
regions = [self._pedb.edb_api.Cell.RoughnessModel.Region.Top]
|
|
511
613
|
elif apply_on_surface == "bottom":
|
|
512
614
|
self._side_roughness = "bottom"
|
|
513
|
-
regions = [self.
|
|
615
|
+
regions = [self._pedb.edb_api.Cell.RoughnessModel.Region.Bottom]
|
|
514
616
|
elif apply_on_surface == "side":
|
|
515
617
|
self._side_roughness = "side"
|
|
516
|
-
regions = [self.
|
|
618
|
+
regions = [self._pedb.edb_api.Cell.RoughnessModel.Region.Side]
|
|
517
619
|
|
|
518
620
|
layer_clone = self._edb_layer
|
|
519
621
|
layer_clone.SetRoughnessEnabled(True)
|
|
520
622
|
for r in regions:
|
|
521
623
|
if model_type == "huray":
|
|
522
|
-
model = self.
|
|
624
|
+
model = self._pedb.edb_api.Cell.HurrayRoughnessModel(radius, surface_ratio)
|
|
523
625
|
else:
|
|
524
|
-
model = self.
|
|
626
|
+
model = self._pedb.edb_api.Cell.GroisseRoughnessModel(groisse_roughness)
|
|
525
627
|
layer_clone.SetRoughnessModel(r, model)
|
|
526
|
-
return self.
|
|
628
|
+
return self._pedb.stackup._set_layout_stackup(layer_clone, "change_attribute")
|
|
527
629
|
|
|
528
630
|
@pyedb_function_handler()
|
|
529
631
|
def _json_format(self):
|
|
@@ -564,7 +666,7 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
564
666
|
material_data = layer["material"]
|
|
565
667
|
if material_data is not None:
|
|
566
668
|
material_name = layer["material"]["name"]
|
|
567
|
-
self.
|
|
669
|
+
self._pedb.materials.add_material(material_name, **material_data)
|
|
568
670
|
self.material = material_name
|
|
569
671
|
if layer["dielectric_fill"]:
|
|
570
672
|
if isinstance(layer["dielectric_fill"], str):
|
|
@@ -572,7 +674,7 @@ class StackupLayerEdbClass(LayerEdbClass):
|
|
|
572
674
|
else:
|
|
573
675
|
dielectric_data = layer["dielectric_fill"]
|
|
574
676
|
if dielectric_data is not None:
|
|
575
|
-
self.
|
|
677
|
+
self._pedb.materials.add_material(**dielectric_data)
|
|
576
678
|
self.dielectric_fill = layer["dielectric_fill"]["name"]
|
|
577
679
|
self.thickness = layer["thickness"]
|
|
578
680
|
self.etch_factor = layer["etch_factor"]
|