Metadata-Version: 2.4
Name: gds2openEMS
Version: 0.4.0
Summary: Create and run openEMS FDTD model from RFIC GDSII layout file
Author-email: Volker Muehlhaus <volker@muehlhaus.com>
License-Expression: GPL-3.0-or-later
Project-URL: Homepage, https://github.com/VolkerMuehlhaus/gds2openEMS
Project-URL: Repository, https://github.com/VolkerMuehlhaus/gds2openEMS
Project-URL: Changelog, https://github.com/VolkerMuehlhaus/gds2openEMS/blob/main/doc/CHANGES.md
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: gdspy>1.6.0
Requires-Dist: CSXCAD
Requires-Dist: openEMS
Requires-Dist: numpy
Requires-Dist: shapely
Requires-Dist: PySide6
Dynamic: license-file

# gds2openEMS: FDTD simulation workflow for RFIC

The files provided here enable openEMS EM simulation with layouts
created for the IHP SG13G2 RFIC technology.

## Install

    pip install gds2openEMS

**Full documentation, installation guide, and usage walkthrough:**
https://github.com/VolkerMuehlhaus/gds2openEMS

## Recent changes

## 03-Sep-2026

Added a graphical **Stackup XML Editor** (`pip install gds2openEMS` now also installs a `stackupEditor` console command). Covers Variables, Materials, the Dielectric stack, drawn Layers, Reference-relative positioning, Derived Layers, and Thermal Tables, with a live cross-section preview, undo, and an "Import from ADS Momentum" option (`*.subst`/`*.ltd`). `PySide6` is now a dependency of `gds2openEMS`.

This is a port of the equivalent editor from the sibling `gds2palace_ihp_sg13g2`/`setupEM` project, re-pointed at this repo's own `util_stackup_reader.py` (identical XML schema, independently-maintained reader) - a new top-level `stackup_editor/` package, not shared/symlinked with setupEM's original per this workspace's usual convention for these sibling repos.

## 02-Sep-2026

New user's guide, v3

Migrated all 10 `workflow/run_*.py` examples to the `settings{}` dictionary syntax and the `gds2openEMS` PyPI package (`from gds2openEMS import *`), instead of loose top-level variables and a local `modules/` copy. Behavior is unchanged.

This was really two separate things that had gotten tangled together: which code you use (a local `modules/` copy vs. `pip install gds2openEMS`) and which coding style you use (loose variables vs. `settings{}`). They're independent. README.md now documents them as two separate choices.

Removed the `postprocess_only` switch from all example model scripts. It's no longer needed: `runSimulation()` already skips the FDTD solve automatically via a content hash of the model. If the model hasn't changed since the last run, it just reuses the existing result. 

Added `more_examples/local_modules_copy/`, a fully self-contained example (its own `modules/` copy, GDSII layout, and XML stackup) demonstrating the local-copy distribution method on its own. 

`util_simulation_setup.py` module load `import shapely` now fails with a clear error message if shapely module is missing. 

`voltage=0` ports are now actually skipped in scripts that build their excitation list from `simulation_ports.all_active_excitations()`, saving simulation time instead of wasting it. Referencing a never-excited port's S-parameters now fails with a clear error instead of crashing.

Added `scripts/sync_local_modules_copy.py`, so `more_examples/local_modules_copy/modules/` (used to demonstrate the local `modules` folder method) doesn't silently drift out of sync with the canonical source. Run it whenever `workflow/modules/` changes.

## 01-Sep-2026
Fixed a crash in `resolve_derived_layers()`: `gdspy.boolean()` raises `IndexError` when called with an empty operand (e.g. a resistor recognition layer with no polygons in the current cell), which previously aborted the whole GDSII read. The boolean fold now short-circuits using the OR/AND/NOT identity instead whenever either operand is empty. Same fix applied to gds2palace_ihp_sg13g2's independent copy of this reader.

Added a new example, `more_examples/parameterized_XML_stackup`, showing how to override stackup `<Variable>`s (`total_thickness`, `air_thickness`) from a model script via `read_substrate(variable_overrides=...)`, in both the loose top-level variable style and the `settings{}` dictionary style.

Full history: [CHANGES.md](https://github.com/VolkerMuehlhaus/gds2openEMS/blob/main/doc/CHANGES.md)

---

**Note:** the `gds2openEMS` PyPI package itself only requires:

- gdspy>1.6.0
- CSXCAD
- openEMS
- numpy
- shapely
- PySide6

(Other Python modules mentioned above are only needed to run the example/model scripts in this repository, not to use the installed package.)
