pyedb 0.20.0__py3-none-any.whl → 0.21.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.20.0"
47
+ __version__ = "0.21.0"
48
48
  version = __version__
49
49
 
50
50
  #
pyedb/dotnet/edb.py CHANGED
@@ -4097,6 +4097,12 @@ class Edb(Database):
4097
4097
  material_filter=None,
4098
4098
  padstack_definition_filter=None,
4099
4099
  trace_net_filter=None,
4100
+ use_single_variable_for_padstack_definitions=True,
4101
+ use_relative_variables=True,
4102
+ output_aedb_path=None,
4103
+ open_aedb_at_end=True,
4104
+ expand_polygons_size=0,
4105
+ expand_voids_size=0,
4100
4106
  ):
4101
4107
  """Assign automatically design and project variables with current values.
4102
4108
 
@@ -4122,27 +4128,56 @@ class Edb(Database):
4122
4128
  Enable padstack definition filter. Default value is ``None``, all padsatcks are parametrized.
4123
4129
  trace_net_filter : str, List(str), optional
4124
4130
  Enable nets filter for trace width parametrization. Default value is ``None``, all layers are parametrized.
4131
+ use_single_variable_for_padstack_definitions : bool, optional
4132
+ Whether to use a single design variable for each padstack definition or a variable per pad layer.
4133
+ Default value is ``True``.
4134
+ use_relative_variables : bool, optional
4135
+ Whether if use an absolute variable for each trace, padstacks and layers or a delta variable instead.
4136
+ Default value is ``True``.
4137
+ output_aedb_path : str, optional
4138
+ Full path and name for the new AEDB file. If None, then current aedb will be cutout.
4139
+ open_aedb_at_end : bool, optional
4140
+ Whether to open the cutout at the end. The default is ``True``.
4125
4141
 
4126
4142
  Returns
4127
4143
  -------
4128
4144
  List(str)
4129
4145
  List of all parameters name created.
4130
4146
  """
4147
+ edb_original_path = self.edbpath
4148
+ if output_aedb_path:
4149
+ self.save_edb_as(output_aedb_path)
4150
+ if isinstance(trace_net_filter, str):
4151
+ trace_net_filter = [trace_net_filter]
4131
4152
  parameters = []
4153
+
4154
+ def _apply_variable(orig_name, orig_value):
4155
+ if use_relative_variables:
4156
+ var = f"{orig_name}_delta"
4157
+ else:
4158
+ var = f"{orig_name}_value"
4159
+ var = self._clean_string_for_variable_name(var)
4160
+ if var not in self.variables:
4161
+ if use_relative_variables:
4162
+ self.add_design_variable(var, 0.0)
4163
+ else:
4164
+ self.add_design_variable(var, orig_value)
4165
+ if use_relative_variables:
4166
+ return f"{orig_value}+{var}", var
4167
+ else:
4168
+ return var, var
4169
+
4132
4170
  if layers:
4133
4171
  if not layer_filter:
4134
- _layers = self.stackup.stackup_layers
4172
+ _layers = self.stackup.layers
4135
4173
  else:
4136
4174
  if isinstance(layer_filter, str):
4137
4175
  layer_filter = [layer_filter]
4138
- _layers = {k: v for k, v in self.stackup.stackup_layers.items() if k in layer_filter}
4176
+ _layers = {k: v for k, v in self.stackup.layers.items() if k in layer_filter}
4139
4177
  for layer_name, layer in _layers.items():
4140
- thickness_variable = "${}_thick".format(layer_name)
4141
- thickness_variable = self._clean_string_for_variable_name(thickness_variable)
4142
- if thickness_variable not in self.variables:
4143
- self.add_design_variable(thickness_variable, layer.thickness)
4144
- layer.thickness = thickness_variable
4145
- parameters.append(thickness_variable)
4178
+ var, val = _apply_variable(f"${layer_name}", layer.thickness)
4179
+ layer.thickness = var
4180
+ parameters.append(val)
4146
4181
  if materials:
4147
4182
  if not material_filter:
4148
4183
  _materials = self.materials.materials
