Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/heitzmann/gdstk

Gdstk (GDSII Tool Kit) is a C++/Python library for creation and manipulation of GDSII and OASIS files.
https://github.com/heitzmann/gdstk

cad cpp eda gdsii microfabrication oasis polygons python svg

Last synced: 17 days ago
JSON representation

Gdstk (GDSII Tool Kit) is a C++/Python library for creation and manipulation of GDSII and OASIS files.

Awesome Lists containing this project

README

        

# GDSTK

[![Boost Software License - Version 1.0](https://img.shields.io/github/license/heitzmann/gdstk.svg)](https://www.boost.org/LICENSE_1_0.txt)
[![Tests Runner](https://github.com/heitzmann/gdstk/actions/workflows/run-tests.yml/badge.svg)](https://github.com/heitzmann/gdstk/actions/workflows/run-tests.yml)
[![Publish Docs](https://github.com/heitzmann/gdstk/actions/workflows/publish-docs.yml/badge.svg)](https://github.com/heitzmann/gdstk/actions/workflows/publish-docs.yml)
[![Package Builder](https://github.com/heitzmann/gdstk/actions/workflows/publish-packages.yml/badge.svg)](https://github.com/heitzmann/gdstk/actions/workflows/publish-packages.yml)
[![Downloads](https://img.shields.io/github/downloads/heitzmann/gdstk/total.svg)](https://github.com/heitzmann/gdstk/releases)

Gdstk (GDSII Tool Kit) is a C++ library for creation and manipulation of GDSII and OASIS files.
It is also available as a Python module meant to be a successor to [Gdspy](https://github.com/heitzmann/gdspy).

Key features for the creation of complex CAD layouts are included:

* Boolean operations on polygons (AND, OR, NOT, XOR) based on clipping algorithm
* Polygon offset (inward and outward rescaling of polygons)
* Efficient point-in-polygon solutions for large array sets

Typical applications of Gdstk are in the fields of electronic chip design, planar lightwave circuit design, and mechanical engineering.

## Documentation

The complete documentation is available [here](http://heitzmann.github.io/gdstk).

The source files can be found in the _docs_ directory.

## Installation

### C++ library only

The C++ library is meant to be used by including it in your own source code.

If you prefer to install a static library, the included _CMakeLists.txt_ should be a good starting option (use `-DCMAKE_INSTALL_PREFIX=path` to control the installation path):

```sh
cmake -S . -B build
cmake --build build --target install
```

The library depends on [zlib](https://zlib.net/) and [qhull](http://www.qhull.org/)

### Python wrapper

The Python module can be installed via pip, Conda or compiled directly from source.
It depends on:

* [zlib](https://zlib.net/)
* [qhull](http://www.qhull.org/)
* [CMake](https://cmake.org/)
* [Python](https://www.python.org/)
* [Numpy](https://numpy.org/)
* [Sphinx](https://www.sphinx-doc.org/), [Read the Docs Theme](https://sphinx-rtd-theme.readthedocs.io/), and [Sphinx Inline Tabs](https://sphinx-inline-tabs.readthedocs.io/) (to build the [documentation](http://heitzmann.github.io/gdstk))

#### From PyPI

Simply run the following to install the package for the current user:

```sh
pip install --user gdstk
```

Or download and install the available wheels manually.

#### From source

Installation from source requires the `build` module (plus CMake and Ninja, for faster compilation):

```sh
pip install --user build
```

With that, simply build the wheel package using:

```sh
python -m build -w
```

This will create a _dist_ directory containing the compiled _.whl_ package that can be installed with ``pip``.

## Support

Help support Gdstk development by [donating via PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=JD2EUE2WPPBQQ) or [sponsoring me on GitHub](https://github.com/sponsors/heitzmann).

## Benchmarks

The _benchmarks_ directory contains a few tests to compare the performance gain of the Python interface versus Gdspy.
They are only for reference; the real improvement is heavily dependent on the type of layout and features used.
If maximal performance is important, the library should be used directly from C++, without the Python interface.

Timing results were obtained with Python 3.11 on an Intel Core i7-9750H @ 2.60 GHz
They represent the best average time to run each function out of 16 sets of 8 runs each.

| Benchmark | Gdspy 1.6.13 | Gdstk 0.9.41 | Gain |
| :--------------- | :--------------: | :--------------: | :------: |
| 10k_rectangles | 80.2 ms | 4.87 ms | 16.5 |
| 1k_circles | 312 ms | 239 ms | 1.3 |
| boolean-offset | 187 μs | 44.7 μs | 4.19 |
| bounding_box | 36.7 ms | 170 μs | 216 |
| curves | 1.52 ms | 30.9 μs | 49.3 |
| flatten | 465 μs | 8.17 μs | 56.9 |
| flexpath | 2.88 ms | 16.1 μs | 178 |
| flexpath-param | 2.8 ms | 585 μs | 4.78 |
| fracture | 929 μs | 616 μs | 1.51 |
| inside | 161 μs | 33 μs | 4.88 |
| read_gds | 2.68 ms | 94 μs | 28.5 |
| read_rawcells | 363 μs | 52.4 μs | 6.94 |
| robustpath | 171 μs | 8.68 μs | 19.7 |

Memory usage per object for 100000 objects:

| Object | Gdspy 1.6.13 | Gdstk 0.9.41 | Reduction |
| :------------------- | :--------------: | :--------------: | :-------: |
| Rectangle | 601 B | 232 B | 61% |
| Circle (r = 10) | 1.68 kB | 1.27 kB | 24% |
| FlexPath segment | 1.48 kB | 439 B | 71% |
| FlexPath arc | 2.26 kB | 1.49 kB | 34% |
| RobustPath segment | 2.89 kB | 920 B | 69% |
| RobustPath arc | 2.66 kB | 920 B | 66% |
| Label | 407 B | 215 B | 47% |
| Reference | 160 B | 179 B | -12% |
| Reference (array) | 189 B | 181 B | 4% |
| Cell | 430 B | 229 B | 47% |