pyedb 0.17.0__py3-none-any.whl → 0.18.0__py3-none-any.whl
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.
Potentially problematic release.
This version of pyedb might be problematic. Click here for more details.
- pyedb/__init__.py +1 -1
- pyedb/dotnet/edb.py +90 -27
- {pyedb-0.17.0.dist-info → pyedb-0.18.0.dist-info}/METADATA +1 -1
- {pyedb-0.17.0.dist-info → pyedb-0.18.0.dist-info}/RECORD +6 -6
- {pyedb-0.17.0.dist-info → pyedb-0.18.0.dist-info}/LICENSE +0 -0
- {pyedb-0.17.0.dist-info → pyedb-0.18.0.dist-info}/WHEEL +0 -0
pyedb/__init__.py
CHANGED
pyedb/dotnet/edb.py
CHANGED
|
@@ -1558,6 +1558,7 @@ class Edb(Database):
|
|
|
1558
1558
|
reference_list=[],
|
|
1559
1559
|
include_pingroups=True,
|
|
1560
1560
|
pins_to_preserve=None,
|
|
1561
|
+
inlcude_voids_in_extents=False,
|
|
1561
1562
|
):
|
|
1562
1563
|
if extent_type in [
|
|
1563
1564
|
"Conforming",
|
|
@@ -1574,6 +1575,7 @@ class Edb(Database):
|
|
|
1574
1575
|
smart_cut,
|
|
1575
1576
|
reference_list,
|
|
1576
1577
|
pins_to_preserve,
|
|
1578
|
+
inlcude_voids_in_extents=inlcude_voids_in_extents,
|
|
1577
1579
|
)
|
|
1578
1580
|
else:
|
|
1579
1581
|
_poly = self.layout.expanded_extent(
|
|
@@ -1632,6 +1634,7 @@ class Edb(Database):
|
|
|
1632
1634
|
smart_cutout=False,
|
|
1633
1635
|
reference_list=[],
|
|
1634
1636
|
pins_to_preserve=None,
|
|
1637
|
+
inlcude_voids_in_extents=False,
|
|
1635
1638
|
):
|
|
1636
1639
|
names = []
|
|
1637
1640
|
_polys = []
|
|
@@ -1649,7 +1652,7 @@ class Edb(Database):
|
|
|
1649
1652
|
|
|
1650
1653
|
for prim in self.modeler.primitives:
|
|
1651
1654
|
if prim is not None and prim.net_name in names:
|
|
1652
|
-
_polys.append(prim
|
|
1655
|
+
_polys.append(prim)
|
|
1653
1656
|
if smart_cutout:
|
|
1654
1657
|
objs_data = self._smart_cut(reference_list, expansion_size)
|
|
1655
1658
|
_polys.extend(objs_data)
|
|
@@ -1658,9 +1661,33 @@ class Edb(Database):
|
|
|
1658
1661
|
while k < 10:
|
|
1659
1662
|
unite_polys = []
|
|
1660
1663
|
for i in _polys:
|
|
1661
|
-
|
|
1664
|
+
if "PolygonData" not in str(i):
|
|
1665
|
+
obj_data = i.primitive_object.GetPolygonData().Expand(
|
|
1666
|
+
expansion_size, tolerance, round_corner, round_extension
|
|
1667
|
+
)
|
|
1668
|
+
else:
|
|
1669
|
+
obj_data = i.Expand(expansion_size, tolerance, round_corner, round_extension)
|
|
1662
1670
|
if obj_data:
|
|
1663
|
-
|
|
1671
|
+
if not inlcude_voids_in_extents:
|
|
1672
|
+
unite_polys.extend(list(obj_data))
|
|
1673
|
+
else:
|
|
1674
|
+
voids_poly = []
|
|
1675
|
+
try:
|
|
1676
|
+
if i.HasVoids():
|
|
1677
|
+
area = i.area()
|
|
1678
|
+
for void in i.Voids:
|
|
1679
|
+
void_polydata = void.GetPolygonData()
|
|
1680
|
+
if void_polydata.Area() >= 0.05 * area:
|
|
1681
|
+
voids_poly.append(void_polydata)
|
|
1682
|
+
if voids_poly:
|
|
1683
|
+
obj_data = obj_data[0].Subtract(
|
|
1684
|
+
convert_py_list_to_net_list(list(obj_data)),
|
|
1685
|
+
convert_py_list_to_net_list(voids_poly),
|
|
1686
|
+
)
|
|
1687
|
+
except:
|
|
1688
|
+
pass
|
|
1689
|
+
finally:
|
|
1690
|
+
unite_polys.extend(list(obj_data))
|
|
1664
1691
|
_poly_unite = self.edb_api.geometry.polygon_data.unite(unite_polys)
|
|
1665
1692
|
if len(_poly_unite) == 1:
|
|
1666
1693
|
self.logger.info("Correctly computed Extension at first iteration.")
|
|
@@ -1761,6 +1788,7 @@ class Edb(Database):
|
|
|
1761
1788
|
preserve_components_with_model=False,
|
|
1762
1789
|
simple_pad_check=True,
|
|
1763
1790
|
keep_lines_as_path=False,
|
|
1791
|
+
include_voids_in_extents=False,
|
|
1764
1792
|
):
|
|
1765
1793
|
"""Create a cutout using an approach entirely based on PyAEDT.
|
|
1766
1794
|
This method replaces all legacy cutout methods in PyAEDT.
|
|
@@ -1837,6 +1865,11 @@ class Edb(Database):
|
|
|
1837
1865
|
This feature works only in Electronics Desktop (3D Layout).
|
|
1838
1866
|
If the flag is set to ``True`` it can cause issues in SiWave once the Edb is imported.
|
|
1839
1867
|
Default is ``False`` to generate PolygonData of cut lines.
|
|
1868
|
+
include_voids_in_extents : bool, optional
|
|
1869
|
+
Whether to compute and include voids in pyaedt extent before the cutout. Cutout time can be affected.
|
|
1870
|
+
It works only with Conforming cutout.
|
|
1871
|
+
Default is ``False`` to generate extent without voids.
|
|
1872
|
+
|
|
1840
1873
|
|
|
1841
1874
|
Returns
|
|
1842
1875
|
-------
|
|
@@ -1896,6 +1929,7 @@ class Edb(Database):
|
|
|
1896
1929
|
use_pyaedt_extent_computing=use_pyaedt_extent_computing,
|
|
1897
1930
|
check_terminals=check_terminals,
|
|
1898
1931
|
include_pingroups=include_pingroups,
|
|
1932
|
+
inlcude_voids_in_extents=include_voids_in_extents,
|
|
1899
1933
|
)
|
|
1900
1934
|
else:
|
|
1901
1935
|
legacy_path = self.edbpath
|
|
@@ -1929,6 +1963,7 @@ class Edb(Database):
|
|
|
1929
1963
|
include_partial=include_partial_instances,
|
|
1930
1964
|
simple_pad_check=simple_pad_check,
|
|
1931
1965
|
keep_lines_as_path=keep_lines_as_path,
|
|
1966
|
+
inlcude_voids_in_extents=include_voids_in_extents,
|
|
1932
1967
|
)
|
|
1933
1968
|
if self.are_port_reference_terminals_connected():
|
|
1934
1969
|
if output_aedb_path:
|
|
@@ -1969,6 +2004,7 @@ class Edb(Database):
|
|
|
1969
2004
|
include_partial=include_partial_instances,
|
|
1970
2005
|
simple_pad_check=simple_pad_check,
|
|
1971
2006
|
keep_lines_as_path=keep_lines_as_path,
|
|
2007
|
+
inlcude_voids_in_extents=include_voids_in_extents,
|
|
1972
2008
|
)
|
|
1973
2009
|
if result and not open_cutout_at_end and self.edbpath != legacy_path:
|
|
1974
2010
|
self.save_edb()
|
|
@@ -1990,6 +2026,7 @@ class Edb(Database):
|
|
|
1990
2026
|
remove_single_pin_components=False,
|
|
1991
2027
|
check_terminals=False,
|
|
1992
2028
|
include_pingroups=True,
|
|
2029
|
+
inlcude_voids_in_extents=False,
|
|
1993
2030
|
):
|
|
1994
2031
|
expansion_size = self.edb_value(expansion_size).ToDouble()
|
|
1995
2032
|
|
|
@@ -2010,8 +2047,14 @@ class Edb(Database):
|
|
|
2010
2047
|
smart_cut=check_terminals,
|
|
2011
2048
|
reference_list=reference_list,
|
|
2012
2049
|
include_pingroups=include_pingroups,
|
|
2050
|
+
inlcude_voids_in_extents=inlcude_voids_in_extents,
|
|
2013
2051
|
)
|
|
2014
|
-
|
|
2052
|
+
_poly1 = _poly.CreateFromArcs(_poly.GetArcData(), True)
|
|
2053
|
+
if inlcude_voids_in_extents:
|
|
2054
|
+
for hole in list(_poly.Holes):
|
|
2055
|
+
if hole.Area() >= 0.05 * _poly1.Area():
|
|
2056
|
+
_poly1.AddHole(hole)
|
|
2057
|
+
_poly = _poly1
|
|
2015
2058
|
# Create new cutout cell/design
|
|
2016
2059
|
included_nets_list = signal_list + reference_list
|
|
2017
2060
|
included_nets = convert_py_list_to_net_list(
|
|
@@ -2172,6 +2215,7 @@ class Edb(Database):
|
|
|
2172
2215
|
include_partial=False,
|
|
2173
2216
|
simple_pad_check=True,
|
|
2174
2217
|
keep_lines_as_path=False,
|
|
2218
|
+
inlcude_voids_in_extents=False,
|
|
2175
2219
|
):
|
|
2176
2220
|
if is_ironpython: # pragma: no cover
|
|
2177
2221
|
self.logger.error("Method working only in Cpython")
|
|
@@ -2269,11 +2313,18 @@ class Edb(Database):
|
|
|
2269
2313
|
reference_list=reference_list,
|
|
2270
2314
|
include_pingroups=include_pingroups,
|
|
2271
2315
|
pins_to_preserve=pins_to_preserve,
|
|
2316
|
+
inlcude_voids_in_extents=inlcude_voids_in_extents,
|
|
2272
2317
|
)
|
|
2273
2318
|
if extent_type in ["Conforming", self.edb_api.geometry.extent_type.Conforming, 1]:
|
|
2274
2319
|
if extent_defeature > 0:
|
|
2275
2320
|
_poly = _poly.Defeature(extent_defeature)
|
|
2276
|
-
|
|
2321
|
+
|
|
2322
|
+
_poly1 = _poly.CreateFromArcs(_poly.GetArcData(), True)
|
|
2323
|
+
if inlcude_voids_in_extents:
|
|
2324
|
+
for hole in list(_poly.Holes):
|
|
2325
|
+
if hole.Area() >= 0.05 * _poly1.Area():
|
|
2326
|
+
_poly1.AddHole(hole)
|
|
2327
|
+
_poly = _poly1
|
|
2277
2328
|
if not _poly or _poly.IsNull():
|
|
2278
2329
|
self._logger.error("Failed to create Extent.")
|
|
2279
2330
|
return []
|
|
@@ -2312,29 +2363,39 @@ class Edb(Database):
|
|
|
2312
2363
|
pdata = prim_1.polygon_data.edb_api
|
|
2313
2364
|
int_data = _poly.GetIntersectionType(pdata)
|
|
2314
2365
|
if int_data == 2:
|
|
2315
|
-
|
|
2366
|
+
if not inlcude_voids_in_extents:
|
|
2367
|
+
return
|
|
2368
|
+
skip = False
|
|
2369
|
+
for hole in list(_poly.Holes):
|
|
2370
|
+
if hole.GetIntersectionType(pdata) == 0:
|
|
2371
|
+
prims_to_delete.append(prim_1)
|
|
2372
|
+
return
|
|
2373
|
+
elif hole.GetIntersectionType(pdata) == 1:
|
|
2374
|
+
skip = True
|
|
2375
|
+
if skip:
|
|
2376
|
+
return
|
|
2316
2377
|
elif int_data == 0:
|
|
2317
2378
|
prims_to_delete.append(prim_1)
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2335
|
-
|
|
2379
|
+
return
|
|
2380
|
+
list_poly = intersect(_poly, pdata)
|
|
2381
|
+
if list_poly:
|
|
2382
|
+
net = prim_1.net_name
|
|
2383
|
+
voids = prim_1.voids
|
|
2384
|
+
for p in list_poly:
|
|
2385
|
+
if p.IsNull():
|
|
2386
|
+
continue
|
|
2387
|
+
# points = list(p.Points)
|
|
2388
|
+
list_void = []
|
|
2389
|
+
if voids:
|
|
2390
|
+
voids_data = [void.polygon_data.edb_api for void in voids]
|
|
2391
|
+
list_prims = subtract(p, voids_data)
|
|
2392
|
+
for prim in list_prims:
|
|
2393
|
+
if not prim.IsNull():
|
|
2394
|
+
poly_to_create.append([prim, prim_1.layer.name, net, list_void])
|
|
2395
|
+
else:
|
|
2396
|
+
poly_to_create.append([p, prim_1.layer.name, net, list_void])
|
|
2336
2397
|
|
|
2337
|
-
|
|
2398
|
+
prims_to_delete.append(prim_1)
|
|
2338
2399
|
|
|
2339
2400
|
def pins_clean(pinst):
|
|
2340
2401
|
if not pinst.in_polygon(_poly, include_partial=include_partial, simple_check=simple_pad_check):
|
|
@@ -2350,7 +2411,9 @@ class Edb(Database):
|
|
|
2350
2411
|
for pin in pins_to_delete:
|
|
2351
2412
|
pin.delete()
|
|
2352
2413
|
|
|
2353
|
-
self.logger.info_timer(
|
|
2414
|
+
self.logger.info_timer(
|
|
2415
|
+
"Padstack Instances removal completed. {} instances removed.".format(len(pins_to_delete))
|
|
2416
|
+
)
|
|
2354
2417
|
self.logger.reset_timer()
|
|
2355
2418
|
|
|
2356
2419
|
# with ThreadPoolExecutor(number_of_threads) as pool:
|
|
@@ -2369,7 +2432,7 @@ class Edb(Database):
|
|
|
2369
2432
|
for prim in prims_to_delete:
|
|
2370
2433
|
prim.delete()
|
|
2371
2434
|
|
|
2372
|
-
self.logger.info_timer("Primitives cleanup completed")
|
|
2435
|
+
self.logger.info_timer("Primitives cleanup completed. {} primitives deleted.".format(len(prims_to_delete)))
|
|
2373
2436
|
self.logger.reset_timer()
|
|
2374
2437
|
|
|
2375
2438
|
i = 0
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
pyedb/__init__.py,sha256=
|
|
1
|
+
pyedb/__init__.py,sha256=BSUJbVwFX_rOFP9jdHFQgIGVs2HQjbF06YjEnDyk_48,1521
|
|
2
2
|
pyedb/edb_logger.py,sha256=yNkXnoL2me7ubLT6O6r6ElVnkZ1g8fmfFYC_2XJZ1Sw,14950
|
|
3
3
|
pyedb/exceptions.py,sha256=n94xluzUks6BA24vd_L6HkrvoP_H_l6__hQmqzdCyPo,111
|
|
4
4
|
pyedb/siwave.py,sha256=p-j2AmJ3RPG9IKieDxiVPRhzRlXbjpxENP9GHAgT6l8,13086
|
|
@@ -22,7 +22,7 @@ pyedb/configuration/cfg_stackup.py,sha256=CX7uNN5QRoYW_MOObknP8003YchTS7PH9Oee7F
|
|
|
22
22
|
pyedb/configuration/configuration.py,sha256=YIhmW9rDVvWUH9-gyjhKoohjia2dL-jptUviS0MT83s,11565
|
|
23
23
|
pyedb/dotnet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
24
|
pyedb/dotnet/clr_module.py,sha256=Mo13Of3DVSA5HR-5xZEXOiHApIKy52CUxtJ2gPkEu1A,3406
|
|
25
|
-
pyedb/dotnet/edb.py,sha256=
|
|
25
|
+
pyedb/dotnet/edb.py,sha256=fRS00MYlaMPRJi7YnhNB72odsne-GiOpZ1AnysqKQoc,182382
|
|
26
26
|
pyedb/dotnet/application/Variables.py,sha256=v_fxFJ6xjyyhk4uaMzWAbP-1FhXGuKsVNuyV1huaPME,77867
|
|
27
27
|
pyedb/dotnet/application/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
28
|
pyedb/dotnet/edb_core/__init__.py,sha256=nIRLJ8VZLcMAp12zmGsnZ5x2BEEl7q_Kj_KAOXxVjpQ,52
|
|
@@ -181,7 +181,7 @@ pyedb/misc/siw_feature_config/xtalk_scan/scan_config.py,sha256=YmYI6WTQulL5Uf8Wx
|
|
|
181
181
|
pyedb/misc/siw_feature_config/xtalk_scan/td_xtalk_config.py,sha256=KHa-UqcXuabiVfT2CV-UvWl5Q2qGYHF2Ye9azcAlnXc,3966
|
|
182
182
|
pyedb/modeler/geometry_operators.py,sha256=iXNGfp3oMAxc6Ij_jatawR9NAKksMfnmWTaoHQVGX80,72699
|
|
183
183
|
pyedb/siwave_core/icepak.py,sha256=WnZ-t8mik7LDY06V8hZFV-TxRZJQWK7bu_8Ichx-oBs,5206
|
|
184
|
-
pyedb-0.
|
|
185
|
-
pyedb-0.
|
|
186
|
-
pyedb-0.
|
|
187
|
-
pyedb-0.
|
|
184
|
+
pyedb-0.18.0.dist-info/LICENSE,sha256=qQWivZ12ETN5l3QxvTARY-QI5eoRRlyHdwLlAj0Bg5I,1089
|
|
185
|
+
pyedb-0.18.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
|
186
|
+
pyedb-0.18.0.dist-info/METADATA,sha256=k3nrmKYmQSCRdkJUsyLfawvYXzqg8aaPfrFYoGtPjOw,8336
|
|
187
|
+
pyedb-0.18.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|