Skip to content

Commit f83fc1f

Browse files
authored
Merge pull request The-OpenROAD-Project#6904 from The-OpenROAD-Project-staging/odb-observer
ord/odb: move lef/def/odb load observer callback from ord to odb
2 parents 82acfcf + 06d657d commit f83fc1f

File tree

14 files changed

+86
-81
lines changed

14 files changed

+86
-81
lines changed

include/ord/OpenRoad.hh

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@
4040
#include <string>
4141
#include <vector>
4242

43-
#include "OpenRoadObserver.hh"
44-
4543
extern "C" {
4644
struct Tcl_Interp;
4745
}
@@ -243,9 +241,6 @@ class OpenRoad
243241
void setThreadCount(const char* threads, bool printInfo = true);
244242
int getThreadCount();
245243

246-
void addObserver(OpenRoadObserver* observer);
247-
void removeObserver(OpenRoadObserver* observer);
248-
249244
std::string getExePath() const;
250245
std::string getDocsPath() const;
251246

@@ -290,8 +285,6 @@ class OpenRoad
290285
stt::SteinerTreeBuilder* stt_builder_ = nullptr;
291286
dft::Dft* dft_ = nullptr;
292287

293-
std::set<OpenRoadObserver*> observers_;
294-
295288
int threads_ = 1;
296289

297290
static OpenRoad* app_;

src/OpenRoad.cc

Lines changed: 8 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -271,14 +271,12 @@ void OpenRoad::readLef(const char* filename,
271271
bool make_library)
272272
{
273273
odb::lefin lef_reader(db_, logger_, false);
274-
dbLib* lib = nullptr;
275-
dbTech* tech = nullptr;
276274
if (make_tech && make_library) {
277-
lib = lef_reader.createTechAndLib(tech_name, lib_name, filename);
278-
tech = db_->findTech(tech_name);
275+
lef_reader.createTechAndLib(tech_name, lib_name, filename);
279276
} else if (make_tech) {
280-
tech = lef_reader.createTech(tech_name, filename);
277+
lef_reader.createTech(tech_name, filename);
281278
} else if (make_library) {
279+
dbTech* tech;
282280
if (tech_name[0] != '\0') {
283281
tech = db_->findTech(tech_name);
284282
} else {
@@ -287,14 +285,7 @@ void OpenRoad::readLef(const char* filename,
287285
if (!tech) {
288286
logger_->error(ORD, 51, "Technology {} not found", tech_name);
289287
}
290-
lib = lef_reader.createLib(tech, lib_name, filename);
291-
}
292-
293-
// both are null on parser failure
294-
if (lib != nullptr || tech != nullptr) {
295-
for (OpenRoadObserver* observer : observers_) {
296-
observer->postReadLef(tech, lib);
297-
}
288+
lef_reader.createLib(tech, lib_name, filename);
298289
}
299290
}
300291

@@ -324,20 +315,11 @@ void OpenRoad::readDef(const char* filename,
324315
if (continue_on_errors) {
325316
def_reader.continueOnErrors();
326317
}
327-
dbBlock* block = nullptr;
328318
if (child) {
329319
auto parent = db_->getChip()->getBlock();
330-
block = def_reader.createBlock(parent, search_libs, filename, tech);
320+
def_reader.createBlock(parent, search_libs, filename, tech);
331321
} else {
332-
dbChip* chip = def_reader.createChip(search_libs, filename, tech);
333-
if (chip) {
334-
block = chip->getBlock();
335-
}
336-
}
337-
if (block) {
338-
for (OpenRoadObserver* observer : observers_) {
339-
observer->postReadDef(block);
340-
}
322+
def_reader.createChip(search_libs, filename, tech);
341323
}
342324
}
343325

@@ -492,11 +474,6 @@ void OpenRoad::readDb(std::istream& stream)
492474
| std::ios::eofbit);
493475

494476
db_->read(stream);
495-
496-
// this fixes up the database post read
497-
for (OpenRoadObserver* observer : observers_) {
498-
observer->postReadDb(db_);
499-
}
500477
}
501478

502479
void OpenRoad::writeDb(std::ostream& stream)
@@ -538,16 +515,12 @@ void OpenRoad::linkDesign(const char* design_name, bool hierarchy)
538515
sta::dbSta* sta = getSta();
539516
sta->getDbNetwork()->setHierarchy();
540517
}
541-
for (OpenRoadObserver* observer : observers_) {
542-
observer->postReadDb(db_);
543-
}
518+
db_->triggerPostReadDb();
544519
}
545520

546521
void OpenRoad::designCreated()
547522
{
548-
for (OpenRoadObserver* observer : observers_) {
549-
observer->postReadDb(db_);
550-
}
523+
db_->triggerPostReadDb();
551524
}
552525

553526
bool OpenRoad::unitsInitialized()
@@ -561,19 +534,6 @@ odb::Rect OpenRoad::getCore()
561534
return db_->getChip()->getBlock()->getCoreArea();
562535
}
563536

564-
void OpenRoad::addObserver(OpenRoadObserver* observer)
565-
{
566-
observer->set_unregister_observer(
567-
[this, observer] { removeObserver(observer); });
568-
observers_.insert(observer);
569-
}
570-
571-
void OpenRoad::removeObserver(OpenRoadObserver* observer)
572-
{
573-
observer->set_unregister_observer(nullptr);
574-
observers_.erase(observer);
575-
}
576-
577537
void OpenRoad::setThreadCount(int threads, bool printInfo)
578538
{
579539
int max_threads = std::thread::hardware_concurrency();

src/dbSta/include/db_sta/dbSta.hh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141

4242
#include "odb/db.h"
4343
#include "odb/dbBlockCallBackObj.h"
44-
#include "ord/OpenRoadObserver.hh"
44+
#include "odb/dbDatabaseObserver.h"
4545
#include "sta/Sta.hh"
4646

4747
namespace ord {
@@ -104,7 +104,7 @@ class BufferUseAnalyser
104104
std::unique_ptr<sta::PatternMatch> clkbuf_pattern_;
105105
};
106106

107-
class dbSta : public Sta, public ord::OpenRoadObserver
107+
class dbSta : public Sta, public odb::dbDatabaseObserver
108108
{
109109
public:
110110
~dbSta() override;

src/dbSta/src/MakeDbSta.cc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ void initDbSta(OpenRoad* openroad)
5656
Dbsta_Init(tcl_interp);
5757
// Eval encoded sta TCL sources.
5858
sta::evalTclInit(tcl_interp, sta::dbSta_tcl_inits);
59-
60-
openroad->addObserver(sta);
6159
}
6260

6361
} // namespace ord

src/dbSta/src/dbSta.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ void dbSta::initVars(Tcl_Interp* tcl_interp,
232232
utl::Logger* logger)
233233
{
234234
db_ = db;
235+
db->addObserver(this);
235236
logger_ = logger;
236237
makeComponents();
237238
if (tcl_interp) {

src/drt/test/stubs.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,6 @@ void OpenRoad::readDb(const char*, bool)
7676
{
7777
}
7878

79-
void OpenRoad::addObserver(OpenRoadObserver* observer)
80-
{
81-
}
82-
83-
void OpenRoad::removeObserver(OpenRoadObserver* observer)
84-
{
85-
}
86-
8779
int OpenRoad::getThreadCount()
8880
{
8981
return 0;

src/gui/src/gui.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,7 +1422,7 @@ int startGui(int& argc,
14221422
}
14231423
main_window->setTitle(gui->getMainWindowTitle());
14241424

1425-
open_road->addObserver(main_window);
1425+
open_road->getDb()->addObserver(main_window);
14261426
if (!interactive) {
14271427
gui->setContinueAfterClose();
14281428
main_window->setAttribute(Qt::WA_DontShowOnScreen);
@@ -1518,7 +1518,7 @@ int startGui(int& argc,
15181518
}
15191519

15201520
// cleanup
1521-
open_road->removeObserver(main_window);
1521+
open_road->getDb()->removeObserver(main_window);
15221522

15231523
if (!exception.hasException()) {
15241524
// don't save anything if exception occured

src/gui/src/mainWindow.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class HelpWidget;
7979

8080
// This is the main window for the GUI. Currently we use a single
8181
// instance of this class.
82-
class MainWindow : public QMainWindow, public ord::OpenRoadObserver
82+
class MainWindow : public QMainWindow, public odb::dbDatabaseObserver
8383
{
8484
Q_OBJECT
8585

src/odb/include/odb/db.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343

4444
#include "dbBlockSet.h"
4545
#include "dbCCSegSet.h"
46+
#include "dbDatabaseObserver.h"
4647
#include "dbMatrix.h"
4748
#include "dbNetSet.h"
4849
#include "dbObject.h"
@@ -484,6 +485,21 @@ class dbDatabase : public dbObject
484485
///
485486
void report();
486487

488+
///
489+
/// Used to be notified when lef/def/odb are read.
490+
///
491+
void addObserver(dbDatabaseObserver* observer);
492+
void removeObserver(dbDatabaseObserver* observer);
493+
494+
///
495+
/// Notify observers when one of these operations is complete.
496+
/// Fine-grained callbacks during construction are not as helpful
497+
/// as knowing when the data is fully loaded into odb.
498+
///
499+
void triggerPostReadLef(dbTech* tech, dbLib* library);
500+
void triggerPostReadDef(dbBlock* block);
501+
void triggerPostReadDb();
502+
487503
///
488504
/// Create an instance of a database
489505
///
Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,10 @@ class dbDatabase;
1515
class dbLib;
1616
class dbTech;
1717

18-
} // namespace odb
19-
20-
namespace ord {
21-
22-
class OpenRoad;
23-
24-
// Observer interface
25-
class OpenRoadObserver
18+
class dbDatabaseObserver
2619
{
2720
public:
28-
virtual ~OpenRoadObserver()
21+
virtual ~dbDatabaseObserver()
2922
{
3023
if (unregister_observer_) {
3124
unregister_observer_();
@@ -37,7 +30,7 @@ class OpenRoadObserver
3730
virtual void postReadDef(odb::dbBlock* block) = 0;
3831
virtual void postReadDb(odb::dbDatabase* db) = 0;
3932

40-
void set_unregister_observer(std::function<void()> unregister_observer)
33+
void setUnregisterObserver(std::function<void()> unregister_observer)
4134
{
4235
unregister_observer_ = std::move(unregister_observer);
4336
}
@@ -46,4 +39,4 @@ class OpenRoadObserver
4639
std::function<void()> unregister_observer_;
4740
};
4841

49-
} // namespace ord
42+
} // namespace odb

0 commit comments

Comments
 (0)