if { [get_drc_error_data -quiet esd_pg_via ] != "" } { remove_drc_error_data -force esd_pg_via }
create_drc_error_data -name esd_pg_via -checker_name third_party
create_drc_error_type -name esd -error_data esd_pg_via -error_class basic -brief_info "check esd miss via"
set via_flag 0
echo "" > miss_via.rpt
echo "" > clamp_check_via_summary.rpt
echo "" > clamp_check_density_summary.rpt
foreach_in_coll j_obj [get_cells -hier -filter "ref_name == PESDCORE4LV_08_08_NT_EE_V" ] {
set j_inst_name [get_attr $j_obj full_name ]
set j_inst_boundary [get_attr $j_obj boundary ]
set j_inst_area [get_attr $j_obj area ]
set j_p_name [get_attr [get_nets -of $j_inst_name/VDD ] name ]
set j_g_name [get_attr [get_nets -of $j_inst_name/VSS ] name ]
# REPORT DENSITY
puts ""
puts "###############################################"
puts "#INST:$j_inst_name"
foreach j_layer { C7 K1 K2 G1 G2 } {
set j_area_total 0
foreach j_pg " $j_p_name $j_g_name " {
set j_shapes [get_shapes -quiet -filter "layer_name == $j_layer && net == [get_nets $j_pg]" -intersect $j_inst_boundary ]
set j_shapes [add_to_collection $j_shapes [get_shapes -quiet -filter "layer_name == $j_layer && net == [get_nets $j_pg]" -within $j_inst_boundary ] ]
foreach_in_coll j_s $j_shapes {
set j_s_bbox [get_attr $j_s bbox ]
set j_area [compute_area -objects [compute_polygons -objects1 $j_s_bbox -objects2 $j_inst_boundary -operation AND ] ]
set j_area_total [expr $j_area_total + $j_area ]
}
}
set j_den [format %.2f [expr $j_area_total / $j_inst_area * 100 ] ]
puts "#density_$j_layer: $j_den%"
eval "set den_$j_layer $j_den%"
}
puts "###############################################"
set now [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S"]
echo "[get_attr [current_design ] name] $j_inst_name $den_K1 $den_K2 $den_G1 $den_G2 $now" >> clamp_check_density_summary.rpt
# CHECK VIA
foreach j_pg " $j_p_name $j_g_name " {
foreach {j_layer_b j_cut j_layer_u} { C7 CK K1 K1 U1 K2 K2 KG G1 G1 T1 G2 } {
set j_shapes_b [get_shapes -quiet -filter "layer_name == $j_layer_b && net == [get_nets $j_pg ]" -intersect $j_inst_boundary ]
set j_shapes_b [add_to_collection $j_shapes_b [get_shapes -quiet -filter "layer_name == $j_layer_b && net == [get_nets $j_pg ]" -within $j_inst_boundary ] ]
set j_boundary_b [get_attr $j_shapes_b boundary ]
set j_shapes_u [get_shapes -quiet -filter "layer_name == $j_layer_u && net == [get_nets $j_pg ]" -intersect $j_inst_boundary ]
set j_shapes_u [add_to_collection $j_shapes_u [get_shapes -quiet -filter "layer_name == $j_layer_u && net == [get_nets $j_pg ]" -within $j_inst_boundary ] ]
set j_boundary_u [get_attr $j_shapes_u boundary ]
foreach j_b $j_boundary_b {
foreach j_u $j_boundary_u {
set j_c [compute_polygons -objects1 $j_b -objects2 $j_u -operation AND ]
set j_c_bbox [get_attr -quiet $j_c bbox ]
if { $j_c_bbox == {**INVALID**} } { continue }
if { [get_vias -quiet -filter "cut_layer_names == $j_cut && net == [get_nets $j_pg ]" -within $j_c_bbox ] == "" } {
echo "miss via $j_cut $j_pg $j_c_bbox" >> miss_via.rpt
create_drc_error -error_data esd_pg_via -error_type esd -layers $j_cut -polygons "$j_c_bbox"
set via_flag 1
}
}
}
}
}
puts ""
if {$via_flag == "1"} {
puts "###############################################"
puts "#INST:$j_inst_name"
puts "#MISS VIA PLEASE CHECK miss_via.rpt and open \"esd_pg_via\" in Error Browser"
puts "###############################################"
set now [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S"]
echo "[get_attr [current_design ] name] $j_inst_name CLAMP VIA MISS $now" >> clamp_check_via_summary.rpt
} else {
puts "###############################################"
puts "#INST:$j_inst_name"
puts "check VIA PASS"
puts "###############################################"
}
}
puts ""
puts "###############################################"
puts "#DETAILS IN:"
puts "#[pwd]/miss_via.rpt"
puts "#[pwd]/clamp_check_via_summary.rpt"
puts "#[pwd]/clamp_check_density_summary.rpt"
puts "###############################################"
puts ""
|