CTS and post-CTS qualification
9.1 Stage purpose
Before this stage, timing was analysed with ideal clocks: every flop saw the clock at the same moment, so the clock network cost nothing. Clock tree synthesis, or CTS, builds the real network. It inserts buffers and inverters, balances the delay from the clock root to every sink (a flop, latch or macro clock pin), and routes the clock nets. The result is described in Figure 12. The delay from the root to a sink is its insertion delay. The spread between the largest and smallest insertion delay in a group of sinks that must be balanced together is the skew, and such a group is a skew group.
The main command is ccopt_design. Run without options it performs clock concurrent optimization, which builds the tree and optimises the clock and the datapath together. With -cts it performs clock tree synthesis only, with no datapath optimisation or useful skew. After either form the clock nets are detail routed and the clocks are switched to propagated mode, which means timing now uses the real clock latencies. The reference says a clock that was already propagated before CCOpt is not switched and gets no source latency update, and that update_io_latency must not be run after ccopt_design.
Four ideas are kept apart in this chapter. Tool completion means the command returned. Analysis coverage means the timing checks you expect were actually evaluated. Stage qualification means the evidence meets your project budgets for skew, insertion delay, slew, hold and legality. Signoff comes later, after detail routing and signoff extraction. A tree can complete, report no violations, and still be unqualified because a clock never reached its flops. Thus, each card below asks what the output proves, and what it leaves unproven.
9.2 Entry prerequisites
| Must already be true | Why |
|---|---|
| Chapters 1 to 8 passed, including legal placement and a CTS readiness check | CTS moves and adds cells, so it needs a legal placement that is already timing-aware. |
| Post-CTS timing constraints are loaded for all active modes, with clocks still ideal | CTS reads the constraints to define clock trees and skew groups, and switches the clocks to propagated itself. |
| Setup and hold analysis views are active, and the primary delay corner is chosen | By default the first setup view sets the primary corner. Choose it explicitly when there are several. |
| Post-CTS uncertainty is jitter only, CPPR is enabled, and OCV or AOCV derates are set | The reference asks for these before CCOpt. Pre-CTS uncertainty left in place counts skew twice once clocks are real. |
| Route types, NDRs and CTS library cells are defined | CTS can only apply rules and cells that exist before it starts. |
| Project budgets for skew, insertion delay, slew and hold exist | This book sets no limits. The reports below show values, and your budget decides. |
9.3 Relevant files and analysis context
CTS works from a clock tree specification: the clock trees, skew groups and CTS properties derived from the timing constraints. The command create_ccopt_clock_tree_spec defines it from all active setup and hold views. With -file it only writes the specification as a script and does not execute it. You then run source on the script, once per session, and delete_ccopt_clock_tree_spec or reset_ccopt_config removes a loaded specification. The script is the best record of what CTS was asked to do.
CTS behaviour is controlled by CCOpt properties, set with set_ccopt_property and read with get_ccopt_property. The ones that matter for qualification are the target maximum transition, the target skew (which the reference says full ccopt_design ignores, see C-04), the route types for leaf, trunk and top nets, the buffer, inverter and clock gating cells, and the primary delay corner. A route type binds a non-default routing rule (NDR), preferred layers and a shield net, and it is created with create_route_type. The route type is only a request, so Section 9.4 checks the routed result.
Record the following with every report, because two runs with different settings are not comparable.
| Record | How | Why |
|---|---|---|
| Specification and properties | create_ccopt_clock_tree_spec -file and save_ccopt_config | The exact clock trees, skew groups and targets CTS used. |
| Primary delay corner | get_ccopt_delay_corner | CTS balances in this corner, and the CTS reports favour its late half. |
| Analysis mode and views | getAnalysisMode and the active view list | Clock propagation, CPPR and the views decide what timing means. |
| Hold target slack | getOptMode -opt_hold_target_slack | A changed target changes how many cells hold fixing adds. |
| Report directory and file names | -outDir and -prefix (clock_opt_design uses -out_dir) | Reports from different stages must not overwrite each other. |
One distinction affects how every report is read. The report_ccopt_* reports use the clock tree timing engine, which is the model CTS itself used. report_ccopt_clock_trees and report_ccopt_skew_groups recalculate timing by default, and report_ccopt_clock_tree_structure shows timing details only with -update_timing. The timing reports of timeDesign and the clock reports of report_clock_timing use the common timing engine. The reference does not say how closely the two engines agree (not verified), so compare them once, and treat the common engine as the one that feeds the stage decision.
9.4 Checks and command cards
9.4.1 Pre-stage checks
| Question it answers | Is the design ready for CTS, and does the specification contain the clocks, skew groups and primary corner you expect? |
|---|---|
| Stage | Before ccopt_design |
| Product | Innovus Implementation. The reference entry names no separate licence requirement for this command. |
| Required state | Chapters 1 to 8 passed; post-CTS constraints loaded; CTS properties set; specification created. |
| Legacy UI | ccopt_design -check_prerequisites check_design -type cts -out_file <report_file> get_ccopt_clock_trees get_ccopt_skew_groups get_ccopt_delay_corner |
| Common UI | Not yet verified No Common UI form is printed. The provided files do not document one. |
|---|---|
| Mapping | Not established in the provided documentation |
| Options used | -check_prerequisites checks that CTS can run, for example that the design is loaded and the options you set are correct, without doing CTS.-type cts runs the checks on clock tree definition, such as constraint targets and route types.-out_file writes the findings as a Tcl dictionary file. |
| Scope and view | Whole design, all active views. |
| Effect on session | writes files. Some commands in this card only read or report. |
| Output | Console messages, a check_design file, and lists of clock tree names, skew group names and the primary corner name. |
| Fields that matter | Clock trees against the clocks in your constraints; skew groups against what you intend to balance; the primary delay corner; check_design findings on targets and route types. |
| Healthy | Every functional clock has a clock tree and a skew group, and the checks report no errors. |
| Warning | The primary corner is the first setup view by default, which may not be the one you meant. |
| Hard stop | A clock in the constraints has no clock tree, or check_design -type cts reports an error on targets or route types. |
| Common misuse | Reading an empty list of clock trees as a pass. No names means no specification yet, or a -file script that was written but not sourced. |
| Root cause and fix | Create or correct the specification, targets and route types, then rerun the checks. |
| Rerun after a fix | Rerun C-01 after any change to the constraints or CTS properties. |
| Verification | Legacy syntax checked against the Innovus Legacy text reference. |
The reference states that check_design -type cts cannot run on the database straight after place_opt_design, and needs the CCOpt options set and the specification loaded. If the block uses UPF, CTS also needs always-on buffers and inverters in its cell lists so that it can buffer across switched domains. That check is not applicable to a flat single-supply block, and the status table in Section 9.6 marks it so. For the clock_opt_design flow the prerequisite check is clock_opt_design -check_cts_config.
9.4.2 Post-stage checks
| Question it answers | Did CTS complete, and what did the log say about errors, warnings and optimisation limits? |
|---|---|
| Stage | After ccopt_design |
| Product | Innovus Implementation. The reference entry names no separate licence requirement for this command. |
| Required state | C-01 passed; the post-CTS setup is applied with clocks still ideal. |
| Legacy UI | ccopt_design ccopt_design -cts report_message -errors -count report_message -warnings -count |
| Common UI | Not yet verified No Common UI form is printed. The provided files do not document one. |
|---|---|
| Mapping | Not established in the provided documentation |
| Options used | -cts turns off clock concurrent optimization and performs only clock tree synthesis with the CCOpt engine. |
| Scope and view | Whole design. |
| Which command to run | The reference describes clock_opt_design as the replacement for ccopt_design when the input database came from place_opt_design V2, and says it legalises placement first. Use the one your flow requires and record it. |
| Effect on session | updates the design database; writes files; runs an expensive analysis. Some commands in this card only read or report. |
| Output | A log with CTS and optimisation messages, routed clock nets, propagated clocks, and for the full form timing reports in ./timingReports. |
| Fields that matter | Error and warning counts by message ID, which accumulate over the whole session, so record them before the run; IMPCCOPT messages; for CCOpt, the table of slack and other metrics at each internal stage, and the worst chain reports in the log. |
| Healthy | The command returns with no errors, and every warning has been read and either fixed or explained. |
| Warning | Warnings about dont_touch nets or clock instances that cannot be resized, which can limit skew balancing and clock quality. |
| Hard stop | Any error message, or a run that leaves clocks ideal or clock nets unrouted. |
| Common misuse | Treating a returned command as a passing stage. Completion says CTS ran, not that skew, slew or timing meet your budget. |
| Root cause and fix | Fix the cause of the first error, restore the saved pre-CTS database, and rerun so the rerun starts from the same state. |
| Rerun after a fix | Rerun C-01, then C-02 and every later card. |
| Verification | Legacy syntax checked against the Innovus Legacy text reference. |
| Question it answers | What is in each clock tree, and do any clock nets have design rule violations (DRVs) in transition, capacitance, length or fanout? |
|---|---|
| Stage | After CTS |
| Product | Innovus Implementation. The reference entry names no separate licence requirement for this command. |
| Required state | ccopt_design completed. |
| Legacy UI | report_ccopt_clock_trees -summary
report_ccopt_clock_trees -file <report_file>
report_ccopt_clock_trees -histograms
report_ccopt_clock_tree_structure -file <report_file>
report_ccopt_clock_tree_drv -num_nets all -file <report_file>
report_ccopt_clock_tree_drv -drv_types {transition max_cap max_source_to_sink_net_length} |
| Common UI | Not yet verified No Common UI form is printed. The provided files do not document one. |
|---|---|
| Mapping | Not established in the provided documentation |
| Options used | -summary shows only the summary table.-file saves a copy of the report.-histograms adds histograms of key information.-num_nets all lists every violating clock net. By default only 10 nets are listed.-drv_types selects the violation types. All types are reported by default. |
| Scope and view | All clock trees, delay corners and views unless you restrict them. |
| Runtime and option note | report_ccopt_clock_trees recalculates timing by default, which takes longer. Its options -no_invalidate and -skip_timing_update reuse existing data. The DRV report has neither option. The reference example for the DRV report writes with -out_file, but its syntax block lists -file, so this card uses -file. |
| Effect on session | writes files. Some commands in this card only read or report. |
| Output | Text reports on the console and, with -file, in files. The DRV report has a constraint summary, a violation summary and a list of violating nets. |
| Fields that matter | Sink counts, Total FF and Max Level; clock gates and macro sinks; fanout histogram; counts of slew, capacitance, resistance, length and fanout violations per tree; the targets and where each came from. |
| Healthy | Each clock tree is present, its sink count matches the design, and every violation count is zero. |
| Warning | 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. |
| Hard stop | A clock tree with no sinks, or violations on fixable clock nets beyond your budget. |
| Common misuse | Reading the numbers as signoff timing, or reading only the default top 10 DRV nets. These reports use the clock tree timing engine, and the summary counts give the total. |
| Root cause and fix | Correct the specification, the ignore and stop pins, the buffering or the targets, and rerun CTS. |
| Rerun after a fix | Rerun C-03 and C-04. |
| Verification | Legacy syntax checked against the Innovus Legacy text reference. |
| Question it answers | For each skew group and corner, what are the insertion delay and the skew, and do they meet the target that CTS was given? |
|---|---|
| Stage | After CTS |
| Product | Innovus Implementation. The reference entry names no separate licence requirement for this command. |
| Required state | ccopt_design completed. |
| Legacy UI | report_ccopt_skew_groups -summary
report_ccopt_skew_groups -file <report_file>
report_ccopt_skew_groups -summarize_stage_depth {buffer inverter}
report_ccopt_pin_insertion_delays -file <report_file> |
| Common UI | Not yet verified No Common UI form is printed. The provided files do not document one. |
|---|---|
| Mapping | Not established in the provided documentation |
| Options used | -summary reports only the summary tables.-file saves the full report.-summarize_stage_depth counts cells of the listed types, here buffers and inverters, on the paths instead of reporting delay. |
| Scope and view | All skew groups in all delay corners unless restricted. |
| Targets and reporting-only groups | By default only the late half of the primary delay corner has a numeric skew target, and the Skew Target Type column shows which corners have one. The reference says target_skew is ignored by ccopt_design, which schedules useful skew, and used by ccopt_design -cts or by a skew group whose constrains property includes ccopt. So for the full form judge insertion delay and slack, not raw skew. Skew groups created for generated clocks are reporting-only by default: they impose no balancing constraint. Add -include_reporting_only_skew_groups to see them. |
| Effect on session | writes files. Some commands in this card only read or report. |
| Output | Summary tables, then min and max path detail per skew group and corner. |
| Fields that matter | Min and max insertion delay, skew against target, skew window occupancy, the sinks at the ends of the min and max paths, and the number of active sinks. |
| Healthy | Insertion delay and skew of every skew group meet your budget in every corner reported. |
| Warning | Skew meets the budget in the primary corner but another corner has no target or misses it. |
| Hard stop | A skew group beyond a target that CTS enforces, or a skew group with no active sinks. |
| Common misuse | Checking one corner only. CTS reports give priority to the late half of the primary delay corner, so other corners need their own look. |
| Root cause and fix | Review sink membership and constraints of the group, then fix the specification or CTS cells. |
| Rerun after a fix | Rerun C-03 and C-04, then C-07. |
| Verification | Legacy syntax checked against the Innovus Legacy text reference. |
| Question it answers | Are the clock nets routed with the NDR, layers and shielding that their route types request? |
|---|---|
| Stage | After CTS |
| Product | Innovus Implementation. The reference entry names no separate licence requirement for this command. |
| Required state | ccopt_design completed; route types defined before CTS. |
| Legacy UI | reportRouteTypeConstraints -summary reportRouteTypeConstraints -detailed -file <report_file> report_route -clock report_route -ndr report_route -shield dbGet -p1 top.nets.isCTSClock 1 |
| Common UI | Not yet verified No Common UI form is printed. The provided files do not document one. |
|---|---|
| Mapping | Not established in the provided documentation |
| Options used | -summary prints the constraint usage per layer, per NDR and per constraint type.-detailed lists each net with a route type constraint and its routing adherence. By default only nets below 80 percent adherence are listed.-clock reports statistics of clock nets.-ndr reports NDR statistics of nets.-shield reports statistics for shielded nets only. |
| Scope and view | All clock nets, or all nets for the route type summary. |
| Link to Chapter 10 | The command commit_ccopt_clock_tree_route_attributes sets isClock and isCTSClock on clock tree nets and applies the route type layers, NDR and shield, so that early global route models clock nets predictably. |
| Effect on session | writes files. Some commands in this card only read or report. |
| Output | Tables on the console. |
| Fields that matter | Route type constraints by category, with INNOVUS_CLK_NDR for clock nets that use an NDR; routing adherence; preferred bottom layer used; wire length and via counts of clock nets; shield statistics; the list of CTS clock nets. |
| Healthy | Every net class that asks for an NDR or a shield shows it in the routed result, with adherence you accept. |
| Warning | Adherence below 100 percent on a few nets. The preferred layers are soft limits that the router may leave. |
| Hard stop | A clock net with an NDR route type that routed at the default rule, or required shielding that is missing. |
| Common misuse | Assuming the NDR exists because the route type was defined. The route type is a request, and only the routed result shows what happened. |
| Root cause and fix | Correct the route type, the NDR definition or the layer range, and rebuild the clock routes. |
| Rerun after a fix | Rerun C-05, C-07 and C-08, because routing changes timing. |
| Verification | Legacy syntax checked against the Innovus Legacy text reference. |
| Question it answers | Are the clock cells legally placed, and do they obey the clock halo and density rules you set? |
|---|---|
| Stage | After CTS |
| Product | Innovus Implementation. The reference entry names no separate licence requirement for this command. |
| Required state | ccopt_design completed; clock halo properties set if halos are used. |
| Legacy UI | checkPlace <report_file> checkPlace -inst <instances> refinePlace report_ccopt_cell_halo_violations -summary cts_refine_clock_tree_placement |
| Common UI | Not yet verified No Common UI form is printed. The provided files do not document one. |
|---|---|
| Mapping | Not established in the provided documentation |
| Options used | -inst limits checkPlace to the listed instances, here the clock instances.-summary reports a summary of clock instances with halo violations. |
| Scope and view | Clock instances for the halo report, the whole design for checkPlace. |
| Side effect | cts_refine_clock_tree_placement refines placement in two passes, first the non-clock instances and then the clock instances, so cells can move. Timing and wire length of the affected nets can change, so rerun the clock and timing cards. |
| Effect on session | adds GUI violation markers; updates the design database; writes files. Some commands in this card only read or report. |
| Output | A halo violation summary, markers in the violation browser, and a checkPlace report. |
| Fields that matter | Clock instances with a cell halo and how many failed; the violating instances and intrusions; checkPlace violation types such as overlap, grid, row orientation and pin access. |
| Healthy | No clock halo violations, and checkPlace reports no violations on clock cells. |
| Warning | A message that a clock halo was disabled on a large cell, so the halo you set was not applied. |
| Hard stop | Overlapping or off-grid clock cells, or halo violations that remain after refinement. |
| Common misuse | Running the halo report with no halo properties set. It checks only the halos defined through the CCOpt halo properties. |
| Root cause and fix | Run cts_refine_clock_tree_placement, rerun the halo report, and fix any remaining overlap with legal placement. |
| Rerun after a fix | Rerun C-06, then C-03 to C-05 and C-07. |
| Verification | Legacy syntax checked against the Innovus Legacy text reference. |
| Question it answers | With real clock latencies, how does setup timing look, and is every intended clock propagated? |
|---|---|
| Stage | After CTS |
| Product | Innovus Implementation. The reference entry names no separate licence requirement for this command. |
| Required state | C-03 to C-06 reviewed. |
| Legacy UI | timeDesign -postCTS -outDir <dir> timeDesign -postCTS -expandedViews -outDir <dir> getAnalysisMode get_clocks -filter "is_propagated_clock == true" get_propagated_clock -clock <clock> report_clock_timing -type summary |
| Common UI | Not yet verified No Common UI form is printed. The provided files do not document one. |
|---|---|
| Mapping | Not established in the provided documentation |
| Options used | -postCTS selects post-CTS analysis: it runs early global route, native default extraction and timing, with setAnalysisMode -clkSrcPath true and -clockPropagation sdcControl.-expandedViews writes view-specific reports in one directory per view. Without it the overall TNS is a worst-over-views value, not a per-view number.-outDir sets the report directory. The default is timingReports. |
| Scope and view | Whole design, all active views. |
| Parasitics | timeDesign -postCTS runs early global route and extraction as part of the command, so these numbers use early-route parasitics. Chapter 10 explains how to judge them. |
| Effect on session | changes analysis configuration; updates the design database; writes files; runs an expensive analysis. Some commands in this card only read or report. |
| Output | Timing reports and a summary in the report directory, and lists of propagated clocks. |
| Fields that matter | Setup WNS, TNS and violating paths by path group, including the reg2cgate group of paths that end in clock gates; DRV counts; density; propagation mode of each clock; clock skew summary. |
| Healthy | Setup WNS and TNS meet the budget in every view, and every intended clock is propagated. |
| Warning | A large jump in negative slack against pre-CTS timing at clock gating endpoints, where real skew now counts. |
| Hard stop | Setup slack beyond budget on register-to-register paths, or a clock still ideal after CTS. |
| Common misuse | Using -idealClock or -reportOnly and reading the result as post-CTS timing. -idealClock forces ideal clocks, and -reportOnly reuses the extraction already in memory. |
| Root cause and fix | Check propagation and skew first, then rerun CCOpt or optDesign -postCTS. |
| Rerun after a fix | Rerun C-07 and C-09. |
| Verification | Legacy syntax checked against the Innovus Legacy text reference. |
| Question it answers | How many hold violations remain, and what did hold fixing add and leave behind? |
|---|---|
| Stage | After C-07 |
| Product | Innovus Implementation. The reference entry names no separate licence requirement for this command. |
| Required state | C-07 reviewed; cell padding removed; filler cells identified with setFillerMode if present. |
| Legacy UI | timeDesign -postCTS -hold -outDir <dir> optDesign -postCTS -hold -outDir <dir> optDesign -postCTS -hold -holdVioData <file> getOptMode -opt_hold_target_slack |
| Common UI | Not yet verified No Common UI form is printed. The provided files do not document one. |
|---|---|
| Mapping | Not established in the provided documentation |
| Options used | -hold on timeDesign, reports hold violations only; on optDesign, corrects hold violations.-holdVioData writes the top 50 remaining hold violation paths as text and csv, with a detailed text file.-outDir sets the report directory. |
| Scope and view | Whole design, all active hold views. |
| Hold target | setOptMode -opt_hold_target_slack sets the hold target in nanoseconds. The reference example uses a negative target to focus on large violations first and finish hold fixing after routing. |
| Effect on session | changes analysis configuration; updates the design database; writes files; runs an expensive analysis. Some commands in this card only read or report. |
| Output | Hold timing reports, prefix_hold.summary, optimisation log messages, and with -holdVioData the remaining-violation files. |
| Fields that matter | Hold WNS, TNS and violating endpoints before and after; cells added; the reasons for remaining violations in the log; setup WNS before and after. |
| Healthy | Hold WNS and TNS meet the budget after fixing, and setup WNS is no worse than before. |
| Warning | Hold violations left for post-route fixing, or a small setup TNS loss, which hold fixing allows by default. |
| Hard stop | Setup WNS worse after hold fixing, or large hold violations with no fix path shown in the log. |
| Common misuse | Setting an unrealistic hold uncertainty. The reference warns that a very large value can insert thousands of extra buffers. |
| Root cause and fix | Correct the hold uncertainty, allowed cells and hold target slack, then rerun hold fixing. |
| Rerun after a fix | Rerun C-07 and C-08, then C-06 and C-09. |
| Verification | Legacy syntax checked against the Innovus Legacy text reference. |
| Question it answers | Which checks actually ran, which were untested and why, and do the clock gating checks pass? |
|---|---|
| Stage | After C-07 |
| Product | Innovus Implementation. The reference entry names no separate licence requirement for this command. |
| Required state | C-07 completed. |
| Legacy UI | report_analysis_coverage -verbose {violated untested}
report_analysis_coverage -check_type {clock_gating_setup clock_gating_hold} -verbose {violated untested}
report_clock_gating_check |
| Common UI | Not yet verified No Common UI form is printed. The provided files do not document one. |
|---|---|
| Mapping | Not established in the provided documentation |
| Options used | -verbose limits the details to checks of the listed status: met, violated or untested.-check_type limits the report to the listed check types. |
| Scope and view | All active views unless -view is given. |
| Finding the break | report_clock_propagation needs -clock and -to. Give it an untested clock pin and the clock, and it reports why propagation stops, for example an inactive timing arc. |
| Effect on session | reads or reports only |
| Output | A coverage summary per check type and a details table; a clock gating check table. |
| Fields that matter | Number of checks, met, violated and untested per type; for each check the pin, reference pin, slack and reason; for gating checks the type, I for inferred or L for library, and the setup and hold margins. report_clock_gating_check lists the checks, not path slack. |
| Healthy | Every untested check has a known, accepted reason, and no clock gating check is violated. |
| Warning | A few untested checks whose reasons are constants or disabled arcs, and that you have reviewed. |
| Hard stop | Untested checks that give no clock at a flop that should be clocked, or a violated clock gating check. |
| Common misuse | Reading a short violation list as a pass. An untested check shows UNTESTED in the slack column, so it can never appear as a violation. |
| Root cause and fix | Use report_clock_propagation with the clock and the pin to see where propagation stops, then repair the path or the constraint. |
| Rerun after a fix | Rerun C-09 and C-07. |
| Verification | Legacy syntax checked against the Innovus Legacy text reference. |
9.5 Required reports, artefacts and how to read them
| Report | Fields that support qualification | Evidence class |
|---|---|---|
| CTS log (C-02) | error and warning counts, IMPCCOPT messages, worst chain, stage table | implementation |
| Clock tree and DRV reports (C-03) | sink counts, levels, gates, violation counts, targets, worst nets | implementation |
| Skew group report (C-04) | insertion delay, skew, target, sink counts | implementation |
| Route type and clock route reports (C-05) | NDR use, adherence, shield, layers | implementation |
| Halo and placement reports (C-06) | halo violations, overlaps, grid errors | implementation |
| timeDesign summaries (C-07, C-08) | setup and hold WNS, TNS, DRV counts, early-route parasitics | preliminary for routing-dependent values |
| Coverage and gating reports (C-09) | untested checks and reasons, gating check status | implementation |
| Clock power report | clock network power, optional leaf flop power | preliminary |
Evidence classes follow the earlier chapters. Preliminary means useful for direction but built on estimates. Implementation means measured on the implemented database at this stage. Signoff means produced by signoff extraction and signoff timing, which this chapter never claims. Post-CTS timing uses early-route parasitics, so it is preliminary for any value that depends on the final routes.
Clock power comes from report_power -clock_network all, which reports the power of the clock networks including generated clocks. Adding -count_seq_elements_in_clock_network includes the leaf flop power. The value depends on the switching activity and the analysis setup, so use it to compare runs made with the same settings, not as a pass or fail number.
report_ccopt_skew_groups -summary ## illustrative layout, ccopt_design -cts Skew group Corner Min ID Max ID Skew Target Sinks clk/func slow:setup.late 0.388 0.411 0.023 0.040 48 clk/func fast:hold.early 0.201 0.236 0.035 - 48 clk/scan slow:setup.late 0.392 0.470 0.078 0.040 21 **WARN: (IMPCCOPT-1437): Found 6 clock tree instances which are user dont_touch and are not resizable - this can impact clock QoR.
The numbers are illustrative, in nanoseconds. The layout is simplified and omits the Skew Target Type column, and the example is read as a run of ccopt_design -cts, where the skew target is enforced. A dash means the corner has no numeric target, which is the reference default for the hold early half. Read the table row by row. The functional group has 48 sinks, which matches Figure 12, and its skew of 0.023 ns is inside the 0.040 ns target in the setup late corner. In the hold early corner it shows 0.035 ns with no target, so there is nothing to meet there and you judge it against your hold budget. The scan group has a skew of 0.078 ns against the same target, so it misses its target even though CTS completed without an error. The warning is a separate finding. Six clock instances are protected from resizing, which can limit how well CTS balances the groups they feed, and it is a likely reason for the scan result.
9.6 Healthy, suspicious and hard-stop examples
| Finding | Status | Why |
|---|---|---|
| ccopt_design returned and nothing else was read | NOT EVALUATED | Completion is not qualification. |
| Every skew group with a CTS target meets it | PASS | The tree is balanced as specified. |
| Skew meets target in the primary corner only | WARN / REVIEW | Corners without a target may fail later. |
| A skew group that CTS constrains misses its target | HARD STOP | Timing closure will fight an unbalanced group. |
| Clock DRVs only on dont_touch nets | WARN / REVIEW | CTS may be unable to fix them. |
| A clock net with an NDR route type routed at the default rule | HARD STOP | Resistance and coupling differ from the design intent. |
| A clock is still ideal after CTS | HARD STOP | Timing shows no clock latency. |
| Untested checks with a constant or disabled arc as reason | WARN / REVIEW | Acceptable once each is reviewed. |
| Always-on buffer checks in a single-supply block | NOT APPLICABLE | No power domains exist. |
9.7 Debugging, corrective action and reruns
Work from the clock outwards. Start with propagation and sink membership, because a clock that does not reach its flops makes every later number meaningless. Then read skew and insertion delay, then DRVs, then routes, and only then post-CTS timing. A timing failure that appears only after CTS is usually a clock problem, and fixing it in the datapath treats the symptom.
When a card fails, rerun from the earliest affected card. A change to the specification or to a CTS property needs the whole chapter again, because CTS rebuilds the tree. A route type is a CCOpt property, so changing it also needs the whole chapter. A legalisation fix needs C-03 to C-09 only. Keep the report from the failing run next to the report from the fixed run, so that the improvement is shown rather than assumed.
9.7.1 Worked example: a clean run of ccopt_design -cts with a scan skew group that misses its target
Suppose C-02 shows no errors, and C-03 shows both clock trees with the expected sink counts and no clock DRVs. C-04 then gives the summary in Section 9.5: the functional group is balanced and the scan group is not. The CTS warning about six non-resizable clock instances is the first lead. Compare the sinks at the ends of the min and max paths of the scan group, which the full skew group report lists with their pin names, against the instances the warning names. The warning says only that those instances cannot be resized, so check whether the late sinks sit behind one before blaming it. In a full ccopt_design run the same skew would not be a failure by itself, because CCOpt schedules useful skew.
The decision for C-04 is HARD STOP. The fix belongs to whoever owns the protection: allow resizing with the dont_touch value that permits it, or move the affected sinks out of the group or mark them as ignore pins if the specification allows it. Then restore the pre-CTS database and rerun from C-01. Note that the numbers in this example are illustrative, and your project budget decides what skew is acceptable.
9.8 Exit criteria and stage checklist
- Specification. Clock trees, skew groups and primary corner match the constraints, and the specification is saved.
- Completion. ccopt_design finished with no errors, and every warning is fixed or explained.
- Tree. Sink counts match the design, and no unexplained special pins remain.
- Balance. Every skew group meets the target CTS enforced, and insertion delay and slack meet budget in every corner reported.
- DRVs. Clock DRV counts are zero, or only on nets you have reviewed and accepted.
- Routes. Clock nets show the NDR, layers and shielding their route types request.
- Legality. No clock halo or placement violations on clock cells.
- Timing. Post-CTS setup and hold meet the budget with every intended clock propagated.
- Coverage. Untested checks and clock gating checks are reviewed, and each reason is accepted.
Thus, CTS is qualified when the tree matches its specification, its nets and cells are legal, and timing with real clocks is acceptable and fully covered. A tree that only completed can hide a skew group, a missing NDR or an unclocked flop until detail routing, where the repair costs far more. Chapter 10 builds on this state: it estimates routing congestion and parasitics with the clock routes and rules kept in place.
9.9 Sanity check cheat sheet: CTS and post-CTS
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. Judge every row against your project budgets, because this book sets no universal limits.
| Card | Check and when | Command | Healthy | Review | Hard stop |
|---|---|---|---|---|---|
| C-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. |
| C-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. |
| C-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. |
| C-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 budget in 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. |
| C-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. |
| C-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. |
| C-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. |
| C-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. |
| C-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. |
9.10 Command cheat sheet: CTS and post-CTS
Legacy UI commands. Angle brackets are placeholders, and values shown are examples, not project limits.
| Command | What it produces |
|---|
| 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. |