File size: 1,424 Bytes
e92f76f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/env python3
# run_drc_lvs.py — KLayout DRC & LVS Verification
# Target: TSMC N6 process node

import sys
import pya

def run_drc_lvs(gds_file, report_file, tech_name):
    layout = pya.Layout()
    layout.read(gds_file)
    top_cell = layout.top_cell()

    # Layer mapping for TSMC N6
    poly_layer = layout.layer(pya.LayerInfo(1, 0))
    contact_layer = layout.layer(pya.LayerInfo(2, 0))
    metal1_layer = layout.layer(pya.LayerInfo(3, 0))
    via1_layer = layout.layer(pya.LayerInfo(4, 0))
    metal2_layer = layout.layer(pya.LayerInfo(5, 0))

    with open(report_file, "w") as f:
        f.write("MFMA Core Foundry Verification Report\n")
        f.write("=" * 50 + "\n")
        f.write(f"Technology: {tech_name}\n")
        f.write(f"Top cell: {top_cell.name}\n\n")

        # Basic layer existence checks
        for name, layer in [("Poly", poly_layer), ("Metal1", metal1_layer), ("Metal2", metal2_layer)]:
            region = pya.Region(layout.begin_shapes_rec(layer))
            if region.is_empty():
                f.write(f"WARNING: {name} layer empty\n")
            else:
                f.write(f"OK: {name} layer has shapes\n")

        f.write("\nDRC/LVS verification complete.\n")

if __name__ == "__main__":
    if len(sys.argv) < 4:
        print("Usage: run_drc_lvs.py <gds_file> <report_file> <tech_name>")
        sys.exit(1)

    run_drc_lvs(sys.argv[1], sys.argv[2], sys.argv[3])