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