Skip to content

Commit

Permalink
FEAT: Added getitem to primitives. fixed bug in getitem for padstack. (
Browse files Browse the repository at this point in the history
…#652)

* Added getitem to primitives. fixed bug in getitem for padstack. Added cache data of padstack instance

* MISC: Auto fixes from pre-commit.com hooks

For more information, see https://pre-commit.ci

* added cache for primitives property

* improved caching by cleaning up on delete.

* MISC: Auto fixes from pre-commit.com hooks

For more information, see https://pre-commit.ci

* FIX: minor

* FIX: minor

---------

Co-authored-by: maxcapodi78 <Shark78>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: ring630 <@gmail.com>
Co-authored-by: Hui Zhou <[email protected]>
  • Loading branch information
3 people committed Jul 11, 2024
1 parent a50eab1 commit 142a63f
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 17 deletions.
3 changes: 3 additions & 0 deletions src/pyedb/dotnet/edb_core/cell/layout_obj.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,7 @@ def id(self):
def delete(self):
"""Delete this primitive."""
self._edb_object.Delete()
self._pedb.modeler._primitives = []
self._pedb.padstacks._instances = {}
self._pedb.padstacks._definitions = {}
return True
12 changes: 11 additions & 1 deletion src/pyedb/dotnet/edb_core/dotnet/primitive.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,17 @@ def aedt_name(self):
_, name = self.prim_obj.GetProductProperty(self._app._edb.ProductId.Designer, 1, val)
name = str(name).strip("'")
if name == "":
name = "{}__{}".format(self.primitive_type, self.id)
if str(self.primitive_type) == "Path":
ptype = "line"
elif str(self.primitive_type) == "Rectangle":
ptype = "rect"
elif str(self.primitive_type) == "Polygon":
ptype = "poly"
elif str(self.primitive_type) == "Bondwire":
ptype = "bwr"
else:
ptype = str(self.primitive_type).lower()
name = "{}_{}".format(ptype, self.id)
self.prim_obj.SetProductProperty(self._app._edb.ProductId.Designer, 1, name)
return name

Expand Down
31 changes: 28 additions & 3 deletions src/pyedb/dotnet/edb_core/modeler.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,31 @@ class Modeler(object):
>>> edb_layout = edbapp.modeler
"""

def __getitem__(self, name):
"""Get a layout instance from the Edb project.
Parameters
----------
name : str, int
Returns
-------
:class:`pyedb.dotnet.edb_core.cell.hierarchy.component.EDBComponent`
"""
for i in self.primitives:
if (
(isinstance(name, str) and i.aedt_name == name)
or (isinstance(name, str) and i.aedt_name == name.replace("__", "_"))
or (isinstance(name, int) and i.id == name)
):
return i
self._pedb.logger.error("Primitive not found.")
return

def __init__(self, p_edb):
self._pedb = p_edb
self._primitives = []

@property
def _edb(self):
Expand Down Expand Up @@ -125,11 +148,13 @@ def primitives(self):
list of :class:`pyedb.dotnet.edb_core.edb_data.primitives_data.EDBPrimitives`
List of primitives.
"""
_prims = []
if len(self._primitives) == len(self._layout.primitives):
return self._primitives
self._primitives = []
if self._active_layout:
for lay_obj in self._layout.primitives:
_prims.append(cast(lay_obj, self._pedb))
return _prims
self._primitives.append(cast(lay_obj, self._pedb))
return self._primitives

@property
def polygons_by_layer(self):
Expand Down
21 changes: 15 additions & 6 deletions src/pyedb/dotnet/edb_core/padstack.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ def __getitem__(self, name):
:class:`pyedb.dotnet.edb_core.cell.hierarchy.component.EDBComponent`
"""
if name in self.instances:
return self.instances[name]
if isinstance(name, int) and name in self.instances:
return self._pedb.layout.find_object_by_id(name)
elif name in self.definitions:
return self.definitions[name]
else:
Expand All @@ -74,6 +74,8 @@ def __getitem__(self, name):

def __init__(self, p_edb):
self._pedb = p_edb
self._instances = {}
self._definitions = {}

@property
def _edb(self):
Expand Down Expand Up @@ -183,12 +185,14 @@ def definitions(self):
List of definitions via padstack definitions.
"""
_padstacks = {}
if len(self._definitions) == len(self._pedb.padstack_defs):
return self._definitions
self._definitions = {}
for padstackdef in self._pedb.padstack_defs:
PadStackData = padstackdef.GetData()
if len(PadStackData.GetLayerNames()) >= 1:
_padstacks[padstackdef.GetName()] = EDBPadstack(padstackdef, self)
return _padstacks
self._definitions[padstackdef.GetName()] = EDBPadstack(padstackdef, self)
return self._definitions

@property
def padstacks(self):
Expand Down Expand Up @@ -216,7 +220,12 @@ def instances(self):
List of padstack instances.
"""
return {i.id: i for i in self._pedb.layout.padstack_instances}

edb_padstack_inst_list = self._pedb.layout.padstack_instances
if len(self._instances) == len(edb_padstack_inst_list):
return self._instances
self._instances = {i.id: i for i in edb_padstack_inst_list}
return self._instances

@property
def instances_by_name(self):
Expand Down
23 changes: 16 additions & 7 deletions tests/legacy/system/test_edb_modeler.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,14 +88,23 @@ def test_modeler_polygons(self):
poly_167 = [i for i in self.edbapp.modeler.paths if i.id == 167][0]
assert poly_167.expand(0.0005)

def test_modeler_paths(self):
def test_modeler_paths(self, edb_examples):
"""Evaluate modeler paths"""
assert len(self.edbapp.modeler.paths) > 0
assert self.edbapp.modeler.paths[0].type == "Path"
assert self.edbapp.modeler.paths[0].clone()
assert isinstance(self.edbapp.modeler.paths[0].width, float)
self.edbapp.modeler.paths[0].width = "1mm"
assert self.edbapp.modeler.paths[0].width == 0.001
edbapp = edb_examples.get_si_verse()
assert len(edbapp.modeler.paths) > 0
assert edbapp.modeler.paths[0].type == "Path"
assert edbapp.modeler.paths[0].clone()
assert isinstance(edbapp.modeler.paths[0].width, float)
edbapp.modeler.paths[0].width = "1mm"
assert edbapp.modeler.paths[0].width == 0.001
assert edbapp.modeler["line_167"].type == "Path"
assert edbapp.modeler["poly_3022"].type == "Polygon"
line_number = len(edbapp.modeler.primitives)
assert edbapp.modeler["line_167"].delete()
assert edbapp.modeler._primitives == []
assert line_number == len(edbapp.modeler.primitives) + 1
assert edbapp.modeler["poly_3022"].type == "Polygon"
edbapp.close()

def test_modeler_primitives_by_layer(self):
"""Evaluate modeler primitives by layer"""
Expand Down

0 comments on commit 142a63f

Please sign in to comment.