"""based on phidl.geometry."""
from __future__ import annotations
from functools import partial
import numpy as np
import gdsfactory as gf
from gdsfactory.components.rectangle import rectangle
from gdsfactory.components.text import text
from gdsfactory.typings import Anchor, ComponentSpec, LayerSpec
big_square = partial(rectangle, size=(1300, 2600))
[docs]
@gf.cell_with_child
def die_bbox(
component: ComponentSpec = big_square,
street_width: float = 100.0,
street_length: float | None = None,
die_name: str | None = None,
text_size: float = 100.0,
text_anchor: Anchor = "sw",
layer: LayerSpec = "MTOP",
padding: float = 10.0,
) -> gf.Component:
"""Returns component with boundary box frame around it.
Perfect for defining the boundary of the chip/die
it can also add a label with the name of the die.
similar to die and bbox.
Args:
component: to frame.
street_width: Width of the boundary box.
street_length: length of the boundary box.
die_name: Label text.
text_size: Label text size.
text_anchor: {'nw', 'nc', 'ne', 'sw', 'sc', 'se'} text location.
layer: Specific layer(s) to put polygon geometry on.
padding: adds padding.
"""
D = gf.Component()
component = gf.get_component(component)
D.copy_child_info(component)
cref = D.add_ref(component)
cref.x = 0
cref.y = 0
size = cref.size
sx, sy = size[0] / 2, size[1] / 2
sx += street_width + padding
sy += street_width + padding
street_length = street_length or max([sx, sy])
xpts = np.array(
[
sx,
sx,
sx - street_width,
sx - street_width,
sx - street_length,
sx - street_length,
]
)
ypts = np.array(
[
sy,
sy - street_length,
sy - street_length,
sy - street_width,
sy - street_width,
sy,
]
)
D.add_polygon([+xpts, +ypts], layer=layer)
D.add_polygon([-xpts, +ypts], layer=layer)
D.add_polygon([+xpts, -ypts], layer=layer)
D.add_polygon([-xpts, -ypts], layer=layer)
if die_name:
t = D.add_ref(text(text=die_name, size=text_size, layer=layer))
d = street_width + 20
if text_anchor == "nw":
t.xmin, t.ymax = [-sx + d, sy - d]
elif text_anchor == "nc":
t.x, t.ymax = [0, sy - d]
elif text_anchor == "ne":
t.xmax, t.ymax = [sx - d, sy - d]
if text_anchor == "sw":
t.xmin, t.ymin = [-sx + d, -sy + d]
elif text_anchor == "sc":
t.x, t.ymin = [0, -sy + d]
elif text_anchor == "se":
t.xmax, t.ymin = [sx - d, -sy + d]
return D
if __name__ == "__main__":
mask = gf.components.array(rows=10, columns=10)
# c = die_bbox(component=mask, die_name="chip99")
c = die_bbox()
# c.show(show_ports=True)