setupEM 0.14.0__tar.gz → 0.14.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. setupem-0.14.1/PKG-INFO +73 -0
  2. setupem-0.14.1/README_pypi.md +46 -0
  3. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/__init__.py +1 -1
  4. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/momentum_import.py +59 -6
  5. setupem-0.14.1/src/setupEM.egg-info/PKG-INFO +73 -0
  6. setupem-0.14.0/PKG-INFO +0 -85
  7. setupem-0.14.0/README_pypi.md +0 -58
  8. setupem-0.14.0/src/setupEM.egg-info/PKG-INFO +0 -85
  9. {setupem-0.14.0 → setupem-0.14.1}/LICENSE +0 -0
  10. {setupem-0.14.0 → setupem-0.14.1}/README.md +0 -0
  11. {setupem-0.14.0 → setupem-0.14.1}/pyproject.toml +0 -0
  12. {setupem-0.14.0 → setupem-0.14.1}/setup.cfg +0 -0
  13. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/__main__.py +0 -0
  14. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/data/SG13CMOS5L_200um.xml +0 -0
  15. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/data/SG13G2_100um.xml +0 -0
  16. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/data/SG13G2_200um.xml +0 -0
  17. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/data/SG13G2_FEM_200um.xml +0 -0
  18. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/data/SG13G2_FEM_200um_passi3D.xml +0 -0
  19. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/data/SG13G2_nosub.xml +0 -0
  20. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/field_viewer.py +0 -0
  21. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/gds_hierarchy_scan.py +0 -0
  22. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/layout_preview.py +0 -0
  23. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/palace_results.py +0 -0
  24. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/result_viewer.py +0 -0
  25. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/setupEM.py +0 -0
  26. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/setupThermal.py +0 -0
  27. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/setup_common.py +0 -0
  28. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/simplify_gds.py +0 -0
  29. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/stackupEditor.py +0 -0
  30. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/stackup_writer.py +0 -0
  31. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM/thermal_results.py +0 -0
  32. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM.egg-info/SOURCES.txt +0 -0
  33. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM.egg-info/dependency_links.txt +0 -0
  34. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM.egg-info/entry_points.txt +0 -0
  35. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM.egg-info/requires.txt +0 -0
  36. {setupem-0.14.0 → setupem-0.14.1}/src/setupEM.egg-info/top_level.txt +0 -0
