update signoff scripts to name the signoff summary report as `signoff.rpt` and:

to report more details for STA in the `signoff.rpt` and consider the STA test passing if the violations are `max_tran` or `max_cap`
This commit is contained in:
Passant 2022-10-17 09:13:12 -07:00
parent e756b57cdc
commit c56dca0847
3 changed files with 222 additions and 177 deletions

View File

@ -19,9 +19,9 @@ if {\
set link_path "* $::env(PT_LIB_ROOT)/scs130hd_ff_1.95v_-40C.lib \
$::env(PT_LIB_ROOT)/scs130hvl_ff_5.5v_-40C.lib \
$::env(PT_LIB_ROOT)/scs130hvl_ff_5.5v_lowhv_5.5v_lv_1.95v_-40C.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_xres4v2_ff_ff_n40C_1v95_5v50.lib.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_fd_io__top_xres4v2_ff_ff_n40C_1v95_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__gpiov2_pad_wrapped_ff_ff_n40C_1v95_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vccd_lvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vdda_hvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssa_hvc_clamped_pad_ff_n40C_1v95_5v50_5v50.lib \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_fd_io/lib/sky130_ef_io__vssd_lvc_clamped3_pad_ff_n40C_1v95_5v50.lib \

View File

@ -56,15 +56,37 @@ def run_sta (
pt_command = f"source /tools/bashrc_snps; pt_shell -f {PT_tcl} -output_log_file {log_dir}/{design}/{design}-{rc_corner}-{proc_corner}-sta.log"
os.system(pt_command)
# Check if there exists any violations
sta_pass=search_viol(f"{output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt")
sta_pass=search_viol(f"{output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-global.rpt")
log = open(f"{log_dir}/{design}/{design}-{rc_corner}-{proc_corner}-sta.log", "a")
if sta_pass == "pass":
print (f"STA run Passed!")
log.write(f"STA run Passed!")
else:
if sta_pass == "max_tran_cap":
print (f"STA run Passed!")
log.write(f"STA run Passed!\n")
print (f"There are max_transition and max_capacitance violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt")
log.write(f"There are max_transition and max_capacitance violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt")
elif sta_pass == "max_tran":
print (f"STA run Passed!")
log.write(f"STA run Passed!\n")
print (f"There are max_transition violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt")
log.write(f"There are max_transition violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt")
elif sta_pass == "max_cap":
print (f"STA run Passed!")
log.write(f"STA run Passed!\n")
print (f"There are max_capacitance violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt")
log.write(f"There are max_capacitance violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt")
else:
print (f"STA run Failed!")
log.write(f"STA run Failed!\n")
if sta_pass == "viol":
if sta_pass == "setup":
print(f"There are setup violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-global.rpt")
log.write(f"There are setup violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-global.rpt")
elif sta_pass == "hold":
print(f"There are hold violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-global.rpt")
log.write(f"There are hold violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-global.rpt")
elif sta_pass == "viol":
print(f"There are violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt")
log.write(f"There are violations. check report: {output_dir}/reports/{rc_corner}/{design}.{proc_corner}{proc_corner}-all_viol.rpt")
elif sta_pass== "no cons":
@ -74,6 +96,7 @@ def run_sta (
print(f"Linking failed. check log: {log_dir}/{design}/{design}-{rc_corner}-{proc_corner}-sta.log")
log.write(f"Linking failed. check log: {log_dir}/{design}/{design}-{rc_corner}-{proc_corner}-sta.log")
log.close()
# Check the required env variables
def check_env_vars():
pdk_root = os.getenv('PDK_ROOT')
@ -113,10 +136,23 @@ def search_viol(
):
with open(report_path, 'r') as report:
data = report.read()
if "(VIOLATED)" in data:
return "viol"
if "Setup violations" in data:
return "setup"
elif "Hold violations" in data:
return "hold"
elif "Could not auto-link design" in data:
return "no link"
report_path = report_path.replace("global", "all_viol")
with open(report_path, 'r') as report:
data = report.read()
if "max_transition" in data:
if "max_capacitance" in data:
return "max_tran_cap"
return "max_tran"
elif "max_capacitance" in data:
return "max_cap"
elif "VIOLATED" in data:
return "viol"
report_path = report_path.replace("all_viol", "min_timing")
with open(report_path, 'r') as report:
data = report.read()

View File

@ -189,7 +189,7 @@ def run_antenna(
def check_errors(
caravel_root, log_dir, signoff_dir, drc, lvs, verification, sta, design, antenna
):
f = open(os.path.join(signoff_dir, f"{design}/standalone_pvr.rpt"), "w")
f = open(os.path.join(signoff_dir, f"{design}/signoff.rpt"), "w")
if drc:
drc_count_klayout = os.path.join(log_dir, f"{design}_klayout_drc.total")
with open(drc_count_klayout) as rep:
@ -249,6 +249,15 @@ def check_errors(
if "Passed" in lines[-1]:
logging.info(f"{log_name} STA: Passed")
f.write(f"{log_name} STA: Passed\n")
elif "max_transition and max_capacitance" in lines[-1]:
logging.info(f"{log_name} STA: Passed (max_tran & max_cap)")
f.write(f"{log_name} STA: Passed (max_tran & max_cap)\n")
elif "max_transition" in lines[-1]:
logging.info(f"{log_name} STA: Passed (max_tran)")
f.write(f"{log_name} STA: Passed (max_tran)\n")
elif "max_capacitance" in lines[-1]:
logging.info(f"{log_name} STA: Passed (max_cap)")
f.write(f"{log_name} STA: Passed (max_cap)\n")
else:
logging.error(lines[-1])
logging.error(f"{log_name} STA: Failed")