Skip to content
Ch 12 / 14 Chapter 12: Clock Trunk Planning
← Prev Next →

CHAPTER TWELVE

Clock Trunk Planning: A Coarse Spine Is Not a Finished Tree

By the end of this chapter you will know what a clock is, what a clock trunk is, and what a clock tree still has to do later. You will load a CTS constraint mapping file. You will grow clock-trunk endpoints inside shaped blocks. You will check the design before you grow a spine. You will choose the editable flavour or the push-down flavour on purpose. And you will treat a returned spine as a heartbeat, not as a finished clock tree.

Why this chapter matters in a real project

Think of a chip as a city of rooms. Power is already in the streets from Chapter 10. The data bus already has a map from Chapter 11. What the city still lacks is a shared heartbeat. That heartbeat is the clock. Every flip-flop that belongs to a clock must see the same repeating tick, or the rooms will disagree about “now.”

Sit with Nimbus-8 the morning after Chapter 11. The 128-bit CPU–NPU bus has a map through the leftover channel. VDD and VSS are metal. The rooms are shaped. And yet clk_cpu still has no agreed spine from the port to the cluster. A clock trunk is a coarse map for that heartbeat. It starts at the clock source. It ends at a clock-trunk endpoint. It is not a wire to every flip-flop. Clock tree synthesis, later, still grows those last twigs.

If you skip this chapter, two expensive things happen. Either clock tree synthesis invents a clock path through a room you needed for the bus, or you later discover that two NPU copies do not share a clock pin. The leftover 2.091 mm² = 2,091,000 µm² channel is still where this spine lives. The mesh on M4 and M5 is still not a clock layer you steal because it looks fat.

One more thing, because it will happen to you. You will type synthesize_clock_trunks. It will return 1. That means the spine command finished. It does not mean the feasibility check was clean. It does not mean every endpoint has a delay you would defend. It does not mean report_clock_trunk_qor is a number you would ship. Those are other commands.

Prerequisites

Chapter 11, because the leftover channel already holds a bus map and you must not park a clock spine through the ISP sofa. Chapter 10, because M4 and M5 already carry the 20 µm power mesh. Chapter 9, because blocks are shaped. Chapter 8, because a module is a name and a block is a physical room — trunk endpoints sit in rooms, not in names.

Multiply instantiated block, then MIB: two copies of the same drawing. On Nimbus-8 the two NPU copies share NPU_CORE. In this flow they are read-only. Their clock pins are placed by hand before you start. The library is nimbus8.dlib. The top is NIMBUS8.

How to read the numbers and the notation in this chapter

Read this table slowly. Every later command uses these words. If a word here is still fog, stop and read the row again before you type Tcl.

Table 12.1 How to read the numbers, units and the symbols in this chapter
You will seeRead it asWhat you need to know
clocka repeating tickFrequency is how often. Period is the time between ticks. clk_cpu is 1.60 GHz, so the period is 625 ps.
clock portthe sourceWhere the tick enters the design. Query it with get_ports. Do not invent the name.
sinka cell that uses the clockUsually a flip-flop. This chapter does not finish every sink.
clock trunk / spinea coarse clock mapSource to endpoint. Not a finished clock tree. Not every flip-flop.
clock tree synthesis (CTS)the later treeCTS still grows the twigs from endpoints to flip-flops.
top-level clock-trunk arcthe walk across leftover glueThe teal line in the leftover channel. Intent, not a routed tree.
block clock pinthe door into a roomWhere the clock enters a block. Not the same as an endpoint.
block-level clock-trunk arcthe walk inside the roomFrom the door toward the endpoint, still inside that block.
clock-trunk endpointthe last station this chapter ownsA pin or port with a phase delay behind it, toward the sinks.
feedthrough pina visitThe clock walks through a room that is not the destination. Not a sink.
phase delaytime from endpoint to sinksAn estimate. Teaching: 0.200 ns = 200 ps on a 625 ps period.
anchor cella buffer or inverter on the trunkInserted during block-level planning from CTS constraints.
mapping filewhich CTS Tcl belongs to which blockKeyword CTS_CONSTRAINT. Without it, block-level CTP does not start.
THO flavouroptimize_subblocksBlocks are editable. Three stages. MPH and multivoltage allowed.
push-down flavourpush_downBlocks are read-only. No MPH, no MV. Then push_down_clock_trunks.
CTP pin constraintwhich sides may take a clock pinOptional, additive, beats ordinary pin constraints for this flow.
side 1leftmost lowest edgeThen clockwise. 0 is illegal. On CPU, leftover faces side 3.
MIBmultiply instantiated blockTwo copies, one drawing. Read-only here. Place clock pins by hand first.

Learning objectives

After this chapter you will be able to:

  1. Say what a clock, a period, a source, a sink, a trunk, and an endpoint are, in plain words.
  2. Write a CTS_CONSTRAINT mapping file for Nimbus-8 and load it, knowing that without -reset maps append.
  3. Place MIB clock pins by hand before any trunk command, because copies are read-only in this flow.
  4. Run block-level synthesize_clock_trunk_endpoints with -clocks, and plant a black-box endpoint with set_clock_trunk_endpoints.
  5. Read report_clock_trunk_endpoints, including the dominant * and the -script write-back.
  6. Run check_design_for_clock_trunk_planning -clock (no s) before the top-level spine.
  7. Set optional CTP pin constraints with -cells, legal sides, and a feedthrough policy you said out loud.
  8. Choose optimize_subblocks or push_down on purpose, and name the documented spelling conflict.
  9. Synthesize with the plural command, then taste with report_clock_trunk_qor, without treating return 1 as CTS.
Chapter 12 hero: four gates, the Nimbus-8 die with a teal clock spine through the leftover channel from a gold clock port.
Figure 12.1 Same die you already know. The gold dot is the clock port. The teal line is a map from that port through the leftover 2.091 mm² channel. It is not a finished tree. Teaching purpose: one picture of the job, and where the spine lives, before any command is typed.

The beginner’s mental model

A subway trunk line is not every streetcar

Hold a city map that shows only the trunk line from the central station to the last interchange. The twigs that run from that interchange to every house are someone else’s drawing. A clock trunk is that trunk line. The source is the clock port. The last interchange is the endpoint. The houses are flip-flops. Clock tree synthesis still owns the houses.

The analogy stops being silicon quite quickly, and that is the point. An endpoint can have a delay behind it that is only an estimate. Two NPU copies can share one drawing and still disagree about a clock pin you never placed. A cheerful return value means the spine command finished. Tasting is report_clock_trunk_qor.

Left: atlas buffers on a trunk from a gold port to a maroon endpoint. Right: atlas D flip-flops as later CTS leaves.
Figure 12.2 Buffers on the spine. Flip-flops are sinks this chapter does not finish. Atlas symbols mark the walk and the leaves so you can see the cut. Teaching purpose: stop a trunk being mistaken for a finished clock tree.

The precise engineering model

The database already has shaped blocks, a leftover channel, a compiled power grid, and a bus map. Clock trunk planning adds a second spine on that geometry. You load CTS constraints through a mapping file. You grow endpoints inside blocks — or you plant them by hand on a black box. You check whether the design can even accept a trunk. You optionally fence the sides that may take a clock pin. Then you synthesize a top-level spine that compensates those endpoint delays and tries to share a common path between blocks that talk to each other.

Two flavours exist and they are not a style choice. plan.clock_trunk.flow_control set to optimize_subblocks treats blocks as editable. That is the THO flavour: it supports multiple levels of physical hierarchy and multivoltage, and it has three named stages. Set to push_down, blocks are read-only, CTS parks cells on top of them, and push_down_clock_trunks commits the topology. Push-down does not support MPH or multivoltage. A nearby flow sentence writes pushdown without the underscore. The command-page example writes push_down. New Tcl uses the underscore. Confirm with man.

The practical loop is kind to beginners. Write the mapping file. Place MIB clock pins. Grow block endpoints. Report them. Check feasibility. Optionally set CTP sides. Choose a flavour and read it back. Synthesize. Taste. Four small walks are easier to debug than one giant one.

Eight numbered gates from mapping file through QoR, with a navy bar naming the singular versus plural synthesize command.
Figure 12.3 The precise model is a loop with a named check before the spine. The flow picture and the command page do not use the same verb. Teaching purpose: make the debug boundary and the named conflict explicit.

Concepts built from first principles

Why? Because a clock that “looks routed” in a screenshot can still be a spine that never reached an endpoint, or a flavour whose rules you mixed. First we name the objects. Then we type commands.

Part 1 — What a trunk actually is

Do not start with a command. Start with the thing the command is trying to build. If you cannot point at a source, a walk, a door, and a last station on a sketch, the Tcl will only hide the fog.

What a clock is

A digital chip does not think in continuous time. It thinks in ticks. A clock is a repeating electrical tick that tells flip-flops when to capture a new value. Frequency is how many ticks happen each second. We write it in gigahertz. One gigahertz is one thousand million ticks per second. Period is the time from one tick to the next. Period is one divided by frequency.

On Nimbus-8 the teaching clock is clk_cpu at 1.60 GHz. Period = 1 / 1.60 GHz = 0.625 ns = 625 ps. Every flip-flop on that clock must finish its work inside that 625 ps window. If the clock arrives late at one room and early at another, the rooms disagree about “now.” That disagreement is why we plan a spine instead of hoping the later tree will invent a fair path.

The source is the clock port: the pin or port where the tick enters the design you are planning. The sink is a cell that uses that tick. The usual sink is a D flip-flop. Query the source with get_ports. Query the clock object with get_clocks. Teaching names in this book are stand-ins. On a real netlist you ask the design. You do not type a name from memory.

Beginner plate: a square-wave period of 625 ps, a gold clock port as source, and an atlas D flip-flop as sink.
Figure 12.4 A clock is a repeating tick. Frequency says how often. Period is the gap between ticks. The port is the source. The flip-flop is a sink. Teaching purpose: give a complete beginner the three words source, period, and sink before any trunk command.

What a trunk is, and what a tree still is

If you wired the clock port straight to every flip-flop, two things would go wrong. The wire would be huge. And rooms that talk to each other would not share a common walk, so their clocks would skew in ways you cannot budget. A clock trunk is the coarse answer. It is a shared spine from the source to a small number of last stations, called endpoints. Buffers or inverters on that spine are anchor cells. They strengthen the tick so it can travel across leftover glue without dying.

A clock tree is the later, finer drawing. Clock tree synthesis (CTS) still grows twigs from each endpoint to the flip-flops behind it. This chapter does not run CTS to completion. It gives CTS a spine to honour. If you treat the trunk as “the clock is done,” you will ship a map and call it a tree.

Say it out loud: trunk first, tree later. The command that grows the trunk is synthesize_clock_trunks — plural. The flow picture nearby writes the singular. The singular has no command page. New Tcl uses the plural. Confirm with man.

Left: atlas buffers on a trunk from port to endpoint. Right: many atlas D flip-flops as a later CTS tree.
Figure 12.5 Left is this chapter. Right is clock tree synthesis, which still owns the leaves. Teaching purpose: stop a beginner calling a spine a finished tree.

The six names on one spine

The flow picture of this step uses six names. Keep them apart. Mixing any two is how a later report becomes a mystery.

  1. Clock port. The source. Gold in the figures. On Nimbus-8 you query it; you do not invent clk_cpu as a typed string you hope exists.
  2. Top-level clock-trunk arc. The walk across leftover glue, from the port toward a block. This is the teal spine in the leftover 2.091 mm² channel.
  3. Block clock pin. The door into a room. The clock enters CPU_CLUSTER here. A door is not a last station.
  4. Block-level clock-trunk arc. The walk inside that room, from the door toward the endpoint. Still planning. Still not every flip-flop.
  5. Clock-trunk endpoint. The last station this chapter owns. A pin or port with a phase delay annotated toward the sinks. The delay is an estimate of how long the later twigs will take.
  6. Feedthrough pin. A visit. The clock walks through a room that is not the destination. A buffer in that middle room is not a sink and not an endpoint.

Flip-flops remain CTS’s problem. Pin assignment for every bundle remains Chapter 13. This chapter may place some clock pins as a consequence of the spine. That is not the pin-assignment chapter.

Six named objects: clock port, top-level arc, block clock pin, block-level arc, endpoint, and a feedthrough visit with an atlas buffer.
Figure 12.6 Port, walk, door, inside walk, last station, visit. Flip-flops are not in this list. Teaching purpose: teach the six flow names with a picture, not a slogan.

The teaching delay, and the four clocks on Nimbus-8

Phase delay sits behind the endpoint, toward the sinks. It is not the period. It is not signoff insertion delay. On Nimbus-8 the teaching number is 0.200 ns = 200 ps. That is about one third of the 625 ps clk_cpu period. We choose a third so you can see it on a ruler. We label it an estimate so you do not ship it.

A nearby command-page example uses -delay 20. If the unit is nanoseconds, that is 20,000 ps. On a 625 ps period that is thirty-two ticks of fiction. Do not copy it. If you omit -delay, the trunk planner estimates the number. Saying the number out loud with both units is the grown-up move.

Nimbus-8 has four named clocks. The teaching spine today is the first one. The others still exist, and you still query them.

Table 12.1b The four Nimbus-8 clocks, with period in two units
ClockFrequencyPeriodRole in this chapter
clk_cpu1.60 GHz0.625 ns = 625 psThe teaching spine, leftover channel into CPU_CLUSTER
clk_npu1.10 GHz0.909 ns = 909 psThe MIB lesson: two NPU copies, pins by hand first
clk_isp800 MHz1.250 ns = 1,250 psPresent. Not the first spine you grow
clk_apb200 MHz5.000 ns = 5,000 psSlow bus clock. Still a real clock. Still query it
Trap. Typing a clock name from this table without get_clocks is how a teaching stand-in becomes a syntax error on a real netlist. The table is a map. The design is the source of truth.
A 625 ps period bar with a 200 ps teaching endpoint delay marked, and a note that -delay 20 is thirty-two cycles of fiction.
Figure 12.7 Period is the whole tick. Endpoint delay is only the estimated time behind the last station. 200 ps is a teaching estimate, not signoff. Teaching purpose: stop a beginner copying -delay 20 onto a 625 ps clock.

Do not confuse these

Table 12.1c Pairs that beginners mix, and the one-sentence repair
ThisIs not thisRepair
Clock trunkClock treeTrunk is source to endpoint. Tree is endpoint to flip-flops, later.
Clock portBlock clock pinPort is the source. Pin is the door into a room.
Block clock pinEndpointThe door is not the last station. The endpoint has a delay behind it.
Feedthrough pinSinkA visit is not a destination. The buffer in the middle room is not a flip-flop.
Phase delayClock periodDelay sits behind the endpoint. Period is the whole tick.
synthesize_clock_trunksCTS doneReturn 1 is a heartbeat. CTS still owns the leaves.
Clock pin from the spinePin assignmentSome clock pins may move. Every bundle waits for Chapter 13.
What changes if… you skip this part and jump to the mapping file? You will load constraints for an object you cannot point at. The commands will run. The picture in your head will be a tree. The database will hold a spine. That gap is how quiet success gets shipped.
A clock is a repeating tick. A trunk is a coarse spine from a queried port to a reported endpoint. Six names live on that spine. CTS still owns the flip-flops. 200 ps on a 625 ps period is an estimate, not a tree.

Part 2 — Constraints and the mapping file

Before a trunk can exist, both the block and the top need CTS-quality constraints. Constraints are rules the later tree must obey, used now so the spine is realistic. They include maximum capacitance, maximum transition, ignored layers, clock-tree reference cells, a driving cell, and nondefault routing rules. Those settings live in Tcl files. You do not type them as a pile of one-liners in the trunk session. You keep them in files, one file per reference block.

The mapping file is a table of contents. Each line says: this reference owns this kind of file. The keyword for this chapter is CTS_CONSTRAINT. Other kinds exist — SDC, UPF, PG — and they are not this cook. Load the map with:

# Teaching map. One CTS file per reference, including the top
icc2_shell> set_constraint_mapping_file -reset ./ctp_mapfile
Table 12.2 set_constraint_mapping_file switches
SwitchWhat it doesTeaching note
-reset aloneClears the map on the current design.Empty is empty. Nothing is loaded.
-reset with a filenameReplaces the saved map with the file.This is the teaching load.
filename onlyAppends the file to the saved map.A second load without -reset is how two CTS files claim one block.

The file itself is ordinary text. Each line is block_design_name constraint_type file_name. Teaching lines:

# ctp_mapfile
CPU_CLUSTER  CTS_CONSTRAINT  constraints/cpu_ctp.tcl
NPU_CORE     CTS_CONSTRAINT  constraints/npu_ctp.tcl
ISP          CTS_CONSTRAINT  constraints/isp_ctp.tcl
SOC_PERIPH   CTS_CONSTRAINT  constraints/soc_ctp.tcl
NIMBUS8      CTS_CONSTRAINT  constraints/top_ctp.tcl

Read the reset rule twice. Without -reset, a second load appends. That is how you silently own two CTS files for the same block. With -reset and a filename, the new map replaces. -reset alone clears. Block-level trunk planning will not start for a block that has no CTS_CONSTRAINT line. Virtual clocks are skipped. A block clock whose master cannot be traced to a top-level clock is ignored.

Inside those Tcl files you set layers with set_ignored_layers. On Nimbus-8 you do not steal M4 and M5. Those layers already hold the power mesh from Chapter 10. You do not invent a layer. You query the library, you write a minimum and a maximum you would defend, and you read the option back. The leftover channel is geometry. The layers are a CTS constraint, not a feeling about fat metal.

Teaching ctp_mapfile with one CTS_CONSTRAINT line per Nimbus-8 reference, and a note of the commands that live in those files.
Figure 12.8 The map is a list of recipes. Empty is not a constraint. Append is not a replace. Teaching purpose: stop block-level CTP being run against a file the block never owned.

Part 3 — The MIB prior

A multiply instantiated block, then MIB, is two copies of the same drawing. On Nimbus-8, u_npu_core_0 and u_npu_core_1 both use the reference NPU_CORE. In this flow those copies are read-only. The tool will not invent a clock pin on a drawing you share. You place both clock pins by hand before you start. That is not a style. It is a prior.

Propagating a topology plan in Chapter 11 copied a bus map. It did not place a clock pin. Alignment in Chapter 11 checked rows and tracks. It did not place a clock pin. Do this first, then grow endpoints. Even if today’s teaching spine is only clk_cpu, you still place the NPU clock pins, because clk_npu is the MIB lesson and you will need that prior.

Trap. Starting trunk planning on an MIB whose clock pin is still unplaced is how a later QoR report becomes a mystery. The copies share a drawing. The pin still needs a location on both instances.

Part 4 — Block-level endpoints

Block-level planning answers a simple question: for this room, where should the last station sit, and how long will the later twigs take? The command estimates clock latency and inserts anchor cells. synthesize_clock_trunk_endpoints computes seed locations for clock ports, creates endpoints, and annotates phase delay. It uses clock tree synthesis as a measuring tape, based on block size, sink count, driving cell, and the CTS constraints you just mapped. If the block clock ports are already placed or fixed, seed-finding is skipped. The command supports multithreading. Prerequisites: blocks are shaped, and top-level flip-flops are placed.

The flag here is -clocks, with an s. Confirm the clock with get_clocks before you pass it.

# -clocks takes the s. Confirm the clock with get_clocks
icc2_shell> synthesize_clock_trunk_endpoints \
    -blocks {CPU_CLUSTER NPU_CORE ISP SOC_PERIPH} \
    -clocks [get_clocks clk_cpu]
Table 12.3 synthesize_clock_trunk_endpoints switches
SwitchWhat it doesTeaching note
-blocksChild reference designs to plan, bottom-up if many levels.Write CPU_CLUSTER, not u_cpu_cluster. Omit it and every child at every level is attempted.
-clocksWhich clocks to grow. Maps top clocks to block clocks.Takes the s. Virtual clocks are skipped. Default is all clocks.
-auto_clock connected\|local\|allAssociates block clocks with top clocks by a named rule.Mutually exclusive with -clocks.
-host_optionsDistributed host option. Plural on this command.If omitted, the tool looks for a global host option.
-work_dirWhere scripts and logs land.Default is the host’s work dir, or ./work_dir.
-estimate_timingRuns VIPO on blocks that use abstracts, after block-level CTP.Does not run VIPO at the top.

For a black box you cannot synthesize, plant the endpoint by hand. The flag on this command is -clock, no s. Teaching delay 0.200 ns = 200 ps. Confirm the pin with get_pins.

# Teaching delay 0.200 ns = 200 ps. Confirm the pin with get_pins
icc2_shell> set_clock_trunk_endpoints \
    [get_pins {u_cpu_cluster/clk}] -clock [get_clocks clk_cpu] \
    -delay 0.200
Table 12.4 set_clock_trunk_endpoints switches
SwitchWhat it doesTeaching note
pins or portsThe objects that become endpoints.Query with get_pins. Brace Tcl indexes.
-clockWhich clock owns this endpoint.No s. Default is all clocks — a wide broom.
-delayPhase delay from endpoint to sinks, in nanoseconds.Teaching: 0.200 = 200 ps. Do not copy 20.
-cornersWhich corners get this endpoint.Default is all corners.
-auto_clock connected\|local\|allAssociates block clocks with top clocks.Mutually exclusive with -clock.

A nearby command-page example uses -delay 20. That is twenty nanoseconds. On a 625 ps period that is thirty-two cycles of fiction. Do not copy it. If you omit -delay, the phase delay is undefined and the trunk planner estimates it.

Atlas schematic: clock port, two buffers, a maroon endpoint, then a D flip-flop sink with a dashed clock pin.
Figure 12.9 The endpoint is the last station this chapter owns. The flip-flop is a sink with an estimated delay behind it. Teaching purpose: put 200 ps on a 625 ps period, and label it an estimate.

Report what you just grew. Dominant endpoints — worst downstream phase delay from a given block clock pin — are marked *. Dominance is per clock and per corner; a winner in one corner may lose in another. Read the star. Do not assume last week’s winner is this corner’s winner.

icc2_shell> report_clock_trunk_endpoints -clock [get_clocks clk_cpu]
icc2_shell> report_clock_trunk_endpoints -script
Table 12.5 report_clock_trunk_endpoints switches
SwitchWhat it doesTeaching note
-clockReport only these clocks.No s. Default is all clocks.
-cornersReport only these corners.Default is all corners.
-scriptWrites set_clock_trunk_endpoints lines you can replay.This is how you save what you just grew.
pins or portsReport only these objects.Default is every endpoint.
-significant_digitsDigits after the decimal for time.Optional.
-nosplitKeeps a row on one line.Useful if a script will parse the report.

remove_clock_trunk_endpoints takes them back off a pin, a clock, a corner, or everything. Default without a pin list is the wide broom again.

Buffers can sit on the shared walk before the endpoint, or only on the branches after it. Branch buffers live in the estimate. They are not the spine. Shared buffers before the endpoint are the spine’s business. Keep that cut when you read a schematic.

Left: shared atlas buffer then two D flip-flops. Right: endpoint first, then branch buffers and two sinks.
Figure 12.10 Shared walk, then sinks. Or endpoint first, then branch buffers behind it. Dominant is the worst downstream delay. Teaching purpose: stop branch buffers being counted as the spine.
Three rooms: source in A, atlas buffer in a feedthrough room, endpoint and D flip-flop in Z.
Figure 12.11 A feedthrough is a visit. The buffer in the middle room is not a sink. Balance points remain a CTS judgement you still read. Teaching purpose: stop a feedthrough pin being described as an endpoint.

Part 5 — Feasibility before the spine

After settings, before synthesize_clock_trunks, run a named check. The command is check_design_for_clock_trunk_planning. This is not check_topology_feasibility from Chapter 11. It is a different command. Run it after you have set the trunk options, and before you grow the top-level spine. The flavour you chose — editable or push-down — changes which problems it will catch.

icc2_shell> check_design_for_clock_trunk_planning \
    -clock [get_clocks clk_cpu] -summary
Table 12.6 check_design_for_clock_trunk_planning switches
SwitchWhat it doesTeaching note
-clockWhich clocks to check.No s. Default is every clock.
-summaryPrints the list of checks the command will run.Teaching Tcl always includes it once, so you see the list.

The checks have names and message IDs. Read the ID. Repair the object it names. Adding a buffer will not change a Frame view. Adding a corridor will not give a block a location.

Table 12.7 Feasibility errors and messages
Check nameIDMessageWhat you do
SUB_BLOCK_INST_WITH_INCORRECT_TYPE_OR_VIEWTL-112Block instance (Reference: …) is bound to Frame view. Cannot be used for top-level optimisation.Bind a design view, not a Frame. A Frame is not an abstract you forgot to create.
SUB_BLOCK_INST_WITH_INCORRECT_TYPE_OR_VIEWTL-134Block instance (Reference: …) has design type macro. Cannot be used for top-level optimisation.A macro is not an editable child in this check. Do not offer it to the spine.
DESIGN_VIEW_CHECKTL-101Design view for the Abstract does not exist.Create or bind a design view for that abstract.
DESIGN_MISMATCH_CHECKSTL-109Missing port in the block corresponding to a block-instance pin.The child’s port list and the instance pin list must match.
DESIGN_MISMATCH_CHECKSTL-110Missing pin on the block instance corresponding to a port.Same cut from the other side: pin and port must match.
CORE_AREA_CHECKTL-111Missing core area in the block. Cannot run top-level timing analysis and optimisation.The child needs a core area before the top can time it.
LOC_SUB_BLOCK_CHECKTL-130Missing location of block instance (Reference: …) in the design.Place the block. Give it coordinates.
LOC_SUB_BLOCK_CHECKTL-131Block instance boundary is outside its parent block boundary.Move the child inside the parent.
LOC_SUB_BLOCK_PIN_CHECKTL-126Missing physical location for a port of the block reference. Clock ports only.Place the clock port. This is the MIB prior on Nimbus-8.
LOC_LEAF_INST_CHECKTL-128Missing location of leaf cells inside the block reference. All cells.Place the leaves. Top-level flip-flops must already be placed for this flow.
LOC_LEAF_INST_CHECKTL-129Leaf cell inside the block reference is outside the block boundary.Move the leaf inside the room.
VOLTAGE_AREA_CHECKSTL-114 to TL-118Internal consistency failures: a voltage area has no voltage, no power domain, no region, or no internal area.Fix the voltage-area pairing. Push-down flavour does not support multivoltage; THO does.
POWER_DOMAIN_CHECKSTL-113Power domain does not have an associated voltage area.Pair the domain with a voltage area.
UNMAPPED_LOGIC_CHECKTL-305The leaf cell in the block reference is unmapped. Clock-path cells only.Map the cell. An unmapped cell on a clock path is not a trunk you can grow.
CLOCK_LOOP_CHECKTL-140Output pin is driving an input pin of the same physical-hierarchy instance. Clock path only.Break the loop. A clock that drives itself is not a spine.

Read the ID. Fix that object. Then run the check again. Then synthesize.

Left: two NPU instances that need clock pins by hand. Right: the feasibility command and sample TL messages.
Figure 12.12 MIB first. Check second. Spine third. Teaching purpose: stop a Frame-view child being offered to top-level optimisation.

Part 6 — Abstracts, when the child is light

Sometimes the child is too heavy to keep fully open at the top. An abstract is a lighter stand-in. Top-level trunk planning can run against abstracts. The order is: create them, prepare the hierarchy, synthesize, then commit. The prepare/commit command is synthesize_clock_trunk_setup_hier_context.

icc2_shell> set_editability -value true -blocks *
icc2_shell> create_abstract -blocks [get_blocks {CPU_CLUSTER NPU_CORE}]
icc2_shell> synthesize_clock_trunk_setup_hier_context -init
# ... synthesize_clock_trunks here ...
icc2_shell> synthesize_clock_trunk_setup_hier_context -commit
Table 12.8 synthesize_clock_trunk_setup_hier_context switches
SwitchWhat it doesTeaching note
-initPrepares: creates optimisable abstracts for children linked with abstracts.Mutually exclusive with -commit.
-commitUpdates after the spine: creates regular abstracts again.Mutually exclusive with -init.
-host_optionDistributed host option. Singular on this command.The endpoints command used -host_options, plural. Each command uses its own page. If omitted, the tool runs serially.

A nearby example types set_editability with no arguments. Do not copy that. -value and a block list are how you actually enable a child. A nearby flow example also writes -host_options on this command. The command page writes -host_option. New Tcl uses the singular. A Frame view is not an abstract you forgot to create. Feasibility will tell you if the view is wrong. Listen before you synthesize.

Part 7 — CTP pin constraints

Optional, and additive. After block-level endpoints you may fence which sides of a block may take a clock pin or a feedthrough cut. Think of it as telling the later pin placer, “clocks may land on this edge, in this window.” place_pins later honours these. They take priority over set_block_pin_constraints and set_individual_pin_constraints for this flow. Disabled blocks, via set_editability, are ignored.

# CPU leftover faces side 3. Offset 0 to 800 um on that edge
icc2_shell> set_ctp_constraints -cells [get_cells u_cpu_cluster] \
    -sides {3} -offset {0 800}
icc2_shell> report_ctp_constraints -cells [get_cells u_cpu_cluster]
Table 12.9 set_ctp_constraints switches
SwitchWhat it doesTeaching note
-cellsWhich block instances take the constraint. Required.A nearby flow example offers a positional name. New Tcl uses -cells.
-sidesSides that may take a clock pin. 1 is the leftmost lowest edge, then clockwise.0 is illegal. On Nimbus-8 CPU leftover faces side 3. Mutually exclusive with -exclude_sides.
-exclude_sidesSides that must not take a clock pin.Mutually exclusive with -sides.
-offsetA single offset or a range, only with -sides or -exclude_sides.A range is two numbers, first smaller than second. Teaching: {0 800} on side 3.
-allowed_layersMetals allowed for these pins.Default is the design min-to-max you already set. Do not steal M4/M5.
-allow_feedthroughstrue or false. May new feedthroughs be cut.Default is true. Say false when you mean it.

The command is additive: later calls keep what you do not override. These constraints take priority over set_block_pin_constraints and set_individual_pin_constraints for this flow. Disabled blocks, via set_editability, are ignored. remove_ctp_constraints without -cells clears every block. It does nothing to a block you disabled. place_pins later honours these fences.

A rectangle labelled 1 left, 2 top, 3 right, 4 bottom, plus a note that CPU leftover faces side 3.
Figure 12.13 Clockwise from the lowest left edge. 0 is illegal. The leftover on Nimbus-8 faces CPU side 3, not side 1. Teaching purpose: stop side 1 being used as a synonym for “the channel.”

Part 8 — Top-level synthesis

Now the spine. Prerequisites the command page lists: blocks shaped, block clock ports placed, top-level flip-flops placed, endpoints identified with phase delays. synthesize_clock_trunk_endpoints is how you usually get those delays. Then choose a flavour and read it back. Reading it back is not decoration. Hidden defaults are how two people in a room run two different flows.

icc2_shell> set_app_options -name plan.clock_trunk.flow_control \
    -value optimize_subblocks
icc2_shell> set_app_options -name plan.clock_trunk.enable_new_flow \
    -value true
icc2_shell> report_app_options plan.clock_trunk.flow_control

For multiple levels of physical hierarchy, also set plan.clock_trunk.enable_mph_constraints to true and read it back. Nimbus-8’s CPU cluster has children inside it, so this is not a toy option. To allow feedthroughs on clock nets, set plan.pins.exclude_clocks_from_feedthroughs to false — if it is true, the tool will not create clock feedthroughs. Read that one back too. Remove topological pin-feedthrough constraints with remove_topological_constraints -all, and individual pin constraints with remove_individual_pin_constraints, before the spine so old fences do not fight the new map. The engine still honours block feedthrough enables, editability, allowed sides, routing blockages, and clock metal assignments.

Optionally prefix the cells the trunk inserts, so you can find them later in the netlist:

icc2_shell> set_app_options \
    -name cts.common.user_instance_name_prefix \
    -value ICC2_TOP_CTP_

Then check. Then synthesize. The command is plural. The flow picture writes the singular. The singular has no command page. New Tcl uses the plural.

icc2_shell> check_design_for_clock_trunk_planning \
    -clock [get_clocks clk_cpu] -summary
icc2_shell> synthesize_clock_trunks -clock [get_clocks clk_cpu]
Table 12.10 synthesize_clock_trunks switches
SwitchWhat it doesTeaching note
-clockWhich clocks to plan.No s. Default is all clocks. Mixing with -clocks is a syntax error.
-list_onlyPrints the THO stages: pin_constr_generation, read_pin_constr_and_place_pins, clock_trunk_synthesis.Cannot travel with -from or -to. A nearby flow picture names only two stages. New Tcl uses three.
-fromStarting stage. Default is pin_constr_generation.THO flavour only. Does not apply in push-down.
-toStopping stage. Default is clock_trunk_synthesis.THO flavour only. There is no pin_check token.
-incrementalUpdates pin-constraint topology from a prior full run.Before a full (non-incremental) run, the tool errors out.

The default pin-constraint script is read_pin_constr_place_pins.tcl. You may rename it with plan.clock_trunk.topo_constr_pin_place_script_name. Read the option back rather than asserting a remembered default.

Green THO panel with three stages; pink push-down panel with read-only rules and the pushdown versus push_down spelling.
Figure 12.14 Two flavours, two rulebooks. A nearby flow writes pushdown. The command-page example writes push_down. Teaching purpose: stop -from being typed in a flavour that does not have stages.

Part 9 — Push-down flavour

If you chose read-only blocks, the sequence is flavour, check, synthesize, then push. Push-down means: grow the spine on top of rooms you must not edit, then push the trunk cells into those rooms that allow feedthroughs. It is a different rulebook from THO. Do not mix their flags.

icc2_shell> set_app_options -name plan.clock_trunk.flow_control \
    -value push_down
icc2_shell> report_app_options plan.clock_trunk.flow_control
icc2_shell> check_design_for_clock_trunk_planning -clock [get_clocks clk_cpu]
icc2_shell> synthesize_clock_trunks -clock [get_clocks clk_cpu]
icc2_shell> push_down_clock_trunks -clock [get_clocks clk_cpu]
Table 12.11 push_down_clock_trunks switches
SwitchWhat it doesTeaching note
-clockWhich clocks’ top-level trunk cells to push down.No s. Default is all top-level clock cells.

The command pushes those cells into blocks that allow feedthroughs, creates the feedthroughs, and places the new ports. A See-also line nearby names create_block_pin_constraint. The flow you already have uses set_block_pin_constraints -allow_feedthroughs. Do not invent a third verb. Confirm with man.

This flavour does not consider move bounds or blockages inside first-level blocks. It does not support multiple levels of physical hierarchy. It does not support multivoltage. If Nimbus-8 needs either, you are in the THO flavour, not this one. This is also not push_down_objects from Chapter 11. Different object, different command.

Part 10 — Taste, incremental, and what this chapter does not finish

QoR of a trunk is not the heartbeat. Heartbeat is return 1. Taste needs ingredients: derates applied, then estimate_timing, then the report.

icc2_shell> report_clock_trunk_qor -clock [get_clocks clk_cpu]
Table 12.12 report_clock_trunk_qor switches
SwitchWhat it doesTeaching note
-clockWhich clocks to report.No s. Default is all clocks of the active modes.
-endpoint_limitMaximum endpoints before the command errors.Default 100. Hitting it is often a driving-cell problem, not a sorting problem.
-from_blockOnly paths that start in these block instances.Default is all blocks.
-to_blockOnly paths that end in these block instances.Default is all blocks.
-sort_by wns\|wns_ocvSort the report.Default is WNS without OCV degradation.
-violating_onlyOnly violating paths.Optional.
-significant_digitsDigits after the decimal, 0 to 13.Default is 2.
-nosplitKeeps a row on one line.Useful if a script will parse the report.

The first call may trigger a full or incremental timing update. Later calls do not, unless the netlist or constraints changed. Apply derates. Run estimate_timing. Then taste.

Budgeting can inherit the spine: compute_budget_constraints -latency_targets estimated -balance true. That pair is required together. Writing the budget out and looking for -crp is working knowledge. Full budgeting is a later chapter. Clock feedthrough ports created by the spine need to be treated as clocks so they inherit CTS constraints: plan.budget.add_missing_feedthrough_clocks and plan.budget.include_feedthrough_clocks set true, then split_constraints. That is a bridge, not this cook.

Incremental synthesize_clock_trunks -incremental honours constraints you changed since the last full run. You may subset clocks. A full run must exist first. The GUI has a Clock Trunk Planning panel — View → Flylines → Clock Trunk Planning — for looking, not for replacing the commands you just learned.

A clock trunk is a spine from a queried source to a reported endpoint. Check the design before you grow it. Choose a flavour whose rules you can name. Return 1 is a heartbeat. CTS still owns the leaves.

Inputs, outputs, and readiness

Table 12.13 What must already be true, and what this chapter produces
InputWhy it mattersWhat you produce
Shaped blocks and leftover channelThe spine walks rooms and glue, not a sofa.A clock port you queried, sitting in that leftover
Compiled PG on M4/M5Ignored layers must not steal the mesh.CTS constraint files that name legal floors
Placed top-level flip-flopsBlock-level CTP and top-level CTP both require them.Endpoints with phase delay
MIB clock pins placedCopies are read-only here.A prior you can point at on both NPU instances
Mapping file with CTS_CONSTRAINTNo line, no block-level run.set_constraint_mapping_file -reset transcript
A flavour you namedTHO and push-down do not share -from/-to.report_app_options of flow_control
Readiness. If you cannot point at the leftover channel, you are not ready to draw a spine. If you cannot point at a source, a door, and an endpoint on a sketch, sit with Part 1 again. If an NPU clock pin is still unplaced, you are not ready to synthesize. If M4 is still your instinct for “fat metal,” sit with Chapter 10 again.

Guided tool workflow

Table 12.14 The teaching loop, in order
StepCommandWhat you prove
1get_clocks / get_portsThe clock exists and you know its name
2Place MIB clock pins by handThe copies are no longer an unplaced prior
3set_constraint_mapping_file -resetEach reference owns one CTS file
4synthesize_clock_trunk_endpoints -clocksEndpoints and anchor cells exist
5report_clock_trunk_endpointsDelays and dominant * are numbers you read
6check_design_for_clock_trunk_planning -clockTL messages are empty, or explained
7Optional set_ctp_constraints -cellsLegal sides, said feedthroughs
8set_app_options flavour, then read backTHO or push-down, not a mixture
9synthesize_clock_trunks -clockA spine. Return 1 is not QoR
10report_clock_trunk_qor after estimate_timingA taste you would defend

One continuous worked example

Nimbus-8, still. Core 3.20 mm × 3.20 mm = 10.24 mm² = 10,240,000 µm². Channel 2.091 mm² = 2,091,000 µm². Teaching spine: clk_cpu at 1.60 GHz = 625 ps, port through leftover glue into CPU_CLUSTER. Teaching endpoint delay 0.200 ns = 200 ps, an estimate, about a third of the period. Mesh on M4/M5 stays. Bus map on M3/M6 stays.

Query clk_cpu. Place clock pins on u_npu_core_0 and u_npu_core_1 by hand — you will need that prior even if today’s spine is only clk_cpu. Write ctp_mapfile with CTS_CONSTRAINT for each reference, including NIMBUS8. Load it with -reset. Grow endpoints for clk_cpu on the four references. Report them. Check feasibility with -clock and -summary. Optionally fence CPU side 3, the leftover face, with offset 0 to 800 µm. Set optimize_subblocks, read it back. Allow clock feedthroughs if you mean them. Synthesize the plural command. Estimate timing. Read QoR. Quiet success in this story is return 1 while a TL-130 still says a child has no location, or while QoR still shows a path you have not tasted. Read the line. Do not argue with the heartbeat.

Nimbus-8 die with a teal clk_cpu spine from a gold port in the leftover channel into CPU_CLUSTER, plus the four clock periods.
Figure 12.15 The worked die. Teal is the spine through the leftover channel. M4/M5 still hold the mesh. Teaching purpose: keep one design, one channel, one teaching clock.

Failure modes and debugging

Table 12.15 What it looks like, what you probably did, what you check, what you do
What you seeLikely causeWhat you inspectWhat you doThe lesson
synthesize_clock_trunk is unknownFlow-picture singularCommand pageUse the pluralPlural in new Tcl
Block-level CTP does nothingNo CTS_CONSTRAINT lineMapping fileAdd the line; -reset if replacingNo recipe, no cook
-clocks rejected on the spine commandWrong flagEndpoints use -clocks; spine uses -clockMatch the pageThe s is not decoration
pushdown rejectedNearby flow spellingman / command-page examplepush_downNamed conflict
-from ignored or errors in push-downStages are THO-onlyflow_controlDrop -from/-to or change flavourFlavour owns the flags
-incremental errors immediatelyNo prior full runSession historyRun a full synthesize firstIncremental is a second pass
TL-112 Frame viewChild bound to the wrong viewBlock viewUse a design or a legal abstractFeasibility before the spine
QoR looks inventedNo estimate_timing, no deratesReport headerEstimate, then reportTaste has ingredients
Delay 20 on a 625 ps clockCopied an example unit-blindPeriod versus -delay0.200 ns = 200 ps teachingUnits are not optional
NPU copies disagreeMIB pins never placedBoth instancesPlace by hand, then restartRead-only means prior
Four panels: feasibility, endpoints, QoR, and flavour, each a question after return 1.
Figure 12.16 Four questions after a cheerful return. None replaces another. Teaching purpose: name the checks, not the heartbeat.

Hands-on mini lab — Procyon-5

Procyon-5 is a new design, not Nimbus-8. The core is a square 800 µm = 0.800 mm on each side, so an area of 0.640 mm² = 640,000 µm². Two committed blocks sit left and right with a leftover strip between them. One clock, 400 MHz = 2,500 ps. Teaching endpoint delay 0.400 ns = 400 ps. No MIB in this lab. Sketch source, door, and endpoint on paper before you type.

Steps.

  1. Query the clock. Write a mapping file with CTS_CONSTRAINT for both block references and the top. Load it with -reset.
  2. Confirm top-level flip-flops are placed and blocks are shaped.
  3. Run synthesize_clock_trunk_endpoints -clocks on both references. Do not type -clock here.
  4. Report endpoints. Record the dominant * delay in picoseconds and nanoseconds.
  5. Run check_design_for_clock_trunk_planning -clock ... -summary. Do not type -clocks.
  6. Set plan.clock_trunk.flow_control to optimize_subblocks and read it back. Do not type pushdown.
  7. Synthesize with the plural command. Estimate timing. Report QoR.

Expected observations. Endpoints exist before the spine. -clocks and -clock are different flags. Return 1 after synthesize can coexist with a QoR path you have not yet read. A 400 ps endpoint on a 2,500 ps period is an estimate, not a tree.

Verification checklist. Mapping used -reset; flags match each command page; flavour was read back; QoR followed estimate_timing; no conclusion rests only on return 1.

Stretch. Repeat the lab in push-down flavour with push_down. Confirm -from is rejected or inapplicable. Push down. Compare the two QoR reports without declaring a winner from the heartbeat.

Interview preparation

BEGINNER

1. What is a clock trunk, and what is it not?

A coarse spine from the clock source to trunk endpoints. It is not a finished CTS tree, and it is not pin assignment.

Start from the tick. A clock is a repeating heartbeat. A trunk is a coarse map of that heartbeat from a queried port to a small number of last stations, called endpoints. Anchor cells — buffers or inverters — may sit on that walk. Feedthrough pins are visits through rooms that are not the destination. They are not sinks.

Clock tree synthesis still grows the twigs from those endpoints to the flip-flops. Pin assignment in earnest is the next chapter. This chapter may place some clock pins as a consequence of the spine. That is not “every pin on the chip.”

The interview-quality sequence is map constraints → MIB prior → endpoints → report → check → flavour → synthesize → QoR. Leaving out the check or the MIB prior turns a definition answer into an unsafe flow answer.

What is being tested. Whether the candidate separates spine, tree, and pin assignment, and can name source and endpoint.
BEGINNER

2. Why must you query the clock before synthesize_clock_trunk_endpoints?

The command maps top-level clocks to block clocks; invented names are not a clock, and virtual clocks are skipped.

Teaching names in this chapter are stand-ins. On a real netlist you run get_clocks and you pass a collection. A block clock whose master cannot be traced to a top-level clock is ignored. Virtual clocks are skipped. Typing clk_cpu from a table without asking the design is how a beginner ships a string the tool never owned.

The flag here is -clocks, with an s. The top-level synthesize command uses -clock, without. Mixing them is a syntax error.

Black-box endpoints are a different shape: set_clock_trunk_endpoints on a queried pin, with a delay you would defend, using -clock (no s).

What is being tested. Prerequisites, the -clock versus -clocks split, and honesty about names.
BEGINNER

3. What does synthesize_clock_trunks returning 1 prove?

It proves the synthesize command completed; it does not prove feasibility, endpoint quality, or QoR.

Synthesize builds a top-level spine and may generate pin constraints and place clock pins, depending on flavour and stages. Return 1 is command status. It is a heartbeat. check_design_for_clock_trunk_planning, report_clock_trunk_endpoints, and report_clock_trunk_qor are other sentences.

A senior answer names the plural command and refuses the flow-picture singular unless man on that build says otherwise.

This is the chapter’s quiet-success thread. Chapter 11 had the same shape with optimize_topology_plans.

What is being tested. Whether a candidate confuses command completion with engineering acceptance.
BEGINNER

4. Nimbus-8 has clk_cpu at 1.60 GHz. What is the teaching endpoint delay, and why is 20 illegal as a copy?

0.200 ns = 200 ps, about a third of the 625 ps period, labelled an estimate. Twenty nanoseconds is thirty-two cycles of fiction.

Period is 1 / 1.60 GHz = 625 ps. That is the whole tick. A teaching delay of 0.200 ns = 200 ps sits behind the endpoint toward the sinks. It is an estimate of later twigs. It is not the period. It is not signoff insertion delay.

A command-page example uses -delay 20. If the unit is nanoseconds, that is 20,000 ps. Do not copy a number you have not converted against the period you named.

If you omit -delay, the planner estimates. Saying the number out loud with both units is the grown-up move.

What is being tested. Unit honesty, period arithmetic, and refusal to copy blindly.
BEGINNER

5. synthesize_clock_trunk or synthesize_clock_trunks?

The command is plural. The flow picture writes the singular. The singular has no command page. New Tcl uses the plural.

This is a named conflict, not a style choice. Optional arguments include -clock, -from, -to, -list_only, and -incremental. Omitting -clock means all clocks — a wide broom on a real chip.

Name both forms in an interview. Use the syntax form for new code. Do not “correct” an old script without knowing the build.

The same muscle applies to pushdown versus push_down.

What is being tested. Whether the candidate can hold a documented conflict without silently picking.
BEGINNER

6. What is a CTS_CONSTRAINT line for, in this chapter?

It is the mapping-file keyword that attaches a CTS Tcl file to a reference block. Without it, block-level CTP does not start.

Think of the mapping file as a table of contents. set_constraint_mapping_file loads a map of block_design_name constraint_type file_name. Other types exist — SDC, UPF, PG — and they are not this chapter’s cook. For trunks you need CTS_CONSTRAINT.

Without -reset, a second load appends. Unique reference names, including the top NIMBUS8, keep a child from silently owning the wrong file.

The Tcl files themselves hold max cap, max transition, ignored layers, references, driving cell, NDRs. Confirm layers against the library. Do not steal M4/M5.

What is being tested. Mapping versus CTS file, append versus reset, and layer honesty.
INTERMEDIATE

7. List the synthesize_clock_trunks stages and why the flow picture is a trap.

pin_constr_generation, read_pin_constr_and_place_pins, clock_trunk_synthesis. The flow picture names two. -list_only names three. Push-down has none of these.

Default -from is the first stage; default -to is the last. You may run only pin-constraint generation. You may not combine -list_only with -from/-to.

In push-down flavour those options do not apply. Typing them there is how a candidate shows they memorised a THO example and pasted it into the other rulebook.

Confirm with synthesize_clock_trunks -list_only on the build in the room.

What is being tested. Stage tokens, flavour limits, and refusal to treat a figure as Tcl.
INTERMEDIATE

8. How do -clock and -clocks split across this chapter’s commands?

Endpoints take -clocks. Feasibility, synthesize, push-down, and QoR take -clock. Mixing them is a syntax error.

synthesize_clock_trunk_endpoints -clocks. set_clock_trunk_endpoints -clock. check_design_for_clock_trunk_planning -clock. synthesize_clock_trunks -clock. push_down_clock_trunks -clock. report_clock_trunk_qor -clock.

-clocks and -auto_clock are mutually exclusive on the endpoint-grow command. Default without a clock list is often “all clocks.” Say the collection you mean.

This is literacy, not trivia. Interviewers listen for the s.

What is being tested. Flag accuracy across the family, and the all-clocks default.
INTERMEDIATE

9. A mapping file loaded twice and block-level CTP now disagrees with itself. What happened?

Without -reset the second load appended. Two CTS files can now claim the same reference.

-reset alone clears. -reset with a filename replaces. A filename alone appends. That is the command page, not a house rule.

The repair is to reset, load the file you mean, and report which constraint file each block owns. Do not delete lines by guessing.

Block-level CTP will not trigger for a reference with no CTS_CONSTRAINT line. Empty is not a recipe.

What is being tested. Append versus replace, and the missing-line silence.
INTERMEDIATE

10. plan.clock_trunk.flow_control: pushdown or push_down?

The command-page example uses push_down. A nearby flow writes pushdown. New Tcl uses push_down; confirm with man.

Push-down flavour treats blocks as read-only, parks trunk cells on top, and needs push_down_clock_trunks to commit. It does not support MPH or multivoltage. -from/-to do not apply.

THO flavour is optimize_subblocks: blocks editable, three stages, MPH and MV allowed.

Read the option back with report_app_options. Do not memorise a hidden default. Nimbus-8 with two hierarchy levels inside the CPU cluster is a reason to know which flavour you chose.

What is being tested. Spelling conflict, capability split, and read-back discipline.
INTERMEDIATE

11. What must be true before push_down_clock_trunks?

Push-down flavour selected, endpoints exist, synthesize already ran, and feedthroughs allowed on the blocks that will receive cells.

The command pushes top-level trunk cells into blocks enabled for feedthroughs, creates those feedthroughs, and places the new ports. Default is all top-level clock cells; -clock subsets.

A See-also names create_block_pin_constraint. The flow you have uses set_block_pin_constraints -allow_feedthroughs. Do not invent a third command in an interview. Name the conflict and pick the page you sat with.

This is not push_down_objects from Chapter 11. Different object, different command.

What is being tested. Flavour prior, feedthrough enable, and not confusing two push-down commands.
SCENARIO

12. You typed synthesize_clock_trunk and the tool rejected it. Defend your next line.

Switch to the plural, name the conflict, and confirm with man. Do not invent a third token.

The flow picture that introduces the chapter uses the singular. The command page, and every example that actually runs, use synthesize_clock_trunks. This book’s new Tcl uses the plural.

A weak recovery is “I’ll try synthesize_clock_trunk_plan.” A strong recovery is to quote both sources, pick the syntax list, and run man synthesize_clock_trunks on the build in the room.

The same muscle applies to pushdown versus push_down, and to -clock versus -clocks.

What is being tested. Conflict handling under pressure, without silent invention.
SCENARIO

13. Block-level CTP returned 1. Feasibility then says the child is a Frame view. What is the repair?

Bind a design view or a legal abstract; do not synthesize the top spine first and hope.

Return 1 on endpoints grew what it could. Feasibility then compared the hierarchy with what top-level optimisation is allowed to touch. TL-112 is a view problem. Adding a corridor will not change a Frame view. Adding buffers will not change a Frame view.

Fix the view, re-check, then decide whether you must re-grow endpoints. Abstracts have their own prepare/commit pair. A Frame is not an abstract you forgot to create.

Say that out loud: check before the spine. Interviewers listen for that sentence.

What is being tested. Repair at the right abstraction: the view, not the router.
SCENARIO

14. Two NPU copies share NPU_CORE. You started trunk planning and the pins disagree. What did you skip?

