Source code for gdsfactory.components.version_stamp

from __future__ import annotations

import datetime
import platform

import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.components.text import text
from gdsfactory.typings import LayerSpec, LayerSpecs


[docs] @gf.cell def pixel( size: int = 1.0, layer: LayerSpec = "WG", layers: LayerSpecs | None = None ) -> Component: c = gf.Component() a = size / 2 layers = layers or [layer] for layer in layers: c.add_polygon([(a, a), (a, -a), (-a, -a), (-a, a)], layer) return c
[docs] @gf.cell def qrcode( data: str = "mask01", psize: int = 1, layer: LayerSpec = "WG", ) -> Component: """Returns QRCode.""" import qrcode pix = pixel(size=psize, layer=layer) q = qrcode.QRCode() q.add_data(data) matrix = q.get_matrix() c = gf.Component() for i, row in enumerate(matrix): for j, value in enumerate(row): if value: pix_ref = pix.ref((i * psize, j * psize)) c.add(pix_ref) c.absorb(pix_ref) return c
[docs] @gf.cell def version_stamp( labels: tuple[str, ...] = ("demo_label",), with_qr_code: bool = False, layer: LayerSpec = "WG", pixel_size: int = 1, version: str | None = None, text_size: int = 10, layers: LayerSpecs | None = None, ) -> Component: """Component with module version and date. Args: labels: Iterable of labels. with_qr_code: Add QR code with timestamp. layer: Layer for text. pixel_size: Size of the pixel for the QR code. version: Version string. text_size: Size of the text. layers: List of layers for text. """ now = datetime.datetime.now() timestamp = f"{now:%Y-%m-%d %H:%M:%S}" short_stamp = f"{now:%y.%m.%d.%H.%M.%S}" c = gf.Component() layers = layers or [layer] for layer in layers: if with_qr_code: data = f"{timestamp}/{platform.node()}" q = qrcode(layer=layer, data=data, psize=pixel_size).ref_center() c.add(q) c.absorb(q) x = q.size_info.width * 0.5 + 10 else: x = 0 txt_params = {"layer": layer, "justify": "left", "size": text_size} date = text( position=(x, text_size + 2 * pixel_size), text=short_stamp, **txt_params ).ref() c.add(date) c.absorb(date) if version: t = text(position=(x, 0), text=version, **txt_params).ref() c.add(t) c.absorb(t) for i, line in enumerate(labels): t = c << text( position=(x, -(i + 1) * (text_size + 2 * pixel_size)), text=line, **txt_params, ) c.absorb(t) return c
if __name__ == "__main__": layers = {(1, 0), (2, 0)} c = version_stamp( pixel_size=4, layer="M1", with_qr_code=True, # text=["b1", "demo"], text_size=20, layers=layers, ) c.show(show_ports=True)