From 70488d3519795844265fff6438be398afc1b950d Mon Sep 17 00:00:00 2001 From: maxcapodi78 Date: Tue, 8 Oct 2024 18:17:19 +0200 Subject: [PATCH 1/8] Improve multithread speed and other minor stuff --- src/pyedb/__init__.py | 19 ++++++- src/pyedb/dotnet/edb.py | 49 +++++++++++++++++-- .../edb_core/cell/primitive/primitive.py | 10 +++- 3 files changed, 69 insertions(+), 9 deletions(-) diff --git a/src/pyedb/__init__.py b/src/pyedb/__init__.py index a5577f0198..83821f0148 100644 --- a/src/pyedb/__init__.py +++ b/src/pyedb/__init__.py @@ -3,8 +3,8 @@ import sys import warnings -if os.name == "nt": - os.environ["PYTHONMALLOC"] = "malloc" +# if os.name == "nt": +# os.environ["PYTHONMALLOC"] = "malloc" # By default we use pyedb legacy implementation if "PYEDB_USE_DOTNET" not in os.environ: @@ -75,4 +75,19 @@ def custom_show_warning(message, category, filename, lineno, file=None, line=Non # +import atexit + from pyedb.generic.design_types import Edb, Siwave + + +def at_the_end(): + if bool(os.getenv("PYEDB_USE_DOTNET", "1")): + from pythonnet import unload + + unload() + import gc + + gc.collect(5) + + +atexit.register(at_the_end) diff --git a/src/pyedb/dotnet/edb.py b/src/pyedb/dotnet/edb.py index cf6bc995ed..c17bb19f02 100644 --- a/src/pyedb/dotnet/edb.py +++ b/src/pyedb/dotnet/edb.py @@ -2280,6 +2280,22 @@ def _create_cutout_multithread( i.delete() elif net_name in reference_list and id not in pins_to_preserve: reference_pinsts.append(i) + pins_to_delete = [] + + def check_instances(item): + net_name = item.net_name + id = item.id + if net_name not in all_list and id not in pins_to_preserve: + pins_to_delete.append(item) + elif net_name in reference_list and id not in pins_to_preserve: + reference_pinsts.append(item) + + with ThreadPoolExecutor(number_of_threads) as pool: + pool.map(lambda item: check_instances(item), self.padstacks.instances.values()) + + for i in pins_to_delete: + i.delete() + for i in self.modeler.primitives: if i: net_name = i.net_name @@ -2290,6 +2306,26 @@ def _create_cutout_multithread( reference_paths.append(i) else: reference_prims.append(i) + + prim_to_delete = [] + + def check_prims(item): + if item: + net_name = item.net_name + if net_name not in all_list: + prim_to_delete.append(item) + elif net_name in reference_list and not item.is_void: + if keep_lines_as_path and item.type == "Path": + reference_paths.append(item) + else: + reference_prims.append(item) + + with ThreadPoolExecutor(number_of_threads) as pool: + pool.map(lambda item: check_prims(item), self.modeler.primitives) + + for i in prim_to_delete: + i.delete() + self.logger.info_timer("Net clean up") self.logger.reset_timer() @@ -2424,11 +2460,14 @@ def pins_clean(pinst): # with ThreadPoolExecutor(number_of_threads) as pool: # pool.map(lambda item: clip_path(item), reference_paths) - - for item in reference_paths: - clip_path(item) - for prim in reference_prims: # removing multithreading as failing with new layer from primitive - clean_prim(prim) + with ThreadPoolExecutor(number_of_threads) as pool: + pool.map(lambda item: clip_path(item), reference_paths) + with ThreadPoolExecutor(number_of_threads) as pool: + pool.map(lambda item: clean_prim(item), reference_prims) + # for item in reference_paths: + # clip_path(item) + # for prim in reference_prims: # removing multithreading as failing with new layer from primitive + # clean_prim(prim) # with ThreadPoolExecutor(number_of_threads) as pool: # pool.map(lambda item: clean_prim(item), reference_prims) diff --git a/src/pyedb/dotnet/edb_core/cell/primitive/primitive.py b/src/pyedb/dotnet/edb_core/cell/primitive/primitive.py index 72b55f25b1..aa99dbc3b8 100644 --- a/src/pyedb/dotnet/edb_core/cell/primitive/primitive.py +++ b/src/pyedb/dotnet/edb_core/cell/primitive/primitive.py @@ -43,8 +43,6 @@ class Primitive(Connectable): def __init__(self, pedb, edb_object): super().__init__(pedb, edb_object) self._app = self._pedb - self._core_stackup = pedb.stackup - self._core_net = pedb.nets self.primitive_object = self._edb_object bondwire_type = self._pedb._edb.Cell.Primitive.BondwireType @@ -62,6 +60,14 @@ def __init__(self, pedb, edb_object): "rectangle": bondwire_cross_section_type.BondwireRectangle, } + @property + def _core_stackup(self): + return self._app.stackup + + @property + def _core_net(self): + return self._app.nets + @property def type(self): """Return the type of the primitive. From b4d6d4d32b833fa1436cd09d96cfe50333ddbccd Mon Sep 17 00:00:00 2001 From: maxcapodi78 Date: Wed, 9 Oct 2024 08:51:13 +0200 Subject: [PATCH 2/8] Improve multithread speed and other minor stuff --- src/pyedb/__init__.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/pyedb/__init__.py b/src/pyedb/__init__.py index 83821f0148..a03101cc88 100644 --- a/src/pyedb/__init__.py +++ b/src/pyedb/__init__.py @@ -75,19 +75,4 @@ def custom_show_warning(message, category, filename, lineno, file=None, line=Non # -import atexit - from pyedb.generic.design_types import Edb, Siwave - - -def at_the_end(): - if bool(os.getenv("PYEDB_USE_DOTNET", "1")): - from pythonnet import unload - - unload() - import gc - - gc.collect(5) - - -atexit.register(at_the_end) From 1db53cef157590a9a5b3f769f0ef067e965cc253 Mon Sep 17 00:00:00 2001 From: maxcapodi78 Date: Wed, 9 Oct 2024 09:31:02 +0200 Subject: [PATCH 3/8] Improve multithread speed and other minor stuff --- src/pyedb/dotnet/edb.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/pyedb/dotnet/edb.py b/src/pyedb/dotnet/edb.py index c17bb19f02..d456760874 100644 --- a/src/pyedb/dotnet/edb.py +++ b/src/pyedb/dotnet/edb.py @@ -2273,13 +2273,6 @@ def _create_cutout_multithread( reference_pinsts = [] reference_prims = [] reference_paths = [] - for i in self.padstacks.instances.values(): - net_name = i.net_name - id = i.id - if net_name not in all_list and id not in pins_to_preserve: - i.delete() - elif net_name in reference_list and id not in pins_to_preserve: - reference_pinsts.append(i) pins_to_delete = [] def check_instances(item): @@ -2296,17 +2289,6 @@ def check_instances(item): for i in pins_to_delete: i.delete() - for i in self.modeler.primitives: - if i: - net_name = i.net_name - if net_name not in all_list: - i.delete() - elif net_name in reference_list and not i.is_void: - if keep_lines_as_path and i.type == "Path": - reference_paths.append(i) - else: - reference_prims.append(i) - prim_to_delete = [] def check_prims(item): From 273703e58f07f82741d1a48049c2ea1163150197 Mon Sep 17 00:00:00 2001 From: maxcapodi78 Date: Wed, 9 Oct 2024 09:46:32 +0200 Subject: [PATCH 4/8] Improve multithread speed and other minor stuff --- src/pyedb/dotnet/edb_core/padstack.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/pyedb/dotnet/edb_core/padstack.py b/src/pyedb/dotnet/edb_core/padstack.py index 1b7f675774..1767cc922f 100644 --- a/src/pyedb/dotnet/edb_core/padstack.py +++ b/src/pyedb/dotnet/edb_core/padstack.py @@ -76,6 +76,7 @@ def __init__(self, p_edb): self._pedb = p_edb self._instances = {} self._definitions = {} + self._number_of_instances = 0 @property def _edb(self): @@ -220,11 +221,11 @@ def instances(self): List of padstack instances. """ - - edb_padstack_inst_list = self._pedb.layout.padstack_instances - if len(self._instances) == len(edb_padstack_inst_list): + if len(self._instances) == self._number_of_instances: return self._instances + edb_padstack_inst_list = self._pedb.layout.padstack_instances self._instances = {i.id: i for i in edb_padstack_inst_list} + self._number_of_instances = len(edb_padstack_inst_list) return self._instances @property From 1075f050ac9435c23c6f4e1a2eecd0ffb666a426 Mon Sep 17 00:00:00 2001 From: maxcapodi78 Date: Wed, 9 Oct 2024 09:54:42 +0200 Subject: [PATCH 5/8] Improve multithread speed and other minor stuff --- src/pyedb/dotnet/edb_core/padstack.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/pyedb/dotnet/edb_core/padstack.py b/src/pyedb/dotnet/edb_core/padstack.py index 1767cc922f..1b7f675774 100644 --- a/src/pyedb/dotnet/edb_core/padstack.py +++ b/src/pyedb/dotnet/edb_core/padstack.py @@ -76,7 +76,6 @@ def __init__(self, p_edb): self._pedb = p_edb self._instances = {} self._definitions = {} - self._number_of_instances = 0 @property def _edb(self): @@ -221,11 +220,11 @@ def instances(self): List of padstack instances. """ - if len(self._instances) == self._number_of_instances: - return self._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} - self._number_of_instances = len(edb_padstack_inst_list) return self._instances @property From 98f06c954b7b178bd60ac686b2b82789df1d3fc4 Mon Sep 17 00:00:00 2001 From: maxcapodi78 Date: Wed, 9 Oct 2024 10:38:32 +0200 Subject: [PATCH 6/8] minor improvements --- src/pyedb/dotnet/edb_core/cell/layout.py | 15 ++------------- src/pyedb/dotnet/edb_core/padstack.py | 6 ++++-- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/pyedb/dotnet/edb_core/cell/layout.py b/src/pyedb/dotnet/edb_core/cell/layout.py index 366217ec3e..1c298f5af9 100644 --- a/src/pyedb/dotnet/edb_core/cell/layout.py +++ b/src/pyedb/dotnet/edb_core/cell/layout.py @@ -230,11 +230,7 @@ def primitives(self): ------- list of :class:`dotnet.edb_core.dotnet.primitive.PrimitiveDotNet` cast objects. """ - prims = [] - for p in self._edb_object.Primitives: - obj = primitive_cast(self._pedb, p) - prims.append(obj) - return prims + return [primitive_cast(self._pedb, p) for p in self._edb_object.Primitives] @property def bondwires(self): @@ -249,14 +245,7 @@ def bondwires(self): @property def groups(self): - temp = [] - for i in list(self._edb_object.Groups): - group_type = i.ToString().split(".")[-1].lower() - if group_type == "component": - temp.append(EDBComponent(self._pedb, i)) - else: - pass - return temp + return [EDBComponent(self._pedb, i) for i in self._edb_object.Groups if i.ToString().endswith(".Component")] @property def pin_groups(self): diff --git a/src/pyedb/dotnet/edb_core/padstack.py b/src/pyedb/dotnet/edb_core/padstack.py index 1b7f675774..6813a9411b 100644 --- a/src/pyedb/dotnet/edb_core/padstack.py +++ b/src/pyedb/dotnet/edb_core/padstack.py @@ -76,6 +76,7 @@ def __init__(self, p_edb): self._pedb = p_edb self._instances = {} self._definitions = {} + self._instance_numbers = 0 @property def _edb(self): @@ -221,10 +222,11 @@ def instances(self): """ - edb_padstack_inst_list = self._pedb.layout.padstack_instances - if len(self._instances) == len(edb_padstack_inst_list): + if self._instance_numbers > 0 and len(self._instances) == self._instance_numbers: return self._instances + edb_padstack_inst_list = self._pedb.layout.padstack_instances self._instances = {i.id: i for i in edb_padstack_inst_list} + self._instance_numbers = len(edb_padstack_inst_list) return self._instances @property From 939b979e6e2463e60f6db660f22fcaee753ebdd4 Mon Sep 17 00:00:00 2001 From: maxcapodi78 Date: Wed, 9 Oct 2024 11:31:12 +0200 Subject: [PATCH 7/8] minor improvements --- src/pyedb/dotnet/edb_core/padstack.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/pyedb/dotnet/edb_core/padstack.py b/src/pyedb/dotnet/edb_core/padstack.py index 6813a9411b..3cea53aa99 100644 --- a/src/pyedb/dotnet/edb_core/padstack.py +++ b/src/pyedb/dotnet/edb_core/padstack.py @@ -76,7 +76,6 @@ def __init__(self, p_edb): self._pedb = p_edb self._instances = {} self._definitions = {} - self._instance_numbers = 0 @property def _edb(self): @@ -221,12 +220,10 @@ def instances(self): List of padstack instances. """ - - if self._instance_numbers > 0 and len(self._instances) == self._instance_numbers: - return self._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} - self._instance_numbers = len(edb_padstack_inst_list) return self._instances @property From ad56b51e124c35552acf7001c99f53cf1ad5ac46 Mon Sep 17 00:00:00 2001 From: maxcapodi78 Date: Wed, 9 Oct 2024 12:22:21 +0200 Subject: [PATCH 8/8] minor improvements --- src/pyedb/dotnet/edb.py | 18 ++++++------------ src/pyedb/dotnet/edb_core/components.py | 3 +-- src/pyedb/dotnet/edb_core/layout_validation.py | 2 +- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/pyedb/dotnet/edb.py b/src/pyedb/dotnet/edb.py index d456760874..44209c5ca4 100644 --- a/src/pyedb/dotnet/edb.py +++ b/src/pyedb/dotnet/edb.py @@ -2244,7 +2244,7 @@ def _create_cutout_multithread( pins_to_preserve = [] nets_to_preserve = [] if preserve_components_with_model: - for el in self.components.instances.values(): + for el in self.layout.groups: if el.model_type in [ "SPICEModel", "SParameterModel", @@ -2284,7 +2284,7 @@ def check_instances(item): reference_pinsts.append(item) with ThreadPoolExecutor(number_of_threads) as pool: - pool.map(lambda item: check_instances(item), self.padstacks.instances.values()) + pool.map(lambda item: check_instances(item), self.layout.padstack_instances) for i in pins_to_delete: i.delete() @@ -2352,7 +2352,7 @@ def check_prims(item): if not _poly or _poly.IsNull(): self._logger.error("Failed to create Extent.") return [] - self.logger.info_timer("Expanded Net Polygon Creation") + self.logger.info_timer("Extent Creation") self.logger.reset_timer() _poly_list = convert_py_list_to_net_list([_poly]) prims_to_delete = [] @@ -2435,13 +2435,9 @@ def pins_clean(pinst): for pin in pins_to_delete: pin.delete() - self.logger.info_timer( - "Padstack Instances removal completed. {} instances removed.".format(len(pins_to_delete)) - ) + self.logger.info_timer("{} Padstack Instances deleted.".format(len(pins_to_delete))) self.logger.reset_timer() - # with ThreadPoolExecutor(number_of_threads) as pool: - # pool.map(lambda item: clip_path(item), reference_paths) with ThreadPoolExecutor(number_of_threads) as pool: pool.map(lambda item: clip_path(item), reference_paths) with ThreadPoolExecutor(number_of_threads) as pool: @@ -2450,8 +2446,6 @@ def pins_clean(pinst): # clip_path(item) # for prim in reference_prims: # removing multithreading as failing with new layer from primitive # clean_prim(prim) - # with ThreadPoolExecutor(number_of_threads) as pool: - # pool.map(lambda item: clean_prim(item), reference_prims) for el in poly_to_create: self.modeler.create_polygon(el[0], el[1], net_name=el[2], voids=el[3]) @@ -2459,7 +2453,7 @@ def pins_clean(pinst): for prim in prims_to_delete: prim.delete() - self.logger.info_timer("Primitives cleanup completed. {} primitives deleted.".format(len(prims_to_delete))) + self.logger.info_timer("{} Primitives deleted.".format(len(prims_to_delete))) self.logger.reset_timer() i = 0 @@ -2468,7 +2462,7 @@ def pins_clean(pinst): val.edbcomponent.Delete() i += 1 i += 1 - self.logger.info("Deleted {} additional components".format(i)) + self.logger.info("{} components deleted".format(i)) if remove_single_pin_components: self.components.delete_single_pin_rlc() self.logger.info_timer("Single Pins components deleted") diff --git a/src/pyedb/dotnet/edb_core/components.py b/src/pyedb/dotnet/edb_core/components.py index 8005f3c0eb..793729e188 100644 --- a/src/pyedb/dotnet/edb_core/components.py +++ b/src/pyedb/dotnet/edb_core/components.py @@ -313,8 +313,7 @@ def refresh_components(self): # self._logger.info("Refreshing the Components dictionary.") self._cmp = {} for i in self._pedb.layout.groups: - if i.group_type == "component": - self._cmp[i.name] = i + self._cmp[i.name] = i return True @property diff --git a/src/pyedb/dotnet/edb_core/layout_validation.py b/src/pyedb/dotnet/edb_core/layout_validation.py index 9994dc36f6..fc974bae30 100644 --- a/src/pyedb/dotnet/edb_core/layout_validation.py +++ b/src/pyedb/dotnet/edb_core/layout_validation.py @@ -168,7 +168,7 @@ def disjoint_nets( _objects_list[n_name].append(prim) else: _objects_list[n_name] = [prim] - for pad in list(self._pedb.padstacks.instances.values()): + for pad in list(self._pedb.layout.padstack_instances): n_name = pad.net_name if n_name in _padstacks_list: _padstacks_list[n_name].append(pad)