@@ -0,0 +1,73 @@
1
+ Metadata-Version: 2.4
2
+ Name: setupEM
3
+ Version: 0.14.1
4
+ Summary: Python tool for configuration of gds2palace workflow with GUI.
5
+ Author-email: Volker Muehlhaus <volker@muehlhaus.com>
6
+ License-Expression: GPL-3.0-or-later
7
+ Project-URL: Homepage, https://github.com/VolkerMuehlhaus/setupEM
8
+ Project-URL: Repository, https://github.com/VolkerMuehlhaus/setupEM
9
+ Project-URL: Changelog, https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc/CHANGES.md
10
+ Requires-Python: >=3.9
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: gds2palace>=0.9.0
14
+ Requires-Dist: gds_prepare_for_EM>=1.3.0
15
+ Requires-Dist: PySide6
16
+ Requires-Dist: shiboken6
17
+ Requires-Dist: scipy
18
+ Requires-Dist: requests
19
+ Requires-Dist: scikit-rf
20
+ Requires-Dist: matplotlib
21
+ Requires-Dist: numpy
22
+ Requires-Dist: gdspy
23
+ Requires-Dist: meshio
24
+ Requires-Dist: pyvista
25
+ Requires-Dist: pyvistaqt
26
+ Dynamic: license-file
27
+
28
+ # Python GUI for gds2palace
29
+
30
+ ![Intro](https://raw.githubusercontent.com/VolkerMuehlhaus/setupEM/main/doc/png/setupEM_banner.png)
31
+
32
+ ## Install
33
+
34
+ pip install setupEM
35
+
36
+ **Full documentation, installation guide, and usage walkthrough:**
37
+ https://github.com/VolkerMuehlhaus/setupEM
38
+
39
+ ## Recent changes
40
+
41
+ # What's New - October 19, 2026
42
+
43
+ **Stackup Editor, ADS Momentum (*.ltd) import:** metals with an EXPAND thickness operation now make the dielectric next to them thicker, as in ADS, instead of reaching into the dielectric below. Before, a thick EXPAND DOWN metal (e.g. MET1/MET2 in a GaAs stackup) overlapped the layers underneath it, and a via could end up with zero height. Files where long lines are wrapped or END_... markers follow the last entry on the same line now import too; before, they failed with "No usable dielectric slabs".
44
+
45
+ # What's New - October 18, 2026
46
+
47
+ **Touchstone files with different port impedances:** the option line of the combined `.sNp` file now has one Z0 per port, in port order. Before, ports with the same Z0 as port 1 were left out.
48
+
49
+ # What's New - October 17, 2026
50
+
51
+ **Conductor model** replaces **Conductor meshing** on the Mesh and Boundaries tab (Palace only), with a third choice: **Surface impedance** (default, as before), **Solve inside (volume mesh)** and the new **Solve inside + skin layers**, which adds thin layers along the conductor faces for accurate Q and loss at high frequency. Generated model scripts now use `settings['conductor_model']` instead of `settings['filled_metals']`. Older projects and model scripts with `filled_metals` still load. setupEM now requires gds2palace 0.9.0 or later; `pip install --upgrade setupEM` updates it.
52
+
53
+ Full history: [CHANGES.md](https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc/CHANGES.md)
54
+
55
+ ---
56
+
57
+ **Note:** the `setupEM` PyPI package itself requires:
58
+
59
+ - gds2palace>=0.9.0
60
+ - gds_prepare_for_EM>=1.3.0
61
+ - PySide6
62
+ - shiboken6
63
+ - scipy
64
+ - requests
65
+ - scikit-rf
66
+ - matplotlib
67
+ - numpy
68
+ - gdspy
69
+ - meshio
70
+ - pyvista
71
+ - pyvistaqt
72
+
73
+ (Other Python modules mentioned above are only needed to run standalone helper scripts in this repository, not to use the installed package.)
@@ -0,0 +1,46 @@
1
+ # Python GUI for gds2palace
2
+
3
+ ![Intro](https://raw.githubusercontent.com/VolkerMuehlhaus/setupEM/main/doc/png/setupEM_banner.png)
4
+
5
+ ## Install
6
+
7
+ pip install setupEM
8
+
9
+ **Full documentation, installation guide, and usage walkthrough:**
10
+ https://github.com/VolkerMuehlhaus/setupEM
11
+
12
+ ## Recent changes
13
+
14
+ # What's New - October 19, 2026
15
+
16
+ **Stackup Editor, ADS Momentum (*.ltd) import:** metals with an EXPAND thickness operation now make the dielectric next to them thicker, as in ADS, instead of reaching into the dielectric below. Before, a thick EXPAND DOWN metal (e.g. MET1/MET2 in a GaAs stackup) overlapped the layers underneath it, and a via could end up with zero height. Files where long lines are wrapped or END_... markers follow the last entry on the same line now import too; before, they failed with "No usable dielectric slabs".
17
+
18
+ # What's New - October 18, 2026
19
+
20
+ **Touchstone files with different port impedances:** the option line of the combined `.sNp` file now has one Z0 per port, in port order. Before, ports with the same Z0 as port 1 were left out.
21
+
22
+ # What's New - October 17, 2026
23
+
24
+ **Conductor model** replaces **Conductor meshing** on the Mesh and Boundaries tab (Palace only), with a third choice: **Surface impedance** (default, as before), **Solve inside (volume mesh)** and the new **Solve inside + skin layers**, which adds thin layers along the conductor faces for accurate Q and loss at high frequency. Generated model scripts now use `settings['conductor_model']` instead of `settings['filled_metals']`. Older projects and model scripts with `filled_metals` still load. setupEM now requires gds2palace 0.9.0 or later; `pip install --upgrade setupEM` updates it.
25
+
26
+ Full history: [CHANGES.md](https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc/CHANGES.md)
27
+
28
+ ---
29
+
30
+ **Note:** the `setupEM` PyPI package itself requires:
31
+
32
+ - gds2palace>=0.9.0
33
+ - gds_prepare_for_EM>=1.3.0
34
+ - PySide6
35
+ - shiboken6
36
+ - scipy
37
+ - requests
38
+ - scikit-rf
39
+ - matplotlib
40
+ - numpy
41
+ - gdspy
42
+ - meshio
43
+ - pyvista
44
+ - pyvistaqt
45
+
46
+ (Other Python modules mentioned above are only needed to run standalone helper scripts in this repository, not to use the installed package.)
@@ -24,4 +24,4 @@ A Python tool for EM setup using gds2palace.
24
24
  from .setupEM import main
25
25
 
26
26
  __all__ = ["main"]
27
- __version__ = "0.14.0"
27
+ __version__ = "0.14.1"
@@ -294,12 +294,15 @@ def _build_tree(slabs, layers, materials, warnings, derived_layers=None):
294
294
  # (both source formats define it that way) rather than that metal's TOP, where it
295
295
  # actually needs to start - shift any via whose zmin coincides with a metal's zmin
296
296
  # up by that metal's own thickness.
297
+ # A metal that only shares its zmin with the via by coincidence (e.g. a thick *.ltd
298
+ # EXPAND DOWN metal reaching the via's bottom interface) must not shrink the via to
299
+ # nothing - only nudge while the via keeps a positive height.
297
300
  metal_spans = [(l.zmin, l.zmax - l.zmin) for l in layers if l.kind == "metal"]
298
301
  for l in layers:
299
302
  if l.kind != "via":
300
303
  continue
301
304
  for metal_zmin, metal_thickness in metal_spans:
302
- if abs(l.zmin - metal_zmin) < _EPSILON_UM:
305
+ if abs(l.zmin - metal_zmin) < _EPSILON_UM and l.zmin + metal_thickness < l.zmax - _EPSILON_UM:
303
306
  l.zmin += metal_thickness
304
307
  break
305
308
 
@@ -584,7 +587,23 @@ def _ltd_kv(line):
584
587
  return {key.upper(): value.strip('"') for key, value in _KV_RE.findall(line)}
585
588
 
586
589
 
590
+ # keywords that start a new statement in each section - any other line in these sections
591
+ # is a continuation of the previous statement (a long MATERIAL/MASK/LAYER line wrapped
592
+ # onto the next line, e.g. "IMAG_PERMEABILITY=0", "OPERATION=...", or a MASK's own
593
+ # "MASK_PROPERTIES = {...}" line) and is joined back onto it
594
+ _LTD_STATEMENT_KEYWORDS = {
595
+ "MATERIAL": {"MATERIAL"},
596
+ "OPERATION": {"OPERATION"},
597
+ "MASK": {"MASK"},
598
+ "DERIVEDMASK": {"DERIVEDMASK"},
599
+ "STACK": {"TOP", "INTERFACE", "LAYER", "BOTTOM"},
600
+ }
601
+
602
+
587
603
  def _split_ltd_sections(text):
604
+ # END_<section> is not always on a line of its own - seen trailing the last statement
605
+ # ("OPERATION OperationTSV_Virtual_VIA1 DRILL END_OPERATION")
606
+ text = re.sub(r'\s+(END_\w+)\b', r'\n\1', text)
588
607
  sections = {}
589
608
  current = None
590
609
  buf = []
@@ -603,7 +622,11 @@ def _split_ltd_sections(text):
603
622
  current = None
604
623
  continue
605
624
  if current:
606
- buf.append(line)
625
+ keywords = _LTD_STATEMENT_KEYWORDS.get(current)
626
+ if keywords and buf and line.split()[0] not in keywords:
627
+ buf[-1] = buf[-1] + " " + line
628
+ else:
629
+ buf.append(line)
607
630
  return sections
608
631
 
609
632
 
@@ -679,10 +702,13 @@ def _parse_ltd(ltd_path, air_thickness_um, warnings):
679
702
  elif "INTRUDE" in kv or "EXPAND" in kv:
680
703
  # both give a thickness in meters; DOWN (vs. the default UP) means this metal
681
704
  # grows downward from its interface into the slab below - same concept *.subst
682
- # expresses via a negative thick value, here via an explicit direction token
705
+ # expresses via a negative thick value, here via an explicit direction token.
706
+ # INTRUDE places the metal inside the existing slab; EXPAND makes that slab
707
+ # thicker by the metal thickness (same as *.subst's expand="1"), handled when
708
+ # the stack is walked below.
683
709
  magnitude_um = float(kv.get("INTRUDE") or kv.get("EXPAND")) * 1e6
684
710
  thickness_um = -magnitude_um if "DOWN" in tokens else magnitude_um
685
- operations[name] = ("metal", thickness_um)
711
+ operations[name] = ("metal", thickness_um, "EXPAND" in kv)
686
712
  elif "SHEET" in tokens:
687
713
  operations[name] = ("sheet", None)
688
714
  elif "WALL" in tokens:
@@ -773,7 +799,33 @@ def _parse_ltd(ltd_path, air_thickness_um, warnings):
773
799
  groundplane_detected = False
774
800
  bottom_state = None
775
801
 
776
- for line in reversed(stack_lines):
802
+ # EXPAND metals make the dielectric LAYER next to their INTERFACE thicker (DOWN: the
803
+ # LAYER below, UP: the one above) - by the thickest such metal on that interface, not
804
+ # the sum (ADS shows TFR 0.05um + MET1 1um EXPAND DOWN on one interface as +1um). A
805
+ # LAYER can grow from both sides (metal EXPAND UP below it, another EXPAND DOWN above
806
+ # it), which adds up. Must be known before the bottom-up walk reaches that LAYER, so
807
+ # collected up front: (line index in file order, top-to-bottom; +1 DOWN / -1 UP) ->
808
+ # extra thickness in um
809
+ expand_um = {}
810
+ for idx, line in enumerate(stack_lines):
811
+ if line.split()[0] != "INTERFACE":
812
+ continue
813
+ mask_match = _MASK_BRACE_RE.search(line)
814
+ for token in mask_match.group(1).split() if mask_match else []:
815
+ mask = _resolve_mask_token(token, masks, masks_by_layer)
816
+ op = operations.get(mask["operation"]) if mask else None
817
+ if op is None or op[0] != "metal" or not op[2]:
818
+ continue
819
+ side = 1 if op[1] < 0 else -1
820
+ target = idx + side
821
+ if 0 <= target < len(stack_lines) and stack_lines[target].split()[0] == "LAYER":
822
+ expand_um[(target, side)] = max(expand_um.get((target, side), 0.0), abs(op[1]))
823
+ else:
824
+ warnings.append(f"Mask '{mask['name']}' uses EXPAND but has no dielectric LAYER on that "
825
+ f"side of its INTERFACE - placed without growing any layer")
826
+
827
+ for idx in reversed(range(len(stack_lines))):
828
+ line = stack_lines[idx]
777
829
  tokens = line.split()
778
830
  if not tokens:
779
831
  continue
@@ -809,7 +861,8 @@ def _parse_ltd(ltd_path, air_thickness_um, warnings):
809
861
  if material_name not in materials:
810
862
  warnings.append(f"Dielectric slab material '{material_name}' not found, skipped")
811
863
  continue
812
- thickness_um = float(height_m) * 1e6 if height_m else 0.0
864
+ thickness_um = ((float(height_m) * 1e6 if height_m else 0.0)
865
+ + expand_um.get((idx, 1), 0.0) + expand_um.get((idx, -1), 0.0))
813
866
  zmin = z
814
867
  z += thickness_um
815
868
  slabs.append(DielectricSlab(material_name, thickness_um))
@@ -0,0 +1,73 @@
1
+ Metadata-Version: 2.4
2
+ Name: setupEM
3
+ Version: 0.14.1
4
+ Summary: Python tool for configuration of gds2palace workflow with GUI.
5
+ Author-email: Volker Muehlhaus <volker@muehlhaus.com>
6
+ License-Expression: GPL-3.0-or-later
7
+ Project-URL: Homepage, https://github.com/VolkerMuehlhaus/setupEM
8
+ Project-URL: Repository, https://github.com/VolkerMuehlhaus/setupEM
9
+ Project-URL: Changelog, https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc/CHANGES.md
10
+ Requires-Python: >=3.9
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: gds2palace>=0.9.0
14
+ Requires-Dist: gds_prepare_for_EM>=1.3.0
15
+ Requires-Dist: PySide6
16
+ Requires-Dist: shiboken6
17
+ Requires-Dist: scipy
18
+ Requires-Dist: requests
19
+ Requires-Dist: scikit-rf
20
+ Requires-Dist: matplotlib
21
+ Requires-Dist: numpy
22
+ Requires-Dist: gdspy
23
+ Requires-Dist: meshio
24
+ Requires-Dist: pyvista
25
+ Requires-Dist: pyvistaqt
26
+ Dynamic: license-file
27
+
28
+ # Python GUI for gds2palace
29
+
30
+ ![Intro](https://raw.githubusercontent.com/VolkerMuehlhaus/setupEM/main/doc/png/setupEM_banner.png)
31
+
32
+ ## Install
33
+
34
+ pip install setupEM
35
+
36
+ **Full documentation, installation guide, and usage walkthrough:**
37
+ https://github.com/VolkerMuehlhaus/setupEM
38
+
39
+ ## Recent changes
40
+
41
+ # What's New - October 19, 2026
42
+
43
+ **Stackup Editor, ADS Momentum (*.ltd) import:** metals with an EXPAND thickness operation now make the dielectric next to them thicker, as in ADS, instead of reaching into the dielectric below. Before, a thick EXPAND DOWN metal (e.g. MET1/MET2 in a GaAs stackup) overlapped the layers underneath it, and a via could end up with zero height. Files where long lines are wrapped or END_... markers follow the last entry on the same line now import too; before, they failed with "No usable dielectric slabs".
44
+
45
+ # What's New - October 18, 2026
46
+
47
+ **Touchstone files with different port impedances:** the option line of the combined `.sNp` file now has one Z0 per port, in port order. Before, ports with the same Z0 as port 1 were left out.
48
+
49
+ # What's New - October 17, 2026
50
+
51
+ **Conductor model** replaces **Conductor meshing** on the Mesh and Boundaries tab (Palace only), with a third choice: **Surface impedance** (default, as before), **Solve inside (volume mesh)** and the new **Solve inside + skin layers**, which adds thin layers along the conductor faces for accurate Q and loss at high frequency. Generated model scripts now use `settings['conductor_model']` instead of `settings['filled_metals']`. Older projects and model scripts with `filled_metals` still load. setupEM now requires gds2palace 0.9.0 or later; `pip install --upgrade setupEM` updates it.
52
+
53
+ Full history: [CHANGES.md](https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc/CHANGES.md)
54
+
55
+ ---
56
+
57
+ **Note:** the `setupEM` PyPI package itself requires:
58
+
59
+ - gds2palace>=0.9.0
60
+ - gds_prepare_for_EM>=1.3.0
61
+ - PySide6
62
+ - shiboken6
63
+ - scipy
64
+ - requests
65
+ - scikit-rf
66
+ - matplotlib
67
+ - numpy
68
+ - gdspy
69
+ - meshio
70
+ - pyvista
71
+ - pyvistaqt
72
+
73
+ (Other Python modules mentioned above are only needed to run standalone helper scripts in this repository, not to use the installed package.)
setupem-0.14.0/PKG-INFO DELETED
@@ -1,85 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: setupEM
3
- Version: 0.14.0
4
- Summary: Python tool for configuration of gds2palace workflow with GUI.
5
- Author-email: Volker Muehlhaus <volker@muehlhaus.com>
6
- License-Expression: GPL-3.0-or-later
7
- Project-URL: Homepage, https://github.com/VolkerMuehlhaus/setupEM
8
- Project-URL: Repository, https://github.com/VolkerMuehlhaus/setupEM
9
- Project-URL: Changelog, https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc/CHANGES.md
10
- Requires-Python: >=3.9
11
- Description-Content-Type: text/markdown
12
- License-File: LICENSE
13
- Requires-Dist: gds2palace>=0.9.0
14
- Requires-Dist: gds_prepare_for_EM>=1.3.0
15
- Requires-Dist: PySide6
16
- Requires-Dist: shiboken6
17
- Requires-Dist: scipy
18
- Requires-Dist: requests
19
- Requires-Dist: scikit-rf
20
- Requires-Dist: matplotlib
21
- Requires-Dist: numpy
22
- Requires-Dist: gdspy
23
- Requires-Dist: meshio
24
- Requires-Dist: pyvista
25
- Requires-Dist: pyvistaqt
26
- Dynamic: license-file
27
-
28
- # Python GUI for gds2palace
29
-
30
- ![Intro](https://raw.githubusercontent.com/VolkerMuehlhaus/setupEM/main/doc/png/setupEM_banner.png)
31
-
32
- ## Install
33
-
34
- pip install setupEM
35
-
36
- **Full documentation, installation guide, and usage walkthrough:**
37
- https://github.com/VolkerMuehlhaus/setupEM
38
-
39
- ## Recent changes
40
-
41
- # What's New - October 17, 2026
42
-
43
- **Conductor model** replaces **Conductor meshing** on the Mesh and Boundaries tab (Palace only), with a third choice: **Surface impedance** (default, as before), **Solve inside (volume mesh)** and the new **Solve inside + skin layers**, which adds thin layers along the conductor faces for accurate Q and loss at high frequency. Generated model scripts now use `settings['conductor_model']` instead of `settings['filled_metals']`. Older projects and model scripts with `filled_metals` still load. setupEM now requires gds2palace 0.9.0 or later; `pip install --upgrade setupEM` updates it.
44
-
45
- # What's New - October 16, 2026
46
-
47
- **Boundary conditions per side:** **Advanced...** next to **Boundary conditions** on the Mesh and Boundaries tab opens a table with the six sides of the simulation box. Each side can have its own boundary condition (**Absorbing**, **PEC** or **PMC**) and air layer thickness; a blank entry uses the value from the tab. For example, **PEC** at zmin with 0 µm air models a backside ground plane at the box boundary. This replaces the "same on all sides / different per side" choice for the air layer, which now lives in the same table.
48
-
49
- Loading a model with different boundary conditions per side no longer changes it to one condition for all sides: before, a single **PEC** side turned all six sides into PEC.
50
-
51
- **Stackup Editor:** while the stackup has errors, the cross-section preview can't be redrawn and keeps the last valid drawing. It is now marked as not up to date: dimmed, crossed by a thin red line, with a banner above it. **Show errors** in the banner opens the editor's XML Preview tab, which lists the errors. The status line now points there too, instead of to Save.
52
-
53
- # What's New - October 12, 2026
54
-
55
- **3D Field Viewer: value markers.** Check **Probe** in the View box (or press **P**), then click the model to place a numbered marker with the field value at that exact point. Clicking works from any angle, on the full model, the clipped solid, its cut face or the **2D plane only** section; dragging still rotates. Markers are drawn on top of the model, so a marker on a buried body stays visible. A **Markers** list opens beside the view with the marker number, value and x / y / z in µm, plus **Remove**, **Clear** and **Copy** (tab-separated, for spreadsheets). For Elmer thermal temperatures, a dropdown switches the list and labels between **K**, **°C** and **ΔT** (rise above the lowest temperature in the model, in K). Right-click the model for **Jump to Maximum in Cut Plane** (with the clip plane on), **Jump to Maximum on Surface of Body N** (the outer surface of the body you clicked, e.g. the chip; results without body IDs use the whole shown surface), **Add Marker Here**, **Remove Marker N** and **Clear Markers**. Markers are updated when you change the field, result file or cycle; markers outside the new model are removed. Ported from EMStudio's field viewer.
56
-
57
- **3D Field Viewer: keys.** With the 3D view focused: **R / F / Home** reset camera, **I** isometric, **X / Y / Z** axis views (**Shift**: negative side), **+ / −** zoom, arrow keys pan, **O** parallel projection, **M** find max., **A** arrows on/off, **P** probe, **PgUp / PgDn** move the clip plane. VTK's own letter keys (e.g. **w** wireframe, **3** stereo, **q** / **e** which stopped the interactor) no longer do anything. The right-click menu now opens only on a click: a right-drag zooms without the menu popping up afterwards.
58
-
59
- **3D Field Viewer:** the **Cycle** picker of a Palace field dump showed Palace's extra AMR error-indicator cycle as a frequency, e.g. "999 GHz (cycle 2)". It is now listed as "error indicator (cycle 2)". This happened when that cycle stores its Indicator/Rank values as point data. Dumps that store them as cell data were already listed as "geometry".
60
-
61
- **3D Field Viewer:** running `field_viewer.py` / `fieldViewer` standalone with a window failed in Python environments that also have PyQt5 installed. Fixed.
62
-
63
- **Port de-embedding in `scripts/combine_extend_snp.py` fixed** (the `_deembedded.sNp` and `_dc_deembedded.sNp` files): the negative inductance of all ports was put in series at port 1, and the other ports were not de-embedded. For a 3-port, port 1 got the sum of all three values. Now each port gets the value for its own port number; a port without geometry data in `port_information.json` is not de-embedded. The raw `.sNp` and the `_dc.sNp` files were not affected. Please run `combine_snp` again to create the de-embedded files again. The same bug was fixed in gds2palace, where Gianluca Simone and David Lurz (FAU) found it.
64
-
65
- Full history: [CHANGES.md](https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc/CHANGES.md)
66
-
67
- ---
68
-
69
- **Note:** the `setupEM` PyPI package itself requires:
70
-
71
- - gds2palace>=0.9.0
72
- - gds_prepare_for_EM>=1.3.0
73
- - PySide6
74
- - shiboken6
75
- - scipy
76
- - requests
77
- - scikit-rf
78
- - matplotlib
79
- - numpy
80
- - gdspy
81
- - meshio
82
- - pyvista
83
- - pyvistaqt
84
-
85
- (Other Python modules mentioned above are only needed to run standalone helper scripts in this repository, not to use the installed package.)
@@ -1,58 +0,0 @@
1
- # Python GUI for gds2palace
2
-
3
- ![Intro](https://raw.githubusercontent.com/VolkerMuehlhaus/setupEM/main/doc/png/setupEM_banner.png)
4
-
5
- ## Install
6
-
7
- pip install setupEM
8
-
9
- **Full documentation, installation guide, and usage walkthrough:**
10
- https://github.com/VolkerMuehlhaus/setupEM
11
-
12
- ## Recent changes
13
-
14
- # What's New - October 17, 2026
15
-
16
- **Conductor model** replaces **Conductor meshing** on the Mesh and Boundaries tab (Palace only), with a third choice: **Surface impedance** (default, as before), **Solve inside (volume mesh)** and the new **Solve inside + skin layers**, which adds thin layers along the conductor faces for accurate Q and loss at high frequency. Generated model scripts now use `settings['conductor_model']` instead of `settings['filled_metals']`. Older projects and model scripts with `filled_metals` still load. setupEM now requires gds2palace 0.9.0 or later; `pip install --upgrade setupEM` updates it.
17
-
18
- # What's New - October 16, 2026
19
-
20
- **Boundary conditions per side:** **Advanced...** next to **Boundary conditions** on the Mesh and Boundaries tab opens a table with the six sides of the simulation box. Each side can have its own boundary condition (**Absorbing**, **PEC** or **PMC**) and air layer thickness; a blank entry uses the value from the tab. For example, **PEC** at zmin with 0 µm air models a backside ground plane at the box boundary. This replaces the "same on all sides / different per side" choice for the air layer, which now lives in the same table.
21
-
22
- Loading a model with different boundary conditions per side no longer changes it to one condition for all sides: before, a single **PEC** side turned all six sides into PEC.
23
-
24
- **Stackup Editor:** while the stackup has errors, the cross-section preview can't be redrawn and keeps the last valid drawing. It is now marked as not up to date: dimmed, crossed by a thin red line, with a banner above it. **Show errors** in the banner opens the editor's XML Preview tab, which lists the errors. The status line now points there too, instead of to Save.
25
-
26
- # What's New - October 12, 2026
27
-
28
- **3D Field Viewer: value markers.** Check **Probe** in the View box (or press **P**), then click the model to place a numbered marker with the field value at that exact point. Clicking works from any angle, on the full model, the clipped solid, its cut face or the **2D plane only** section; dragging still rotates. Markers are drawn on top of the model, so a marker on a buried body stays visible. A **Markers** list opens beside the view with the marker number, value and x / y / z in µm, plus **Remove**, **Clear** and **Copy** (tab-separated, for spreadsheets). For Elmer thermal temperatures, a dropdown switches the list and labels between **K**, **°C** and **ΔT** (rise above the lowest temperature in the model, in K). Right-click the model for **Jump to Maximum in Cut Plane** (with the clip plane on), **Jump to Maximum on Surface of Body N** (the outer surface of the body you clicked, e.g. the chip; results without body IDs use the whole shown surface), **Add Marker Here**, **Remove Marker N** and **Clear Markers**. Markers are updated when you change the field, result file or cycle; markers outside the new model are removed. Ported from EMStudio's field viewer.
29
-
30
- **3D Field Viewer: keys.** With the 3D view focused: **R / F / Home** reset camera, **I** isometric, **X / Y / Z** axis views (**Shift**: negative side), **+ / −** zoom, arrow keys pan, **O** parallel projection, **M** find max., **A** arrows on/off, **P** probe, **PgUp / PgDn** move the clip plane. VTK's own letter keys (e.g. **w** wireframe, **3** stereo, **q** / **e** which stopped the interactor) no longer do anything. The right-click menu now opens only on a click: a right-drag zooms without the menu popping up afterwards.
31
-
32
- **3D Field Viewer:** the **Cycle** picker of a Palace field dump showed Palace's extra AMR error-indicator cycle as a frequency, e.g. "999 GHz (cycle 2)". It is now listed as "error indicator (cycle 2)". This happened when that cycle stores its Indicator/Rank values as point data. Dumps that store them as cell data were already listed as "geometry".
33
-
34
- **3D Field Viewer:** running `field_viewer.py` / `fieldViewer` standalone with a window failed in Python environments that also have PyQt5 installed. Fixed.
35
-
36
- **Port de-embedding in `scripts/combine_extend_snp.py` fixed** (the `_deembedded.sNp` and `_dc_deembedded.sNp` files): the negative inductance of all ports was put in series at port 1, and the other ports were not de-embedded. For a 3-port, port 1 got the sum of all three values. Now each port gets the value for its own port number; a port without geometry data in `port_information.json` is not de-embedded. The raw `.sNp` and the `_dc.sNp` files were not affected. Please run `combine_snp` again to create the de-embedded files again. The same bug was fixed in gds2palace, where Gianluca Simone and David Lurz (FAU) found it.
37
-
38
- Full history: [CHANGES.md](https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc/CHANGES.md)
39
-
40
- ---
41
-
42
- **Note:** the `setupEM` PyPI package itself requires:
43
-
44
- - gds2palace>=0.9.0
45
- - gds_prepare_for_EM>=1.3.0
46
- - PySide6
47
- - shiboken6
48
- - scipy
49
- - requests
50
- - scikit-rf
51
- - matplotlib
52
- - numpy
53
- - gdspy
54
- - meshio
55
- - pyvista
56
- - pyvistaqt
57
-
58
- (Other Python modules mentioned above are only needed to run standalone helper scripts in this repository, not to use the installed package.)
@@ -1,85 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: setupEM
3
- Version: 0.14.0
4
- Summary: Python tool for configuration of gds2palace workflow with GUI.
5
- Author-email: Volker Muehlhaus <volker@muehlhaus.com>
6
- License-Expression: GPL-3.0-or-later
7
- Project-URL: Homepage, https://github.com/VolkerMuehlhaus/setupEM
8
- Project-URL: Repository, https://github.com/VolkerMuehlhaus/setupEM
9
- Project-URL: Changelog, https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc/CHANGES.md
10
- Requires-Python: >=3.9
11
- Description-Content-Type: text/markdown
12
- License-File: LICENSE
13
- Requires-Dist: gds2palace>=0.9.0
14
- Requires-Dist: gds_prepare_for_EM>=1.3.0
15
- Requires-Dist: PySide6
16
- Requires-Dist: shiboken6
17
- Requires-Dist: scipy
18
- Requires-Dist: requests
19
- Requires-Dist: scikit-rf
20
- Requires-Dist: matplotlib
21
- Requires-Dist: numpy
22
- Requires-Dist: gdspy
23
- Requires-Dist: meshio
24
- Requires-Dist: pyvista
25
- Requires-Dist: pyvistaqt
26
- Dynamic: license-file
27
-
28
- # Python GUI for gds2palace
29
-
30
- ![Intro](https://raw.githubusercontent.com/VolkerMuehlhaus/setupEM/main/doc/png/setupEM_banner.png)
31
-
32
- ## Install
33
-
34
- pip install setupEM
35
-
36
- **Full documentation, installation guide, and usage walkthrough:**
37
- https://github.com/VolkerMuehlhaus/setupEM
38
-
39
- ## Recent changes
40
-
41
- # What's New - October 17, 2026
42
-
43
- **Conductor model** replaces **Conductor meshing** on the Mesh and Boundaries tab (Palace only), with a third choice: **Surface impedance** (default, as before), **Solve inside (volume mesh)** and the new **Solve inside + skin layers**, which adds thin layers along the conductor faces for accurate Q and loss at high frequency. Generated model scripts now use `settings['conductor_model']` instead of `settings['filled_metals']`. Older projects and model scripts with `filled_metals` still load. setupEM now requires gds2palace 0.9.0 or later; `pip install --upgrade setupEM` updates it.
44
-
45
- # What's New - October 16, 2026
46
-
47
- **Boundary conditions per side:** **Advanced...** next to **Boundary conditions** on the Mesh and Boundaries tab opens a table with the six sides of the simulation box. Each side can have its own boundary condition (**Absorbing**, **PEC** or **PMC**) and air layer thickness; a blank entry uses the value from the tab. For example, **PEC** at zmin with 0 µm air models a backside ground plane at the box boundary. This replaces the "same on all sides / different per side" choice for the air layer, which now lives in the same table.
48
-
49
- Loading a model with different boundary conditions per side no longer changes it to one condition for all sides: before, a single **PEC** side turned all six sides into PEC.
50
-
51
- **Stackup Editor:** while the stackup has errors, the cross-section preview can't be redrawn and keeps the last valid drawing. It is now marked as not up to date: dimmed, crossed by a thin red line, with a banner above it. **Show errors** in the banner opens the editor's XML Preview tab, which lists the errors. The status line now points there too, instead of to Save.
52
-
53
- # What's New - October 12, 2026
54
-
55
- **3D Field Viewer: value markers.** Check **Probe** in the View box (or press **P**), then click the model to place a numbered marker with the field value at that exact point. Clicking works from any angle, on the full model, the clipped solid, its cut face or the **2D plane only** section; dragging still rotates. Markers are drawn on top of the model, so a marker on a buried body stays visible. A **Markers** list opens beside the view with the marker number, value and x / y / z in µm, plus **Remove**, **Clear** and **Copy** (tab-separated, for spreadsheets). For Elmer thermal temperatures, a dropdown switches the list and labels between **K**, **°C** and **ΔT** (rise above the lowest temperature in the model, in K). Right-click the model for **Jump to Maximum in Cut Plane** (with the clip plane on), **Jump to Maximum on Surface of Body N** (the outer surface of the body you clicked, e.g. the chip; results without body IDs use the whole shown surface), **Add Marker Here**, **Remove Marker N** and **Clear Markers**. Markers are updated when you change the field, result file or cycle; markers outside the new model are removed. Ported from EMStudio's field viewer.
56
-
57
- **3D Field Viewer: keys.** With the 3D view focused: **R / F / Home** reset camera, **I** isometric, **X / Y / Z** axis views (**Shift**: negative side), **+ / −** zoom, arrow keys pan, **O** parallel projection, **M** find max., **A** arrows on/off, **P** probe, **PgUp / PgDn** move the clip plane. VTK's own letter keys (e.g. **w** wireframe, **3** stereo, **q** / **e** which stopped the interactor) no longer do anything. The right-click menu now opens only on a click: a right-drag zooms without the menu popping up afterwards.
58
-
59
- **3D Field Viewer:** the **Cycle** picker of a Palace field dump showed Palace's extra AMR error-indicator cycle as a frequency, e.g. "999 GHz (cycle 2)". It is now listed as "error indicator (cycle 2)". This happened when that cycle stores its Indicator/Rank values as point data. Dumps that store them as cell data were already listed as "geometry".
60
-
61
- **3D Field Viewer:** running `field_viewer.py` / `fieldViewer` standalone with a window failed in Python environments that also have PyQt5 installed. Fixed.
62
-
63
- **Port de-embedding in `scripts/combine_extend_snp.py` fixed** (the `_deembedded.sNp` and `_dc_deembedded.sNp` files): the negative inductance of all ports was put in series at port 1, and the other ports were not de-embedded. For a 3-port, port 1 got the sum of all three values. Now each port gets the value for its own port number; a port without geometry data in `port_information.json` is not de-embedded. The raw `.sNp` and the `_dc.sNp` files were not affected. Please run `combine_snp` again to create the de-embedded files again. The same bug was fixed in gds2palace, where Gianluca Simone and David Lurz (FAU) found it.
64
-
65
- Full history: [CHANGES.md](https://github.com/VolkerMuehlhaus/setupEM/blob/main/doc/CHANGES.md)
66
-
67
- ---
68
-
69
- **Note:** the `setupEM` PyPI package itself requires:
70
-
71
- - gds2palace>=0.9.0
72
- - gds_prepare_for_EM>=1.3.0
73
- - PySide6
74
- - shiboken6
75
- - scipy
76
- - requests
77
- - scikit-rf
78
- - matplotlib
79
- - numpy
80
- - gdspy
81
- - meshio
82
- - pyvista
83
- - pyvistaqt
84
-
85
- (Other Python modules mentioned above are only needed to run standalone helper scripts in this repository, not to use the installed package.)
File without changes
File without changes
File without changes
File without changes