Until a design is routed, every wire resistance and capacitance the timer uses is an estimate. After routing, the wires exist, and parasitic extraction computes their resistance and capacitance from the real geometry, including the coupling between neighbouring wires. This article shows how OpenROAD estimates parasitics before routing, how it extracts them afterwards, what the extracted SPEF file contains, and how far the estimates were from the extracted values on the 16x16 multiplier, net by net.

8 min read | Intermediate

What You'll Learn

  • Explain how placement and global-route estimates of parasitics are built
  • Run OpenRCX extraction and read a net in the SPEF file
  • Describe the two sources of estimation error: route shape and RC calibration
  • Explain why the repair steps are only as good as the estimate they see

Three Ways to Get Parasitics

Every timing number in the flow needs the resistance and capacitance of each net. OpenROAD gets them in one of three ways, from rough to exact:

SourceWhenWire length fromResistance and capacitance from
estimate_parasitics -placementAfter placement, during repair and CTSA Steiner tree over the pin positionsPer-micrometre values set with set_wire_rc / set_layer_rc
estimate_parasitics -global_routingAfter global routingThe global routes, on the GCell gridThe same per-layer values, now for the layers the global router chose
extract_parasitics (OpenRCX)After detailed routingThe real routed wires and viasA rules file computed from the process cross-section, with coupling to every neighbour

The estimates need per-micrometre values for each layer. They come from two commands:

set_layer_rc -layer met2 -capacitance 1.36233E-04 -resistance 8.929e-04
set_wire_rc -signal -layer met1

set_layer_rc sets the capacitance in pF/um and the resistance in kohm/um for a layer. set_wire_rc chooses the layer whose values are used where the estimate does not know the layer, as in placement. OpenROAD-flow-scripts ships a full set of these values for sky130 in platforms/sky130hd/setRC.tcl. A comment in the file says they were correlated against extraction on several designs (gcd, ibex, aes, jpeg and others): they are averages tuned so that estimates match extracted results on typical routing.

The lab's flow uses these correlated values. A flow that sets only set_wire_rc -signal -layer met2 and no set_layer_rc takes its values from met2 in the technology LEF instead: about 0.078 fF/um for a minimum-width wire, against 0.136 to 0.172 fF/um in the correlated values.

Extraction with OpenRCX

After detailed routing, OpenRCX computes the parasitics from the routed layout and writes them in SPEF (Standard Parasitic Exchange Format):

define_process_corner -ext_model_index 0 X
extract_parasitics -ext_model_file /OpenROAD-flow-scripts/flow/platforms/sky130hd/rcx_patterns.rules
write_spef layout.spef
read_spef layout.spef

The rules file holds capacitance and resistance values for many wire patterns (widths, spacings, neighbours above and below), computed from the sky130 cross-section. read_spef replaces the estimated parasitics in the timer with the extracted ones. On the multiplier it took a few seconds:

[INFO RCX-0440] Coupling threshhold is 0.1000 fF, coupling capacitance less than 0.1000 fF will be grounded.
[INFO RCX-0045] Extract 1361 nets, 6359 rsegs, 6359 caps, 9197 ccs

The last line counts resistor segments, ground capacitances and coupling capacitances. Coupling capacitances below 0.1 fF are added to ground instead, which keeps the file smaller.

Reading a Net in the SPEF File

The SPEF header gives the units (here 1 PF for capacitance and 1 OHM for resistance) and a name map that replaces long names with numbers. This is one complete net, *3, which the name map lists as _0002_:

*D_NET *3 0.000962549
*CONN
*I *2283:B I *D sky130_fd_sc_hd__maj3_1
*I *2251:A I *D sky130_fd_sc_hd__xor2_1
*I *2248:X O *D sky130_fd_sc_hd__o21a_1
*CAP
1 *2283:B 0
2 *2251:A 0.000110366
3 *2248:X 0.000206669
4 *3:10 0.000317035
5 *2251:A *2251:B 0.000197539
6 *2251:A *1273:131 1.22289e-05
7 *2251:A *1274:97 0
8 *3:10 *2251:B 3.67708e-05
9 *3:10 *1273:131 3.25394e-05
10 *2:12 *2251:A 4.94e-06
11 *2:12 *3:10 4.44611e-05
*RES
1 *2248:X *3:10 17.829
2 *3:10 *2251:A 17.6574
3 *3:10 *2283:B 13.7491
*END
  • *D_NET gives the total capacitance of the net: 0.96 fF.
  • *CONN lists the pins: the driver X of an o21a_1 (O) and two loads (I). *3:10 is an internal node of the wire.
  • *CAP lines with one node are capacitance to ground. Lines with two nodes are coupling capacitances, between a node of this net and a node of another net, such as pin B of the same xor2 or node 12 of net *2.
  • *RES builds the resistor tree: the driver connects to node 10, which branches to the two loads, about 14 to 18 ohms each.

The timer turns this network into a delay for each driver-to-load connection, so two loads of the same net can see different wire delays.

Quick Check

