pyedb 0.22.1__py3-none-any.whl → 0.23.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/cfg_components.py +1 -1
- pyedb/configuration/cfg_ports_sources.py +3 -3
- pyedb/configuration/configuration.py +2 -2
- pyedb/dotnet/edb.py +20 -23
- pyedb/dotnet/edb_core/cell/hierarchy/component.py +1 -1
- pyedb/dotnet/edb_core/cell/terminal/terminal.py +1 -1
- pyedb/dotnet/edb_core/components.py +14 -13
- pyedb/dotnet/edb_core/edb_data/padstacks_data.py +2 -14
- pyedb/dotnet/edb_core/edb_data/simulation_configuration.py +0 -18
- pyedb/dotnet/edb_core/hfss.py +1 -1
- pyedb/dotnet/edb_core/materials.py +1 -1
- pyedb/dotnet/edb_core/modeler.py +1 -1
- pyedb/dotnet/edb_core/nets.py +3 -3
- pyedb/dotnet/edb_core/padstack.py +4 -4
- pyedb/dotnet/edb_core/siwave.py +1 -1
- pyedb/dotnet/edb_core/stackup.py +61 -84
- pyedb/ipc2581/ecad/cad_data/step.py +1 -1
- pyedb/ipc2581/ipc2581.py +2 -2
- {pyedb-0.22.1.dist-info → pyedb-0.23.0.dist-info}/METADATA +2 -2
- {pyedb-0.22.1.dist-info → pyedb-0.23.0.dist-info}/RECORD +23 -23
- {pyedb-0.22.1.dist-info → pyedb-0.23.0.dist-info}/LICENSE +0 -0
- {pyedb-0.22.1.dist-info → pyedb-0.23.0.dist-info}/WHEEL +0 -0
pyedb/__init__.py
CHANGED
|
@@ -155,7 +155,7 @@ class CfgComponents:
|
|
|
155
155
|
def _load_data_from_db(self):
|
|
156
156
|
self.components = []
|
|
157
157
|
comps_in_db = self._pedb.components
|
|
158
|
-
for _, comp in comps_in_db.
|
|
158
|
+
for _, comp in comps_in_db.instances.items():
|
|
159
159
|
cfg_comp = CfgComponent(
|
|
160
160
|
enabled=comp.enabled,
|
|
161
161
|
reference_designator=comp.name,
|
|
@@ -228,7 +228,7 @@ class CfgCircuitElement(CfgBase):
|
|
|
228
228
|
neg_obj = self._create_pin_group(pins)
|
|
229
229
|
pos_objs.update(neg_obj)
|
|
230
230
|
elif pos_type == "pin":
|
|
231
|
-
pins = {pos_value: self._pedb.components.
|
|
231
|
+
pins = {pos_value: self._pedb.components.instances[self.reference_designator].pins[pos_value]}
|
|
232
232
|
pos_objs.update(pins)
|
|
233
233
|
else:
|
|
234
234
|
raise f"Wrong positive terminal type {pos_type}"
|
|
@@ -263,7 +263,7 @@ class CfgCircuitElement(CfgBase):
|
|
|
263
263
|
# create pin group
|
|
264
264
|
neg_obj = self._create_pin_group(pins, True)
|
|
265
265
|
elif neg_type == "pin":
|
|
266
|
-
neg_obj = {neg_value: self._pedb.components.
|
|
266
|
+
neg_obj = {neg_value: self._pedb.components.instances[self.reference_designator].pins[neg_value]}
|
|
267
267
|
else:
|
|
268
268
|
raise f"Wrong negative terminal type {neg_type}"
|
|
269
269
|
self.neg_terminal = [
|
|
@@ -274,7 +274,7 @@ class CfgCircuitElement(CfgBase):
|
|
|
274
274
|
terminal_value = terminal_value if isinstance(terminal_value, list) else [terminal_value]
|
|
275
275
|
|
|
276
276
|
def get_pin_obj(pin_name):
|
|
277
|
-
return {pin_name: self._pedb.components.
|
|
277
|
+
return {pin_name: self._pedb.components.instances[self.reference_designator].pins[pin_name]}
|
|
278
278
|
|
|
279
279
|
pins = dict()
|
|
280
280
|
if terminal_type == "pin":
|
|
@@ -35,7 +35,7 @@ class Configuration:
|
|
|
35
35
|
|
|
36
36
|
def __init__(self, pedb):
|
|
37
37
|
self._pedb = pedb
|
|
38
|
-
self._components = self._pedb.components.
|
|
38
|
+
self._components = self._pedb.components.instances
|
|
39
39
|
self.data = {}
|
|
40
40
|
self._s_parameter_library = ""
|
|
41
41
|
self._spice_model_library = ""
|
|
@@ -210,7 +210,7 @@ class Configuration:
|
|
|
210
210
|
|
|
211
211
|
def _load_package_def(self):
|
|
212
212
|
"""Imports package definition information from JSON."""
|
|
213
|
-
comps = self._pedb.components.
|
|
213
|
+
comps = self._pedb.components.instances
|
|
214
214
|
for pkgd in self.data["package_definitions"]:
|
|
215
215
|
name = pkgd["name"]
|
|
216
216
|
if name in self._pedb.definitions.package:
|
pyedb/dotnet/edb.py
CHANGED
|
@@ -2396,7 +2396,7 @@ class Edb(Database):
|
|
|
2396
2396
|
self.logger.reset_timer()
|
|
2397
2397
|
|
|
2398
2398
|
i = 0
|
|
2399
|
-
for _, val in self.components.
|
|
2399
|
+
for _, val in self.components.instances.items():
|
|
2400
2400
|
if val.numpins == 0:
|
|
2401
2401
|
val.edbcomponent.Delete()
|
|
2402
2402
|
i += 1
|
|
@@ -2580,28 +2580,6 @@ class Edb(Database):
|
|
|
2580
2580
|
else:
|
|
2581
2581
|
return "{0}{1}".format(value, units)
|
|
2582
2582
|
|
|
2583
|
-
def arg_with_dim(self, Value, sUnits):
|
|
2584
|
-
"""Convert a number to a string with units. If value is a string, it's returned as is.
|
|
2585
|
-
|
|
2586
|
-
.. deprecated:: 0.6.56
|
|
2587
|
-
Use :func:`number_with_units` property instead.
|
|
2588
|
-
|
|
2589
|
-
Parameters
|
|
2590
|
-
----------
|
|
2591
|
-
Value : float, int, str
|
|
2592
|
-
Input number or string.
|
|
2593
|
-
sUnits : optional
|
|
2594
|
-
Units for formatting. The default is ``None``, which uses ``"meter"``.
|
|
2595
|
-
|
|
2596
|
-
Returns
|
|
2597
|
-
-------
|
|
2598
|
-
str
|
|
2599
|
-
String concatenating the value and unit.
|
|
2600
|
-
|
|
2601
|
-
"""
|
|
2602
|
-
warnings.warn("Use :func:`number_with_units` instead.", DeprecationWarning)
|
|
2603
|
-
return self.number_with_units(Value, sUnits)
|
|
2604
|
-
|
|
2605
2583
|
def _decompose_variable_value(self, value, unit_system=None):
|
|
2606
2584
|
val, units = decompose_variable_value(value)
|
|
2607
2585
|
if units and unit_system and units in AEDT_UNITS[unit_system]:
|
|
@@ -4128,6 +4106,7 @@ class Edb(Database):
|
|
|
4128
4106
|
open_aedb_at_end=True,
|
|
4129
4107
|
expand_polygons_size=0,
|
|
4130
4108
|
expand_voids_size=0,
|
|
4109
|
+
via_offset=True,
|
|
4131
4110
|
):
|
|
4132
4111
|
"""Assign automatically design and project variables with current values.
|
|
4133
4112
|
|
|
@@ -4163,6 +4142,12 @@ class Edb(Database):
|
|
|
4163
4142
|
Full path and name for the new AEDB file. If None, then current aedb will be cutout.
|
|
4164
4143
|
open_aedb_at_end : bool, optional
|
|
4165
4144
|
Whether to open the cutout at the end. The default is ``True``.
|
|
4145
|
+
expand_polygons_size : float, optional
|
|
4146
|
+
Expansion size on polygons. Polygons will be expanded in all directions. The default is ``0``.
|
|
4147
|
+
expand_voids_size : float, optional
|
|
4148
|
+
Expansion size on polygon voids. Polygons voids will be expanded in all directions. The default is ``0``.
|
|
4149
|
+
via_offset : bool, optional
|
|
4150
|
+
Whether if offset the via position or not. The default is ``True``.
|
|
4166
4151
|
|
|
4167
4152
|
Returns
|
|
4168
4153
|
-------
|
|
@@ -4326,6 +4311,18 @@ class Edb(Database):
|
|
|
4326
4311
|
antipad.parameters = {"XSize": var, "YSize": var2}
|
|
4327
4312
|
parameters.append(val)
|
|
4328
4313
|
parameters.append(val2)
|
|
4314
|
+
|
|
4315
|
+
if via_offset:
|
|
4316
|
+
var_x = "via_offset_x"
|
|
4317
|
+
if var_x not in self.variables:
|
|
4318
|
+
self.add_design_variable(var_x, 0.0)
|
|
4319
|
+
var_y = "via_offset_y"
|
|
4320
|
+
if var_y not in self.variables:
|
|
4321
|
+
self.add_design_variable(var_y, 0.0)
|
|
4322
|
+
for via in self.padstacks.instances.values():
|
|
4323
|
+
if not via.is_pin and (not trace_net_filter or (trace_net_filter and via.net_name in trace_net_filter)):
|
|
4324
|
+
via.position = [f"{via.position[0]}+via_offset_x", f"{via.position[1]}+via_offset_y"]
|
|
4325
|
+
|
|
4329
4326
|
if expand_polygons_size:
|
|
4330
4327
|
for poly in self.modeler.polygons:
|
|
4331
4328
|
if not poly.is_void:
|
|
@@ -958,7 +958,7 @@ class EDBComponent(Group):
|
|
|
958
958
|
opening.append(bounding_box[3] + extra_soldermask_clearance)
|
|
959
959
|
|
|
960
960
|
comp_layer = self.placement_layer
|
|
961
|
-
layer_names = list(self._pedb.stackup.
|
|
961
|
+
layer_names = list(self._pedb.stackup.layers.keys())
|
|
962
962
|
layer_index = layer_names.index(comp_layer)
|
|
963
963
|
if comp_layer in [layer_names[0] + layer_names[-1]]:
|
|
964
964
|
return False
|
|
@@ -418,7 +418,7 @@ class Terminal(Connectable):
|
|
|
418
418
|
if gnd_net is not None:
|
|
419
419
|
power_ground_net_names = [gnd_net]
|
|
420
420
|
else:
|
|
421
|
-
power_ground_net_names = [net for net in self._pedb.nets.
|
|
421
|
+
power_ground_net_names = [net for net in self._pedb.nets.power.keys()]
|
|
422
422
|
comp_ref_pins = [i for i in pin_list if i.GetNet().GetName() in power_ground_net_names]
|
|
423
423
|
if len(comp_ref_pins) == 0: # pragma: no cover
|
|
424
424
|
self._pedb.logger.error(
|
|
@@ -133,7 +133,7 @@ class Components(object):
|
|
|
133
133
|
return self._pedb.edb_api
|
|
134
134
|
|
|
135
135
|
def _init_parts(self):
|
|
136
|
-
a = self.
|
|
136
|
+
a = self.instances
|
|
137
137
|
a = self.resistors
|
|
138
138
|
a = self.ICs
|
|
139
139
|
a = self.Others
|
|
@@ -202,7 +202,7 @@ class Components(object):
|
|
|
202
202
|
|
|
203
203
|
>>> from pyedb import Edb
|
|
204
204
|
>>> edbapp = Edb("myaedbfolder")
|
|
205
|
-
>>> edbapp.components.
|
|
205
|
+
>>> edbapp.components.instances
|
|
206
206
|
|
|
207
207
|
"""
|
|
208
208
|
if not self._cmp:
|
|
@@ -980,12 +980,7 @@ class Components(object):
|
|
|
980
980
|
"""
|
|
981
981
|
if isinstance(component, str):
|
|
982
982
|
component = self.instances[component].edbcomponent
|
|
983
|
-
|
|
984
|
-
solder_balls_height = self.instances[component.GetName()].solder_ball_height
|
|
985
|
-
if not solder_balls_size:
|
|
986
|
-
solder_balls_size = self.instances[component.GetName()].solder_ball_diameter[0]
|
|
987
|
-
if not solder_balls_mid_size:
|
|
988
|
-
solder_balls_mid_size = self.instances[component.GetName()].solder_ball_diameter[1]
|
|
983
|
+
|
|
989
984
|
if not isinstance(net_list, list):
|
|
990
985
|
net_list = [net_list]
|
|
991
986
|
for net in net_list:
|
|
@@ -1011,6 +1006,12 @@ class Components(object):
|
|
|
1011
1006
|
return False
|
|
1012
1007
|
pin_layers = cmp_pins[0].GetPadstackDef().GetData().GetLayerNames()
|
|
1013
1008
|
if port_type == SourceType.CoaxPort:
|
|
1009
|
+
if not solder_balls_height:
|
|
1010
|
+
solder_balls_height = self.instances[component.GetName()].solder_ball_height
|
|
1011
|
+
if not solder_balls_size:
|
|
1012
|
+
solder_balls_size = self.instances[component.GetName()].solder_ball_diameter[0]
|
|
1013
|
+
if not solder_balls_mid_size:
|
|
1014
|
+
solder_balls_mid_size = self.instances[component.GetName()].solder_ball_diameter[1]
|
|
1014
1015
|
ref_pins = [
|
|
1015
1016
|
p
|
|
1016
1017
|
for p in list(component.LayoutObjs)
|
|
@@ -2256,7 +2257,7 @@ class Components(object):
|
|
|
2256
2257
|
self.set_component_rlc(new_refdes, ind_value=new_value)
|
|
2257
2258
|
unmount_comp_list.remove(new_refdes)
|
|
2258
2259
|
for comp in unmount_comp_list:
|
|
2259
|
-
self.
|
|
2260
|
+
self.instances[comp].is_enabled = False
|
|
2260
2261
|
return found
|
|
2261
2262
|
|
|
2262
2263
|
def import_bom(
|
|
@@ -2301,7 +2302,7 @@ class Components(object):
|
|
|
2301
2302
|
l = l.split(delimiter)
|
|
2302
2303
|
|
|
2303
2304
|
refdes = l[refdes_col]
|
|
2304
|
-
comp = self.
|
|
2305
|
+
comp = self.instances[refdes]
|
|
2305
2306
|
if not part_name_col == None:
|
|
2306
2307
|
part_name = l[part_name_col]
|
|
2307
2308
|
if comp.partname == part_name:
|
|
@@ -2323,7 +2324,7 @@ class Components(object):
|
|
|
2323
2324
|
|
|
2324
2325
|
self.create(pinlist, refdes, p_layer, part_name)
|
|
2325
2326
|
self.refresh_components()
|
|
2326
|
-
comp = self.
|
|
2327
|
+
comp = self.instances[refdes]
|
|
2327
2328
|
|
|
2328
2329
|
comp_type = l[comp_type_col]
|
|
2329
2330
|
if comp_type.capitalize() in ["Resistor", "Capacitor", "Inductor", "Other"]:
|
|
@@ -2346,7 +2347,7 @@ class Components(object):
|
|
|
2346
2347
|
elif comp_type == "Inductor":
|
|
2347
2348
|
self.set_component_rlc(refdes, ind_value=value)
|
|
2348
2349
|
for comp in unmount_comp_list:
|
|
2349
|
-
self.
|
|
2350
|
+
self.instances[comp].is_enabled = False
|
|
2350
2351
|
return True
|
|
2351
2352
|
|
|
2352
2353
|
def export_bom(self, bom_file, delimiter=","):
|
|
@@ -2707,7 +2708,7 @@ class Components(object):
|
|
|
2707
2708
|
>>> edbapp.components.short_component_pins("J4A2", ["G4", "9", "3"])
|
|
2708
2709
|
|
|
2709
2710
|
"""
|
|
2710
|
-
component = self.
|
|
2711
|
+
component = self.instances[component_name]
|
|
2711
2712
|
pins = component.pins
|
|
2712
2713
|
pins_list = []
|
|
2713
2714
|
|
|
@@ -726,9 +726,7 @@ class EDBPadstack(object):
|
|
|
726
726
|
-------
|
|
727
727
|
dict
|
|
728
728
|
"""
|
|
729
|
-
return {
|
|
730
|
-
id: via for id, via in self._ppadstack.padstack_instances.items() if via.padstack_definition == self.name
|
|
731
|
-
}
|
|
729
|
+
return {id: via for id, via in self._ppadstack.instances.items() if via.padstack_definition == self.name}
|
|
732
730
|
|
|
733
731
|
@property
|
|
734
732
|
def hole_range(self):
|
|
@@ -801,7 +799,7 @@ class EDBPadstack(object):
|
|
|
801
799
|
layer_names = [i for i in list(layers.keys())]
|
|
802
800
|
if convert_only_signal_vias:
|
|
803
801
|
signal_nets = [i for i in list(self._ppadstack._pedb.nets.signal_nets.keys())]
|
|
804
|
-
topl, topz, bottoml, bottomz = self._ppadstack._pedb.stackup.
|
|
802
|
+
topl, topz, bottoml, bottomz = self._ppadstack._pedb.stackup.limits(True)
|
|
805
803
|
if self.via_start_layer in layers:
|
|
806
804
|
start_elevation = layers[self.via_start_layer].lower_elevation
|
|
807
805
|
else:
|
|
@@ -1771,16 +1769,6 @@ class EDBPadstackInstance(Primitive):
|
|
|
1771
1769
|
self.position = [var_name + "X", var_name + "Y"]
|
|
1772
1770
|
return [var_name + "X", var_name + "Y"]
|
|
1773
1771
|
|
|
1774
|
-
def delete_padstack_instance(self):
|
|
1775
|
-
"""Delete this padstack instance.
|
|
1776
|
-
|
|
1777
|
-
.. deprecated:: 0.6.28
|
|
1778
|
-
Use :func:`delete` property instead.
|
|
1779
|
-
"""
|
|
1780
|
-
warnings.warn("`delete_padstack_instance` is deprecated. Use `delete` instead.", DeprecationWarning)
|
|
1781
|
-
self._edb_padstackinstance.Delete()
|
|
1782
|
-
return True
|
|
1783
|
-
|
|
1784
1772
|
def in_voids(self, net_name=None, layer_name=None):
|
|
1785
1773
|
"""Check if this padstack instance is in any void.
|
|
1786
1774
|
|
|
@@ -2450,24 +2450,6 @@ class SimulationConfiguration(object):
|
|
|
2450
2450
|
self._dc_source_terms_to_ground[source_name] = node_to_ground
|
|
2451
2451
|
|
|
2452
2452
|
def _read_cfg(self): # pragma: no cover
|
|
2453
|
-
"""Configuration file reader.
|
|
2454
|
-
|
|
2455
|
-
.. deprecated:: 0.6.78
|
|
2456
|
-
Use :func:`import_json` instead.
|
|
2457
|
-
|
|
2458
|
-
Examples
|
|
2459
|
-
--------
|
|
2460
|
-
|
|
2461
|
-
>>> from pyedb import Edb
|
|
2462
|
-
>>> config_file = path_configuration_file
|
|
2463
|
-
>>> source_file = path_to_edb_folder
|
|
2464
|
-
>>> edb = Edb(source_file)
|
|
2465
|
-
>>> sim_setup = SimulationConfiguration(config_file)
|
|
2466
|
-
>>> edb.build_simulation_project(sim_setup)
|
|
2467
|
-
>>> edb.save_edb()
|
|
2468
|
-
>>> edb.close_edb()
|
|
2469
|
-
"""
|
|
2470
|
-
|
|
2471
2453
|
if not self.filename or not os.path.exists(self.filename):
|
|
2472
2454
|
# raise Exception("{} does not exist.".format(self.filename))
|
|
2473
2455
|
return
|
pyedb/dotnet/edb_core/hfss.py
CHANGED
|
@@ -453,7 +453,7 @@ class EdbHfss(object):
|
|
|
453
453
|
if not isinstance(net_list, list):
|
|
454
454
|
net_list = [net_list]
|
|
455
455
|
for ref in ref_des_list:
|
|
456
|
-
for _, py_inst in self._pedb.components.
|
|
456
|
+
for _, py_inst in self._pedb.components.instances[ref].pins.items():
|
|
457
457
|
if py_inst.net_name in net_list and py_inst.is_pin:
|
|
458
458
|
port_name = "{}_{}_{}".format(ref, py_inst.net_name, py_inst.pin.GetName())
|
|
459
459
|
(
|
|
@@ -1035,7 +1035,7 @@ class Materials(object):
|
|
|
1035
1035
|
amat_file = os.path.join(self.__edb.base_path, "syslib", "Materials.amat")
|
|
1036
1036
|
for material in self.iterate_materials_in_amat(amat_file):
|
|
1037
1037
|
iter_material_name = material["name"]
|
|
1038
|
-
if iter_material_name == material_name:
|
|
1038
|
+
if iter_material_name == material_name or iter_material_name.lower() == material_name.lower():
|
|
1039
1039
|
for material_property, value in material.items():
|
|
1040
1040
|
if material_property != "name":
|
|
1041
1041
|
res[material_property] = value
|
pyedb/dotnet/edb_core/modeler.py
CHANGED
|
@@ -1320,7 +1320,7 @@ class Modeler(object):
|
|
|
1320
1320
|
|
|
1321
1321
|
"""
|
|
1322
1322
|
stat_model = EDBStatistics()
|
|
1323
|
-
stat_model.num_layers = len(list(self._pedb.stackup.
|
|
1323
|
+
stat_model.num_layers = len(list(self._pedb.stackup.layers.values()))
|
|
1324
1324
|
stat_model.num_capacitors = len(self._pedb.components.capacitors)
|
|
1325
1325
|
stat_model.num_resistors = len(self._pedb.components.resistors)
|
|
1326
1326
|
stat_model.num_inductors = len(self._pedb.components.inductors)
|
pyedb/dotnet/edb_core/nets.py
CHANGED
|
@@ -521,7 +521,7 @@ class EdbNets(object):
|
|
|
521
521
|
bottom_layer = list(self._pedb.stackup.signal_layers.keys())[-1]
|
|
522
522
|
if plot_components_on_top or plot_components_on_bottom:
|
|
523
523
|
nc = 0
|
|
524
|
-
for comp in self._pedb.components.
|
|
524
|
+
for comp in self._pedb.components.instances.values():
|
|
525
525
|
if not comp.is_enabled:
|
|
526
526
|
continue
|
|
527
527
|
net_names = comp.nets
|
|
@@ -1149,9 +1149,9 @@ class EdbNets(object):
|
|
|
1149
1149
|
``True`` if the net is found in component pins.
|
|
1150
1150
|
|
|
1151
1151
|
"""
|
|
1152
|
-
if component_name not in self._pedb.components.
|
|
1152
|
+
if component_name not in self._pedb.components.instances:
|
|
1153
1153
|
return False
|
|
1154
|
-
for net in self._pedb.components.
|
|
1154
|
+
for net in self._pedb.components.instances[component_name].nets:
|
|
1155
1155
|
if net_name == net:
|
|
1156
1156
|
return True
|
|
1157
1157
|
return False
|
|
@@ -108,7 +108,7 @@ class EdbPadstacks(object):
|
|
|
108
108
|
@property
|
|
109
109
|
def _layers(self):
|
|
110
110
|
""" """
|
|
111
|
-
return self._pedb.stackup.
|
|
111
|
+
return self._pedb.stackup.layers
|
|
112
112
|
|
|
113
113
|
def int_to_pad_type(self, val=0):
|
|
114
114
|
"""Convert an integer to an EDB.PadGeometryType.
|
|
@@ -592,13 +592,13 @@ class EdbPadstacks(object):
|
|
|
592
592
|
"""
|
|
593
593
|
pinlist = []
|
|
594
594
|
if refdes:
|
|
595
|
-
if refdes in self._pedb.components.
|
|
595
|
+
if refdes in self._pedb.components.instances:
|
|
596
596
|
if netname:
|
|
597
|
-
for pin, val in self._pedb.components.
|
|
597
|
+
for pin, val in self._pedb.components.instances[refdes].pins.items():
|
|
598
598
|
if val.net_name == netname:
|
|
599
599
|
pinlist.append(val)
|
|
600
600
|
else:
|
|
601
|
-
for pin in self._pedb.components.
|
|
601
|
+
for pin in self._pedb.components.instances[refdes].pins.values():
|
|
602
602
|
pinlist.append(pin)
|
|
603
603
|
elif netname:
|
|
604
604
|
for pin in self._pedb.pins:
|
pyedb/dotnet/edb_core/siwave.py
CHANGED
|
@@ -1235,7 +1235,7 @@ class EdbSiwave(object):
|
|
|
1235
1235
|
pin_numbers = [str(p) for p in pin_numbers]
|
|
1236
1236
|
if group_name is None:
|
|
1237
1237
|
group_name = self._edb.cell.hierarchy.pin_group.GetUniqueName(self._active_layout)
|
|
1238
|
-
comp = self._pedb.components.
|
|
1238
|
+
comp = self._pedb.components.instances[reference_designator]
|
|
1239
1239
|
pins = [pin.pin for name, pin in comp.pins.items() if name in pin_numbers]
|
|
1240
1240
|
edb_pingroup = self._edb.cell.hierarchy.pin_group.Create(
|
|
1241
1241
|
self._active_layout, group_name, convert_py_list_to_net_list(pins)
|
pyedb/dotnet/edb_core/stackup.py
CHANGED
|
@@ -246,7 +246,7 @@ class LayerCollection(object):
|
|
|
246
246
|
|
|
247
247
|
obj = False
|
|
248
248
|
# Add stackup layers
|
|
249
|
-
for _, i in self.
|
|
249
|
+
for _, i in self.layers.items():
|
|
250
250
|
if i.id == layer_clone.id: # replace layer
|
|
251
251
|
add_method(layer_clone._edb_object)
|
|
252
252
|
obj = layer_clone
|
|
@@ -355,7 +355,7 @@ class Stackup(LayerCollection):
|
|
|
355
355
|
layer number.
|
|
356
356
|
|
|
357
357
|
"""
|
|
358
|
-
return len(list(self.
|
|
358
|
+
return len(list(self.layers.keys()))
|
|
359
359
|
|
|
360
360
|
def _int_to_layer_types(self, val):
|
|
361
361
|
if int(val) == 0:
|
|
@@ -513,8 +513,8 @@ class Stackup(LayerCollection):
|
|
|
513
513
|
fillMaterial=dielectric_material,
|
|
514
514
|
method="add_on_bottom",
|
|
515
515
|
)
|
|
516
|
-
self.
|
|
517
|
-
self.
|
|
516
|
+
self.layers["TOP"].dielectric_fill = "SolderMask"
|
|
517
|
+
self.layers["BOT"].dielectric_fill = "SolderMask"
|
|
518
518
|
|
|
519
519
|
for layer_num in np.arange(int(layer_count / 2), 1, -1):
|
|
520
520
|
# Generate upper half
|
|
@@ -843,18 +843,20 @@ class Stackup(LayerCollection):
|
|
|
843
843
|
|
|
844
844
|
materials = self._pedb.materials
|
|
845
845
|
if material not in materials:
|
|
846
|
-
logger.warning(
|
|
847
|
-
f"Material '{material}' does not exist in material library. Intempt to create it from syslib."
|
|
848
|
-
)
|
|
849
846
|
material_properties = self._pedb.materials.read_syslib_material(material)
|
|
850
|
-
|
|
847
|
+
if material_properties:
|
|
848
|
+
logger.info(f"Material {material} found in syslib. Adding it to aedb project.")
|
|
849
|
+
materials.add_material(material, **material_properties)
|
|
850
|
+
else:
|
|
851
|
+
logger.warning(f"Material {material} not found. Check the library and retry.")
|
|
851
852
|
|
|
852
853
|
if layer_type != "dielectric" and fillMaterial not in materials:
|
|
853
|
-
logger.warning(
|
|
854
|
-
f"Material '{fillMaterial}' does not exist in material library. Intempt to create it from syslib."
|
|
855
|
-
)
|
|
856
854
|
material_properties = self._pedb.materials.read_syslib_material(fillMaterial)
|
|
857
|
-
|
|
855
|
+
if material_properties:
|
|
856
|
+
logger.info(f"Material {fillMaterial} found in syslib. Adding it to aedb project.")
|
|
857
|
+
materials.add_material(fillMaterial, **material_properties)
|
|
858
|
+
else:
|
|
859
|
+
logger.warning(f"Material {fillMaterial} not found. Check the library and retry.")
|
|
858
860
|
|
|
859
861
|
if layer_type in ["signal", "dielectric"]:
|
|
860
862
|
new_layer = self._create_stackup_layer(layer_name, thickness, layer_type)
|
|
@@ -977,7 +979,7 @@ class Stackup(LayerCollection):
|
|
|
977
979
|
"Thickness": [],
|
|
978
980
|
}
|
|
979
981
|
idx = []
|
|
980
|
-
for lyr in self.
|
|
982
|
+
for lyr in self.layers.values():
|
|
981
983
|
idx.append(lyr.name)
|
|
982
984
|
data["Type"].append(lyr.type)
|
|
983
985
|
data["Material"].append(lyr.material)
|
|
@@ -1000,7 +1002,7 @@ class Stackup(LayerCollection):
|
|
|
1000
1002
|
for material_name, material in self._pedb.materials.materials.items():
|
|
1001
1003
|
material_out[material_name] = material.to_dict()
|
|
1002
1004
|
layers_out = {}
|
|
1003
|
-
for k, v in self.
|
|
1005
|
+
for k, v in self.layers.items():
|
|
1004
1006
|
data = v._json_format()
|
|
1005
1007
|
# FIXME: Update the API to avoid providing following information to our users
|
|
1006
1008
|
del data["pedb"]
|
|
@@ -1044,16 +1046,16 @@ class Stackup(LayerCollection):
|
|
|
1044
1046
|
else:
|
|
1045
1047
|
self._pedb.materials.update_material(material_name, material)
|
|
1046
1048
|
if k == "layers":
|
|
1047
|
-
if len(list(v.values())) == len(list(self.
|
|
1049
|
+
if len(list(v.values())) == len(list(self.layers.values())):
|
|
1048
1050
|
imported_layers_list = [l_dict["name"] for l_dict in list(v.values())]
|
|
1049
|
-
layout_layer_list = list(self.
|
|
1051
|
+
layout_layer_list = list(self.layers.keys())
|
|
1050
1052
|
for layer_name in imported_layers_list:
|
|
1051
1053
|
layer_index = imported_layers_list.index(layer_name)
|
|
1052
1054
|
if layout_layer_list[layer_index] != layer_name:
|
|
1053
|
-
self.
|
|
1055
|
+
self.layers[layout_layer_list[layer_index]].name = layer_name
|
|
1054
1056
|
prev_layer = None
|
|
1055
1057
|
for layer_name, layer in v.items():
|
|
1056
|
-
if layer["name"] not in self.
|
|
1058
|
+
if layer["name"] not in self.layers:
|
|
1057
1059
|
if not prev_layer:
|
|
1058
1060
|
self.add_layer(
|
|
1059
1061
|
layer_name,
|
|
@@ -1075,8 +1077,8 @@ class Stackup(LayerCollection):
|
|
|
1075
1077
|
thickness=layer["thickness"],
|
|
1076
1078
|
)
|
|
1077
1079
|
prev_layer = layer_name
|
|
1078
|
-
if layer_name in self.
|
|
1079
|
-
self.
|
|
1080
|
+
if layer_name in self.layers:
|
|
1081
|
+
self.layers[layer["name"]]._load_layer(layer)
|
|
1080
1082
|
self.refresh_layer_collection()
|
|
1081
1083
|
return True
|
|
1082
1084
|
|
|
@@ -1205,7 +1207,7 @@ class Stackup(LayerCollection):
|
|
|
1205
1207
|
new_lc.AddLayers(layer_list)
|
|
1206
1208
|
self._pedb.layout.layer_collection = new_lc
|
|
1207
1209
|
|
|
1208
|
-
for pyaedt_cmp in list(self._pedb.components.
|
|
1210
|
+
for pyaedt_cmp in list(self._pedb.components.instances.values()):
|
|
1209
1211
|
cmp = pyaedt_cmp.edbcomponent
|
|
1210
1212
|
cmp_type = cmp.GetComponentType()
|
|
1211
1213
|
cmp_prop = cmp.GetComponentProperty().Clone()
|
|
@@ -1257,7 +1259,7 @@ class Stackup(LayerCollection):
|
|
|
1257
1259
|
float
|
|
1258
1260
|
The thickness value.
|
|
1259
1261
|
"""
|
|
1260
|
-
layers = list(self.
|
|
1262
|
+
layers = list(self.layers.values())
|
|
1261
1263
|
layers.sort(key=lambda lay: lay.lower_elevation)
|
|
1262
1264
|
thickness = 0
|
|
1263
1265
|
if layers:
|
|
@@ -1267,13 +1269,13 @@ class Stackup(LayerCollection):
|
|
|
1267
1269
|
return round(thickness, 7)
|
|
1268
1270
|
|
|
1269
1271
|
def _get_solder_height(self, layer_name):
|
|
1270
|
-
for _, val in self._pedb.components.
|
|
1272
|
+
for _, val in self._pedb.components.instances.items():
|
|
1271
1273
|
if val.solder_ball_height and val.placement_layer == layer_name:
|
|
1272
1274
|
return val.solder_ball_height
|
|
1273
1275
|
return 0
|
|
1274
1276
|
|
|
1275
1277
|
def _remove_solder_pec(self, layer_name):
|
|
1276
|
-
for _, val in self._pedb.components.
|
|
1278
|
+
for _, val in self._pedb.components.instances.items():
|
|
1277
1279
|
if val.solder_ball_height and val.placement_layer == layer_name:
|
|
1278
1280
|
comp_prop = val.component_property
|
|
1279
1281
|
port_property = comp_prop.GetPortProperty().Clone()
|
|
@@ -1291,19 +1293,19 @@ class Stackup(LayerCollection):
|
|
|
1291
1293
|
-------
|
|
1292
1294
|
bool
|
|
1293
1295
|
"""
|
|
1294
|
-
for el, val in self._pedb.components.
|
|
1296
|
+
for el, val in self._pedb.components.instances.items():
|
|
1295
1297
|
if val.solder_ball_height:
|
|
1296
1298
|
layer = val.placement_layer
|
|
1297
|
-
if layer == list(self.
|
|
1299
|
+
if layer == list(self.layers.keys())[0]:
|
|
1298
1300
|
self.add_layer(
|
|
1299
1301
|
"Bottom_air",
|
|
1300
|
-
base_layer=list(self.
|
|
1302
|
+
base_layer=list(self.layers.keys())[-1],
|
|
1301
1303
|
method="insert_below",
|
|
1302
1304
|
material="air",
|
|
1303
1305
|
thickness=val.solder_ball_height,
|
|
1304
1306
|
layer_type="dielectric",
|
|
1305
1307
|
)
|
|
1306
|
-
elif layer == list(self.
|
|
1308
|
+
elif layer == list(self.layers.keys())[-1]:
|
|
1307
1309
|
self.add_layer(
|
|
1308
1310
|
"Top_Air",
|
|
1309
1311
|
base_layer=layer,
|
|
@@ -1312,10 +1314,10 @@ class Stackup(LayerCollection):
|
|
|
1312
1314
|
layer_type="dielectric",
|
|
1313
1315
|
)
|
|
1314
1316
|
elif layer == list(self.signal_layers.keys())[-1]:
|
|
1315
|
-
list(self.
|
|
1317
|
+
list(self.layers.values())[-1].thickness = val.solder_ball_height
|
|
1316
1318
|
|
|
1317
1319
|
elif layer == list(self.signal_layers.keys())[0]:
|
|
1318
|
-
list(self.
|
|
1320
|
+
list(self.layers.values())[0].thickness = val.solder_ball_height
|
|
1319
1321
|
return True
|
|
1320
1322
|
|
|
1321
1323
|
def place_in_layout(
|
|
@@ -1816,36 +1818,37 @@ class Stackup(LayerCollection):
|
|
|
1816
1818
|
def _import_dict(self, json_dict, rename=False):
|
|
1817
1819
|
"""Import stackup from a dictionary."""
|
|
1818
1820
|
if not "materials" in json_dict:
|
|
1819
|
-
self._logger.
|
|
1820
|
-
self._logger.warning(
|
|
1821
|
-
"Please check your json or xml file, if no material are defined your project will"
|
|
1822
|
-
"likely fail to simulate"
|
|
1823
|
-
)
|
|
1821
|
+
self._logger.info("Configuration file does not have material definition. Using aedb and syslib materials.")
|
|
1824
1822
|
else:
|
|
1825
1823
|
mats = json_dict["materials"]
|
|
1826
|
-
for material in mats.
|
|
1827
|
-
|
|
1828
|
-
|
|
1824
|
+
for name, material in mats.items():
|
|
1825
|
+
try:
|
|
1826
|
+
material_name = material["name"]
|
|
1827
|
+
del material["name"]
|
|
1828
|
+
except KeyError:
|
|
1829
|
+
material_name = name
|
|
1829
1830
|
if material_name not in self._pedb.materials:
|
|
1830
1831
|
self._pedb.materials.add_material(material_name, **material)
|
|
1831
1832
|
else:
|
|
1832
1833
|
self._pedb.materials.update_material(material_name, material)
|
|
1833
|
-
temp =
|
|
1834
|
+
temp = json_dict
|
|
1835
|
+
if "layers" in json_dict:
|
|
1836
|
+
temp = {i: j for i, j in json_dict["layers"].items() if j["type"] in ["signal", "dielectric"]}
|
|
1834
1837
|
config_file_layers = list(temp.keys())
|
|
1835
|
-
layout_layers = list(self.
|
|
1838
|
+
layout_layers = list(self.layers.keys())
|
|
1836
1839
|
renamed_layers = {}
|
|
1837
1840
|
if rename and len(config_file_layers) == len(layout_layers):
|
|
1838
1841
|
for lay_ind in range(len(list(temp.keys()))):
|
|
1839
1842
|
if not config_file_layers[lay_ind] == layout_layers[lay_ind]:
|
|
1840
1843
|
renamed_layers[layout_layers[lay_ind]] = config_file_layers[lay_ind]
|
|
1841
|
-
layers_names = list(self.
|
|
1844
|
+
layers_names = list(self.layers.keys())[::]
|
|
1842
1845
|
for name in layers_names:
|
|
1843
1846
|
layer = None
|
|
1844
1847
|
if name in temp:
|
|
1845
1848
|
layer = temp[name]
|
|
1846
1849
|
elif name in renamed_layers:
|
|
1847
1850
|
layer = temp[renamed_layers[name]]
|
|
1848
|
-
self.
|
|
1851
|
+
self.layers[name].name = renamed_layers[name]
|
|
1849
1852
|
name = renamed_layers[name]
|
|
1850
1853
|
else: # Remove layers not in config file.
|
|
1851
1854
|
self.remove_layer(name)
|
|
@@ -1876,9 +1879,9 @@ class Stackup(LayerCollection):
|
|
|
1876
1879
|
|
|
1877
1880
|
for k, v in layer.items():
|
|
1878
1881
|
default_layer[k] = v
|
|
1879
|
-
self.
|
|
1882
|
+
self.layers[name]._load_layer(default_layer)
|
|
1880
1883
|
for layer_name, layer in temp.items(): # looping over potential new layers to add
|
|
1881
|
-
if layer_name in self.
|
|
1884
|
+
if layer_name in self.layers:
|
|
1882
1885
|
continue # if layer exist, skip
|
|
1883
1886
|
# adding layer
|
|
1884
1887
|
default_layer = {
|
|
@@ -1974,7 +1977,7 @@ class Stackup(LayerCollection):
|
|
|
1974
1977
|
|
|
1975
1978
|
df = pd.read_csv(file_path, index_col=0)
|
|
1976
1979
|
|
|
1977
|
-
for name in self.
|
|
1980
|
+
for name in self.layers.keys(): # pragma: no cover
|
|
1978
1981
|
if not name in df.index:
|
|
1979
1982
|
logger.error("{} doesn't exist in csv".format(name))
|
|
1980
1983
|
return False
|
|
@@ -2028,7 +2031,7 @@ class Stackup(LayerCollection):
|
|
|
2028
2031
|
for name, val in layers.items():
|
|
2029
2032
|
etching_factor = float(val["EtchFactor"]) if "EtchFactor" in val else None
|
|
2030
2033
|
|
|
2031
|
-
if not self.
|
|
2034
|
+
if not self.layers:
|
|
2032
2035
|
self.add_layer(
|
|
2033
2036
|
name,
|
|
2034
2037
|
None,
|
|
@@ -2040,8 +2043,8 @@ class Stackup(LayerCollection):
|
|
|
2040
2043
|
etching_factor,
|
|
2041
2044
|
)
|
|
2042
2045
|
else:
|
|
2043
|
-
if name in self.
|
|
2044
|
-
lyr = self.
|
|
2046
|
+
if name in self.layers.keys():
|
|
2047
|
+
lyr = self.layers[name]
|
|
2045
2048
|
lyr.type = val["Type"]
|
|
2046
2049
|
lyr.material = val["Material"]
|
|
2047
2050
|
lyr.dielectric_fill = val["FillMaterial"] if val["Type"] == "signal" else ""
|
|
@@ -2049,10 +2052,10 @@ class Stackup(LayerCollection):
|
|
|
2049
2052
|
if prev_layer:
|
|
2050
2053
|
self._set_layout_stackup(lyr._edb_layer, "change_position", prev_layer)
|
|
2051
2054
|
else:
|
|
2052
|
-
if prev_layer and prev_layer in self.
|
|
2055
|
+
if prev_layer and prev_layer in self.layers:
|
|
2053
2056
|
layer_name = prev_layer
|
|
2054
2057
|
else:
|
|
2055
|
-
layer_name = list(self.
|
|
2058
|
+
layer_name = list(self.layers.keys())[-1] if self.layers else None
|
|
2056
2059
|
self.add_layer(
|
|
2057
2060
|
name,
|
|
2058
2061
|
layer_name,
|
|
@@ -2064,7 +2067,7 @@ class Stackup(LayerCollection):
|
|
|
2064
2067
|
etching_factor,
|
|
2065
2068
|
)
|
|
2066
2069
|
prev_layer = name
|
|
2067
|
-
for name in self.
|
|
2070
|
+
for name in self.layers:
|
|
2068
2071
|
if name not in layers:
|
|
2069
2072
|
self.remove_layer(name)
|
|
2070
2073
|
|
|
@@ -2141,7 +2144,7 @@ class Stackup(LayerCollection):
|
|
|
2141
2144
|
"""
|
|
2142
2145
|
layers = OrderedDict()
|
|
2143
2146
|
roughness_models = OrderedDict()
|
|
2144
|
-
for name, val in self.
|
|
2147
|
+
for name, val in self.layers.items():
|
|
2145
2148
|
layer = dict()
|
|
2146
2149
|
layer["Material"] = val.material
|
|
2147
2150
|
layer["Name"] = val.name
|
|
@@ -2354,12 +2357,12 @@ class Stackup(LayerCollection):
|
|
|
2354
2357
|
|
|
2355
2358
|
Parameters
|
|
2356
2359
|
----------
|
|
2357
|
-
file_path : str
|
|
2358
|
-
Path to stackup file.
|
|
2360
|
+
file_path : str, dict
|
|
2361
|
+
Path to stackup file or dict with stackup details.
|
|
2359
2362
|
rename : bool
|
|
2360
2363
|
If rename is ``False`` then layer in layout not found in the stackup file are deleted.
|
|
2361
2364
|
Otherwise, if the number of layer in the stackup file equals the number of stackup layer
|
|
2362
|
-
in the layout, layers are renamed according the
|
|
2365
|
+
in the layout, layers are renamed according the file.
|
|
2363
2366
|
Note that layer order matters, and has to be writtent from top to bottom layer in the file.
|
|
2364
2367
|
|
|
2365
2368
|
Returns
|
|
@@ -2385,32 +2388,6 @@ class Stackup(LayerCollection):
|
|
|
2385
2388
|
else:
|
|
2386
2389
|
return False
|
|
2387
2390
|
|
|
2388
|
-
def import_stackup(self, file_path):
|
|
2389
|
-
"""Import stackup from a file. The file format can be XML, CSV, or JSON.
|
|
2390
|
-
|
|
2391
|
-
.. deprecated:: 0.6.61
|
|
2392
|
-
Use :func:`load` instead.
|
|
2393
|
-
|
|
2394
|
-
Parameters
|
|
2395
|
-
----------
|
|
2396
|
-
file_path : str
|
|
2397
|
-
Path to stackup file.
|
|
2398
|
-
|
|
2399
|
-
Returns
|
|
2400
|
-
-------
|
|
2401
|
-
bool
|
|
2402
|
-
``True`` when successful, ``False`` when failed.
|
|
2403
|
-
|
|
2404
|
-
Examples
|
|
2405
|
-
--------
|
|
2406
|
-
>>> from pyedb import Edb
|
|
2407
|
-
>>> edb = Edb()
|
|
2408
|
-
>>> edb.stackup.import_stackup("stackup.xml")
|
|
2409
|
-
"""
|
|
2410
|
-
|
|
2411
|
-
self._logger.warning("Method import_stackup is deprecated. Use .load")
|
|
2412
|
-
return self.load(file_path)
|
|
2413
|
-
|
|
2414
2391
|
def plot(
|
|
2415
2392
|
self,
|
|
2416
2393
|
save_plot=None,
|
|
@@ -2452,7 +2429,7 @@ class Stackup(LayerCollection):
|
|
|
2452
2429
|
from pyedb.generic.constants import CSS4_COLORS
|
|
2453
2430
|
from pyedb.generic.plot import plot_matplotlib
|
|
2454
2431
|
|
|
2455
|
-
layer_names = list(self.
|
|
2432
|
+
layer_names = list(self.layers.keys())
|
|
2456
2433
|
if first_layer is None or first_layer not in layer_names:
|
|
2457
2434
|
bottom_layer = layer_names[-1]
|
|
2458
2435
|
elif isinstance(first_layer, str):
|
|
@@ -2470,14 +2447,14 @@ class Stackup(LayerCollection):
|
|
|
2470
2447
|
else:
|
|
2471
2448
|
raise AttributeError("last_layer must be str or class `dotnet.edb_core.edb_data.layer_data.LayerEdbClass`")
|
|
2472
2449
|
|
|
2473
|
-
stackup_mode = self.
|
|
2450
|
+
stackup_mode = self.mode
|
|
2474
2451
|
if stackup_mode not in ["Laminate", "Overlapping"]:
|
|
2475
2452
|
raise AttributeError("stackup plot supports only 'Laminate' and 'Overlapping' stackup types.")
|
|
2476
2453
|
|
|
2477
2454
|
# build the layers data
|
|
2478
2455
|
layers_data = []
|
|
2479
2456
|
skip_flag = True
|
|
2480
|
-
for layer in self.
|
|
2457
|
+
for layer in self.layers.values(): # start from top
|
|
2481
2458
|
if layer.name != top_layer and skip_flag:
|
|
2482
2459
|
continue
|
|
2483
2460
|
else:
|
|
@@ -252,7 +252,7 @@ class Step(object):
|
|
|
252
252
|
padstack_def = padstack_defs[pdef_name]
|
|
253
253
|
comp_name = padstack_instance.GetComponent().GetName()
|
|
254
254
|
if padstack_instance.is_pin and comp_name:
|
|
255
|
-
component_inst = self._pedb.components.
|
|
255
|
+
component_inst = self._pedb.components.instances[comp_name]
|
|
256
256
|
layers[layer_name].add_component_padstack_instance_feature(
|
|
257
257
|
component_inst, padstack_instance, top_bottom_layers, padstack_def
|
|
258
258
|
)
|
pyedb/ipc2581/ipc2581.py
CHANGED
|
@@ -250,7 +250,7 @@ class Ipc2581(object):
|
|
|
250
250
|
self.layers_name = list(self._pedb.stackup.signal_layers.keys())
|
|
251
251
|
self.top_bottom_layers = [self.layers_name[0], self.layers_name[-1]]
|
|
252
252
|
sequence = 0
|
|
253
|
-
for layer_name in list(self._pedb.stackup.
|
|
253
|
+
for layer_name in list(self._pedb.stackup.layers.keys()):
|
|
254
254
|
sequence += 1
|
|
255
255
|
self.content.add_layer_ref(layer_name)
|
|
256
256
|
layer_color = self._pedb.stackup.layers[layer_name].color
|
|
@@ -316,7 +316,7 @@ class Ipc2581(object):
|
|
|
316
316
|
self.content.dict_colors.add_color("{}".format("Drill"), "255", "255", "255")
|
|
317
317
|
|
|
318
318
|
def add_components(self):
|
|
319
|
-
for item in self._pedb.components.
|
|
319
|
+
for item in self._pedb.components.instances.values():
|
|
320
320
|
self.ecad.cad_data.cad_data_step.add_component(item)
|
|
321
321
|
|
|
322
322
|
def add_logical_nets(self):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pyedb
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.23.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>
|
|
@@ -45,7 +45,7 @@ Requires-Dist: sphinx_design>=0.4.0,<0.7 ; extra == "doc"
|
|
|
45
45
|
Requires-Dist: matplotlib>=3.5.0,<3.10 ; extra == "full"
|
|
46
46
|
Requires-Dist: matplotlib>=3.5.0,<3.10 ; extra == "tests"
|
|
47
47
|
Requires-Dist: mock>=5.1.0,<5.2 ; extra == "tests"
|
|
48
|
-
Requires-Dist: pytest>=7.4.0,<8.
|
|
48
|
+
Requires-Dist: pytest>=7.4.0,<8.4 ; extra == "tests"
|
|
49
49
|
Requires-Dist: pytest-cov>=4.0.0,<5.1 ; extra == "tests"
|
|
50
50
|
Requires-Dist: pytest-xdist>=3.5.0,<3.7 ; extra == "tests"
|
|
51
51
|
Requires-Dist: scikit-rf ; extra == "tests"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
pyedb/__init__.py,sha256=
|
|
1
|
+
pyedb/__init__.py,sha256=xnLyyBWT5_md6mH2D48VDx18q8okp5BTIQQt79z6dfY,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=_AxkSZ-7P9aVmizWUWmwcqI07rpGsIZ_fYsd1WNjR6w,12986
|
|
@@ -7,7 +7,7 @@ pyedb/component_libraries/ansys_components.py,sha256=afelGEPmQzbFOIkHnvnWosSs3Cq
|
|
|
7
7
|
pyedb/configuration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
8
|
pyedb/configuration/cfg_boundaries.py,sha256=ckb-OfaObItwy-xc0LqkHJyeCfKC5vg668olPjZbaKo,6647
|
|
9
9
|
pyedb/configuration/cfg_common.py,sha256=5ne78TTA0wHpbi804nsUd9SPxNKZvut_X_Miu-xDRgk,1982
|
|
10
|
-
pyedb/configuration/cfg_components.py,sha256=
|
|
10
|
+
pyedb/configuration/cfg_components.py,sha256=XGWvttmVpz7zHh9fpKFjsMiMy6KTP_GGsR3UGv8xuoI,7683
|
|
11
11
|
pyedb/configuration/cfg_data.py,sha256=eSwdJ7ECP85oNGmmn3_1dK3lRQp4fS_uSYXD5TlNees,3631
|
|
12
12
|
pyedb/configuration/cfg_general.py,sha256=0dtd-rkQt2aYR3EOL0c3sNuDuJs7htRos1OWck3rxaI,1626
|
|
13
13
|
pyedb/configuration/cfg_nets.py,sha256=18NezeNh0ZOwk2ehz3zWJF_xYR7IYCqGlpDfDt7Ilho,2349
|
|
@@ -15,30 +15,30 @@ pyedb/configuration/cfg_operations.py,sha256=OzktdjLgHUm6_kCbMeuZ2mhUXfOIP6gXslm
|
|
|
15
15
|
pyedb/configuration/cfg_package_definition.py,sha256=f_RRT9R-3H5kHBlc4QSpjq9uQgYbaKQ78XXXrc_r3kg,5296
|
|
16
16
|
pyedb/configuration/cfg_padstacks.py,sha256=5t799x_mfwLjCAic-B13v3I6FgDswysXdcKmeOxz4Uo,5571
|
|
17
17
|
pyedb/configuration/cfg_pin_groups.py,sha256=Aq5rlUU2z9iNMv5cBBwHHTlSglw5Upm8EA4g7CQwD5o,3823
|
|
18
|
-
pyedb/configuration/cfg_ports_sources.py,sha256=
|
|
18
|
+
pyedb/configuration/cfg_ports_sources.py,sha256=EhiWNeVZDsB2vMdxUgNSCJpcEK7dZPrKbRtaaYR67v4,15738
|
|
19
19
|
pyedb/configuration/cfg_s_parameter_models.py,sha256=NzS3eBjBSnd7ZDk_TsX04dqRcRXompjx1DxCe1UzWMw,2855
|
|
20
20
|
pyedb/configuration/cfg_setup.py,sha256=SPpNRLJusB-Cz2fDQkc6gkdilUqIlbNngoxF3zySt6g,10115
|
|
21
21
|
pyedb/configuration/cfg_spice_models.py,sha256=tBY3okFiEffMGvBkpmZQrCrovpt-d62k51_WkkV4jqo,2435
|
|
22
22
|
pyedb/configuration/cfg_stackup.py,sha256=CX7uNN5QRoYW_MOObknP8003YchTS7PH9Oee7FG0VKU,6589
|
|
23
|
-
pyedb/configuration/configuration.py,sha256=
|
|
23
|
+
pyedb/configuration/configuration.py,sha256=ss0Jqj0pp4Up-4Hm-jBQGSAmF4uQjaELfyhxqPE2z4o,12627
|
|
24
24
|
pyedb/dotnet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
25
|
pyedb/dotnet/clr_module.py,sha256=Mo13Of3DVSA5HR-5xZEXOiHApIKy52CUxtJ2gPkEu1A,3406
|
|
26
|
-
pyedb/dotnet/edb.py,sha256=
|
|
26
|
+
pyedb/dotnet/edb.py,sha256=S1MYHdz6cmwgGX5VPSgqTsilQb6t8hI86lvFlVpzmVw,181088
|
|
27
27
|
pyedb/dotnet/application/Variables.py,sha256=v_fxFJ6xjyyhk4uaMzWAbP-1FhXGuKsVNuyV1huaPME,77867
|
|
28
28
|
pyedb/dotnet/application/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
29
29
|
pyedb/dotnet/edb_core/__init__.py,sha256=nIRLJ8VZLcMAp12zmGsnZ5x2BEEl7q_Kj_KAOXxVjpQ,52
|
|
30
|
-
pyedb/dotnet/edb_core/components.py,sha256=
|
|
30
|
+
pyedb/dotnet/edb_core/components.py,sha256=DCBpgMecGDJ0hcb3lZsaKSCihbLLkDdF85L3_NIm2XQ,110233
|
|
31
31
|
pyedb/dotnet/edb_core/general.py,sha256=1g2bUekyUbu8p8zCinT4eI7uqRGIK8tY8mfuFePGRGg,4415
|
|
32
|
-
pyedb/dotnet/edb_core/hfss.py,sha256=
|
|
32
|
+
pyedb/dotnet/edb_core/hfss.py,sha256=alhOpt4GBdhjavmhe0TW275bKnFeW2VQl8TJrWVyhMg,68534
|
|
33
33
|
pyedb/dotnet/edb_core/layout_obj_instance.py,sha256=Pd8rfdO3b6HLFGwXBMw-tfE4LPIcW_9_X5KEdFaiito,1407
|
|
34
34
|
pyedb/dotnet/edb_core/layout_validation.py,sha256=aOYgttlJ007uGG94NnhZR_iNHTuCI5CHkHWWTcm9n-E,12617
|
|
35
|
-
pyedb/dotnet/edb_core/materials.py,sha256=
|
|
36
|
-
pyedb/dotnet/edb_core/modeler.py,sha256=
|
|
35
|
+
pyedb/dotnet/edb_core/materials.py,sha256=zzYWIJ5dvOIO2H2vREpRnwGDx0hEa5QhCsg_EJkydww,43222
|
|
36
|
+
pyedb/dotnet/edb_core/modeler.py,sha256=128NhF0ijpoX3n95qrAgWrc-C9OlO8kK-GlmXMJyKNE,55912
|
|
37
37
|
pyedb/dotnet/edb_core/net_class.py,sha256=4U6Cc1Gn7ZJ_ub9uKmtrsoz5wD1XS42afci3Y3ewRp0,11354
|
|
38
|
-
pyedb/dotnet/edb_core/nets.py,sha256=
|
|
39
|
-
pyedb/dotnet/edb_core/padstack.py,sha256=
|
|
40
|
-
pyedb/dotnet/edb_core/siwave.py,sha256=
|
|
41
|
-
pyedb/dotnet/edb_core/stackup.py,sha256=
|
|
38
|
+
pyedb/dotnet/edb_core/nets.py,sha256=ws-wq33iMwxN9II0KwOnawwl7WPtZRoDne-hLWgnIVE,43144
|
|
39
|
+
pyedb/dotnet/edb_core/padstack.py,sha256=fWQz5VDa1SUi7c4MLjp4xpWobzkDZHRVmA-Yj3If4Fg,63560
|
|
40
|
+
pyedb/dotnet/edb_core/siwave.py,sha256=d9iNHaEkz5Pa4UMMZnlVO_2TVEvrm3UijbydWwNeQII,64316
|
|
41
|
+
pyedb/dotnet/edb_core/stackup.py,sha256=SFO8kYvHK3VQYneM_X-phMlwvSJDZzW_xWDud1rniNY,119835
|
|
42
42
|
pyedb/dotnet/edb_core/cell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
43
|
pyedb/dotnet/edb_core/cell/connectable.py,sha256=rKWPATg0GCHi4d1ftu2V7WWhkDONjloCSPujssie5a8,2310
|
|
44
44
|
pyedb/dotnet/edb_core/cell/layout.py,sha256=g9vMzja9VT9iLFJDz75zYWuE5FfdjquYWysoaIgu1kY,11877
|
|
@@ -46,7 +46,7 @@ pyedb/dotnet/edb_core/cell/layout_obj.py,sha256=fVLjHMsokK2eEILTBo_9lEpjJCP0bkdk
|
|
|
46
46
|
pyedb/dotnet/edb_core/cell/primitive.py,sha256=WHiX5ROLMYf71ZuX-4TrOUhRcI6RLiUPap7AzajO2YA,11704
|
|
47
47
|
pyedb/dotnet/edb_core/cell/voltage_regulator.py,sha256=-uAzuyERV6ca0bFRzdH4SllcpGY2D9JEdpS7RYaQt6c,5387
|
|
48
48
|
pyedb/dotnet/edb_core/cell/hierarchy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
49
|
-
pyedb/dotnet/edb_core/cell/hierarchy/component.py,sha256=
|
|
49
|
+
pyedb/dotnet/edb_core/cell/hierarchy/component.py,sha256=3dkbGO8Wsmbq3n9JaFixJXfvQ5aNqC8OMo43-KPukUc,33851
|
|
50
50
|
pyedb/dotnet/edb_core/cell/hierarchy/hierarchy_obj.py,sha256=QZhkoSxRnewxvX8HJKHx-jcw-eIR3eudmDqFQbvltfM,1896
|
|
51
51
|
pyedb/dotnet/edb_core/cell/hierarchy/model.py,sha256=LwXE4VUfptG5rJ9gmAmye0hECBv7bUGtby1ZzNFkeT0,3198
|
|
52
52
|
pyedb/dotnet/edb_core/cell/hierarchy/netlist_model.py,sha256=fF6tY-6s-lW9EuvJ5sw3RlIkjuoSjeZbrNk5wG-_hzM,1356
|
|
@@ -59,7 +59,7 @@ pyedb/dotnet/edb_core/cell/terminal/edge_terminal.py,sha256=MvmKA0JGVeqGx7smuMOV
|
|
|
59
59
|
pyedb/dotnet/edb_core/cell/terminal/padstack_instance_terminal.py,sha256=HOMNvSj8thN3RgSg2eDb_CE8PpqkcVLrIYPZGOW-IQk,3803
|
|
60
60
|
pyedb/dotnet/edb_core/cell/terminal/pingroup_terminal.py,sha256=M5qZNH-MLDkgSJABNVKmnBLyLgezm2fqJGl70EyPVUo,2586
|
|
61
61
|
pyedb/dotnet/edb_core/cell/terminal/point_terminal.py,sha256=DafZBGjUx_OE8gZWcUKPh4cH3BRkJSj9XolhzIPOE3I,2400
|
|
62
|
-
pyedb/dotnet/edb_core/cell/terminal/terminal.py,sha256=
|
|
62
|
+
pyedb/dotnet/edb_core/cell/terminal/terminal.py,sha256=MvUi-03IHMm29KT_ujN3w88AdGx__dS2DfVxG4_MHok,19223
|
|
63
63
|
pyedb/dotnet/edb_core/definition/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
64
64
|
pyedb/dotnet/edb_core/definition/component_def.py,sha256=tYZ4L6DigwSjdQJ5AlqEbordPVZyJ6hYFNc6b3QnJ18,6514
|
|
65
65
|
pyedb/dotnet/edb_core/definition/component_model.py,sha256=PhT5voy3qk8fsp94dK6TN_Zxz5aXwO_mmeIwWm7C_Hs,1944
|
|
@@ -76,11 +76,11 @@ pyedb/dotnet/edb_core/edb_data/edbvalue.py,sha256=Vj_11HXsQUNavizKp5FicORm6cjhXR
|
|
|
76
76
|
pyedb/dotnet/edb_core/edb_data/hfss_extent_info.py,sha256=hKFHWUl0_OCMEZJbQn5c8Y1a-BYKr8nAycIlrCoeufk,13005
|
|
77
77
|
pyedb/dotnet/edb_core/edb_data/layer_data.py,sha256=B6cClg5KTcKUn33jYccTN0uNZZ5dQ037WHCsI-vg3Us,25748
|
|
78
78
|
pyedb/dotnet/edb_core/edb_data/nets_data.py,sha256=ICF61kgST9Rm4hUqU3KUh8FMNlrZEVQO1LqZR1VADkA,9979
|
|
79
|
-
pyedb/dotnet/edb_core/edb_data/padstacks_data.py,sha256=
|
|
79
|
+
pyedb/dotnet/edb_core/edb_data/padstacks_data.py,sha256=x0OK4FcoDbUC14mkUM9_S8Re6oTQq5Uw6RzuhepOle0,77972
|
|
80
80
|
pyedb/dotnet/edb_core/edb_data/ports.py,sha256=wr2RQi8VExuNIVmnp7c4VpTIhODgthmJmHr01zO4ueo,8873
|
|
81
81
|
pyedb/dotnet/edb_core/edb_data/primitives_data.py,sha256=i6mC-y19iiO9Tr4w3A4Usrd_flyeUSPnxLCz980qFyA,43442
|
|
82
82
|
pyedb/dotnet/edb_core/edb_data/raptor_x_simulation_setup_data.py,sha256=P37-OIsc8TuTC_s3CXRmvZcJqxAftHA7SATfEyoAnMM,20953
|
|
83
|
-
pyedb/dotnet/edb_core/edb_data/simulation_configuration.py,sha256=
|
|
83
|
+
pyedb/dotnet/edb_core/edb_data/simulation_configuration.py,sha256=Z_Iuh7qgj9s0PwmlOOdBOC47imBTgWPAWt8KxGNZmZQ,100432
|
|
84
84
|
pyedb/dotnet/edb_core/edb_data/sources.py,sha256=jzC6p-fiuPEvZn3b9z1-X5UexW5jd48jZRamXillnXI,15700
|
|
85
85
|
pyedb/dotnet/edb_core/edb_data/utilities.py,sha256=3wZqOJ35eisOwOPKOs-bvJ8kmd62e46EiFuiFtsroB4,4928
|
|
86
86
|
pyedb/dotnet/edb_core/edb_data/variables.py,sha256=LS1jZPOYgRvf4cyKf_x8hI9Brs-qbh4wrHu_QGLElrg,3501
|
|
@@ -115,7 +115,7 @@ pyedb/generic/process.py,sha256=DiOanqNq5APYryBYo3Wt4mQ54cBR9-ULrrIOqGE4S8c,1110
|
|
|
115
115
|
pyedb/generic/settings.py,sha256=QTX5OVZ8sVPIy_QaSxRODUWvoXkYkVpzh3l6pQPseKQ,9220
|
|
116
116
|
pyedb/ipc2581/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
117
117
|
pyedb/ipc2581/history_record.py,sha256=s1GjcIgnZHlNCBOeEERBDX7xDuqhXmh2Ctt3ccFDWso,2739
|
|
118
|
-
pyedb/ipc2581/ipc2581.py,sha256=
|
|
118
|
+
pyedb/ipc2581/ipc2581.py,sha256=m_hPmutfDdPWfDZ33znsm54MkmxUA_pIR5-P-79fPbc,22516
|
|
119
119
|
pyedb/ipc2581/logistic_header.py,sha256=ETWntlLgKczjBKR1jtzAe6M7YZLmpSx6ZlbUe3K7wz0,2092
|
|
120
120
|
pyedb/ipc2581/bom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
121
121
|
pyedb/ipc2581/bom/bom.py,sha256=yZ_OwJLHGht8Fn3N1xaROy7QRuCs1PbjCb4OB6wTanQ,1853
|
|
@@ -160,7 +160,7 @@ pyedb/ipc2581/ecad/cad_data/profile.py,sha256=H7f0KdCQJhR8bc7jn7rjUlLPLo0wr0x5sa
|
|
|
160
160
|
pyedb/ipc2581/ecad/cad_data/stackup.py,sha256=_CyyYwFjrVyQEpsL_4bFSz9U1sMTWhfLUov6RdhdITE,2274
|
|
161
161
|
pyedb/ipc2581/ecad/cad_data/stackup_group.py,sha256=zRtg9Va6SQn6eJOiB_8cvSptAbUa-SQbwB4e4Kr2N0Q,2717
|
|
162
162
|
pyedb/ipc2581/ecad/cad_data/stackup_layer.py,sha256=SMkX9wrHdxbVn6hcPqlAbWz14IKiVy3dg9Dj6V-dcGA,1970
|
|
163
|
-
pyedb/ipc2581/ecad/cad_data/step.py,sha256=
|
|
163
|
+
pyedb/ipc2581/ecad/cad_data/step.py,sha256=eDLPj8q0qJCnrHyz0vOIguef7WpfLh3rf3n1hWSSSUg,12295
|
|
164
164
|
pyedb/misc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
165
165
|
pyedb/misc/aedtlib_personalib_install.py,sha256=eCVAdEoriMU92bZwPzY9Aig85cBbUO0J8J4RMtMkY_o,1759
|
|
166
166
|
pyedb/misc/downloads.py,sha256=j9jJhwGTTJwm4WWaCSEhGZzOGyOyHhBAFexx0NtD4Uw,10824
|
|
@@ -182,7 +182,7 @@ pyedb/misc/siw_feature_config/xtalk_scan/scan_config.py,sha256=YmYI6WTQulL5Uf8Wx
|
|
|
182
182
|
pyedb/misc/siw_feature_config/xtalk_scan/td_xtalk_config.py,sha256=KHa-UqcXuabiVfT2CV-UvWl5Q2qGYHF2Ye9azcAlnXc,3966
|
|
183
183
|
pyedb/modeler/geometry_operators.py,sha256=g_Sy7a6R23sP6RtboJn1rl8uTuo8oeLmMF21rNkzwjk,74198
|
|
184
184
|
pyedb/siwave_core/icepak.py,sha256=WnZ-t8mik7LDY06V8hZFV-TxRZJQWK7bu_8Ichx-oBs,5206
|
|
185
|
-
pyedb-0.
|
|
186
|
-
pyedb-0.
|
|
187
|
-
pyedb-0.
|
|
188
|
-
pyedb-0.
|
|
185
|
+
pyedb-0.23.0.dist-info/LICENSE,sha256=qQWivZ12ETN5l3QxvTARY-QI5eoRRlyHdwLlAj0Bg5I,1089
|
|
186
|
+
pyedb-0.23.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
|
187
|
+
pyedb-0.23.0.dist-info/METADATA,sha256=gLEu3TBgTAstql9Q2ev_e6qRr93kbJ3ND-7n6C0dD9Q,8387
|
|
188
|
+
pyedb-0.23.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|