Ejemplo n.º 1
0
def githash(text=[], size=0.4, hash_length=6, layer=LAYER.WG):
    """ returns the photonics_pdk git hash
    allows a list of text, that will print on separate lines ::

    text = [
        "sw_{}".format(Repo(CONFIG["repo"]).head.object.hexsha[:length]),
        "ap_{}".format(Repo(ap.CONFIG["repo"]).head.object.hexsha[:length]),
        "mm_{}".format(Repo(mm.CONFIG["repo"]).head.object.hexsha[:length]),
    ]
    c = githash(text=text)
    pp.write_gds(c)
    pp.show(c)

    """
    try:
        git_hash = "pp_{}".format(pp.CONFIG["repo"][:hash_length])
    except Exception:
        git_hash = "pp_{}".format(pp.__version__)

    c = pp.Component()
    t = manhattan_text(text=git_hash, size=size, layer=layer)
    tref = c.add_ref(t)
    c.absorb(tref)

    for i, texti in enumerate(text):
        t = manhattan_text(text=texti, size=size, layer=layer)
        tref = c.add_ref(t)
        tref.movey(-6 * size * (i + 1))
        c.absorb(tref)
    return c
Ejemplo n.º 2
0
def _TRCH_DASH_DUO(length=20.0,
                   gap=2.0,
                   width=0.5,
                   separation=4.0,
                   n=3,
                   x_offset=0.0,
                   label=""):

    _trench = _TRCH_DASH_ISO(length=length,
                             width=width,
                             n=n,
                             separation=separation)
    dx = x_offset
    dy = gap + width
    c = pp.Component()
    t1 = c.add_ref(_trench)
    t2 = c.add_ref(_trench)
    t2.move((dy, dx))
    c.absorb(t1)
    c.absorb(t2)

    if label:
        marker_label = manhattan_text(text=label, size=0.4, layer=LAYER.WG)
        _marker_label = c.add_ref(marker_label)
        _marker_label.movey((n - 1) * (length + separation + 4.0) + length / 2)
        c.absorb(_marker_label)

    return c
Ejemplo n.º 3
0
def char_L(
    layer: Tuple[int, int] = LAYER.WG,
    layers_cladding: Optional[List[Tuple[int, int]]] = None,
) -> Component:
    return manhattan_text("L",
                          size=0.4,
                          layer=layer,
                          layers_cladding=layers_cladding)
Ejemplo n.º 4
0
def cdsem_straight_column(
    name=None,
    spacing_h=5.0,
    spacing_v=5.0,
    gaps=[0.224, 0.234, 0.246],
    length=LINE_LENGTH,
    width_center=0.5,
    label="A",
):

    c = pp.Component()
    x = 0

    widths = [width_center * 0.92, width_center, width_center * 1.08]

    y = 0
    for j, width in enumerate(widths):
        # iso line
        _r = wg_line(length, width)
        _r_ref = c.add_ref(_r)
        _r_ref.move((x, y))
        c.absorb(_r_ref)

        y += width + spacing_v

        marker_label = manhattan_text(
            text="{}{}".format(label, j + 1), size=0.4, layer=LAYER.WG
        )
        _marker_label = c.add_ref(marker_label)
        _marker_label.move((length / 2 + 2 * spacing_h, y))
        c.absorb(_marker_label)

        # dual lines
        for gap, col_marker_type in zip(gaps, ["S", "L", "H"]):
            wg_line(length, width)
            _r1_ref = c.add_ref(_r)
            _r1_ref.move((x, y))

            wg_line(length, width)
            _r2_ref = c.add_ref(_r)
            _r2_ref.move((x, y + gap + width))
            c.absorb(_r1_ref)
            c.absorb(_r2_ref)

            # if i < 2:
            marker = CENTER_SHAPES_MAP[col_marker_type]()
            _marker = c.add_ref(marker)
            _marker.move((x + length / 2 + spacing_h / 2, y + width + gap / 2))
            c.absorb(_marker)

            y += 2 * width + gap + spacing_v
        # i += 1

        y += spacing_v + 2 * width

    c.move(c.size_info.cc, (0, 0))
    return c
