A hierarchy boundary stops optimisation from crossing between blocks. Each block keeps its own netlist while the change settles.
Preserved blocks recompile faster and behave the same. The cost is missed optimisation across the boundary.
Boundary | Preserved | Cost |
|---|---|---|
Kept hierarchy | Block netlists and timing | No cross-boundary optimisation. |
Flattened | Nothing is preserved | Every small change can move distant logic. |
dont_touch excludes the marked logic from optimisation in that flow. It buys stability at the cost of frozen QoR, and the mark must be lifted on any cone being edited.
Marks buy stability across runs. They also freeze suboptimal logic, so each mark trades quality against repeatability.
Areas below are library units of the fictional teaching library course.lib, with NAND2 at 2 units and INV at 1 unit. The re-optimised outcome is a stated EXAMPLE value.
block before the change: 40 NAND2 x 2 + 20 INV x 1 = 80 + 20 = 100 area units
preserved boundary: 4 NAND2 become 4 NOR2 at 2 units each, 4 x 2 = 8 replaces 4 x 2 = 8, block stays 100 units, neighbours change by 0
unpreserved re-optimisation (stated EXAMPLE outcome): block falls to 96 units, saving 100 - 96 = 4 of 100 = 4%
churn comparison: 4 cells touched against 30 cells across 3 blocksThe mark must be lifted on the edited cone, else the tool keeps the old logic. The mark returns after the patch is proven.
Stability and faster turnaround on single-block changes. Pay it on settled blocks, and optimise where the design still moves.