setupEM 0.1.22__tar.gz → 0.2.0__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.1.22 → setupem-0.2.0}/PKG-INFO +2 -2
- {setupem-0.1.22 → setupem-0.2.0}/pyproject.toml +3 -2
- {setupem-0.1.22 → setupem-0.2.0}/src/setupEM/setupEM.py +41 -2
- setupem-0.2.0/src/setupEM/setupThermal.py +2219 -0
- {setupem-0.1.22 → setupem-0.2.0}/src/setupEM.egg-info/PKG-INFO +2 -2
- {setupem-0.1.22 → setupem-0.2.0}/src/setupEM.egg-info/SOURCES.txt +1 -0
- {setupem-0.1.22 → setupem-0.2.0}/src/setupEM.egg-info/entry_points.txt +1 -0
- {setupem-0.1.22 → setupem-0.2.0}/src/setupEM.egg-info/requires.txt +1 -1
- {setupem-0.1.22 → setupem-0.2.0}/README.md +0 -0
- {setupem-0.1.22 → setupem-0.2.0}/setup.cfg +0 -0
- {setupem-0.1.22 → setupem-0.2.0}/src/setupEM/__init__.py +0 -0
- {setupem-0.1.22 → setupem-0.2.0}/src/setupEM/__main__.py +0 -0
- {setupem-0.1.22 → setupem-0.2.0}/src/setupEM/data/SG13G2_100um.xml +0 -0
- {setupem-0.1.22 → setupem-0.2.0}/src/setupEM/data/SG13G2_200um.xml +0 -0
- {setupem-0.1.22 → setupem-0.2.0}/src/setupEM/data/SG13G2_nosub.xml +0 -0
- {setupem-0.1.22 → setupem-0.2.0}/src/setupEM.egg-info/dependency_links.txt +0 -0
- {setupem-0.1.22 → setupem-0.2.0}/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
|
+
Version: 0.2.0
|
|
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.
|
|
8
|
+
Requires-Dist: gds2palace>=0.3.2
|
|
9
9
|
Requires-Dist: PySide6
|
|
10
10
|
Requires-Dist: scipy
|
|
11
11
|
Requires-Dist: requests
|
|
@@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "setupEM"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.2.0"
|
|
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.
|
|
14
|
+
"gds2palace>=0.3.2",
|
|
15
15
|
"PySide6",
|
|
16
16
|
"scipy",
|
|
17
17
|
"requests",
|
|
@@ -22,6 +22,7 @@ requires-python = ">=3.9"
|
|
|
22
22
|
|
|
23
23
|
[project.scripts]
|
|
24
24
|
setupEM = "setupEM.setupEM:main"
|
|
25
|
+
setupThermal = "setupEM.setupThermal:main"
|
|
25
26
|
|
|
26
27
|
[tool.setuptools.package-data]
|
|
27
28
|
"setupEM" = ["data/*.xml"]
|
|
@@ -21,6 +21,7 @@ import sys, json, os, pathlib, ast, webbrowser, argparse
|
|
|
21
21
|
import numpy as np
|
|
22
22
|
import importlib.metadata
|
|
23
23
|
import requests
|
|
24
|
+
import gdspy
|
|
24
25
|
from scipy.interpolate import interp1d
|
|
25
26
|
from PySide6.QtWidgets import (
|
|
26
27
|
QApplication, QMainWindow, QWidget, QHBoxLayout, QVBoxLayout,
|
|
@@ -199,6 +200,8 @@ class FileInputTab(QWidget):
|
|
|
199
200
|
self.main_layout.setAlignment(Qt.AlignTop)
|
|
200
201
|
|
|
201
202
|
# ---------- GDSII FILE GROUP ----------
|
|
203
|
+
left_label_width = 200
|
|
204
|
+
|
|
202
205
|
self.gds_group = QGroupBox("GDSII Layout File")
|
|
203
206
|
self.gds_layout = QVBoxLayout()
|
|
204
207
|
|
|
@@ -217,8 +220,23 @@ class FileInputTab(QWidget):
|
|
|
217
220
|
self.gds_layout.addLayout(self.gds_file_layout)
|
|
218
221
|
|
|
219
222
|
|
|
223
|
+
self.cellname_layout = QHBoxLayout()
|
|
224
|
+
label = QLabel("Cellname (leave empty for default)")
|
|
225
|
+
label.setFixedWidth(left_label_width)
|
|
226
|
+
self.cellname_layout.addWidget(label)
|
|
227
|
+
label.setFixedWidth(left_label_width)
|
|
228
|
+
self.cellname_box = QComboBox()
|
|
229
|
+
self.cellname_box.setFixedWidth(250)
|
|
230
|
+
self.cellname_box.setStyleSheet(COMBO_STYLE_OPTIONAL)
|
|
231
|
+
self.cellname_box.addItems([""])
|
|
232
|
+
self.cellname_layout.addWidget(self.cellname_box)
|
|
233
|
+
self.cellname_layout.addStretch()
|
|
234
|
+
self.gds_layout.addLayout(self.cellname_layout)
|
|
235
|
+
|
|
236
|
+
|
|
220
237
|
self.purpose_layout = QHBoxLayout()
|
|
221
238
|
self.purpose_label1 = QLabel("Read this datatype (purpose): ")
|
|
239
|
+
self.purpose_label1.setFixedWidth(left_label_width)
|
|
222
240
|
self.purpose_edit = QLineEdit("0")
|
|
223
241
|
self.purpose_edit.setStyleSheet(EDIT_STYLE_OPTIONAL)
|
|
224
242
|
self.purpose_edit.setFixedWidth(70)
|
|
@@ -230,9 +248,9 @@ class FileInputTab(QWidget):
|
|
|
230
248
|
self.gds_layout.addLayout(self.purpose_layout)
|
|
231
249
|
|
|
232
250
|
|
|
233
|
-
|
|
234
251
|
self.viamerge_layout = QHBoxLayout()
|
|
235
252
|
self.viamerge_label1 = QLabel("Merge via arrays with spacing ")
|
|
253
|
+
self.viamerge_label1.setFixedWidth(left_label_width)
|
|
236
254
|
self.viamerge_edit = QLineEdit("0")
|
|
237
255
|
self.viamerge_edit.setStyleSheet(EDIT_STYLE_OPTIONAL)
|
|
238
256
|
self.viamerge_edit.setFixedWidth(70)
|
|
@@ -301,7 +319,19 @@ class FileInputTab(QWidget):
|
|
|
301
319
|
filename, _ = QFileDialog.getOpenFileName(self, "Select GDSII File",previous_directory,"*.gds;;*.*")
|
|
302
320
|
if filename:
|
|
303
321
|
self.set_gds_file(filename)
|
|
322
|
+
self.update_cellnames_from_gds(filename)
|
|
323
|
+
|
|
304
324
|
|
|
325
|
+
def update_cellnames_from_gds(self, filename):
|
|
326
|
+
if filename:
|
|
327
|
+
# get top level cellnames now
|
|
328
|
+
lib = gdspy.GdsLibrary()
|
|
329
|
+
lib.read_gds(filename)
|
|
330
|
+
cellnames = list(lib.cells.keys())
|
|
331
|
+
self.cellname_box.clear()
|
|
332
|
+
self.cellname_box.addItem("") # blank for default
|
|
333
|
+
for cellname in cellnames:
|
|
334
|
+
self.cellname_box.addItem(cellname)
|
|
305
335
|
|
|
306
336
|
def set_gds_file(self, filename):
|
|
307
337
|
# clear model name and target dir if they were auto-generated from previous model
|
|
@@ -309,6 +339,7 @@ class FileInputTab(QWidget):
|
|
|
309
339
|
self.gds_file_edit.setText(filename)
|
|
310
340
|
saved_values ["GdsFile"] = filename.replace('\\','/')
|
|
311
341
|
# file is read when leaving the files tab
|
|
342
|
+
self.update_cellnames_from_gds(filename)
|
|
312
343
|
|
|
313
344
|
def browse_XML_file(self):
|
|
314
345
|
# start browsing from previous file location, if valid
|
|
@@ -338,6 +369,8 @@ class FileInputTab(QWidget):
|
|
|
338
369
|
self.gds_file_edit.setText(get_saved_value("GdsFile","Please choose a file ===>"))
|
|
339
370
|
XML = get_saved_value("SubstrateFile","Please choose a file ===>")
|
|
340
371
|
self.XML_file_edit.setText(XML)
|
|
372
|
+
self.cellname_box.clear()
|
|
373
|
+
self.cellname_box.addItem(get_saved_value("cellname",""))
|
|
341
374
|
self.viamerge_edit.setText(str(get_saved_value("merge_polygon_size","0.5")))
|
|
342
375
|
self.preprocess_gds_checkbox.setChecked(bool(get_saved_value("preprocess_gds",True)))
|
|
343
376
|
|
|
@@ -353,7 +386,8 @@ class FileInputTab(QWidget):
|
|
|
353
386
|
saved_values ["GdsFile"] = self.gds_file_edit.text().replace('\\','/')
|
|
354
387
|
saved_values ["SubstrateFile"] = self.XML_file_edit.text().replace('\\','/')
|
|
355
388
|
saved_values ["preprocess_gds"] = self.preprocess_gds_checkbox.isChecked()
|
|
356
|
-
|
|
389
|
+
saved_values ["cellname"] = self.cellname_box.currentText()
|
|
390
|
+
|
|
357
391
|
try:
|
|
358
392
|
merge_polygon_size = float(self.viamerge_edit.text())
|
|
359
393
|
except Exception:
|
|
@@ -1794,6 +1828,7 @@ class ModelEditorTab(QWidget):
|
|
|
1794
1828
|
add_text("\n# read geometries from GDSII")
|
|
1795
1829
|
add_text("allpolygons = gds_reader.read_gds(settings['GdsFile'], "
|
|
1796
1830
|
"\n\tlayernumbers,"
|
|
1831
|
+
"\n\tcellname=settings['cellname'], "
|
|
1797
1832
|
"\n\tpurposelist=settings['purpose'], "
|
|
1798
1833
|
"\n\tmetals_list=metals_list, \n\tpreprocess=settings['preprocess_gds'], "
|
|
1799
1834
|
"\n\tmerge_polygon_size=settings['merge_polygon_size'],"
|
|
@@ -1831,6 +1866,8 @@ class ModelEditorTab(QWidget):
|
|
|
1831
1866
|
add_text("if start_simulation:")
|
|
1832
1867
|
add_text(" try:")
|
|
1833
1868
|
add_text(" os.chdir(sim_path)")
|
|
1869
|
+
add_text(" if sys.platform.startswith('linux'):")
|
|
1870
|
+
add_text(" os.chmod('run_sim', 0o755)")
|
|
1834
1871
|
add_text(" subprocess.run(run_command, shell=True)")
|
|
1835
1872
|
add_text(" except:")
|
|
1836
1873
|
add_text(" print(f'Unable to run Palace using command ',run_command)\n")
|
|
@@ -1846,6 +1883,8 @@ class ModelEditorTab(QWidget):
|
|
|
1846
1883
|
add_text("if start_simulation:")
|
|
1847
1884
|
add_text(" try:")
|
|
1848
1885
|
add_text(" os.chdir(sim_path)")
|
|
1886
|
+
add_text(" if sys.platform.startswith('linux'):")
|
|
1887
|
+
add_text(" os.chmod('run_elmer', 0o755)")
|
|
1849
1888
|
add_text(" subprocess.run(run_command, shell=True)")
|
|
1850
1889
|
add_text(" except:")
|
|
1851
1890
|
add_text(" print(f'Unable to run Elmer using command ',run_command)\n")
|