pyedb 0.54.0__py3-none-any.whl → 0.56.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.

Files changed (105) hide show
  1. pyedb/__init__.py +1 -8
  2. pyedb/configuration/cfg_boundaries.py +69 -151
  3. pyedb/configuration/cfg_components.py +201 -460
  4. pyedb/configuration/cfg_data.py +4 -2
  5. pyedb/configuration/cfg_general.py +13 -36
  6. pyedb/configuration/cfg_modeler.py +2 -1
  7. pyedb/configuration/cfg_nets.py +21 -35
  8. pyedb/configuration/cfg_operations.py +22 -151
  9. pyedb/configuration/cfg_package_definition.py +56 -112
  10. pyedb/configuration/cfg_padstacks.py +292 -688
  11. pyedb/configuration/cfg_pin_groups.py +32 -79
  12. pyedb/configuration/cfg_ports_sources.py +19 -6
  13. pyedb/configuration/cfg_s_parameter_models.py +67 -172
  14. pyedb/configuration/cfg_setup.py +102 -295
  15. pyedb/configuration/configuration.py +64 -5
  16. pyedb/dotnet/database/Variables.py +26 -19
  17. pyedb/dotnet/database/cell/connectable.py +38 -9
  18. pyedb/dotnet/database/cell/hierarchy/component.py +28 -28
  19. pyedb/dotnet/database/cell/hierarchy/model.py +1 -1
  20. pyedb/dotnet/database/cell/layout.py +63 -2
  21. pyedb/dotnet/database/cell/layout_obj.py +2 -2
  22. pyedb/dotnet/database/cell/primitive/path.py +6 -8
  23. pyedb/dotnet/database/cell/primitive/primitive.py +3 -24
  24. pyedb/dotnet/database/cell/terminal/edge_terminal.py +2 -2
  25. pyedb/dotnet/database/cell/terminal/padstack_instance_terminal.py +1 -1
  26. pyedb/dotnet/database/cell/terminal/pingroup_terminal.py +1 -1
  27. pyedb/dotnet/database/cell/terminal/point_terminal.py +1 -1
  28. pyedb/dotnet/database/cell/terminal/terminal.py +24 -24
  29. pyedb/dotnet/database/cell/voltage_regulator.py +0 -21
  30. pyedb/dotnet/database/components.py +137 -124
  31. pyedb/dotnet/database/definition/component_def.py +4 -4
  32. pyedb/dotnet/database/definition/component_model.py +1 -1
  33. pyedb/dotnet/database/definition/package_def.py +2 -3
  34. pyedb/dotnet/database/dotnet/database.py +3 -199
  35. pyedb/dotnet/database/dotnet/primitive.py +3 -3
  36. pyedb/dotnet/database/edb_data/control_file.py +5 -5
  37. pyedb/dotnet/database/edb_data/hfss_extent_info.py +6 -6
  38. pyedb/dotnet/database/edb_data/layer_data.py +23 -23
  39. pyedb/dotnet/database/edb_data/padstacks_data.py +63 -88
  40. pyedb/dotnet/database/edb_data/primitives_data.py +5 -5
  41. pyedb/dotnet/database/edb_data/sources.py +6 -6
  42. pyedb/dotnet/database/edb_data/variables.py +1 -1
  43. pyedb/dotnet/database/geometry/point_data.py +14 -10
  44. pyedb/dotnet/database/geometry/polygon_data.py +3 -3
  45. pyedb/dotnet/database/hfss.py +46 -48
  46. pyedb/dotnet/database/layout_validation.py +14 -11
  47. pyedb/dotnet/database/materials.py +10 -11
  48. pyedb/dotnet/database/modeler.py +97 -91
  49. pyedb/dotnet/database/nets.py +19 -22
  50. pyedb/dotnet/database/padstack.py +171 -83
  51. pyedb/dotnet/database/siwave.py +42 -42
  52. pyedb/dotnet/database/stackup.py +140 -72
  53. pyedb/dotnet/database/utilities/heatsink.py +4 -4
  54. pyedb/dotnet/database/utilities/obj_base.py +2 -2
  55. pyedb/dotnet/database/utilities/simulation_setup.py +2 -2
  56. pyedb/dotnet/database/utilities/value.py +16 -16
  57. pyedb/dotnet/edb.py +230 -152
  58. pyedb/edb_logger.py +12 -27
  59. pyedb/extensions/create_cell_array.py +394 -0
  60. pyedb/extensions/via_design_backend.py +6 -3
  61. pyedb/generic/data_handlers.py +6 -7
  62. pyedb/generic/design_types.py +81 -30
  63. pyedb/generic/filesystem.py +5 -2
  64. pyedb/generic/general_methods.py +2 -122
  65. pyedb/generic/process.py +44 -108
  66. pyedb/generic/settings.py +79 -19
  67. pyedb/grpc/database/components.py +26 -4
  68. pyedb/grpc/database/control_file.py +5 -5
  69. pyedb/grpc/database/definition/materials.py +1 -1
  70. pyedb/grpc/database/definition/package_def.py +3 -3
  71. pyedb/grpc/database/definition/padstack_def.py +53 -0
  72. pyedb/grpc/database/geometry/polygon_data.py +1 -1
  73. pyedb/grpc/database/layout/layout.py +81 -5
  74. pyedb/grpc/database/layout_validation.py +5 -5
  75. pyedb/grpc/database/modeler.py +24 -16
  76. pyedb/grpc/database/net/net.py +15 -14
  77. pyedb/grpc/database/nets.py +70 -0
  78. pyedb/grpc/database/padstacks.py +122 -17
  79. pyedb/grpc/database/primitive/padstack_instance.py +175 -7
  80. pyedb/grpc/database/primitive/polygon.py +2 -2
  81. pyedb/grpc/database/simulation_setup/siwave_cpa_simulation_setup.py +3 -2
  82. pyedb/grpc/database/siwave.py +1 -1
  83. pyedb/grpc/database/source_excitations.py +12 -5
  84. pyedb/grpc/database/stackup.py +1 -1
  85. pyedb/grpc/database/terminal/bundle_terminal.py +1 -1
  86. pyedb/grpc/database/terminal/padstack_instance_terminal.py +1 -1
  87. pyedb/grpc/database/terminal/pingroup_terminal.py +1 -1
  88. pyedb/grpc/database/utility/value.py +1 -0
  89. pyedb/grpc/database/utility/xml_control_file.py +5 -5
  90. pyedb/grpc/edb.py +80 -30
  91. pyedb/grpc/edb_init.py +3 -3
  92. pyedb/grpc/rpc_session.py +14 -13
  93. pyedb/libraries/common.py +366 -0
  94. pyedb/libraries/rf_libraries/base_functions.py +1358 -0
  95. pyedb/libraries/rf_libraries/planar_antennas.py +628 -0
  96. pyedb/misc/decorators.py +61 -0
  97. pyedb/misc/misc.py +0 -13
  98. pyedb/modeler/geometry_operators.py +6 -6
  99. pyedb/siwave.py +6 -8
  100. pyedb/siwave_core/__init__.py +0 -0
  101. pyedb/siwave_core/cpa/__init__.py +0 -0
  102. {pyedb-0.54.0.dist-info → pyedb-0.56.0.dist-info}/METADATA +1 -2
  103. {pyedb-0.54.0.dist-info → pyedb-0.56.0.dist-info}/RECORD +105 -98
  104. {pyedb-0.54.0.dist-info → pyedb-0.56.0.dist-info}/WHEEL +0 -0
  105. {pyedb-0.54.0.dist-info → pyedb-0.56.0.dist-info}/licenses/LICENSE +0 -0
@@ -25,466 +25,207 @@ from pyedb.dotnet.database.general import pascal_to_snake, snake_to_pascal
25
25
 
26
26
 
27
27
  class CfgComponent(CfgBase):
28
- class Grpc:
29
- @property
30
- def pyedb_obj(self):
31
- return self.parent.pyedb_obj
32
-
33
- def __init__(self, parent):
34
- self.parent = parent
35
- self.pedb = parent.pedb
36
-
37
- def retrieve_model_properties_from_edb(self):
38
- from ansys.edb.core.hierarchy.netlist_model import (
39
- NetlistModel as GrpcNetlistModel,
40
- )
41
- from ansys.edb.core.hierarchy.pin_pair_model import (
42
- PinPairModel as GrpcPinPairModel,
43
- )
44
- from ansys.edb.core.hierarchy.sparameter_model import (
45
- SParameterModel as GrpcSParameterModel,
46
- )
47
- from ansys.edb.core.hierarchy.spice_model import (
48
- SPICEModel as GrpcSPICEModel,
49
- )
50
-
51
- c_p = self.pyedb_obj.component_property
52
- model = c_p.model
53
- if isinstance(model, GrpcNetlistModel):
54
- self.parent.netlist_model["netlist"] = model.netlist
55
- elif isinstance(model, GrpcPinPairModel):
56
- temp = {}
57
- for i in model.pin_pairs():
58
- temp["first_pin"] = i[0]
59
- temp["second_pin"] = i[1]
60
- rlc = model.rlc(i)
61
- temp["is_parallel"] = rlc.is_parallel
62
- temp["resistance"] = rlc.r.value
63
- temp["resistance_enabled"] = rlc.r_enabled
64
- temp["inductance"] = rlc.l.value
65
- temp["inductance_enabled"] = rlc.l_enabled
66
- temp["capacitance"] = rlc.c.value
67
- temp["capacitance_enabled"] = rlc.c_enabled
68
- self.parent.pin_pair_model.append(temp)
69
- elif isinstance(model, GrpcSParameterModel):
70
- self.parent.s_parameter_model["reference_net"] = model.reference_net
71
- self.parent.s_parameter_model["model_name"] = model.component_model
72
- elif isinstance(model, GrpcSPICEModel):
73
- self.parent.spice_model["model_name"] = model.model_name
74
- self.parent.spice_model["model_path"] = model.model_path
75
- self.parent.spice_model["sub_circuit"] = model.sub_circuit
76
- # check bug #525 status
77
- self.parent.spice_model["terminal_pairs"] = [[i, j] for i, j in dict(model.terminals.items())]
78
-
79
- def _set_model_properties_to_edb(self):
80
- c_p = self.pyedb_obj.component_property
81
- if self.parent.netlist_model:
82
- m = self.pedb._edb.Cell.Hierarchy.SParameterModel()
83
- m.net_list = self.parent.netlist_model["netlist"]
84
- c_p.model = m
85
- self.component_property = c_p
86
- elif self.parent.pin_pair_model:
87
- from ansys.edb.core.hierarchy.pin_pair_model import (
88
- PinPairModel as GrpcPinPairModel,
89
- )
90
- from ansys.edb.core.utility.rlc import Rlc as GrpcRlc
91
- from ansys.edb.core.utility.value import Value as GrpcValue
92
-
93
- m = GrpcPinPairModel.create()
94
- for i in self.parent.pin_pair_model:
95
- p = (str(i["first_pin"]), str(i["second_pin"]))
96
- rlc = GrpcRlc(
97
- r_enabled=i["resistance_enabled"],
98
- r=GrpcValue(i["resistance"]),
99
- l_enabled=i["inductance_enabled"],
100
- l=GrpcValue(i["inductance"]),
101
- c_enabled=i["capacitance_enabled"],
102
- c=GrpcValue(i["capacitance"]),
103
- is_parallel=i["is_parallel"],
104
- )
105
- m.set_rlc(pin_pair=p, rlc=rlc)
106
- c_p.model = m
107
- from ansys.edb.core.hierarchy.pin_pair_model import (
108
- PinPairModel as GrpcPinPairModel,
109
- )
110
-
111
- self.pyedb_obj.component_property = c_p
112
- elif self.parent.s_parameter_model:
113
- from ansys.edb.core.hierarchy.sparameter_model import (
114
- SParameterModel as GrpcSParameterModel,
115
- )
116
-
117
- m = GrpcSParameterModel.create(
118
- name=self.parent.s_parameter_model["model_name"],
119
- ref_net=self.parent.s_parameter_model["reference_net"],
28
+ def retrieve_model_properties_from_edb(self):
29
+ c_p = self.pyedb_obj.component_property
30
+ model = c_p.GetModel().Clone()
31
+
32
+ if model.GetModelType().ToString() == "NetlistModel":
33
+ self.netlist_model["netlist"] = model.GetNetlist()
34
+ elif model.GetModelType().ToString() == "PinPairModel":
35
+ temp = {}
36
+ for i in model.PinPairs:
37
+ temp["first_pin"] = i.FirstPin
38
+ temp["second_pin"] = i.SecondPin
39
+ rlc = model.GetPinPairRlc(i)
40
+ temp["is_parallel"] = rlc.IsParallel
41
+ temp["resistance"] = rlc.R.ToString()
42
+ temp["resistance_enabled"] = rlc.REnabled
43
+ temp["inductance"] = rlc.L.ToString()
44
+ temp["inductance_enabled"] = rlc.LEnabled
45
+ temp["capacitance"] = rlc.C.ToString()
46
+ temp["capacitance_enabled"] = rlc.CEnabled
47
+ self.pin_pair_model.append(temp)
48
+ elif model.GetModelType().ToString() == "SParameterModel":
49
+ self.s_parameter_model["reference_net"] = model.GetReferenceNet()
50
+ self.s_parameter_model["model_name"] = model.GetComponentModelName()
51
+ elif model.GetModelType().ToString() == "SPICEModel":
52
+ self.spice_model["model_name"] = model.GetModelName()
53
+ self.spice_model["model_path"] = model.GetModelPath()
54
+ self.spice_model["sub_circuit"] = model.GetSubCkt()
55
+ self.spice_model["terminal_pairs"] = [[i, j] for i, j in dict(model.GetTerminalPinPairs()).items()]
56
+
57
+ def _set_ic_die_properties_to_edb(self):
58
+ cp = self.pyedb_obj.component_property
59
+ ic_die_prop = cp.GetDieProperty().Clone()
60
+ die_type = self.ic_die_properties.get("type")
61
+ ic_die_prop.SetType(getattr(self._pedb._edb.Definition.DieType, snake_to_pascal(die_type)))
62
+ if not die_type == "no_die":
63
+ orientation = self.ic_die_properties.get("orientation")
64
+ if orientation:
65
+ ic_die_prop.SetOrientation(
66
+ getattr(self._pedb._edb.Definition.DieOrientation, snake_to_pascal(orientation))
120
67
  )
121
- c_p.model = m
122
- self.component_property = c_p
123
- elif self.parent.spice_model:
124
- self.pyedb_obj.assign_spice_model(
125
- self.parent.spice_model["model_path"],
126
- self.parent.spice_model["model_name"],
127
- self.parent.spice_model["sub_circuit"],
128
- self.parent.spice_model["terminal_pairs"],
68
+ if die_type == "wire_bond":
69
+ height = self.ic_die_properties.get("height")
70
+ if height:
71
+ ic_die_prop.SetHeight(self._pedb.edb_value(height))
72
+ cp.SetDieProperty(ic_die_prop)
73
+ self.pyedb_obj.component_property = cp
74
+
75
+ def _set_port_properties_to_edb(self):
76
+ cp = self.pyedb_obj.component_property
77
+ port_prop = cp.GetPortProperty().Clone()
78
+ height = self.port_properties.get("reference_height")
79
+ if height:
80
+ port_prop.SetReferenceHeight(self._pedb.edb_value(height))
81
+ reference_size_auto = self.port_properties.get("reference_size_auto")
82
+ if reference_size_auto is not None:
83
+ port_prop.SetReferenceSizeAuto(reference_size_auto)
84
+ reference_size_x = self.port_properties.get("reference_size_x", 0)
85
+ reference_size_y = self.port_properties.get("reference_size_y", 0)
86
+ port_prop.SetReferenceSize(self._pedb.edb_value(reference_size_x), self._pedb.edb_value(reference_size_y))
87
+ cp.SetPortProperty(port_prop)
88
+ self.pyedb_obj.component_property = cp
89
+
90
+ def _set_model_properties_to_edb(self):
91
+ c_p = self.pyedb_obj.component_property
92
+ if self.netlist_model:
93
+ m = self._pedb._edb.Cell.Hierarchy.SParameterModel()
94
+ m.SetNetlist(self.netlist_model["netlist"])
95
+ c_p.SetModel(m)
96
+ self.component_property = c_p
97
+ elif self.pin_pair_model:
98
+ m = self._pedb._edb.Cell.Hierarchy.PinPairModel()
99
+ for i in self.pin_pair_model:
100
+ p = self._pedb._edb.Utility.PinPair(str(i["first_pin"]), str(i["second_pin"]))
101
+ rlc = self._pedb._edb.Utility.Rlc(
102
+ self._pedb.edb_value(i["resistance"]),
103
+ i["resistance_enabled"],
104
+ self._pedb.edb_value(i["inductance"]),
105
+ i["inductance_enabled"],
106
+ self._pedb.edb_value(i["capacitance"]),
107
+ i["capacitance_enabled"],
108
+ i["is_parallel"],
129
109
  )
130
-
131
- def _retrieve_ic_die_properties_from_edb(self):
132
- temp = dict()
133
- cp = self.pyedb_obj.component_property
134
-
135
- ic_die_prop = cp.die_property
136
- die_type = pascal_to_snake(ic_die_prop.die_type.name)
137
- temp["type"] = die_type
138
- if not die_type == "no_die":
139
- temp["orientation"] = ic_die_prop.die_orientation.name.lower()
140
- if die_type == "wire_bond":
141
- temp["height"] = str(ic_die_prop.height.value)
142
-
143
- self.parent.ic_die_properties = temp
144
-
145
- def _set_ic_die_properties_to_edb(self):
146
- from ansys.edb.core.definition.die_property import (
147
- DieOrientation as GrpcDieOrientation,
110
+ m.SetPinPairRlc(p, rlc)
111
+ c_p.SetModel(m)
112
+ self.pyedb_obj.component_property = c_p
113
+ elif self.s_parameter_model:
114
+ m = self._pedb._edb.Cell.Hierarchy.SParameterModel()
115
+ m.SetComponentModelName(self.s_parameter_model["model_name"])
116
+ m.SetReferenceNet(self.s_parameter_model["reference_net"])
117
+ c_p.SetModel(m)
118
+ self.component_property = c_p
119
+ elif self.spice_model:
120
+ self.pyedb_obj.assign_spice_model(
121
+ self.spice_model["model_path"],
122
+ self.spice_model["model_name"],
123
+ self.spice_model["sub_circuit"],
124
+ self.spice_model["terminal_pairs"],
148
125
  )
149
- from ansys.edb.core.definition.die_property import DieType as GrpcDieType
150
- from ansys.edb.core.utility.value import Value as GrpcValue
151
-
152
- cp = self.pyedb_obj.component_property
153
- ic_die_prop = cp.die_property
154
- die_type = self.parent.ic_die_properties.get("type")
155
- die_type = snake_to_pascal(die_type)
156
- if die_type == "wirebond":
157
- ic_die_prop.die_type = GrpcDieType.WIREBOND
158
- elif die_type == "flipchip":
159
- ic_die_prop.die_type = GrpcDieType.FLIPCHIP
160
- elif not die_type == "no_die":
161
- orientation = self.parent.ic_die_properties.get("orientation")
162
- if orientation == "chip_up":
163
- ic_die_prop.die_orientation = GrpcDieOrientation.CHIP_UP
164
- else:
165
- ic_die_prop.die_orientation = GrpcDieOrientation.CHIP_DOWN
166
- if die_type == "wire_bond":
167
- height = self.parent.ic_die_properties.get("height")
168
- if height:
169
- ic_die_prop.height = GrpcValue(height)
170
- cp.die_property = ic_die_prop
171
- self.pyedb_obj.component_property = cp
172
-
173
- def _retrieve_solder_ball_properties_from_edb(self):
174
- temp = dict()
175
- cp = self.pyedb_obj.component_property
176
- solder_ball_prop = None
177
- try:
178
- solder_ball_prop = cp.solder_ball_property
179
- diam, mid_diam = solder_ball_prop.get_diameter()
180
- height = solder_ball_prop.height
181
- shape = solder_ball_prop.shape.name
182
- material = solder_ball_prop.material_name
183
- uses_solder_ball = solder_ball_prop.uses_solderball
184
-
185
- temp["uses_solder_ball"] = uses_solder_ball
186
- temp["shape"] = shape.lower()
187
- temp["diameter"] = str(diam)
188
- temp["mid_diameter"] = str(mid_diam)
189
- temp["height"] = str(height)
190
- temp["material"] = material
191
-
192
- self.parent.solder_ball_properties = temp
193
- except:
194
- if not solder_ball_prop:
195
- self.pedb.logger.warning(
196
- f"Failed retrieving solder balls property on component {self.pyedb_obj.name}"
197
- )
198
-
199
- def _set_solder_ball_properties_to_edb(self):
200
- from ansys.edb.core.definition.solder_ball_property import (
201
- SolderballShape as GrpcSolderballShape,
202
- )
203
- from ansys.edb.core.utility.value import Value as GrpcValue
204
-
205
- cp = self.pyedb_obj.component_property
206
- solder_ball_prop = cp.solder_ball_property
207
- shape = self.parent.solder_ball_properties.get("shape")
208
- if shape == "cylinder":
209
- solder_ball_prop.shape = GrpcSolderballShape.SOLDERBALL_CYLINDER
210
- diameter = self.parent.solder_ball_properties["diameter"]
211
- solder_ball_prop.set_diameter(GrpcValue(diameter), GrpcValue(diameter))
212
- elif shape == "spheroid":
213
- solder_ball_prop.shape = GrpcSolderballShape.SOLDERBALL_SPHEROID
214
- diameter = self.parent.solder_ball_properties["diameter"]
215
- mid_diameter = self.parent.solder_ball_properties["mid_diameter"]
216
- solder_ball_prop.set_diameter(GrpcValue(diameter), GrpcValue(mid_diameter))
217
- else:
218
- raise ValueError("Solderball shape must be either cylinder or spheroid")
219
-
220
- solder_ball_prop.height = GrpcValue(self.parent.solder_ball_properties["height"])
221
- solder_ball_prop.material_name = self.parent.solder_ball_properties.get("material", "solder")
222
- cp.solder_ball_property = solder_ball_prop
223
- self.pyedb_obj.component_property = cp
224
126
 
225
- def _retrieve_port_properties_from_edb(self):
226
- temp = dict()
227
- cp = self.pyedb_obj.component_property
228
- c_type = self.parent.type.lower()
229
- if c_type not in ["ic", "io", "other"]:
230
- return
231
- else:
232
- try:
233
- port_prop = cp.port_property
234
- reference_height = port_prop.reference_height.value
235
- reference_size_auto = port_prop.reference_size_auto
236
- reference_size_x, reference_size_y = port_prop.get_reference_size()
237
- temp["reference_height"] = reference_height
238
- temp["reference_size_auto"] = reference_size_auto
239
- temp["reference_size_x"] = reference_size_x.value
240
- temp["reference_size_y"] = reference_size_y.value
241
- self.parent.port_properties = temp
242
- except:
243
- self.pedb.logger.warning(f"No port property found on component {self.pyedb_obj.name}")
244
-
245
- def _set_port_properties_to_edb(self):
246
- from ansys.edb.core.utility.value import Value as GrpcValue
247
-
248
- cp = self.pyedb_obj.component_property
249
- port_prop = cp.port_property
250
- height = self.parent.port_properties.get("reference_height")
251
- if height:
252
- port_prop.reference_height = GrpcValue(height)
253
- reference_size_auto = self.parent.port_properties.get("reference_size_auto")
254
- if reference_size_auto is not None:
255
- port_prop.reference_size_auto = reference_size_auto
256
- reference_size_x = self.parent.port_properties.get("reference_size_x", 0)
257
- reference_size_y = self.parent.port_properties.get("reference_size_y", 0)
258
- port_prop.set_reference_size(GrpcValue(reference_size_x), GrpcValue(reference_size_y))
259
- cp.port_property = port_prop
260
- self.pyedb_obj.component_property = cp
261
-
262
- def set_parameters_to_edb(self):
263
- if self.parent.type:
264
- self.pyedb_obj.type = self.parent.type
265
- if self.parent.enabled is not None:
266
- self.pyedb_obj.enabled = self.parent.enabled
267
-
268
- self._set_model_properties_to_edb()
269
- if self.pyedb_obj.type.lower() == "ic":
270
- self._set_ic_die_properties_to_edb()
271
- self._set_port_properties_to_edb()
272
- self._set_solder_ball_properties_to_edb()
273
- elif self.pyedb_obj.type.lower() in ["io", "other"]:
274
- self._set_solder_ball_properties_to_edb()
275
- self._set_port_properties_to_edb()
276
-
277
- def retrieve_parameters_from_edb(self):
278
- self.parent.type = self.pyedb_obj.type
279
- self.parent.definition = self.pyedb_obj.part_name
280
- self.parent.reference_designator = self.pyedb_obj.name
281
- self.retrieve_model_properties_from_edb()
282
- if self.pyedb_obj.type.lower() == "ic":
283
- self._retrieve_ic_die_properties_from_edb()
284
- self._retrieve_port_properties_from_edb()
285
- self._retrieve_solder_ball_properties_from_edb()
286
- elif self.pyedb_obj.type.lower() in ["io", "other"]:
287
- self._retrieve_solder_ball_properties_from_edb()
288
- self._retrieve_port_properties_from_edb()
289
-
290
- class DotNet(Grpc):
291
- def __init__(self, parent):
292
- super().__init__(parent)
293
-
294
- def retrieve_model_properties_from_edb(self):
295
- c_p = self.pyedb_obj.component_property
296
- model = c_p.GetModel().Clone()
297
-
298
- if model.GetModelType().ToString() == "NetlistModel":
299
- self.parent.netlist_model["netlist"] = model.GetNetlist()
300
- elif model.GetModelType().ToString() == "PinPairModel":
301
- temp = {}
302
- for i in model.PinPairs:
303
- temp["first_pin"] = i.FirstPin
304
- temp["second_pin"] = i.SecondPin
305
- rlc = model.GetPinPairRlc(i)
306
- temp["is_parallel"] = rlc.IsParallel
307
- temp["resistance"] = rlc.R.ToString()
308
- temp["resistance_enabled"] = rlc.REnabled
309
- temp["inductance"] = rlc.L.ToString()
310
- temp["inductance_enabled"] = rlc.LEnabled
311
- temp["capacitance"] = rlc.C.ToString()
312
- temp["capacitance_enabled"] = rlc.CEnabled
313
- self.parent.pin_pair_model.append(temp)
314
- elif model.GetModelType().ToString() == "SParameterModel":
315
- self.parent.s_parameter_model["reference_net"] = model.GetReferenceNet()
316
- self.parent.s_parameter_model["model_name"] = model.GetComponentModelName()
317
- elif model.GetModelType().ToString() == "SPICEModel":
318
- self.parent.spice_model["model_name"] = model.GetModelName()
319
- self.parent.spice_model["model_path"] = model.GetModelPath()
320
- self.parent.spice_model["sub_circuit"] = model.GetSubCkt()
321
- self.parent.spice_model["terminal_pairs"] = [
322
- [i, j] for i, j in dict(model.GetTerminalPinPairs()).items()
323
- ]
324
-
325
- def _set_ic_die_properties_to_edb(self):
326
- cp = self.pyedb_obj.component_property
327
- ic_die_prop = cp.GetDieProperty().Clone()
328
- die_type = self.parent.ic_die_properties.get("type")
329
- ic_die_prop.SetType(getattr(self.pedb._edb.Definition.DieType, snake_to_pascal(die_type)))
330
- if not die_type == "no_die":
331
- orientation = self.parent.ic_die_properties.get("orientation")
332
- if orientation:
333
- ic_die_prop.SetOrientation(
334
- getattr(self.pedb._edb.Definition.DieOrientation, snake_to_pascal(orientation))
335
- )
336
- if die_type == "wire_bond":
337
- height = self.parent.ic_die_properties.get("height")
338
- if height:
339
- ic_die_prop.SetHeight(self.pedb.edb_value(height))
340
- cp.SetDieProperty(ic_die_prop)
341
- self.pyedb_obj.component_property = cp
342
-
343
- def _set_port_properties_to_edb(self):
344
- cp = self.pyedb_obj.component_property
127
+ def _set_solder_ball_properties_to_edb(self):
128
+ cp = self.pyedb_obj.component_property
129
+ solder_ball_prop = cp.GetSolderBallProperty().Clone()
130
+ shape = self.solder_ball_properties.get("shape")
131
+ if shape:
132
+ solder_ball_prop.SetShape(getattr(self._pedb._edb.Definition.SolderballShape, snake_to_pascal(shape)))
133
+ else:
134
+ return
135
+
136
+ if shape == "cylinder":
137
+ diameter = self.solder_ball_properties["diameter"]
138
+ solder_ball_prop.SetDiameter(self._pedb.edb_value(diameter), self._pedb.edb_value(diameter))
139
+ elif shape == "spheroid":
140
+ diameter = self.solder_ball_properties["diameter"]
141
+ mid_diameter = self.solder_ball_properties["mid_diameter"]
142
+ solder_ball_prop.SetDiameter(self._pedb.edb_value(diameter), self._pedb.edb_value(mid_diameter))
143
+ else:
144
+ raise ValueError("Solderball shape must be either cylinder or spheroid")
145
+ solder_ball_prop.SetHeight(self._pedb.edb_value(self.solder_ball_properties["height"]))
146
+ solder_ball_prop.SetMaterialName(self.solder_ball_properties.get("material", "solder"))
147
+ cp.SetSolderBallProperty(solder_ball_prop)
148
+ self.pyedb_obj.component_property = cp
149
+
150
+ def _retrieve_ic_die_properties_from_edb(self):
151
+ temp = dict()
152
+ cp = self.pyedb_obj.component_property
153
+
154
+ ic_die_prop = cp.GetDieProperty().Clone()
155
+ die_type = pascal_to_snake(ic_die_prop.GetType().ToString())
156
+ temp["type"] = die_type
157
+ if not die_type == "no_die":
158
+ temp["orientation"] = pascal_to_snake(ic_die_prop.GetOrientation().ToString())
159
+ if die_type == "wire_bond":
160
+ temp["height"] = ic_die_prop.GetHeightValue().ToString()
161
+ self.ic_die_properties = temp
162
+
163
+ def _retrieve_solder_ball_properties_from_edb(self):
164
+ temp = dict()
165
+ cp = self.pyedb_obj.component_property
166
+ solder_ball_prop = cp.GetSolderBallProperty().Clone()
167
+ _, diam, mid_diam = solder_ball_prop.GetDiameterValue()
168
+ height = solder_ball_prop.GetHeightValue().ToString()
169
+ shape = solder_ball_prop.GetShape().ToString()
170
+ material = solder_ball_prop.GetMaterialName()
171
+ uses_solder_ball = solder_ball_prop.UsesSolderball()
172
+
173
+ temp["uses_solder_ball"] = uses_solder_ball
174
+ temp["shape"] = pascal_to_snake(shape)
175
+ temp["diameter"] = diam.ToString()
176
+ temp["mid_diameter"] = mid_diam.ToString()
177
+ temp["height"] = height
178
+ temp["material"] = material
179
+ self.solder_ball_properties = temp
180
+
181
+ def _retrieve_port_properties_from_edb(self):
182
+ temp = dict()
183
+ cp = self.pyedb_obj.component_property
184
+ c_type = self.type.lower()
185
+ if c_type not in ["ic", "io", "other"]:
186
+ return
187
+ else:
345
188
  port_prop = cp.GetPortProperty().Clone()
346
- height = self.parent.port_properties.get("reference_height")
347
- if height:
348
- port_prop.SetReferenceHeight(self.pedb.edb_value(height))
349
- reference_size_auto = self.parent.port_properties.get("reference_size_auto")
350
- if reference_size_auto is not None:
351
- port_prop.SetReferenceSizeAuto(reference_size_auto)
352
- reference_size_x = self.parent.port_properties.get("reference_size_x", 0)
353
- reference_size_y = self.parent.port_properties.get("reference_size_y", 0)
354
- port_prop.SetReferenceSize(self.pedb.edb_value(reference_size_x), self.pedb.edb_value(reference_size_y))
355
- cp.SetPortProperty(port_prop)
356
- self.pyedb_obj.component_property = cp
189
+ reference_height = port_prop.GetReferenceHeightValue().ToString()
190
+ reference_size_auto = port_prop.GetReferenceSizeAuto()
191
+ _, reference_size_x, reference_size_y = port_prop.GetReferenceSize()
192
+ temp["reference_height"] = reference_height
193
+ temp["reference_size_auto"] = reference_size_auto
194
+ temp["reference_size_x"] = str(reference_size_x)
195
+ temp["reference_size_y"] = str(reference_size_y)
196
+ self.port_properties = temp
197
+
198
+ def set_parameters_to_edb(self):
199
+ if self.type:
200
+ self.pyedb_obj.type = self.type
201
+ if self.enabled is not None:
202
+ self.pyedb_obj.enabled = self.enabled
203
+
204
+ self._set_model_properties_to_edb()
205
+ if self.pyedb_obj.type.lower() == "ic":
206
+ self._set_ic_die_properties_to_edb()
207
+ self._set_port_properties_to_edb()
208
+ self._set_solder_ball_properties_to_edb()
209
+ elif self.pyedb_obj.type.lower() in ["io", "other"]:
210
+ self._set_solder_ball_properties_to_edb()
211
+ self._set_port_properties_to_edb()
357
212
 
358
- def _set_model_properties_to_edb(self):
359
- c_p = self.pyedb_obj.component_property
360
- if self.parent.netlist_model:
361
- m = self.pedb._edb.Cell.Hierarchy.SParameterModel()
362
- m.SetNetlist(self.parent.netlist_model["netlist"])
363
- c_p.SetModel(m)
364
- self.component_property = c_p
365
- elif self.parent.pin_pair_model:
366
- m = self.pedb._edb.Cell.Hierarchy.PinPairModel()
367
- for i in self.parent.pin_pair_model:
368
- p = self.pedb._edb.Utility.PinPair(str(i["first_pin"]), str(i["second_pin"]))
369
- rlc = self.pedb._edb.Utility.Rlc(
370
- self.pedb.edb_value(i["resistance"]),
371
- i["resistance_enabled"],
372
- self.pedb.edb_value(i["inductance"]),
373
- i["inductance_enabled"],
374
- self.pedb.edb_value(i["capacitance"]),
375
- i["capacitance_enabled"],
376
- i["is_parallel"],
377
- )
378
- m.SetPinPairRlc(p, rlc)
379
- c_p.SetModel(m)
380
-
381
- m = self.pedb._edb.Cell.Hierarchy.PinPairModel()
382
- for i in self.parent.pin_pair_model:
383
- p = self.pedb._edb.Utility.PinPair(str(i["first_pin"]), str(i["second_pin"]))
384
- rlc = self.pedb._edb.Utility.Rlc(
385
- self.pedb.edb_value(i["resistance"]),
386
- i["resistance_enabled"],
387
- self.pedb.edb_value(i["inductance"]),
388
- i["inductance_enabled"],
389
- self.pedb.edb_value(i["capacitance"]),
390
- i["capacitance_enabled"],
391
- i["is_parallel"],
392
- )
393
- m.SetPinPairRlc(p, rlc)
394
- c_p.SetModel(m)
395
- self.pyedb_obj.component_property = c_p
396
- elif self.parent.s_parameter_model:
397
- m = self.pedb._edb.Cell.Hierarchy.SParameterModel()
398
- m.SetComponentModelName(self.parent.s_parameter_model["model_name"])
399
- m.SetReferenceNet(self.parent.s_parameter_model["reference_net"])
400
- c_p.SetModel(m)
401
- self.component_property = c_p
402
- elif self.parent.spice_model:
403
- self.pyedb_obj.assign_spice_model(
404
- self.parent.spice_model["model_path"],
405
- self.parent.spice_model["model_name"],
406
- self.parent.spice_model["sub_circuit"],
407
- self.parent.spice_model["terminal_pairs"],
408
- )
409
-
410
- def _set_solder_ball_properties_to_edb(self):
411
- cp = self.pyedb_obj.component_property
412
- solder_ball_prop = cp.GetSolderBallProperty().Clone()
413
- shape = self.parent.solder_ball_properties.get("shape")
414
- if shape:
415
- solder_ball_prop.SetShape(getattr(self.pedb._edb.Definition.SolderballShape, snake_to_pascal(shape)))
416
- else:
417
- return
418
-
419
- if shape == "cylinder":
420
- diameter = self.parent.solder_ball_properties["diameter"]
421
- solder_ball_prop.SetDiameter(self.pedb.edb_value(diameter), self.pedb.edb_value(diameter))
422
- elif shape == "spheroid":
423
- diameter = self.parent.solder_ball_properties["diameter"]
424
- mid_diameter = self.parent.solder_ball_properties["mid_diameter"]
425
- solder_ball_prop.SetDiameter(self.pedb.edb_value(diameter), self.pedb.edb_value(mid_diameter))
426
- else:
427
- raise ValueError("Solderball shape must be either cylinder or spheroid")
428
- solder_ball_prop.SetHeight(self.pedb.edb_value(self.parent.solder_ball_properties["height"]))
429
- solder_ball_prop.SetMaterialName(self.parent.solder_ball_properties.get("material", "solder"))
430
- cp.SetSolderBallProperty(solder_ball_prop)
431
- self.pyedb_obj.component_property = cp
432
-
433
- def _retrieve_ic_die_properties_from_edb(self):
434
- temp = dict()
435
- cp = self.pyedb_obj.component_property
436
-
437
- ic_die_prop = cp.GetDieProperty().Clone()
438
- die_type = pascal_to_snake(ic_die_prop.GetType().ToString())
439
- temp["type"] = die_type
440
- if not die_type == "no_die":
441
- temp["orientation"] = pascal_to_snake(ic_die_prop.GetOrientation().ToString())
442
- if die_type == "wire_bond":
443
- temp["height"] = ic_die_prop.GetHeightValue().ToString()
444
- self.parent.ic_die_properties = temp
445
-
446
- def _retrieve_solder_ball_properties_from_edb(self):
447
- temp = dict()
448
- cp = self.pyedb_obj.component_property
449
- solder_ball_prop = cp.GetSolderBallProperty().Clone()
450
- _, diam, mid_diam = solder_ball_prop.GetDiameterValue()
451
- height = solder_ball_prop.GetHeightValue().ToString()
452
- shape = solder_ball_prop.GetShape().ToString()
453
- material = solder_ball_prop.GetMaterialName()
454
- uses_solder_ball = solder_ball_prop.UsesSolderball()
455
-
456
- temp["uses_solder_ball"] = uses_solder_ball
457
- temp["shape"] = pascal_to_snake(shape)
458
- temp["diameter"] = diam.ToString()
459
- temp["mid_diameter"] = mid_diam.ToString()
460
- temp["height"] = height
461
- temp["material"] = material
462
- self.parent.solder_ball_properties = temp
463
-
464
- def _retrieve_port_properties_from_edb(self):
465
- temp = dict()
466
- cp = self.pyedb_obj.component_property
467
- c_type = self.parent.type.lower()
468
- if c_type not in ["ic", "io", "other"]:
469
- return
470
- else:
471
- port_prop = cp.GetPortProperty().Clone()
472
- reference_height = port_prop.GetReferenceHeightValue().ToString()
473
- reference_size_auto = port_prop.GetReferenceSizeAuto()
474
- _, reference_size_x, reference_size_y = port_prop.GetReferenceSize()
475
- temp["reference_height"] = reference_height
476
- temp["reference_size_auto"] = reference_size_auto
477
- temp["reference_size_x"] = str(reference_size_x)
478
- temp["reference_size_y"] = str(reference_size_y)
479
- self.parent.port_properties = temp
480
-
481
- def __init__(self, pedb, pedb_object, **kwargs):
482
- self.pedb = pedb
213
+ def retrieve_parameters_from_edb(self):
214
+ self.type = self.pyedb_obj.type
215
+ self.definition = self.pyedb_obj.part_name
216
+ self.reference_designator = self.pyedb_obj.name
217
+ self.retrieve_model_properties_from_edb()
218
+ if self.pyedb_obj.type.lower() == "ic":
219
+ self._retrieve_ic_die_properties_from_edb()
220
+ self._retrieve_port_properties_from_edb()
221
+ self._retrieve_solder_ball_properties_from_edb()
222
+ elif self.pyedb_obj.type.lower() in ["io", "other"]:
223
+ self._retrieve_solder_ball_properties_from_edb()
224
+ self._retrieve_port_properties_from_edb()
225
+
226
+ def __init__(self, _pedb, pedb_object, **kwargs):
227
+ self._pedb = _pedb
483
228
  self.pyedb_obj = pedb_object
484
- if self.pedb.grpc:
485
- self.api = self.Grpc(self)
486
- else:
487
- self.api = self.DotNet(self)
488
229
 
489
230
  self.enabled = kwargs.get("enabled", None)
490
231
  self.reference_designator = kwargs.get("reference_designator", None)
@@ -504,25 +245,25 @@ class CfgComponent(CfgBase):
504
245
 
505
246
  class CfgComponents:
506
247
  def __init__(self, pedb, components_data):
507
- self.pedb = pedb
248
+ self._pedb = pedb
508
249
  self.components = []
509
250
 
510
251
  if components_data:
511
252
  for comp in components_data:
512
- obj = self.pedb.components.instances[comp["reference_designator"]]
513
- self.components.append(CfgComponent(self.pedb, obj, **comp))
253
+ obj = self._pedb.components.instances[comp["reference_designator"]]
254
+ self.components.append(CfgComponent(self._pedb, obj, **comp))
514
255
 
515
256
  def clean(self):
516
257
  self.components = []
517
258
 
518
259
  def apply(self):
519
260
  for comp in self.components:
520
- comp.api.set_parameters_to_edb()
261
+ comp.set_parameters_to_edb()
521
262
 
522
263
  def retrieve_parameters_from_edb(self):
523
264
  self.clean()
524
- comps_in_db = self.pedb.components
265
+ comps_in_db = self._pedb.components
525
266
  for _, comp in comps_in_db.instances.items():
526
- cfg_comp = CfgComponent(self.pedb, comp)
527
- cfg_comp.api.retrieve_parameters_from_edb()
267
+ cfg_comp = CfgComponent(self._pedb, comp)
268
+ cfg_comp.retrieve_parameters_from_edb()
528
269
  self.components.append(cfg_comp)