masque/examples/tutorial/basic.py

80 lines
1.9 KiB
Python

from typing import Tuple, Sequence
import numpy
from numpy import pi
from masque import layer_t, Pattern, SubPattern, Label
from masque.shapes import Circle, Arc
from masque.builder import Device, Port
from masque.library import Library, DeviceLibrary
import masque.file.gdsii
import pcgen
def hole(
radius: float,
layer: layer_t = (1, 0),
) -> Pattern:
"""
Generate a pattern containing a single circular hole.
Args:
layer: Layer to draw the circle on.
radius: Circle radius.
Returns:
Pattern, named `'hole'`
"""
pat = Pattern('hole', shapes=[
Circle(radius=radius, offset=(0, 0), layer=layer)
])
return pat
def smile(
radius: float,
layer: layer_t = (1, 0),
secondary_layer: layer_t = (1, 2)
) -> Pattern:
"""
Generate a pattern containing a single smiley face.
Args:
radius: Boundary circle radius.
layer: Layer to draw the outer circle on.
secondary_layer: Layer to draw eyes and smile on.
Returns:
Pattern, named `'smile'`
"""
# Make an empty pattern
pat = Pattern('smile')
# Add all the shapes we want
pat.shapes += [
Circle(radius=radius, offset=(0, 0), layer=layer), # Outer circle
Circle(radius=radius / 10, offset=(radius / 3, radius / 3), layer=secondary_layer),
Circle(radius=radius / 10, offset=(-radius / 3, radius / 3), layer=secondary_layer),
Arc(radii=(radius * 2 / 3, radius * 2 / 3), # Underlying ellipse radii
angles=(7 / 6 * pi, 11 / 6 * pi), # Angles limiting the arc
width=radius / 10,
offset=(0, 0),
layer=secondary_layer),
]
return pat
def _main() -> None:
hole_pat = hole(1000)
smile_pat = smile(1000)
masque.file.gdsii.writefile([hole_pat, smile_pat], 'basic.gds', 1e-9, 1e-3)
smile_pat.visualize()
if __name__ == '__main__':
_main()