Q: In the net above, how much of the 0.96 fF is coupling to other nets?

Show Answer

The two-node lines add up to 0.198 + 0.012 + 0 + 0.037 + 0.033 + 0.005 + 0.044 = 0.33 fF, about a third of the total. The single-node lines give the other 0.63 fF of ground capacitance.

How Good Were the Estimates?

The multiplier was routed at a 6 ns clock twice: once with met2-only RC values and once with the correlated values of OpenROAD-flow-scripts. In each run, every net's wire capacitance was recorded from the final global-route estimate and again after extraction. Divided by each net's routed length and grouped by length (about 750 nets under 10 um, 450 from 10 to 30 um, 100 from 30 to 100 um and 45 longer):

Extraction gives almost the same capacitance per micrometre at every length, about 0.16 fF/um. The estimates show two separate errors:

  • Route shape, on short nets. Both estimates charge short nets far more per micrometre than long ones. The global route only knows which GCells a net passes through, 6.9 um each, so for a net a few micrometres long it assumes more wire than the detailed router draws. This error does not depend on the RC values.
  • Calibration, on long nets. For long nets the route shape is close to the real one, and the estimate is simply the per-micrometre value. The correlated values land within 5 to 15 % of extraction; the met2-only values are about 45 % low.

What the Estimate Does to Timing

Multiplier, 6 ns clockmet2-only RCCorrelated RC
Worst setup slack, global-route estimate-0.92 ns-1.53 ns
Worst setup slack, extracted-1.23 ns-1.07 ns
Total wire capacitance, estimate / extracted3.55 / 4.71 pF6.93 / 4.75 pF

With the met2-only values the estimate was optimistic; with the correlated values it was pessimistic, because short nets dominate the total. Neither estimate is a sign-off number. The more important difference is in the extracted row: the run with correlated values ended 0.16 ns better. The timing repair steps during the flow work on the estimate, and they fix what they can see.

The net rb[10], an operand register output with 22 loads, shows it. With the met2-only values its estimate was 88 fF, and repair left it on a dfxtp_1. After extraction the net had 121 fF, the flip-flop's output slew was 1.16 ns, and the worst path of the design started there. With the correlated values the estimate was 124 fF, close to the extracted 123 fF, and repair upsized the driver to dfxtp_2.

Quick Check

Q: Both estimates overestimated the short nets. Why would better per-layer RC values not fix that?

Show Answer

The error on short nets comes from the length, not from the capacitance per micrometre. The global route works on 6.9 um GCells and cannot see that two pins a few micrometres apart are joined by a short wire. Any per-micrometre value multiplied by a length that is too long gives too much capacitance.

Running It in ChipVerify Lab

Run Place and Route on the multiplier at 6 ns and look at the timing section of the report. The lab's flow reports the worst slack twice: first from estimate_parasitics -global_routing, then after extract_parasitics with the OpenRCX rules, write_spef and read_spef, and the final timing uses the extracted values. For the multiplier the estimate says -1.51 ns and the extraction -1.06 ns, pessimistic as in the correlated column above. The SPEF file can be downloaded from the report.

The SPEF format and how sign-off STA uses it are covered in Parasitic Extraction and SPEF.

Common Mistakes

Mistake #1: Signing off on estimated parasitics

An estimate can be off in either direction, and by different amounts for short and long nets. Final timing must use extracted parasitics.

Mistake #2: Using uncalibrated per-layer values

Repair, CTS and placement all act on the estimate. Values that are far from extraction send them after the wrong nets, and the damage only shows after extraction.

Mistake #3: Comparing estimate and extraction by worst slack only

Opposite errors on short and long nets can cancel in the total. Compare per net, or at least by net length, to see where the estimate is wrong.

Practice Exercise

Challenge: Estimating a Long Net

A net is routed over 200 um, mostly on met1 and met2. Using the extracted average of 0.16 fF/um, what wire capacitance should it have? What would a met2-only estimate of about 0.091 fF/um give, and by how much would a flip-flop driving it be under-loaded in the timer?

Hint

For long nets the estimate is simply length times the per-micrometre value.

Solution

Extracted: 200 x 0.16 = 32 fF. met2-only estimate: 200 x 0.091 = 18 fF. The timer sees 14 fF less than the real wire, about 43 % too little, so it underestimates the driver's delay and output slew, and repair may leave a cell that is too small, as happened with rb[10].

Open the ready-made example in the lab, synthesize it and run Place and Route.

Summary

  • Before routing, parasitics are estimated from Steiner trees or global routes times per-layer RC values; after routing, OpenRCX extracts them from the real wires.
  • A SPEF net lists its pins, ground and coupling capacitances, and the resistor tree between them.
  • Extracted capacitance was about 0.16 fF/um at every length; estimates overstated short nets and, with uncalibrated values, understated long ones by 45 %.
  • Repair steps act on the estimate: with correlated values the same flow finished 0.16 ns better after extraction.
Did you find what you were looking for?

Quiz

Test Your Knowledge

1 of 5 Score: 0 / 5