@@ -4150,117 +4185,139 @@ class Edb(Database):
4150
4185
  _materials = {k: v for k, v in self.materials.materials.items() if k in material_filter}
4151
4186
  for mat_name, material in _materials.items():
4152
4187
  if material.conductivity < 1e4:
4153
- epsr_variable = "$epsr_{}".format(mat_name)
4154
- epsr_variable = self._clean_string_for_variable_name(epsr_variable)
4155
- if epsr_variable not in self.variables:
4156
- self.add_design_variable(epsr_variable, material.permittivity)
4157
- material.permittivity = epsr_variable
4158
- parameters.append(epsr_variable)
4159
- loss_tg_variable = "$loss_tangent_{}".format(mat_name)
4160
- loss_tg_variable = self._clean_string_for_variable_name(loss_tg_variable)
4161
- if not loss_tg_variable in self.variables:
4162
- self.add_design_variable(loss_tg_variable, material.dielectric_loss_tangent)
4163
- material.dielectric_loss_tangent = loss_tg_variable
4164
- parameters.append(loss_tg_variable)
4188
+ var, val = _apply_variable(f"$epsr_{mat_name}", material.permittivity)
4189
+ material.permittivity = var
4190
+ parameters.append(val)
4191
+ var, val = _apply_variable(f"$loss_tangent_{mat_name}", material.dielectric_loss_tangent)
4192
+ material.dielectric_loss_tangent = var
4193
+ parameters.append(val)
4165
4194
  else:
4166
- sigma_variable = "$sigma_{}".format(mat_name)
4167
- sigma_variable = self._clean_string_for_variable_name(sigma_variable)
4168
- if not sigma_variable in self.variables:
4169
- self.add_design_variable(sigma_variable, material.conductivity)
4170
- material.conductivity = sigma_variable
4171
- parameters.append(sigma_variable)
4195
+ var, val = _apply_variable(f"$sigma_{mat_name}", material.conductivity)
4196
+ material.conductivity = var
4197
+ parameters.append(val)
4172
4198
  if traces:
4173
4199
  if not trace_net_filter:
4174
4200
  paths = self.modeler.paths
4175
4201
  else:
4176
4202
  paths = [path for path in self.modeler.paths if path.net_name in trace_net_filter]
4177
4203
  for path in paths:
4178
- trace_width_variable = "trace_w_{}_{}".format(path.net_name, path.id)
4179
- trace_width_variable = self._clean_string_for_variable_name(trace_width_variable)
4180
- if trace_width_variable not in self.variables:
4181
- self.add_design_variable(trace_width_variable, path.width)
4182
- path.width = trace_width_variable
4183
- parameters.append(trace_width_variable)
4204
+ net_name = path.net_name
4205
+ if use_relative_variables:
4206
+ trace_width_variable = "trace"
4207
+ elif net_name:
4208
+ trace_width_variable = f"{path.net_name}_{path.aedt_name}"
4209
+ else:
4210
+ trace_width_variable = f"{path.aedt_name}"
4211
+ var, val = _apply_variable(trace_width_variable, path.width)
4212
+ path.width = var
4213
+ parameters.append(val)
4184
4214
  if not padstack_definition_filter:
4185
- used_padsatck_defs = list(
4186
- set([padstack_inst.padstack_definition for padstack_inst in list(self.padstacks.instances.values())])
4187
- )
4188
- padstack_defs = {k: v for k, v in self.padstacks.definitions.items() if k in used_padsatck_defs}
4215
+ if trace_net_filter:
4216
+ padstack_defs = {}
4217
+ for net in trace_net_filter:
4218
+ for via in self.nets[net].padstack_instances:
4219
+ padstack_defs[via.padstack_definition] = self.padstacks.definitions[via.padstack_definition]
4220
+ else:
4221
+ used_padsatck_defs = list(
4222
+ set(
4223
+ [padstack_inst.padstack_definition for padstack_inst in list(self.padstacks.instances.values())]
4224
+ )
4225
+ )
4226
+ padstack_defs = {k: v for k, v in self.padstacks.definitions.items() if k in used_padsatck_defs}
4189
4227
  else:
