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.
- pyedb/__init__.py +1 -1
- pyedb/configuration/cfg_boundaries.py +149 -63
- pyedb/configuration/cfg_components.py +333 -97
- pyedb/configuration/cfg_general.py +30 -12
- pyedb/configuration/cfg_modeler.py +161 -67
- pyedb/configuration/cfg_nets.py +33 -17
- pyedb/configuration/cfg_operations.py +63 -31
- pyedb/configuration/cfg_package_definition.py +72 -51
- pyedb/configuration/cfg_pin_groups.py +78 -26
- pyedb/configuration/cfg_s_parameter_models.py +95 -70
- pyedb/configuration/cfg_setup.py +230 -185
- pyedb/configuration/cfg_stackup.py +122 -90
- pyedb/configuration/configuration.py +342 -194
- pyedb/dotnet/database/cell/terminal/padstack_instance_terminal.py +5 -0
- pyedb/dotnet/database/cell/terminal/point_terminal.py +12 -0
- pyedb/dotnet/database/cell/terminal/terminal.py +0 -14
- pyedb/dotnet/database/dotnet/database.py +2 -0
- pyedb/dotnet/database/edb_data/padstacks_data.py +7 -2
- pyedb/dotnet/database/sim_setup_data/data/sweep_data.py +63 -10
- pyedb/dotnet/database/siwave.py +4 -1
- pyedb/dotnet/database/utilities/simulation_setup.py +15 -16
- pyedb/dotnet/edb.py +77 -110
- pyedb/grpc/database/components.py +1 -2
- pyedb/grpc/database/hierarchy/component.py +9 -1
- pyedb/grpc/database/hierarchy/s_parameter_model.py +2 -2
- pyedb/grpc/database/hierarchy/spice_model.py +4 -0
- pyedb/grpc/database/utility/hfss_extent_info.py +31 -20
- {pyedb-0.41.0.dist-info → pyedb-0.43.0.dist-info}/METADATA +1 -1
- {pyedb-0.41.0.dist-info → pyedb-0.43.0.dist-info}/RECORD +31 -31
- {pyedb-0.41.0.dist-info → pyedb-0.43.0.dist-info}/LICENSE +0 -0
- {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
|
-
|
|
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()
|
pyedb/configuration/cfg_nets.py
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
35
|
-
pg.create()
|
|
83
|
+
self.api.set_pingroup_to_edb()
|
|
36
84
|
|
|
37
85
|
def get_data_from_db(self):
|
|
38
|
-
self.
|
|
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
|
-
|
|
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:
|