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
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
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)
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
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
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
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
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
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
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
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
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
def char_L(): return manhattan_text("L", size=0.4, layer=LAYER.WG)
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
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)