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 CHANGED
@@ -44,7 +44,7 @@ deprecation_warning()
44
44
  #
45
45
 
46
46
  pyedb_path = os.path.dirname(__file__)
47
- __version__ = "0.22.1"
47
+ __version__ = "0.23.0"
48
48
  version = __version__
49
49
 
50
50
  #
@@ -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.components.items():
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.components[self.reference_designator].pins[pos_value]}
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.components[self.reference_designator].pins[neg_value]}
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.components[self.reference_designator].pins[pin_name]}
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.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.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.components.items():
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.stackup_layers.keys())
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.power_nets.keys()]
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.components
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.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
- if not solder_balls_height:
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.components[comp].is_enabled = False
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.components[refdes]
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.components[refdes]
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.components[comp].is_enabled = False
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.components[component_name]
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.stackup_limits(True)
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
@@ -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.components[ref].pins.items():
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
@@ -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.stackup_layers.values()))
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)
@@ -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.components.values():
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.components:
1152
+ if component_name not in self._pedb.components.instances:
1153
1153
  return False
1154
- for net in self._pedb.components.components[component_name].nets:
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.stackup_layers
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.components:
595
+ if refdes in self._pedb.components.instances:
596
596
  if netname:
597
- for pin, val in self._pedb.components.components[refdes].pins.items():
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.components[refdes].pins.values():
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:
@@ -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.components[reference_designator]
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)
@@ -246,7 +246,7 @@ class LayerCollection(object):
246
246
 
247
247
  obj = False
248
248
  # Add stackup layers
249
- for _, i in self.stackup_layers.items():
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.stackup_layers.keys()))
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.stackup_layers["TOP"].dielectric_fill = "SolderMask"
517
- self.stackup_layers["BOT"].dielectric_fill = "SolderMask"
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
- materials.add_material(material, **material_properties)
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
- materials.add_material(fillMaterial, **material_properties)
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.stackup_layers.values():
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.stackup_layers.items():
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.stackup_layers.values())):
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.stackup_layers.keys())
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.stackup_layers[layout_layer_list[layer_index]].name = layer_name
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.stackup_layers:
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.stackup_layers:
1079
- self.stackup_layers[layer["name"]]._load_layer(layer)
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.components.values()):
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.stackup_layers.values())
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.components.items():
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.components.items():
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.components.items():
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.stackup_layers.keys())[0]:
1299
+ if layer == list(self.layers.keys())[0]:
1298
1300
  self.add_layer(
1299
1301
  "Bottom_air",
1300
- base_layer=list(self.stackup_layers.keys())[-1],
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.stackup_layers.keys())[-1]:
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.stackup_layers.values())[-1].thickness = val.solder_ball_height
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.stackup_layers.values())[0].thickness = val.solder_ball_height
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.warning("Configuration file does not have material definition")
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.values():
1827
- material_name = material["name"]
1828
- del material["name"]
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 = {i: j for i, j in json_dict["layers"].items() if j["type"] in ["signal", "dielectric"]}
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.stackup_layers.keys())
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.stackup_layers.keys())[::]
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.stackup_layers[name].name = renamed_layers[name]
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.stackup_layers[name]._load_layer(default_layer)
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.stackup_layers:
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.stackup_layers.keys(): # pragma: no cover
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.stackup_layers:
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.stackup_layers.keys():
2044
- lyr = self.stackup_layers[name]
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.stackup_layers:
2055
+ if prev_layer and prev_layer in self.layers:
2053
2056
  layer_name = prev_layer
2054
2057
  else:
2055
- layer_name = list(self.stackup_layers.keys())[-1] if self.stackup_layers else None
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.stackup_layers:
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.stackup_layers.items():
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 the file.
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.stackup_layers.keys())
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.stackup_mode
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.stackup_layers.values(): # start from top
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.components[comp_name]
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.stackup_layers.keys()):
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.components.values():
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.22.1
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.3 ; extra == "tests"
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=aGJoyShOw-T16kkEdjWiiAZz944O0yLK-PpwX5lBoBc,1521
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=YPmaoVG0PO92yNKTbpi3LZNt01aNO75VHFJuY7DM94k,7684
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=bhpQB-WXxH0nAksYCxIn8q08U8KswWKv4Ui9p5jwskA,15741
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=coJU6y-y7VOGmH_NPXdEdoBdD_aZzYFx7sgvLKNm02E,12629
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=ps_zASr7shSBISTB2fsfayCWmTDJ9FTYhDL3T-2pAUg,180752
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=lHpLiZj6uEsnZF-i-aUoLZNpvBBlYCk5cYFTGnGcSUA,110215
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=Sh417lko4COeeod1C8sbBp6GkoTENEbALdYFOePnOcg,68535
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=PvuxVmm7XGHZjfSy-gsuMKVwthfsW_LLQ3LTRz4YE6c,43167
36
- pyedb/dotnet/edb_core/modeler.py,sha256=8y6N4HyfJjBrbfac_mggO3qta4GH_dwmt9J4fdqN5WU,55920
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=CnZxnK_-WwOMzmJAEalxj_Xo3KlTSJNtf7Fn9x093Ak,43147
39
- pyedb/dotnet/edb_core/padstack.py,sha256=SO7rIfPYwLnbz0ddLPcgM9CVfhWAY1DfSQVixFJeRNc,63571
40
- pyedb/dotnet/edb_core/siwave.py,sha256=qhPTgFHaBThvlvch1po8uGsZdmOi1rVzEFHYv19DHPU,64317
41
- pyedb/dotnet/edb_core/stackup.py,sha256=o3mxqmYQptcLw-WiSo6QOL5sUZKHaDIXYMtU98pL2sU,120550
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=jvS1VXhm58zkSSPOBUazL67JxMGQjMGSC6pE4Hw_4DM,33859
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=eeM9peo4Jfu9WWwCoRX8X0dRdW3rM_aqXRuqWw_8fi8,19228
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=atUTmNcR7qZ9GASM7_j8sQyjUM-IWePMbDBJ1A9kDZc,78359
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=3qx-YHiA4oC9TJboXb7fKQSzCn5SJRwVOe1OmuVZbmc,100927
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=aXykGGocgEu0aeBxH0GPLALTCt8a9Lz-ekdF3vGtKJk,22525
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=p4X0LGECdI4dTtxgh0oAkjQtd6G7FrZYwW-qrsRyrMM,12296
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.22.1.dist-info/LICENSE,sha256=qQWivZ12ETN5l3QxvTARY-QI5eoRRlyHdwLlAj0Bg5I,1089
186
- pyedb-0.22.1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
187
- pyedb-0.22.1.dist-info/METADATA,sha256=ggDIgzAO9DRVSItoBXoaskYZIA0xzSSv8hSosVGDOS4,8387
188
- pyedb-0.22.1.dist-info/RECORD,,
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