parallaxsw / OpenSTA

GNU General Public License v3.0
52 stars 23 forks source link

set_load -subtract_pin_cap with rise/fall caps #125

Closed sheblaev closed 1 week ago

sheblaev commented 1 week ago

Net w drives 1000 BUF_X2/A pin. We set zero load for this net, ignoring pin caps. It makes sense, it is some kind of ideal network, we are going to buffer the net later.

Path reports:


    Cap   Delay    Time   Description
----------------------------------------------------------------
            0.00    0.00 ^ input external delay
 1.78    0.00    0.00 ^ in (in)
                          in (net)
             0.00    0.00 ^ buf/A (BUF_X2)
 94.89    0.13    0.13 ^ buf/Z (BUF_X2)
                          w (net)
             0.00    0.13 ^ buf000/A (BUF_X2)
  0.00    0.03    0.15 ^ buf000/Z (BUF_X2)
                         out[0] (net)
            0.00    0.15 ^ out[0] (out)
                       0.15   data arrival time
----------------------------------------------------------------
(Path is unconstrained)
    Cap   Delay    Time   Description
----------------------------------------------------------------
           0.00    0.00 v input external delay
   1.59    0.00    0.00 v in (in)
                          in (net)
           0.00    0.00 v buf/A (BUF_X2)
 -94.89   -0.08   -0.08 v buf/Z (BUF_X2)
                          w (net)
           0.00   -0.08 v buf000/A (BUF_X2)
   0.00    0.02   -0.07 v buf000/Z (BUF_X2)
                          out[0] (net)
           0.00   -0.07 v out[0] (out)
                  -0.07   data arrival time
----------------------------------------------------------------
(Path is unconstrained)

The rise cap of BUF_X2/A pin is 1.779209 pf, the fall cap is 1.589398 pf. So the total rise pin cap is 1779.209 pf, and the total fall pin cap is 1589.398 pf.

The problem is in function Sdc::setNetWireCap. This function (with subtract_pin_cap == true and cap == 0.0) sets the value wire_cap - (total_rise_pin_cap + total_fall_pin_cap) / 2 = -1.68430417e-12 (that is -1684.3035 pf) to net_wire_capmaps. The reported caps are -1684.3035 + 1779.209 = 94.9055 for rise, and -1684.3035 + 1589.398 = -94.9055 for fall. It approximately corresponds to what we see, and both values are far from 0.

It looks the separate rise/fall values should be stored in net_wire_capmaps.


sheblaev commented 1 week ago

opensta_buffer.zip

parallaxsw commented 1 week ago

fixed in 22acd129 set_load -subtract_pin_cap with rise/fall pin caps