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