Skip to content
Ch 08 / 16 Chapter 8: Clock tree synthesis readiness
CHAPTER 8

Clock tree synthesis readiness

Clock tree synthesis builds the clock network from what you tell it: which clocks exist, which pins are sinks, how the nets are routed, which cells may be used and what skew and transition to aim for. Mistakes in those inputs produce a clock tree that is wrong in a way every later stage inherits. This chapter checks the inputs before the tool builds anything.

8.1 Stage purpose

Clock tree synthesis (CTS) replaces the single ideal clock net of each clock with a tree of buffers, inverters and clock gates, and routes it. This chapter does not run CTS. It checks that the design, the constraints and the CTS configuration are ready, so that the run in the next stage is a test of the tree and not of your setup. Figure 11 shows the objects involved.

A clock tree is the part of the netlist that CTS buffers, from a clock source down to the pins it must reach. A sink is a pin the tree must reach and balance, typically the clock pin of a register. A skew group is a set of sinks that must arrive together, and it is the CTS counterpart of an SDC clock. Insertion delay is the delay from the clock source to a sink, and skew is the difference in that delay between two sinks.

CTS names three kinds of net. A leaf net connects to one or more sinks. A trunk net is any other net in the tree. A top net is a trunk net above a sink count that you choose, and it exists only if you set that count. A non-default rule (NDR) gives a net wider wires or larger spacing than the default, and a route type binds an NDR to preferred layers and a shield. Shielding means running wires tied to a power or ground net beside the clock wire, so that neighbouring signals cannot disturb its timing.

Readiness is cheaper to check than a tree is to rebuild. A wrong sink list, a missing macro delay or an unusable cell list costs a full CTS run.

The four ideas of this book stay apart. Tool completion means a command ended. Analysis coverage means a report examined the clocks and views you needed. Stage qualification means the evidence meets your project budgets. Signoff is a later stage and is not claimed here. The checks in this chapter read configuration and constraints, so they give implementation evidence. Any timing figure taken at this point uses ideal clocks and is preliminary evidence.

8.2 Entry prerequisites

Must already be trueWhy
Chapter 7 passed: placement is legal, density and congestion are within budget, pre-CTS timing was reviewedCTS adds cells to a placement. A placement that is illegal or full leaves it nowhere to put them.
Constraints are loaded for every constraint mode, and the clocks are defined but not set to propagatedThe specification is built from the active views. The reference says to keep the clocks ideal in the constraint files used for CTS.
A clock plan exists: clock names, sources, sink counts, clock gates, macro clock pins and modesEvery check below compares the tool against it.
The routing layer plan and the clock net rules are decidedRoute types can only name rules and layers that already exist.
Project budgets for skew, insertion delay, transition and clock routing resource existThis book sets none of those numbers.

8.3 Relevant files and analysis context

CTS reads the design in memory, the constraint modes and analysis views, the clock tree specification, and a set of CCOpt properties. CCOpt is the clock engine of the tool. A property is a named setting that you read with get_ccopt_property and change with set_ccopt_property, either globally or for one object such as a clock tree, a net type or a pin.

The specification comes from create_ccopt_clock_tree_spec, which analyses all active setup and hold views. With -file it writes an editable Tcl script and does not execute it, and the script records why each setting was made. You source that script once. Sourcing it again gives the error that clock trees are already defined, and delete_ccopt_clock_tree_spec or reset_ccopt_config removes the earlier one. The second command also clears every value set with set_ccopt_property, so use it only when you mean to start the configuration again. Store the script with the run.

Order matters. A pin type set with the sink_type property takes effect only if it is set before the specification is created. The quick start in the reference sets the route types, cell lists and targets before it creates the specification, and the cards follow that order: constraints, rules, cells, targets, specification, then the checks that read the specification, and finally the tool check. Cards K-06 and K-07 can repeat, because a pin type found there must be set before the specification is created again.

8.3.1 Ideal and propagated clocks

An ideal clock reaches every register at the time the clock definition says, with no delay through a clock network. A propagated clock includes the delay of the actual buffers and wires. Before CTS there is no network to propagate through, so clocks are ideal. The reference says timeDesign and optDesign at the pre-CTS stage use -clkSrcPath false with -clockPropagation forcedIdeal. In the setter, -clockPropagation defaults to sdcControl, which follows the set_propagated_clock assertions in the constraints.

After CTS the situation reverses. The reference states that CCOpt switches the timing clocks to propagated mode and updates the source latencies so that input and output timing stays correct. It adds that update_io_latency is not needed after ccopt_design and gives invalid results if used. Thus, a readiness check does not try to prove skew. It proves that the clocks are defined, are ideal and are about to be replaced by a tree built to a stated intent.

Clock net topologyclock rootVSS shieldtrunk, NDRVSS shieldICGmacro RAM0CK pin has aninsertion delayignore pin5 flop sinks4 gated sinks1 macro sinkBalanced: 9 flop sinks and 1 macro pin, 10 in all. Not balanced: 1 ignore pin. Clock gates: 1.Layers: trunk on M4, drops on M3, leaf nets on M2. The lower shield opens where a branch drops.Track cost of the trunk rule, seven tracks at pitch P = w + st-3t-2t-1t0t+1t+2t+31 track(a) default rulet-3t-2t-1t0t+1t+2t+33 tracks(b) 2W2St-3t-2t-1t0t+1t+2t+35 tracks(c) 2W2S + shieldpitch PLegendclock netother signalVSS shieldblockedCost ledger, illustrative: w = 10, s = 16, P = 26 drawing units(a) default1 track used, 6 left for other signals(b) 2W2Swidth 2w, spacing 2s: t-1 and t+1 break the spacing, so 3 tracks, 4 left(c) 2W2S + shieldshields on t-2 and t+2, so 5 tracks, 2 left; the trunk gives up 4 tracks against (a)Per 100 tracks of trunk100, 300 and 500 track-lengths for (a), (b) and (c)
Figure 11. Clock net topology and the track cost of the trunk routing rule
Read it. The top panel shows one clock root driving a trunk on M4 with a VSS shield on each side. Four branches leave the trunk: five direct flop sinks, one clock gate that drives four gated flop sinks, one macro clock pin that has an internal insertion delay, and one ignore pin. The clock tree balances nine flops and one macro pin, ten sinks in all, and does not balance the ignore pin. The bottom panel compares three routing rules on the same seven tracks. The default rule uses one track and leaves six. Double width with double spacing uses three and leaves four, because the two neighbouring tracks cannot be used. Adding a shield on each side uses five and leaves two. The ledger counts 100, 300 and 500 track-lengths per 100 tracks of trunk. All dimensions are illustrative.

8.4 Checks and command cards

8.4.1 Pre-stage checks

Before the cards, write the clock plan down and keep it with the run. It is the document the tool output is compared against.

List, for each clock, its name, source pin and modes, its sink count, any clock gates, generated clocks and clock-selecting muxes, the routing rule for each net type with its layers, the allowed buffers, inverters and clock gates, the transition target, skew target and useful skew intent, and every macro clock pin with its internal delay. Cards K-01 to K-08 compare the tool with these items.

Then confirm that the Chapter 7 exit checklist is complete, and save the design so that the placement baseline can be restored if the clock configuration has to be repeated. If the netlist is hierarchical, run checkUnique -verbose: the reference says CTS requires each module to be instantiated once.

8.4.2 Post-stage checks

K-01Clock definitions and propagation state
Question it answersAre all intended clocks defined, does every generated clock have a source, and are the clocks still ideal?
StageBefore the specification
ProductInnovus Implementation. The reference entry names no separate licence requirement for this command.
Required stateConstraints loaded in every active mode. Chapter 7 passed.
Legacy UI
check_timing -type clocks -verbose
report_clocks
getAnalysisMode -clockPropagation
report_clocks -source_insertion -insertion
Common UINot yet verified No Common UI form is printed. The provided files do not document one.
MappingNot established in the provided documentation
Options used
-type clocks limits check_timing to the clock warnings.
-verbose gives detail for each warning.
-source_insertion -insertion report the source and network insertion delays asserted on the clock waveforms.
-clockPropagation reads how the timer treats clock end points. The default of the setter is sdcControl.
Scope and viewAll views, or one view if -view is given.
Why ideal is expectedThe default warning set of check_timing includes ideal_clock_waveform. Before CTS it is information, and it confirms that the clocks have not been propagated. A clock that is absent from that list may be propagated already, so open the constraint file and look. getAnalysisMode shows the timer setting only. After the Chapter 7 timing and optimisation commands it reads forcedIdeal whatever the constraints say, so it cannot show a propagated assertion in the constraints.
Effect on sessionreads or reports only
OutputA warning table and a clock waveform report.
Fields that matterClock names, periods and waveforms. The warnings clock_expected, no_gen_clock_source, master_clk_edge_not_reaching, clock_crossing, ideal_clock_waveform and clock_not_propagated. Latencies asserted in the constraints.
HealthyEvery planned clock is listed and the clock findings are only ideal-clock warnings.
WarningA clock_crossing finding with an owner, or a latency in the constraints that the clock plan does not list.
Hard stopA planned clock is missing, a generated clock has no source, or the constraints propagate the clocks, which limits pre-CTS optimisation.
Common misuseFixing ideal_clock_waveform with set_propagated_clock. The reference offers that as the way to clear the warning, but the CTS flow expects ideal clocks at this stage.
Root cause and fixCorrect create_clock or create_generated_clock in the constraints, take propagated assertions out of the files used for CTS, reload them, and rerun.
Rerun after a fixRerun K-01, then L-07 and L-08 if the constraints changed.
VerificationLegacy syntax checked against the Innovus Legacy text reference.
K-02Constants, clock sense and gating
Question it answersDo constants and gating checks match the clock plan, so that clocks stop where they should?
StageBefore the specification
ProductInnovus Implementation. The reference entry names no separate licence requirement for this command.
Required stateK-01 reviewed. Case analysis is part of the constraint files.
Legacy UI
report_case_analysis -propagated
report_clock_gating_check
Common UINot yet verified No Common UI form is printed. The provided files do not document one.
MappingNot established in the provided documentation
Options used
-propagated adds the pins whose constant value comes from propagation, not only the pins with a set_case_analysis constraint.
Scope and viewWhole design. Both reports accept a view or an object list.
Why this belongs hereThe reference lists missing constants as a cause of the clock graph running into the datapath. The check is cheap here and expensive after a long CTS run.
Effect on sessionreads or reports only
OutputA case analysis table and a gating check report.
Fields that matterPins with constants, especially select pins of clock multiplexers. Constants that appear only by propagation. Each clock gating check and its type.
HealthyEach mode-select pin that steers a clock mux is constant in its mode, and each planned clock gate has a gating check.
WarningA constant that exists only by propagation, so no constraint states the intent behind it.
Hard stopA mux select left free in a mode, so the clock spreads into the datapath. K-07 then shows large path counts.
Common misuseReading a clean gating report as proof that every clock reaches its sinks. The report covers gating checks only.
Root cause and fixAdd set_case_analysis, or set_clock_sense with -stop_propagation, to the constraints, then reload.
Rerun after a fixRerun K-02 and K-07.
VerificationLegacy syntax checked against the Innovus Legacy text reference.
K-03Clock net routing rules
Question it answersDo leaf, trunk and top nets each have a route type, and does the track cost of the rules fit the routing budget?
StageAfter K-02, before the specification
ProductInnovus Implementation. The reference entry names no separate licence requirement for this command.
Required stateLayer plan decided. NDRs defined in LEF or added with add_ndr.
Legacy UI
get_ccopt_property route_type -net_type trunk
add_ndr -name <ndr_name> -width_multiplier {<layers> 2} -spacing_multiplier {<layers> 2} -generate_via
create_route_type -name <route_type> -non_default_rule <ndr_name> -top_preferred_layer <layer> -bottom_preferred_layer <layer> -shield_net VSS
set_ccopt_property -net_type trunk route_type <route_type>
set_ccopt_property routing_top_min_fanout <n>
Common UINot yet verified No Common UI form is printed. The provided files do not document one.
MappingNot established in the provided documentation
Options used
-width_multiplier -spacing_multiplier set wider wires and larger spacing for the listed layers.
-generate_via generates vias for the new width. The reference recommends it when the metal is wider than the default.
-non_default_rule -shield_net bind an NDR and a shield net into a route type.
-top_preferred_layer -bottom_preferred_layer name the preferred layer pair. They must be different layers, and the router may leave them if it must.
-net_type selects leaf, trunk or top for the route_type property.
Scope and viewPer net type, and optionally per clock tree.
RecommendationsFor trunk nets the reference recommends double width and double spacing with shielding on middle to higher layers. For leaf nets it recommends double width on middle layers. It also advises giving each net type one pair of layers with the same pitch, width and spacing, which improves the match between estimated and final routes. The track cost in the figure is a planning estimate, not a tool report.
Effect on sessionchanges analysis configuration; updates the design database. Some commands in this card only read or report.
OutputThe route type name for each net type, and the rule definitions.
Fields that matterThe route type of each net type. The NDR, layers and shield of each route type. The top net threshold, if one is set.
HealthyEach net type names a route type, and the track cost of each rule, as in the figure, fits the routing budget.
WarningExtra spacing or shielding on leaf nets, which the reference says can consume too much routing resource.
Hard stopA net type that the plan wants ruled has none, or a rule whose track cost the routing budget cannot afford.
Common misuseAssuming a route type applies once it exists. It applies only after the route_type property assigns it to a net type, and top rules are unused until the top threshold is set.
Root cause and fixCreate or correct the route type, assign it, and recount the tracks.
Rerun after a fixRerun K-03 and K-10.
VerificationLegacy syntax checked against the Innovus Legacy text reference.
K-04Clock cell lists
Question it answersWhich buffers, inverters and clock gates may CTS use, and did any of them get filtered out?
StageAfter K-03, before the specification
ProductInnovus Implementation. The reference entry names no separate licence requirement for this command.
Required stateLibrary cells chosen. Dont_use decisions recorded.
Legacy UI
get_ccopt_property buffer_cells
report_ccopt_cell_filtering_reasons -cell_type buffer -file <f>
set_ccopt_property buffer_cells {<buf_a> <buf_b>}
set_ccopt_property inverter_cells {<inv_a> <inv_b>}
set_ccopt_property clock_gating_cells {<icg_a> <icg_b>}
Common UINot yet verified No Common UI form is printed. The provided files do not document one.
MappingNot established in the provided documentation
Options used
-cell_type selects the cell type whose filtering is reported.
buffer_cells inverter_cells clock_gating_cells are the three lists. Leave the buffer list empty and CCOpt selects cells itself.
Scope and viewGlobal, per clock tree, or per power domain.
Multi-supply designsOnly if the block uses UPF: lists can be set per power domain, and always-on buffers and inverters must be included. This is marked not applicable for the flat single-supply block of this book.
Effect on sessionchanges analysis configuration; writes files. Some commands in this card only read or report.
OutputThe lists, and a filtering report that is also written to the log.
Fields that matterThe cells in each list. For each filtered cell, the reason, such as unbalanced rise and fall delays, too tall, not available in all views, library trimming, or a mismatch between LEF and liberty data.
HealthyThe three lists are set on purpose, and every listed cell survives filtering in every view.
WarningSome listed cells are filtered for a reason you accept, such as library trimming.
Hard stopNo usable inverter, buffer or clock gate remains for a clock tree, or a listed cell is missing in a view.
Common misuseForgetting that a listed cell overrides dont_use. A cell kept out of normal use can then appear in the clock.
Root cause and fixChange the lists, or fix the library or MMMC setup that the filtering reason names.
Rerun after a fixRerun K-04 and K-10.
VerificationLegacy syntax checked against the Innovus Legacy text reference.
K-05Targets and useful skew intent
Question it answersAre the transition target, skew target and useful skew effort what the clock plan says?
StageAfter K-04, before the specification
ProductInnovus Implementation. The reference entry names no separate licence requirement for this command.
Required stateLibrary time unit known. The clock plan states whether skewing is wanted.
Legacy UI
get_ccopt_property target_max_trans
getOptMode -opt_skew_ccopt
getDesignMode
set_ccopt_property target_max_trans 100ps -net_type leaf
set_ccopt_property target_skew 50ps
setOptMode -opt_skew_ccopt standard
setDesignMode -earlyClockFlow true
Common UINot yet verified No Common UI form is printed. The provided files do not document one.
MappingNot established in the provided documentation
Options used
target_max_trans is the transition target. The reference shows it set per net type.
target_skew is the skew target for CCOpt-CTS. ccopt_design without -cts ignores it, and extreme effort ignores skew targets unless a skew group is set to restrict skewing.
-opt_skew_ccopt sets the useful skew effort to none, standard or extreme.
-earlyClockFlow enables clock tree building inside place_opt_design. Set the CTS configuration before that command runs.
Scope and viewGlobal, per net type, per clock tree or per skew group.
Useful skew intentUseful skew means moving sink arrival times on purpose to give slack to a critical path. With effort none no skewing is allowed. Standard allows local changes to the clock network. Extreme optimises clock and datapath together, runs only in ccopt_design, takes much longer, and the reference advises good ideal-mode timing first. A cap on how far skewing can raise the largest insertion delay is the property auto_limit_insertion_delay_factor, default 1.5. Write the intent down: whether to skew, how far, and why.
Effect on sessionchanges analysis configuration. Some commands in this card only read or report.
OutputThe property values and the mode settings.
Fields that matterEach target with its unit. The value auto, which means the SDC target or an automatic default is used. The useful skew effort. The flow effort and the early clock flow switch.
HealthyThe transition target is explicit and in known units, and the skew target and useful skew effort match the plan and the flow.
WarningA target left as auto, where the plan accepts the SDC value or the automatic default.
Hard stopA target in the wrong unit, such as 100 read as 10 ns, or one that check_design -type cts lists as a problem.
Common misuseTyping a bare number. It is read in the library unit, which get_time_unit reports.
Root cause and fixWrite the unit, for example 100ps, and set the targets again.
Rerun after a fixRerun K-05 and K-10.
VerificationLegacy syntax checked against the Innovus Legacy text reference.
K-06Clock tree specification
Question it answersDoes the tool see the clock trees and skew groups the clock plan lists?
StageAfter K-05
ProductInnovus Implementation. The reference entry names no separate licence requirement for this command.
Required stateRules, cell lists and targets set. Special pins that need sink_type are already set. Views are active.
Legacy UI
create_ccopt_clock_tree_spec -file <spec.tcl>
source <spec.tcl>
get_ccopt_clock_trees *
get_ccopt_skew_groups *
delete_ccopt_clock_tree_spec
Common UINot yet verified No Common UI form is printed. The provided files do not document one.
MappingNot established in the provided documentation
Options used
-file writes the specification as a script that is not executed. Until you source it once, no clock tree or skew group exists. Without -file the trees are defined directly, and no reasons are stored.
Scope and viewAll active setup and hold views, unless -views limits the list.
Skew groupsA skew group balances one clock in one mode. Groups can share sinks. A group can be non-constraining, which makes it a reporting aid, for example for a divided clock. For sinks that conflict between modes, the specification adds an ignore pin to a group so that a path is not balanced where it is never active. The reference says an extra skew group is frequently recommended for architectural clock gates.
Effect on sessionupdates the design database; writes files. Some commands in this card only read or report.
OutputA specification script, and the lists of tree and skew group names.
Fields that matterOne clock tree per clock source and a generated clock tree where a divider is a sequential element. One skew group per clock per constraint mode, and the reasons recorded in the script.
HealthyEach planned clock has a tree, each clock in each mode has a skew group, and nothing extra appears.
WarningA tree for a redundant generated clock, or a skew group in a mode that the plan does not use.
Hard stopA planned clock has no tree or skew group, or the specification was created before the special pins were final.
Common misuseRunning the script twice. The tool answers that the clock trees are already defined. Delete the specification first, or use reset_ccopt_config to clear the properties too.
Root cause and fixFix the constraints or the pin types, delete the specification, create it again.
Rerun after a fixRerun K-06 and K-07.
VerificationLegacy syntax checked against the Innovus Legacy text reference.
K-07Sinks, special pins and convergence
Question it answersAre the sinks the ones you expect, are ignore and stop pins deliberate, and does the clock graph stay out of the datapath?
StageAfter K-06
ProductInnovus Implementation. The reference entry names no separate licence requirement for this command.
Required stateSpecification created. K-02 clean.
Legacy UI
report_ccopt_clock_trees -list_special_pins -file <f>
get_ccopt_clock_tree_sinks -in_clock_trees <clock_tree>
set_ccopt_property sink_type ignore -pin <pin>
check_ccopt_clock_tree_convergence -warnthreshold <n>
report_ccopt_clock_tree_convergence -num_worst_sinks <n> -file <f>
Common UINot yet verified No Common UI form is printed. The provided files do not document one.
MappingNot established in the provided documentation
Options used
-list_special_pins lists stop, ignore and other special pins one by one.
-in_clock_trees limits the sink list to named trees.
-warnthreshold warns for sinks with more clock paths than the given number. The generated specification uses a default of 100.
-num_worst_sinks names the sinks with the most clock paths.
sink_type set on a pin to ignore, stop or exclude. Set it before the specification exists.
Scope and viewAll clock trees.
Pin typesA stop pin ends the tracing of the tree and is balanced as a sink. An ignore pin is part of the tree for design rule buffering but is not a sink in any skew group. The reference suggests that set_clock_sense with -stop_propagation can be better than an ignore pin, because it keeps the timing model and the CTS configuration in step. An exclude pin is not part of the tree, but may share a net with clock fanout.
Effect on sessionchanges analysis configuration; writes files. Some commands in this card only read or report.
OutputA tree summary, sink lists and a convergence report.
Fields that matterSinks per tree, special pins and their types, clock gates per depth, and the number of clock paths leading to each sink.
HealthySink counts match the clock plan, every special pin is deliberate, and no sink has an unusually high clock path count.
WarningExtra ignore pins that nobody asked for, or a few sinks with many paths that the plan explains.
Hard stopData pins counted as sinks, or large path counts from missing constants, which slow CCOpt and are not optimised as datapath.
Common misuseSetting sink_type after the specification exists. The pin is then only marked, and the tree below it stays.
Root cause and fixCorrect the constraints, or set the pin type, then delete the specification and create it again.
Rerun after a fixRerun K-06 and K-07.
VerificationLegacy syntax checked against the Innovus Legacy text reference.
K-08Macro and sink insertion delays
Question it answersDo macro clock pins and other sinks with an internal clock delay carry the insertion delay the plan assumes?
StageAfter K-06
ProductInnovus Implementation. The reference entry names no separate licence requirement for this command.
Required stateSpecification created. Macro clock delays known from the macro data.
Legacy UI
set_ccopt_property insertion_delay <value> -pin <macro_ck_pin>
report_ccopt_pin_insertion_delays -file <f>
Common UINot yet verified No Common UI form is printed. The provided files do not document one.
MappingNot established in the provided documentation
Options used
-file writes the report to a file.
insertion_delay -pin sets the delay assumed inside a clock pin. Positive values lower the clock arrival time at that pin.
Scope and viewAll sinks in all clock trees, in the primary CTS corner by default.
Worked relationThe specification turns a clock latency of 1.456 and a pin latency of 0.234 into a pin insertion delay of 1.222, their difference. Pin latencies override clock latencies and are not added to them. The values are the reference example, and your macro data decides yours.
Effect on sessionchanges analysis configuration; writes files
OutputA pin insertion delay report.
Fields that matterEach pin, its insertion delay and where the value came from, such as the constraints or a user setting.
HealthyEach macro clock pin has an insertion delay from the constraints or a recorded property, and its source is known.
WarningInsertion delays on many ordinary sinks, which the reference says can raise clock area and power.
Hard stopA macro clock pin with an internal clock delay and no insertion delay in the constraints or the properties.
Common misuseOverriding a value without looking. A pin set_clock_latency is turned into the property by the specification, so read the value and its source in the report first.
Root cause and fixState the macro delay by a pin set_clock_latency or by the insertion_delay property. If the specification is created again, keep the delays with delete_ccopt_clock_tree_spec -preserve_sink_insertion_delays.
Rerun after a fixRerun K-06 and K-08.
VerificationLegacy syntax checked against the Innovus Legacy text reference.
K-09Clock halos and protected clock objects
Question it answersDo existing clock instances respect their halos, and does dont_touch stop CTS from resizing or buffering a clock cell or net?
StageAfter K-07
ProductInnovus Implementation. The reference entry names no separate licence requirement for this command.
Required stateSpecification created and cell lists set. Dont_touch decisions recorded.
Legacy UI
report_preserves -dont_touch
report_ccopt_cell_halo_violations -summary
Common UINot yet verified No Common UI form is printed. The provided files do not document one.
MappingNot established in the provided documentation
Options used
-summary prints the count of instances with a halo and of failed instances per clock.
-dont_touch limits report_preserves to dont_touch settings.
Scope and viewClock instances for the halo report. The whole design for the preserves report.
Halo defaultsBy default the halo comes from cell_density, default 0.75, and adjacent_rows_legal, default false. The report checks the halos set by the three property pairs the reference lists, which include cell_halo_x and cell_halo_y.
Effect on sessionreads or reports only
OutputA halo summary and a preserves report.
Fields that matterPer clock, the instances that have a halo and the ones that fail it. Dont_touch entries on cells and nets that sit in the clock tree.
HealthyNo clock instance violates a halo, and each dont_touch inside the clock tree is on the clock plan.
WarningA few halo violations that the plan accepts, each with an owner.
Hard stopA dont_touch on a cell or net inside the tree that CTS must resize or buffer, with no plan for it.
Common misuseTaking zero halo violations before CTS as proof for the finished tree. CTS has not yet inserted its buffers, so repeat the report after CTS.
Root cause and fixChange the halo properties or the placement of the instances, or lift the dont_touch where the plan allows.
Rerun after a fixRerun K-09 and K-10.
VerificationLegacy syntax checked against the Innovus Legacy text reference.
K-10Tool prerequisite check
Question it answersDoes the tool consider the configuration complete, and which problems does it list?
StageLast check before CTS
ProductInnovus Implementation. The reference entry names no separate licence requirement for this command.
Required stateK-01 to K-09 reviewed. Specification loaded and CCOpt options set.
Legacy UI
ccopt_design -check_prerequisites
check_design -type cts -out_file <f>
clock_opt_design -check_cts_config
Common UINot yet verified No Common UI form is printed. The provided files do not document one.
MappingNot established in the provided documentation
Options used
-check_prerequisites runs the setup, library and design checks of ccopt_design without running CTS.
-type cts selects the clock tree definition checks of check_design.
-out_file writes the complete list.
-check_cts_config is the equivalent for clock_opt_design, which belongs to the place_opt_design V2 flow.
Scope and viewWhole design and every clock tree.
Limits of the checkcheck_design -type cts needs the specification and the CCOpt options. The reference states it cannot run on the database straight after place_opt_design, before they exist.
Effect on sessionwrites files. Some commands in this card only read or report.
OutputA status block and problem tables on the console, and a file from check_design.
Fields that matterDesign configuration problems, for example a net length limit that is too small or too many locked clock instances. Clock tree problems, for example a target that is too low or drivers that are too weak. Missing usable cells, skew groups that cannot be balanced without raising insertion delay, and preserved cells that cannot be resized.
HealthyNo design or clock tree configuration problem is listed and check_design reports no errors.
WarningWarnings with an owner, such as a tight target that the project accepts.
Hard stopThe tool says it cannot run ccopt_design, or check_design finds errors, in which case the reference says the script stops.
Common misuseReading a clean result as qualification. It says the run can start, not that the tree will meet skew or timing.
Root cause and fixFix the item the table names, using the card that owns it.
Rerun after a fixRerun K-10 and the owning card.
VerificationLegacy syntax checked against the Innovus Legacy text reference.

8.5 Required reports, artefacts and how to read them

ReportFields that support qualificationEvidence class
Clock report and check_timing clock warnings (K-01)clock list; warning types and counts; asserted latenciesimplementation
Case analysis and gating reports (K-02)constants on clock-steering pins; gating checksimplementation
Specification script and name lists (K-06)trees; skew groups per mode; recorded reasonsimplementation
Tree report with special pins, convergence report (K-07)sinks per tree; special pins; clock paths per sinkimplementation
Route type and cell list records (K-03, K-04)route type per net type; lists; filtering reasonsimplementation
Target and mode record (K-05)targets with units; useful skew effortimplementation
Pin insertion delay report (K-08)macro pin delays and their sourceimplementation
Halo and preserves reports (K-09)halo failures; dont_touch inside the treeimplementation
Prerequisite output and check_design file (K-10)configuration problems by treeimplementation
Reading a clock warning summarySynthetic report, not tool output
check_timing -type clocks -verbose                       ## illustrative excerpt
   Warning                  Description                                     Number
   ideal_clock_waveform     Clock waveform is ideal                             3
   no_gen_clock_source      No clock source found for generated clock           1
   clock_crossing           Clock domains interact                              2

Assume the clock plan lists three clocks. The three ideal-clock warnings match them, so none has been propagated, which is what you want. The no_gen_clock_source line is a hard stop for that clock. A divided clock whose source pin is not driven by a clock source has no master, so the specification cannot tie its tree to a parent. The two crossings are information if the plan lists the clock pairs, and a question if it does not. The counts here are illustrative.

Reading a prerequisite checkSynthetic report, not tool output
ccopt_design -check_prerequisites                        ## illustrative excerpt
CCOpt configuration status: cannot run ccopt_design.
Check the log for details of problem(s) found:
---------------------------------------------------
Design configuration problems
---------------------------------------------------
One or more clock trees have configuration problems
---------------------------------------------------
Clock tree configuration problems:
------------------------------------------------------
Clock tree      Problem
------------------------------------------------------
clk_div2        The maximum transition target is too low
clk_div2        The selected drivers are too weak
------------------------------------------------------
clk_core        The selected drivers are too weak

The status line says the run cannot start, so this is a hard stop for K-10 and the tool has not built anything. The first block says only that some trees have problems, and the table names them. Two of the three findings are about drivers that are too weak, and the divided clock has a low transition target as well. Weak drivers and a tight target are linked, because a tight target needs strong drivers. Look at the cell lists in K-04 and the target in K-05 together, and read the filtering reasons before widening either one. The names and the problems in this excerpt are illustrative.

8.6 Healthy, suspicious and hard-stop examples

FindingStatusWhy
Every planned clock defined, still idealPASSThe tree will be built from the intended clocks.
Generated clock without a sourceHARD STOPCTS cannot tie its tree to a parent clock.
Constraints already propagate the clocksHARD STOPPropagated clocks limit pre-CTS optimisation. Keep clocks ideal in the files used for CTS.
A few sinks with high path counts, explained in the planWARN / REVIEWRuntime may grow. Confirm the constants first.
Data pins counted as clock sinksHARD STOPCTS would balance and buffer the datapath.
Targets left as autoWARN / REVIEWThe SDC value or an automatic default is used. Record it.
Transition target in the wrong unitHARD STOPThe tree is built to a target that is wrong by a large factor.
A required view is not active when the specification is builtNOT EVALUATEDThe specification does not cover that view.
Power-domain cell lists and halos in a single-supply blockNOT APPLICABLENo power domains exist.

8.7 Debugging, corrective action and reruns

Fix problems in the order the configuration is built. Constraints come first (K-01, K-02), then rules, cells and targets (K-03 to K-05), then pin types and the specification (K-06, K-07), then insertion delays, halos and protected objects (K-08, K-09), and last the tool check (K-10). A change to the constraints or to a pin type changes the specification, so delete it and create it again. The tool documentation is not consistent on whether pin properties survive the delete, so list them afterwards with get_ccopt_property. A change to a rule, a list or a target needs its own card and K-10 to run again. The reference does not say that these changes require a new specification, so confirm the new value with the matching get command.

Keep the specification script and a record of the properties with each attempt. When a CTS result is poor later, the first question is whether the configuration changed, and a stored record answers it.

8.7.1 Worked example: a transition target that is 100 times too large

Suppose the library time unit is 0.1 ns, and someone sets the top net target with a bare number. K-05 shows the property and the unit, and the tool log shows what the tool took from it.

A bare number read in the library unitSynthetic report, not tool output
get_time_unit                                            ## illustrative excerpt
0.100000ns
set_ccopt_property -net_type top target_max_trans 100
ccopt_design -check_prerequisites
...
Clock tree balancer configuration for clock_trees ...
Slew time target (top): 10000.0ps

The unit is 0.1 ns, so 100 means 10 ns, which the log shows as 10000 ps. The reference examples use targets such as 100ps and 150ps, so a target of 10 ns is off by a large factor. Do not rely on the prerequisite check to catch it. The decision for K-05 is HARD STOP. The reference gives this same case and notes that a target that is too low or too high harms runtime and quality, and that check_design -type cts cross-checks transition targets.

Writing the unit explicitlyIllustrative values
set_ccopt_property -net_type top target_max_trans 100ps   ## illustrative correction

After the correction, read the log line again, rerun K-05 and K-10, and check that the target for leaf and trunk nets still has its unit. The numbers in this example are illustrative. Your clock plan and library set the real values.

8.8 Exit criteria and stage checklist

  • Clocks. Every planned clock is defined, has its source, and is still ideal.
  • Constants. Clock-steering pins are constant in each mode, and gating checks exist.
  • Specification. Trees and skew groups match the clock plan, and the script is stored.
  • Sinks. Sink counts match the plan, special pins are deliberate, and path counts are explained.
  • Routing rules. Each net type has a route type, and its track cost fits the routing budget.
  • Cells. Buffer, inverter and clock gating lists are set, and no listed cell is filtered out.
  • Targets. Transition and skew targets have units, and the useful skew intent is written down.
  • Macros. Every macro clock pin has an insertion delay with a known source.
  • Tool check. ccopt_design -check_prerequisites and check_design -type cts list no problems.

Thus, the design is ready for clock tree synthesis when the clocks are defined and ideal, the tool sees the trees and sinks the plan lists, the rules, cells and targets are explicit, and the tool agrees that the configuration can run. That is configuration evidence. It says nothing yet about skew, insertion delay or timing with a real tree. The next stage builds the clock tree and qualifies it with propagated clocks.

CHAPTER 8 SANITY CHECKS

8.9 Sanity check cheat sheet: CTS readiness

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.

CardCheck and whenCommandHealthyReviewHard stop
K-01Clock definitions and propagation state
Before the specification
check_timing -type clocks -verbose
report_clocks
getAnalysisMode -clockPropagation
Every planned clock is listed and the clock findings are only ideal-clock warnings.A clock_crossing finding with an owner, or a latency in the constraints that the clock plan does not list.A planned clock is missing, a generated clock has no source, or the constraints propagate the clocks, which limits pre-CTS optimisation.
K-02Constants, clock sense and gating
Before the specification
report_case_analysis -propagated
report_clock_gating_check
Each mode-select pin that steers a clock mux is constant in its mode, and each planned clock gate has a gating check.A constant that exists only by propagation, so no constraint states the intent behind it.A mux select left free in a mode, so the clock spreads into the datapath. K-07 then shows large path counts.
K-03Clock net routing rules
After K-02, before the specification
get_ccopt_property route_type -net_type trunk
add_ndr -name <ndr_name> -width_multiplier {<layers> 2} -spacing_multiplier {<layers> 2} -generate_via
create_route_type -name <route_type> -non_default_rule <ndr_name> -top_preferred_layer <layer> -bottom_preferred_layer <layer> -shield_net VSS
Each net type names a route type, and the track cost of each rule, as in the figure, fits the routing budget.Extra spacing or shielding on leaf nets, which the reference says can consume too much routing resource.A net type that the plan wants ruled has none, or a rule whose track cost the routing budget cannot afford.
K-04Clock cell lists
After K-03, before the specification
get_ccopt_property buffer_cells
report_ccopt_cell_filtering_reasons -cell_type buffer -file <f>
set_ccopt_property buffer_cells {<buf_a> <buf_b>}
The three lists are set on purpose, and every listed cell survives filtering in every view.Some listed cells are filtered for a reason you accept, such as library trimming.No usable inverter, buffer or clock gate remains for a clock tree, or a listed cell is missing in a view.
K-05Targets and useful skew intent
After K-04, before the specification
get_ccopt_property target_max_trans
getOptMode -opt_skew_ccopt
getDesignMode
The transition target is explicit and in known units, and the skew target and useful skew effort match the plan and the flow.A target left as auto, where the plan accepts the SDC value or the automatic default.A target in the wrong unit, such as 100 read as 10 ns, or one that check_design -type cts lists as a problem.
K-06Clock tree specification
After K-05
create_ccopt_clock_tree_spec -file <spec.tcl>
source <spec.tcl>
get_ccopt_clock_trees *
Each planned clock has a tree, each clock in each mode has a skew group, and nothing extra appears.A tree for a redundant generated clock, or a skew group in a mode that the plan does not use.A planned clock has no tree or skew group, or the specification was created before the special pins were final.
K-07Sinks, special pins and convergence
After K-06
report_ccopt_clock_trees -list_special_pins -file <f>
get_ccopt_clock_tree_sinks -in_clock_trees <clock_tree>
set_ccopt_property sink_type ignore -pin <pin>
Sink counts match the clock plan, every special pin is deliberate, and no sink has an unusually high clock path count.Extra ignore pins that nobody asked for, or a few sinks with many paths that the plan explains.Data pins counted as sinks, or large path counts from missing constants, which slow CCOpt and are not optimised as datapath.
K-08Macro and sink insertion delays
After K-06
set_ccopt_property insertion_delay <value> -pin <macro_ck_pin>
report_ccopt_pin_insertion_delays -file <f>
Each macro clock pin has an insertion delay from the constraints or a recorded property, and its source is known.Insertion delays on many ordinary sinks, which the reference says can raise clock area and power.A macro clock pin with an internal clock delay and no insertion delay in the constraints or the properties.
K-09Clock halos and protected clock objects
After K-07
report_preserves -dont_touch
report_ccopt_cell_halo_violations -summary
No clock instance violates a halo, and each dont_touch inside the clock tree is on the clock plan.A few halo violations that the plan accepts, each with an owner.A dont_touch on a cell or net inside the tree that CTS must resize or buffer, with no plan for it.
K-10Tool prerequisite check
Last check before CTS
ccopt_design -check_prerequisites
check_design -type cts -out_file <f>
clock_opt_design -check_cts_config
No design or clock tree configuration problem is listed and check_design reports no errors.Warnings with an owner, such as a tight target that the project accepts.The tool says it cannot run ccopt_design, or check_design finds errors, in which case the reference says the script stops.
CHAPTER 8 CHEAT SHEET

8.10 Command cheat sheet: Clock tree synthesis readiness

Legacy UI commands. Angle brackets are placeholders, and values shown are examples, not project limits.

CommandWhat it produces
Clock definitions and propagation state
report_clocksThe clocks from create_clock and create_generated_clock: waveforms and uncertainties.
report_clocks -source_insertion -insertionThe source and network insertion delays asserted on clock waveforms, as min:typ:max values.
check_timing -type clocks -verboseClock warnings with detail: missing clocks and generated clock sources, ideal clocks, crossings.
check_timing -check_only {ideal_clock_waveform clock_not_propagated}Lists ideal clocks and ideal clocks that reach a timing check. Expected before CTS.
report_case_analysisThe ports and pins that carry a set_case_analysis constraint.
report_case_analysis -propagatedAdds the pins whose constant value comes from propagation.
report_clock_gating_checkEvery clock gating check in the design, with its type.
getAnalysisMode -clockPropagationHow clock end points are treated, ideal or propagated. The setting is sdcControl, forcedIdeal or autoDetectClockTree.
get_time_unitThe time unit of the session, which decides how a bare number such as 100 is read by CTS properties.
Clock tree specification and skew groups
get_ccopt_clock_trees *The names of every clock tree defined by the specification.
get_ccopt_skew_groups *The names of every skew group. One is created per SDC clock per constraint mode.
create_ccopt_clock_tree_spec -file <spec.tcl>Writes the specification as a Tcl script without running it. Without -file the trees are defined directly. Writes a file.
source <spec.tcl>Runs the script, once. Until then no clock tree or skew group exists. Changes the database.
delete_ccopt_clock_tree_specDeletes skew groups and CTS configuration. Add -preserve_sink_insertion_delays to keep pin insertion delays. Changes the database.
reset_ccopt_configDeletes the specification and every value set with set_ccopt_property. Changes the database.
Sinks, special pins and convergence
get_ccopt_clock_tree_sinks -in_clock_trees <clock_tree>The pins that are sinks of the named clock trees.
report_ccopt_clock_trees -list_special_pins -file <f>The clock tree report with stop, ignore and other special pins listed one by one. Writes a file.
check_ccopt_clock_tree_convergence -warnthreshold <n>A warning for every sink with more than n clock paths leading to it.
report_ccopt_clock_tree_convergence -num_worst_sinks <n> -file <f>A summary of convergence above sinks and the n sinks with the most clock paths. Writes a file.
set_ccopt_property sink_type ignore -pin <pin>Marks a pin as an ignore pin so that it is not balanced. Set it before the specification is created. Changes a CCOpt property.
Routing rules and cell lists
get_ccopt_property buffer_cellsThe buffer list for CTS. An empty list means CCOpt selects cells automatically.
report_ccopt_cell_filtering_reasons -cell_type buffer -file <f>Why library cells of one type were filtered out for each clock tree. Writes a file.
add_ndr -name <ndr_name> -width_multiplier {<layers> 2} -spacing_multiplier {<layers> 2} -generate_viaAdds a non-default rule with wider wires and larger spacing. Changes the database.
create_route_type -name <route_type> -non_default_rule <ndr_name> -top_preferred_layer <layer> -bottom_preferred_layer <layer> -shield_net VSSA route type that binds an NDR, a preferred layer pair and a shield net. Changes the database.
set_ccopt_property -net_type trunk route_type <route_type>Applies a route type to all trunk nets. The same form works for leaf and top. Changes a CCOpt property.
set_ccopt_property routing_top_min_fanout <n>Trunk nets above n sinks become top nets. Changes a CCOpt property.
set_ccopt_property buffer_cells {<buf_a> <buf_b>}Sets the buffers CTS may use, overriding dont_use for them. Changes a CCOpt property.
Targets, insertion delays and useful skew
get_ccopt_property target_max_transThe transition target. The value auto means the SDC target, or an automatic default, is used.
get_ccopt_property target_skewThe global skew target used by CCOpt-CTS.
getOptMode -opt_skew_ccoptThe useful skew effort: none, standard or extreme.
report_ccopt_pin_insertion_delays -file <f>The pin insertion delays at clock tree sinks. Writes a file.
set_ccopt_property target_max_trans 100ps -net_type leafA transition target for leaf nets. 100ps is an example. Changes a CCOpt property.
set_ccopt_property target_skew 50psA skew target for CCOpt-CTS, ignored by ccopt_design without -cts. 50ps is an example. Changes a CCOpt property.
set_ccopt_property insertion_delay <value> -pin <macro_ck_pin>The delay assumed inside a macro clock pin. Changes a CCOpt property.
setOptMode -opt_skew_ccopt standardSets the useful skew effort for ccopt_design and optDesign -postCTS. Changes a mode setting.
setDesignMode -earlyClockFlow trueEnables the early clock flow inside place_opt_design. Changes a mode setting.
Readiness checks and halos
ccopt_design -check_prerequisitesThe setup, library and design checks of ccopt_design, without running CTS. It prints the problems found.
clock_opt_design -check_cts_configThe same prerequisite check for the place_opt_design V2 flow. It makes no changes.
check_design -type cts -out_file <f>Checks of the clock tree definition, such as constraint targets and route types. Needs the specification loaded. Writes a file.
report_ccopt_cell_halo_violations -summaryPer clock, the clock instances with halos and the ones that violate them.
report_preserves -dont_touchThe dont_touch settings that affect optimisation, including those on clock cells and nets.
After CTS (for reference)
ccopt_design -ctsClock tree synthesis only, without datapath optimisation or useful skew. Changes the database.
report_ccopt_skew_groups -file <f>Insertion delay and skew per skew group and corner. Writes a file.