MIB clock pins must be placed by hand first because copies are read-only in this flow.

A multiply instantiated block shares one drawing. The tool will not invent a clock pin on that drawing for you in this flow. Propagating a Chapter 11 topology plan copied a bus map. It did not place a clock pin. Alignment checked rows and tracks. It did not place a clock pin.

Place both instance pins, then map, then endpoints. Restarting synthesize on an unplaced MIB pin is how QoR becomes folklore.

On Nimbus-8 that prior is u_npu_core_0 and u_npu_core_1. Name the instances.

What is being tested. The MIB prior as a hard gate, not a footnote.
SCENARIO

15. You need only pin constraints for clk_cpu, not a full spine yet. Which stages do you run?

In THO flavour, synthesize_clock_trunks -from pin_constr_generation -to pin_constr_generation. Push-down cannot do this.

That pair is legal only where stages exist. Default -to is clock_trunk_synthesis; you must name the earlier stop. Incremental later can keep clk_npu as it was and overwrite clk_cpu if you subset the clock list.

Do not claim -to pin_check. Do not claim the two-name flow picture is the full list. -list_only is how you show the three tokens.

The generated script defaults to read_pin_constr_place_pins.tcl. Rename it with the app option if you must; read the option back.

What is being tested. Stage control, flavour limits, and not inventing a stop token.
SCENARIO

16. Clock trunks are done. Someone asks you to finish every block pin in the same script. What do you say?

Pin assignment is the next chapter. This chapter ends with a clock spine, endpoints, and a QoR you read.

The overall flow places clock trunk planning after global planning and before pin assignment and budgeting. Mixing place_pins for every net into this cook hides both plots. The spine may already have placed some clock pins. That is a consequence, not the pin-assignment chapter.

What you can say, cleanly: the leftover channel now has a clock spine; M4/M5 still hold PG; the bus map still stands; MIB clock pins were a prior. Full pin assignment starts at the sides you have not yet fenced for every bundle.

Breadth is naming the next chapter. Recklessness is pasting a pin-assignment script into a trunk session you have not checked.

What is being tested. Flow hygiene and the boundary with pin assignment.

Chapter close

Sign-off checklist for this planning stage

  1. You can point at source, door, endpoint, and feedthrough on a sketch.
  2. Clock ports were queried, not invented.
  3. MIB clock pins were placed by hand on both NPU copies.
  4. Mapping file has CTS_CONSTRAINT for every reference you ran, loaded with -reset if it replaced.
  5. Ignored layers do not steal M4/M5; the leftover channel is still the spine’s geometry.
  6. Endpoints exist; delays are numbers with units; dominant * was read.
  7. Feasibility used -clock, not -clocks, and TL messages are empty or explained.
  8. Flavour is optimize_subblocks or push_down, read back, not mixed.
  9. Synthesize used the plural command; return 1 was followed by estimate_timing and QoR.
  10. CTP pin sides, if used, started at 1, never 0, and CPU leftover used side 3.
  11. Pin assignment for every bundle was not mixed into this script.

Key-concept flashcards

Clock

A repeating tick. Frequency how often. Period the gap. clk_cpu is 625 ps.

Spine is not a tree

A trunk is source to endpoint. CTS still owns the flip-flops.

Six names

Port, top arc, door, block arc, endpoint, feedthrough visit.

Quiet success

synthesize_clock_trunks returning 1 is a heartbeat, not QoR.

Plural command

synthesize_clock_trunks. The picture’s singular is a conflict.

The s on clocks

Endpoints: -clocks. Spine and check: -clock.

push_down

Command-page token. Nearby flow writes pushdown. Confirm with man.

MIB prior

Copies are read-only. Place clock pins by hand first.

Mapping

CTS_CONSTRAINT per reference. Without -reset, maps append.

Teaching delay

0.200 ns = 200 ps on a 625 ps clk_cpu. Estimate, not signoff.

Side 1

Leftmost lowest edge, then clockwise. CPU leftover faces 3.

Next

Pin assignment is Chapter 13. Budgeting waits later.

Compact glossary

Table 12.16 Chapter 12 glossary
TermMeaning as used in this book
Anchor cellA buffer or inverter inserted during block-level trunk planning.
Block clock pinThe door where the clock enters a block. Not the endpoint.
ClockA repeating tick. Frequency in GHz. Period in ns or ps.
Clock portThe source. Query with get_ports.
Clock-trunk endpointA pin or port where the spine stops, with phase delay toward the sinks.
Clock tree synthesis (CTS)Later growth of twigs from endpoints to flip-flops. Not this chapter.
CTS_CONSTRAINTMapping-file keyword that attaches a CTS Tcl file to a reference.
Dominant endpointWorst downstream phase delay from a given block clock pin, marked *.
Feedthrough pinA visit through a room that is not the sink.
PeriodTime between ticks. 1 / frequency. clk_cpu is 625 ps.
Phase delayEstimated time from endpoint to sinks. Not signoff insertion delay.
Push-down flavourflow_control = push_down: read-only blocks, then push_down_clock_trunks.
SinkA cell that uses the clock, usually a flip-flop.
THO flavourflow_control = optimize_subblocks: editable blocks, three stages, MPH/MV.
Trunk / spineCoarse clock distribution from source to endpoints. Not a finished tree.

Five-question self-check

Hamal-3 has a core that is a square 1,200 µm = 1.200 mm on each side, so an area of 1.44 mm² = 1,440,000 µm². It has two clocks. Teaching endpoint delay is 0.300 ns = 300 ps.

  1. You have a top-level clock clk_a and a block clock with a different name. Which endpoint flag associates them, and which flag is mutually exclusive with it?
  2. A flow note says synthesize_clock_trunk -to pin_check. What do you type instead, and which three stages exist in THO flavour?
  3. You set flow_control to pushdown and the tool rejects it. What token do you use, and which two capabilities does that flavour not support?
  4. Block-level CTP on Hamal-3 does nothing for the second clock. Name the mapping-file cause and the reset rule.
  5. Hamal-3 uses a 300 ps endpoint delay. If someone copied -delay 20 from an example, by what factor is that delay wrong against 300 ps, assuming nanoseconds?

Answers.

1. -auto_clock connected | local | all on set_clock_trunk_endpoints or on synthesize_clock_trunk_endpoints. It is mutually exclusive with -clock / -clocks. Query both clocks first.

2. Type synthesize_clock_trunks (plural) and a real stage token such as -to pin_constr_generation. The three THO stages are pin_constr_generation, read_pin_constr_and_place_pins, and clock_trunk_synthesis. Confirm with -list_only. There is no pin_check.

3. push_down. That flavour does not support multiple levels of physical hierarchy and does not support multivoltage. -from/-to do not apply. Confirm with man.

4. No CTS_CONSTRAINT line for that reference, or a second load appended the wrong file. Load with -reset when you mean replace. Block-level CTP does not start without the keyword.

5. 20 ns = 20,000 ps. 20,000 / 300 ≈ 67 times the teaching delay. Units first, then the copy. Do not import 20 onto Hamal-3.

Why Chapter 13 follows

The leftover channel now has a bus map and a clock spine, and the mesh still holds power. What the chip still lacks is a complete, constrained placement of every block pin the router will honour. That is pin assignment. It is not a tail on synthesize_clock_trunks. This chapter ends with clocks. The next begins at the sides of the rooms.

Chapter 12 recap: eight panels for what it is, the four words, the numbers, the habit, stages, flavours, CTP pins, and next.
Figure 12.17 Chapter 12 on one page: constrain, endpoint, check, synthesize, taste. Quiet success is not QoR. Chapter 13 will assign pins; it does not begin here. Teaching purpose: a photographable end-of-chapter flow.