This stage covers clock tree synthesis and the post-CTS stage that follows it: confirming CCOpt prerequisites, reviewing the built clock trees and skew groups, checking clock DRVs and NDR routing, legalising cells after CTS, and running post-CTS setup and hold timing through to clock gating coverage.
Sanity check cheat sheet
One row per command card. Read left to right: the check, the command that answers it, then what a healthy result, a result to review and a hard stop look like.
| Card | Check and when | Command | Healthy | Review | Hard stop |
|---|---|---|---|---|---|
| S-01 | CTS prerequisites and specification Before ccopt_design |
ccopt_design -check_prerequisitescheck_design -type cts -out_file <report_file>get_ccopt_clock_trees |
Every functional clock has a clock tree and a skew group, and the checks report no errors. | The primary corner is the first setup view by default, which may not be the one you meant. | A clock in the constraints has no clock tree, or check_design -type cts reports an error on targets or route types. |
| S-02 | CTS run and log After ccopt_design |
ccopt_designccopt_design -ctsreport_message -errors -count |
The command returns with no errors, and every warning has been read and either fixed or explained. | Warnings about dont_touch nets or clock instances that cannot be resized, which can limit skew balancing and clock quality. | Any error message, or a run that leaves clocks ideal or clock nets unrouted. |
| S-03 | Clock tree report and clock DRVs After CTS |
report_ccopt_clock_trees -summaryreport_ccopt_clock_trees -file <report_file>report_ccopt_clock_trees -histograms |
Each clock tree is present, its sink count matches the design, and every violation count is zero. | Fewer sinks than the clock has flops, or violations only on dont_touch or pre-routed nets that CTS may not be able to fix. | A clock tree with no sinks, or violations on fixable clock nets beyond your budget. |
| S-04 | Skew groups and insertion delay After CTS |
report_ccopt_skew_groups -summaryreport_ccopt_skew_groups -file <report_file>report_ccopt_skew_groups -summarize_stage_depth {buffer inverter} |
Insertion delay and skew of every skew group meet your budget in every corner reported. | Skew meets the primary corner but another corner has no target or misses it. | A skew group beyond a target that CTS enforces, or a skew group with no active sinks. |
| S-05 | Clock routes, NDR and shielding After CTS |
reportRouteTypeConstraints -summaryreportRouteTypeConstraints -detailed -file <report_file>report_route -clock |
Every net class that asks for an NDR or a shield shows it in the routed result, with adherence you accept. | Adherence below 100 percent on a few nets. The preferred layers are soft limits that the router may leave. | A clock net with an NDR route type that routed at the default rule, or required shielding that is missing. |
| S-06 | Clock cell legalisation After CTS |
checkPlace <report_file>checkPlace -inst <instances>refinePlace |
No clock halo violations, and checkPlace reports no violations on clock cells. | A message that a clock halo was disabled on a large cell, so the halo you set was not applied. | Overlapping or off-grid clock cells, or halo violations that remain after refinement. |
| S-07 | Post-CTS setup timing and propagated clocks After CTS |
timeDesign -postCTS -outDir <dir>timeDesign -postCTS -expandedViews -outDir <dir>getAnalysisMode |
Setup WNS and TNS meet the budget in every view, and every intended clock is propagated. | A large jump in negative slack against pre-CTS timing at clock gating endpoints, where real skew now counts. | Setup slack beyond budget on register-to-register paths, or a clock still ideal after CTS. |
| S-08 | Hold timing and hold fixing After C-07 |
timeDesign -postCTS -hold -outDir <dir>optDesign -postCTS -hold -outDir <dir>optDesign -postCTS -hold -holdVioData <file> |
Hold WNS and TNS meet the budget after fixing, and setup WNS is no worse than before. | Hold violations left for post-route fixing, or a small setup TNS loss, which hold fixing allows by default. | Setup WNS worse after hold fixing, or large hold violations with no fix path shown in the log. |
| S-09 | Analysis coverage and clock gating checks After C-07 |
report_analysis_coverage -verbose {violated untested}report_analysis_coverage -check_type {clock_gating_setup clock_gating_hold} -verbose {violated untested}report_clock_gating_check |
Every untested check has a known, accepted reason, and no clock gating check is violated. | A few untested checks whose reasons are constants or disabled arcs, and that you have reviewed. | Untested checks that give no clock at a flop that should be clocked, or a violated clock gating check. |
Command cheat sheet
Legacy UI commands. Angle brackets are placeholders, and values shown are examples, not project limits.
| Before CTS: checks and configuration record | |
|---|---|
ccopt_design -check_prerequisites | Checks that CTS can run, without doing CTS. |
check_design -type cts -out_file <report_file> | Checks clock tree definition such as targets and route types. Needs the specification loaded. Writes a file. |
get_ccopt_clock_trees | The names of the defined clock trees. |
get_ccopt_skew_groups | The names of the defined skew groups. |
get_ccopt_delay_corner | The primary-half delay corner that CTS uses to balance the trees. |
get_ccopt_property primary_delay_corner | The primary corner you set, or {} if unset; see get_ccopt_delay_corner. |
create_ccopt_clock_tree_spec -file <spec_file> | Without -file, defines the trees in the session. With -file, only writes a script to load with source. Changes the database. |
save_ccopt_config <dir> | Writes the CCOpt configuration to a directory, for restore_ccopt_config only. Writes files. |
create_route_type -name <type> -non_default_rule <ndr> -top_preferred_layer <layer> -shield_net <net> | Defines a route type that binds an NDR, preferred layers and a shield net. Changes the session. |
set_ccopt_property -net_type trunk route_type <type> | Selects the route type for trunk nets. Changes the CCOpt configuration. |
| Run CTS | |
ccopt_design | Clock tree synthesis with clock concurrent optimization. Changes the database and writes timing reports to ./timingReports. |
ccopt_design -cts | Clock tree synthesis only, with no datapath optimization or useful skew. Changes the database. |
clock_opt_design | CCOpt for a place_opt_design V2 database. Legalises placement first; uses -check_cts_config and -out_dir. Changes the database. |
ccopt_pro | Repairs clock DRVs and skew after a routing step. After ccopt_design it also runs earlyGlobalRoute on datapath nets. Changes the database. |
| Log and messages | |
report_message -errors -count | {ID count} pairs for every error ID since the tool started. |
report_message -warnings -count | {ID count} pairs for every warning ID since the tool started. |
| Clock tree reports | |
report_ccopt_clock_trees -summary | Only the summary table of all clock trees. |
report_ccopt_clock_trees -file <report_file> | Per-tree statistics and violation counts. Recalculates timing unless -no_invalidate is given. Writes a file. |
report_ccopt_clock_tree_structure -file <report_file> | The tree as text: levels, clock gates, macro sinks and the sink count. Timing details only with -update_timing. Writes a file. |
report_ccopt_clock_tree_convergence -file <report_file> | Convergence above clock sinks, and the sinks with most paths. Writes a file. |
| Skew groups and insertion delay | |
report_ccopt_skew_groups -summary | The skew group tables: insertion delay and skew per corner, with the target where one exists. |
report_ccopt_skew_groups -file <report_file> | Summary tables plus min and max path detail. Writes a file. |
report_ccopt_skew_groups -summarize_stage_depth {buffer inverter} | Counts of buffers and inverters on the paths instead of delay. |
report_ccopt_pin_insertion_delays -file <report_file> | Distribution of pin insertion delay values set at sinks, not measured delay. Writes a file. |
report_ccopt_worst_chain -check_type setup | The chain with the worst negative slack path, and why it cannot improve. |
| Clock DRVs, routes and NDR | |
report_ccopt_clock_tree_drv -num_nets all -file <report_file> | Constraint summary, violation counts and every violating clock net. Writes a file. |
report_ccopt_clock_tree_drv -drv_types {transition max_cap max_source_to_sink_net_length} | The same report limited to the listed violation types. |
reportRouteTypeConstraints -summary | Route type constraints per layer, NDR and category, such as INNOVUS_CLK_NDR. |
reportRouteTypeConstraints -detailed -file <report_file> | Nets with route type constraints and adherence; default only below 80 percent. Writes a file. |
report_route -clock | Routing statistics of the clock nets. |
report_route -ndr | NDR statistics of nets. |
report_route -shield | Statistics of shielded nets only. |
dbGet -p1 top.nets.isCTSClock 1 | Pointers to all CTS clock nets. |
| Legalisation after CTS | |
report_ccopt_cell_halo_violations -summary | A summary of clock instances with halo violations. |
checkPlace <report_file> | Placement violations such as overlap, grid and pin access, with markers. Writes a file. |
refinePlace | Finds legal locations for instances. Changes the placement only if it is not legal. |
cts_refine_clock_tree_placement | Refines placement against clock halo and density rules, non-clock then clock cells. Changes the database. |
| Post-CTS timing and propagated clocks | |
getAnalysisMode | The current analysis settings, including the clock propagation mode. |
get_clocks -filter "is_propagated_clock == true" | The clocks that are in propagated mode. |
get_propagated_clock -clock <clock> | Whether the clock is ideal or propagated. |
report_clock_timing -type summary | A clock timing summary from the timing engine. |
timeDesign -postCTS -outDir <dir> | Post-CTS setup timing reports. Runs early global route and extraction first. Writes files. |
timeDesign -postCTS -expandedViews -outDir <dir> | The same, with one report directory per view. Writes files. |
timeDesign -postCTS -hold -outDir <dir> | Post-CTS hold timing reports. Runs early global route and extraction first. Writes files. |
timeDesign -postCTS -reportOnly | Reports from the extraction already in memory, with no new extraction. |
| Hold fixing | |
getOptMode -opt_hold_target_slack | The current hold target slack in nanoseconds. |
setOptMode -opt_hold_target_slack <ns> | Sets the hold target slack. Changes the session; record the value. |
optDesign -postCTS -hold -outDir <dir> | Fixes hold violations after CTS and writes prefix_hold.summary. Changes the database. |
optDesign -postCTS -hold -holdVioData <file> | Fixes hold and writes the top 50 remaining hold paths as text and csv. Changes the database. |
| Coverage, clock gating and clock propagation | |
report_analysis_coverage | A coverage summary per check type: checks, met, violated and untested. |
report_analysis_coverage -verbose {violated untested} | The coverage details limited to violated and untested checks. |
report_analysis_coverage -check_type {clock_gating_setup clock_gating_hold} -verbose {violated untested} | Clock gating checks only, with details and slack of violated and untested checks. |
report_clock_gating_check | Every clock gating check, I or L, with setup and hold margins. No path slack. |
report_clock_propagation -clock <clock> -to <pin> | Why a clock does not propagate to a pin, for example an inactive timing arc. |
check_timing | Consistency and completeness checks on the timing constraints. |
| Clock power | |
report_power -clock_network all | Power consumed by the clock networks, including generated clocks. |
report_power -clock_network all -count_seq_elements_in_clock_network | The same, with the leaf flip-flop power included. |
| Only if the block uses UPF or CPF | |
report_ccopt_cell_filtering_reasons -power_domain <domain> | The filtering reasons within one power domain. |