def test_gds_array(tmpdir): lib = gdstk.Library("Library") ref_cell = lib.new_cell("Base") ref_cell.add(*gdstk.text("F", 1, (0, 0))) for rect in (True, False): for cols in (1, 3): for rows in (1, 3): if cols * rows == 1: continue for dx in (-3, 0, 3): for dy in (-4, 0, 4): if rect: rep = gdstk.Repetition(columns=cols, rows=rows, spacing=(dx, dy)) else: rep = gdstk.Repetition(columns=cols, rows=rows, v1=(dx, 0), v2=(0, dy)) for rot in range(-3, 4): for refl in (True, False): cell = lib.new_cell( f"{'RECT' if rect else 'REGL'}" f"_{cols}_{rows}_{dx}_{dy}" f"_{rot}{'_X' if refl else ''}") ref = gdstk.Reference( ref_cell, (-0.5, -1), 0.5 * numpy.pi * rot, x_reflection=refl, ) ref.repetition = rep cell.add(ref) fname = str(tmpdir.join("aref_test.gds")) lib.write_gds(fname) lib2 = gdstk.read_gds(fname) cell_dict = {cell.name: cell for cell in lib.cells} for cell in lib2.cells: if len(cell.references) == 0: continue assert len(cell.references) == 1 assert cell.references[0].repetition.size > 1 assert cell.name in cell_dict polygons1 = cell_dict[cell.name].get_polygons() polygons2 = cell.get_polygons() assert len(polygons1) == len(polygons2) assert_same_shape(polygons1, polygons2)
def test_bb_label_repetition(): lbl = gdstk.Label("label", (1, 2)) lbl.repetition = gdstk.Repetition(x_offsets=(1, 3, -2)) c_lbl = gdstk.Cell("A") c_lbl.add(lbl) assert_close(c_lbl.bounding_box(), ((-1, 2), (4, 2))) ref = gdstk.Reference(c_lbl) ref.repetition = gdstk.Repetition(y_offsets=(-1, 2, -4)) c_ref = gdstk.Cell("B") c_ref.add(ref) assert_close(c_ref.bounding_box(), ((-1, -2), (4, 4))) ref.rotation = numpy.pi / 4 a = (-1 + 2j) * numpy.exp(0.25j * numpy.pi) b = (4 + 2j) * numpy.exp(0.25j * numpy.pi) assert_close(c_ref.bounding_box(), ((a.real, a.imag - 4), (b.real, b.imag + 2)))
def test_bb_robustpath_repetition(): pth = gdstk.RobustPath(0.5j, 1).segment((1, 0.5)) pth.repetition = gdstk.Repetition(x_offsets=(1, 3, -2)) c_pth = gdstk.Cell("G") c_pth.add(pth) assert_close(c_pth.bounding_box(), ((-2, 0), (4, 1))) ref = gdstk.Reference(c_pth) ref.repetition = gdstk.Repetition(y_offsets=(-1, 2, -4)) c_ref = gdstk.Cell("H") c_ref.add(ref) assert_close(c_ref.bounding_box(), ((-2, -4), (4, 3))) ref.rotation = numpy.pi / 4 a = (-2 + 1j) * numpy.exp(0.25j * numpy.pi) b = (-2 + 0j) * numpy.exp(0.25j * numpy.pi) c = (4 + 0j) * numpy.exp(0.25j * numpy.pi) d = (4 + 1j) * numpy.exp(0.25j * numpy.pi) assert_close(c_ref.bounding_box(), ((a.real, b.imag - 4), (c.real, d.imag + 2)))
def test_bb_flexpath_repetition(): pth = gdstk.FlexPath([0.5 + 0j, 0.5 + 1j], 1) pth.repetition = gdstk.Repetition(x_offsets=(1, 3, -2)) c_pth = gdstk.Cell("E") c_pth.add(pth) assert_close(c_pth.bounding_box(), ((-2, 0), (4, 1))) ref = gdstk.Reference(c_pth) ref.repetition = gdstk.Repetition(y_offsets=(-1, 2, -4)) c_ref = gdstk.Cell("F") c_ref.add(ref) assert_close(c_ref.bounding_box(), ((-2, -4), (4, 3))) ref.rotation = numpy.pi / 4 a = (-2 + 1j) * numpy.exp(0.25j * numpy.pi) b = (-2 + 0j) * numpy.exp(0.25j * numpy.pi) c = (4 + 0j) * numpy.exp(0.25j * numpy.pi) d = (4 + 1j) * numpy.exp(0.25j * numpy.pi) assert_close(c_ref.bounding_box(), ((a.real, b.imag - 4), (c.real, d.imag + 2)))
def test_bb_polygon_repetition(): pol = gdstk.rectangle((0, 0), (1, 1)) pol.repetition = gdstk.Repetition(x_offsets=(1, 3, -2)) c_pol = gdstk.Cell("C") c_pol.add(pol) assert_close(c_pol.bounding_box(), ((-2, 0), (4, 1))) ref = gdstk.Reference(c_pol) ref.repetition = gdstk.Repetition(y_offsets=(-1, 2, -4)) c_ref = gdstk.Cell("D") c_ref.add(ref) assert_close(c_ref.bounding_box(), ((-2, -4), (4, 3))) ref.rotation = numpy.pi / 4 a = (-2 + 1j) * numpy.exp(0.25j * numpy.pi) b = (-2 + 0j) * numpy.exp(0.25j * numpy.pi) c = (4 + 0j) * numpy.exp(0.25j * numpy.pi) d = (4 + 1j) * numpy.exp(0.25j * numpy.pi) assert_close(c_ref.bounding_box(), ((a.real, b.imag - 4), (c.real, d.imag + 2)))
# Copyright 2020 Lucas Heitzmann Gabrielli. # This file is part of gdstk, distributed under the terms of the # Boost Software License - Version 1.0. See the accompanying # LICENSE file or <http://www.boost.org/LICENSE_1_0.txt> import pathlib from tutorial_images import draw import numpy import gdstk if __name__ == "__main__": # Rectangular repetition square = gdstk.regular_polygon((0, 0), 0.2, 4) square.repetition = gdstk.Repetition(3, 2, spacing=(1, 1)) # Regular repetition triangle = gdstk.regular_polygon((0, 2.5), 0.2, 3) triangle.repetition = gdstk.Repetition(3, 5, v1=(0.4, -0.3), v2=(0.4, 0.2)) # Explicit repetition circle = gdstk.ellipse((3.5, 0), 0.1) circle.repetition = gdstk.Repetition(offsets=[(0.5, 1), (2, 0), (1.5, 0.5)]) # X-explicit repetition vline = gdstk.FlexPath([(3, 2), (3, 3.5)], 0.1, gdsii_path=True) vline.repetition = gdstk.Repetition(x_offsets=[0.2, 0.6, 1.4, 3.0]) # Y-explicit repetition hline = gdstk.RobustPath((3, 2), 0.05, gdsii_path=True) hline.segment((6, 2))
# Copyright 2020 Lucas Heitzmann Gabrielli. # This file is part of gdstk, distributed under the terms of the # Boost Software License - Version 1.0. See the accompanying # LICENSE file or <http://www.boost.org/LICENSE_1_0.txt> import pathlib from tutorial_images import draw import numpy import gdstk if __name__ == "__main__": # X-explicit repetition vline = gdstk.FlexPath([(3, 2), (3, 3.5)], 0.1, gdsii_path=True) vline.repetition = gdstk.Repetition(x_offsets=[0.2, 0.6, 1.4, 3.0]) # Y-explicit repetition hline = gdstk.RobustPath((3, 2), 0.05, gdsii_path=True) hline.segment((6, 2)) hline.repetition = gdstk.Repetition(y_offsets=[0.1, 0.3, 0.7, 1.5]) # Create all copies vlines = vline.apply_repetition() hlines = hline.apply_repetition() # Include original elements for boolean operation vlines.append(vline) hlines.append(hline) result = gdstk.boolean(vlines, hlines, "or")