setupEM 0.2.0__tar.gz → 0.2.2__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.2.0 → setupem-0.2.2}/PKG-INFO +1 -1
- {setupem-0.2.0 → setupem-0.2.2}/pyproject.toml +1 -1
- {setupem-0.2.0 → setupem-0.2.2}/src/setupEM/setupEM.py +4 -3
- {setupem-0.2.0 → setupem-0.2.2}/src/setupEM/setupThermal.py +24 -49
- {setupem-0.2.0 → setupem-0.2.2}/src/setupEM.egg-info/PKG-INFO +1 -1
- {setupem-0.2.0 → setupem-0.2.2}/README.md +0 -0
- {setupem-0.2.0 → setupem-0.2.2}/setup.cfg +0 -0
- {setupem-0.2.0 → setupem-0.2.2}/src/setupEM/__init__.py +0 -0
- {setupem-0.2.0 → setupem-0.2.2}/src/setupEM/__main__.py +0 -0
- {setupem-0.2.0 → setupem-0.2.2}/src/setupEM/data/SG13G2_100um.xml +0 -0
- {setupem-0.2.0 → setupem-0.2.2}/src/setupEM/data/SG13G2_200um.xml +0 -0
- {setupem-0.2.0 → setupem-0.2.2}/src/setupEM/data/SG13G2_nosub.xml +0 -0
- {setupem-0.2.0 → setupem-0.2.2}/src/setupEM.egg-info/SOURCES.txt +0 -0
- {setupem-0.2.0 → setupem-0.2.2}/src/setupEM.egg-info/dependency_links.txt +0 -0
- {setupem-0.2.0 → setupem-0.2.2}/src/setupEM.egg-info/entry_points.txt +0 -0
- {setupem-0.2.0 → setupem-0.2.2}/src/setupEM.egg-info/requires.txt +0 -0
- {setupem-0.2.0 → setupem-0.2.2}/src/setupEM.egg-info/top_level.txt +0 -0
|
@@ -200,7 +200,7 @@ class FileInputTab(QWidget):
|
|
|
200
200
|
self.main_layout.setAlignment(Qt.AlignTop)
|
|
201
201
|
|
|
202
202
|
# ---------- GDSII FILE GROUP ----------
|
|
203
|
-
left_label_width =
|
|
203
|
+
left_label_width = 220
|
|
204
204
|
|
|
205
205
|
self.gds_group = QGroupBox("GDSII Layout File")
|
|
206
206
|
self.gds_layout = QVBoxLayout()
|
|
@@ -221,15 +221,16 @@ class FileInputTab(QWidget):
|
|
|
221
221
|
|
|
222
222
|
|
|
223
223
|
self.cellname_layout = QHBoxLayout()
|
|
224
|
-
label = QLabel("Cellname
|
|
224
|
+
label = QLabel("Cellname")
|
|
225
225
|
label.setFixedWidth(left_label_width)
|
|
226
226
|
self.cellname_layout.addWidget(label)
|
|
227
|
-
label.setFixedWidth(left_label_width)
|
|
228
227
|
self.cellname_box = QComboBox()
|
|
229
228
|
self.cellname_box.setFixedWidth(250)
|
|
230
229
|
self.cellname_box.setStyleSheet(COMBO_STYLE_OPTIONAL)
|
|
231
230
|
self.cellname_box.addItems([""])
|
|
232
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)
|
|
233
234
|
self.cellname_layout.addStretch()
|
|
234
235
|
self.gds_layout.addLayout(self.cellname_layout)
|
|
235
236
|
|
|
@@ -199,8 +199,7 @@ class FileInputTab(QWidget):
|
|
|
199
199
|
self.main_layout.setAlignment(Qt.AlignTop)
|
|
200
200
|
|
|
201
201
|
# ---------- GDSII FILE GROUP ----------
|
|
202
|
-
|
|
203
|
-
left_label_width = 200
|
|
202
|
+
left_label_width = 220
|
|
204
203
|
|
|
205
204
|
self.gds_group = QGroupBox("GDSII Layout File")
|
|
206
205
|
self.gds_layout = QVBoxLayout()
|
|
@@ -221,15 +220,16 @@ class FileInputTab(QWidget):
|
|
|
221
220
|
|
|
222
221
|
|
|
223
222
|
self.cellname_layout = QHBoxLayout()
|
|
224
|
-
label = QLabel("Cellname
|
|
223
|
+
label = QLabel("Cellname")
|
|
225
224
|
label.setFixedWidth(left_label_width)
|
|
226
225
|
self.cellname_layout.addWidget(label)
|
|
227
|
-
label.setFixedWidth(left_label_width)
|
|
228
226
|
self.cellname_box = QComboBox()
|
|
229
227
|
self.cellname_box.setFixedWidth(250)
|
|
230
228
|
self.cellname_box.setStyleSheet(COMBO_STYLE_OPTIONAL)
|
|
231
229
|
self.cellname_box.addItems([""])
|
|
232
230
|
self.cellname_layout.addWidget(self.cellname_box)
|
|
231
|
+
self.cellname_label2 = QLabel(" (leave empty for default)")
|
|
232
|
+
self.cellname_layout.addWidget(self.cellname_label2)
|
|
233
233
|
self.cellname_layout.addStretch()
|
|
234
234
|
self.gds_layout.addLayout(self.cellname_layout)
|
|
235
235
|
|
|
@@ -248,7 +248,6 @@ class FileInputTab(QWidget):
|
|
|
248
248
|
self.gds_layout.addLayout(self.purpose_layout)
|
|
249
249
|
|
|
250
250
|
|
|
251
|
-
|
|
252
251
|
self.viamerge_layout = QHBoxLayout()
|
|
253
252
|
self.viamerge_label1 = QLabel("Merge via arrays with spacing ")
|
|
254
253
|
self.viamerge_label1.setFixedWidth(left_label_width)
|
|
@@ -273,7 +272,6 @@ class FileInputTab(QWidget):
|
|
|
273
272
|
|
|
274
273
|
self.gds_group.setLayout(self.gds_layout)
|
|
275
274
|
|
|
276
|
-
|
|
277
275
|
# ---------- XML FILE GROUP ----------
|
|
278
276
|
|
|
279
277
|
self.XML_group = QGroupBox("XML Stackup File")
|
|
@@ -1410,29 +1408,6 @@ class CodeEditor(QPlainTextEdit):
|
|
|
1410
1408
|
|
|
1411
1409
|
# ---------- POP UP WINDOW TO SHOW STACKUP ------------------
|
|
1412
1410
|
|
|
1413
|
-
def epsilon_to_color(erel, transparency):
|
|
1414
|
-
# Compute raw float components
|
|
1415
|
-
red = 250 - 30 * (erel - 1)
|
|
1416
|
-
green = 255 - 20 * (erel - 1) + (20 / erel) + 10 * erel
|
|
1417
|
-
blue = 100 + 15 * erel + (250 / erel)
|
|
1418
|
-
|
|
1419
|
-
# Extra adjustment
|
|
1420
|
-
if 3.8 < erel < 4.5:
|
|
1421
|
-
red += 50 * (erel - 3.8)
|
|
1422
|
-
green -= 100 * (erel - 3.8)
|
|
1423
|
-
|
|
1424
|
-
# Clamp to range 0–255
|
|
1425
|
-
red = min(max(red, 0), 255)
|
|
1426
|
-
green = min(max(green, 0), 255)
|
|
1427
|
-
blue = min(max(blue, 0), 255)
|
|
1428
|
-
|
|
1429
|
-
# Convert to integer RGB
|
|
1430
|
-
r = int(round(red))
|
|
1431
|
-
g = int(round(green))
|
|
1432
|
-
b = int(round(blue))
|
|
1433
|
-
|
|
1434
|
-
return QColor(r, g, b, transparency)
|
|
1435
|
-
|
|
1436
1411
|
|
|
1437
1412
|
class VectorWidget(QWidget):
|
|
1438
1413
|
"""This widget actually draws the stackup preview"""
|
|
@@ -1499,11 +1474,9 @@ class VectorWidget(QWidget):
|
|
|
1499
1474
|
dielectric_shape['dielectric'] = dielectric
|
|
1500
1475
|
dielectric_shape['numparts'] = parts
|
|
1501
1476
|
|
|
1502
|
-
# dielectric color is calculated from permittivity
|
|
1503
1477
|
materialname = dielectric.material
|
|
1504
1478
|
material = self.materials_list.get_by_name(materialname)
|
|
1505
|
-
|
|
1506
|
-
dielectric_shape['color'] = epsilon_to_color(eps, 95) # QColor(Qt.white)
|
|
1479
|
+
dielectric_shape['color'] = QColor(Qt.white)
|
|
1507
1480
|
dielectric_shape['material'] = material
|
|
1508
1481
|
|
|
1509
1482
|
total_parts = total_parts + parts
|
|
@@ -1527,10 +1500,11 @@ class VectorWidget(QWidget):
|
|
|
1527
1500
|
color = dielectric_shape['color']
|
|
1528
1501
|
material = dielectric_shape['material']
|
|
1529
1502
|
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1503
|
+
if material.thermaltablename == "":
|
|
1504
|
+
material_string = f'κ={material.thermalcond:.1f}'
|
|
1505
|
+
else:
|
|
1506
|
+
material_string = "κ=table"
|
|
1507
|
+
|
|
1534
1508
|
|
|
1535
1509
|
painter.setPen(penBlack)
|
|
1536
1510
|
painter.setBrush(color)
|
|
@@ -1589,18 +1563,11 @@ class VectorWidget(QWidget):
|
|
|
1589
1563
|
if metal.is_sheet:
|
|
1590
1564
|
# sheet metal that is simulated with zero extrusion
|
|
1591
1565
|
height = 3
|
|
1592
|
-
|
|
1593
|
-
else:
|
|
1566
|
+
kappa_string = ""
|
|
1567
|
+
else:
|
|
1594
1568
|
# regular extruded metal
|
|
1569
|
+
kappa_string = f'κ={material.thermalcond:.1f}'
|
|
1595
1570
|
height = part_height/2
|
|
1596
|
-
if (material.sigma > 0) and (metal.thickness > 0):
|
|
1597
|
-
Rs = 1 / (material.sigma*metal.thickness*1e-6)
|
|
1598
|
-
if Rs < 1:
|
|
1599
|
-
resistance_string = f'Rs={Rs*1e3:.1f} mΩ'
|
|
1600
|
-
else:
|
|
1601
|
-
resistance_string = f'Rs={Rs:.2f} Ω'
|
|
1602
|
-
else:
|
|
1603
|
-
resistance_string = '? ' + material.type + ' ?'
|
|
1604
1571
|
|
|
1605
1572
|
# the box for this metal
|
|
1606
1573
|
if material.type.upper() == "CONDUCTOR":
|
|
@@ -1614,12 +1581,12 @@ class VectorWidget(QWidget):
|
|
|
1614
1581
|
height = part_height/2
|
|
1615
1582
|
painter.setBrush(QColor(255,0,0, 80))
|
|
1616
1583
|
painter.drawRect(xmetal, flipy(ymetal), wmetal, -int(height))
|
|
1617
|
-
|
|
1584
|
+
kappa_string = 'INVALID MATERIAL REFERENCE: ' + metal.material
|
|
1618
1585
|
|
|
1619
1586
|
painter.setPen(penBlack)
|
|
1620
1587
|
drawText_left(xmetal+10, flipy(ymetal), wmetal, part_height/2, f"{metal.name} ({metal.layernum})" )
|
|
1621
1588
|
painter.setPen(penGray)
|
|
1622
|
-
drawText_right(xmetal, flipy(ymetal), wmetal-10, part_height/2,
|
|
1589
|
+
drawText_right(xmetal, flipy(ymetal), wmetal-10, part_height/2, kappa_string)
|
|
1623
1590
|
# store the drawing position, because vias will refer to that
|
|
1624
1591
|
if not metal.zmin in stored_z:
|
|
1625
1592
|
stored_z = np.append(stored_z, metal.zmin)
|
|
@@ -1687,6 +1654,14 @@ class VectorWidget(QWidget):
|
|
|
1687
1654
|
painter.setBrush(QColor(136,192,200,80))
|
|
1688
1655
|
for metal in self.metals_list.metals:
|
|
1689
1656
|
if metal.is_via or metal.is_dielectric:
|
|
1657
|
+
|
|
1658
|
+
material = self.materials_list.get_by_name(metal.material)
|
|
1659
|
+
if material is not None:
|
|
1660
|
+
# regular extruded metal
|
|
1661
|
+
kappa_string = f'κ={material.thermalcond:.1f}'
|
|
1662
|
+
else:
|
|
1663
|
+
kappa_string = ""
|
|
1664
|
+
|
|
1690
1665
|
y1 = z_to_y(metal.zmin)
|
|
1691
1666
|
y2 = z_to_y(metal.zmax)
|
|
1692
1667
|
h = abs(y2-y1)
|
|
@@ -1703,7 +1678,7 @@ class VectorWidget(QWidget):
|
|
|
1703
1678
|
|
|
1704
1679
|
painter.setPen(penBlack)
|
|
1705
1680
|
painter.drawRect(xvia, flipy(y1), w, -h)
|
|
1706
|
-
painter.drawText(xvia+5, flipy(y1+5), f"{metal.name} ({metal.layernum})")
|
|
1681
|
+
painter.drawText(xvia+5, flipy(y1+5), f"{metal.name} ({metal.layernum}) {kappa_string}")
|
|
1707
1682
|
|
|
1708
1683
|
painter.end()
|
|
1709
1684
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|