mirror of
https://github.com/TinyTapeout/tt-support-tools.git
synced 2026-11-03 12:46:08 +01:00
feat(precheck): port the gds/lef pin consistency check to gf180mcuD
This commit is contained in:
+35
-32
@@ -410,41 +410,44 @@ def pin_check(
|
|||||||
|
|
||||||
gds_errors = 0
|
gds_errors = 0
|
||||||
|
|
||||||
if tech != "gf180mcuD":
|
gds_layers = valid_lef_port_layers[tech]
|
||||||
gds_layers = valid_lef_port_layers[tech]
|
gds_layer_lookup = {j: i for i, j in gds_layers.items()}
|
||||||
gds_layer_lookup = {j: i for i, j in gds_layers.items()}
|
polygon_list = {layer: [] for layer in gds_layers}
|
||||||
polygon_list = {layer: [] for layer in gds_layers}
|
for poly in top.polygons:
|
||||||
for poly in top.polygons:
|
poly_layer = (poly.layer, poly.datatype)
|
||||||
poly_layer = (poly.layer, poly.datatype)
|
layer_name = gds_layer_lookup.get(poly_layer, None)
|
||||||
layer_name = gds_layer_lookup.get(poly_layer, None)
|
if layer_name is not None:
|
||||||
if layer_name is not None:
|
polygon_list[layer_name].append(poly)
|
||||||
polygon_list[layer_name].append(poly)
|
merged_layers = {}
|
||||||
merged_layers = {}
|
for layer in gds_layers:
|
||||||
for layer in gds_layers:
|
merged_layers[layer] = gdstk.boolean(polygon_list[layer], [], "or")
|
||||||
merged_layers[layer] = gdstk.boolean(polygon_list[layer], [], "or")
|
|
||||||
|
|
||||||
for current_pin, lef_rects in sorted(lef_ports_orig.items()):
|
for current_pin, lef_rects in sorted(lef_ports_orig.items()):
|
||||||
for layer, lx, by, rx, ty in lef_rects:
|
for layer, lx, by, rx, ty in lef_rects:
|
||||||
if layer + ".pin" not in gds_layers:
|
if tech == "gf180mcuD":
|
||||||
raise PrecheckFailure(
|
pin_layer = f"{layer}_label"
|
||||||
f"Unexpected port layer in LEF: {current_pin} is on layer {layer}"
|
else:
|
||||||
)
|
pin_layer = f"{layer}.pin"
|
||||||
|
if pin_layer not in gds_layers:
|
||||||
|
raise PrecheckFailure(
|
||||||
|
f"Unexpected port layer in LEF: {current_pin} is on layer {layer}"
|
||||||
|
)
|
||||||
|
|
||||||
pin_ok = False
|
pin_ok = False
|
||||||
for poly in merged_layers[layer + ".pin"]:
|
for poly in merged_layers[pin_layer]:
|
||||||
if poly.contain_all(
|
if poly.contain_all(
|
||||||
((lx + 1) / 1000, (by + 1) / 1000),
|
((lx + 1) / 1000, (by + 1) / 1000),
|
||||||
((rx - 1) / 1000, (by + 1) / 1000),
|
((rx - 1) / 1000, (by + 1) / 1000),
|
||||||
((lx + 1) / 1000, (ty - 1) / 1000),
|
((lx + 1) / 1000, (ty - 1) / 1000),
|
||||||
((rx - 1) / 1000, (ty - 1) / 1000),
|
((rx - 1) / 1000, (ty - 1) / 1000),
|
||||||
):
|
):
|
||||||
pin_ok = True
|
pin_ok = True
|
||||||
|
|
||||||
if not pin_ok:
|
if not pin_ok:
|
||||||
logging.error(
|
logging.error(
|
||||||
f"Port {current_pin} missing from layer {layer}.pin in {gds}"
|
f"Port {current_pin} missing from layer {pin_layer} in {gds}"
|
||||||
)
|
)
|
||||||
gds_errors += 1
|
gds_errors += 1
|
||||||
|
|
||||||
if lef_errors > 0 or gds_errors > 0:
|
if lef_errors > 0 or gds_errors > 0:
|
||||||
err_list = []
|
err_list = []
|
||||||
|
|||||||
@@ -163,6 +163,12 @@ valid_lef_port_layers = {
|
|||||||
"Metal5.pin": (67, 2),
|
"Metal5.pin": (67, 2),
|
||||||
"TopMetal1.pin": (126, 2),
|
"TopMetal1.pin": (126, 2),
|
||||||
},
|
},
|
||||||
|
"gf180mcuD": {
|
||||||
|
"Metal1_label": (34, 10),
|
||||||
|
"Metal2_label": (36, 10),
|
||||||
|
"Metal3_label": (42, 10),
|
||||||
|
"Metal4_label": (46, 10),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
forbidden_layers = {
|
forbidden_layers = {
|
||||||
"sky130A": [
|
"sky130A": [
|
||||||
|
|||||||
Reference in New Issue
Block a user