Metadata-Version: 2.4
Name: gds2palace
Version: 0.10.2
Summary: Create AWS Palace 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/gds2palace_ihp_sg13g2
Project-URL: Repository, https://github.com/VolkerMuehlhaus/gds2palace_ihp_sg13g2
Project-URL: Changelog, https://github.com/VolkerMuehlhaus/gds2palace_ihp_sg13g2/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: gmsh
Requires-Dist: numpy
Requires-Dist: shapely>=2.0
Dynamic: license-file

# Create AWS Palace FEM Models from GDSII layout files

![Intro](https://raw.githubusercontent.com/VolkerMuehlhaus/gds2palace_ihp_sg13g2/main/doc/png/gds2palace_banner.png)

The files provided here enable RFIC FEM simulation using AWS Palace from GDSII layouts created in [IHP SG13G2](https://github.com/IHP-GmbH/IHP-Open-PDK) RFIC technology. 

Palace, is an open-source, parallel finite element code for full-wave 3D electromagnetic simulations. It can be scaled from single computer to large high performance simulation clusters and cloud-based computing.  
https://awslabs.github.io/palace/stable/  

In addition to AWS Palace, gds2palace can also generate models for [Elmer FEM](https://www.elmerfem.org/), as an additional workflow option for EM (S-parameter) simulation as well as steady-state thermal simulation. See [CHANGES.md](https://raw.githubusercontent.com/VolkerMuehlhaus/gds2palace_ihp_sg13g2/main/doc/CHANGES.md) for this and other recent additions.

The gds2palace workflow in this repository is pre-configured for GDSII layout files in the [IHP SG13G2 Open PDK.](https://github.com/IHP-GmbH/IHP-Open-PDK)
Special thanks to IHP and the public funded German project FMD-QNC (16ME0831) https://www.elektronikforschung.de/projekte/fmd-qnc for financial support, which has contributed to this work.

## Install

    pip install gds2palace

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

## Recent changes

## 11 November-2026

gds2palace 0.10.2

**Changes**  
Faster Palace runs without adaptive mesh refinement: the error estimate, which is then only reported, is computed with `EstimatorTol` 1e-2 instead of Palace's default 1e-6. S-parameters are unchanged. Example: a Butler matrix with 8 ports at one frequency took 254 s instead of 507 s.

**New features**  
`settings['wall_extension']`: per side, e.g. `{'xmax': 2000}`, continues the layout's cross-section at that edge outward to the wall, for a side that is not a port wall. setupEM writes it for the pieces of a split region.

Port walls with several lines: D (span of the lines + 2 x distance to ground, which sets the length of the standards) is now that of the largest group of coupled lines, not of the whole span of the lines on the wall. This gives shorter standards and a calibration valid to higher frequency.

**Fix**  
A via port in the plane of a PEC wall was shorted by the wall, with no message. The model is no longer written, and the error names the port and the side.

Port walls: next to a wall with a `port_wall_extension`, the metal in the standards ended at the layout edge. It now continues to the extended wall, as in the model.

## 10 November-2026
gds2palace 0.10.0

**New features**  
Calibrated de-embedding of ports at a port wall: a box side set to `'PORTWALL'` in `settings['boundary']` is a PEC wall at the layout edge, and the ports on that edge are removed by calibration with two thru-line standards per wall. `run_sim` solves the standards before the model, and `combine_extend_snp.py` writes the `_deembedded` file. New settings `reference_plane_shift`, `deembedding_length`, `port_wall_extension` and `deembedding = 'none'`. Without a port wall, models are unchanged. See "Calibrated de-embedding at port walls" in the user guide.

Every model's `_data` folder now holds its own `combine_extend_snp.py`, and `combine_snp` runs that copy. Update your `combine_snp` once from `scripts/`.

First automated tests of gds2palace: `python -m pytest tests`.

`settings['margin']` can be set per side, as a list `[margin_xmin, margin_xmax, margin_ymin, margin_ymax]`. A negative margin now stops with an error. A conductor, via or sheet layer that reaches an absorbing boundary gives a warning.

Stackups (`XML_stackup/latest/IHP`): two target layers for heat sources, `HEAT_TRANSISTOR` (the top 40 nm of Activ) and `HEAT_RESISTOR` (polysilicon on the field oxide). With `Activ` as the target, heat sources were too thick and came out too cool. EM models are unchanged. See "Heat source targets" in `XML_stackup/latest/IHP/README.md`.

**Fix**  
A conductor that reaches the simulation boundary, with margin and `air_around` both 0 on that side, stopped Palace with an MFEM abort when using the `surface` conductor model. See "Conductors at the simulation boundary" in the user guide.

Elmer thermal: a heat source that partly overlaps another volume lost its mesh refinement.

A model whose metals are all sheets (zero thickness) stopped with the gmsh error "Difference failed - BOPAlgo_AlertTooFewArguments".

## 5 November-2026
gds2palace 0.9.4

**New features**  
`util_thermal_map`: puts powers from a circuit simulation onto the heat sources of a thermal export from the KLayout EM Export plug-in, by instance name, and reports names that do not match. Command line: `python -m gds2palace.util_thermal_map <name>_thermalmap.json powers.csv <name>.tsimcfg`. setupThermal's **Load powers...** uses it.

Elmer thermal: `refined_cellsize_override` now works for thermal models. A heat source (`source_<GDS layer>`, e.g. `['source_205', 0.25]`) or a metal layer in the list gets its own mesh size.

Elmer thermal: the mesh around a heat source now grows at a fixed rate, 0.3 µm per µm of distance. Before, it grew too fast for small mesh sizes, and the temperature rise came out too low. Models whose maximum size is more than 10 times the mesh size at the sources get more elements.

**Fix**  
Elmer thermal: a temperature-dependent thermal conductivity (`ThermalConductivityTable`, e.g. silicon) was taken at 0 K, so temperatures came out too low. The model now iterates until converged. The thermal example gives a temperature rise of 48.0 K instead of 39.7 K. Models with constant thermal conductivities are unchanged.

Stackups (`XML_stackup/latest/IHP`): Activ's thermal conductivity is now the silicon table `Si_vs_T_IHP` instead of a constant 50 W/m·K. Thermal models of devices come out cooler; EM models are unchanged.

Elmer thermal: a heat source inside a conductor of its target layer (e.g. an npn emitter in `Activ`) stopped the model with "Polygon on conductor layer source_... touches another conductor layer".

Mesh check: elements of zero or negative volume are reported after meshing. For Elmer models this is an error with the hint to use a finer mesh; for Palace a warning.

ElmerGrid check: a failed mesh conversion now stops with an error, instead of ElmerSolver reporting a missing mesh folder later.

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

---

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

- gdspy>1.6.0
- gmsh
- numpy
- shapely>=2.0

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