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.
| You will see | Read it as | What you need to know |
|---|---|---|
| clock | a repeating tick | Frequency is how often. Period is the time between ticks. clk_cpu is 1.60 GHz, so the period is 625 ps. |
| clock port | the source | Where the tick enters the design. Query it with get_ports. Do not invent the name. |
| sink | a cell that uses the clock | Usually a flip-flop. This chapter does not finish every sink. |
| clock trunk / spine | a coarse clock map | Source to endpoint. Not a finished clock tree. Not every flip-flop. |
| clock tree synthesis (CTS) | the later tree | CTS still grows the twigs from endpoints to flip-flops. |
| top-level clock-trunk arc | the walk across leftover glue | The teal line in the leftover channel. Intent, not a routed tree. |
| block clock pin | the door into a room | Where the clock enters a block. Not the same as an endpoint. |
| block-level clock-trunk arc | the walk inside the room | From the door toward the endpoint, still inside that block. |
| clock-trunk endpoint | the last station this chapter owns | A pin or port with a phase delay behind it, toward the sinks. |
| feedthrough pin | a visit | The clock walks through a room that is not the destination. Not a sink. |
| phase delay | time from endpoint to sinks | An estimate. Teaching: 0.200 ns = 200 ps on a 625 ps period. |
| anchor cell | a buffer or inverter on the trunk | Inserted during block-level planning from CTS constraints. |
| mapping file | which CTS Tcl belongs to which block | Keyword CTS_CONSTRAINT. Without it, block-level CTP does not start. |
| THO flavour | optimize_subblocks | Blocks are editable. Three stages. MPH and multivoltage allowed. |
| push-down flavour | push_down | Blocks are read-only. No MPH, no MV. Then push_down_clock_trunks. |
| CTP pin constraint | which sides may take a clock pin | Optional, additive, beats ordinary pin constraints for this flow. |
| side 1 | leftmost lowest edge | Then clockwise. 0 is illegal. On CPU, leftover faces side 3. |
| MIB | multiply instantiated block | Two copies, one drawing. Read-only here. Place clock pins by hand first. |
Learning objectives
After this chapter you will be able to:
- Say what a clock, a period, a source, a sink, a trunk, and an endpoint are, in plain words.
- Write a
CTS_CONSTRAINTmapping file for Nimbus-8 and load it, knowing that without-resetmaps append. - Place MIB clock pins by hand before any trunk command, because copies are read-only in this flow.
- Run block-level
synthesize_clock_trunk_endpointswith-clocks, and plant a black-box endpoint withset_clock_trunk_endpoints. - Read
report_clock_trunk_endpoints, including the dominant*and the-scriptwrite-back. - Run
check_design_for_clock_trunk_planning -clock(no s) before the top-level spine. - Set optional CTP pin constraints with
-cells, legal sides, and a feedthrough policy you said out loud. - Choose
optimize_subblocksorpush_downon purpose, and name the documented spelling conflict. - Synthesize with the plural command, then taste with
report_clock_trunk_qor, without treating return 1 as CTS.
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.
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.
Concepts built from first principles
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.
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.
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.
- Clock port. The source. Gold in the figures. On Nimbus-8 you query it; you do not invent
clk_cpuas a typed string you hope exists. - 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.
- Block clock pin. The door into a room. The clock enters
CPU_CLUSTERhere. A door is not a last station. - Block-level clock-trunk arc. The walk inside that room, from the door toward the endpoint. Still planning. Still not every flip-flop.
- 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.
- 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.
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.
| Clock | Frequency | Period | Role in this chapter |
|---|---|---|---|
clk_cpu | 1.60 GHz | 0.625 ns = 625 ps | The teaching spine, leftover channel into CPU_CLUSTER |
clk_npu | 1.10 GHz | 0.909 ns = 909 ps | The MIB lesson: two NPU copies, pins by hand first |
clk_isp | 800 MHz | 1.250 ns = 1,250 ps | Present. Not the first spine you grow |
clk_apb | 200 MHz | 5.000 ns = 5,000 ps | Slow bus clock. Still a real clock. Still query it |
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.Do not confuse these
| This | Is not this | Repair |
|---|---|---|
| Clock trunk | Clock tree | Trunk is source to endpoint. Tree is endpoint to flip-flops, later. |
| Clock port | Block clock pin | Port is the source. Pin is the door into a room. |
| Block clock pin | Endpoint | The door is not the last station. The endpoint has a delay behind it. |
| Feedthrough pin | Sink | A visit is not a destination. The buffer in the middle room is not a flip-flop. |
| Phase delay | Clock period | Delay sits behind the endpoint. Period is the whole tick. |
synthesize_clock_trunks | CTS done | Return 1 is a heartbeat. CTS still owns the leaves. |
| Clock pin from the spine | Pin assignment | Some clock pins may move. Every bundle waits for Chapter 13. |
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
| Switch | What it does | Teaching note |
|---|---|---|
-reset alone | Clears the map on the current design. | Empty is empty. Nothing is loaded. |
-reset with a filename | Replaces the saved map with the file. | This is the teaching load. |
| filename only | Appends 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.
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.
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]
| Switch | What it does | Teaching note |
|---|---|---|
-blocks | Child 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. |
-clocks | Which clocks to grow. Maps top clocks to block clocks. | Takes the s. Virtual clocks are skipped. Default is all clocks. |
-auto_clock connected\|local\|all | Associates block clocks with top clocks by a named rule. | Mutually exclusive with -clocks. |
-host_options | Distributed host option. Plural on this command. | If omitted, the tool looks for a global host option. |
-work_dir | Where scripts and logs land. | Default is the host’s work dir, or ./work_dir. |
-estimate_timing | Runs 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
| Switch | What it does | Teaching note |
|---|---|---|
| pins or ports | The objects that become endpoints. | Query with get_pins. Brace Tcl indexes. |
-clock | Which clock owns this endpoint. | No s. Default is all clocks — a wide broom. |
-delay | Phase delay from endpoint to sinks, in nanoseconds. | Teaching: 0.200 = 200 ps. Do not copy 20. |
-corners | Which corners get this endpoint. | Default is all corners. |
-auto_clock connected\|local\|all | Associates 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.
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
| Switch | What it does | Teaching note |
|---|---|---|
-clock | Report only these clocks. | No s. Default is all clocks. |
-corners | Report only these corners. | Default is all corners. |
-script | Writes set_clock_trunk_endpoints lines you can replay. | This is how you save what you just grew. |
| pins or ports | Report only these objects. | Default is every endpoint. |
-significant_digits | Digits after the decimal for time. | Optional. |
-nosplit | Keeps 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.
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
| Switch | What it does | Teaching note |
|---|---|---|
-clock | Which clocks to check. | No s. Default is every clock. |
-summary | Prints 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.
| Check name | ID | Message | What you do |
|---|---|---|---|
SUB_BLOCK_INST_WITH_INCORRECT_TYPE_OR_VIEW | TL-112 | Block 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_VIEW | TL-134 | Block 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_CHECK | TL-101 | Design view for the Abstract does not exist. | Create or bind a design view for that abstract. |
DESIGN_MISMATCH_CHECKS | TL-109 | Missing port in the block corresponding to a block-instance pin. | The child’s port list and the instance pin list must match. |
DESIGN_MISMATCH_CHECKS | TL-110 | Missing pin on the block instance corresponding to a port. | Same cut from the other side: pin and port must match. |
CORE_AREA_CHECK | TL-111 | Missing 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_CHECK | TL-130 | Missing location of block instance (Reference: …) in the design. | Place the block. Give it coordinates. |
LOC_SUB_BLOCK_CHECK | TL-131 | Block instance boundary is outside its parent block boundary. | Move the child inside the parent. |
LOC_SUB_BLOCK_PIN_CHECK | TL-126 | Missing 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_CHECK | TL-128 | Missing 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_CHECK | TL-129 | Leaf cell inside the block reference is outside the block boundary. | Move the leaf inside the room. |
VOLTAGE_AREA_CHECKS | TL-114 to TL-118 | Internal 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_CHECKS | TL-113 | Power domain does not have an associated voltage area. | Pair the domain with a voltage area. |
UNMAPPED_LOGIC_CHECK | TL-305 | The 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_CHECK | TL-140 | Output 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.
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
| Switch | What it does | Teaching note |
|---|---|---|
-init | Prepares: creates optimisable abstracts for children linked with abstracts. | Mutually exclusive with -commit. |
-commit | Updates after the spine: creates regular abstracts again. | Mutually exclusive with -init. |
-host_option | Distributed 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]
| Switch | What it does | Teaching note |
|---|---|---|
-cells | Which block instances take the constraint. Required. | A nearby flow example offers a positional name. New Tcl uses -cells. |
-sides | Sides 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_sides | Sides that must not take a clock pin. | Mutually exclusive with -sides. |
-offset | A 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_layers | Metals allowed for these pins. | Default is the design min-to-max you already set. Do not steal M4/M5. |
-allow_feedthroughs | true 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.
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]
| Switch | What it does | Teaching note |
|---|---|---|
-clock | Which clocks to plan. | No s. Default is all clocks. Mixing with -clocks is a syntax error. |
-list_only | Prints 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. |
-from | Starting stage. Default is pin_constr_generation. | THO flavour only. Does not apply in push-down. |
-to | Stopping stage. Default is clock_trunk_synthesis. | THO flavour only. There is no pin_check token. |
-incremental | Updates 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.
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]
| Switch | What it does | Teaching note |
|---|---|---|
-clock | Which 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]
| Switch | What it does | Teaching note |
|---|---|---|
-clock | Which clocks to report. | No s. Default is all clocks of the active modes. |
-endpoint_limit | Maximum endpoints before the command errors. | Default 100. Hitting it is often a driving-cell problem, not a sorting problem. |
-from_block | Only paths that start in these block instances. | Default is all blocks. |
-to_block | Only paths that end in these block instances. | Default is all blocks. |
-sort_by wns\|wns_ocv | Sort the report. | Default is WNS without OCV degradation. |
-violating_only | Only violating paths. | Optional. |
-significant_digits | Digits after the decimal, 0 to 13. | Default is 2. |
-nosplit | Keeps 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.
Inputs, outputs, and readiness
| Input | Why it matters | What you produce |
|---|---|---|
| Shaped blocks and leftover channel | The spine walks rooms and glue, not a sofa. | A clock port you queried, sitting in that leftover |
| Compiled PG on M4/M5 | Ignored layers must not steal the mesh. | CTS constraint files that name legal floors |
| Placed top-level flip-flops | Block-level CTP and top-level CTP both require them. | Endpoints with phase delay |
| MIB clock pins placed | Copies are read-only here. | A prior you can point at on both NPU instances |
Mapping file with CTS_CONSTRAINT | No line, no block-level run. | set_constraint_mapping_file -reset transcript |
| A flavour you named | THO and push-down do not share -from/-to. | report_app_options of flow_control |
Guided tool workflow
| Step | Command | What you prove |
|---|---|---|
| 1 | get_clocks / get_ports | The clock exists and you know its name |
| 2 | Place MIB clock pins by hand | The copies are no longer an unplaced prior |
| 3 | set_constraint_mapping_file -reset | Each reference owns one CTS file |
| 4 | synthesize_clock_trunk_endpoints -clocks | Endpoints and anchor cells exist |
| 5 | report_clock_trunk_endpoints | Delays and dominant * are numbers you read |
| 6 | check_design_for_clock_trunk_planning -clock | TL messages are empty, or explained |
| 7 | Optional set_ctp_constraints -cells | Legal sides, said feedthroughs |
| 8 | set_app_options flavour, then read back | THO or push-down, not a mixture |
| 9 | synthesize_clock_trunks -clock | A spine. Return 1 is not QoR |
| 10 | report_clock_trunk_qor after estimate_timing | A 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.
Failure modes and debugging
| What you see | Likely cause | What you inspect | What you do | The lesson |
|---|---|---|---|---|
synthesize_clock_trunk is unknown | Flow-picture singular | Command page | Use the plural | Plural in new Tcl |
| Block-level CTP does nothing | No CTS_CONSTRAINT line | Mapping file | Add the line; -reset if replacing | No recipe, no cook |
-clocks rejected on the spine command | Wrong flag | Endpoints use -clocks; spine uses -clock | Match the page | The s is not decoration |
pushdown rejected | Nearby flow spelling | man / command-page example | push_down | Named conflict |
-from ignored or errors in push-down | Stages are THO-only | flow_control | Drop -from/-to or change flavour | Flavour owns the flags |
-incremental errors immediately | No prior full run | Session history | Run a full synthesize first | Incremental is a second pass |
| TL-112 Frame view | Child bound to the wrong view | Block view | Use a design or a legal abstract | Feasibility before the spine |
| QoR looks invented | No estimate_timing, no derates | Report header | Estimate, then report | Taste has ingredients |
| Delay 20 on a 625 ps clock | Copied an example unit-blind | Period versus -delay | 0.200 ns = 200 ps teaching | Units are not optional |
| NPU copies disagree | MIB pins never placed | Both instances | Place by hand, then restart | Read-only means prior |
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.
- Query the clock. Write a mapping file with
CTS_CONSTRAINTfor both block references and the top. Load it with-reset. - Confirm top-level flip-flops are placed and blocks are shaped.
- Run
synthesize_clock_trunk_endpoints -clockson both references. Do not type-clockhere. - Report endpoints. Record the dominant
*delay in picoseconds and nanoseconds. - Run
check_design_for_clock_trunk_planning -clock ... -summary. Do not type-clocks. - Set
plan.clock_trunk.flow_controltooptimize_subblocksand read it back. Do not typepushdown. - 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
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.
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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Chapter close
Sign-off checklist for this planning stage
- You can point at source, door, endpoint, and feedthrough on a sketch.
- Clock ports were queried, not invented.
- MIB clock pins were placed by hand on both NPU copies.
- Mapping file has
CTS_CONSTRAINTfor every reference you ran, loaded with-resetif it replaced. - Ignored layers do not steal M4/M5; the leftover channel is still the spine’s geometry.
- Endpoints exist; delays are numbers with units; dominant
*was read. - Feasibility used
-clock, not-clocks, and TL messages are empty or explained. - Flavour is
optimize_subblocksorpush_down, read back, not mixed. - Synthesize used the plural command; return 1 was followed by
estimate_timingand QoR. - CTP pin sides, if used, started at 1, never 0, and CPU leftover used side 3.
- Pin assignment for every bundle was not mixed into this script.
Key-concept flashcards
A repeating tick. Frequency how often. Period the gap. clk_cpu is 625 ps.
A trunk is source to endpoint. CTS still owns the flip-flops.
Port, top arc, door, block arc, endpoint, feedthrough visit.
synthesize_clock_trunks returning 1 is a heartbeat, not QoR.
synthesize_clock_trunks. The picture’s singular is a conflict.
Endpoints: -clocks. Spine and check: -clock.
Command-page token. Nearby flow writes pushdown. Confirm with man.
Copies are read-only. Place clock pins by hand first.
CTS_CONSTRAINT per reference. Without -reset, maps append.
0.200 ns = 200 ps on a 625 ps clk_cpu. Estimate, not signoff.
Leftmost lowest edge, then clockwise. CPU leftover faces 3.
Pin assignment is Chapter 13. Budgeting waits later.
Compact glossary
| Term | Meaning as used in this book |
|---|---|
| Anchor cell | A buffer or inverter inserted during block-level trunk planning. |
| Block clock pin | The door where the clock enters a block. Not the endpoint. |
| Clock | A repeating tick. Frequency in GHz. Period in ns or ps. |
| Clock port | The source. Query with get_ports. |
| Clock-trunk endpoint | A 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_CONSTRAINT | Mapping-file keyword that attaches a CTS Tcl file to a reference. |
| Dominant endpoint | Worst downstream phase delay from a given block clock pin, marked *. |
| Feedthrough pin | A visit through a room that is not the sink. |
| Period | Time between ticks. 1 / frequency. clk_cpu is 625 ps. |
| Phase delay | Estimated time from endpoint to sinks. Not signoff insertion delay. |
| Push-down flavour | flow_control = push_down: read-only blocks, then push_down_clock_trunks. |
| Sink | A cell that uses the clock, usually a flip-flop. |
| THO flavour | flow_control = optimize_subblocks: editable blocks, three stages, MPH/MV. |
| Trunk / spine | Coarse 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.
- You have a top-level clock
clk_aand a block clock with a different name. Which endpoint flag associates them, and which flag is mutually exclusive with it? - A flow note says
synthesize_clock_trunk -to pin_check. What do you type instead, and which three stages exist in THO flavour? - You set
flow_controltopushdownand the tool rejects it. What token do you use, and which two capabilities does that flavour not support? - Block-level CTP on Hamal-3 does nothing for the second clock. Name the mapping-file cause and the reset rule.
- Hamal-3 uses a 300 ps endpoint delay. If someone copied
-delay 20from 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.