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.
- {setupem-0.3.9/src/setupEM.egg-info → setupem-0.3.10}/PKG-INFO +12 -2
- setupem-0.3.9/PKG-INFO → setupem-0.3.10/README.md +11 -15
- {setupem-0.3.9 → setupem-0.3.10}/pyproject.toml +3 -2
- {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/momentum_import.py +1 -1
- {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/setupEM.py +5 -43
- {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/setupThermal.py +1 -1
- {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/setup_common.py +326 -10
- setupem-0.3.9/src/setupEM/stackup_editor.py → setupem-0.3.10/src/setupEM/stackupEditor.py +912 -86
- {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/stackup_writer.py +605 -73
- setupem-0.3.9/README.md → setupem-0.3.10/src/setupEM.egg-info/PKG-INFO +25 -1
- {setupem-0.3.9 → setupem-0.3.10}/src/setupEM.egg-info/SOURCES.txt +1 -1
- {setupem-0.3.9 → setupem-0.3.10}/src/setupEM.egg-info/entry_points.txt +1 -0
- {setupem-0.3.9 → setupem-0.3.10}/src/setupEM.egg-info/requires.txt +1 -1
- {setupem-0.3.9 → setupem-0.3.10}/setup.cfg +0 -0
- {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/__init__.py +0 -0
- {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/__main__.py +0 -0
- {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/data/SG13G2_100um.xml +0 -0
- {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/data/SG13G2_200um.xml +0 -0
- {setupem-0.3.9 → setupem-0.3.10}/src/setupEM/data/SG13G2_nosub.xml +0 -0
- {setupem-0.3.9 → setupem-0.3.10}/src/setupEM.egg-info/dependency_links.txt +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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/
|
|
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
|
-
|
|
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
|
-
|
|
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")
|