From 9c20960e62b8f0b9557ff9231290a63bc1e4882a Mon Sep 17 00:00:00 2001 From: jan Date: Thu, 7 Jul 2022 16:06:06 -0700 Subject: [PATCH] round().astype() -> rint(...) --- masque/file/gdsii.py | 18 +++++++++++------- masque/file/oasis.py | 23 ++++++++++++++--------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/masque/file/gdsii.py b/masque/file/gdsii.py index d46cb21..233b8e6 100644 --- a/masque/file/gdsii.py +++ b/masque/file/gdsii.py @@ -53,6 +53,10 @@ path_cap_map = { } +def rint_cast(val: ArrayLike) -> NDArray[numpy.int32]: + return numpy.rint(val, dtype=numpy.int32, casting='unsafe') + + def write( patterns: Union[Pattern, Sequence[Pattern]], stream: BinaryIO, @@ -392,8 +396,8 @@ def _subpatterns_to_refs(subpatterns: List[SubPattern]) -> List[klamath.library. ] aref = klamath.library.Reference( struct_name=encoded_name, - xy=numpy.round(xy).astype(int), - colrow=(numpy.round(rep.a_count), numpy.round(rep.b_count)), + xy=rint_cast(xy), + colrow=(numpy.rint(rep.a_count), numpy.rint(rep.b_count)), angle_deg=angle_deg, invert_y=mirror_across_x, mag=subpat.scale, @@ -403,7 +407,7 @@ def _subpatterns_to_refs(subpatterns: List[SubPattern]) -> List[klamath.library. elif rep is None: ref = klamath.library.Reference( struct_name=encoded_name, - xy=numpy.round([subpat.offset]).astype(int), + xy=rint_cast([subpat.offset]), colrow=None, angle_deg=angle_deg, invert_y=mirror_across_x, @@ -414,7 +418,7 @@ def _subpatterns_to_refs(subpatterns: List[SubPattern]) -> List[klamath.library. else: new_srefs = [klamath.library.Reference( struct_name=encoded_name, - xy=numpy.round([subpat.offset + dd]).astype(int), + xy=rint_cast([subpat.offset + dd]), colrow=None, angle_deg=angle_deg, invert_y=mirror_across_x, @@ -462,8 +466,8 @@ def _shapes_to_elements( layer, data_type = _mlayer2gds(shape.layer) properties = _annotations_to_properties(shape.annotations, 128) if isinstance(shape, Path) and not polygonize_paths: - xy = numpy.round(shape.vertices + shape.offset).astype(int) - width = numpy.round(shape.width).astype(int) + xy = rint_cast(shape.vertices + shape.offset) + width = rint_cast(shape.width) path_type = next(k for k, v in path_cap_map.items() if v == shape.cap) # reverse lookup extension: Tuple[int, int] @@ -511,7 +515,7 @@ def _labels_to_texts(labels: List[Label]) -> List[klamath.elements.Text]: for label in labels: properties = _annotations_to_properties(label.annotations, 128) layer, text_type = _mlayer2gds(label.layer) - xy = numpy.round([label.offset]).astype(int) + xy = rint_cast([label.offset]) text = klamath.elements.Text( layer=(layer, text_type), xy=xy, diff --git a/masque/file/oasis.py b/masque/file/oasis.py index de2f182..aa82ab2 100644 --- a/masque/file/oasis.py +++ b/masque/file/oasis.py @@ -22,6 +22,7 @@ import pathlib import gzip import numpy +from numpy.typing import ArrayLike, NDArray import fatamorgana import fatamorgana.records as fatrec from fatamorgana.basic import PathExtensionScheme, AString, NString, PropStringReference @@ -47,6 +48,10 @@ path_cap_map = { #TODO implement more shape types? +def rint_cast(val: ArrayLike) -> NDArray[numpy.int64]: + return numpy.rint(val, dtype=numpy.int64, casting='unsafe') + + def build( patterns: Union[Pattern, Sequence[Pattern]], units_per_micron: int, @@ -535,7 +540,7 @@ def _subpatterns_to_placements( mirror_across_x, extra_angle = normalize_mirror(subpat.mirrored) frep, rep_offset = repetition_masq2fata(subpat.repetition) - offset = numpy.round(subpat.offset + rep_offset).astype(int) + offset = rint_cast(subpat.offset + rep_offset) angle = numpy.rad2deg(subpat.rotation + extra_angle) % 360 ref = fatrec.Placement( name=subpat.pattern.name, @@ -563,8 +568,8 @@ def _shapes_to_elements( repetition, rep_offset = repetition_masq2fata(shape.repetition) properties = annotations_to_properties(shape.annotations) if isinstance(shape, Circle): - offset = numpy.round(shape.offset + rep_offset).astype(int) - radius = numpy.round(shape.radius).astype(int) + offset = rint_cast(shape.offset + rep_offset) + radius = rint_cast(shape.radius) circle = fatrec.Circle( layer=layer, datatype=datatype, @@ -576,9 +581,9 @@ def _shapes_to_elements( ) elements.append(circle) elif isinstance(shape, Path): - xy = numpy.round(shape.offset + shape.vertices[0] + rep_offset).astype(int) - deltas = numpy.round(numpy.diff(shape.vertices, axis=0)).astype(int) - half_width = numpy.round(shape.width / 2).astype(int) + xy = rint_cast(shape.offset + shape.vertices[0] + rep_offset) + deltas = rint_cast(numpy.diff(shape.vertices, axis=0)) + half_width = rint_cast(shape.width / 2) path_type = next(k for k, v in path_cap_map.items() if v == shape.cap) # reverse lookup extension_start = (path_type, shape.cap_extensions[0] if shape.cap_extensions is not None else None) extension_end = (path_type, shape.cap_extensions[1] if shape.cap_extensions is not None else None) @@ -597,8 +602,8 @@ def _shapes_to_elements( elements.append(path) else: for polygon in shape.to_polygons(): - xy = numpy.round(polygon.offset + polygon.vertices[0] + rep_offset).astype(int) - points = numpy.round(numpy.diff(polygon.vertices, axis=0)).astype(int) + xy = rint_cast(polygon.offset + polygon.vertices[0] + rep_offset) + points = rint_cast(numpy.diff(polygon.vertices, axis=0)) elements.append(fatrec.Polygon( layer=layer, datatype=datatype, @@ -619,7 +624,7 @@ def _labels_to_texts( for label in labels: layer, datatype = layer2oas(label.layer) repetition, rep_offset = repetition_masq2fata(label.repetition) - xy = numpy.round(label.offset + rep_offset).astype(int) + xy = rint_cast(label.offset + rep_offset) properties = annotations_to_properties(label.annotations) texts.append(fatrec.Text( layer=layer,