Ejemplo n.º 5
0
def cdsem_straight(name=None,
                   spacing_h=5.0,
                   spacing_v=5.0,
                   gaps=[0.224, 0.234, 0.246],
                   length=10.0,
                   width_center=0.5,
                   label="A",
                   waveguide_factory=waveguide):

    c = pp.Component()
    x = 0
    i = 0

    widths = [width_center * 0.92, width_center, width_center * 1.08]

    marker_label = manhattan_text(text=label, size=0.4, layer=LAYER.WG)
    _marker_label = c.add_ref(marker_label)
    _marker_label.move(
        (2 * (length + spacing_h) + 2 * spacing_h, 1.5 * spacing_v))
    c.absorb(_marker_label)

    for width, marker_type in zip(widths, ["L", "S", "H"]):
        y = 0
        # iso line
        _r = wg_line(length, width)
        _r_ref = c.add_ref(_r)
        _r_ref.move((x, y))
        c.absorb(_r_ref)

        y += width + spacing_v
        # dual lines
        for gap, col_marker_type in zip(gaps, ["S", "L", "H"]):
            wg_line(length, width)
            _r1_ref = c.add_ref(_r)
            _r1_ref.move((x, y))

            waveguide_factory(length=length, width=width)
            _r2_ref = c.add_ref(_r)
            _r2_ref.move((x, y + gap + width))
            c.absorb(_r1_ref)
            c.absorb(_r2_ref)

            if i < 2:
                marker = CENTER_SHAPES_MAP[col_marker_type]()
                _marker = c.add_ref(marker)
                _marker.move(
                    (x + length / 2 + spacing_h / 2, y + width + gap / 2))
                c.absorb(_marker)

            y += 2 * width + gap + spacing_v
        i += 1

        x += length + spacing_h

    c.move(c.size_info.cc, (0, 0))
    return c
Ejemplo n.º 6
0
def TRCH_ISO(length=20.0, width=0.5):
    c = pp.Component()
    _r = c.add_ref(rectangle(width, length, LAYER.SLAB150))
    c.absorb(_r)

    lblit = gen_label_iterator("TA")
    label = next(lblit)
    marker_label = manhattan_text(text=label, size=0.4, layer=LAYER.WG)
    _marker_label = c.add_ref(marker_label)
    _marker_label.movey(length / 2 + 4.0)
    c.absorb(_marker_label)

    return c
Ejemplo n.º 7
0
def _TRCH_DASH_ISO(length=20.0, width=0.5, n=3, separation=2.0, label=""):
    c = pp.Component()
    _r = rectangle(width, length, LAYER.UT)
    for i in range(n):
        r_ref = c.add_ref(_r)
        r_ref.movey(i * (length + separation))
        c.absorb(r_ref)

    if label:
        marker_label = manhattan_text(text=label, size=0.4, layer=LAYER.WG)
        _marker_label = c.add_ref(marker_label)
        _marker_label.movey((n - 1) * (length + separation + 4.0) + length / 2)
        c.absorb(_marker_label)

    return c
Ejemplo n.º 8
0
def cdsem_target(
        bend90_factory: Callable = bend_circular,
        width_center: float = 0.5,
        label: str = "",
        layer: Tuple[int, int] = LAYER.WG,
        layers_cladding: List[Tuple[int, int]] = None,
        radii: List[float] = (5.0, 10.0),
) -> Component:
    c = pp.Component()
    a = 1.0
    w = 3 * a / 4

    for pos in [(0, 0), (w, w), (-w, w), (w, -w), (-w, -w)]:
        _c = c.add_ref(
            square_middle(layer=layer, layers_cladding=layers_cladding))
        _c.move(pos)
        c.absorb(_c)

    w_min = width_center * 0.92
    w0 = width_center
    w_max = width_center * 1.08

    for radius in radii:
        b = a + radius
        _b_tr = bend90_factory(radius=radius, width=w0)
        b_tr = _b_tr.ref(position=(b, a), rotation=90, port_id="W0")

        _b_bl = bend90_factory(radius=radius, width=w0)
        b_bl = _b_bl.ref(position=(-b, -a), rotation=270, port_id="W0")

        _b_br = bend90_factory(radius=radius, width=w_max)
        b_br = _b_br.ref(position=(a, -b), rotation=0, port_id="W0")

        _b_tl = bend90_factory(radius=radius, width=w_min)
        b_tl = _b_tl.ref(position=(-a, b), rotation=180, port_id="W0")

        c.add([b_tr, b_tl, b_bl, b_br])

    if label:
        marker_label = manhattan_text(text="{}".format(label),
                                      size=1.0,
                                      layer=layer)
        _marker_label = c.add_ref(marker_label)
        _marker_label.movey(-max(radii) - 10.0)
        c.absorb(_marker_label)

    return c
Ejemplo n.º 9
0
def cdsem_straight_density(
    wg_width: float = 0.372,
    trench_width: float = 0.304,
    x: float = LINE_LENGTH,
    y: float = 50.0,
    margin: float = 2.0,
    label: str = "",
    waveguide_factory: Callable = waveguide,
    layer: Tuple[int, int] = LAYER.WG,
    layers_cladding: List[Tuple[int, int]] = None,
) -> Component:
    """horizontal grating etch lines

    TE: 676nm pitch, 304nm gap, 372nm line
    TM: 1110nm pitch, 506nm gap, 604nm line

    Args:
        w: wg_width
        s: trench_width
    """
    c = pp.Component()
    period = wg_width + trench_width
    n_o_lines = int((y - 2 * margin) / period)
    length = x - 2 * margin

    tooth = waveguide_factory(length=length, width=wg_width)

    for i in range(n_o_lines):
        tooth_ref = c.add_ref(tooth)
        tooth_ref.movey((-n_o_lines / 2 + 0.5 + i) * period)
        c.absorb(tooth_ref)

    marker_label = manhattan_text(text="{}".format(label),
                                  size=1.0,
                                  layer=layer,
                                  layers_cladding=layers_cladding)
    _marker_label = c.add_ref(marker_label)
    _marker_label.move((length + 3, 10.0))
    c.absorb(_marker_label)

    return c
Ejemplo n.º 10
0
def cdsem_target(width_center=0.5, label="", layer=LAYER.WG):
    radii = [5.0, 10.0]
    c = pp.Component()
    a = 1.0
    w = 3 * a / 4

    for pos in [(0, 0), (w, w), (-w, w), (w, -w), (-w, -w)]:
        _c = c.add_ref(square_middle())
        _c.move(pos)
        c.absorb(_c)

    w_min = width_center * 0.92
    w0 = width_center
    w_max = width_center * 1.08

    for radius in radii:
        b = a + radius
        _b_tr = bend_circular(radius=radius, width=w0)
        b_tr = _b_tr.ref(position=(b, a), rotation=90, port_id="W0")

        _b_bl = bend_circular(radius=radius, width=w0)
        b_bl = _b_bl.ref(position=(-b, -a), rotation=270, port_id="W0")

        _b_br = bend_circular(radius=radius, width=w_max)
        b_br = _b_br.ref(position=(a, -b), rotation=0, port_id="W0")

        _b_tl = bend_circular(radius=radius, width=w_min)
        b_tl = _b_tl.ref(position=(-a, b), rotation=180, port_id="W0")

        c.add([b_tr, b_tl, b_bl, b_br])

    if label:
        marker_label = manhattan_text(text="{}".format(label),
                                      size=1.0,
                                      layer=layer)
        _marker_label = c.add_ref(marker_label)
        _marker_label.movey(-max(radii) - 10.0)
        c.absorb(_marker_label)

    return c
Ejemplo n.º 11
0
def cdsem_straight_density(wg_width=0.372,
                           trench_width=0.304,
                           x=LINE_LENGTH,
                           y=50.0,
                           margin=2.0,
                           label="",
                           waveguide_factory=waveguide):
    """ horizontal grating etch lines
    
    TE: 676nm pitch, 304nm gap, 372nm line
    TM: 1110nm pitch, 506nm gap, 604nm line

    Args:
        w: wg_width
        s: trench_width
    """
    c = pp.Component()
    period = wg_width + trench_width
    n_o_lines = int((y - 2 * margin) / period)
    length = x - 2 * margin

    tooth = waveguide_factory(length=length, width=wg_width)

    for i in range(n_o_lines):
        tooth_ref = c.add_ref(tooth)
        tooth_ref.movey((-n_o_lines / 2 + 0.5 + i) * period)
        c.absorb(tooth_ref)

    marker_label = manhattan_text(text="{}".format(label),
                                  size=1.0,
                                  layer=LAYER.WG)
    _marker_label = c.add_ref(marker_label)
    _marker_label.move((length / 2 + 10.0, 10.0))
    c.absorb(_marker_label)

    return c
