From 801ffb5419720d4f0e671428bb7d1f87e7a7eb42 Mon Sep 17 00:00:00 2001 From: dsengupta0628 Date: Mon, 11 May 2026 15:18:07 +0000 Subject: [PATCH] expose levelizeobserver Signed-off-by: dsengupta0628 --- include/sta/LevelizeObserver.hh | 59 +++++++++++++++++++++++++++++++++ include/sta/Sta.hh | 5 +++ search/Levelize.hh | 10 +----- search/Sta.cc | 19 ++++------- 4 files changed, 71 insertions(+), 22 deletions(-) create mode 100644 include/sta/LevelizeObserver.hh diff --git a/include/sta/LevelizeObserver.hh b/include/sta/LevelizeObserver.hh new file mode 100644 index 000000000..787d80544 --- /dev/null +++ b/include/sta/LevelizeObserver.hh @@ -0,0 +1,59 @@ +// OpenSTA, Static Timing Analyzer +// Copyright (c) 2026, Parallax Software, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. +// +// Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// +// This notice may not be removed or altered from any source distribution. + +#pragma once + +namespace sta { + +class Vertex; +class Search; +class GraphDelayCalc; + +// Observer fired by Levelize during (re)levelization. Downstream consumers +// override the two hooks to invalidate caches that depend on vertex levels. +class LevelizeObserver +{ +public: + virtual ~LevelizeObserver() = default; + virtual void levelsChangedBefore() = 0; + virtual void levelChangedBefore(Vertex *vertex) = 0; +}; + +// Default observer installed by Sta::makeObservers. Forwards level-change +// events to Search and GraphDelayCalc so their internal caches stay +// consistent. Subclass and override to extend (call the base methods first, +// then add your own invalidation). +class StaLevelizeObserver : public LevelizeObserver +{ +public: + StaLevelizeObserver(Search *search, GraphDelayCalc *graph_delay_calc); + void levelsChangedBefore() override; + void levelChangedBefore(Vertex *vertex) override; + +private: + Search *search_; + GraphDelayCalc *graph_delay_calc_; +}; + +} // namespace sta diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index 5237ec9aa..7114c1328 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -73,6 +73,7 @@ class ClkSkews; class ReportField; class EquivCells; class StaSimObserver; +class LevelizeObserver; class GraphLoop; using ModeNameMap = std::map>; @@ -1321,6 +1322,10 @@ public: // Ensure a network has been read, linked and liberty libraries exist. Network *ensureLibLinked(); void ensureLevelized(); + // Replace the Levelize observer. Takes ownership; deletes any prior + // observer. Subclass StaLevelizeObserver to extend the default behavior + // (Search + GraphDelayCalc forwarding) without re-implementing it. + void setLevelizeObserver(LevelizeObserver *observer); // Ensure that the timing graph has been built. Graph *ensureGraph(); void ensureClkArrivals(); diff --git a/search/Levelize.hh b/search/Levelize.hh index a1b680e8f..094e3d477 100644 --- a/search/Levelize.hh +++ b/search/Levelize.hh @@ -30,11 +30,11 @@ #include "Graph.hh" #include "StaState.hh" +#include "sta/LevelizeObserver.hh" namespace sta { class SearchPred; -class LevelizeObserver; class GraphLoop; using VertexEdgeIterPair = std::pair; @@ -133,12 +133,4 @@ private: EdgeSeq *edges_; }; -class LevelizeObserver -{ -public: - virtual ~LevelizeObserver() = default; - virtual void levelsChangedBefore() = 0; - virtual void levelChangedBefore(Vertex *vertex) = 0; -}; - } // namespace sta diff --git a/search/Sta.cc b/search/Sta.cc index c5a40139b..7485a3c59 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -217,19 +217,6 @@ StaSimObserver::fanoutEdgesChangeAfter(const Pin *pin) //////////////////////////////////////////////////////////////// -class StaLevelizeObserver : public LevelizeObserver -{ -public: - StaLevelizeObserver(Search *search, - GraphDelayCalc *graph_delay_calc); - void levelsChangedBefore() override; - void levelChangedBefore(Vertex *vertex) override; - -private: - Search *search_; - GraphDelayCalc *graph_delay_calc_; -}; - StaLevelizeObserver::StaLevelizeObserver(Search *search, GraphDelayCalc *graph_delay_calc) : search_(search), @@ -3746,6 +3733,12 @@ Sta::ensureLevelized() levelize_->ensureLevelized(); } +void +Sta::setLevelizeObserver(LevelizeObserver *observer) +{ + levelize_->setObserver(observer); +} + void Sta::updateGeneratedClks() {