The timing graph: arrival times and slew

Follow how a timing tool walks the netlist once, carrying arrival times and slews pin by pin, and why a path can inherit a slew from a gate input it never passes through.

Lesson
L2.3
Time
25 min
Runs on
OpenROAD
Check
5 questions

A report through the A input of a NAND showed an output slew of 0.0781 ns. A's own arc gives about 0.0344 ns at that load. The slow edge came from the other input, B, driven by an inv_1 that also feeds 32 flops.

Timing pathThe path through the NAND's A inputFlop ffa launches through c1 and c2 (inv_1) into A of g (nand2_1); o (inv_1) drives flop ffc. B of g comes from w (inv_1), which drives 32 flop D pins.

ffa → ffcsetup check, latest arrival5 cells

  • Clock latency
  • Cell delay
  • Setup time
The path through the NAND's A input00.10.20.30.40.50.60.70.80.91time (ns)launch clk ↑capture clk ↑Data arrivesRequired byffa/CLK → ffa/Q (dfxtp_1): 0.3082 ns1 dfxtp_1c1/A → c1/Y (inv_1): 0.0377 ns2c2/A → c2/Y (inv_1): 0.0275 ns3g/A → g/Y (nand2_1): 0.0395 ns4o/A → o/Y (inv_1): 0.0368 ns5setup −0.0885 nsslack +0.4618 ns · metarrival 0.4497required 0.9115The path through the NAND's A input00.20.40.60.81time (ns)launch clk ↑capture clk ↑Data arrivesRequired byffa/CLK → ffa/Q (dfxtp_1): 0.3082 ns1 dfxtp_1c1/A → c1/Y (inv_1): 0.0377 nsc2/A → c2/Y (inv_1): 0.0275 nsg/A → g/Y (nand2_1): 0.0395 ns4o/A → o/Y (inv_1): 0.0368 nssetup −0.0885 nsslack +0.4618 ns · metarrival 0.4497required 0.9115
  1. A arrives fast

    A changes at 0.3735 ns with a 0.0172 ns slew.

  2. A slow output edge

    The report gives g's output a 0.0781 ns slew. A's own table gives 0.0344 ns.

  3. The next cell pays

    o takes 0.0368 ns at that slew. At A's own slew its table gives 0.0266 ns.

Read the path as a table

Launch: clk rise edge at 0.0000 ns, clock latency 0.0000 ns (ideal). Capture: clk rise edge at 1.0000 ns, latency 0.0000 ns, library setup time −0.0885 ns.

Arrival 0.4497 ns, required 0.9115 ns, slack 0.4618 ns (met).

CellArcThroughEdgeDelay (ns)Time (ns)Slew (ns)
1ffa/CLK → ffa/Qdfxtp_1fall0.30820.30820.0249
ffa/Q → c1/Awire qafall0.00000.30820.0249
2c1/A → c1/Yinv_1rise0.03770.34600.0300
c1/Y → c2/Awire na1rise0.00000.34600.0300
3c2/A → c2/Yinv_1fall0.02750.37350.0172
c2/Y → g/Awire na2fall0.00000.37350.0172
4g/A → g/Ynand2_1rise0.03950.41300.0781
g/Y → o/Awire nyrise0.00000.41300.0781
5o/A → o/Yinv_1fall0.03680.44970.0240
o/Y → ffc/Dwire nofall0.00000.44970.0240
The report
Startpoint: ffa (rising edge-triggered flip-flop clocked by clk)
Endpoint: ffc (rising edge-triggered flip-flop clocked by clk)
Path Group: clk
Path Type: max

