setupEM 0.3.9__tar.gz → 0.3.10__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 (21) hide show
  1. {setupem-0.3.9/src/setupEM.egg-info → setupem-0.3.10}/PKG-INFO +12 -2
  2. setupem-0.3.9/PKG-INFO → setupem-0.3.10/README.md +11 -15
  3. {setupem-0.3.9 → setupem-0.3.10}/pyproject.toml +3 -2
  4. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/momentum_import.py +1 -1
  5. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/setupEM.py +5 -43
  6. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/setupThermal.py +1 -1
  7. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/setup_common.py +326 -10
  8. setupem-0.3.9/src/setupEM/stackup_editor.py → setupem-0.3.10/src/setupEM/stackupEditor.py +912 -86
  9. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/stackup_writer.py +605 -73
  10. setupem-0.3.9/README.md → setupem-0.3.10/src/setupEM.egg-info/PKG-INFO +25 -1
  11. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM.egg-info/SOURCES.txt +1 -1
  12. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM.egg-info/entry_points.txt +1 -0
  13. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM.egg-info/requires.txt +1 -1
  14. {setupem-0.3.9 → setupem-0.3.10}/setup.cfg +0 -0
  15. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/__init__.py +0 -0
  16. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/__main__.py +0 -0
  17. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/data/SG13G2_100um.xml +0 -0
  18. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/data/SG13G2_200um.xml +0 -0
  19. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/data/SG13G2_nosub.xml +0 -0
  20. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM.egg-info/dependency_links.txt +0 -0
  21. {setupem-0.3.9 → setupem-0.3.10}/src/setupEM.egg-info/top_level.txt +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: setupEM
3
- Version: 0.3.9
3
+ Version: 0.3.10
4
4
  Summary: Python tool for configuration of gds2palace workflow with GUI.
5
5
  Author-email: Volker Muehlhaus <volker@muehlhaus.com>
6
6
  Requires-Python: >=3.9
7
7
  Description-Content-Type: text/markdown
8
- Requires-Dist: gds2palace>=0.3.5
8
+ Requires-Dist: gds2palace>=0.3.4
9
9
  Requires-Dist: PySide6
10
10
  Requires-Dist: scipy
11
11
  Requires-Dist: requests
@@ -14,6 +14,16 @@ Requires-Dist: matplotlib
14
14
 
15
15
  # Python GUI for gds2palace
16
16
 
