pyedb 0.6.0__tar.gz → 0.7.0__tar.gz

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.

Files changed (130) hide show
  1. {pyedb-0.6.0 → pyedb-0.7.0}/PKG-INFO +1 -1
  2. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/__init__.py +1 -1
  3. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb.py +9 -9
  4. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/model.py +17 -0
  5. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/configuration.py +152 -58
  6. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/components_data.py +6 -2
  7. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/padstacks_data.py +20 -0
  8. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/hfss.py +1 -1
  9. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/layout.py +35 -31
  10. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/nets.py +5 -5
  11. {pyedb-0.6.0 → pyedb-0.7.0}/LICENSE +0 -0
  12. {pyedb-0.6.0 → pyedb-0.7.0}/README.md +0 -0
  13. {pyedb-0.6.0 → pyedb-0.7.0}/pyproject.toml +0 -0
  14. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/__init__.py +0 -0
  15. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/application/Variables.py +0 -0
  16. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/application/__init__.py +0 -0
  17. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/clr_module.py +0 -0
  18. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/__init__.py +0 -0
  19. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/cell/__init__.py +0 -0
  20. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/cell/hierarchy/__init__.py +0 -0
  21. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/components.py +0 -0
  22. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/definition/__init__.py +0 -0
  23. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/definition/component_def.py +0 -0
  24. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/definition/component_model.py +0 -0
  25. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/definition/definition_obj.py +0 -0
  26. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/definition/definitions.py +0 -0
  27. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/definition/package_def.py +0 -0
  28. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/dotnet/__init__.py +0 -0
  29. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/dotnet/database.py +0 -0
  30. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/dotnet/layout.py +0 -0
  31. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/dotnet/primitive.py +0 -0
  32. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/__init__.py +0 -0
  33. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/connectable.py +0 -0
  34. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/control_file.py +0 -0
  35. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/design_options.py +0 -0
  36. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/edbvalue.py +0 -0
  37. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/hfss_extent_info.py +0 -0
  38. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/hfss_simulation_setup_data.py +0 -0
  39. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/layer_data.py +0 -0
  40. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/nets_data.py +0 -0
  41. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/obj_base.py +0 -0
  42. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/ports.py +0 -0
  43. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/primitives_data.py +0 -0
  44. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/simulation_configuration.py +0 -0
  45. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/simulation_setup.py +0 -0
  46. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/siwave_simulation_setup_data.py +0 -0
  47. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/sources.py +0 -0
  48. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/terminals.py +0 -0
  49. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/utilities.py +0 -0
  50. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/edb_data/variables.py +0 -0
  51. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/general.py +0 -0
  52. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/layout_validation.py +0 -0
  53. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/materials.py +0 -0
  54. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/net_class.py +0 -0
  55. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/padstack.py +0 -0
  56. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/siwave.py +0 -0
  57. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/dotnet/edb_core/stackup.py +0 -0
  58. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/edb_logger.py +0 -0
  59. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/generic/__init__.py +0 -0
  60. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/generic/constants.py +0 -0
  61. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/generic/data_handlers.py +0 -0
  62. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/generic/design_types.py +0 -0
  63. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/generic/filesystem.py +0 -0
  64. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/generic/general_methods.py +0 -0
  65. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/generic/plot.py +0 -0
  66. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/generic/process.py +0 -0
  67. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/generic/settings.py +0 -0
  68. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/__init__.py +0 -0
  69. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/bom/__init__.py +0 -0
  70. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/bom/bom.py +0 -0
  71. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/bom/bom_item.py +0 -0
  72. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/bom/characteristics.py +0 -0
  73. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/bom/refdes.py +0 -0
  74. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/content/__init__.py +0 -0
  75. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/content/color.py +0 -0
  76. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/content/content.py +0 -0
  77. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/content/dictionary_color.py +0 -0
  78. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/content/dictionary_fill.py +0 -0
  79. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/content/dictionary_line.py +0 -0
  80. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/content/entry_color.py +0 -0
  81. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/content/entry_line.py +0 -0
  82. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/content/fill.py +0 -0
  83. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/content/layer_ref.py +0 -0
  84. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/content/standard_geometries_dictionary.py +0 -0
  85. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/__init__.py +0 -0
  86. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/__init__.py +0 -0
  87. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/assembly_drawing.py +0 -0
  88. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/cad_data.py +0 -0
  89. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/component.py +0 -0
  90. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/drill.py +0 -0
  91. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/feature.py +0 -0
  92. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/layer.py +0 -0
  93. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/layer_feature.py +0 -0
  94. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/logical_net.py +0 -0
  95. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/outline.py +0 -0
  96. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/package.py +0 -0
  97. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_def.py +0 -0
  98. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_hole_def.py +0 -0
  99. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_instance.py +0 -0
  100. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/padstack_pad_def.py +0 -0
  101. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/path.py +0 -0
  102. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/phy_net.py +0 -0
  103. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/pin.py +0 -0
  104. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/polygon.py +0 -0
  105. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/profile.py +0 -0
  106. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/stackup.py +0 -0
  107. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/stackup_group.py +0 -0
  108. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/stackup_layer.py +0 -0
  109. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_data/step.py +0 -0
  110. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/cad_header.py +0 -0
  111. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/ecad.py +0 -0
  112. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ecad/spec.py +0 -0
  113. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/history_record.py +0 -0
  114. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/ipc2581.py +0 -0
  115. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/ipc2581/logistic_header.py +0 -0
  116. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/misc/__init__.py +0 -0
  117. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/misc/aedtlib_personalib_install.py +0 -0
  118. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/misc/downloads.py +0 -0
  119. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/misc/misc.py +0 -0
  120. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/misc/pyedb.runtimeconfig.json +0 -0
  121. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/misc/siw_feature_config/__init__.py +0 -0
  122. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/misc/siw_feature_config/emc/__init__.py +0 -0
  123. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/misc/siw_feature_config/emc/component_tags.py +0 -0
  124. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/misc/siw_feature_config/emc/net_tags.py +0 -0
  125. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/misc/siw_feature_config/emc/tag_library.py +0 -0
  126. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/misc/siw_feature_config/emc/xml_generic.py +0 -0
  127. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/misc/siw_feature_config/emc_rule_checker_settings.py +0 -0
  128. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/misc/utilities.py +0 -0
  129. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/modeler/geometry_operators.py +0 -0
  130. {pyedb-0.6.0 → pyedb-0.7.0}/src/pyedb/siwave.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyedb
3
- Version: 0.6.0
3
+ Version: 0.7.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>
@@ -44,7 +44,7 @@ deprecation_warning()
44
44
  #
45
45
 
46
46
  pyedb_path = os.path.dirname(__file__)
47
- __version__ = "0.6.0"
47
+ __version__ = "0.7.0"
48
48
  version = __version__
49
49
 
50
50
  #
@@ -4176,7 +4176,7 @@ class Edb(Database):
4176
4176
  if via_holes: # pragma no cover
4177
4177
  hole_variable = self._clean_string_for_variable_name("$hole_diam_{}".format(def_name))
4178
4178
  if hole_variable not in self.variables:
4179
- self.add_design_variable(hole_variable, padstack_def.hole_properties[0])
4179
+ self.add_design_variable(hole_variable, padstack_def.hole_diameter_string)
4180
4180
  padstack_def.hole_properties = hole_variable
4181
4181
  parameters.append(hole_variable)
4182
4182
  if pads:
@@ -4186,7 +4186,7 @@ class Edb(Database):
4186
4186
  "$pad_diam_{}_{}".format(def_name, layer)
4187
4187
  )
4188
4188
  if pad_diameter_variable not in self.variables:
4189
- self.add_design_variable(pad_diameter_variable, pad.parameters_values[0])
4189
+ self.add_design_variable(pad_diameter_variable, pad.parameters_values_string[0])
4190
4190
  pad.parameters = {"Diameter": pad_diameter_variable}
4191
4191
  parameters.append(pad_diameter_variable)
4192
4192
  if pad.geometry_type == 2: # pragma no cover
@@ -4194,7 +4194,7 @@ class Edb(Database):
4194
4194
  "$pad_size_{}_{}".format(def_name, layer)
4195
4195
  )
4196
4196
  if pad_size_variable not in self.variables:
4197
- self.add_design_variable(pad_size_variable, pad.parameters_values[0])
4197
+ self.add_design_variable(pad_size_variable, pad.parameters_values_string[0])
4198
4198
  pad.parameters = {"Size": pad_size_variable}
4199
4199
  parameters.append(pad_size_variable)
4200
4200
  elif pad.geometry_type == 3: # pragma no cover
@@ -4205,8 +4205,8 @@ class Edb(Database):
4205
4205
  "$pad_size_y_{}_{}".format(def_name, layer)
4206
4206
  )
4207
4207
  if pad_size_variable_x not in self.variables and pad_size_variable_y not in self.variables:
4208
- self.add_design_variable(pad_size_variable_x, pad.parameters_values[0])
4209
- self.add_design_variable(pad_size_variable_y, pad.parameters_values[1])
4208
+ self.add_design_variable(pad_size_variable_x, pad.parameters_values_string[0])
4209
+ self.add_design_variable(pad_size_variable_y, pad.parameters_values_string[1])
4210
4210
  pad.parameters = {"XSize": pad_size_variable_x, "YSize": pad_size_variable_y}
4211
4211
  parameters.append(pad_size_variable_x)
4212
4212
  parameters.append(pad_size_variable_y)
@@ -4217,7 +4217,7 @@ class Edb(Database):
4217
4217
  "$antipad_diam_{}_{}".format(def_name, layer)
4218
4218
  )
4219
4219
  if antipad_diameter_variable not in self.variables: # pragma no cover
4220
- self.add_design_variable(antipad_diameter_variable, antipad.parameters_values[0])
4220
+ self.add_design_variable(antipad_diameter_variable, antipad.parameters_values_string[0])
4221
4221
  antipad.parameters = {"Diameter": antipad_diameter_variable}
4222
4222
  parameters.append(antipad_diameter_variable)
4223
4223
  if antipad.geometry_type == 2: # pragma no cover
@@ -4225,7 +4225,7 @@ class Edb(Database):
4225
4225
  "$antipad_size_{}_{}".format(def_name, layer)
4226
4226
  )
4227
4227
  if antipad_size_variable not in self.variables: # pragma no cover
4228
- self.add_design_variable(antipad_size_variable, antipad.parameters_values[0])
4228
+ self.add_design_variable(antipad_size_variable, antipad.parameters_values_string[0])
4229
4229
  antipad.parameters = {"Size": antipad_size_variable}
4230
4230
  parameters.append(antipad_size_variable)
4231
4231
  elif antipad.geometry_type == 3: # pragma no cover
@@ -4239,8 +4239,8 @@ class Edb(Database):
4239
4239
  antipad_size_variable_x not in self.variables
4240
4240
  and antipad_size_variable_y not in self.variables
4241
4241
  ): # pragma no cover
4242
- self.add_design_variable(antipad_size_variable_x, antipad.parameters_values[0])
4243
- self.add_design_variable(antipad_size_variable_y, antipad.parameters_values[1])
4242
+ self.add_design_variable(antipad_size_variable_x, antipad.parameters_values_string[0])
4243
+ self.add_design_variable(antipad_size_variable_y, antipad.parameters_values_string[1])
4244
4244
  antipad.parameters = {"XSize": antipad_size_variable_x, "YSize": antipad_size_variable_y}
4245
4245
  parameters.append(antipad_size_variable_x)
4246
4246
  parameters.append(antipad_size_variable_y)
@@ -86,3 +86,20 @@ class SParameterModel(Model):
86
86
 
87
87
  def component_model_name(self):
88
88
  self._edb_object.GetComponentModelName()
89
+
90
+
91
+ class SPICEModel(Model):
92
+ """Manages SPICE model class."""
93
+
94
+ def __init__(self, pedb, edb_object=None):
95
+ super().__init__(pedb, edb_object)
96
+
97
+ @property
98
+ def model_name(self):
99
+ """SPICE model name."""
100
+ return self._edb_object.GetModelName()
101
+
102
+ @property
103
+ def spice_file_path(self):
104
+ """SPICE file path."""
105
+ return self._edb_object.GetSPICEFilePath()
@@ -41,6 +41,8 @@ class Configuration:
41
41
  self._pedb = pedb
42
42
  self._components = self._pedb.components.components
43
43
  self.data = {}
44
+ self._s_parameter_library = ""
45
+ self._spice_model_library = ""
44
46
 
45
47
  @pyedb_function_handler
46
48
  def load(self, config_file, append=True, apply_file=False, output_file=None, open_at_the_end=True):
@@ -92,9 +94,22 @@ class Configuration:
92
94
  self._pedb.logger.error("No data loaded. Please load a configuration file.")
93
95
  return False
94
96
 
97
+ # Configure general settings
98
+ if "general" in self.data:
99
+ self._load_general()
100
+
101
+ # Configure nets
102
+ if "nets" in self.data:
103
+ self._load_nets()
104
+
105
+ # Configure components
95
106
  if "components" in self.data:
96
107
  self._load_components()
97
108
 
109
+ # Configure pin groups
110
+ if "pin_groups" in self.data:
111
+ self._load_pin_groups()
112
+
98
113
  # Configure ports
99
114
  if "ports" in self.data:
100
115
  self._load_ports()
@@ -115,6 +130,10 @@ class Configuration:
115
130
  if "s_parameters" in self.data:
116
131
  self._load_s_parameter()
117
132
 
133
+ # Configure SPICE models
134
+ if "spice_models" in self.data:
135
+ self._load_spice_models()
136
+
118
137
  return True
119
138
 
120
139
  @pyedb_function_handler
@@ -122,7 +141,7 @@ class Configuration:
122
141
  """Imports component information from json."""
123
142
 
124
143
  for comp in self.data["components"]:
125
- refdes = comp["reference_designator"]
144
+ ref_designator = comp["reference_designator"]
126
145
  part_type = comp["part_type"].lower()
127
146
  if part_type == "resistor":
128
147
  part_type = "Resistor"
@@ -137,7 +156,7 @@ class Configuration:
137
156
  else:
138
157
  part_type = "Other"
139
158
 
140
- comp_layout = self._components[refdes]
159
+ comp_layout = self._components[ref_designator]
141
160
  comp_layout.type = part_type
142
161
 
143
162
  if part_type in ["Resistor", "Capacitor", "Inductor"]:
@@ -213,7 +232,7 @@ class Configuration:
213
232
  height = solder_ball_properties["height"]
214
233
 
215
234
  self._pedb.components.set_solder_ball(
216
- component=refdes,
235
+ component=ref_designator,
217
236
  sball_diam=diameter,
218
237
  sball_mid_diam=mid_diameter,
219
238
  sball_height=height,
@@ -229,38 +248,48 @@ class Configuration:
229
248
  """Imports port information from json."""
230
249
  for port in self.data["ports"]:
231
250
  port_type = port["type"]
232
- refdes = port["reference_designator"]
233
- comp_layout = self._components[refdes]
234
- pos = port["from"]
235
- if "pin" in pos:
236
- pin_name = pos["pin"]
237
- port_name = "{}_{}".format(refdes, pin_name)
238
- pos_terminal = comp_layout.pins[pin_name].get_terminal(port_name, True)
239
- else: # Net
240
- net_name = pos["net"]
241
- port_name = "{}_{}".format(refdes, net_name)
242
- if port_type == "circuit":
243
- pg_name = "pg_{}".format(port_name)
244
- _, pg = self._pedb.siwave.create_pin_group_on_net(refdes, net_name, pg_name)
245
- pos_terminal = pg.get_terminal(port_name, True)
246
- else: # Coax port
247
- for _, p in comp_layout.pins.items():
248
- if p.net_name == net_name:
249
- pos_terminal = p.get_terminal(port_name, True)
250
- break
251
+
252
+ positive_terminal_json = port["positive_terminal"]
253
+ pos_terminal = ""
254
+ if "pin_group" in positive_terminal_json:
255
+ pin_group = self._pedb.siwave.pin_groups[positive_terminal_json["pin_group"]]
256
+ pos_terminal = pin_group.get_terminal(pin_group.name, True)
257
+ else:
258
+ ref_designator = port["reference_designator"]
259
+ comp_layout = self._components[ref_designator]
260
+
261
+ if "pin" in positive_terminal_json:
262
+ pin_name = positive_terminal_json["pin"]
263
+ port_name = "{}_{}".format(ref_designator, pin_name)
264
+ pos_terminal = comp_layout.pins[pin_name].get_terminal(port_name, True)
265
+ else: # Net
266
+ net_name = positive_terminal_json["net"]
267
+ port_name = "{}_{}".format(ref_designator, net_name)
268
+ if port_type == "circuit":
269
+ pg_name = "pg_{}".format(port_name)
270
+ _, pg = self._pedb.siwave.create_pin_group_on_net(ref_designator, net_name, pg_name)
271
+ pos_terminal = pg.get_terminal(port_name, True)
272
+ else: # Coax port
273
+ for _, p in comp_layout.pins.items():
274
+ if p.net_name == net_name:
275
+ pos_terminal = p.get_terminal(port_name, True)
276
+ break
251
277
 
252
278
  if port_type == "circuit":
253
- neg = port["to"]
254
- if "pin" in neg:
255
- pin_name = neg["pin"]
256
- port_name = "{}_{}_ref".format(refdes, pin_name)
279
+ negative_terminal_json = port["negative_terminal"]
280
+ if "pin_group" in negative_terminal_json:
281
+ pin_group = self._pedb.siwave.pin_groups[negative_terminal_json["pin_group"]]
282
+ neg_terminal = pin_group.get_terminal(pin_group.name + "_ref", True)
283
+ elif "pin" in negative_terminal_json:
284
+ pin_name = negative_terminal_json["pin"]
285
+ port_name = "{}_{}_ref".format(ref_designator, pin_name)
257
286
  neg_terminal = comp_layout.pins[pin_name].get_terminal(port_name, True)
258
287
  else:
259
- net_name = neg["net"]
260
- port_name = "{}_{}_ref".format(refdes, net_name)
288
+ net_name = negative_terminal_json["net"]
289
+ port_name = "{}_{}_ref".format(ref_designator, net_name)
261
290
  pg_name = "pg_{}".format(port_name)
262
291
  if pg_name not in self._pedb.siwave.pin_groups:
263
- _, pg = self._pedb.siwave.create_pin_group_on_net(refdes, net_name, pg_name)
292
+ _, pg = self._pedb.siwave.create_pin_group_on_net(ref_designator, net_name, pg_name)
264
293
  else:
265
294
  pg = self._pedb.siwave.pin_groups[pg_name]
266
295
  neg_terminal = pg.get_terminal(port_name, True)
@@ -275,36 +304,47 @@ class Configuration:
275
304
 
276
305
  for src in self.data["sources"]:
277
306
  src_type = src["type"]
278
- refdes = src["reference_designator"]
279
307
  name = src["name"]
280
- comp_layout = self._components[refdes]
281
-
282
- pos = src["from"]
283
- if "pin" in pos:
284
- pin_name = pos["pin"]
285
- src_name = name
286
- pos_terminal = comp_layout.pins[pin_name].get_terminal(src_name, True)
287
- elif "net" in pos: # Net
288
- net_name = pos["net"]
289
- src_name = "{}_{}".format(refdes, net_name)
290
- pg_name = "pg_{}".format(src_name)
291
- _, pg = self._pedb.siwave.create_pin_group_on_net(refdes, net_name, pg_name)
292
- pos_terminal = pg.get_terminal(src_name, True)
293
-
294
- neg = src["to"]
295
- if "pin" in neg:
296
- pin_name = neg["pin"]
297
- src_name = name + "_ref"
298
- neg_terminal = comp_layout.pins[pin_name].get_terminal(src_name, True)
299
- elif "net" in neg:
300
- net_name = neg["net"]
301
- src_name = name + "_ref"
302
- pg_name = "pg_{}".format(src_name)
303
- if pg_name not in self._pedb.siwave.pin_groups:
304
- _, pg = self._pedb.siwave.create_pin_group_on_net(refdes, net_name, pg_name)
305
- else: # pragma no cover
306
- pg = self._pedb.siwave.pin_groups[pg_name]
307
- neg_terminal = pg.get_terminal(src_name, True)
308
+
309
+ positive_terminal_json = src["positive_terminal"]
310
+ if "pin_group" in positive_terminal_json:
311
+ pin_group = self._pedb.siwave.pin_groups[positive_terminal_json["pin_group"]]
312
+ pos_terminal = pin_group.get_terminal(pin_group.name, True)
313
+ else:
314
+ ref_designator = src["reference_designator"]
315
+ comp_layout = self._components[ref_designator]
316
+
317
+ if "pin" in positive_terminal_json:
318
+ pin_name = positive_terminal_json["pin"]
319
+ src_name = name
320
+ pos_terminal = comp_layout.pins[pin_name].get_terminal(src_name, True)
321
+ elif "net" in positive_terminal_json: # Net
322
+ net_name = positive_terminal_json["net"]
323
+ src_name = "{}_{}".format(ref_designator, net_name)
324
+ pg_name = "pg_{}".format(src_name)
325
+ _, pg = self._pedb.siwave.create_pin_group_on_net(ref_designator, net_name, pg_name)
326
+ pos_terminal = pg.get_terminal(src_name, True)
327
+
328
+ negative_terminal_json = src["negative_terminal"]
329
+ if "pin_group" in negative_terminal_json:
330
+ pin_group = self._pedb.siwave.pin_groups[negative_terminal_json["pin_group"]]
331
+ neg_terminal = pin_group.get_terminal(pin_group.name + "_ref", True)
332
+ else:
333
+ ref_designator = src["reference_designator"]
334
+ comp_layout = self._components[ref_designator]
335
+ if "pin" in negative_terminal_json:
336
+ pin_name = negative_terminal_json["pin"]
337
+ src_name = name + "_ref"
338
+ neg_terminal = comp_layout.pins[pin_name].get_terminal(src_name, True)
339
+ elif "net" in negative_terminal_json:
340
+ net_name = negative_terminal_json["net"]
341
+ src_name = name + "_ref"
342
+ pg_name = "pg_{}".format(src_name)
343
+ if pg_name not in self._pedb.siwave.pin_groups:
344
+ _, pg = self._pedb.siwave.create_pin_group_on_net(ref_designator, net_name, pg_name)
345
+ else: # pragma no cover
346
+ pg = self._pedb.siwave.pin_groups[pg_name]
347
+ neg_terminal = pg.get_terminal(src_name, True)
308
348
 
309
349
  if src_type == "voltage":
310
350
  src_obj = self._pedb.create_voltage_source(pos_terminal, neg_terminal)
@@ -430,6 +470,8 @@ class Configuration:
430
470
 
431
471
  for sp in self.data["s_parameters"]:
432
472
  fpath = sp["file_path"]
473
+ if not Path(fpath).anchor:
474
+ fpath = str(Path(self._s_parameter_library) / fpath)
433
475
  sp_name = sp["name"]
434
476
  comp_def_name = sp["component_definition"]
435
477
  comp_def = self._pedb.definitions.component[comp_def_name]
@@ -442,3 +484,55 @@ class Configuration:
442
484
  for refdes, comp in comp_def.components.items():
443
485
  if refdes in sp["components"]:
444
486
  comp.use_s_parameter_model(sp_name)
487
+
488
+ @pyedb_function_handler
489
+ def _load_spice_models(self):
490
+ """Imports SPICE information from json."""
491
+
492
+ for sp in self.data["spice_models"]:
493
+ fpath = sp["file_path"]
494
+ if not Path(fpath).anchor:
495
+ fpath = str(Path(self._spice_model_library) / fpath)
496
+ sp_name = sp["name"]
497
+ sub_circuit_name = sp.get("sub_circuit_name", None)
498
+ comp_def_name = sp["component_definition"]
499
+ comp_def = self._pedb.definitions.component[comp_def_name]
500
+ comps = comp_def.components
501
+ if sp["apply_to_all"]:
502
+ for refdes, comp in comps.items():
503
+ if refdes not in sp["components"]:
504
+ comp.assign_spice_model(fpath, sp_name, sub_circuit_name)
505
+ else:
506
+ for refdes, comp in comps.items():
507
+ if refdes in sp["components"]:
508
+ comp.assign_spice_model(fpath, sp_name, sub_circuit_name)
509
+
510
+ @pyedb_function_handler
511
+ def _load_pin_groups(self):
512
+ """Imports pin groups information from JSON."""
513
+ for pg in self.data["pin_groups"]:
514
+ name = pg["name"]
515
+ ref_designator = pg["reference_designator"]
516
+ if "pins" in pg:
517
+ self._pedb.siwave.create_pin_group(ref_designator, pg["pins"], name)
518
+ elif "net" in pg:
519
+ self._pedb.siwave.create_pin_group_on_net(ref_designator, pg["net"], name)
520
+
521
+ @pyedb_function_handler
522
+ def _load_nets(self):
523
+ """Imports nets information from JSON."""
524
+ nets = self._pedb.nets.nets
525
+ for i in self.data["nets"]["power_ground_nets"]:
526
+ nets[i].is_power_ground = True
527
+
528
+ for i in self.data["nets"]["signal_nets"]:
529
+ nets[i].is_power_ground = False
530
+
531
+ @pyedb_function_handler
532
+ def _load_general(self):
533
+ """Imports general information from JSON."""
534
+ general = self.data["general"]
535
+ if "s_parameter_library" in general:
536
+ self._s_parameter_library = general["s_parameter_library"]
537
+ if "spice_model_library" in general:
538
+ self._spice_model_library = general["spice_model_library"]
@@ -24,7 +24,7 @@ import logging
24
24
  import re
25
25
  import warnings
26
26
 
27
- from pyedb.dotnet.edb_core.cell.hierarchy.model import PinPairModel
27
+ from pyedb.dotnet.edb_core.cell.hierarchy.model import PinPairModel, SPICEModel
28
28
  from pyedb.dotnet.edb_core.definition.package_def import PackageDef
29
29
  from pyedb.dotnet.edb_core.edb_data.padstacks_data import EDBPadstackInstance
30
30
  from pyedb.generic.general_methods import is_ironpython
@@ -222,6 +222,8 @@ class EDBComponent(object):
222
222
  model_type = edb_object.ToString().split(".")[-1]
223
223
  if model_type == "PinPairModel":
224
224
  return PinPairModel(self._pedb, edb_object)
225
+ elif model_type == "SPICEModel":
226
+ return SPICEModel(self._pedb, edb_object)
225
227
 
226
228
  @model.setter
227
229
  def model(self, value):
@@ -912,7 +914,7 @@ class EDBComponent(object):
912
914
  return True
913
915
 
914
916
  @pyedb_function_handler()
915
- def assign_spice_model(self, file_path, name=None):
917
+ def assign_spice_model(self, file_path, name=None, sub_circuit_name=None):
916
918
  """Assign Spice model to this component.
917
919
 
918
920
  Parameters
@@ -940,6 +942,8 @@ class EDBComponent(object):
940
942
  model = self._edb.cell.hierarchy._hierarchy.SPICEModel()
941
943
  model.SetModelPath(file_path)
942
944
  model.SetModelName(name)
945
+ if sub_circuit_name:
946
+ model.SetSubCkt(sub_circuit_name)
943
947
  terminal = 1
944
948
  for pn in pinNames:
945
949
  model.AddTerminalPinPair(pn, str(terminal))
@@ -144,6 +144,11 @@ class EDBPadProperties(object):
144
144
  """
145
145
  return [i.tofloat for i in self.parameters.values()]
146
146
 
147
+ @property
148
+ def parameters_values_string(self):
149
+ """Parameters value in string format."""
150
+ return [i.tostring for i in self.parameters.values()]
151
+
147
152
  @property
148
153
  def polygon_data(self):
149
154
  """Parameters.
@@ -499,6 +504,21 @@ class EDBPadstack(object):
499
504
  self._hole_parameters = self.hole_params[2]
500
505
  return self._hole_parameters
501
506
 
507
+ @property
508
+ def hole_diameter(self):
509
+ """Hole diameter."""
510
+ return list(self.hole_params[2])[0].ToDouble()
511
+
512
+ @hole_diameter.setter
513
+ def hole_diameter(self, value):
514
+ params = convert_py_list_to_net_list([self._get_edb_value(value)])
515
+ self._update_hole_parameters(params=params)
516
+
517
+ @property
518
+ def hole_diameter_string(self):
519
+ """Hole diameter in string format."""
520
+ return list(self.hole_params[2])[0].ToString()
521
+
502
522
  @pyedb_function_handler()
503
523
  def _update_hole_parameters(self, hole_type=None, params=None, offsetx=None, offsety=None, rotation=None):
504
524
  """Update hole parameters.
@@ -1165,7 +1165,7 @@ class EdbHfss(object):
1165
1165
  if not ref_prim:
1166
1166
  self._logger.error("Failed to collect valid reference primitives for terminal")
1167
1167
  if ref_prim:
1168
- reference_layer = ref_prim[0].layer
1168
+ reference_layer = ref_prim[0].layer._edb_layer
1169
1169
  if term.SetReferenceLayer(reference_layer): # pragma no cover
1170
1170
  self._logger.info("Port {} created".format(port_name))
1171
1171
  return terminal_info
@@ -1126,7 +1126,7 @@ class EdbLayout(object):
1126
1126
  return True
1127
1127
 
1128
1128
  @pyedb_function_handler()
1129
- def unite_polygons_on_layer(self, layer_name=None, delete_padstack_gemometries=False, net_list=[]):
1129
+ def unite_polygons_on_layer(self, layer_name=None, delete_padstack_gemometries=False, net_names_list=[]):
1130
1130
  """Try to unite all Polygons on specified layer.
1131
1131
 
1132
1132
  Parameters
@@ -1135,8 +1135,8 @@ class EdbLayout(object):
1135
1135
  Name of layer name to unite objects on. The default is ``None``, in which case all layers are taken.
1136
1136
  delete_padstack_gemometries : bool, optional
1137
1137
  Whether to delete all padstack geometries. The default is ``False``.
1138
- net_list : list[str] : optional
1139
- Net list filter. The default is ``[]``, in which case all nets are taken.
1138
+ net_names_list : list[str] : optional
1139
+ Net names list filter. The default is ``[]``, in which case all nets are taken.
1140
1140
 
1141
1141
  Returns
1142
1142
  -------
@@ -1151,6 +1151,9 @@ class EdbLayout(object):
1151
1151
  for lay in layer_name:
1152
1152
  self._logger.info("Uniting Objects on layer %s.", lay)
1153
1153
  poly_by_nets = {}
1154
+ all_voids = []
1155
+ list_polygon_data = []
1156
+ delete_list = []
1154
1157
  if lay in list(self.polygons_by_layer.keys()):
1155
1158
  for poly in self.polygons_by_layer[lay]:
1156
1159
  if not poly.GetNet().GetName() in list(poly_by_nets.keys()):
@@ -1160,34 +1163,35 @@ class EdbLayout(object):
1160
1163
  if poly.GetNet().GetName():
1161
1164
  poly_by_nets[poly.GetNet().GetName()].append(poly)
1162
1165
  for net in poly_by_nets:
1163
- if net in net_list or not net_list: # pragma no cover
1164
- list_polygon_data = [i.GetPolygonData() for i in poly_by_nets[net]]
1165
- all_voids = [i.Voids for i in poly_by_nets[net]]
1166
- a = self._edb.geometry.polygon_data.unite(convert_py_list_to_net_list(list_polygon_data))
1167
- for item in a:
1168
- for v in all_voids:
1169
- for void in v:
1170
- if int(item.GetIntersectionType(void.GetPolygonData())) == 2:
1171
- item.AddHole(void.GetPolygonData())
1172
- poly = self._edb.cell.primitive.polygon.create(
1173
- self._active_layout,
1174
- lay,
1175
- self._pedb.nets.nets[net],
1176
- item,
1177
- )
1178
- list_to_delete = [i for i in poly_by_nets[net]]
1179
- for v in all_voids:
1180
- for void in v:
1181
- for poly in poly_by_nets[net]: # pragma no cover
1182
- if int(void.GetPolygonData().GetIntersectionType(poly.GetPolygonData())) >= 2:
1183
- try:
1184
- id = list_to_delete.index(poly)
1185
- except ValueError:
1186
- id = -1
1187
- if id >= 0:
1188
- list_to_delete.pop(id)
1189
-
1190
- [i.Delete() for i in list_to_delete] # pragma no cover
1166
+ if net in net_names_list or not net_names_list:
1167
+ for i in poly_by_nets[net]:
1168
+ list_polygon_data.append(i.GetPolygonData())
1169
+ delete_list.append(i)
1170
+ all_voids.append(i.Voids)
1171
+ a = self._edb.geometry.polygon_data.unite(convert_py_list_to_net_list(list_polygon_data))
1172
+ for item in a:
1173
+ for v in all_voids:
1174
+ for void in v:
1175
+ if int(item.GetIntersectionType(void.GetPolygonData())) == 2:
1176
+ item.AddHole(void.GetPolygonData())
1177
+ poly = self._edb.cell.primitive.polygon.create(
1178
+ self._active_layout,
1179
+ lay,
1180
+ self._pedb.nets.nets[net],
1181
+ item,
1182
+ )
1183
+ for v in all_voids:
1184
+ for void in v:
1185
+ for poly in poly_by_nets[net]: # pragma no cover
1186
+ if int(void.GetPolygonData().GetIntersectionType(poly.GetPolygonData())) >= 2:
1187
+ try:
1188
+ id = delete_list.index(poly)
1189
+ except ValueError:
1190
+ id = -1
1191
+ if id >= 0:
1192
+ delete_list.pop(id)
1193
+ for poly in delete_list:
1194
+ poly.Delete()
1191
1195
 
1192
1196
  if delete_padstack_gemometries:
1193
1197
  self._logger.info("Deleting Padstack Definitions")
@@ -1218,12 +1218,12 @@ class EdbNets(object):
1218
1218
  )
1219
1219
 
1220
1220
  @pyedb_function_handler()
1221
- def merge_nets_polygons(self, net_list):
1221
+ def merge_nets_polygons(self, net_names_list):
1222
1222
  """Convert paths from net into polygons, evaluate all connected polygons and perform the merge.
1223
1223
 
1224
1224
  Parameters
1225
1225
  ----------
1226
- net_list : str or list[str]
1226
+ net_names_list : str or list[str]
1227
1227
  Net name of list of net name.
1228
1228
 
1229
1229
  Returns
@@ -1232,6 +1232,6 @@ class EdbNets(object):
1232
1232
  ``True`` when successful, ``False`` when failed.
1233
1233
 
1234
1234
  """
1235
- if isinstance(net_list, str):
1236
- net_list = [net_list]
1237
- return self._pedb.modeler.unite_polygons_on_layer(net_list=net_list)
1235
+ if isinstance(net_names_list, str):
1236
+ net_names_list = [net_names_list]
1237
+ return self._pedb.modeler.unite_polygons_on_layer(net_names_list=net_names_list)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes