Skip to content

Rearchitect resizer repair setup#10223

Draft
openroad-ci wants to merge 62 commits intoThe-OpenROAD-Project:masterfrom
The-OpenROAD-Project-staging:secure-rsz2
Draft

Rearchitect resizer repair setup#10223
openroad-ci wants to merge 62 commits intoThe-OpenROAD-Project:masterfrom
The-OpenROAD-Project-staging:secure-rsz2

Conversation

@openroad-ci
Copy link
Copy Markdown
Collaborator

Summary

  • Rearchitect repair_setup around Optimizer, setup policies, move generators, and move candidates.
  • Add target preparation/prewarm flow, MoveCommitter, repair target collection, delay estimation helpers, and shared utl::ThreadPool support.
  • Preserve default legacy setup behavior while adding experimental setup policies (legacy_mt, mt1, measured_vt_swap).
  • 20 Apr 2026: The default legacy setup policy shows identical ORFS design QoR with the master. But it may have corner-case QoR impact in other designs.
  • Refer to the architecture documentation in src/rsz/doc/architecture.md.

TODO

  1. Architecture
    a. Apply review feedback
    b. Consider moving MoveTracker out of MoveCommitter for detailed tracking
  2. Fix UI
    a. Envar or command option
    b. Merge optimization policies (new) and phases (old)
  3. Enhance setup optimization QoR and runtime
    a. Enhance VtSwap & SizeUp moves w/ MT
    b. Develop a score metric for fair comparison among different moves
    c. Ensure thread safety of APIs
    d. Better delay estimation
    e. Better optimization policy
  4. Support DRC / hold / power optimization
  5. Global optimization (e.g., Lagrangian relaxation)

Testing

  • Experimental legacy_mt policy regression: ctest -R legacy_mt
  • Experimental mt1 policy regression: ctest -R mt1
  • cmake --build build --target TestResizerMt -j8
  • ctest --test-dir build --output-on-failure -j8
    • 100% tests passed, 0 tests failed out of 7721
  • Disabled long-running rsz tests (for faster rsz testing)
    • rsz.repair_design3.tcl
    • rsz.repair_design3_verbose.tcl
    • rsz.repair_fanout6.tcl

- Details in `src/rsz/doc/architecture.md`

Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
SetupLegacyPolicy::tryRepairTarget unconditionally returned after
trySizeDownBatch, so a failed size-down silently skipped the remaining
moves (size-up, swap-pins, buffering, cloning) for that target. Master's
RepairSetup and SetupLegacyMtPolicy both fall through on failure; restore
that behavior.

SizeUpMtCandidate::apply committed the replacement without revalidating
max-cap. Candidates are screened on a pre-batch snapshot, so two accepted
size-ups on different sinks of the same fanin net could each pass
independently yet combine past the driver's max-cap limit. Re-check
replacementPreservesMaxCap at apply time so the second commit rejects
cleanly instead of creating a silent violation.

Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request re-architects the repair_setup optimization flow into a policy-driven framework, replacing monolithic move classes with MoveGenerator and MoveCandidate pairs. It introduces a central Optimizer and various OptPolicy implementations, including experimental multi-threaded versions. The changes also include new stages for cache warming and data preparation to ensure thread safety. Feedback was provided regarding outdated documentation in Resizer.hh that incorrectly attributes move accounting to journaling methods instead of the new MoveCommitter class.

Comment thread src/rsz/include/rsz/Resizer.hh Outdated
Comment on lines +878 to +880
// Jounalling support for checkpointing and backing out changes
// during repair timing.
// - Update ECO move counts
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The comment here seems to be outdated. The journal* methods in Resizer.cc now just call the eco* methods and do not handle move counting themselves. The move accounting logic has been moved to the MoveCommitter class. To avoid confusion, this comment should be updated to reflect that these are wrappers and that move counting is handled elsewhere.

References
  1. When analyzing code within a loop, consider the entire loop structure. Operations at the beginning of the loop (e.g., journalBegin) can affect the logic within the loop body, potentially making similar calls inside the loop redundant.

@maliberty maliberty marked this pull request as draft April 21, 2026 15:41
Copy link
Copy Markdown
Contributor

@erendn erendn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I made some initial comments. There can also be the CostDeltas struct that @QuantamHD had mentioned. It can help set the scoring criteria based on the current policy. We need to have some heuristics for each move to estimate delay/power/area impact.

| MT support | Added common `utl::ThreadPool` and MT-capable policies/generators. |
| Prewarm stage | Added policy-level Liberty-cell and driver-cache warmup before target preparation. Required to complete lazy updates and ensure thread safety. |
| Prepare stage | Added per-target `ArcDelayState` caching for expensive STA-derived data before MT generation/estimation. Required to reduce redundant computations by multi-threads. |
| Scope | The new architecture targets `repair_setup` only. It can be extended to `repair_design`, `repair_hold`, and `recover_power` later. |
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree. We can score candidates for hold/power/area and have separate policies for those.

| Prepare stage | Added per-target `ArcDelayState` caching for expensive STA-derived data before MT generation/estimation. Required to reduce redundant computations by multi-threads. |
| Scope | The new architecture targets `repair_setup` only. It can be extended to `repair_design`, `repair_hold`, and `recover_power` later. |
| Compatibility | `SetupLegacyPolicy` is the default path and is kept close to legacy repair behavior. The QoR goal is ORFS design parity. |
| Target model | `Target` exposes path-driver and instance view bits so generators can share one target representation. New views will be added later. |
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It makes sense to have this Target expose endpoint and driver paths.



[OptPolicy::iterate()]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can also have policies like:
CommonViolatorsPolicy: Collect violators based on how frequently they are encountered along violating paths and try to repair them.
BurstUpdatePolicy: Try multiple moves at a time and update STA together. If the target metric improves, commit all of them. Otherwise, revert and try those moves one by one.
GreedyUpsizePolicy: Do a greedy upsizing on violating gates, possibly pre-placement.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah. Sounds good.
We can make new policies easily by adding new OptPolicy classes.

In the legacy resizer, it already has multiple phases (e.g., WNS, TNS, STARTPOINT_FANOUT, ENDPOINT_FANIN, LAST_GASP, ...), which is conceptually the same as policies.
I think we can split the legacy phases out of the big SetupLegacyPolicy class and provide flexible mixing of old and new policies.

MoveGenerator / MoveCandidate
Own move-local legality and ECO plan
Decides how to optimize
MoveGenerator.isApplicable(): Check if the move is applicable quickly
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why doesn't MoveCandidate have isApplicable() instead?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the current logic.

  • MoveGenerator has isApplicable() method. Necessary filtering should be done at the generate stage.
  • MoveGenerator should create applicable MoveCandidates. But some of the MoveCandidates can be found to be illegal (e.g., DRC violation, ...) after estimate().

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't understand what isApplicable() does exactly. Does it check if the target has a certain view mask the move requires? Can we move that function to that move's candidate class?

Copy link
Copy Markdown
Contributor

@jhkim-pii jhkim-pii Apr 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isApplicable() is the place to apply various filters.

  • Target view validation check is one of them.
  • If a certain move supports post-CTS stage only, we can add such stage filter in that API.
  • If we move isApplicable() to MoveCandidate, multiple MoveCandidates may do the same filtering. So having it in MoveGenerator looks better to me. Please let me know if you have a case that MoveCandidate::isApplicable() is better than MoveGenerator::isApplicable(). Having the both APIs will make users confusing.


protected:
void buildMoveGenerators(...);
void prepareTargets(std::vector<Target>& targets) const;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does it mean to "prepare targets"?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prepare is a stage to cache necessary data to reduce redundant computation during estimation by multiple worker threads.
prepareTargets() annotates additional cached data for the efficient move candidate estimation.
Different move types may require different data to be cached.

But basically, this is burden caused by inconvenience of the process of retrieving state/data retrieval from STA in multi-threading environment.
If STA provides MT-friendly APIs for the data retrieval, Prepare stage can be eliminated in the future.

src/rsz/doc/architecture.md has an explanation about Prepare stage.


| Role | Class | Responsibility |
|---|---|---|
| Generator | `MoveGenerator` derived class | Decide applicability and create candidate objects for one target. |
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we really need a separate MoveGenerator for each move type?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand what you mean.
Do you think that a single MoveGenerator should know how to make all MoveCandidates of different move types?

In the current architecture, MoveGenerator and MoveCandidate are tightly-coupled.
I think this makes adding a new move more difficult because two new tightly-coupled classes should be created.

Currently, there are many generator and candidate classes for multiple move types.
The number of moves can be reduced by

  • Once a new move supporting MT is developed, the old ST (single-thread) move should be retired.
  • Merging similar moves. E.g.,
    • VtSwap, SizeUpMove and SizeUpMatchMove -> SizeMove (option control to enable Vt swap up-sizing & down-sizing the target)
    • SizeDownMove -> ReduceLoadMove // Because it reduces loads of the target instead of the target itself.
    • BufferMove and SplitLoadMove (subset of BufferMove) -> BufferMove

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My question is also related to MoveGenerator::isApplicable(). What if we have only one MoveGenerator class and MoveCandidate classes have the isApplicable() function instead? It felt a bit redundant to have two classes for each move type.

And I agree that we should rename SizeDownMove to ReduceLoadMove and then we can implement a SizeDownMove that actually only downsizes the target.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It felt a bit redundant to have two classes for each move type.

Yeah. I don't like the two mandatory classes for each move type.

But let's imagine that one big MoveGenerator generates MoveCandidates for all move types. I think it will significantly hurt the code readability. Having multiple MoveGenerators would provide better readability.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This split is directly from @QuantamHD original proposal. I think separating generation from result doesn't imply redundancy as they two classes have different responsibilities.

b. Develop a score metric for fair comparison among different moves
c. Ensure thread safety of APIs
d. Better delay estimation
e. Better optimization policy
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can add new move types:
RelocateMove: Move a gate closer to its violating fanout gates
DecomposeMove: Break a complex logic gate into smaller gates
InvBufferMove: Replace a buffer with two inverters
VTSwapLeakageMove: Reduce VT of a non-violating gate

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VTSwapLeakageMove: Reduce VT of a non-violating gate

I think a sizing move for power recovery can include this.


1. Architecture
a. Apply review feedback
b. Consider moving `MoveTracker` out of `MoveCommitter` for detailed tracking
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can also have different violator collection modes:
PathMode: Collect the gates along the violating path
FaninMode: Collect the fanin cone of an endpoint
FanoutMode: Collect the fanout cone of a startpoint
IntersectionMode: Collect the common violators that intersect multiple violating paths

@jhkim-pii
Copy link
Copy Markdown
Contributor

I made some initial comments. There can also be the CostDeltas struct that @QuantamHD had mentioned. It can help set the scoring criteria based on the current policy. We need to have some heuristics for each move to estimate delay/power/area impact.

Definitely, we need it.
Actually, I made an early version of the score/cost structure. But I deleted it from the PR because it is premature.
I found that score/cost should be designed tightly coupled with concrete MoveCandidate classes to provide a way to compare the scores from different move types fairly.
Developing a fair cross-move score metric looks not trivial to me.
So I am going to make a MT-buffering move and find a good score/cost struct for the fair comparison.
If you have a good idea, let's discuss about it. I don't have a good one yet except for a rough one (slack enhancement may be a good score for the fair cross-move comparison).

e.g.,

struct Estimate {
   bool legal{false};                // Feasible and DRC clean
   float score;                      // Output of a scoring equation (configurable) w/ the following PPA metrics.
                                     // Used for MoveCandidate sorting
                                     // Per-move-type adjustment may be required for fair cross-move comparison

   // Timing
   float delay_impr{0.0f};           // Delay improvement of the focused arc/path. Manage the rise/fall sense data or use sum/avg?
   float slack_impr{0.0f};            // Slack improvement may not be the same as slack improvement.
   float side_path_delay_impr{0.0f};    // Sum of delay deltas of the side-paths
   float side_path_slack_impr{0.0f};     // Sum of slack deltas of the side-paths

   // Power
   float total_pwr_impr{0.0f};      // Total power improvement
   float leak_pwr_impr{0.0f};       // Leakage power improvement
   float dyn_pwr_impr{0.0f};        // Dynamic power improvement.

   // Area
   float area_impr{0.0f};
}

The attributes can be more (mainly for analysis) or less than this.

  • I think this should be aligned with the actual move implementation.
  • The side-path impact is one of the crucial factors. But we don't have good delay/timing estimator for side-path impact yet.

@jhkim-pii
Copy link
Copy Markdown
Contributor

jhkim-pii commented Apr 22, 2026

@mguthaus
Copy link
Copy Markdown
Contributor

@erendn

@maliberty
Copy link
Copy Markdown
Member

For scoring I think we should separate estimation of fields (like area, power, timing) from the combining to a single score. I think the policy should do the combining as different policies might have different goals (e.g. power recover vs setup fixing). The policy can tell the move estimator what fields it needs to avoid unnecessary computation.

}

const odb::Point drvr_loc = resizer_.dbNetwork()->location(drvr_pin);
candidates.push_back(std::make_unique<SplitLoadCandidate>(
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can build multiple SplitLoadCandidate here where each one has a different split (not necessarily 50/50).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. It is an easy way to make the SplitLoadMove* support MT.

BTW, it looks like SplitLoad move is conceptually a subset of Buffer move. Then it may be better to make BufferGenerator generates load-splitting candidates together and remove the SplitLoad move because it is a subset of buffering.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think they have different goals. Split load is about separating off non-critical loads where buffering is about speeding up critical loads.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@maliberty one of the ways generic buffering speeds up critical loads is by separating off non-critical loads so I agree with Jaehyun's "it looks like SplitLoad move is conceptually a subset of Buffer move."

To some degree the buffering code today already separates off loads (in what it calls "topology rewriting") and it might be smarter about it than SplitLoad, i.e. it does not use a fixed 50/50 split and considers placement. We can test if keeping SplitLoad is providing a benefit, perhaps we can retire it

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So long as the unified approach can achieve the same transformations / QOR that's fine.

Comment thread src/rsz/src/DelayEstimator.cc Outdated
}

const float arrival_impr = context.current_delay - candidate_delay;
return {.legal = arrival_impr > 0.0f,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SetupLegacyPolicy allows worsening timing to get out of local minima. Maybe we should leave the "legality" to be decided by each policy based on estimated metrics.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right.
The current code is an initial draft and needs further improvement through research.
As a fundamental infra for optimization, more feature enhancements are needed especially for the delay/slack estimation to predict the timing impact more accurately over a wider range.

jhkim-pii added 29 commits May 5, 2026 15:57
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Remove the defensive candidate_cell nullptr guard from estimateWindow.

The ArcDelayState estimation path already requires generated candidates to provide a valid Liberty cell, and estimateWindow relies on prepared valid state before candidate-specific checks. Treating a null candidate as kMissingCandidatePort hides a caller contract violation.

Keep the existing missing scene-cell and candidate-port checks for real candidate compatibility failures.

Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Cache the current total delay in ArcDelayState when the path-stage window is built.

This avoids re-walking the stage window for every candidate estimate and keeps candidate scoring on prepared state.

Also remove a small reporter-only containsPin helper by using std::find directly.

Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Merge origin/master into the rsz2 architecture branch and resolve setup-repair policy/generator conflicts.

Port the new repair_timing fixes into the rsz2 move structure, keep retired legacy move files deleted, and merge the updated rsz/dbSta regression registrations.

Adjust ODB hierarchical moditerm handling so escaped Verilog port names containing the hierarchy delimiter pass the new master tests.

Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Apply clang-format to the measured VT swap candidate reservation code so the branch passes the formatter used by CI.

Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Describe the current repair_setup phase pipeline driven by repair_timing -phases.

Document the DelayEstimator main-thread prepare and worker-safe estimate split, plus the DelayEstimatorReporter diagnostic flow.

Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Reduce the synthetic fanout sizes for repair_design3, repair_design3_verbose, and repair_fanout6 so they can run in the default rsz CTest suite.

Rebase affected golden logs, including repair_fanout6_multi because it sources repair_fanout6.tcl.

Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Limit measured VT swap and arithmetic replacement regressions to smaller but still meaningful coverage points. This keeps the tests focused on the intended behavior while reducing CI wall time.

Use a compact pre-placed DEF fixture for replace_arith_modules3 so the test no longer runs global placement. Rebase the affected golden logs after the runtime changes.

Testing: ctest -R 'rsz\.measured_vt_swap\.tcl$'; ctest -R 'rsz\.replace_arith_modules[123]\.tcl$'; git diff --check.
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Mark the LEGACY_MT, MT1, and MEASURED_VT_SWAP setup policies as experimental and emit a warning when one is selected.

The warning explicitly states that experimental policies should not be used for production. Rebase the affected rsz golden logs to include the new warning.

Testing: cmake --build build --target openroad -j 16; ctest -R 'rsz\.(measured_vt_swap|repair_setup_legacy_mt|repair_setup_mt1|repair_setup_legacy_mt_tracker)\.tcl$'; git diff --check.
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Rename the setup optimization policy base class, files, and policy configuration type to use the full OptimizationPolicy name. This keeps policy ownership and behavior unchanged while making the class role clearer in the rearchitected repair setup flow.

Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Resolve the resizer move architecture conflicts after the master merge.

Port the resistance-aware reroute work into the generator/candidate architecture with a REROUTE setup phase policy.

Keep the master swap-pin feedthrough net fix in Resizer::swapPins and add the corresponding C++ regression.

Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Merge origin/master at 35443bc into secure-rsz2. Keep the generator/candidate REROUTE architecture while accepting the non-conflicting upstream EstimateParasitics and Tcl updates. Verified with openroad build and rsz reroute regressions.

Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Apply the critical VT swap phase directly to collected instances instead of routing each instance through VtSwapGenerator. This matches the legacy master path more closely and avoids per-instance output slack scans during the hot apply loop.

Keep move tracking support by resolving an output pin only when tracker detail logging needs it. AES TAT now matches master while preserving identical move counts, QoR, and final instance master maps.

Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Restore the legacy repair_setup phase contract for custom phase lists. Legacy-compatible phase pipelines now append an implicit CRIT_VT_SWAP tail unless the user already requested that phase explicitly. Also restore the default phase string to LEGACY LAST_GASP so the public interface matches the pre-split behavior while keeping CRIT_VT_SWAP available as an explicit phase token.

Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
@jhkim-pii
Copy link
Copy Markdown
Contributor

@erendn @maliberty I updated the followings.

Changes

  1. UI changes:
  • repair_timing phase selection was cleaned up by keeping -phases as the public interface, accepting -policy / -policies as aliases with conflict checking, updating the default setup-phase sequence to include CRIT_VT_SWAP, and warning when experimental setup policies are selected.
  • Files: src/rsz/src/policy/OptimizationPolicy.cc/hh, src/rsz/src/policy/*   // Each phase is a separate policy now.
  1. Delay estimator updates:
  • The sizing delay estimator and its diagnostic reporter were refined. Now it estimates 3-stage delay instead of the target cell delay (old).
  • Files: src/rsz/src/DelayEstimator.cc, src/rsz/src/DelayEstimator.hh, src/rsz/src/DelayEstimatorReporter.cc, src/rsz/src/DelayEstimatorReporter.hh, src/rsz/src/OptimizerTypes.cc, src/rsz/src/OptimizerTypes.hh
  1. Other changes:
  • repair_setup internals were further reorganized around dedicated phase-policy classes with a shared run context and simpler sequencing
  • The resizer architecture document was updated accordingly
  • Several rsz regressions were re-enabled or shortened to balance coverage and runtime.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants