ECOAppendix
ECOAppendix
41
Figure A.3 Report Timing Setup after Synthesis
42
Figure A.5 Report Power after Synthesis
43
Figure A.7 Report Design Rules after PnR
44
Figure A.9 Report Timing Hold after PnR
45
Figure A.11 Report Area after PnR
46
Appendix B Generated Report in DRC Convergence Algorithm
47
Figure B.14 Report Timing Hold after Implemented DRC Convergence Algorithm
48
Figure B.16 Report Area after Implemented DRC Convergence Algorithm
49
Appendix C Semi-auto DRC Convergence Algorithm Implementation in TCL
Script Commands
###############################################################
## Notes To Use The Semi-Auto DRC Convergence Tcl Script !!! ##
###############################################################
# ICC2 GUI:
# 1. Invoke: icc2_shell -gui
# 2. Open block after "route_opt"
# 3. Open file Report Constraint that generated
# 4. Identify or choose one of the net violating (DRIVER) pin in the
report constraints list.
# 5. Get all load(s) that connected to the driver using command
below:
# "place the command in icc2_shell"
# -> change_selection [get_pins <PIN>] example <PIN> :
cts_inv_575362629/Y !
# -> CTRL T : to zoom in to look the selected pin at GUI.
# 6. Use GUI to get and store the load(s)
# -> Right click on the Pin Selected in GUI > Select Object >
Nets > Cells
# -> use command : get_selection > <directory> /<name file>
# Eg.: get_selection > cell_violate/cts_inv_575362629
# 7. Rewrite/Rename the Filename and Driver Name in the proc main
based on your violation(s)
# 8. You may need to change certain value in certain proc below which
are
# - proc split rect box : value of WIDTH and HEGIHT
# - proc check_cell : the pin name of the load. Eg: "/A"
or "/D" etc
# 9. Source the file in the ICC II synopsys tool
# Eg.-> source scripts/useful_tcl_proc_fix_logical_drc.tcl
# 10. In Proc main : uncomment "route_opt or source" to direct do
route after done insert buffer !
# 11. Now you can RUN the script:
# use command: main
# Don't forget to uncomment the main if want to run directly the
scripts once you SOURCE the script !
############################
## Call the main function ##
############################
# main ;# uncomment when you want to run directly the scripts
# once you source the semi auto script !
50
####################################################
## Procedure 1: Read file and filter the contents ##
####################################################
return $filtered_list
}
#######################################################
## Procedure 2: Read file and create rectangular box ##
#######################################################
51
#########################################
## Procedure 3: Create Rectangular Box ##
#########################################
proc create_rect_box {driver load} {
# Initialize the values of xlow, ylow, xhigh, and yhigh using the
first cell in the list
set first_cell [lindex $driver 0]
set xlow [lindex [get_attr $first_cell origin] 0]
set ylow [lindex [get_attr $first_cell origin] 1]
set xhigh $xlow
set yhigh $ylow
# Loop over each cell in the input list, including the driver
foreach cell $driver {
set c_x [lindex [get_attr $cell origin] 0]
set c_y [lindex [get_attr $cell origin] 1]
52
}
#################################
## Procedure 4: Split Rect Box ##
#################################
53
#####################################################################
#Procedure 5: Check Cell(s) inside Split Rect Box & Buffer Insertion#
#####################################################################
if {$c_x >= $rect_xlow && $c_x <= $rect_xhigh && $c_y >=
$rect_ylow && $c_y <= $rect_yhigh} {
incr cell_count
puts "$c_x $c_y"
lappend cells_in_box $cell
}
}
if {$cell_count == 0} {
puts "No cell inside the split rectangular box of
low:($rect_xlow, $rect_ylow) high:($rect_xhigh, $rect_yhigh)"
} else {
puts "There are $cell_count cell(s) inside the split
rectangular box of low:($rect_xlow, $rect_ylow) high:($rect_xhigh,
$rect_yhigh)"
foreach c $cells_in_box {
puts "Cell(s) in split box >> $c"
54
set c_x [lindex [get_attr $c origin] 0]
set c_y [lindex [get_attr $c origin] 1]
set_cell_location -coordinate "$c_x $c_y" $new_cell
legalize_placement -cells [list $new_cell]
puts "Added buffer cell to the cell pin:
$object_list"
} else {
puts "No pins found in the cell."
}
}
}
puts "Done!"
}
###################
## Main function ##
###################
proc main {} {
# Violation 1
set filename "cell_violate/cts_inv_575362629" ; # Replace with
the actual path to your text file
set driver "cts_inv_575362629" ; # Define your driver value
# Read and filter the file contents
create_rect_box_from_file $filename $driver
save_block
# Violation 2
set filename "v/c2.6" ; # Replace with the actual path to your
text file
set driver "cts_inv_465773114" ; # Define your driver value
# Read and filter the file contents
create_rect_box_from_file $filename $driver
save_block
############
##Re-route##
############
#1. Choose either one and uncomment it!
#2. Source: make sure you have the file
#since there are direct commands to generate report !
route_opt
#source scripts/route_after_buf.tcl
}
55