From fccac25ea4f0dc0b6fbf39aa3d7ee7e64c4669e2 Mon Sep 17 00:00:00 2001 From: mdecea Date: Thu, 15 Aug 2024 11:18:07 -0700 Subject: [PATCH 1/2] Make 3d net layers work --- .../utils/get_component_with_net_layers.py | 40 +++++++++++-------- gplugins/gmsh/parse_gds.py | 3 +- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/gplugins/common/utils/get_component_with_net_layers.py b/gplugins/common/utils/get_component_with_net_layers.py index 23da1a48..0e7ed563 100644 --- a/gplugins/common/utils/get_component_with_net_layers.py +++ b/gplugins/common/utils/get_component_with_net_layers.py @@ -1,7 +1,6 @@ import copy -import gdsfactory as gf -import gdstk +from gdsfactory.technology import LogicalLayer from gdsfactory.typings import Component, LayerStack @@ -56,9 +55,9 @@ def get_component_with_net_layers( add_to_layerstack: True by default, but can be set to False to disable parsing of the layerstack. """ - return NotImplementedError( - "Meshing component with net layers not implemented in gdsfactory8 yet." - ) + # return NotImplementedError( + # "Meshing component with net layers not implemented in gdsfactory8 yet." + # ) # Initialize returned component net_component = component.copy() @@ -67,17 +66,23 @@ def get_component_with_net_layers( for i, portname in enumerate(port_names): port = component.ports[portname] # Get original port layer polygons, and modify a new component without that layer - polygons = net_component.extract(layers=[port.layer]).get_polygons() - net_component = net_component.remove_layers(layers=[port.layer]) + polygons = ( + net_component.extract(layers=(port.layer,)) + .get_polygons() + .get(port.layer, []) + ) + net_component = net_component.remove_layers(layers=(port.layer,)) for polygon in polygons: # If polygon belongs to port, create a unique new layer, and add the polygon to it - - if gdstk.inside( - [port.center], - gdstk.offset(gdstk.Polygon(polygon), gf.get_active_pdk().grid_size), - )[0]: + if polygon.sized(0.005).inside(port.center): + # if gdstk.inside( + # [port.center], + # gdstk.offset(gdstk.Polygon(polygon), gf.get_active_pdk().grid_size), + # )[0]: try: - port_layernames = layer_stack.get_layer_to_layername()[port.layer] + port_layernames = layer_stack.get_layer_to_layername()[ + LogicalLayer(layer=port.layer) + ] except KeyError as e: raise KeyError( "Make sure your `layer_stack` contains all layers with ports" @@ -89,10 +94,13 @@ def get_component_with_net_layers( ) if add_to_layerstack: new_layer = copy.deepcopy(layer_stack.layers[old_layername]) - new_layer.layer = ( - new_layers_init[0] + i, - new_layers_init[1] + j, + new_layer.layer = LogicalLayer( + layer=( + new_layers_init[0] + i, + new_layers_init[1] + j, + ) ) + new_layer.name = f"{old_layername}{delimiter}{portname}" layer_stack.layers[f"{old_layername}{delimiter}{portname}"] = ( new_layer ) diff --git a/gplugins/gmsh/parse_gds.py b/gplugins/gmsh/parse_gds.py index 2de5f0f9..cd58b0b5 100644 --- a/gplugins/gmsh/parse_gds.py +++ b/gplugins/gmsh/parse_gds.py @@ -24,7 +24,6 @@ def _round_coords(x, y, z=None): def fuse_polygons(component, layer, round_tol=4, simplify_tol=1e-4, offset_tol=None): """Take all polygons from a layer, and returns a single (Multi)Polygon shapely object.""" - layer_region = layer.get_shapes(component) # Convert polygons to shapely @@ -37,7 +36,7 @@ def fuse_polygons(component, layer, round_tol=4, simplify_tol=1e-4, offset_tol=N exterior_points.append((point.x / 1000, point.y / 1000)) for hole_index in range(klayout_polygon.holes()): holes_points = [] - for point in layer_region.each_polygon_hole(hole_index): + for point in klayout_polygon.each_point_hole(hole_index): holes_points.append((point.x / 1000, point.y / 1000)) interior_points.append(holes_points) From 0b4380e57678cdf15887834de896d842cb009c76 Mon Sep 17 00:00:00 2001 From: mdecea Date: Thu, 15 Aug 2024 12:46:00 -0700 Subject: [PATCH 2/2] use dbu --- gplugins/common/utils/get_component_with_net_layers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gplugins/common/utils/get_component_with_net_layers.py b/gplugins/common/utils/get_component_with_net_layers.py index 0e7ed563..6a4f43bd 100644 --- a/gplugins/common/utils/get_component_with_net_layers.py +++ b/gplugins/common/utils/get_component_with_net_layers.py @@ -1,5 +1,6 @@ import copy +import gdsfactory as gf from gdsfactory.technology import LogicalLayer from gdsfactory.typings import Component, LayerStack @@ -74,7 +75,7 @@ def get_component_with_net_layers( net_component = net_component.remove_layers(layers=(port.layer,)) for polygon in polygons: # If polygon belongs to port, create a unique new layer, and add the polygon to it - if polygon.sized(0.005).inside(port.center): + if polygon.sized(3 * gf.kcl.dbu).inside(port.center): # if gdstk.inside( # [port.center], # gdstk.offset(gdstk.Polygon(polygon), gf.get_active_pdk().grid_size),