Source code for meow.gds_structures
""" GDS Extrusions """
from typing import Dict, List, Tuple
import numpy as np
import shapely.geometry as sg
from pydantic.v1 import Field
from .base_model import BaseModel
from .geometries import Prism
from .materials import Material
from .structures import Structure3D
# TODO: Maybe it makes more sense to use native GDSFactory tooling for this
[docs]class GdsExtrusionRule(BaseModel):
"""a `GdsExtrusionRule` describes a single extrusion rule.
Multiple of such rules can later be associated with a gds layer tuple."""
material: Material = Field(description="the material of the extrusion")
h_min: float = Field(description="the extrusion starting height")
h_max: float = Field(description="the extrusion ending height")
buffer: float = Field(
default=0.0,
description="an extra buffer (=grow or shrink) operation applied to the polygon",
)
mesh_order: int = Field(
default=5.0, description="the mesh order of the resulting `Structure3D`"
)
def __call__(self, poly) -> Structure3D:
if self.buffer > 0:
try:
poly = np.asarray(sg.Polygon(poly).buffer(self.buffer).boundary.coords)
except NotImplementedError:
import gdspy # fmt: skip
polygonset = gdspy.offset(gdspy.Polygon(poly), 0.25)
assert polygonset is not None
poly = polygonset.polygons[0]
return Structure3D(
material=self.material,
geometry=Prism(
poly=poly,
h_min=self.h_min,
h_max=self.h_max,
axis="y",
),
mesh_order=self.mesh_order,
)
[docs]def extrude_gds(
cell, # type: ignore
extrusions: Dict[Tuple[int, int], List[GdsExtrusionRule]],
):
"""extrude a gds cell given a dictionary of extruson rules
Args:
cell: a gdspy or gdstk Cell to extrude
extrusions: the extrusion rules to use (if not given, the example extrusions will be used.)
"""
structs = []
for layer, polys in cell.get_polygons(by_spec=True, depth=None).items():
for poly in polys:
if layer not in extrusions:
continue
structs.extend(extrusion(poly) for extrusion in extrusions[layer])
return structs