Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FIX: Create pingroup fix #668

Merged
merged 14 commits into from
Jul 11, 2024
Merged
55 changes: 39 additions & 16 deletions src/pyedb/dotnet/edb_core/modeler.py
Original file line number Diff line number Diff line change
Expand Up @@ -1396,7 +1396,13 @@ def create_bondwire(
net=self._pedb.nets[net]._edb_object,
)

def create_pin_group(self, name: str, pins_by_id: list[int] = None, pins_by_aedt_name: list[str] = None):
def create_pin_group(
self,
name: str,
pins_by_id: list[int] = None,
pins_by_aedt_name: list[str] = None,
pins_by_name: list[str] = None,
):
"""Create a PinGroup.

Parameters
Expand All @@ -1406,23 +1412,40 @@ def create_pin_group(self, name: str, pins_by_id: list[int] = None, pins_by_aedt
List of pins by ID.
pins_by_aedt_name : list[str] or None
List of pins by AEDT name.
pins_by_name : list[str] or None
List of pins by name.
"""
pins = []

if pins_by_id is not None:
pins = {}
if pins_by_id:
for p in pins_by_id:
pins.append(self._pedb.layout.find_object_by_id(p._edb_object))
else:
edb_pin = self._pedb.layout.find_object_by_id(p)
if edb_pin and not p in pins:
pins[p] = edb_pin._edb_object
if not pins_by_aedt_name:
pins_by_aedt_name = []
if not pins_by_name:
pins_by_name = []
if pins_by_aedt_name or pins_by_name:
p_inst = self._pedb.layout.padstack_instances
while True:
p = p_inst.pop(0)
if p.aedt_name in pins_by_aedt_name:
pins.append(p._edb_object)
pins_by_aedt_name.remove(p.aedt_name)
if len(pins_by_aedt_name) == 0:
break

self._edb.cell.hierarchy.pin_group.Create(
self._pedb.layout._edb_object, name, convert_py_list_to_net_list(pins)
_pins = {
pin.id: pin._edb_object
for pin in p_inst
if pin.aedt_name in pins_by_aedt_name or pin.name in pins_by_name
}
if not pins:
pins = _pins
else:
for id, pin in _pins.items():
if not id in pins:
pins[id] = pin
if not pins:
self._logger.error("No pin found.")
return False
pins = list(pins.values())
obj = self._edb.cell.hierarchy.pin_group.Create(
self._pedb.active_layout, name, convert_py_list_to_net_list(pins)
)
if obj.IsNull():
self._logger.debug("Pin group creation returned Null obj.")
return False
return self._pedb.siwave.pin_groups[name]
17 changes: 17 additions & 0 deletions tests/legacy/system/test_edb.py
Original file line number Diff line number Diff line change
Expand Up @@ -1682,3 +1682,20 @@ def test_create_port_ob_component_no_ref_pins_in_component(self, edb_examples):
sim_setup.do_cutout_subdesign = False
edbapp.build_simulation_project(sim_setup)
assert len(edbapp.ports) == 15

def test_create_ping_group(self, edb_examples):
edbapp = edb_examples.get_si_verse()
assert edbapp.modeler.create_pin_group(
name="test1", pins_by_id=[4294969495, 4294969494, 4294969496, 4294969497]
)

assert edbapp.modeler.create_pin_group(
name="test2", pins_by_id=[4294969502, 4294969503], pins_by_aedt_name=["U1-A11", "U1-A12", "U1-A13"]
)
assert edbapp.modeler.create_pin_group(
name="test3",
pins_by_id=[4294969502, 4294969503],
pins_by_aedt_name=["U1-A11", "U1-A12", "U1-A13"],
pins_by_name=["A11", "A12", "A15", "A16"],
)
edbapp.close()
Loading