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.
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: setupEM
3
- Version: 0.1.22
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.1.16
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.22"
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.1.16",
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")