4190
4228
  padstack_defs = {k: v for k, v in self.padstacks.definitions.items() if k in padstack_definition_filter}
4229
+
4191
4230
  for def_name, padstack_def in padstack_defs.items():
4192
4231
  if not padstack_def.via_start_layer == padstack_def.via_stop_layer:
4193
4232
  if via_holes: # pragma no cover
4194
- hole_variable = self._clean_string_for_variable_name("$hole_diam_{}".format(def_name))
4195
- if hole_variable not in self.variables:
4196
- self.add_design_variable(hole_variable, padstack_def.hole_diameter_string)
4197
- padstack_def.hole_properties = hole_variable
4198
- parameters.append(hole_variable)
4233
+ if use_relative_variables:
4234
+ hole_variable = "$hole_diameter"
4235
+ else:
4236
+ hole_variable = f"${def_name}_hole_diameter"
4237
+ var, val = _apply_variable(hole_variable, padstack_def.hole_diameter_string)
4238
+ padstack_def.hole_properties = var
4239
+ parameters.append(val)
4199
4240
  if pads:
4200
4241
  for layer, pad in padstack_def.pad_by_layer.items():
4201
- if pad.geometry_type == 1:
4202
- pad_diameter_variable = self._clean_string_for_variable_name(
4203
- "$pad_diam_{}_{}".format(def_name, layer)
4204
- )
4205
- if pad_diameter_variable not in self.variables:
4206
- self.add_design_variable(pad_diameter_variable, pad.parameters_values_string[0])
4207
- pad.parameters = {"Diameter": pad_diameter_variable}
4208
- parameters.append(pad_diameter_variable)
4209
- if pad.geometry_type == 2: # pragma no cover
4210
- pad_size_variable = self._clean_string_for_variable_name(
4211
- "$pad_size_{}_{}".format(def_name, layer)
4212
- )
4213
- if pad_size_variable not in self.variables:
4214
- self.add_design_variable(pad_size_variable, pad.parameters_values_string[0])
4215
- pad.parameters = {"Size": pad_size_variable}
4216
- parameters.append(pad_size_variable)
4242
+ if use_relative_variables:
4243
+ pad_name = "$pad"
4244
+ elif use_single_variable_for_padstack_definitions:
4245
+ pad_name = f"${def_name}_pad"
4246
+ else:
4247
+ pad_name = f"${def_name}_{layer}_pad"
4248
+
4249
+ if pad.geometry_type in [1, 2]:
4250
+ var, val = _apply_variable(pad_name, pad.parameters_values_string[0])
4251
+ if pad.geometry_type == 1:
4252
+ pad.parameters = {"Diameter": var}
4253
+ else:
4254
+ pad.parameters = {"Size": var}
4255
+ parameters.append(val)
4217
4256
  elif pad.geometry_type == 3: # pragma no cover
4218
- pad_size_variable_x = self._clean_string_for_variable_name(
4219
- "$pad_size_x_{}_{}".format(def_name, layer)
4220
- )
4221
- pad_size_variable_y = self._clean_string_for_variable_name(
4222
- "$pad_size_y_{}_{}".format(def_name, layer)
4223
- )
4224
- if pad_size_variable_x not in self.variables and pad_size_variable_y not in self.variables:
4225
- self.add_design_variable(pad_size_variable_x, pad.parameters_values_string[0])
4226
- self.add_design_variable(pad_size_variable_y, pad.parameters_values_string[1])
4227
- pad.parameters = {"XSize": pad_size_variable_x, "YSize": pad_size_variable_y}
4228
- parameters.append(pad_size_variable_x)
4229
- parameters.append(pad_size_variable_y)
4257
+ if use_relative_variables:
4258
+ pad_name_x = "$pad_x"
4259
+ pad_name_y = "$pad_y"
4260
+ elif use_single_variable_for_padstack_definitions:
4261
+ pad_name_x = f"${def_name}_pad_x"
4262
+ pad_name_y = f"${def_name}_pad_y"
4263
+ else:
4264
+ pad_name_x = f"${def_name}_{layer}_pad_x"
4265
+ pad_name_y = f"${def_name}_pad_y"
4266
+ var, val = _apply_variable(pad_name_x, pad.parameters_values_string[0])
4267
+ var2, val2 = _apply_variable(pad_name_y, pad.parameters_values_string[1])
4268
+
4269
+ pad.parameters = {"XSize": var, "YSize": var2}
4270
+ parameters.append(val)
4271
+ parameters.append(val2)
4230
4272
  if antipads:
