diff --git a/masque/file/gdsii.py b/masque/file/gdsii.py index 98a9a51..94c6928 100644 --- a/masque/file/gdsii.py +++ b/masque/file/gdsii.py @@ -48,15 +48,15 @@ path_cap_map = { } -def write(patterns: Union[Pattern, List[Pattern]], - stream: io.BufferedIOBase, +def build(patterns: Union[Pattern, List[Pattern]], meters_per_unit: float, logical_units_per_unit: float = 1, library_name: str = 'masque-gdsii-write', modify_originals: bool = False, - disambiguate_func: Callable[[Iterable[Pattern]], None] = None): + disambiguate_func: Callable[[Iterable[Pattern]], None] = None, + ) -> gdsii.library.Library: """ - Write a `Pattern` or list of patterns to a GDSII file, by first calling + Convert a `Pattern` or list of patterns to a GDSII stream, by first calling `.polygonize()` to change the shapes into polygons, and then writing patterns as GDSII structures, polygons as boundary elements, and subpatterns as structure references (sref). @@ -74,8 +74,7 @@ def write(patterns: Union[Pattern, List[Pattern]], prior to calling this function. Args: - patterns: A Pattern or list of patterns to write to the stream. - stream: Stream object to write to. + patterns: A Pattern or list of patterns to convert. meters_per_unit: Written into the GDSII file, meters per (database) length unit. All distances are assumed to be an integer multiple of this unit, and are stored as such. logical_units_per_unit: Written into the GDSII file. Allows the GDSII to specify a @@ -90,6 +89,9 @@ def write(patterns: Union[Pattern, List[Pattern]], to make their names valid and unique. Default is `disambiguate_pattern_names`, which attempts to adhere to the GDSII standard as well as possible. WARNING: No additional error checking is performed on the results. + + Returns: + `gdsii.library.Library` """ if isinstance(patterns, Pattern): patterns = [patterns] @@ -123,25 +125,42 @@ def write(patterns: Union[Pattern, List[Pattern]], structure += _labels_to_texts(pat.labels) structure += _subpatterns_to_refs(pat.subpatterns) + return lib + + +def write(patterns: Union[Pattern, List[Pattern]], + stream: io.BufferedIOBase, + *args, + **kwargs): + """ + Write a `Pattern` or list of patterns to a GDSII file. + See `masque.file.gdsii.build()` for details. + + Args: + patterns: A Pattern or list of patterns to write to file. + stream: Stream to write to. + *args: passed to `oasis.build()` + **kwargs: passed to `oasis.build()` + """ + lib = build(patterns, *args, **kwargs) lib.save(stream) return - def writefile(patterns: Union[List[Pattern], Pattern], filename: Union[str, pathlib.Path], *args, **kwargs, ): """ - Wrapper for `gdsii.write()` that takes a filename or path instead of a stream. + Wrapper for `masque.file.gdsii.write()` that takes a filename or path instead of a stream. Will automatically compress the file if it has a .gz suffix. Args: patterns: `Pattern` or list of patterns to save filename: Filename to save to. - *args: passed to `gdsii.write` - **kwargs: passed to `gdsii.write` + *args: passed to `masque.file.gdsii.write` + **kwargs: passed to `masque.file.gdsii.write` """ path = pathlib.Path(filename) if path.suffix == '.gz': @@ -243,14 +262,14 @@ def readfile(filename: Union[str, pathlib.Path], **kwargs, ) -> Tuple[Dict[str, Pattern], Dict[str, Any]]: """ - Wrapper for `gdsii.read()` that takes a filename or path instead of a stream. + Wrapper for `masque.file.gdsii.read()` that takes a filename or path instead of a stream. Will automatically decompress files with a .gz suffix. Args: filename: Filename to save to. - *args: passed to `gdsii.read` - **kwargs: passed to `gdsii.read` + *args: passed to `masque.file.gdsii.read` + **kwargs: passed to `masque.file.gdsii.read` """ path = pathlib.Path(filename) if path.suffix == '.gz': @@ -591,4 +610,3 @@ def disambiguate_pattern_names(patterns, pat.name = encoded_name used_names.append(suffixed_name) -