| # export TECH_LEF=/home/armleo/Desktop/OpenLane/pdks/sky130A/libs.ref/sky130_fd_sc_hd/techlef/sky130_fd_sc_hd.tlef |
| # export MERGED_LEF=/openlane/designs/def_test/runs/RUN_2022.01.23_17.23.46/tmp/merged.lef |
| # export HOOK_OUTPUT_PATH=/openlane/designs/def_test/runs/RUN_2022.01.23_17.23.46/results/final |
| # export DESIGN_DIR=/openlane/designs/def_test |
| # openroad -python designs/def_test/hooks/post_run.py |
| |
| import odb |
| |
| import os |
| import sys |
| |
| |
| def extract_pins(db, def_file): |
| odb.read_lef(db, os.environ["TECH_LEF"]) |
| odb.read_lef(db, os.environ["MERGED_LEF"]) |
| odb.read_def(db, def_file) |
| chip = db.getChip() |
| block = chip.getBlock() |
| nets = block.getNets() |
| # tech = db.getTech() # Not needed |
| |
| result_data = {} |
| for net in nets: |
| net_name = net.getName() |
| # BTerms = PINS, if it has a pin we need to keep the net |
| bterms = net.getBTerms() |
| if len(bterms) > 0: |
| for port in bterms: |
| if (port.getSigType() == "POWER") or (port.getSigType() == "GROUND"): |
| # Ignore power pins |
| continue |
| name = port.getName() |
| |
| bbox = port.getBBox() |
| result_data[name] = bbox |
| print( |
| "Net:", |
| net_name, |
| "Port:", |
| name, |
| "ll: ", |
| " ".join(str(e) for e in bbox.ll()), |
| "ur: ", |
| " ".join(str(e) for e in bbox.ur()), |
| ) |
| return result_data |
| |
| |
| result_db = odb.dbDatabase.create() |
| ref_db = odb.dbDatabase.create() |
| |
| print("TECH_LEF ", os.environ["TECH_LEF"]) |
| print("MERGED_LEF ", os.environ["MERGED_LEF"]) |
| print("HOOK_OUTPUT_PATH ", os.environ["HOOK_OUTPUT_PATH"]) |
| print("DESIGN_DIR ", os.environ["DESIGN_DIR"]) |
| |
| |
| result_data = extract_pins( |
| result_db, os.environ["HOOK_OUTPUT_PATH"] + "/def/def_test.def" |
| ) |
| |
| # result_data = extract_pins(result_db, os.environ["DESIGN_DIR"] + "/def_test.def") |
| ref_data = extract_pins(ref_db, os.environ["DESIGN_DIR"] + "/def_test.def") |
| |
| # print(result_data) |
| # print(ref_data) |
| |
| for k, v in ref_data.items(): |
| assert ( |
| v.ll() == result_data[k].ll() |
| ), f"For pin {k} lower left rectangle point {result_data[k].ll()} does not match {v.ll()}" |
| assert ( |
| v.ur() == result_data[k].ur() |
| ), f"For pin {k} upper right rectangle point {result_data[k].ur()} does not match {v.ur()}" |
| |
| assert ( |
| result_db.getTech().getManufacturingGrid() |
| == ref_db.getTech().getManufacturingGrid() |
| ) |
| assert ( |
| result_db.getTech().getDbUnitsPerMicron() == ref_db.getTech().getDbUnitsPerMicron() |
| ) |
| assert ( |
| result_db.getChip().getBlock().getDieArea().ur() |
| == ref_db.getChip().getBlock().getDieArea().ur() |
| ) |
| assert ( |
| result_db.getChip().getBlock().getDieArea().ll() |
| == ref_db.getChip().getBlock().getDieArea().ll() |
| ) |
| |
| sys.exit(0) |