4231
4273
  for layer, antipad in padstack_def.antipad_by_layer.items():
4232
- if antipad.geometry_type == 1: # pragma no cover
4233
- antipad_diameter_variable = self._clean_string_for_variable_name(
4234
- "$antipad_diam_{}_{}".format(def_name, layer)
4235
- )
4236
- if antipad_diameter_variable not in self.variables: # pragma no cover
4237
- self.add_design_variable(antipad_diameter_variable, antipad.parameters_values_string[0])
4238
- antipad.parameters = {"Diameter": antipad_diameter_variable}
4239
- parameters.append(antipad_diameter_variable)
4240
- if antipad.geometry_type == 2: # pragma no cover
4241
- antipad_size_variable = self._clean_string_for_variable_name(
4242
- "$antipad_size_{}_{}".format(def_name, layer)
4243
- )
4244
- if antipad_size_variable not in self.variables: # pragma no cover
4245
- self.add_design_variable(antipad_size_variable, antipad.parameters_values_string[0])
4246
- antipad.parameters = {"Size": antipad_size_variable}
4247
- parameters.append(antipad_size_variable)
4274
+ if use_relative_variables:
4275
+ pad_name = "$antipad"
4276
+ elif use_single_variable_for_padstack_definitions:
4277
+ pad_name = f"${def_name}_antipad"
4278
+ else:
4279
+ pad_name = f"${def_name}_{layer}_antipad"
4280
+
4281
+ if antipad.geometry_type in [1, 2]:
4282
+ var, val = _apply_variable(pad_name, antipad.parameters_values_string[0])
4283
+ if antipad.geometry_type == 1: # pragma no cover
4284
+ antipad.parameters = {"Diameter": var}
4285
+ else:
4286
+ antipad.parameters = {"Size": var}
4287
+ parameters.append(val)
4248
4288
  elif antipad.geometry_type == 3: # pragma no cover
4249
- antipad_size_variable_x = self._clean_string_for_variable_name(
4250
- "$antipad_size_x_{}_{}".format(def_name, layer)
4251
- )
4252
- antipad_size_variable_y = self._clean_string_for_variable_name(
4253
- "$antipad_size_y_{}_{}".format(def_name, layer)
4254
- )
4255
- if (
4256
- antipad_size_variable_x not in self.variables
4257
- and antipad_size_variable_y not in self.variables
4258
- ): # pragma no cover
4259
- self.add_design_variable(antipad_size_variable_x, antipad.parameters_values_string[0])
4260
- self.add_design_variable(antipad_size_variable_y, antipad.parameters_values_string[1])
4261
- antipad.parameters = {"XSize": antipad_size_variable_x, "YSize": antipad_size_variable_y}
4262
- parameters.append(antipad_size_variable_x)
4263
- parameters.append(antipad_size_variable_y)
4289
+ if use_relative_variables:
4290
+ pad_name_x = "$antipad_x"
4291
+ pad_name_y = "$antipad_y"
4292
+ elif use_single_variable_for_padstack_definitions:
4293
+ pad_name_x = f"${def_name}_antipad_x"
4294
+ pad_name_y = f"${def_name}_antipad_y"
4295
+ else:
4296
+ pad_name_x = f"${def_name}_{layer}_antipad_x"
4297
+ pad_name_y = f"${def_name}_antipad_y"
4298
+
4299
+ var, val = _apply_variable(pad_name_x, antipad.parameters_values_string[0])
4300
+ var2, val2 = _apply_variable(pad_name_y, antipad.parameters_values_string[1])
4301
+ antipad.parameters = {"XSize": var, "YSize": var2}
4302
+ parameters.append(val)
4303
+ parameters.append(val2)
4304
+ if expand_polygons_size:
4305
+ for poly in self.modeler.polygons:
4306
+ if not poly.is_void:
4307
+ poly.expand(expand_polygons_size)
4308
+ if expand_voids_size:
4309
+ for poly in self.modeler.polygons:
4310
+ if poly.is_void:
4311
+ poly.expand(expand_voids_size, round_corners=False)
4312
+ elif poly.has_voids:
4313
+ for void in poly.voids:
4314
+ void.expand(expand_voids_size, round_corners=False)
4315
+
4316
+ if not open_aedb_at_end and self.edbpath != edb_original_path:
4317
+ self.save_edb()
4318
+ self.close_edb()
4319
+ self.edbpath = edb_original_path
4320
+ self.open_edb()
4264
4321
  return parameters
