CHAPTER THIRTEEN
Pin Assignment: A Door Is Not a Route
By the end of this chapter you will know what a pin is, what a port is, and what a feedthrough visit is. You will fence the sides a room may use. You will keep a bus together as a bundle. You will check the design before you place, then place, then check again. And you will treat a returned place_pins as a heartbeat, not as a finished pin plan.
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. The clock already has a coarse spine from Chapter 12. What the city still lacks is an agreed set of doors. A pin is a door. The router cannot honour a map if the door sits on the wrong wall, on the wrong layer, or on a wall you promised to a clock.
Sit with Nimbus-8 the morning after Chapter 12. The leftover channel is still 2.091 mm² = 2,091,000 µm². The 128-bit CPU–NPU bus still has a map through that leftover. clk_cpu still ticks at 1.60 GHz = 625 ps, and its spine still ends at an estimated 0.200 ns = 200 ps. Those clock pins stay where you put them. Today you assign every other door the router will use.
If you skip this chapter, two expensive things happen. Either the placer dumps a 128-bit bus onto the clock wall, or two NPU copies disagree about which pin is which. Multiply instantiated block, then MIB: two copies of the same drawing. On Nimbus-8 those copies are u_npu_core_0 and u_npu_core_1, sharing NPU_CORE.
One more thing, because it will happen to you. You will type place_pins. It will return 1. That means the command finished. It does not mean every pin is on a legal side. It does not mean the bundle stayed together. It does not mean check_pin_placement is a report you would ship. Those are other commands.
Prerequisites
Chapter 12, because clock pins are already placed and must stay fixed. Chapter 11, because the leftover channel already holds a bus map and you must not park every pin 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 — pins sit on rooms, not on names.
The library is nimbus8.dlib. The top is NIMBUS8. Teaching pin, port, and net names in this book are stand-ins. Query them with get_pins, get_ports, and get_nets. Brace Tcl indexes.
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 |
|---|---|---|
| pin | a door on a block | Where a net enters or leaves a room. Query with get_pins. |
| port | a door at the top | A pin of the current design. Query with get_ports. |
| terminal | the metal shape | The geometry on a layer and a track. Query with get_terminals. |
| side 1 | leftmost lowest edge | Then clockwise. 0 is illegal. On CPU, leftover faces side 3. |
| offset | distance along a side | Microns, or a percentage such as 10%. A range is two numbers. |
| bundle | bits kept as one ribbon | A 128-bit bus is one conversation. create_bundle names it. |
| feedthrough | a visit | The net walks through a room that is not the destination. Default on the block cook is false. |
| pin blockage | a no-parking zone | create_pin_blockage. Feedthrough-only means only visits are banned. |
| hard constraint | honour even if DRC breaks | Spacing, location, layer, length. Say it out loud if you mean it. |
| MIB | multiply instantiated block | Two copies, one drawing. Pins must match on both NPU copies. |
| incremental | move a little, not start again | plan.pins.incremental. Fix first with set_fixed_objects. |
| quiet success | return 1 | place_pins finished. The taste is check_pin_placement. |
Learning objectives
After this chapter you will be able to:
- Say what a pin, a port, a terminal, a side, a bundle, and a feedthrough are, in plain words.
- Number sides from 1, clockwise, and put the CPU leftover on side 3.
- Create a pin blockage, including the feedthrough-only flavour.
- Set block pin constraints, name the retirement conflict, and read them back.
- Write individual and bundle constraints with
create_pin_constraint, and name the other family. - Load a pin-constraint file with four sections, and write one back with a required
-file_name. - Run
check_pre_pin_placementbeforeplace_pins, and read DPPA-441 as a direction clash. - Place pins with the documented switches, then check, report, and estimate length.
- Keep MIB copies honest with
check_mib_for_pin_placement. - Leave budgeting for Chapter 14, and leave clock trunks in Chapter 12.
The beginner’s mental model
A loading dock is not the motorway
Hold a warehouse drawing that shows only the docks. The motorway that connects two warehouses is someone else’s drawing. A pin is a dock. The net is the truck. Chapter 11 already drew the motorway for the 128-bit bus. This chapter decides which dock the truck uses, on which wall, on which floor of metal.
The analogy stops being silicon quite quickly, and that is the point. A dock has a numbered wall. Side 1 is the leftmost lowest edge, then clockwise. A dock sits on a metal layer whose preferred direction must match that wall. Two copies of the same warehouse must have matching docks. A cheerful return value means the placer finished. Tasting is check_pin_placement.
The precise engineering model
The database already has shaped blocks, a leftover channel, a compiled power grid, a bus map, and a clock spine. Pin assignment adds legal doors on that geometry. You optionally draw a no-parking zone. You set rules for a whole room. You set rules for one pin or one bundle. You may load a constraint file that names walks and visits. You check whether those rules even make sense. Then you place. Then you check again.
Two families of Tcl exist for the same job, and they are not a style choice. The flow picture writes create_pin_constraint for individual and bundle rules, and set_block_pin_constraints for the room. The place_pins command page also lists set_individual_pin_constraints, set_bundle_pin_constraints, and create_block_pin_constraint. The block command page says set_block_pin_constraints will retire, and names create_block_pin_constraint as the successor. New Tcl in this book uses the flow cook: set_block_pin_constraints and create_pin_constraint. Name the other family. Confirm with man.
The practical loop is kind to beginners. Fix clock pins. Fence sides. Bundle the bus. Pre-check. Place. Check. Write the map back. Four small walks are easier to debug than one giant one.
Concepts built from first principles
Part 1 — What a pin actually is
Do not start with a command. Start with the thing the command is trying to build. If you cannot point at a door, a wall, a layer, and a visit on a sketch, the Tcl will only hide the fog.
Pin, port, terminal, feedthrough
A pin is a door on a block. A net uses that door to enter or leave the room. Query it with get_pins. A port is a door at the top of the design you are sitting in. Query it with get_ports. A terminal is the metal shape of that door: a rectangle on a layer, snapped to a wire track. Query it with get_terminals.
A feedthrough is a visit. The net walks through a room that is not the destination. The tool may split the original net, create new ports, and change the netlist. That is not a small side effect. Say the word visit out loud before you allow it.
Teaching names in this book are stand-ins. On a real netlist you ask the design. You do not type a name from memory.
Sides, clockwise from 1
Every edge of a room has a number. Side 1 is the leftmost lowest edge. Then you walk clockwise. On a simple rectangle that is: 1 left, 2 top, 3 right, 4 bottom. You cannot specify 0. On Nimbus-8 the leftover channel faces the right edge of CPU_CLUSTER. That is side 3. The matching NPU doors face left. That is side 1 of each copy.
A nearby example writes -side 3, no s. The command pages write -sides. New Tcl uses -sides. Confirm with man. -sides and -exclude_sides are mutually exclusive. An empty list resets.
Layers this chapter may use
A pin sits on a metal layer. That layer has a preferred routing direction. A horizontal layer wants a vertical edge — sides 1 or 3. A vertical layer wants a horizontal edge — sides 2 or 4. If you fence a horizontal layer onto the top and bottom, the pre-check will tell you. That message is DPPA-441. It is a constraint conflict, not a router bug.
On Nimbus-8 the teaching bus from Chapter 11 lives on M3 horizontal and M6 vertical. The power mesh from Chapter 10 still owns M4 vertical and M5 horizontal at a 20 µm pitch. You do not steal M4 or M5 because they look fat. You query get_layers. You do not invent METAL3 if the library says M3.
Do not confuse these
| This | Is not this | Repair |
|---|---|---|
| Pin | Net | The pin is the door. The net is the truck. |
| Pin | Terminal | The pin is the object. The terminal is the metal shape. |
| Port | Block pin | A port is a top door. A block pin is a room door. |
| Feedthrough | Sink | A visit is not a destination. |
| Side 3 | Side 1 | CPU leftover faces 3. NPU leftover faces 1. 0 is illegal. |
| Bundle | Supernet | A bundle groups nets for pin order. A supernet was Chapter 11’s estimate object. |
place_pins | Checked pins | Return 1 is a heartbeat. The taste is check_pin_placement. |
| Clock pin from the spine | This chapter’s cook | Fix those pins. Then assign the rest. |
place_pins? You will place doors you cannot point at. The command will run. The picture in your head will be a route. The database will hold triangles. That gap is how quiet success gets shipped.Part 2 — Pin blockages
A pin blockage is a region where pins must not sit. Draw it before you place. The boundary can be a rectangle, a polygon, or a collection of objects with physical geometry. If you name pins, nets, or ports, the list must be one type — not a mix. If you name none, every pin avoids the region.
# Rectangle. All layers. Every pin avoids PB_1
icc2_shell> create_pin_blockage -boundary {{100 100} {200 200}} -name PB_1
# Rectilinear region, only M1 and M2
icc2_shell> create_pin_blockage -boundary {{0 0} {2000 0} \
{2000 2000} {1000 2000} {1000 1000} {0 1000}} -layers {M1 M2}
# Homogeneous pin list. Teaching names: query first
icc2_shell> set pins [get_pins -physical_context cell1/pin*]
icc2_shell> create_pin_blockage -boundary {{100 100} {200 200}} $pins
| Switch | What it does | Teaching note |
|---|---|---|
-boundary | Rectangle, polygon, or physical objects. | Required. Objects must resolve to one connected polygon. |
-layers | Which layers the ban applies to. | Omit it and the ban is every layer. |
-name | Gives the blockage a name. | Teaching: PB_1. |
-cell | Which physical cell receives the blockage. | Coordinates are in the cell’s top. Default is the current block. |
-feedthrough_only | Bans visits in that region, not every pin. | On conflict, this flavour beats other pin constraints. |
| object list | Pins or nets or ports that must avoid the region. | Homogeneous. No mix. No list means everyone avoids it. |
Remove with remove_pin_blockages. Report with report_pin_blockages. A pin guide or a routing corridor is the opposite idea: a region pins should stay inside. Do not mix the two in your head.
Part 3 — Precedence
Several rules can claim the same pin. The tool does not average them. It stacks them.
- Topological map and feedthrough control in the constraint file override global feedthrough settings.
- Individual pin constraints beat bundle pin constraints.
- Bundle pin constraints beat nondefault routing rules.
- Nondefault routing rules beat block pin constraints.
- More restrictive beats less restrictive. An exact location beats a pin guide.
- Among several constraints of the same kind, the last one specified wins.
When an individual side, offset, layer, or order fights a bundle, place_pins ignores the bundle for those nets and still tries to keep the other bundle pins together. When width, length, or spacing fight, the tool honours both if it can. Hard constraints skip DRC. Feedthrough-only blockages sit above other pin constraints on conflict.
Part 4 — Block pin constraints
Block pin constraints are the floor of the stack. They apply to all pins of a room unless a higher rule takes over. The flow cook is set_block_pin_constraints. Report with report_block_pin_constraints. Remove with remove_block_pin_constraints, then set again.
set_block_pin_constraints will retire, and names create_block_pin_constraint as the successor. The successor uses different switch spellings: -pin_spacing_track_count not -pin_spacing, -excluded_sides not -exclude_sides, -corner_keepout_track_count not -corner_keepout_num_tracks, and -allow_feedthroughs as a flag rather than true|false. New Tcl in this book stays with the flow cook so you are not taught two verbs for one job. Name the retirement. Confirm with man on the build in the room.# CPU leftover faces side 3. Query layers. Visits off unless you mean them
icc2_shell> set_block_pin_constraints \
-cells [get_cells u_cpu_cluster] \
-sides {3} \
-allowed_layers [get_layers {M3 M6}] \
-allow_feedthroughs false \
-pin_spacing 1 \
-corner_keepout_num_tracks 5
| Switch | What it does | Teaching note |
|---|---|---|
-allowed_layers | Layers pins may use. | Query get_layers. Do not steal M4/M5. |
-corner_keepout_num_tracks | Tracks from the corner before the first pin. | Default five tracks if neither keepout is set. Mutex with distance. |
-corner_keepout_distance | Same idea, in microns. | Mutex with the track form. |
-pin_spacing | Tracks between adjacent pins. | Default one track. Mutex with distance. |
-pin_spacing_distance | Same idea, in microns. | Pins still snap to tracks. |
-sides | Walls pins must use. | From 1, clockwise. Empty list resets. Mutex with exclude. |
-exclude_sides | Walls pins must not use. | Empty list resets. Mutex with -sides. |
-allow_feedthroughs | true or false. | Default false. A visit changes the netlist. |
-stacking_allowed | any / none / with_pg_pins_only / with_signal_pins_only. | Default any. Successor switch is -stacking_type. |
-cells | Which rooms. | Default is every block. Use the instance collection. |
-self | Apply to the top. | Top ports, not child doors. |
-width / -length | Common number, or layer-number pairs. | Width is across the preferred direction. Length is along it. |
-hard_constraints | layer, spacing, location, length, or off. | Hard skips DRC. Say it out loud. |
On Nimbus-8 you also fence the NPU copies to side 1, and you keep ISP closed to visits so the bus cannot punch the sofa. Read the constraints back. Empty is not a recipe.
icc2_shell> report_block_pin_constraints
Part 5 — Individual pin constraints
After the room rules, you may constrain one pin, one port, or one net. Individual rules beat the bundle and beat the room. The flow cook is create_pin_constraint -type individual. You must give -type individual and at least one of -pins, -ports, or -nets.
The other family is set_individual_pin_constraints. place_pins honours it. Layer switch there is -allowed_layers, not -layers. New Tcl uses the flow cook. Name both. Confirm with man.
To clear the flow-cook objects, the flow uses remove_pin_constraints [get_pin_constraints -filter {pin_constraint_type=="individual"}]. That command exists. The other family clears with remove_individual_pin_constraints. Do not mix the two as if they were one broom.
# Teaching pin: query first. Last specified wins if you set twice
icc2_shell> create_pin_constraint -type individual \
-pins [get_pins {u_cpu_cluster/rstn}] \
-sides {4} \
-width {{M3 3} {M5 5}} -length {{M3 3} {M5 5}}
# Offset as a percentage of side 3. Command page: -sides, not -side
icc2_shell> create_pin_constraint -type individual \
-layers [get_layers {M2 M3}] \
-nets [get_nets clk] \
-offset {10% 40%} -sides {3}
| Switch | What it does | Teaching note |
|---|---|---|
-type individual | This is not a bundle rule. | Required. Wrong type-specific switch is an error. |
-pins / -ports / -nets | What is constrained. | Need at least one. Query. Brace indexes. |
-cells | Limit to those rooms. | Only valid with -nets for individual. |
-layers | Allowed metals. | Other family says -allowed_layers. |
-sides / -exclude_sides | Walls allowed or banned. | Mutex. From 1. Nearby example writes -side. |
-offset | One number, a range, or percentages. | 10% is ten percent of that side. |
-location {x y} | Exact point in the top. | Beats a guide. Hard if you mark it hard at block level. |
-off_edge | Allow off-edge placement. | Fixed off-edge pins are ignored in global route. DPPA-458. |
-pin_spacing_tracks / -pin_spacing_distance | Neighbour gap. | Mutex. Other family uses -pin_spacing for tracks. |
-width / -length | Common or per-layer pairs. | A second command overrides or merges per the command page. |
-allow_feedthroughs | Visits for those nets. | Only with -nets. Mutex with -cells. Per-cell visits need the file. |
Report the flow-cook objects with report_pin_constraints. The pre-check narrative also names report_individual_pin_constraints. That command exists too. Use the report that matches the family you set.
-type individual and a pin, port, or net. -sides takes the s. Two remove commands are not one broom.Part 6 — Bundles
A bundle is a named ribbon of nets. The placer tries to keep those doors together on one edge, on one layer, in an order you can defend. A 128-bit bus that scatters around a room becomes a knot.
# Teaching names. Query the nets. Brace indexes
icc2_shell> create_bundle -name cpu_npu_data \
[get_nets {cpu_npu_data[127:0]}]
icc2_shell> report_bundles [get_bundles cpu_npu_data]
Automatic bundles from a prefix:
icc2_shell> create_bundles_from_patterns -net_name_prefix cpu_npu_data
Omit the prefix and the command looks for bus index patterns [i], (i), <i>, _i, :i, and {i}. Limit those with -no_braces, -no_brackets, -no_angle_brackets, -no_underlines, -no_colons, or -no_parentheses. Order with -net_order ascending|descending. Size with -minimum_nets and -maximum_nets.
Add or remove nets with add_to_bundle and remove_from_bundle. Collect with get_bundles. Delete with remove_bundles. You may also bundle supernets from Chapter 11. A bundle is not a supernet. Do not mix the words.
Then constrain the ribbon. The flow cook is create_pin_constraint -type bundle. A nearby example writes keep_pins_together true without the dash. The command page writes -keep_pins_together. New Tcl keeps the dash.
# Dash on the switch. Query the bundle
icc2_shell> create_pin_constraint -type bundle \
-bundles [get_bundles cpu_npu_data] \
-keep_pins_together true \
-layers [get_layers {M3 M6}]
| Switch | What it does | Teaching note |
|---|---|---|
-type bundle | This is not an individual rule. | Required. |
-bundles | Which ribbons. | Default is easy to over-apply. Name the bundle. |
-cells / -self | Rooms, or the top. | Unspecified applies widely. Say the rooms. |
-keep_pins_together | Same layer (hard), no strangers between (soft). | Default false. Nearby example drops the dash. |
-sides / -range | Where the ribbon may sit. | Range can be microns or percent. |
-bundle_order | ordered / increasing / decreasing / equal-distance. | Honoured only when keep-together is true. Order is net order, as seen at the top. |
-allow_feedthroughs | Visits for the ribbon. | Default follows the room unless you say it. |
-layers | Allowed metals. | Other family: -allowed_layers. |
-pin_spacing_tracks / -pin_spacing_distance | Gap inside the ribbon. | Mutex. |
-interleaving_layer_range / -interleaving_bit_offset | How bits share layers. | Bundle-only switches. Wrong type is an error. |
The other family is set_bundle_pin_constraints. check_pin_placement -keep_pins_together talks about that family. Name both.
You can split a wide bus into two ribbons on purpose. Bits 0–127 walk through one room. Bits 128–255 walk through another. That is two bundles, two constraints, two walks — not one giant ribbon you hope will behave.
Priority among ribbons: smaller pin_placement_priority_id is placed first. Bundle nets beat non-bundle nets when bundle placement is enabled.
icc2_shell> set_attribute [get_bundles cpu_npu_data] pin_placement_priority_id 1
Part 7 — The constraint file
Tcl is not the only way. A pin-constraint file can name walks, visits, physical locations, per-edge spacing, and room rules. Load it with read_pin_constraints -file_name. Write it with write_pin_constraints, where -file_name is required.
Supported section headers, each ended with a matching end …;:
start topological map;— the walk through rooms.start feedthrough control;— which rooms may be visited. Later statements override earlier ones for the same net.start physical pin constraints;— side, layer, offset, off-edge, location. Last record wins on an MIB port.start pin spacing control;— per reference, per sides, per layer track spacing. Unspecified layers on those sides are not used.start block pin constraints;— the same floor you can set in Tcl.
Comments begin with #. Curly brackets group objects. A semicolon ends a record. Keywords are case-insensitive; reference names and layer names are not.
# Teaching walk. Names are stand-ins. Query cells and nets
start topological map;
{Nets cpu_npu_data*}
{{Cell u_cpu_cluster} {Cell u_npu_core_0}}
{{Cell u_cpu_cluster} {Cell u_npu_core_1}};
end topological map;
A topological record can also name sides, offsets, and layers on each cell. Partial paths are allowed. Mixed feedthroughs — allowed in some rooms, banned in others — live in the feedthrough-control section as {Feedthrough …} and {NoFeedthrough …}.
The GUI can draw the same walk. The flow names create_topological_constraint (singular) for that Tcl. The place_pins page lists create_topological_constraints (plural). New Tcl: confirm with man which token exists on the build in the room. Retrieve with get_topological_constraints. Report with report_topological_constraints -all. Remove with remove_topological_constraints.
man.Part 8 — Before you place
If the design has MIB copies or existing visits, you may global-route first, then place from that route.
# Virtual-flat: top and children, or top-and-interface only
icc2_shell> route_global -floorplan true \
-virtual_flat all_routing
icc2_shell> place_pins -use_existing_routing
-virtual_flat top_and_interface_routing_only routes the top and the nets that touch children, including interface and feedthrough nets. -use_existing_routing cannot combine with -pins or with -nets_to_exclude_from_routing. Those routes are removed after place. If no route exists for a net, the door may not be optimal, and the command will not invent a flyline either.
A channel congestion map, before place, uses create_channel_congestion_map -channel_width_threshold. Channels wider than the threshold are ignored. The command runs a global route first. View it in the GUI as Channel Congestion. There is also a what-if panel. Teaching: look, then constrain. Do not place into a channel you already know is full.
Then the named pre-check. Either:
icc2_shell> check_pre_pin_placement
icc2_shell> check_design -checks {dp_pre_block_shaping \
dp_pre_macro_placement dp_pre_pin_placement}
Also useful before place: report_placement, check_mib_alignment from Chapter 11, check_mib_for_pin_placement, and the report commands for each constraint family.
| Switch or finding | What it does | Teaching note |
|---|---|---|
-filename | Write the check to a file. | Default is the console. |
-self | Check top ports, not block pins. | Same idea as other -self flags in this chapter. |
| DPPA-441 | Allowed layer direction fights allowed or excluded sides. | M3 horizontal on sides 2 and 4 is the textbook clash. |
| DPPA-458 | A fixed pin is off-edge, outside the boundary. | That pin is ignored in global route and place. |
| No tracks on an edge | A wall has no overlapping tracks. | A door cannot snap to a track that is not there. |
| Infeasible connection | Two cells separated by a room with visits off. | Turn visits on, or change the walk. |
| Impossible topo pair | A named walk cannot be built. | Repair the file, not the router. |
place_pins into a DPPA-441 you have not read is how a “legal” pin sits on a wall the layer cannot serve. The pre-check is the gate. The placer is not a translator of bad rules into good doors.-use_existing_routing. Pre-check before place. DPPA-441 is a direction clash. DPPA-458 is a fixed pin you already threw away.Part 9 — place_pins
After the rules, place. The command global-routes, then snaps doors to wire tracks. It does not use reserved tracks. Top ports use top tracks. Block pins use tracks inside that block, or top tracks if the child has none.
# Heartbeat is 1. Taste is the next part
icc2_shell> set_host_options -max_cores 4
icc2_shell> place_pins
| Switch | What it does | Teaching note |
|---|---|---|
| (none) | All editable blocks without fixed physical pins. | Wide broom. Prefer a net or cell list on a real chip. |
-cells | Only those rooms, and only their connected nets. | On MIB, pick the instance. Blockages on all copies still count. Congestion around unselected copies is ignored. |
-nets | Only those nets. | Teaching: the bundle’s nets. |
-pins | Only those pins. | Skips feedthrough creation on those nets. |
-ports | Only those top terminals. | Default is all block pins, not “ports means everything.” |
-exclude_nets | Skip those nets entirely. | No place, no visit. |
-nets_to_exclude_from_routing | Skip route, still place from connectivity. | Honours pin constraints. Does not honour feedthrough constraints. Mutex with -use_existing_routing. |
-self | Top-level ports of the current design. | Default is children, not self. |
-legalize | Only legalise existing shapes. | Forces incremental. Skips route. Mutex with existing-routing and exclude-from-routing. Ignores abut-pin synthesis. |
-use_existing_routing | Place from routes you already ran. | Mutex with -pins. Routes are removed after. |
If constraints are too tight and not hard, the placer relaxes in a documented order: spacing versus offset depending on whether a range exists, then edge abutment, then offset, layer, and spacing in further passes. Hard constraints skip their relaxation. That is why a hard location inside a blockage still sits there.
Application options steer the same command. Read them back with report_app_options. Do not memorise a hidden default.
| Option | What it does | Teaching note |
|---|---|---|
plan.pins.incremental | Stay near the old home. | Moves inside pin_range and layer_range if wire length, congestion, and alignment do not degrade. |
plan.pins.pin_range | How far an incremental pin may move. | Microns. Meaningless if incremental is false. |
plan.pins.layer_range | How many layers away it may jump. | Same. |
plan.pins.exclude_clocks_from_feedthroughs | Whether clock pins may be visits. | Chapter 12 already told you to read this back. |
plan.pins.minimize_feedthroughs | Fewer visits, more detours. | A trade, not a free lunch. |
plan.pins.strict_alignment | Ignore tracks to force alignment. | Different from align_block_pins. |
plan.pins.fast_route | Internal fast global route for assignment. | Honours pin constraints and most routing rules, including NDRs, corridors, guides, blockages, pin guides. |
plan.pins.synthesize_abutted_pins | Create matching pins on neighbours. | Needs abutment_threshold if you want narrow channels treated as abutments. Ignored in -legalize. |
plan.pins.reserved_channel_threshold | When a channel is “narrow.” | Larger value, more visits. Pair with -allow_feedthroughs true on the rooms. |
plan.pins.treat_pg_as_shield | Spacing check treats PG as a stop. | Used by check_pin_placement spacing. |
plan.pins.enable_feedthrough_timestamps | Stamp each place/push-down round. | Needed before write_shadow_eco -latest_rounds. |
Other documented options exist — black-box style, colour span rules, inout-net visits, bus naming, path-based placement. Do not invent a sixth one. Read the option you mean.
place_pins routes, then snaps. Return 1 is a heartbeat. -pins skips visits. Incremental is an option plus a range, not a feeling.Part 10 — Incremental, MIB sharing, and alignment
place_pins already removes nonfixed terminals each run. To force a clean edge, remove_terminals on the pins of that room. Avoid remove_pins unless you mean to disconnect nets. That command changes the netlist.
Hard bundles first, then fix, then the next ribbon:
# Teaching: difficult ribbon first. Query bundles
icc2_shell> set_block_pin_constraints -allow_feedthroughs true
icc2_shell> create_bundle -name B1 [get_nets {Data[0] Data[1] Data[2] Data[3]}]
icc2_shell> create_bundle -name B2 [get_nets {Data[4] Data[5] Data[6] Data[7]}]
icc2_shell> set_bundle_pin_constraints -keep_pins_together true
icc2_shell> place_pins -nets [get_nets -of_objects [get_bundles {B1}]]
icc2_shell> set_fixed_objects [get_pins -filter "is_hierarchical==true" \
-of_objects [get_nets -segments [get_nets \
-of_objects [get_bundles {B1}]]]]
icc2_shell> place_pins -nets [get_nets -of_objects [get_bundles {B2}]]
Before an incremental pass that should be free to move, remove_feedthroughs. Then optionally set plan.pins.incremental true. Clock pins from Chapter 12 belong in the fixed list before the 128-bit bus is placed.
On MIB copies, visits can explode. Set feedthrough_sharing_matching_id on nets or on bundles, not both. Same id means the tool tries to share. Default is 0 for every net. Setting two nets to different ids is how you stop them sharing.
Alignment after place is a different command. align_block_pins moves the alignee to the anchor. Two-pin nets only. Immediate sibling, nearest child, or nearest parent. No obstacles between the rooms. It does not honour side, layer, or offset constraints — place_pins does.
icc2_shell> align_block_pins -anchor u_cpu_cluster -alignee u_npu_core_0
| Switch | What it does | Teaching note |
|---|---|---|
-anchor | The room whose terminals are the reference. | May be the top via [current_design]. |
-alignee | The room that moves. | Sibling, nearest child, or nearest parent. |
-change_layer | Match the anchor layer. | Mutex with the two width/height flavours. |
-change_layer_width / -change_layer_height | Match layer and size. | Mutex with each other and with -change_layer. |
-off_edge | Allow off-edge pairs. | Lower-left to lower-left. Outside the alignee boundary: no move. |
-report_prefix | Prefix of the skip report. | Default includes anchor, alignee, and a timestamp. |
It will not move a PG net, a multi-fanout net, a hard-macro alignee, a multi-terminal pin, or a fixed alignee pin. The report lists the skips. Read it.
Part 11 — Checking after place
Now taste. check_pin_placement has many switches. Teaching first pass:
icc2_shell> check_pin_placement -pin_spacing true -layers true
icc2_shell> check_feedthroughs -unused_feedthroughs \
-reused_feedthroughs -net_constraints -topo_constraints
icc2_shell> check_mib_for_pin_placement -swapped_connections \
-asymmetric_connections -top_level_terminal_locations
icc2_shell> report_pin_placement > pin_placement.rpt
icc2_shell> report_feedthroughs -reporting_style net_based
report_feedthroughs -reporting_style is required. Values are net_based or block_based. UG mentions -format {layer side offset cell} on the pin report. The command page lists -format {layer side offset}. New Tcl uses the command-page three tokens. Confirm with man.
| Switch | What it does | Teaching note |
|---|---|---|
-layers | Pin on an allowed layer. | First-pass pair with spacing. |
-pin_spacing | Neighbour gap, including preroute. | plan.pins.treat_pg_as_shield changes how PG counts. |
-missing | A port with no pin. | Default on in the flow example. |
-shorts | Overlap. Default on. | -shorts false turns it off. -pre_route is a different short check. |
-sides / -offset / -order / -location | Honour those constraints. | Individual offset is -offset. |
-alignment | Two-pin nets face. Also litho-grid edges. | Pair with -connection_type and -alignment_tolerance_distance. |
-pin_detour / -path_detour | Bounding box too fat versus pins, or versus registers. | -detour_tolerance is a ratio. Constraints optional via -detour_consider_pin_constraints. |
-keep_pins_together | Ribbon still a ribbon. | Only bundles that were constrained true. Talks to set_bundle_pin_constraints. |
-self | Top terminals only. | Default is block pins. |
-error_view / -filename / -output_directory | Where the findings land. | A view you can browse, not a feeling. |
More switches exist: blockage, guide, corridor, mask colour, size, stacking, wire track, wide track, synthesized abut pins, single-pin, technology spacing. Do not invent one. Name the one you ran.
| Switch | What it does | Teaching note |
|---|---|---|
-asymmetric_connections | Same pin, different number or type of connections. | DPPA-205. Not limited to two-pin nets. Skips tie-high / tie-low. |
-swapped_connections | Two-pin nets that do not meet the same pin across copies. | DPPA-203. A subset of asymmetric. |
-top_level_terminal_locations | Same MIB pin, different top terminal places. | DPPA-204. |
-cells / -nets | Limit the check. | Default is every MIB pin the check applies to. |
check_feedthroughs teaching switches: -unused_feedthroughs, -reused_feedthroughs (MIB), -net_constraints, -topo_constraints, -redundant (almost mutex with the others), -include_buffered, -self, -cells, -alignment with -alignment_tolerance_distance. Unused on one MIB copy while another copy needs the visit is a classic MIB trap. That is why unused is a check, not an insult.
-reporting_style is required on the feedthrough report. DPPA-203 is a swap. DPPA-205 is a wider mismatch.Part 12 — Write back, shadow ECO, and estimated length
Write what you have so the next session can honour it.
icc2_shell> write_pin_constraints -from_existing_pins \
-file_name pin_constraints.map \
-topological_map {side offset offset_range 5 layer layer_range 1}
| Switch | What it does | Teaching note |
|---|---|---|
-file_name | Where the file lands. | Required. |
-from_existing_pins | Write from where pins actually sit. | Without topo/physical selectors, writes physical side, layer, offset, length, width. |
-topological_map | Which topo fields to emit. | offset_range 5 around 20 becomes {15 25}. layer_range 1 around M4 becomes M3–M5. |
-physical_pin_constraint | Which physical fields to emit. | Same range idea. |
-pins / -nets / -ports / -cells / -bundles | Subset. | -exclude_nets is the broom’s negative. |
-self | Top ports. | Matches the rest of the family. |
Visits created by place_pins or push_down_objects set is_shadow true on the new objects. Replay them with write_shadow_eco.
icc2_shell> write_shadow_eco -command_style icc2 \
-output feedthroughs.tcl
-command_style is icc2 or dc. -reporting_style is design_based (one script) or block_based (one script per block). To keep only recent rounds, set plan.pins.enable_feedthrough_timestamps true at the start of the session, then -latest_rounds {1 2} where 1 is the most recent place_pins or push_down_objects.
Estimated length after place is get_estimated_wirelength. The section title nearby says “Reporting Estimated Wire Length.” The command is not report_estimated_wire_length. It builds a virtual route across hierarchies. set_editability limits which hierarchies count. The number is an estimate, not signoff.
icc2_shell> get_estimated_wirelength
icc2_shell> get_estimated_wirelength -nets [get_nets {din[0] dout[0]}]
Inputs, outputs, and readiness
| Kind | Object | Honesty rule |
|---|---|---|
| Input | Shaped blocks, leftover channel | Chapter 9 geometry. Channel 2.091 mm² = 2,091,000 µm². |
| Input | Compiled PG mesh | M4/M5 still 20 µm. Not pin layers you steal. |
| Input | Bus map | Chapter 11. M3 H / M6 V teaching bus. |
| Input | Clock spine and clock pins | Chapter 12. Fix those pins before this cook. |
| Input | Queried nets, pins, ports, layers | Stand-ins in this book are not a netlist. |
| Output | Placed terminals on tracks | Heartbeat is not the check. |
| Output | Constraint file / shadow ECO | Replayable. Required filenames. |
| Not output | Budgets | Chapter 14. |
| Not output | A finished route | Global route here is a means. Detail route waits. |
Preflight: blocks shaped, clock pins fixed, MIB copies identified, layers queried, leftover-facing sides said out loud (CPU 3, NPU 1), visits on or off said out loud, pre-check empty or explained.
Guided tool workflow
| Step | You do | Command |
|---|---|---|
| 1 | Fix clock pins. | set_fixed_objects |
| 2 | Optional no-parking zone. | create_pin_blockage |
| 3 | Fence rooms. | set_block_pin_constraints |
| 4 | Individual exceptions. | create_pin_constraint -type individual |
| 5 | Name the ribbon. | create_bundle then -type bundle |
| 6 | Optional file. | read_pin_constraints -file_name |
| 7 | Pre-check. | check_pre_pin_placement |
| 8 | Place. | place_pins |
| 9 | Taste. | check_pin_placement, check_feedthroughs, check_mib_for_pin_placement |
| 10 | Write back. | write_pin_constraints -file_name |
Validation gates: DPPA-441/458 empty or explained; spacing and layer checks clean or owned; MIB copies not swapped; estimated length labelled as an estimate.
One continuous worked example
Nimbus-8. Library nimbus8.dlib. Top NIMBUS8. Leftover 2.091 mm² = 2,091,000 µm². Teaching bus M3/M6. Mesh M4/M5. Clock pins already placed.
# Teaching stand-ins. Query before you copy
icc2_shell> set_fixed_objects [get_pins \
{u_cpu_cluster/clk u_npu_core_0/clk u_npu_core_1/clk}]
icc2_shell> set_block_pin_constraints \
-cells [get_cells u_cpu_cluster] \
-sides {3} \
-allowed_layers [get_layers {M3 M6}] \
-allow_feedthroughs false
icc2_shell> set_block_pin_constraints \
-cells [get_cells {u_npu_core_0 u_npu_core_1}] \
-sides {1} \
-allowed_layers [get_layers {M3 M6}] \
-allow_feedthroughs false
icc2_shell> set_block_pin_constraints \
-cells [get_cells u_isp] \
-allow_feedthroughs false
icc2_shell> create_bundle -name cpu_npu_data \
[get_nets {cpu_npu_data[127:0]}]
icc2_shell> create_pin_constraint -type bundle \
-bundles [get_bundles cpu_npu_data] \
-keep_pins_together true \
-layers [get_layers {M3 M6}]
icc2_shell> check_pre_pin_placement
icc2_shell> place_pins -nets [get_nets -of_objects [get_bundles cpu_npu_data]]
icc2_shell> check_pin_placement -pin_spacing true -layers true -alignment true
icc2_shell> check_mib_for_pin_placement -asymmetric_connections \
-swapped_connections
icc2_shell> report_pin_placement -nets [get_nets -of_objects \
[get_bundles cpu_npu_data]] > pin_placement.rpt
icc2_shell> write_pin_constraints -from_existing_pins \
-file_name pin_constraints.map
icc2_shell> get_estimated_wirelength -nets [get_nets -of_objects \
[get_bundles cpu_npu_data]]
Read return 1 as a heartbeat. Read DPPA as a sentence. If the NPU copies disagree, you skipped the MIB check, or you placed only one instance with -cells and hoped the drawing would invent the other door.
Failure modes and debugging
| What you see | What it usually is | What you do |
|---|---|---|
| DPPA-441 | Layer direction fights sides. | Change layers or sides. Do not reroute first. |
| DPPA-458 | Fixed pin off-edge. | Unfix, or move on-edge. It is ignored until you do. |
| DPPA-203 / 205 | MIB pins disagree. | Place both copies. Do not hope the drawing invents a door. |
| DPPA-204 | Same MIB pin, different top terminals. | Align top terminals, or stop treating copies as independent chips. |
| Bundle scattered | Keep-together never set, or individual rules won. | Set the dashed switch. Report which nets have individual overrides. |
| Bus on the clock wall | Clock pins were not fixed. | set_fixed_objects first. This is not Chapter 12 again. |
| Visits through ISP | Feedthroughs left at true, or file later-line override. | Say false. Read the file in order. |
| place_pins returns 1, checks scream | Quiet success. | Taste. Do not ship the heartbeat. |
-side rejected | Nearby example dropped the s. | Type -sides. Confirm with man. |
| Successor switches rejected on the flow cook | You mixed create_block_pin_constraint spellings into set_block_pin_constraints. | One verb, that verb’s page. |
Hands-on mini lab — Mira-6
Mira-6 has a core that is a square 800 µm = 0.800 mm on each side, so an area of 0.640 mm² = 640,000 µm². Two blocks, one leftover strip between them. One 32-bit bus. No MIB. Teaching layers M3 and M6. Side 3 of block A faces block B.
- Query layers, nets, and pins. Do not invent names from this page.
- Fence block A to side 3 and block B to side 1. Visits off.
- Create a bundle for the 32-bit bus. Keep pins together, with the dashed switch.
- Run
check_pre_pin_placement. Repair DPPA-441 if you fenced a horizontal layer onto top and bottom. - Place the bundle nets. Read return 1 as a heartbeat.
- Check spacing, layers, and alignment. Write a constraint file with
-file_name.
You are done when the pre-check is empty or explained, the ribbon sits on the facing walls, and the written file opens with a section you can point at.
Interview preparation
1. What is a pin, in one honest sentence?
A pin is a door on a block edge, on a layer, snapped to a track. It is not the net, and it is not a finished route.
A port is a door at the top. A terminal is the metal shape. A feedthrough is a visit through a room that is not the destination. Mixing any two is how a later report becomes a mystery.
Query with get_pins, get_ports, get_terminals. Teaching names in this book are stand-ins.
On Nimbus-8 the leftover-facing CPU door is on side 3. That is geometry, not a style.
2. How are sides numbered?
Side 1 is the leftmost lowest edge, then clockwise. 0 is illegal. CPU leftover faces side 3.
On a rectangle: 1 left, 2 top, 3 right, 4 bottom. -sides and -exclude_sides are mutually exclusive. An empty list resets.
A nearby example writes -side without the s. The command page writes -sides. New Tcl uses the s. Confirm with man.
NPU leftover-facing doors are side 1 of each copy. Say both numbers.
3. place_pins returned 1. Are the pins good?
No. Return 1 is a heartbeat. The taste is check_pin_placement, then feedthroughs, then MIB if copies exist.
The command finished. It global-routed and snapped what it could. Hard constraints may have skipped DRC. Soft constraints may have relaxed in a documented order.
A first-pass taste is -pin_spacing true -layers true. Then report_pin_placement. Then report_feedthroughs -reporting_style net_based — the style switch is required.
Quiet success is how a screenshot ships.
4. Why keep a 128-bit bus in a bundle?
So the bits stay a ribbon on one edge and one layer, instead of scattering and crossing.
create_bundle names the ribbon. create_pin_constraint -type bundle -keep_pins_together true asks the placer to keep it together. A nearby example drops the dash. New Tcl keeps the dash.
Individual constraints still beat the ribbon for a net you named by hand. That is the stack, not a bug.
A supernet was Chapter 11’s estimate object. Do not call a bundle a supernet in an interview.
5. Default for -allow_feedthroughs on set_block_pin_constraints?
False. Visits are off until you say true. A visit splits nets and changes the netlist.
A feedthrough is a walk through a room that is not the destination. On Nimbus-8 you keep ISP closed so the CPU–NPU bus cannot punch the sofa.
A constraint-file feedthrough section overrides the global setting. Later lines override earlier lines for the same net.
Clock visits are a separate app option. Read it back.
6. set_block_pin_constraints or create_block_pin_constraint?
The flow cook is set_block_pin_constraints. The command page says it will retire in favour of create_block_pin_constraint, with different switch spellings. Name both. New Tcl in this book stays with the flow cook. Confirm with man.
Successor spellings include -pin_spacing_track_count, -excluded_sides, -corner_keepout_track_count, and -allow_feedthroughs as a flag. Mixing those into the flow cook is a syntax error.
Chapter 12 already refused to invent a third verb. This chapter keeps that promise and adds the retirement note.
Interviewers listen for the conflict, not for a silent pick.
7. create_pin_constraint versus set_individual_pin_constraints?
Two families. The flow picture uses create_pin_constraint -type individual. place_pins also honours set_individual_pin_constraints. Layer switches differ: -layers versus -allowed_layers.
New Tcl uses the flow cook. You must pass -type individual and at least one of -pins, -ports, or -nets. Bundle type has its own switches. A type-specific switch on the wrong type errors.
Clearing: remove_pin_constraints takes a collection of flow-cook objects. remove_individual_pin_constraints clears the other family. They are not one broom.
Name both in an interview. Do not “correct” an old script without knowing which family it used.
8. What does DPPA-441 mean?
The allowed layer’s routing direction is incompatible with the allowed or excluded sides.
Textbook: M3 is horizontal, sides 2 and 4 are top and bottom. Horizontal metal wants a vertical edge. The pre-check says so before you place.
Repair the constraint. Do not ask the router to invent a direction the layer does not have. Query get_layers. Do not invent METAL3 if the library says M3.
check_pre_pin_placement is the gate. place_pins is not a translator of bad rules.
9. How does constraint relaxation work when rules are too tight?
If they are not hard, place_pins relaxes in a documented order: spacing versus offset, then abutment, then offset, layer, and spacing. Hard constraints skip their step.
If the pin has side and offset, and a non-zero range, spacing relaxes first; otherwise offset does. Then both. Then abutment.
If there is no side and offset, spacing relaxes first, then abutment while keeping spacing. Further passes relax offset, layer, spacing, then all three.
A hard location inside a blockage still sits there. That is not a placer bug. That is the meaning of hard.
10. You need to place from a route you already ran. Which switch, and which mutex?
place_pins -use_existing_routing. It cannot combine with -pins or with -nets_to_exclude_from_routing. Routes are removed after.
First route_global -floorplan true -virtual_flat all_routing, or the top-and-interface flavour. If no route exists, the door may not be optimal, and the command will not invent a flyline.
If pins already exist, the router will route to them, and the later place may barely move. That is why this is a chosen path, not a default.
-nets_to_exclude_from_routing is the other shortcut: skip route, place from connectivity, no visits. Useful for a small iterate. Not a substitute for a real route.
11. Two NPU copies share NPU_CORE. After place_pins the doors disagree. What did you skip?
MIB pins must match. Check with check_mib_for_pin_placement. Copies are one drawing. The tool will not invent a matching door for you.
-asymmetric_connections is the wide check (DPPA-205). -swapped_connections is two-pin nets that do not meet the same pin (DPPA-203), a subset. -top_level_terminal_locations is DPPA-204.
place_pins -cells on one instance still honours blockages on all copies and ignores congestion around the unselected copy. That is not “the other copy was placed.”
Clock pins were a Chapter 12 prior. Data pins are this chapter’s prior. Name the instances: u_npu_core_0 and u_npu_core_1.
12. You typed create_pin_constraint -type bundle keep_pins_together true and the tool complained. Defend the next line.
Put the dash on -keep_pins_together. Name that a nearby example drops it. Confirm with man. Do not invent a third token.
The same muscle applies to -side versus -sides, and to set_block_pin_constraints versus its successor.
A weak recovery is “I’ll try set_keep_pins_together.” A strong recovery is to quote both sources, pick the syntax list, and run man create_pin_constraint.
Then pass -bundles. The nearby example also omitted which ribbon.
13. Incremental place scattered the clock spine you finished yesterday.
Clock pins were not fixed. set_fixed_objects first. Incremental is not a promise to honour a screenshot.
place_pins removes nonfixed terminals each run. plan.pins.incremental only keeps pins near their old home inside a range, and only if quality does not degrade.
The Chapter 12 spine is a prior. Fix those hierarchical clock pins, then place the 128-bit bus. Mixing both cooks in one unfixed run is how a heartbeat undoes a chapter.
If you meant a free incremental, remove_feedthroughs first so the placer can move.
14. A constraint file allows feedthroughs on ISP, your Tcl said false, and the bus punched the sofa. Why?
The file’s feedthrough-control section overrides global settings, and later statements override earlier ones for the same net.
Precedence is a stack. Topological map and feedthrough control beat the block Tcl switch. Last specified wins among equals.
Repair: read the file in order, delete or replace the later ISP allow, reload, pre-check, then place. Do not keep stacking Tcl on top of a file you have not read.
Say the leftover channel out loud: 2.091 mm² = 2,091,000 µm². That is where the bus already had a map. ISP was never the corridor.
15. You need estimated wire length after place. Someone tells you to run report_estimated_wire_length. What do you type?
get_estimated_wirelength. The nearby section title uses ‘reporting.’ The command is get_. It is a virtual-route estimate, not signoff.
Use it after place_pins. set_editability limits which hierarchies count. Pass -nets when you mean a ribbon, not the whole chip.
The same honesty as Chapter 12’s 200 ps: an estimate you would defend in units, not a number you would tape out.
Budgeting still waits. This command does not allocate slack among rooms.
16. Pins are done. Someone asks you to finish timing budgets in the same script. What do you say?
Budgeting is the next chapter. This chapter ends with doors you checked, a file you wrote, and an estimate you labelled.
The overall flow places pin assignment after clock trunks and before timing budgeting. Mixing compute_budget_constraints into this cook hides both plots.
What you can say, cleanly: leftover still 2.091 mm²; M4/M5 still mesh; clock pins still fixed; the 128-bit ribbon sits on CPU side 3 and NPU side 1; MIB copies match; checks were read.
Breadth is naming Chapter 14. Recklessness is pasting a budget script into a pin session you have not checked.
Chapter close
Sign-off checklist for this planning stage
- You can point at pin, port, terminal, side, bundle, and feedthrough on a sketch.
- Pins, ports, nets, and layers were queried, not invented.
- Clock pins from Chapter 12 were fixed before this cook.
- CPU leftover used side 3. NPU leftover used side 1. Side 0 was never typed.
- M3/M6 hold the teaching bus doors. M4/M5 still hold the mesh.
- Visits were true or false on purpose. ISP was not a corridor.
- Keep-together used the dashed switch. Individual still beats a ribbon.
- Pre-check used
check_pre_pin_placement. DPPA-441/458 empty or explained. place_pinsreturn 1 was followed by spacing, layer, feedthrough, and MIB checks.write_pin_constraints -file_namewas written. Estimated length was labelled an estimate.- Budgeting was not mixed into this script.
Key-concept flashcards
A door on a block edge. Not the net. Not the route.
Leftmost lowest edge, then clockwise. CPU leftover faces 3.
place_pins returning 1 is a heartbeat, not a check.
A ribbon. -keep_pins_together takes the dash.
A visit. Block-cook default is false. File can override.
create_pin_constraint is the flow cook. set_individual_* also exists.
set_block_pin_constraints will retire. Successor spells switches differently.
Layer direction fights sides. Repair the constraint.
Two copies, one drawing. DPPA-203 is a swap.
-file_name is required. get_estimated_wirelength is not report_.
Clock pins stay. Then the 128-bit ribbon.
Chapter 14 is budgeting. You now have doors.
Compact glossary
| Term | Meaning as used in this book |
|---|---|
| Alignee | The room that moves in align_block_pins. |
| Anchor | The room whose terminals are the reference for alignment. |
| Bundle | A named ribbon of nets kept together for pin order and spacing. |
| Feedthrough | A visit through a room that is not the destination. Splits nets. |
| Hard constraint | Honoured even if DRC breaks: layer, spacing, location, length. |
| Offset | Distance along a numbered side, in microns or percent. |
| Pin | A door on a block. Query with get_pins. |
| Pin blockage | A region pins must not use. Feedthrough-only bans visits only. |
| Port | A door at the top of the current design. Query with get_ports. |
| Precedence | Topo/file > individual > bundle > NDR > block. Last specified wins among equals. |
| Side 1 | Leftmost lowest edge, then clockwise. 0 is illegal. |
| Terminal | The metal shape of a pin or port, on a layer and a track. |
| Topological map | A named walk through rooms in the constraint file. |
Five-question self-check
Castor-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². Two copies of one reference. Teaching bus layers M3 and M6. Leftover faces side 3 of the parent and side 1 of each copy.
- You fence M3 onto sides 2 and 4. Which pre-check message do you expect, and what is the repair?
- A flow note says
create_pin_constraint -type bundle keep_pins_together true. What do you type instead, and which other family doescheck_pin_placement -keep_pins_togethertalk about? - You set
set_block_pin_constraints -excluded_sides {2}and the tool rejects it. Why, and which successor uses that spelling? - After place, Castor-3’s two copies disagree about a two-pin net. Which check and which DPPA number name that, and what larger check is it a subset of?
- A colleague asks for
report_estimated_wire_lengthon Castor-3. What command do you run, and what honesty label sits on the number?
Answers.
1. DPPA-441 from check_pre_pin_placement: horizontal M3 is incompatible with top and bottom sides. Fence M3 onto sides 1 and 3, or pick a vertical layer for 2 and 4. Query get_layers.
2. Type create_pin_constraint -type bundle -keep_pins_together true and name -bundles. The other family is set_bundle_pin_constraints. Confirm with man.
3. The flow cook uses -exclude_sides, not -excluded_sides. The successor create_block_pin_constraint uses -excluded_sides. Do not mix the families. Confirm with man.
4. check_mib_for_pin_placement -swapped_connections, DPPA-203. It is a subset of -asymmetric_connections (DPPA-205).
5. get_estimated_wirelength. It is a virtual-route estimate, not signoff, and not a budget. There is no report_estimated_wire_length on the command pages this chapter sat with.
Why Chapter 14 follows
The leftover channel now has a bus map, a clock spine, and a set of doors you checked. The mesh still holds power. What the chip still lacks is an agreed split of the remaining window on the clk_cpu wave among those rooms. That is timing budgeting. It is not a tail on place_pins. This chapter ends with pins. The next begins at slack.