How to read this page
Every command below was checked before it went on this page, and anything that could not be confirmed is labelled so you know to look it up in your own install before you copy it.
Tool versions differ, and option names and defaults do move between releases, so treat every command here as something to confirm with man or the documentation that ships with your installed version.
| Label | What it means |
|---|---|
| Verified | The command and every option shown were confirmed to exist, and the combination is used the way the tool intends. |
| Environment-specific | Real, but whether it applies depends on your license, tool version, foundry kit or flow. The note says which. |
| Illustrative pseudocode | Could not be confirmed. Shown for shape only, so check the man page before you use it. |
| Illustrative values | Numbers, corner names, file names and counts that were made up to teach the idea. They are not from a real run and they are not thresholds. |
One more convention. When something is true of parasitic extraction in general, I say so plainly. When it is specific to StarRC, ICC2 or PrimeTime, the tool is named, and when it depends on your foundry, the text says the foundry decides.
SPEF fundamentals
A SPEF is the extractor's description of one routed layout at one extraction corner. It carries RC and connectivity, not timing, and it is only as trustworthy as the layout and settings it came from.
SPEF is the Standard Parasitic Exchange Format, IEEE 1481. It is a text file that describes, net by net, the resistors and capacitors an extractor found in the routed layout, plus enough connectivity to hang them on the right pins. StarRC writes it, ICC2 can write its own version, and PrimeTime reads it with read_parasitics, which also accepts GPD, DSPF, RSPF and Milkyway parasitics.
AWhat is inside, and what is not
| Inside a SPEF | Not inside a SPEF |
|---|---|
Units for time, capacitance, resistance and inductance (*T_UNIT, *C_UNIT, *R_UNIT, *L_UNIT) | Cell delays, timing arcs or pin capacitance. Those come from the libraries, and PrimeTime ignores any pin capacitance in the SPEF by default |
A name map that shortens long net and instance names to *n codes | Constraints, clocks, modes or corners of the timing run. A SPEF header can say which extraction corner it came from, nothing more |
One *D_NET per net with its total capacitance | Power and ground net RC, unless extraction was asked for it. StarRC does not extract power nets by default |
Connectivity (*CONN): ports, instance pins, internal nodes | Switching activity, so no power number comes from the SPEF alone |
Ground and coupling capacitors (*CAP) and resistors (*RES) | Any proof that the layout is free of shorts or opens. Section 9 explains why |
BDistributed R, ground C, coupling C
A routed wire is not one resistor and one capacitor. It has resistance spread along its length and at every via, and it has capacitance spread along its length to everything around it. The extractor chops the wire into segments, and each segment becomes a resistor between two nodes with capacitance hanging off the nodes. That is the distributed RC model, and it is what timing and SI need, while a lumped total capacitance is enough for dynamic power estimation.
Capacitance splits two ways. Capacitance to a net held at a fixed potential, power and ground shapes and the substrate, becomes ground capacitance. Capacitance to another signal net becomes coupling capacitance, because the other net switches too and that is where crosstalk comes from. Whether a given coupling capacitor survives into the SPEF as coupling, or gets folded into ground capacitance, is a setting, and by default StarRC grounds all of them. Section 6 comes back to this.
CUnits and name mapping
Every number in the body of a SPEF is a multiple of the header units. If the header says *C_UNIT 1 FF, a capacitor of 0.84 is 0.84 fF, and the same value under *C_UNIT 1 PF would be a thousand times bigger. Tools read the header, so this only bites when someone hand-edits a file or merges files with different headers, but it is the first thing worth checking when two SPEFs disagree by a clean factor of 1000.
The name map replaces long hierarchical names with *n codes to keep the file small. StarRC maps names by default (NETLIST_NAME_MAP: YES) and turning it off greatly increases file size. ICC2 write_parasitics also maps by default and has -no_name_mapping to write real names. Mapping does not change matching. PrimeTime still needs the net and instance pin names in the SPEF to match the names in the netlist it loaded, and name matching is the most common reason nets end up not annotated.
DSPEF, TLUPlus and nxtgrd are different things
grdgenxo utility turns it into TLUPlus for ICC2, Fusion Compiler and DC Topographical, and into an nxtgrd file for StarRC. Each extractor combines its model with the routed design. Only the result, the GPD or SPEF, goes to PrimeTime.| TLUPlus | nxtgrd (StarRC) | SPEF | |
|---|---|---|---|
| Purpose | Fast RC models for extraction inside implementation tools | Process characterisation data for signoff extraction | RC of one specific layout at one corner |
| Produced by | grdgenxo from ITF | grdgenxo from ITF; for signoff, supplied by the foundry | An extractor run on a routed design (StarRC, or ICC2 write_parasitics) |
| Consumed by | ICC2 via read_parasitic_tech -tlup. Not used by StarRC | StarRC via TCAD_GRD_FILE. ICC2 can also read a common nxtgrd | PrimeTime read_parasitics |
| Depends on your design? | No | No | Yes, every wire |
| Position in the flow | Placement to postroute optimisation | Signoff extraction | Handed to STA, SI and power analysis |
EWhich analyses consume parasitics
| Analysis | What it needs from parasitics | What else it needs |
|---|---|---|
| Delay calculation and STA | Detailed RC per net, for the corner being timed. The RC network is used to compute effective capacitance during delay calculation | Netlist that matches the SPEF names, libraries for the same PVT, SDC, the matching scenario setup |
| Crosstalk delay and noise (PrimeTime SI) | Coupling capacitors kept as coupling. Without SI, PrimeTime splits coupling capacitors to ground | si_enable_analysis true and read_parasitics -keep_capacitive_coupling, plus the timing windows STA produces |
| Dynamic power | Net capacitance; a lumped value is enough for this | Switching activity (SAIF, VCD or vectorless assumptions) and power libraries |
| Rail analysis (IR drop, EM) | Power and ground network resistance, which is a separate extraction and not the signal SPEF | Current information from power analysis, pad and package locations |
Where extraction fits in the PnR flow
The same design gets extracted several times, and what changes each time is the model, the engine and whether the layout is final, but only the last extraction on the final layout is a signoff input.
AImplementation extraction and signoff extraction
ICC2 extracts parasitics all the time during implementation, using the TLUPlus models you load with read_parasitic_tech and attach to corners with set_parasitic_parameters. That extraction drives optimisation and it is good enough to steer the tool. ICC2 can write it out with write_parasitics, and you should run update_timing first so the parasitics are up to date. That file is an implementation estimate. Signoff extraction is StarRC with the foundry nxtgrd, and the two should correlate but they are not the same engine or the same model.
There is a middle option, In-Design StarRC, where ICC2 runs the StarRC engine itself through set_starrc_in_design. It brings implementation closer to signoff, but it is still implementation. RC scaling factors, which ICC2 can insert into an In-Design corners file for correlation, are not meant for final signoff runs.
read_parasitic_tech -tlup <cmax.tluplus> -layermap <icc2_itf.map> -name cmax
read_parasitic_tech -tlup <cmin.tluplus> -layermap <icc2_itf.map> -name cmin
set_parasitic_parameters -corners <corner> -late_spec cmax -late_temperature 125 \
-early_spec cmin -early_temperature 125
report_parasitic_parameters -corners <corner>
update_timing -full
write_parasitics -output <block> -format spef ;# writes <block>.<tech>_<temp>.spef
# compare ICC2 extraction settings with a StarRC setup (reports CORR-8xx differences)
set_consistency_settings_options -exec_path <starrc_bin_dir> -tool starrc \
-script <starrc_setup> -corner <corner>
check_consistency_settings -tool starrcBWhich milestone is good for which analysis
| Milestone | Parasitic source | Use it for | Do not use it for |
|---|---|---|---|
| Placement, CTS | Estimated routes in ICC2 | Trends, early timing, congestion-driven decisions | Any signoff statement, hold fixing with real margins |
| Routed, postroute optimisation | ICC2 extraction (TLUPlus), or In-Design StarRC | Optimisation, early SI look, correlation with StarRC | Final numbers. It is still an implementation estimate |
| Final routing with fill in place | StarRC with foundry nxtgrd | Signoff STA, SI, the final ECO loop | Nothing, as long as the layout does not change again |
| After a signoff ECO | StarRC again (full, or incremental ECO extraction) | Re-timing the changed design | Reusing the pre-ECO SPEF on the post-ECO netlist |
CRouting ECOs, metal fill and other physical changes
A SPEF describes the layout at the moment it was extracted. Any reroute, NDR or shielding change, cell swap with new wires, or fill change after that point means the file describes a layout that no longer exists. The case that catches people is a small ECO, where ten changed nets feel too few to matter and the old SPEF gets reused, but the nets next to those ten also changed their coupling, and the new nets have no parasitics at all, so PrimeTime falls back for them in ways that look fine in a report.
StarRC has an incremental ECO flow that re-extracts only the ECO-affected nets. It needs ECO_MODE with a GPD directory, and it requires EXTRACTION: RC, COUPLE_TO_GROUND: NO and POWER_EXTRACT: NO. It includes nets directly coupled to the changed nets, but not nets one step further away; PrimeTime adjusts those. Whether you use it or a full rerun, the rule does not change: after a physical change, you extract again.
Inputs and prerequisites
StarRC will extract an old design at the wrong corner and still report success, so whether the output means anything is decided by the inputs, not by the run.
Most extraction problems turn out to be input problems, not StarRC problems. The tool did exactly what it was told with the files it was given. This is the checklist I would walk before a signoff extraction, with the failure each missing, stale or mismatched input causes.
save_block, or DEF written from the final block.If stale: StarRC extracts a layout older than the one you think you signed off. Nothing warns you; the run is clean. StarRC also does not need an LVS-clean layout to finish, it only warns about opens and shorts.write_verilog.If mismatched: nets and pins in the SPEF do not exist in the netlist, or the reverse, and PrimeTime reports them as not annotated.HIERARCHICAL_SEPARATOR defaults to /, and the SPEF header records *DIVIDER and *BUS_DELIMITER.CORNER_NAME, TCAD_GRD_FILE, OPERATING_TEMPERATURE per corner.If wrong or missing: outside SMC the command-file default is 25 C; in SMC every corner must carry its own temperature. A 125 C scenario reading a 25 C extraction times the wires cold.SKIP_CELLS.METAL_FILL_POLYGON_HANDLING.If not set: fill is ignored by default. A separate GDS also needs GDS_LAYER_MAP_FILE.POWER_EXTRACT defaults to NO. Fine for signal timing; wrong if someone expects PG RC in the signal SPEF.NETLIST_FORMAT: SPEF and NETLIST_FILE.If missing: a gate-level run writes only the GPD and no SPEF at all.check_consistency_settings -tool starrc reports the differences. Database and tool version compatibility is release-specific; check your release notes.ICC2-to-StarRC handoff
StarRC can read the ICC2 library directly, so on the direct route the handoff is a save, not an export. The other routes add files, and each file is a place for versions to disagree.
StarRC reads the design database directly. For gate-level extraction it accepts ICC2 and Fusion Compiler NDM libraries, Milkyway, and LEF/DEF. That gives you three practical routes out of ICC2, and they do not all need the same exports.
save_block is the handoff, and StarRC opens the same library with NDM_DATABASE and BLOCK. In B, ICC2 writes DEF and you supply technology and cell LEF; StarRC 2022.12 reads DEF versions 5.2 to 5.8 while ICC2 can also write 6.0. In C, ICC2 drives the StarRC engine itself, which is for implementation and needs its settings checked against the standalone signoff run.ARoute A: StarRC reads the ICC2 design library
Nothing needs to be exported for extraction. NDM_DATABASE is the library name you would give open_lib, and BLOCK is the block you would open, optionally as block/label. Only gate-level designs are supported this way. Metal fill in the block's FILL view is read from the database. You still write a netlist for PrimeTime, because PrimeTime reads Verilog, not NDM.
save_block
write_verilog -exclude {physical_only_cells pg_objects} <block>.vBoth -exclude values are real options. Which constructs your STA netlist should drop is a flow decision, which is why this block is marked environment-specific rather than verified.
NDM_DATABASE: <design_lib> BLOCK: <top_block> MAPPING_FILE: <starrc_layer.map>
BRoute B: LEF and DEF
ICC2 writes DEF with write_def; the valid versions are 5.7, 5.8 and 6.0 with 5.8 as the default. StarRC 2022.12 reads LEF/DEF 5.2 through 5.8, so a DEF 6.0 file from a newer ICC2 is a mismatch to check against your StarRC version. On the StarRC side, LEF_FILE and TOP_DEF_FILE are mandatory, the technology LEF must come first, and BLOCK is not valid because the block name comes from the DEF. LEF parasitic capacitance is ignored.
# ICC2 write_def -version 5.8 -compress gzip <block>.def.gz write_gds -fill fill_only <block>_fill.gds ;# only if fill goes to StarRC as GDS * StarRC (tech LEF first) LEF_FILE: <tech.lef> LEF_FILE: <stdcell.lef> LEF_FILE: <macros.lef> TOP_DEF_FILE: <block>.def.gz METAL_FILL_GDS_FILE: <block>_fill.gds GDS_LAYER_MAP_FILE: <fill_layer.map>
CRoute C: In-Design StarRC
set_starrc_in_design loads a configuration file with the StarRC executable, the corner-to-nxtgrd list, the same mapping file standalone StarRC uses, and a command file. check_starrc_in_design -effort medium validates it and writes a StarRC command file you can review or run standalone, which is a good way to see what ICC2 actually asked StarRC to do.
set_starrc_in_design -config <starrc_in_design.cfg> check_starrc_in_design -effort medium
DOther tools only when the flow really needs them
For gate-level signoff extraction from an NDM or LEF/DEF design, you do not need an LVS tool in the loop or a GDS merge step. LVS-based inputs from IC Validator, Calibre or Hercules are for transistor-level extraction and for the connectivity-interface flows. A separate GDS or OASIS file appears only if your fill lives outside the design database. If someone tells you every flow needs a conversion step, ask which database format they are starting from.
| Step skipped | What happens |
|---|---|
save_block before an NDM read | StarRC reads the last saved state, not the session in memory |
| Netlist from a different block state | Name mismatches, nets not annotated, partial annotation |
| Fill source or fill handling | Fill ignored by default; capacitance underestimated |
| DEF version check in route B | StarRC cannot read a DEF version outside what its release supports |
| Settings comparison for route C | In-Design and standalone results drift apart and nobody knows why |
Corners and MMMC scenarios
An extraction corner and a timing scenario are different objects. One SPEF per nxtgrd and temperature pair is the rule, not one SPEF per scenario.
An RC extraction corner is a process variant of the interconnect plus a temperature. StarRC defines a unique corner as an nxtgrd file combined with a pattern density specification, and each corner in the corners file carries its own OPERATING_TEMPERATURE. A timing scenario is bigger: a mode, a library PVT corner, and one parasitic corner. PrimeTime builds scenarios in DMSA with create_scenario and per-scenario scripts, and the parasitic file is one of the things a scenario script reads.
So one SPEF can serve many scenarios. Functional and scan mode at the same slow corner and 125 C can share one rcworst extraction, because the wires did not change between modes. You need a new SPEF when the nxtgrd or the temperature changes, not when the mode does.
| RC corner Illustrative values | nxtgrd | Temp | StarRC output | Used by scenarios |
|---|---|---|---|---|
cworst_125 | <kit>/cworst.nxtgrd | 125 | <blk>.spef.cworst_125 | func setup, C-sensitive paths |
rcworst_125 | <kit>/rcworst.nxtgrd | 125 | <blk>.spef.rcworst_125 | func setup, scan setup |
cbest_m40 | <kit>/cbest.nxtgrd | -40 | <blk>.spef.cbest_m40 | func hold, scan hold |
rcbest_m40 | <kit>/rcbest.nxtgrd | -40 | <blk>.spef.rcbest_m40 | func hold, R-sensitive paths |
typ_25 | <kit>/typical.nxtgrd | 25 | <blk>.spef.typ_25 | typical, power |
AResistance, capacitance and temperature
Interconnect corners exist because metal width, thickness and dielectric vary, and those move R and C in different directions. A corner that makes wires fat and close pushes capacitance up and resistance down; one that makes them thin pushes resistance up. Which corner is worst for a path depends on whether the path is dominated by wire capacitance or wire resistance, which is why kits commonly ship separate C-worst and RC-worst style corners. The exact names and what each one varies are defined by your foundry, so read the kit documentation rather than a generic article, this one included.
Temperature is separate. Wire resistance changes with temperature, and StarRC applies the nxtgrd derating only if OPERATING_TEMPERATURE is set, recording it in the SPEF header. The extraction temperature should match the temperature of the scenarios that use it. A 125 C timing scenario reading a 25 C extraction is timing the wires colder than the cells.
BSimultaneous multicorner extraction
StarRC can extract up to 15 corners in one run. You define all corners in a CORNERS_FILE, pick the ones to run with SELECTED_CORNERS, and one netlist per selected corner comes out, named <NETLIST_FILE>.<corner> with CORNER_NAME in the header. In SMC mode the nxtgrd files and temperatures in the corners file win, and specifying the nxtgrd in both places is an error. All corners must share the same layer stack structure.
CORNER_NAME: cworst_125 TCAD_GRD_FILE: <kit>/cworst.nxtgrd OPERATING_TEMPERATURE: 125 CORNER_NAME: rcworst_125 TCAD_GRD_FILE: <kit>/rcworst.nxtgrd OPERATING_TEMPERATURE: 125 CORNER_NAME: cbest_m40 TCAD_GRD_FILE: <kit>/cbest.nxtgrd OPERATING_TEMPERATURE: -40 * rcbest_m40 and typ_25 are defined the same way * in the main command file SIMULTANEOUS_MULTI_CORNER: YES CORNERS_FILE: corners.smc SELECTED_CORNERS: cworst_125 rcworst_125 cbest_m40
CA practical naming convention
Let the tool name the corner and do not rename files by hand. StarRC already appends the corner name, and ICC2 write_parasitics names its files <base>.<parasitic_tech>_<temperature>.spef and writes a .spef_scenario file listing the scenarios each file belongs to. What I would add is a small manifest per run: block, design label, netlist file, corner, nxtgrd path, temperature, StarRC version and date. When a scenario script reads a SPEF, it should read it through that manifest, so a scenario cannot quietly pick up the wrong corner.
What happens inside StarRC
StarRC turns shapes into conductors, conductors into R and C using the nxtgrd, then decides what to keep and how much to reduce. Two defaults in that chain matter more than the rest.
| Step | What happens | What you control |
|---|---|---|
| 1 Read layout | Shapes, nets, pins and skip cells come from the database. By default lower-level cells are skip cells | NDM_DATABASE/BLOCK or LEF_FILE/TOP_DEF_FILE, SKIP_CELLS, NETS |
| 2 Map layers | Each database layer is tied to an nxtgrd layer; unmapped layers are errors in LEF/DEF | MAPPING_FILE with conducting_layers and via_layers |
| 3 Build conductors | Per-net conductor groups. Shapes with the same net but no physical connection become separate resistively connected groups (opens); touching shapes of different nets are potential shorts | Reports: opens.sum, shorts_all.sum |
| 4 Resistance | Sheet resistance and via resistance from the nxtgrd, optionally overridden in the mapping file, derated for temperature | OPERATING_TEMPERATURE, mapping file rpsq / RPV |
| 5 Capacitance | Pattern matching against the nxtgrd; fill handled per setting | TCAD_GRD_FILE, METAL_FILL_POLYGON_HANDLING |
| 6 Coupling decision | Each coupling capacitor is kept or grounded (Figure 8) | COUPLE_TO_GROUND, COUPLING_ABS_THRESHOLD, COUPLING_REL_THRESHOLD |
| 7 Reduction | Shrinks the network while preserving point-to-point resistance and total net capacitance | REDUCTION |
| 8 Write outputs | GPD by default; SPEF only if asked; summary and report files | NETLIST_FORMAT, NETLIST_FILE, STAR_DIRECTORY, SUMMARY_FILE |
COUPLE_TO_GROUND: YES, the default, all coupling capacitors become ground capacitance, scaled by COUPLING_MULTIPLIER. With NO, a coupling capacitor is grounded only if it is smaller than COUPLING_ABS_THRESHOLD (default 3e-15 F) and its ratio to each net's total capacitance is below COUPLING_REL_THRESHOLD (default 0.03); otherwise it stays as a coupling capacitor.Two defaults in this picture change what your SPEF can be used for. With COUPLE_TO_GROUND left at YES, the SPEF has no coupling capacitors, so PrimeTime SI has nothing to work with, however carefully you set it up. And REDUCTION defaults to YES, while StarRC recommends NO_EXTRA_LOOPS when PrimeTime is the consumer.
AAn illustrative run configuration
Every command in this file is a real StarRC command used the way the tool intends. The values in angle brackets are placeholders, and the fill setting has to match how fill was inserted in your flow, so treat this as a shape to start from, not a recipe. Lines starting with * are comments.
* design (route A) NDM_DATABASE: <design_lib> BLOCK: <top_block> MAPPING_FILE: <starrc_layer.map> * corners SIMULTANEOUS_MULTI_CORNER: YES CORNERS_FILE: corners.smc SELECTED_CORNERS: cworst_125 rcworst_125 cbest_m40 * extraction EXTRACTION: RC COUPLE_TO_GROUND: NO REDUCTION: NO_EXTRA_LOOPS * fill: must match your fill methodology METAL_FILL_POLYGON_HANDLING: FLOATING * outputs NETLIST_FORMAT: SPEF NETLIST_FILE: <top_block>.spef STAR_DIRECTORY: star SUMMARY_FILE: ./reports/<top_block>.star_sum NUM_CORES: 8
StarXtract star_cmd StarXtract -tech_out star_cmd # list options with effective defaults StarXtract -convert_gpd_to_spef <gpd_dir> <out.spef> # SPEF later, from the GPD StarXtract -compare_parasitics <test> <reference> # compare two parasitic sets
# job submission, license queue and run directory layout are local choices submit --cores 8 --mem <N>G -- StarXtract star_cmd archive_manifest block=<blk> label=<label> netlist=<blk>.v corners=<list>
Run-quality checks and summary reports
Successful completion is not proof of a correct extraction. The reports tell you what StarRC worked around without stopping, and you have to read them before the SPEF goes to STA.
A clean exit only tells you StarRC did not crash. StarRC does not need an LVS-clean layout for extraction to complete, open nets are bridged so timing tools can still calculate delays, fill is ignored unless you say otherwise, and coupling is grounded unless you say otherwise. Each of those produces a SPEF that looks perfectly normal.
AValidation checklist
<block>.star_sum for every error and warning, plus elapsed time, CPU time and peak memory.Warnings are not noise here. Group them and explain every group.CORNER_NAME and that the list matches SELECTED_CORNERS.A missing corner means a scenario is reading something else.NETS setting, and translate.sum for skipped cells.Any NETS line restricts extraction to the listed nets.opens.sum and shorts_all.sum in the star directory.Each entry needs a reason. See Section 9.vias.sum lists vias with one or no connection.Often the same root cause as an open.REPORT_METAL_FILL_STATISTICS: YES, check polygon counts per layer in mf_statistics.sum.Zero fill on a layer that should have fill is a finding. The report costs runtime.*T_UNIT, *C_UNIT, *R_UNIT as expected by whoever merges or compares files.Factor-of-1000 surprises start here.COUPLING_REPORT_FILE lists nets sorted by Cc/Ct. Use it to find outliers, not to set a pass line.StarXtract -compare_parasitics.A sudden jump between two runs of a stable design needs an explanation.BRun-health summary, walked through
I do not have a real StarRC summary to show, and the layout of the summary file changes between releases, so this is a dashboard of the things worth pulling out of a run, not a copy of the real report. Every number in it is illustrative and none of them is a threshold; whether 3 bridged opens is acceptable depends on which nets they are.
Warning sign: Any error at all. Some runs finish with errors in a sub-step.
Next: Open the summary, not just the exit status.
Warning sign: Categories you have not seen before on this block.
Next: Group by message ID, compare with the last good run.
Warning sign: Fewer files than selected corners.
Next: Check each header for CORNER_NAME.
Warning sign: Count far from the netlist net count.
Next: Check NETS, skip cells, power nets.
Warning sign: Any signal net, and all clock nets.
Next: Find each in opens.sum and fix the layout.
Warning sign: Signal to signal, or signal to fill.
Next: Find it in shorts_all.sum and in check_lvs.
Warning sign: Vias on signal nets, not dummy structures.
Next: Cross-check vias.sum against opens.sum.
Warning sign: Zero on a layer where fill was inserted.
Next: Check fill source and handling setting.
Parasitic annotation and missing nets or pins
A good extraction does not guarantee a good annotation, and the check that matters is the one PrimeTime runs against its own netlist.
Extraction coverage and annotation coverage are two separate questions. The first is whether StarRC produced parasitics for every net it should have. The second is whether PrimeTime attached those parasitics to the nets and pins in the netlist it loaded. A perfect StarRC run can still give you a PrimeTime session with nets that have no RC at all.
AChecking annotation in PrimeTime
read_parasitics checks the nets it annotates and runs report_annotated_parasitics -check by itself. When you read several files, for example block SPEFs plus a top-level SPEF, read them all and then run the check once explicitly, because that report covers the whole design and not just the last file. The report lists pin types with Total, RC pi, RC network and Not Annotated columns.
set_app_var si_enable_analysis true # after search_path and link_path point at the libraries for this corner read_verilog <block>.v current_design <top> link_design read_parasitics -syntax_only -keep_capacitive_coupling <block>.spef.rcworst_125 read_parasitics -keep_capacitive_coupling -format spef <block>.spef.rcworst_125 report_annotated_parasitics -check
read_parasitics A.spef -path [all_instances -hierarchy BLKA] read_parasitics top.spef report_annotated_parasitics -check
report_annotated_parasitics -list_not_annotated
This option appears in scripts you may inherit, but I could not confirm it for this page, so check it with man report_annotated_parasitics in your version before you put it in a script. The -syntax_only read is the supported way to check that coupling capacitors are symmetric before the real read. Also check the parasitics log, parasitics_command.log by default, and remember that repeated messages are limited by sh_message_limit, so the count you see on screen is not always the full count.
BWhy nets and pins go missing
| Cause | What you see | Where to look |
|---|---|---|
| Naming mismatch | Nets not annotated even though they are in the SPEF | Compare the netlist name with the SPEF name map entry; escaping, bus brackets, VHDL versus Verilog naming |
| Hierarchy and stitching | Block nets annotated, top-level nets partly annotated; annotations on terminal nodes rejected with PARA-114 | The -path used for each block file and the order of reads |
| Different netlist | A cluster of not-annotated nets around ECO cells | The netlist and the SPEF must come from the same block state |
| Excluded nets | Specific nets never appear in the SPEF | NETS in the StarRC command file |
| Ideal nets | Nets you set ideal in the constraints | They are timed ideal by your choice; do not count them as covered by parasitics |
| Incomplete extraction | Net present but the RC network is incomplete | PrimeTime falls back to wire load models for such nets |
CHow serious is a missing annotation
There is no blanket safe-to-ignore list. Here is how I would sort them, with the condition that has to be true before anything goes in the low column.
| Issue | Risk | Only lower risk if | Investigation required |
|---|---|---|---|
| Clock net not annotated or partial | High | Never lower. Clock RC sets skew and latency | Fix the source and re-read |
| Data net on a critical or near-critical path | High | Never lower while it is near critical | Find the cause in the table above |
| Net with bridged open (0.01 ohm resistor) | High | The open is proven to be an extraction artefact, not a layout open | Section 9 sequence |
| Scan or test-only net in functional timing | Medium | The net is not timed in the scenario, and is covered in the test scenario | Confirm the scenario constraints |
| Tie-off or constant net | Low | It really never switches and drives no timing arc that matters | Confirm in the netlist and constraints |
| Net inside a skip cell with its own timing model | Low | The model already includes its internal parasitics | Confirm the model source |
Shorts and opens
Extraction completes on broken layouts and bridges opens by default. Connectivity is proven by LVS and physical checks, never by inspecting a SPEF.
Opens and shorts are layout problems, and extraction sits downstream of layout. StarRC will still finish on a layout with opens or shorts; it just tells you about them. The risk is in what it does with an open by default.
opens.sum. Panel 2: net B jogs up on M2, against the M2 horizontal preferred direction, and lands on the track net A uses. StarRC lists the overlap in shorts_all.sum. The ledger under each panel is the point: the SPEF and STA look fine, the silicon does not.AWhich check belongs in which tool
| Check | Tool | Catches | Does not prove |
|---|---|---|---|
check_routes | ICC2 | Routing DRC, open nets, antenna, voltage-area violations; up to 200 opens reported by default | Signoff DRC or LVS |
check_lvs | ICC2 | Shorts, opens and floating routes in ICC2's own view of the layout | Layout versus the source schematic at signoff quality |
| Signoff LVS | IC Validator, Calibre | Layout against the netlist, device and connectivity level | Anything about parasitic values |
opens.sum, shorts_all.sum, vias.sum | StarRC | What extraction noticed while building conductors | That the layout is clean. It is a side report, not LVS |
report_annotated_parasitics -check | PrimeTime | Whether parasitics are attached to the netlist | That the attached parasitics describe good metal |
A SPEF cannot tell you the layout is free of opens and shorts, because a bridged open is written as a normal resistor and the SPEF has no concept of shapes touching that should not. The only question a SPEF answers is what RC the extractor built, and whether that is the RC of a correct chip is a question for LVS.
check_routes -open_net true -drc true
check_lvs -checks {short open floating_routes} -max_errors 0ENHANCED_SHORT_REPORTING: YES REPORT_METAL_FILL_STATISTICS: YES
BA practical debug sequence
- Start from the StarRC reports. List every net in
opens.sumandshorts_all.sum, and every via invias.sum. - Run
check_routesandcheck_lvsin ICC2 on the same saved block. If ICC2 sees the same open or short, it is a layout problem and you fix it in ICC2. - If ICC2 does not see it, look at what StarRC read and ICC2 did not check the same way: fill shapes, blockages, skip-cell pins, layers that are mapped differently.
ENHANCED_SHORT_REPORTINGwidens what the shorts report includes. - For shorts to fill, check the fill source and the handling mode before touching routing.
- Fix,
save_block, re-extract. Do not edit the SPEF. - Re-run signoff LVS on the final layout. Extraction reports do not replace it.
- Re-annotate in PrimeTime and confirm the affected nets now annotate fully and carry no 0.01 ohm resistors.
Reading a SPEF file
Once you can draw a SPEF as a schematic, most parasitic questions become arithmetic. The one convention to be careful with is where coupling capacitance is counted.
Here is a small SPEF I wrote by hand so every number can be traced. It has two nets. n_data is driven by u_drv/Z and fans out to two loads; sel comes in from a top-level input port and drives one load. The two nets run next to each other in one place, so there is one coupling capacitor between them. The header layout follows the form StarRC writes, and the values are illustrative.
*SPEF "IEEE 1481-1999" *DESIGN "spef_demo" *DATE "illustrative" *VENDOR "pdverse example" *PROGRAM "hand-written" *VERSION "1.0" *DESIGN_FLOW "PIN_CAP NONE" "NAME_SCOPE LOCAL" *DIVIDER / *DELIMITER : *BUS_DELIMITER [] *T_UNIT 1 NS *C_UNIT 1 FF *R_UNIT 1 OHM *L_UNIT 1 HENRY *NAME_MAP *1 n_data *2 sel *3 u_drv *4 u_ld1 *5 u_ld2 *6 u_agl *PORTS *2 I *D_NET *1 2.51 *CONN *I *3:Z O *C 12.60 40.20 *I *4:A I *C 88.40 40.20 *I *5:A I *C 60.10 22.80 *CAP 1 *3:Z 0.21 2 *1:1 0.84 3 *1:2 0.66 4 *4:A 0.18 5 *5:A 0.27 6 *1:2 *2:1 0.35 *RES 1 *3:Z *1:1 12.4 2 *1:1 *1:2 18.6 3 *1:2 *4:A 9.3 4 *1:1 *5:A 21.7 *END *D_NET *2 1.53 *CONN *P *2 I *C 0.00 55.00 *I *6:A I *C 92.00 55.00 *CAP 1 *2 0.30 2 *2:1 0.72 3 *6:A 0.16 4 *2:1 *1:2 0.35 *RES 1 *2 *2:1 15.2 2 *2:1 *6:A 11.8 *END
sel (*2), the middle and bottom rows are net n_data (*1). Nodes written *1:1 and *1:2 are internal nodes of net 1; *3:Z means pin Z of instance *3, which the name map says is u_drv. The amber capacitor is the single coupling capacitor, listed once in each net.ALine by line
| Lines | Meaning |
|---|---|
| *SPEF ... *VERSION | Standard version, design name and who wrote the file. Useful for provenance, ignored for numbers. |
| *DESIGN_FLOW "PIN_CAP NONE" | Pin capacitance is not included in the capacitance values. PrimeTime takes pin capacitance from the libraries in any case. |
| *DIVIDER / *DELIMITER : *BUS_DELIMITER [] | Hierarchy separator, the pin delimiter used in *3:Z, and bus brackets. These must agree with how the netlist names things. |
| *T_UNIT 1 NS *C_UNIT 1 FF *R_UNIT 1 OHM | Every value below is in these units. 0.84 means 0.84 fF. |
| *NAME_MAP *1 n_data | Index to real name. Nets and instances share the same map; *3 is an instance, *1 is a net. |
| *PORTS *2 I | Top-level port sel, direction input. |
| *D_NET *1 2.51 | Start of net n_data and its total capacitance, 2.51 fF. |
| *CONN *I *3:Z O *C ... | Connection points. *I is an instance pin with its direction (O output drives, I input loads) and optional *C coordinates. *P in net 2 is a port. |
| *CAP 1 *3:Z 0.21 | Ground capacitor: one node and a value. |
| 6 *1:2 *2:1 0.35 | Coupling capacitor: two nodes on two different nets and a value. |
| *RES 1 *3:Z *1:1 12.4 | Resistor between two nodes of the same net, in ohms. |
| *END | End of this net. |
BCapacitance accounting and the coupling convention
The total on *D_NET is the sum of every capacitor listed under that net, ground and coupling together. For n_data that is 0.21 + 0.84 + 0.66 + 0.18 + 0.27 = 2.16 fF of ground capacitance plus 0.35 fF of coupling, 2.51 fF. For sel it is 1.18 + 0.35 = 1.53 fF. This follows the IEEE 1481 convention used in SPEF files; the *DESIGN_FLOW line of your own file tells you what is and is not in the totals, so read it before comparing numbers across tools.
The coupling capacitor appears twice by design, once as line 6 of n_data and once as line 4 of sel, with the same two nodes and the same value. PrimeTime expects this symmetry and can check it with a -syntax_only -keep_capacitive_coupling read. Without SI enabled, PrimeTime splits coupling capacitors to ground on each net, which is the same total but no crosstalk.
Risk-ranked troubleshooting
Sorted by how much damage the problem does if nobody notices it, not by how often it happens.
| Symptom | Likely cause | Risk | What to do |
|---|---|---|---|
| SI enabled but crosstalk delta is zero everywhere | SPEF written with COUPLE_TO_GROUND: YES (the default), or read without -keep_capacitive_coupling | High | Re-extract with COUPLE_TO_GROUND: NO and read with -keep_capacitive_coupling |
| Setup looks better than the previous run after a small ECO | Old SPEF reused, or a scenario picked up a best-case corner | High | Check file dates and CORNER_NAME headers per scenario |
| Nets reported not annotated | Netlist and SPEF from different block states, or naming differences | High | Rewrite both from one saved block; compare names |
| Net has a 0.01 ohm resistor | StarRC bridged an open | High | Find it in opens.sum; fix the layout; re-extract |
| Entries in shorts_all.sum | Real short, fill short, or short to a blockage or skip cell | High | Cross-check with check_lvs; fix; re-run signoff LVS |
| No SPEF in the run directory, run was clean | Only the GPD was written | Medium | Add NETLIST_FORMAT: SPEF and NETLIST_FILE, or convert the GPD |
| Timing looks optimistic on long nets near dense fill | Fill ignored by default | Medium | Set METAL_FILL_POLYGON_HANDLING per your fill methodology |
| Wire delay looks low in hot scenarios | Extraction at 25 C default temperature | Medium | Set OPERATING_TEMPERATURE per corner |
| Macro-internal nets missing | Macro treated as a skip cell by default | Medium | Negate it in SKIP_CELLS if it has no timing model of its own |
| StarRC stops on a LEF layer error | Layer in LEF not mapped to the nxtgrd | Low | Complete the mapping file. The run stopped, so nothing wrong was used |
| SPEF values differ from another tool by exactly 1000 | Different *C_UNIT in the headers | Low | Compare headers before comparing numbers |
Ready for signoff analysis?
If any line below is still open, the timing report is not signoff quality yet, however clean it looks.
CORNER_NAME header of the file actually loaded.OPERATING_TEMPERATURE per corner matches the scenarios that use it.COUPLE_TO_GROUND: NO in StarRC, -keep_capacitive_coupling and SI enabled in PrimeTime.report_annotated_parasitics -check run once after all files are read, with every not-annotated entry explained.complete_net_parasitics on nets with errors; no correlation scaling left in a signoff run.Interview questions
Short answers with the follow-up that usually comes next, plus the common wrong answer to avoid.
Free interview practice
Practise interview questions on this topic
- What is parasitic extraction, and why is it redone after routing? Beginner
- What are parasitics, and what is SPEF? Beginner
- What are the major input files STA needs to run (netlist, library, SDC, parasitics)? Beginner
- Why does STA need annotated parasitics instead of just a wire load model? Beginner
- What are parasitics, in plain language? Beginner
- What is SPEF, and what does it actually represent? Beginner
- What are TLUPlus and RC technology files, and why is a layer map needed? Intermediate
- How is an RC technology file different from SPEF? Intermediate
- What's the actual difference between GRLB and RDE for preroute parasitic estimation, and when does each apply? Intermediate
- What is inside a SPEF file, and what do you check in it? Intermediate
Premium libraries
Go deeper with the pdVerse libraries
10-chapter STA handbook for VLSI engineers: setup/hold, slack, Liberty, parasitics, OCV/AOCV, crosstalk, PrimeTime reports, and interview Q&A.
Full bundle ₹199 9 chaptersTiming Constraints (SDC) LibrarySynopsys Design Constraints handbook: create_clock, generated clocks, I/O delays, clock groups, false paths, multicycle paths, and SDC linting.
Full bundle ₹179 10 chaptersMMMC LibraryMMMC / MCMM timing signoff: modes vs corners, PVT, RC parasitics, analysis views, ICC2 vs PrimeTime correlation, and scenario explosion.
Full bundle ₹179 9 chaptersLow Power LibraryLearn low-power VLSI design through practical eBooks on power domains, isolation, level shifting, retention, UPF and multivoltage implementation.
Full bundle ₹179 13 guidesSignoff Academy13 ASIC signoff guides: DRC, LVS, ERC, antenna, metal fill, extraction, STA/SI, CLP, EM/IR, LEC, and tapeout handoff evidence.
Full bundle ₹179 14 chaptersDesign Planning HandbookMaster VLSI physical design planning. Read 14 chapters free online or get the complete PDF bundle with floorplanning, power, CTS & timing budgeting.
Free to read · PDF ₹179 8 chaptersPnR Flow Mentor GuideFree 8-stage ICC2 PnR walkthrough: library setup to GDS output, with the real command driving each stage. Plus the full 8-chapter mentor guide.
Free to read · PDF ₹199