4265
4322
 
4266
4323
  def _clean_string_for_variable_name(self, variable_name):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyedb
3
- Version: 0.20.0
3
+ Version: 0.21.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>
@@ -1,4 +1,4 @@
1
- pyedb/__init__.py,sha256=Fc62Ry9Jbd85qNtZhstEXZXdbivdXZ5b7tMp-N5JXWM,1521
1
+ pyedb/__init__.py,sha256=S4iRRRDvToNtNx3Y5G5p7sWCL2OSeJkF1I11skVPtoE,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
@@ -22,7 +22,7 @@ pyedb/configuration/cfg_stackup.py,sha256=CX7uNN5QRoYW_MOObknP8003YchTS7PH9Oee7F
22
22
  pyedb/configuration/configuration.py,sha256=coJU6y-y7VOGmH_NPXdEdoBdD_aZzYFx7sgvLKNm02E,12629
23
23
  pyedb/dotnet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  pyedb/dotnet/clr_module.py,sha256=Mo13Of3DVSA5HR-5xZEXOiHApIKy52CUxtJ2gPkEu1A,3406
25
- pyedb/dotnet/edb.py,sha256=eSIavcUxT810bXQ3o5rPUrCWxvbw7AR7Wq-TFvRli-E,178534
25
+ pyedb/dotnet/edb.py,sha256=18OY0I1Hhpx4hVVubGDlzqqeyEjyFV_sV8S7xYBAIvg,179320
26
26
  pyedb/dotnet/application/Variables.py,sha256=v_fxFJ6xjyyhk4uaMzWAbP-1FhXGuKsVNuyV1huaPME,77867
27
27
  pyedb/dotnet/application/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  pyedb/dotnet/edb_core/__init__.py,sha256=nIRLJ8VZLcMAp12zmGsnZ5x2BEEl7q_Kj_KAOXxVjpQ,52
@@ -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=iXNGfp3oMAxc6Ij_jatawR9NAKksMfnmWTaoHQVGX80,72699
184
184
  pyedb/siwave_core/icepak.py,sha256=WnZ-t8mik7LDY06V8hZFV-TxRZJQWK7bu_8Ichx-oBs,5206
185
- pyedb-0.20.0.dist-info/LICENSE,sha256=qQWivZ12ETN5l3QxvTARY-QI5eoRRlyHdwLlAj0Bg5I,1089
186
- pyedb-0.20.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
187
- pyedb-0.20.0.dist-info/METADATA,sha256=RmQ1mTuULbWi0_7ZYKEyMpH2mHCIFDQB5yishriZz8c,8318
188
- pyedb-0.20.0.dist-info/RECORD,,
185
+ pyedb-0.21.0.dist-info/LICENSE,sha256=qQWivZ12ETN5l3QxvTARY-QI5eoRRlyHdwLlAj0Bg5I,1089
186
+ pyedb-0.21.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
187
+ pyedb-0.21.0.dist-info/METADATA,sha256=ZliD8Vr2_oWKC1yECHZcN1FNkVB-W7sWv5KAS3uMLB4,8318
188
+ pyedb-0.21.0.dist-info/RECORD,,
File without changes