Fanout       Cap      Slew     Delay      Time   Description
-------------------------------------------------------------------------------------
                    0.1000    0.0000    0.0000   clock clk (rise edge)
                              0.0000    0.0000   clock network delay (ideal)
                    0.1000    0.0000    0.0000 ^ ffa/CLK (sky130_fd_sc_hd__dfxtp_1)
     1    0.0022    0.0249    0.3082    0.3082 v ffa/Q (sky130_fd_sc_hd__dfxtp_1)
                                                 qa (net)
                    0.0249    0.0000    0.3082 v c1/A (sky130_fd_sc_hd__inv_1)
     1    0.0024    0.0300    0.0377    0.3460 ^ c1/Y (sky130_fd_sc_hd__inv_1)
                                                 na1 (net)
                    0.0300    0.0000    0.3460 ^ c2/A (sky130_fd_sc_hd__inv_1)
     1    0.0023    0.0172    0.0275    0.3735 v c2/Y (sky130_fd_sc_hd__inv_1)
                                                 na2 (net)
                    0.0172    0.0000    0.3735 v g/A (sky130_fd_sc_hd__nand2_1)
     1    0.0024    0.0781    0.0395    0.4130 ^ g/Y (sky130_fd_sc_hd__nand2_1)
                                                 ny (net)
                    0.0781    0.0000    0.4130 ^ o/A (sky130_fd_sc_hd__inv_1)
     1    0.0017    0.0240    0.0368    0.4497 v o/Y (sky130_fd_sc_hd__inv_1)
                                                 no (net)
                    0.0240    0.0000    0.4497 v ffc/D (sky130_fd_sc_hd__dfxtp_1)
                                        0.4497   data arrival time

                    0.1000    1.0000    1.0000   clock clk (rise edge)
                              0.0000    1.0000   clock network delay (ideal)
                              0.0000    1.0000   clock reconvergence pessimism
                                        1.0000 ^ ffc/CLK (sky130_fd_sc_hd__dfxtp_1)
                             -0.0885    0.9115   library setup time
                                        0.9115   data required time
-------------------------------------------------------------------------------------
                                        0.9115   data required time
                                       -0.4497   data arrival time
-------------------------------------------------------------------------------------
                                        0.4618   slack (MET)

OpenSTA 3.1.0 on the sky130 tt library, ideal 1 ns clock, no wires; paths through g/A only.

The tool keeps one slew per pin and edge, and uses it for every path through that pin.

Pins are nodes, arcs are edges

A timing tool turns the netlist into a timing graph. Every pin is a node. Every cell arc (L2.1) is an edge, and so is every net, from its driver to each load.

Paths start at startpoints: input ports, and the clock pins of flops, where the clock-to-Q arc leaves. They end at endpoints: flop data pins, where setup and hold are checked, and output ports. A clock pin is never an endpoint of a data path.

The two-flop path as a timing graphNodes are pins; arrows are nets and cell arcs, in the direction a signal travels. Times are setup (latest) arrivals from the run below.
The two-flop path as a timing graphNodes are pins; arrows are nets and cell arcs, in the direction a signal travels. Times are setup (latest) arrivals from the run below. component a (input port) startpoint component ff1/CLK startpoint component b (input port) startpoint component ff1/D endpoint component ff1/Q 0.3082 ns component u1/Y 0.3459 ns component u2/Y 0.3789 ns component ff2/D endpoint netclock to Qnet, inv_1net, nand2_1 Anet, nand2_1 Bnet
  1. Start and end

    Three startpoints (a, b and ff1's clock pin) and two flop endpoints. ff2's clock pin also starts a path, to the output port y, which is not drawn.

  2. One pass forward

    The tool visits each pin once, in order: ff1/Q at 0.3082 ns, u1/Y at 0.3459 ns.

  3. Two arrivals meet

    u2/Y can be reached through A or through B. The latest falling arrival comes through A, at 0.3789 ns. The earliest rising one comes from b, at 0.2350 ns.

  4. The endpoint

    ff2/D inherits both: 0.3789 ns for setup, 0.2350 ns for hold.

Read the diagram as text
  • a (input port): startpoint
  • ff1/CLK: startpoint
  • b (input port): startpoint
  • ff1/D: endpoint
  • ff1/Q: 0.3082 ns
  • u1/Y: 0.3459 ns
  • u2/Y: 0.3789 ns
  • ff2/D: endpoint
  • a (input port) → ff1/D: net
  • ff1/CLK → ff1/Q: clock to Q
  • ff1/Q → u1/Y: net, inv_1
  • u1/Y → u2/Y: net, nand2_1 A
  • b (input port) → u2/Y: net, nand2_1 B
  • u2/Y → ff2/D: net

path2 with a 0.2 ns input delay on a and b and a 0.2 ns output delay on y.

Path kindStarts atEnds atIn this design
input to registerinput portflop data pina to ff1/D, b to ff2/D
register to registerflop clock pinflop data pinff1/CLK to ff2/D
register to outputflop clock pinoutput portff2/CLK to y
input to outputinput portoutput portnone: no port drives logic straight to a port

The four kinds of path. The input and output delays in the SDC give the port paths their launch and capture times.

Latest for setup, earliest for hold

At each pin the tool computes an arrival time: when the signal there changes, counted from the launching clock edge. It keeps one for a rising and one for a falling signal, because every inverting arc swaps the two (L2.1). Where several edges meet, setup analysis keeps the latest arrival and hold analysis the earliest. One forward pass fills every pin.

The tool never lists paths while it does this. A design with many reconverging gates has far more paths than pins, so listing them would be hopeless. A path is recovered afterwards, by tracing back from an endpoint along the edges that set each arrival.

Timing pathSetup at ff2/D: the latest arrival, through AThe trace-back from ff2/D for the max (setup) check.

ff1 → ff2setup check, latest arrival3 cells

  • Clock latency
  • Cell delay
  • Setup time
Setup at ff2/D: the latest arrival, through A00.10.20.30.40.50.60.70.80.91time (ns)launch clk ↑capture clk ↑Data arrivesRequired byff1/CLK → ff1/Q (dfxtp_1): 0.3082 ns1 dfxtp_1u1/A → u1/Y (inv_1): 0.0376 ns2u2/A → u2/Y (nand2_1): 0.0330 ns3setup −0.0882 nsslack +0.5329 ns · metarrival 0.3789required 0.9118Setup at ff2/D: the latest arrival, through A00.20.40.60.81time (ns)launch clk ↑capture clk ↑Data arrivesRequired byff1/CLK → ff1/Q (dfxtp_1): 0.3082 ns1 dfxtp_1u1/A → u1/Y (inv_1): 0.0376 nsu2/A → u2/Y (nand2_1): 0.0330 nssetup −0.0882 nsslack +0.5329 ns · metarrival 0.3789required 0.9118
  1. The later edge

    The latest falling edge at u2/Y comes through A, at 0.3789 ns.

  2. Setup slack

    0.5329 ns at a 1 ns period.

Read the path as a table

Launch: clk rise edge at 0.0000 ns, clock latency 0.0000 ns (ideal). Capture: clk rise edge at 1.0000 ns, latency 0.0000 ns, library setup time −0.0882 ns.

Arrival 0.3789 ns, required 0.9118 ns, slack 0.5329 ns (met).

CellArcThroughEdgeDelay (ns)Time (ns)Slew (ns)
1ff1/CLK → ff1/Qdfxtp_1fall0.30820.30820.0249
ff1/Q → u1/Awire q1fall0.00000.30820.0249
2u1/A → u1/Yinv_1rise0.03760.34590.0299
u1/Y → u2/Awire n1rise0.00000.34590.0299
3u2/A → u2/Ynand2_1fall0.03300.37890.0233
u2/Y → ff2/Dwire n2fall0.00000.37890.0233
The report
Startpoint: ff1 (rising edge-triggered flip-flop clocked by clk)
Endpoint: ff2 (rising edge-triggered flip-flop clocked by clk)
Path Group: clk
Path Type: max

Fanout       Cap      Slew     Delay      Time   Description
-------------------------------------------------------------------------------------
                    0.1000    0.0000    0.0000   clock clk (rise edge)
                              0.0000    0.0000   clock network delay (ideal)
                    0.1000    0.0000    0.0000 ^ ff1/CLK (sky130_fd_sc_hd__dfxtp_1)
     1    0.0022    0.0249    0.3082    0.3082 v ff1/Q (sky130_fd_sc_hd__dfxtp_1)
                                                 q1 (net)
                    0.0249    0.0000    0.3082 v u1/A (sky130_fd_sc_hd__inv_1)
     1    0.0024    0.0299    0.0376    0.3459 ^ u1/Y (sky130_fd_sc_hd__inv_1)
                                                 n1 (net)
                    0.0299    0.0000    0.3459 ^ u2/A (sky130_fd_sc_hd__nand2_1)
     1    0.0017    0.0233    0.0330    0.3789 v u2/Y (sky130_fd_sc_hd__nand2_1)
                                                 n2 (net)
                    0.0233    0.0000    0.3789 v ff2/D (sky130_fd_sc_hd__dfxtp_1)
                                        0.3789   data arrival time

                    0.1000    1.0000    1.0000   clock clk (rise edge)
                              0.0000    1.0000   clock network delay (ideal)
                              0.0000    1.0000   clock reconvergence pessimism
                                        1.0000 ^ ff2/CLK (sky130_fd_sc_hd__dfxtp_1)
                             -0.0882    0.9118   library setup time
                                        0.9118   data required time
-------------------------------------------------------------------------------------
                                        0.9118   data required time
                                       -0.3789   data arrival time
-------------------------------------------------------------------------------------
                                        0.5329   slack (MET)

OpenSTA 3.1.0, ideal clock, path2 with input and output delays.

Timing pathHold at ff2/D: the earliest arrival, from bThe trace-back from the same endpoint for the min (hold) check starts at another startpoint.

b → ff2hold check, earliest arrival1 cell

  • Clock latency
  • Cell delay
  • Input delay
  • Hold time
Hold at ff2/D: the earliest arrival, from b00.050.10.150.2time (ns)launch and capture clk ↑Data arrivesRequired afterinput delay 0.2000 nsinput delay 0.2000u2/B → u2/Y (nand2_1): 0.0350 ns1 nand2_1hold −0.0205 nsslack +0.2555 ns · metarrival 0.2350required −0.0205Hold at ff2/D: the earliest arrival, from b00.050.10.150.2time (ns)launch and capture clk ↑Data arrivesRequired afterinput delay 0.2000 nsinput delay 0.2000u2/B → u2/Y (nand2_1): 0.0350 ns1hold −0.0205 nsslack +0.2555 ns · metarrival 0.2350required −0.0205
  1. Input delay

    b changes 0.2 ns after the clock edge, as the SDC says.

  2. The earlier edge

    Through B, u2/Y changes at 0.2350 ns, before anything from ff1 arrives.

  3. Hold slack

    0.2555 ns.

Read the path as a table

Launch: clk rise edge at 0.0000 ns, clock latency 0.0000 ns (ideal). Capture: clk rise edge at 0.0000 ns, latency 0.0000 ns, library hold time −0.0205 ns.

Arrival 0.2350 ns, required −0.0205 ns, slack 0.2555 ns (met).

CellArcThroughEdgeDelay (ns)Time (ns)Slew (ns)
b → u2/Bwire bfall0.00000.20000.0000
1u2/B → u2/Ynand2_1rise0.03500.23500.0281
u2/Y → ff2/Dwire n2rise0.00000.23500.0281
The report
Startpoint: b (input port clocked by clk)
Endpoint: ff2 (rising edge-triggered flip-flop clocked by clk)
Path Group: clk
Path Type: min

Fanout       Cap      Slew     Delay      Time   Description
-------------------------------------------------------------------------------------
                    0.1000    0.0000    0.0000   clock clk (rise edge)
                              0.0000    0.0000   clock network delay (ideal)
                              0.2000    0.2000 v input external delay
     1    0.0022    0.0000    0.0000    0.2000 v b (in)
                                                 b (net)
                    0.0000    0.0000    0.2000 v u2/B (sky130_fd_sc_hd__nand2_1)
     1    0.0017    0.0281    0.0350    0.2350 ^ u2/Y (sky130_fd_sc_hd__nand2_1)
                                                 n2 (net)
                    0.0281    0.0000    0.2350 ^ ff2/D (sky130_fd_sc_hd__dfxtp_1)
                                        0.2350   data arrival time

                    0.1000    0.0000    0.0000   clock clk (rise edge)
                              0.0000    0.0000   clock network delay (ideal)
                              0.0000    0.0000   clock reconvergence pessimism
                                        0.0000 ^ ff2/CLK (sky130_fd_sc_hd__dfxtp_1)
                             -0.0205   -0.0205   library hold time
                                       -0.0205   data required time
-------------------------------------------------------------------------------------
                                       -0.0205   data required time
                                       -0.2350   data arrival time
-------------------------------------------------------------------------------------
                                        0.2555   slack (MET)

The same run, min path.

So one endpoint can have its setup path and its hold path start in different places.

Slew travels, and merges at a pin

Slew moves with the arrival. Each arc's output slew comes from its table at the input slew and the load (L2.2). When two arcs reach one pin, the tool keeps the worst slew for each edge, separately for setup and for hold. For setup that is the slowest edge, because it delays every later cell. Every path through that pin then uses it.

That is the hook. B's driver, inv_1 with 32 flop loads, changes slowly, so B's arc gives g the slowest output edge. The path through A inherits it, and o after g gets slower. Nothing on the A path changed.

Measured sweepArrival of the A path against the fanout of B's driverSixteen copies of the netlist in one OpenSTA run; only paths through each NAND's A input are reported.
  • B driven by inv_1
  • B driven by inv_4
440 ps442 ps444 ps446 ps448 ps450 ps452 ps454 ps456 ps458 psArrival at ffc/D102030405060Flop loads on B's driver440 ps445 ps450 ps455 ps460 psArrival at ffc/D204060Flop loads on B's driver
  1. Flop loads on B's driver 1B driven by inv_1 = 441.5 ps · B driven by inv_4 = 441.5 ps

    One load: 0.4415 ns with inv_1, 0.4415 ns with inv_4.

  2. Flop loads on B's driver 32B driven by inv_1 = 449.7 ps · B driven by inv_4 = 442.4 ps

    32 loads: 0.4497 against 0.4424 ns. Upsizing a gate off the path saves 7.3 ps on it.

  3. Flop loads on B's driver 64B driven by inv_1 = 456.2 ps · B driven by inv_4 = 445.4 ps

    64 loads: 0.4562 ns with inv_1. The A path never touches B's driver.

Read the plot as a table
Flop loads on B's driverB driven by inv_1B driven by inv_4
1441.5 ps441.5 ps
10443.4 ps441.5 ps
20446.6 ps441.8 ps
30449.2 ps442.3 ps
32449.7 ps442.4 ps
40451.4 ps443.1 ps
50453.5 ps444.1 ps
60455.4 ps445 ps
64456.2 ps445.4 ps

OpenSTA 3.1.0, sky130_fd_sc_hd tt library, ideal 1 ns clock, no wires.

You can check the merge by hand with the tables. o's cell_fall table at the merged slew, 0.0781 ns, and a flop D load gives 0.0368 ns, the report's number. At A's own slew, 0.0344 ns, the same table gives 0.0266 ns. The difference is the price of the merge on this one cell, and it repeats at every later cell whose input slew grew.

Keeping one slew per pin is graph-based analysis. It is safe, because no path is timed with a faster edge than it could see. It is pessimistic, because the A path is charged for B's slow edge even when B is steady. Path-based analysis re-times one path with only the slews along it; the OpenSTA build here has no such mode.

Asked in interviews
  1. How does STA find the worst path without listing every path?

    It propagates arrival times forward through the timing graph once, keeping the latest (setup) or earliest (hold) arrival at each pin. The worst path is traced back from the worst endpoint.

  2. What are the four kinds of timing path?

    Input to register, register to register, register to output and input to output. Startpoints are input ports and flop clock pins; endpoints are flop data pins and output ports.

  3. What is graph-based versus path-based analysis?

    Graph-based analysis keeps one worst slew and arrival per pin for all paths: fast and safe, but pessimistic. Path-based analysis re-times a chosen path with its own slews to remove that pessimism.

  4. Why can a path improve when you upsize a gate that is not on it?

    The gate drives another input of a cell on the path. Its sharper edge lowers the worst slew kept at that cell's output, so the cells after it on the path get faster.

Try it

This is the hook's netlist: 32 sink flops on B's driver w. The request reports only paths through g/A. Run it and find the g/Y line: slew 0.0781 ns, and the path arrives at 0.4497 ns.

Now change w from sky130_fd_sc_hd__inv_1 to sky130_fd_sc_hd__inv_4 and run again. The A path arrives at 0.4424 ns. Then try removing sink flops instead, or raise the slew on en in the SDC.

STAOpenSTA in OpenROAD 26Q2 · sky130hd tt_025C_1v80 Liberty · simulator service
Edit the constraints or the netlist, then run

          
Expected: path 1 arrival 0.4497 ns path 1 arc 7 slew 0.0781 ns

Check yourself

Predict the outputThe two-flop path with b's input delay lowered from 0.2 to 0.1 ns. What worst hold slack (WHS) does OpenSTA report, in ns?
create_clock -name clk -period 1.0 [get_ports clk]
set_clock_transition 0.1 [all_clocks]
set_input_delay 0.2 -clock clk [get_ports a]
set_input_delay 0.1 -clock clk [get_ports b]
set_output_delay 0.2 -clock clk [get_ports y]
ConceptOne of these path descriptions cannot be a timing path in path2. Which one?
ConceptWhy does a timing tool not enumerate every path to find the worst one?
ConceptIn the plot, upsizing B's driver to inv_4 makes the A path 7.3 ps faster at 32 loads. Why?
ConceptTwo arcs reach one pin with output slews of 0.03 and 0.12 ns. Which slews does the tool keep there?

Remember

  • A timing graph has pins as nodes and cell arcs and nets as edges; paths start at input ports and flop clock pins and end at flop data pins and output ports.
  • One forward pass computes rise and fall arrivals at every pin, latest for setup and earliest for hold; paths are traced back afterwards.
  • Slew travels with the arrival, and where arcs meet the tool keeps the worst slew per edge for every path through the pin.
  • Graph-based slew merging is safe and pessimistic: a gate off the path can slow it, and upsizing that gate can speed it up.