17
+ ## What's New
18
+
19
+ - **setupThermal**, a companion app for Elmer thermal simulation, alongside setupEM
20
+ - A graphical **Stackup XML Editor** (Tools > Edit Stackup XML...), including Variables, Reference-relative positioning, Derived Layers, and Thermal Tables
21
+ - Input Files tab can now **override stackup Variables** (e.g. `total_thickness`) directly, without hand-editing the XML or the generated model
22
+
23
+ See [CHANGES.md](doc/CHANGES.md) for details.
24
+
25
+ ## SetupEM
26
+
17
27
  [gds2palace](https://github.com/VolkerMuehlhaus/gds2palace_ihp_sg13g2) enables an **RFIC FEM simulation** workflow where GDSII layout files are simulated using the [Palace FEM solver by AWS](https://awslabs.github.io/palace/stable/). setupEM provides a Python-based **graphical user interface** to configure and run gds2palace, instead of creating the simulation model code manually, and also start simulation in Palace.
18
28
 
19
29
  When you install setupEM, the gds2palace workflow is automatically installed in the background. This enables **creating a simulation model** for AWS Palace. To actually **run the simulation**, you need to have AWS Palace installed, as described below. Palace installation is **not** done automatically!
@@ -1,19 +1,15 @@
1
- Metadata-Version: 2.4
2
- Name: setupEM
3
- Version: 0.3.9
4
- Summary: Python tool for configuration of gds2palace workflow with GUI.
5
- Author-email: Volker Muehlhaus <volker@muehlhaus.com>
6
- Requires-Python: >=3.9
7
- Description-Content-Type: text/markdown
8
- Requires-Dist: gds2palace>=0.3.5
9
- Requires-Dist: PySide6
10
- Requires-Dist: scipy
11
- Requires-Dist: requests
12
- Requires-Dist: scikit-rf
13
- Requires-Dist: matplotlib
14
-
15
1
  # Python GUI for gds2palace
16
2
 
3
+ ## What's New
4
+
5
+ - **setupThermal**, a companion app for Elmer thermal simulation, alongside setupEM
6
+ - A graphical **Stackup XML Editor** (Tools > Edit Stackup XML...), including Variables, Reference-relative positioning, Derived Layers, and Thermal Tables
7
+ - Input Files tab can now **override stackup Variables** (e.g. `total_thickness`) directly, without hand-editing the XML or the generated model
8
+
9
+ See [CHANGES.md](doc/CHANGES.md) for details.
10
+
11
+ ## SetupEM
12
+
17
13
  [gds2palace](https://github.com/VolkerMuehlhaus/gds2palace_ihp_sg13g2) enables an **RFIC FEM simulation** workflow where GDSII layout files are simulated using the [Palace FEM solver by AWS](https://awslabs.github.io/palace/stable/). setupEM provides a Python-based **graphical user interface** to configure and run gds2palace, instead of creating the simulation model code manually, and also start simulation in Palace.
18
14
 
19
15
  When you install setupEM, the gds2palace workflow is automatically installed in the background. This enables **creating a simulation model** for AWS Palace. To actually **run the simulation**, you need to have AWS Palace installed, as described below. Palace installation is **not** done automatically!
@@ -245,4 +241,4 @@ If you then start KLayout using this script, a new menu item is available: Tools
245
241
  "<Path to KLayout>\klayout_app.exe" -e -rm "<Path to script>\klayout_setupEM.py"
246
242
  ```
247
243
 
248
- 3. Name it e.g. **setupEM via KLayout**
244
+ 3. Name it e.g. **setupEM via KLayout**
@@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "setupEM"
7
- version = "0.3.9"
7
+ version = "0.3.10"
8
8
  description = "Python tool for configuration of gds2palace workflow with GUI."
9
9
  readme = "README.md"
10
10
  authors = [
11
11
  { name = "Volker Muehlhaus", email = "volker@muehlhaus.com" }
12
12
  ]
13
13
  dependencies = [
14
- "gds2palace>=0.3.5",
14
+ "gds2palace>=0.3.4",
15
15
  "PySide6",
16
16
  "scipy",
17
17
  "requests",
@@ -23,6 +23,7 @@ requires-python = ">=3.9"
23
23
  [project.scripts]
24
24
  setupEM = "setupEM.setupEM:main"
25
25
  setupThermal = "setupEM.setupThermal:main"
26
+ stackupEditor = "setupEM.stackupEditor:main"
26
27
 
27
28
  [tool.setuptools.packages.find]
28
29
  where = ["src"]
@@ -29,7 +29,7 @@ from dataclasses import dataclass, field
29
29
 
30
30
  # __package__ is None/"" when this module was loaded outside the setupEM package
31
31
  # (e.g. setupEM.py run directly), so relative import fails - same dual-mode pattern
32
- # used throughout setupEM.py/setup_common.py/stackup_editor.py for sibling imports.
32
+ # used throughout setupEM.py/setup_common.py/stackupEditor.py for sibling imports.
33
33
  if __package__ in (None, ""):
34
34
  import stackup_writer
35
35
  else:
@@ -52,12 +52,14 @@ if __package__ in (None, ""):
52
52
  EDIT_STYLE_OPTIONAL, EDIT_STYLE_REQUIRED, COMBO_STYLE_REQUIRED, COMBO_STYLE_OPTIONAL,
53
53
  FileDropLineEdit, FileInputTab, PythonHighlighter, CodeEditor,
54
54
  VectorWidget, PopUpWindow, CreateModelTabBase, MainWindowBase,
55
+ epsilon_to_color, default_stackup_dielectric_label, default_stackup_metal_label,
55
56
  )
56
57
  else:
57
58
  from .setup_common import (
58
59
  EDIT_STYLE_OPTIONAL, EDIT_STYLE_REQUIRED, COMBO_STYLE_REQUIRED, COMBO_STYLE_OPTIONAL,
59
60
  FileDropLineEdit, FileInputTab, PythonHighlighter, CodeEditor,
60
61
  VectorWidget, PopUpWindow, CreateModelTabBase, MainWindowBase,
62
+ epsilon_to_color, default_stackup_dielectric_label, default_stackup_metal_label,
61
63
  )
62
64
 
63
65
 
@@ -1323,7 +1325,7 @@ class ModelEditorTab(QWidget):
1323
1325
  f"direction='{sim_port.direction}'))")
1324
1326
 
1325
1327
  add_text("\n# ================= read stackup and geometries =================")
1326
- add_text("materials_list, dielectrics_list, metals_list = stackup_reader.read_substrate (settings['SubstrateFile'])")
1328
+ add_text("materials_list, dielectrics_list, metals_list = stackup_reader.read_substrate (settings['SubstrateFile'], variable_overrides=settings['variable_overrides'])")
1327
1329
  add_text("layernumbers = metals_list.getlayernumbers()")
1328
1330
  add_text("layernumbers.extend(simulation_ports.portlayers)")
1329
1331
  add_text("\n# read geometries from GDSII")
@@ -1400,32 +1402,6 @@ class ModelEditorTab(QWidget):
1400
1402
  self.create_model_text(forExport=True) # show "external" code including run from Python model
1401
1403
 
1402
1404
 
1403
- # ---------- STACKUP PREVIEW COLOR/LABEL LOGIC (EM specific) ------------------
1404
-
1405
- def epsilon_to_color(erel, transparency):
1406
- # Compute raw float components
1407
- red = 250 - 30 * (erel - 1)
1408
- green = 255 - 20 * (erel - 1) + (20 / erel) + 10 * erel
1409
- blue = 100 + 15 * erel + (250 / erel)
1410
-
1411
- # Extra adjustment
1412
- if 3.8 < erel < 4.5:
1413
- red += 50 * (erel - 3.8)
1414
- green -= 100 * (erel - 3.8)
1415
-
1416
- # Clamp to range 0–255
1417
- red = min(max(red, 0), 255)
1418
- green = min(max(green, 0), 255)
1419
- blue = min(max(blue, 0), 255)
1420
-
1421
- # Convert to integer RGB
1422
- r = int(round(red))
1423
- g = int(round(green))
1424
- b = int(round(blue))
1425
-
1426
- return QColor(r, g, b, transparency)
1427
-
1428
-
1429
1405
  # ---------- MAIN WINDOW ----------
1430
1406
 
1431
1407
 
@@ -1594,24 +1570,10 @@ class MainWindow(MainWindowBase):
1594
1570
  return epsilon_to_color(material.eps, 95)
1595
1571
 
1596
1572
  def stackup_dielectric_label(self, dielectric, material):
1597
- material_string = f'εr={material.eps:.1f}'
1598
- if material.sigma > 1e-3:
1599
- material_string = material_string + f' σ={material.sigma:.1f}'
1600
- material_string = material_string + f'\n{dielectric.thickness:.2f}µm'
1601
- return material_string
1573
+ return default_stackup_dielectric_label(dielectric, material)
1602
1574
 
1603
1575
  def stackup_metal_label(self, metal, material, is_sheet):
1604
- if is_sheet:
1605
- return f'Rs={material.Rs*1e3:.1f}mΩ'
1606
- else:
1607
- if (material.sigma > 0) and (metal.thickness > 0):
1608
- Rs = 1 / (material.sigma*metal.thickness*1e-6)
1609
- if Rs < 1:
1610
- return f'Rs={Rs*1e3:.1f} mΩ'
1611
- else:
1612
- return f'Rs={Rs:.2f} Ω'
1613
- else:
1614
- return '? ' + material.type + ' ?'
1576
+ return default_stackup_metal_label(metal, material, is_sheet)
1615
1577
 
1616
1578
  def stackup_via_label_suffix(self, metal, material):
1617
1579
  return ""
@@ -767,7 +767,7 @@ class ModelEditorTab(QWidget):
767
767
 
768
768
 
769
769
  add_text("\n# ================= read stackup and geometries =================")
770
- add_text("materials_list, dielectrics_list, metals_list = stackup_reader.read_substrate (settings['SubstrateFile'])")
770
+ add_text("materials_list, dielectrics_list, metals_list = stackup_reader.read_substrate (settings['SubstrateFile'], variable_overrides=settings['variable_overrides'])")
771
771
  add_text("layernumbers = metals_list.getlayernumbers()")
772
772
  add_text("layernumbers.extend(thermal_objects.layers)")
773
773
  add_text("\n# read geometries from GDSII")