The ECO flow starts from checking the report generated in the route step. A python script is used to check the report, insert buffers, and do the resize. Inside the ECO loop, the python script, cts and route step are called sequentially. The reports are generated each time, and the loop stops until no hold time violations are found. See overview diagram below:
pinname
insert_buffer {pin_name master_name net_name inst_name}
size_cell {inst_name new_master_name}
to adjust the path delay. (sky130_fd_sc_hd__dlygate4sd3_1
is the master with the longest delay, larger number at the end means shorter delay)VIOLATED
. If the path has hold time violations, we save the slack and corresponding startpoint into a vector. The type of the buffer is sky130_fd_sc_hd__dlygate4sd3_1
, so the number of the buffer to be inserted should be the minimum slack divided by FO1 delay. Finally, we dump all the insert_buffer
commands into a tcl file.connect
and disconnect
functions are class static
for reg
cases and regular member methods for pin cases. For reg
cases, we also need to specify which port (input or output) to disconnect the line from.We tested the latest OpenLane with ECO on the LiteX Management Core rc-8 release. All the timing reports are generated by OpenSTA.
For the 1st iteration, the design has 131 hold violations with a -1.48 worst case slack. Our ECO inserts 219 buffers into the block, which greatly reduces the number of violations. After 10 iterations, all the violations are solved and setup time is not influenced during this process. The following table shows the timing results of the ECO flow for each ECO iteration:
If the user would like to enable this step, they would have to set the ECO_ENABLE environment variable to 1 as follows:
set ::env(ECO_ENABLE) {1}
Or they can invoke OpenLane with the option -override_env ECO_ENABLE=1
.