Ejemplo n.º 12
0
def cdsem_straight_density(
    wg_width=0.372, trench_width=0.304, x=LINE_LENGTH, y=50.0, margin=2.0, label=""
):
    """ horizontal grating etch lines
    
    TE: 676nm pitch, 304nm gap, 372nm line
    TM: 1110nm pitch, 506nm gap, 604nm line

    Args:
        w: wg_width
        s: trench_width
    """
    c = pp.Component()
    period = wg_width + trench_width
    n_o_lines = int((y - 2 * margin) / period)
    length = x - 2 * margin

    slab = rectangle(x, y, layer=LAYER.WG)
    slab_ref = c.add_ref(slab)
    c.absorb(slab_ref)

    tooth = rectangle(length, trench_width, layer=LAYER.SLAB150)

    for i in range(n_o_lines):
        _tooth = c.add_ref(tooth)
        _tooth.movey((-n_o_lines / 2 + 0.5 + i) * period)
        c.absorb(_tooth)

    c.move(c.size_info.cc, (0, 0))

    marker_label = manhattan_text(text="{}".format(label), size=1.0, layer=LAYER.WG)
    _marker_label = c.add_ref(marker_label)
    _marker_label.move((length / 2 + 10.0, 10.0))
    c.absorb(_marker_label)

    return c
Ejemplo n.º 13
0
def char_L():
    return manhattan_text("L", size=0.4, layer=LAYER.WG)
Ejemplo n.º 14
0
def cdsem_straight_column(
    spacing_v: float = 5.0,
    gaps: List[float] = (0.224, 0.234, 0.246),
    length: float = LINE_LENGTH,
    width_center: float = 0.5,
    label: str = "A",
    waveguide_factory: Callable = waveguide,
    layer: Tuple[int, int] = LAYER.WG,
    layers_cladding: List[Tuple[int, int]] = None,
) -> Component:

    c = pp.Component()
    x = 0

    widths = [width_center * 0.92, width_center, width_center * 1.08]

    y = 0
    for j, width in enumerate(widths):
        # iso line
        _r = waveguide_factory(length=length, width=width)
        _r_ref = c.add_ref(_r)
        _r_ref.move((x, y))
        c.absorb(_r_ref)

        y += width + spacing_v

        marker_label = manhattan_text(
            text="{}{}".format(label, j + 1),
            size=0.4,
            layer=layer,
            layers_cladding=layers_cladding,
        )
        _marker_label = c.add_ref(marker_label)
        _marker_label.move((length + 6, y))
        c.absorb(_marker_label)

        # dual lines
        for gap, col_marker_type in zip(gaps, ["S", "L", "H"]):
            wg_line(length,
                    width,
                    layer=layer,
                    layers_cladding=layers_cladding)
            _r1_ref = c.add_ref(_r)
            _r1_ref.move((x, y))

            wg_line(length,
                    width,
                    layer=layer,
                    layers_cladding=layers_cladding)
            _r2_ref = c.add_ref(_r)
            _r2_ref.move((x, y + gap + width))
            c.absorb(_r1_ref)
            c.absorb(_r2_ref)

            # if i < 2:
            marker = CENTER_SHAPES_MAP[col_marker_type](
                layer=layer, layers_cladding=layers_cladding)
            _marker = c.add_ref(marker)
            _marker.move((length + 3, y + width + gap / 2))
            c.absorb(_marker)

            y += 2 * width + gap + spacing_v
        # i += 1

        y += spacing_v + 2 * width

    c.move(c.size_info.cc, (0, 0))
    return c
Ejemplo n.º 15
0
def char_L(
    layer: ListConfig = LAYER.WG, layers_cladding: List[ListConfig] = []
) -> Component:
    return manhattan_text("L", size=0.4, layer=layer, layers_cladding=layers_cladding)