Problem
In EDI System, verifyGeometry (verify_drc for 20nm and below) is not reporting DRC violations reported by my third party physical verification tool. After some debug I found that these DRCs are due to mismatches between the LEF and GDS libraries, so EDI does not see the violations, and therefore is not able to fix them. I can fix the violations by running the same set of wire editing commands at each location. How can I identify the location of each violation and execute the given command(s)?
Solution
Below is an example script that can be used to read in the violation markers from the third party tool, identify the location of the specific violations to fix, and execute the commands to fix them. In this example the violations are fixed by trimming back the metal.
## sample script
########################################################################
# This script will clean up DRC violations from Calibre markers
########################################################################
########################################################################
# This script will clean up DRC violations from Calibre markers
########################################################################
#
# Clear DRCs and load in the violation file from Calibre:
#
clearDrc
set drc_marker_file calibre_drc_markers.err
loadViolationReport -type Calibre -filename $drc_marker_file
#
# Set script variables:
#
set datex [exec /bin/date +_%d%b%y_%H%M]
set file [open "verify_connectivity_{datex}.tcl" "w"]
set cnt 0;
#
# Foreach marker retrieve its type and location:
#
foreach marker_id [dbGet -p -e top.markers.userOriginator Calibre] {
set db_userType [dbget $marker_id.userType]
set db_box [dbget $marker_id.box]
#
# Check if marker's type matches one we want to fix:
#
if {[regexp "M4.L.3" $db_userType] \
|| [regexp "M4.L.3.3" $db_userType] \
|| [regexp "M4.L.3.1" $db_userType] \
|| [regexp "M4.L.5" $db_userType] \
|| [regexp "M4.L.3.2" $db_userType]} {
foreach object [dbQuery -area $db_box -objType wire] {
set object_layer [dbget $object.layer.name]
#
# If violation is on specified layer (M4) and of a specific size (0.09) then fix it:
#
if {[regexp M4 $object_layer] && [dbget $object.box_sizey] == 0.09 } {
#
# Execute commands to fix violation:
#
incr cnt
deselectAll
puts "Working on violation $cnt $db_userType $db_box has Y value: [dbget $object.box_sizey]. $object"
puts $file "verifyConnectivity -net [dbget $object.net.name]"
editSelect -area [dbget $object.box] -layer M4
dbSet [dbGet -p top.nets.name $net ].wires.status routed
editTrim -selected
}
}
}
}
close $file
## end
# Clear DRCs and load in the violation file from Calibre:
#
clearDrc
set drc_marker_file calibre_drc_markers.err
loadViolationReport -type Calibre -filename $drc_marker_file
#
# Set script variables:
#
set datex [exec /bin/date +_%d%b%y_%H%M]
set file [open "verify_connectivity_{datex}.tcl" "w"]
set cnt 0;
#
# Foreach marker retrieve its type and location:
#
foreach marker_id [dbGet -p -e top.markers.userOriginator Calibre] {
set db_userType [dbget $marker_id.userType]
set db_box [dbget $marker_id.box]
#
# Check if marker's type matches one we want to fix:
#
if {[regexp "M4.L.3" $db_userType] \
|| [regexp "M4.L.3.3" $db_userType] \
|| [regexp "M4.L.3.1" $db_userType] \
|| [regexp "M4.L.5" $db_userType] \
|| [regexp "M4.L.3.2" $db_userType]} {
foreach object [dbQuery -area $db_box -objType wire] {
set object_layer [dbget $object.layer.name]
#
# If violation is on specified layer (M4) and of a specific size (0.09) then fix it:
#
if {[regexp M4 $object_layer] && [dbget $object.box_sizey] == 0.09 } {
#
# Execute commands to fix violation:
#
incr cnt
deselectAll
puts "Working on violation $cnt $db_userType $db_box has Y value: [dbget $object.box_sizey]. $object"
puts $file "verifyConnectivity -net [dbget $object.net.name]"
editSelect -area [dbget $object.box] -layer M4
dbSet [dbGet -p top.nets.name $net ].wires.status routed
editTrim -selected
}
}
}
}
close $file
## end
No comments:
Post a Comment