masque/examples/tutorial/basic_shapes.py

121 lines
2.8 KiB
Python
Raw Normal View History

2023-02-23 13:15:32 -08:00
from typing import Sequence
2021-05-16 19:04:31 -07:00
import numpy
2021-05-16 19:04:31 -07:00
from numpy import pi
2023-01-24 23:25:10 -08:00
from masque import (
layer_t, Pattern, Label, Port,
Circle, Arc, Polygon,
)
2021-05-16 19:04:31 -07:00
import masque.file.gdsii
2022-02-27 21:21:44 -08:00
# Note that masque units are arbitrary, and are only given
# physical significance when writing to a file.
2023-01-24 23:25:10 -08:00
GDS_OPTS = dict(
meters_per_unit = 1e-9, # GDS database unit, 1 nanometer
logical_units_per_unit = 1e-3, # GDS display unit, 1 micron
)
2021-05-16 19:04:31 -07:00
2022-02-23 11:00:40 -08:00
def hole(
radius: float,
layer: layer_t = (1, 0),
) -> Pattern:
2021-05-16 19:04:31 -07:00
"""
Generate a pattern containing a single circular hole.
Args:
radius: Circle radius.
2022-02-27 21:21:44 -08:00
layer: Layer to draw the circle on.
2021-05-16 19:04:31 -07:00
Returns:
2023-01-24 23:25:10 -08:00
Pattern containing a circle.
2021-05-16 19:04:31 -07:00
"""
2023-07-17 20:22:04 -07:00
pat = Pattern()
pat.shapes[layer].append(
Circle(radius=radius, offset=(0, 0))
)
2021-05-16 19:04:31 -07:00
return pat
2022-02-27 21:21:44 -08:00
def triangle(
radius: float,
layer: layer_t = (1, 0),
) -> Pattern:
"""
Generate a pattern containing a single triangular hole.
Args:
radius: Radius of circumscribed circle.
layer: Layer to draw the circle on.
Returns:
2023-01-24 23:25:10 -08:00
Pattern containing a triangle
2022-02-27 21:21:44 -08:00
"""
vertices = numpy.array([
(numpy.cos( pi / 2), numpy.sin( pi / 2)),
(numpy.cos(pi + pi / 6), numpy.sin(pi + pi / 6)),
(numpy.cos( - pi / 6), numpy.sin( - pi / 6)),
2023-01-24 23:25:10 -08:00
]) * radius
2022-02-27 21:21:44 -08:00
2023-07-17 20:22:04 -07:00
pat = Pattern()
pat.shapes[layer].extend([
Polygon(offset=(0, 0), vertices=vertices),
2022-02-27 21:21:44 -08:00
])
return pat
2022-02-23 11:00:40 -08:00
def smile(
radius: float,
layer: layer_t = (1, 0),
secondary_layer: layer_t = (1, 2)
) -> Pattern:
2021-05-16 19:04:31 -07:00
"""
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:
2023-01-24 23:25:10 -08:00
Pattern containing a smiley face
2021-05-16 19:04:31 -07:00
"""
# Make an empty pattern
2023-01-24 23:25:10 -08:00
pat = Pattern()
2021-05-16 19:04:31 -07:00
# Add all the shapes we want
2023-07-17 20:22:04 -07:00
pat.shapes[layer] += [
Circle(radius=radius, offset=(0, 0)), # Outer circle
]
pat.shapes[secondary_layer] += [
Circle(radius=radius / 10, offset=(radius / 3, radius / 3)),
Circle(radius=radius / 10, offset=(-radius / 3, radius / 3)),
2023-01-24 23:25:10 -08:00
Arc(
radii=(radius * 2 / 3, radius * 2 / 3), # Underlying ellipse radii
2021-05-16 19:04:31 -07:00
angles=(7 / 6 * pi, 11 / 6 * pi), # Angles limiting the arc
width=radius / 10,
offset=(0, 0),
2023-01-24 23:25:10 -08:00
),
2021-05-16 19:04:31 -07:00
]
return pat
2022-02-27 21:21:44 -08:00
def main() -> None:
2023-01-24 23:25:10 -08:00
lib = {}
2022-02-27 21:21:44 -08:00
2023-01-24 23:25:10 -08:00
lib['hole'] = hole(1000)
lib['smile'] = smile(1000)
lib['triangle'] = triangle(1000)
2021-05-16 19:04:31 -07:00
2023-01-24 23:25:10 -08:00
masque.file.gdsii.writefile(lib, 'basic_shapes.gds', **GDS_OPTS)
2021-05-16 19:04:31 -07:00
2023-01-24 23:25:10 -08:00
lib['triangle'].visualize()
2021-05-16 19:04:31 -07:00
if __name__ == '__main__':
2022-02-27 21:21:44 -08:00
main()