A cell does not have one delay. Its delay depends on how fast its input switches (the input slew or transition) and how much capacitance it drives. Libraries capture this with two-dimensional tables, usually called non-linear delay models. If you can interpolate one by hand you can check a number in a report and understand why upsizing a cell or reducing a load helps.
Delay (ns) | Load 0.010 pF | Load 0.030 pF |
|---|---|---|
Input slew 0.10 ns | 0.10 | 0.14 |
Input slew 0.30 ns | 0.16 | 0.22 |
A query between the grid points is answered by linear interpolation along each axis (bilinear interpolation). For slew 0.20 ns and load 0.020 pF, both fractions are one half, so the result is the average of the four corner values.
slews = [0.10, 0.30]; loads = [0.010, 0.030]
tbl = [[0.10, 0.14],
[0.16, 0.22]] # tbl[slew_index][load_index], ns
def delay(slew, load):
fs = (slew - slews[0]) / (slews[1] - slews[0])
fl = (load - loads[0]) / (loads[1] - loads[0])
top = tbl[0][0] + fl * (tbl[0][1] - tbl[0][0])
bot = tbl[1][0] + fl * (tbl[1][1] - tbl[1][0])
return top + fs * (bot - top)
assert abs(delay(0.20, 0.020) - 0.155) < 1e-9
assert abs(delay(0.10, 0.020) - 0.12) < 1e-9
# a slower input slew costs delay at the same load
assert delay(0.30, 0.020) > delay(0.10, 0.020)
print("PASS: delay(0.20,0.020) =", round(delay(0.20, 0.020), 3), "ns")The first query gives 0.155 ns, the mean of 0.10, 0.14, 0.16 and 0.22. The second (slew at the first grid line, load halfway) gives 0.12 ns. Two effects show up in any table: delay grows with load and also grows with input slew. A parallel table gives the output slew, which becomes the next cell's input slew, so slew degradation compounds along a path.
Extrapolation outside the table range is flagged: results beyond the characterised slew or load are unreliable.
Very large slews on a net are fixed (buffering, sizing) rather than tolerated; they inflate delay and noise sensitivity.
The library corner matches the analysis corner (the delay-maximising library for setup, the delay-minimising library for hold).
Check the input slew arriving at the gate (a degraded transition raises delay) and its output load (long wire or many fanouts). Also confirm the corner: the slow corner has larger table values than the typical one.