pyedb 0.41.0__py3-none-any.whl → 0.43.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 (31) hide show
  1. pyedb/__init__.py +1 -1
  2. pyedb/configuration/cfg_boundaries.py +149 -63
  3. pyedb/configuration/cfg_components.py +333 -97
  4. pyedb/configuration/cfg_general.py +30 -12
  5. pyedb/configuration/cfg_modeler.py +161 -67
  6. pyedb/configuration/cfg_nets.py +33 -17
  7. pyedb/configuration/cfg_operations.py +63 -31
  8. pyedb/configuration/cfg_package_definition.py +72 -51
  9. pyedb/configuration/cfg_pin_groups.py +78 -26
  10. pyedb/configuration/cfg_s_parameter_models.py +95 -70
  11. pyedb/configuration/cfg_setup.py +230 -185
  12. pyedb/configuration/cfg_stackup.py +122 -90
  13. pyedb/configuration/configuration.py +342 -194
  14. pyedb/dotnet/database/cell/terminal/padstack_instance_terminal.py +5 -0
  15. pyedb/dotnet/database/cell/terminal/point_terminal.py +12 -0
  16. pyedb/dotnet/database/cell/terminal/terminal.py +0 -14
  17. pyedb/dotnet/database/dotnet/database.py +2 -0
  18. pyedb/dotnet/database/edb_data/padstacks_data.py +7 -2
  19. pyedb/dotnet/database/sim_setup_data/data/sweep_data.py +63 -10
  20. pyedb/dotnet/database/siwave.py +4 -1
  21. pyedb/dotnet/database/utilities/simulation_setup.py +15 -16
  22. pyedb/dotnet/edb.py +77 -110
  23. pyedb/grpc/database/components.py +1 -2
  24. pyedb/grpc/database/hierarchy/component.py +9 -1
  25. pyedb/grpc/database/hierarchy/s_parameter_model.py +2 -2
  26. pyedb/grpc/database/hierarchy/spice_model.py +4 -0
  27. pyedb/grpc/database/utility/hfss_extent_info.py +31 -20
  28. {pyedb-0.41.0.dist-info → pyedb-0.43.0.dist-info}/METADATA +1 -1
  29. {pyedb-0.41.0.dist-info → pyedb-0.43.0.dist-info}/RECORD +31 -31
  30. {pyedb-0.41.0.dist-info → pyedb-0.43.0.dist-info}/LICENSE +0 -0
  31. {pyedb-0.41.0.dist-info → pyedb-0.43.0.dist-info}/WHEEL +0 -0
@@ -58,8 +58,168 @@ class CfgPlane:
58
58
  class CfgModeler:
59
59
  """Manage configuration general settings."""
60
60
 
61
+ class Grpc:
62
+ def __init__(self, parent):
63
+ self.parent = parent
64
+ self._pedb = parent._pedb
65
+
66
+ def set_parameter_to_edb(self):
67
+ from ansys.edb.core.definition.padstack_def import (
68
+ PadstackDef as GrpcPadstackDef,
69
+ )
70
+ from ansys.edb.core.definition.padstack_def_data import (
71
+ PadstackDefData as GrpcPadstackDefData,
72
+ )
73
+
74
+ from pyedb.grpc.database.definition.padstack_def import PadstackDef
75
+
76
+ if self.parent.traces:
77
+ for t in self.parent.traces:
78
+ obj = self._pedb.modeler.create_trace(
79
+ path_list=t.path,
80
+ layer_name=t.layer,
81
+ net_name=t.net_name,
82
+ width=t.width,
83
+ start_cap_style=t.start_cap_style,
84
+ end_cap_style=t.end_cap_style,
85
+ corner_style=t.corner_style,
86
+ )
87
+ obj.aedt_name = t.name
88
+
89
+ if self.parent.padstack_defs:
90
+ for p in self.parent.padstack_defs:
91
+ pdata = GrpcPadstackDefData.create()
92
+ pdef = GrpcPadstackDef.create(self._pedb.active_db, p.name)
93
+ pdef.data = pdata
94
+ pdef = PadstackDef(self._pedb, pdef)
95
+ p.pyedb_obj = pdef
96
+ p.api.set_parameters_to_edb()
97
+
98
+ if self.parent.padstack_instances:
99
+ for p in self.parent.padstack_instances:
100
+ p_inst = self._pedb.padstacks.place(
101
+ via_name=p.name,
102
+ net_name=p.net_name,
103
+ position=p.position,
104
+ definition_name=p.definition,
105
+ )
106
+ p.pyedb_obj = p_inst
107
+ p.api.set_parameters_to_edb()
108
+
109
+ if self.parent.planes:
110
+ for p in self.parent.planes:
111
+ if p.type == "rectangle":
112
+ obj = self._pedb.modeler.create_rectangle(
113
+ layer_name=p.layer,
114
+ net_name=p.net_name,
115
+ lower_left_point=p.lower_left_point,
116
+ upper_right_point=p.upper_right_point,
117
+ corner_radius=p.corner_radius,
118
+ rotation=p.rotation,
119
+ )
120
+ obj.aedt_name = p.name
121
+ elif p.type == "polygon":
122
+ obj = self._pedb.modeler.create_polygon(
123
+ points=p.points, layer_name=p.layer, net_name=p.net_name
124
+ )
125
+ obj.aedt_name = p.name
126
+
127
+ for v in p.voids:
128
+ for i in self._pedb.layout.primitives:
129
+ if i.aedt_name == v:
130
+ self._pedb.modeler.add_void(obj, i)
131
+
132
+ if self.parent.components:
133
+ pedb_p_inst = self._pedb.padstacks.instances_by_name
134
+ for c in self.parent.components:
135
+ obj = self._pedb.components.create(
136
+ [pedb_p_inst[i] for i in c.pins],
137
+ component_name=c.reference_designator,
138
+ placement_layer=c.placement_layer,
139
+ component_part_name=c.definition,
140
+ )
141
+ c.pyedb_obj = obj
142
+ c.api.set_parameters_to_edb()
143
+
144
+ class DotNet(Grpc):
145
+ def __init__(self, parent):
146
+ super().__init__(parent)
147
+
148
+ def set_parameter_to_edb(self):
149
+ if self.parent.traces:
150
+ for t in self.parent.traces:
151
+ obj = self._pedb.modeler.create_trace(
152
+ path_list=t.path,
153
+ layer_name=t.layer,
154
+ net_name=t.net_name,
155
+ width=t.width,
156
+ start_cap_style=t.start_cap_style,
157
+ end_cap_style=t.end_cap_style,
158
+ corner_style=t.corner_style,
159
+ )
160
+ obj.aedt_name = t.name
161
+
162
+ if self.parent.padstack_defs:
163
+ for p in self.parent.padstack_defs:
164
+ pdata = self._pedb._edb.Definition.PadstackDefData.Create()
165
+ pdef = self._pedb._edb.Definition.PadstackDef.Create(self._pedb.active_db, p.name)
166
+ pdef.SetData(pdata)
167
+ pdef = EDBPadstack(pdef, self._pedb.padstacks)
168
+ p.pyedb_obj = pdef
169
+ p.api.set_parameters_to_edb()
170
+
171
+ if self.parent.padstack_instances:
172
+ for p in self.parent.padstack_instances:
173
+ p_inst = self._pedb.padstacks.place(
174
+ via_name=p.name,
175
+ net_name=p.net_name,
176
+ position=p.position,
177
+ definition_name=p.definition,
178
+ )
179
+ p.pyedb_obj = p_inst
180
+ p.api.set_parameters_to_edb()
181
+
182
+ if self.parent.planes:
183
+ for p in self.parent.planes:
184
+ if p.type == "rectangle":
185
+ obj = self._pedb.modeler.create_rectangle(
186
+ layer_name=p.layer,
187
+ net_name=p.net_name,
188
+ lower_left_point=p.lower_left_point,
189
+ upper_right_point=p.upper_right_point,
190
+ corner_radius=p.corner_radius,
191
+ rotation=p.rotation,
192
+ )
193
+ obj.aedt_name = p.name
194
+ elif p.type == "polygon":
195
+ obj = self._pedb.modeler.create_polygon(
196
+ main_shape=p.points, layer_name=p.layer, net_name=p.net_name
197
+ )
198
+ obj.aedt_name = p.name
199
+
200
+ for v in p.voids:
201
+ for i in self._pedb.layout.primitives:
202
+ if i.aedt_name == v:
203
+ self._pedb.modeler.add_void(obj, i)
204
+
205
+ if self.parent.components:
206
+ pedb_p_inst = self._pedb.padstacks.instances_by_name
207
+ for c in self.parent.components:
208
+ obj = self._pedb.components.create(
209
+ [pedb_p_inst[i] for i in c.pins],
210
+ component_name=c.reference_designator,
211
+ placement_layer=c.placement_layer,
212
+ component_part_name=c.definition,
213
+ )
214
+ c.pyedb_obj = obj
215
+ c.api.set_parameters_to_edb()
216
+
61
217
  def __init__(self, pedb, data):
62
218
  self._pedb = pedb
219
+ if self._pedb.grpc:
220
+ self.api = self.Grpc(self)
221
+ else:
222
+ self.api = self.DotNet(self)
63
223
  self.traces = [CfgTrace(**i) for i in data.get("traces", [])]
64
224
  self.padstack_defs = [
65
225
  CfgPadstackDefinition(self._pedb, None, **i) for i in data.get("padstack_definitions", [])
@@ -71,70 +231,4 @@ class CfgModeler:
71
231
  self.components = [CfgComponent(self._pedb, None, **i) for i in data.get("components", [])]
72
232
 
73
233
  def apply(self):
74
- if self.traces:
75
- for t in self.traces:
76
- obj = self._pedb.modeler.create_trace(
77
- path_list=t.path,
78
- layer_name=t.layer,
79
- net_name=t.net_name,
80
- width=t.width,
81
- start_cap_style=t.start_cap_style,
82
- end_cap_style=t.end_cap_style,
83
- corner_style=t.corner_style,
84
- )
85
- obj.aedt_name = t.name
86
-
87
- if self.padstack_defs:
88
- for p in self.padstack_defs:
89
- pdata = self._pedb._edb.Definition.PadstackDefData.Create()
90
- pdef = self._pedb._edb.Definition.PadstackDef.Create(self._pedb.active_db, p.name)
91
- pdef.SetData(pdata)
92
- pdef = EDBPadstack(pdef, self._pedb.padstacks)
93
- p.pyedb_obj = pdef
94
- p.api.set_parameters_to_edb()
95
-
96
- if self.padstack_instances:
97
- for p in self.padstack_instances:
98
- p_inst = self._pedb.padstacks.place(
99
- via_name=p.name,
100
- net_name=p.net_name,
101
- position=p.position,
102
- definition_name=p.definition,
103
- )
104
- p.pyedb_obj = p_inst
105
- p.api.set_parameters_to_edb()
106
-
107
- if self.planes:
108
- for p in self.planes:
109
- if p.type == "rectangle":
110
- obj = self._pedb.modeler.create_rectangle(
111
- layer_name=p.layer,
112
- net_name=p.net_name,
113
- lower_left_point=p.lower_left_point,
114
- upper_right_point=p.upper_right_point,
115
- corner_radius=p.corner_radius,
116
- rotation=p.rotation,
117
- )
118
- obj.aedt_name = p.name
119
- elif p.type == "polygon":
120
- obj = self._pedb.modeler.create_polygon(
121
- main_shape=p.points, layer_name=p.layer, net_name=p.net_name
122
- )
123
- obj.aedt_name = p.name
124
-
125
- for v in p.voids:
126
- for i in self._pedb.layout.primitives:
127
- if i.aedt_name == v:
128
- self._pedb.modeler.add_void(obj, i)
129
-
130
- if self.components:
131
- pedb_p_inst = self._pedb.padstacks.instances_by_name
132
- for c in self.components:
133
- obj = self._pedb.components.create(
134
- [pedb_p_inst[i] for i in c.pins],
135
- component_name=c.reference_designator,
136
- placement_layer=c.placement_layer,
137
- component_part_name=c.definition,
138
- )
139
- c.pyedb_obj = obj
140
- c.api.set_parameters_to_edb()
234
+ self.api.set_parameter_to_edb()
@@ -24,8 +24,39 @@
24
24
  class CfgNets:
25
25
  """Manage configuration net class."""
26
26
 
27
+ class Grpc:
28
+ def __init__(self, parent):
29
+ self.parent = parent
30
+ self._pedb = parent._pedb
31
+
32
+ def set_parameter_to_edb(self):
33
+ for signal_net in self.parent.signal_nets:
34
+ if signal_net in self._pedb.nets:
35
+ self._pedb.nets.nets[signal_net].is_power_ground = False
36
+ for power_net in self.parent.power_nets:
37
+ if power_net in self._pedb.nets:
38
+ self._pedb.nets.nets[power_net].is_power_ground = True
39
+
40
+ def get_parameter_from_edb(self):
41
+ """Get net information."""
42
+ for net in self._pedb.nets.signal:
43
+ self.parent.signal_nets.append(net)
44
+ for net in self._pedb.nets.power:
45
+ self.parent.power_nets.append(net)
46
+ data = {"signal_nets": self.parent.signal_nets, "power_ground_nets": self.parent.power_nets}
47
+ return data
48
+
49
+ class DotNet(Grpc):
50
+ def __init__(self, parent):
51
+ self.parent = parent
52
+ super().__init__(parent)
53
+
27
54
  def __init__(self, pdata, signal_nets=None, power_nets=None):
28
55
  self._pedb = pdata._pedb
56
+ if self._pedb.grpc:
57
+ self.api = self.Grpc(self)
58
+ else:
59
+ self.api = self.DotNet(self)
29
60
  self.signal_nets = []
30
61
  self.power_nets = []
31
62
  if signal_nets:
@@ -35,23 +66,8 @@ class CfgNets:
35
66
 
36
67
  def apply(self):
37
68
  """Apply net on layout."""
38
- for signal_net in self.signal_nets:
39
- if signal_net in self._pedb.nets:
40
- self._pedb.nets.nets[signal_net].is_power_ground = False
41
- for power_net in self.power_nets:
42
- if power_net in self._pedb.nets:
43
- self._pedb.nets.nets[power_net].is_power_ground = True
44
-
45
- def _load_data_from_db(self):
46
- self.signal_nets = []
47
- self.power_nets = []
48
- for net in self._pedb.nets.signal:
49
- self.signal_nets.append(net)
50
- for net in self._pedb.nets.power:
51
- self.power_nets.append(net)
69
+ self.api.set_parameter_to_edb()
52
70
 
53
71
  def get_data_from_db(self):
54
72
  """Get net information."""
55
- self._load_data_from_db()
56
- data = {"signal_nets": self.signal_nets, "power_ground_nets": self.power_nets}
57
- return data
73
+ return self.api.get_parameter_from_edb()
@@ -24,9 +24,38 @@ from pyedb.configuration.cfg_common import CfgBase
24
24
 
25
25
 
26
26
  class CfgCutout(CfgBase):
27
+ class Grpc:
28
+ def __init__(self, parent):
29
+ self.parent = parent
30
+ self._pedb = parent._pedb
31
+
32
+ def get_parameters_from_edb(self):
33
+ if "pyedb_cutout" in self._pedb.stackup.all_layers:
34
+ polygons = self._pedb.layout.find_primitive(layer_name="pyedb_cutout")
35
+ if polygons:
36
+ poly = polygons[0]
37
+ self.parent.custom_extent = poly.polygon_data.points
38
+ net_names = []
39
+ for name, obj in self._pedb.nets.nets.items():
40
+ if obj.primitives:
41
+ if obj.primitives[0].layer.name == "pyedb_cutout":
42
+ continue
43
+ else:
44
+ net_names.append(name)
45
+ self.parent.reference_list = []
46
+ self.parent.signal_list = net_names
47
+ return self.parent.export_properties()
48
+
49
+ class DotNet(Grpc):
50
+ def __init__(self, parent):
51
+ super().__init__(parent)
52
+
27
53
  def __init__(self, pedb, **kwargs):
28
54
  self._pedb = pedb
29
-
55
+ if self._pedb.grpc:
56
+ self.api = self.Grpc(self)
57
+ else:
58
+ self.api = self.DotNet(self)
30
59
  self.signal_list = kwargs.get("signal_list")
31
60
  self.reference_list = kwargs.get("reference_list")
32
61
  self.extent_type = kwargs.get("extent_type")
@@ -52,23 +81,7 @@ class CfgCutout(CfgBase):
52
81
  self.keep_lines_as_path = kwargs.get("keep_lines_as_path")
53
82
 
54
83
  def get_data_from_db(self):
55
- if "pyedb_cutout" in self._pedb.stackup.all_layers:
56
- polygons = self._pedb.layout.find_primitive(layer_name="pyedb_cutout")
57
- if polygons:
58
- poly = polygons[0]
59
- self.custom_extent = poly.polygon_data.points
60
-
61
- net_names = []
62
- for name, obj in self._pedb.nets.nets.items():
63
- if obj.primitives:
64
- if obj.primitives[0].layer.name == "pyedb_cutout":
65
- continue
66
- else:
67
- net_names.append(name)
68
-
69
- self.reference_list = []
70
- self.signal_list = net_names
71
- return self.export_properties()
84
+ return self.api.get_parameters_from_edb()
72
85
 
73
86
  def export_properties(self):
74
87
  return {
@@ -79,24 +92,43 @@ class CfgCutout(CfgBase):
79
92
 
80
93
 
81
94
  class CfgOperations(CfgBase):
95
+ class Grpc:
96
+ def __init__(self, parent):
97
+ self.parent = parent
98
+ self._pedb = parent._pedb
99
+
100
+ def apply_on_edb(self):
101
+ if self.parent.op_cutout:
102
+ polygon_points = self._pedb.cutout(**self.parent.op_cutout.get_attributes())
103
+ if "pyedb_cutout" not in self._pedb.stackup.all_layers:
104
+ self._pedb.stackup.add_document_layer(name="pyedb_cutout")
105
+ self._pedb.modeler.create_polygon(
106
+ polygon_points, layer_name="pyedb_cutout", net_name="pyedb_cutout"
107
+ )
108
+
109
+ def get_parameter_from_edb(self):
110
+ self.parent.op_cutout = CfgCutout(self._pedb)
111
+ data_from_db = self.parent.op_cutout.get_data_from_db()
112
+ if data_from_db:
113
+ return {"cutout": data_from_db}
114
+ else:
115
+ return {}
116
+
117
+ class DotNet(Grpc):
118
+ def __init__(self, parent):
119
+ super().__init__(parent)
120
+
82
121
  def __init__(self, pedb, data):
83
122
  self._pedb = pedb
123
+ if self._pedb.grpc:
124
+ self.api = self.Grpc(self)
125
+ else:
126
+ self.api = self.DotNet(self)
84
127
  self.op_cutout = CfgCutout(pedb, **data["cutout"]) if "cutout" in data else None
85
128
 
86
129
  def apply(self):
87
130
  """Imports operation information from JSON."""
88
- if self.op_cutout:
89
- polygon_points = self._pedb.cutout(**self.op_cutout.get_attributes())
90
- if "pyedb_cutout" not in self._pedb.stackup.all_layers:
91
- self._pedb.stackup.add_document_layer(name="pyedb_cutout")
92
- self._pedb.modeler.create_polygon(polygon_points, layer_name="pyedb_cutout", net_name="pyedb_cutout")
93
-
94
- # create a polygon on pyedb layer
131
+ self.api.apply_on_edb()
95
132
 
96
133
  def get_data_from_db(self):
97
- self.op_cutout = CfgCutout(self._pedb)
98
- data_from_db = self.op_cutout.get_data_from_db()
99
- if data_from_db:
100
- return {"cutout": data_from_db}
101
- else:
102
- return {}
134
+ return self.api.get_parameter_from_edb()
@@ -64,61 +64,82 @@ class CfgHeatSink(CfgBase):
64
64
 
65
65
 
66
66
  class CfgPackageDefinitions:
67
+ class Grpc:
68
+ def __init__(self, parent):
69
+ self.parent = parent
70
+ self._pedb = parent._pedb
71
+
72
+ def set_parameter_to_edb(self):
73
+ for pkg in self.parent.packages:
74
+ comp_def_from_db = self._pedb.definitions.component[pkg.component_definition]
75
+ if pkg.name in self._pedb.definitions.package:
76
+ self._pedb.definitions.package[pkg.name].delete()
77
+
78
+ if pkg.extent_bounding_box:
79
+ package_def = PackageDef(self._pedb, name=pkg.name, extent_bounding_box=pkg.extent_bounding_box)
80
+ else:
81
+ package_def = PackageDef(self._pedb, name=pkg.name, component_part_name=pkg.component_definition)
82
+ pkg.set_attributes(package_def)
83
+
84
+ if pkg.heatsink:
85
+ attrs = pkg.heatsink.get_attributes()
86
+ for attr, value in attrs.items():
87
+ package_def.set_heatsink(**attrs)
88
+
89
+ comp_list = dict()
90
+ if pkg.apply_to_all:
91
+ comp_list.update(
92
+ {
93
+ refdes: comp
94
+ for refdes, comp in comp_def_from_db.components.items()
95
+ if refdes not in pkg.components
96
+ }
97
+ )
98
+ else:
99
+ comp_list.update(
100
+ {
101
+ refdes: comp
102
+ for refdes, comp in comp_def_from_db.components.items()
103
+ if refdes in pkg.components
104
+ }
105
+ )
106
+ for _, i in comp_list.items():
107
+ i.package_def = pkg.name
108
+
109
+ def get_parameter_from_edb(self):
110
+ package_definitions = []
111
+ for pkg_name, pkg_obj in self._pedb.definitions.package.items():
112
+ pkg = {}
113
+ pkg_attrs = [i for i in dir(pkg_obj) if not i.startswith("_")]
114
+ pkg_attrs = {i for i in pkg_attrs if i in CfgPackage().__dict__}
115
+ for pkg_attr_name in pkg_attrs:
116
+ pkg[pkg_attr_name] = getattr(pkg_obj, pkg_attr_name)
117
+ hs_obj = pkg_obj.heatsink
118
+ if hs_obj:
119
+ hs = {}
120
+ hs_attrs = [i for i in dir(hs_obj) if not i.startswith("_")]
121
+ hs_attrs = [i for i in hs_attrs if i in CfgHeatSink().__dict__]
122
+ for hs_attr_name in hs_attrs:
123
+ hs[hs_attr_name] = getattr(hs_obj, hs_attr_name)
124
+ pkg["heatsink"] = hs
125
+ package_definitions.append(pkg)
126
+
127
+ return package_definitions
128
+
129
+ class DotNet(Grpc):
130
+ def __init__(self, parent):
131
+ super().__init__(parent)
132
+
67
133
  def __init__(self, pedb, data):
68
134
  self._pedb = pedb
135
+ if self._pedb.grpc:
136
+ self.api = self.Grpc(self)
137
+ else:
138
+ self.api = self.DotNet(self)
69
139
  self.packages = [CfgPackage(**package) for package in data]
70
140
 
71
141
  def apply(self):
72
- for pkg in self.packages:
73
- comp_def_from_db = self._pedb.definitions.component[pkg.component_definition]
74
- if pkg.name in self._pedb.definitions.package:
75
- self._pedb.definitions.package[pkg.name].delete()
76
-
77
- if pkg.extent_bounding_box:
78
- package_def = PackageDef(self._pedb, name=pkg.name, extent_bounding_box=pkg.extent_bounding_box)
79
- else:
80
- package_def = PackageDef(self._pedb, name=pkg.name, component_part_name=pkg.component_definition)
81
- pkg.set_attributes(package_def)
82
-
83
- if pkg.heatsink:
84
- attrs = pkg.heatsink.get_attributes()
85
- for attr, value in attrs.items():
86
- package_def.set_heatsink(**attrs)
87
-
88
- comp_list = dict()
89
- if pkg.apply_to_all:
90
- comp_list.update(
91
- {
92
- refdes: comp
93
- for refdes, comp in comp_def_from_db.components.items()
94
- if refdes not in pkg.components
95
- }
96
- )
97
- else:
98
- comp_list.update(
99
- {refdes: comp for refdes, comp in comp_def_from_db.components.items() if refdes in pkg.components}
100
- )
101
- for _, i in comp_list.items():
102
- i.package_def = pkg.name
142
+ self.api.set_parameter_to_edb()
103
143
 
104
144
  def get_data_from_db(self):
105
- package_definitions = []
106
-
107
- for pkg_name, pkg_obj in self._pedb.definitions.package.items():
108
- pkg = {}
109
- pkg_attrs = [i for i in dir(pkg_obj) if not i.startswith("_")]
110
- pkg_attrs = {i for i in pkg_attrs if i in CfgPackage().__dict__}
111
- for pkg_attr_name in pkg_attrs:
112
- pkg[pkg_attr_name] = getattr(pkg_obj, pkg_attr_name)
113
-
114
- hs_obj = pkg_obj.heatsink
115
- if hs_obj:
116
- hs = {}
117
- hs_attrs = [i for i in dir(hs_obj) if not i.startswith("_")]
118
- hs_attrs = [i for i in hs_attrs if i in CfgHeatSink().__dict__]
119
- for hs_attr_name in hs_attrs:
120
- hs[hs_attr_name] = getattr(hs_obj, hs_attr_name)
121
- pkg["heatsink"] = hs
122
- package_definitions.append(pkg)
123
-
124
- return package_definitions
145
+ return self.api.get_parameter_from_edb()
@@ -26,28 +26,64 @@ from pyedb.configuration.cfg_common import CfgBase
26
26
  class CfgPinGroups:
27
27
  """Manage configuration pin group class."""
28
28
 
29
+ class Grpc:
30
+ def __init__(self, parent):
31
+ self.parent = parent
32
+ self._pedb = parent._pedb
33
+
34
+ def set_pingroup_to_edb(self):
35
+ for pg in self.parent.pin_groups:
36
+ pg.create()
37
+
38
+ def get_data_from_edb(self):
39
+ self.parent.pin_groups = []
40
+ layout_pin_groups = self._pedb.siwave.pin_groups
41
+ for pg_name, pg_obj in layout_pin_groups.items():
42
+ if self._pedb.grpc:
43
+ pins = pg_obj.pins
44
+ refdes = pins[0].component.name
45
+ cfg_pg = CfgPinGroup(
46
+ self._pedb,
47
+ name=pg_name,
48
+ reference_designator=refdes,
49
+ pins=[pin.component_pin for pin in pins],
50
+ )
51
+ self.parent.pin_groups.append(cfg_pg)
52
+ return self.parent.export_properties()
53
+
54
+ class DotNet(Grpc):
55
+ def __init__(self, parent):
56
+ self.parent = parent
57
+ super().__init__(parent)
58
+
59
+ def get_data_from_edb(self):
60
+ self.parent.pin_groups = []
61
+ layout_pin_groups = self._pedb.siwave.pin_groups
62
+ for pg_name, pg_obj in layout_pin_groups.items():
63
+ pins = list(pg_obj.pins.keys())
64
+ refdes = list(pg_obj.pins.values())[0].component.name
65
+ cfg_pg = CfgPinGroup(
66
+ self._pedb,
67
+ name=pg_name,
68
+ reference_designator=refdes,
69
+ pins=pins,
70
+ )
71
+ self.parent.pin_groups.append(cfg_pg)
72
+ return self.parent.export_properties()
73
+
29
74
  def __init__(self, pedb, pingroup_data):
30
75
  self._pedb = pedb
76
+ if self._pedb.grpc:
77
+ self.api = self.Grpc(self)
78
+ else:
79
+ self.api = self.DotNet(self)
31
80
  self.pin_groups = [CfgPinGroup(self._pedb, **pg) for pg in pingroup_data]
32
81
 
33
82
  def apply(self):
34
- for pg in self.pin_groups:
35
- pg.create()
83
+ self.api.set_pingroup_to_edb()
36
84
 
37
85
  def get_data_from_db(self):
38
- self.pin_groups = []
39
- layout_pin_groups = self._pedb.siwave.pin_groups
40
- for pg_name, pg_obj in layout_pin_groups.items():
41
- pins = list(pg_obj.pins.keys())
42
- refdes = list(pg_obj.pins.values())[0].component.name
43
- cfg_pg = CfgPinGroup(
44
- self._pedb,
45
- name=pg_name,
46
- reference_designator=refdes,
47
- pins=pins,
48
- )
49
- self.pin_groups.append(cfg_pg)
50
- return self.export_properties()
86
+ return self.api.get_data_from_edb()
51
87
 
52
88
  def export_properties(self):
53
89
  pin_groups = []
@@ -57,8 +93,34 @@ class CfgPinGroups:
57
93
 
58
94
 
59
95
  class CfgPinGroup(CfgBase):
96
+ class Grpc:
97
+ def __init__(self, parent):
98
+ self.parent = parent
99
+ self._pedb = parent._pedb
100
+
101
+ def create(self):
102
+ if self.parent.pins:
103
+ pins = self.parent.pins if isinstance(self.parent.pins, list) else [self.parent.pins]
104
+ self._pedb.siwave.create_pin_group(self.parent.reference_designator, pins, self.parent.name)
105
+ elif self.parent.net:
106
+ nets = self.parent.net if isinstance(self.parent.net, list) else [self.parent.net]
107
+ comp = self._pedb.components.instances[self.parent.reference_designator]
108
+ pins = [p for p, obj in comp.pins.items() if obj.net_name in nets]
109
+ if not self._pedb.siwave.create_pin_group(self.parent.reference_designator, pins, self.parent.name):
110
+ raise RuntimeError(f"Failed to create pin group {self.parent.name}")
111
+ else:
112
+ raise RuntimeError(f"No net and pins defined for defining pin group {self.parent.name}")
113
+
114
+ class DotNet(Grpc):
115
+ def __init__(self, parent):
116
+ super().__init__(parent)
117
+
60
118
  def __init__(self, pedb, **kwargs):
61
119
  self._pedb = pedb
120
+ if self._pedb.grpc:
121
+ self.api = self.Grpc(self)
122
+ else:
123
+ self.api = self.DotNet(self)
62
124
  self.name = kwargs["name"]
63
125
  self.reference_designator = kwargs.get("reference_designator")
64
126
  self.pins = kwargs.get("pins")
@@ -66,17 +128,7 @@ class CfgPinGroup(CfgBase):
66
128
 
67
129
  def create(self):
68
130
  """Apply pin group on layout."""
69
- if self.pins:
70
- pins = self.pins if isinstance(self.pins, list) else [self.pins]
71
- self._pedb.siwave.create_pin_group(self.reference_designator, pins, self.name)
72
- elif self.net:
73
- nets = self.net if isinstance(self.net, list) else [self.net]
74
- comp = self._pedb.components.instances[self.reference_designator]
75
- pins = [p for p, obj in comp.pins.items() if obj.net_name in nets]
76
- if not self._pedb.siwave.create_pin_group(self.reference_designator, pins, self.name):
77
- raise RuntimeError(f"Failed to create pin group {self.name}")
78
- else:
79
- raise RuntimeError(f"No net and pins defined for defining pin group {self.name}")
131
+ self.api.create()
80
132
 
81
133
  def export_properties(self):
82
134
  if self.pins: