Skip to content

Commit ce8a4f3

Browse files
authored
Merge pull request #8764 from The-OpenROAD-Project-staging/secure-odb-undo-eco
rsz: Fixed wrong dbModNet handling in SplitLoadMove
2 parents 350c8bc + e09210e commit ce8a4f3

File tree

14 files changed

+1202
-861
lines changed

14 files changed

+1202
-861
lines changed

src/odb/include/odb/db.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1756,12 +1756,12 @@ class dbNet : public dbObject
17561756
{
17571757
public:
17581758
///
1759-
/// Get the net name.
1759+
/// Get the hierarchical net name (not a base name).
17601760
///
17611761
std::string getName() const;
17621762

17631763
///
1764-
/// Get the net name.
1764+
/// Need a version that does not do strdup every time
17651765
///
17661766
const char* getConstName() const;
17671767

@@ -2520,6 +2520,8 @@ class dbNet : public dbObject
25202520
/// Dump dbNet info for debugging
25212521
///
25222522
void dump() const;
2523+
2524+
void checkSanityModNetConsistency() const;
25232525
};
25242526

25252527
///////////////////////////////////////////////////////////////////////////////
@@ -2532,14 +2534,14 @@ class dbInst : public dbObject
25322534
{
25332535
public:
25342536
///
2535-
/// Get the instance name.
2537+
/// Get the hierarchical instance name (not a base name).
25362538
///
2537-
std::string getName();
2539+
std::string getName() const;
25382540

25392541
///
25402542
/// Need a version that does not do strdup every time
25412543
///
2542-
const char* getConstName();
2544+
const char* getConstName() const;
25432545

25442546
///
25452547
/// Compare, like !strcmp
@@ -2828,7 +2830,7 @@ class dbInst : public dbObject
28282830
///
28292831
/// Get the block of this instance.
28302832
///
2831-
dbBlock* getBlock();
2833+
dbBlock* getBlock() const;
28322834

28332835
///
28342836
/// Get the Master of this instance.

src/odb/src/db/dbBTerm.cpp

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,11 @@ dbBTerm* dbBTerm::create(dbNet* net_, const char* name)
619619
utl::ODB,
620620
"DB_ECO",
621621
1,
622-
"ECO: dbBTerm:create");
622+
"ECO: create dbBTerm '{}' on dbNet({}, {:p}) '{}'",
623+
name,
624+
net->getId(),
625+
static_cast<void*>(net),
626+
name);
623627
block->_journal->beginAction(dbJournal::CREATE_OBJECT);
624628
block->_journal->pushParam(dbBTermObj);
625629
block->_journal->pushParam(net->getId());
@@ -680,9 +684,13 @@ void _dbBTerm::connectModNet(_dbModNet* mod_net, _dbBlock* block)
680684
utl::ODB,
681685
"DB_ECO",
682686
1,
683-
"ECO: connect Bterm {} to modnet {}",
687+
"ECO: connect dbBTerm({} {:p}) '{}' to dbModNet({} {:p}) '{}'",
684688
bterm->getId(),
685-
mod_net->getId());
689+
static_cast<void*>(bterm),
690+
bterm->_name,
691+
mod_net->getId(),
692+
static_cast<void*>(mod_net),
693+
((dbModNet*) mod_net)->getHierarchicalName());
686694

687695
block->_journal->beginAction(dbJournal::CONNECT_OBJECT);
688696
block->_journal->pushParam(dbBTermObj);
@@ -714,9 +722,13 @@ void _dbBTerm::connectNet(_dbNet* net, _dbBlock* block)
714722
utl::ODB,
715723
"DB_ECO",
716724
1,
717-
"ECO: connect Bterm {} to net {}",
725+
"ECO: connect dbBTerm({} {:p}) '{}' to dbNet({} {:p}) '{}'",
718726
bterm->getId(),
719-
net->getId());
727+
static_cast<void*>(bterm),
728+
bterm->_name,
729+
net->getId(),
730+
static_cast<void*>(net),
731+
((dbNet*) net)->getName());
720732
block->_journal->beginAction(dbJournal::CONNECT_OBJECT);
721733
block->_journal->pushParam(dbBTermObj);
722734
block->_journal->pushParam(bterm->getId());
@@ -778,7 +790,10 @@ void dbBTerm::destroy(dbBTerm* bterm_)
778790
utl::ODB,
779791
"DB_ECO",
780792
1,
781-
"ECO: dbBTerm:destroy");
793+
"ECO: delete dbBTerm({}, {:p}) '{}'",
794+
bterm->getId(),
795+
static_cast<void*>(bterm),
796+
bterm->_name);
782797
block->_journal->beginAction(dbJournal::DELETE_OBJECT);
783798
block->_journal->pushParam(dbBTermObj);
784799
block->_journal->pushParam(bterm_->getId());
@@ -797,12 +812,18 @@ void _dbBTerm::disconnectNet(_dbBTerm* bterm, _dbBlock* block)
797812

798813
// Journal
799814
if (block->_journal) {
800-
debugPrint(block->getImpl()->getLogger(),
801-
utl::ODB,
802-
"DB_ECO",
803-
1,
804-
"ECO: disconnect bterm {}",
805-
bterm->getId());
815+
debugPrint(
816+
block->getImpl()->getLogger(),
817+
utl::ODB,
818+
"DB_ECO",
819+
1,
820+
"ECO: disconnect dbBTerm({} {:p}) '{}' from dbNet({} {:p}) '{}'",
821+
bterm->getId(),
822+
static_cast<void*>(bterm),
823+
bterm->_name,
824+
net->getId(),
825+
static_cast<void*>(net),
826+
net->_name);
806827
block->_journal->beginAction(dbJournal::DISCONNECT_OBJECT);
807828
block->_journal->pushParam(dbBTermObj);
808829
block->_journal->pushParam(bterm->getId());
@@ -849,12 +870,18 @@ void _dbBTerm::disconnectModNet(_dbBTerm* bterm, _dbBlock* block)
849870
_dbModNet* mod_net = block->_modnet_tbl->getPtr(bterm->_mnet);
850871

851872
if (block->_journal) {
852-
debugPrint(block->getImpl()->getLogger(),
853-
utl::ODB,
854-
"DB_ECO",
855-
1,
856-
"ECO: disconnect bterm {}",
857-
bterm->getId());
873+
debugPrint(
874+
block->getImpl()->getLogger(),
875+
utl::ODB,
876+
"DB_ECO",
877+
1,
878+
"ECO: disconnect dbBTerm({} {:p}) '{}' from dbModNet({} {:p}) '{}'",
879+
bterm->getId(),
880+
static_cast<void*>(bterm),
881+
bterm->_name,
882+
mod_net->getId(),
883+
static_cast<void*>(mod_net),
884+
((dbModNet*) mod_net)->getHierarchicalName());
858885
block->_journal->beginAction(dbJournal::DISCONNECT_OBJECT);
859886
block->_journal->pushParam(dbBTermObj);
860887
block->_journal->pushParam(bterm->getId());

src/odb/src/db/dbITerm.cpp

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -197,22 +197,26 @@ dbBlock* dbITerm::getBlock() const
197197
{
198198
return (dbBlock*) getImpl()->getOwner();
199199
}
200+
200201
void dbITerm::setClocked(bool v)
201202
{
202203
_dbITerm* iterm = (_dbITerm*) this;
203204
iterm->_flags._clocked = v;
204205
}
206+
205207
bool dbITerm::isClocked()
206208
{
207209
bool masterFlag = getMTerm()->getSigType() == dbSigType::CLOCK ? true : false;
208210
_dbITerm* iterm = (_dbITerm*) this;
209211
return iterm->_flags._clocked > 0 || masterFlag ? true : false;
210212
}
213+
211214
void dbITerm::setMark(uint v)
212215
{
213216
_dbITerm* iterm = (_dbITerm*) this;
214217
iterm->_flags._mark = v;
215218
}
219+
216220
bool dbITerm::isSetMark()
217221
{
218222
_dbITerm* iterm = (_dbITerm*) this;
@@ -345,13 +349,17 @@ void dbITerm::connect(dbNet* net_)
345349
}
346350

347351
if (block->_journal) {
348-
debugPrint(iterm->getImpl()->getLogger(),
352+
debugPrint(getImpl()->getLogger(),
349353
utl::ODB,
350354
"DB_ECO",
351355
1,
352-
"ECO: connect Iterm {} to net {}",
356+
"ECO: connect dbITerm({}, {:p}) '{}' to dbNet({}, {:p}) '{}'",
353357
getId(),
354-
net_->getId());
358+
static_cast<void*>(this),
359+
getName(),
360+
net->getId(),
361+
static_cast<void*>(net),
362+
net_->getName());
355363
block->_journal->beginAction(dbJournal::CONNECT_OBJECT);
356364
block->_journal->pushParam(dbITermObj);
357365
block->_journal->pushParam(getId());
@@ -424,9 +432,13 @@ void dbITerm::connect(dbModNet* mod_net)
424432
utl::ODB,
425433
"DB_ECO",
426434
1,
427-
"ECO: connect Iterm {} to modnet {}",
435+
"ECO: connect dbITerm({} {:p}) '{}' to dbModNet({} {:p}) '{}'",
428436
getId(),
429-
_mod_net->getId());
437+
static_cast<void*>(this),
438+
getName(),
439+
_mod_net->getId(),
440+
static_cast<void*>(_mod_net),
441+
((dbModNet*) _mod_net)->getHierarchicalName());
430442
block->_journal->beginAction(dbJournal::CONNECT_OBJECT);
431443
block->_journal->pushParam(dbITermObj);
432444
block->_journal->pushParam(getId());
@@ -469,8 +481,9 @@ void dbITerm::disconnect()
469481
_dbBlock* block = (_dbBlock*) iterm->getOwner();
470482
_dbNet* net
471483
= iterm->_net == 0 ? nullptr : block->_net_tbl->getPtr(iterm->_net);
472-
_dbModNet* mod_net
484+
_dbModNet* mod_net_impl
473485
= iterm->_mnet == 0 ? nullptr : block->_modnet_tbl->getPtr(iterm->_mnet);
486+
dbModNet* mod_net = (dbModNet*) mod_net_impl;
474487

475488
if (net && net->_flags._dont_touch) {
476489
inst->getLogger()->error(
@@ -482,18 +495,27 @@ void dbITerm::disconnect()
482495
}
483496

484497
if (block->_journal) {
485-
debugPrint(iterm->getImpl()->getLogger(),
498+
debugPrint(getImpl()->getLogger(),
486499
utl::ODB,
487500
"DB_ECO",
488501
1,
489-
"ECO: disconnect Iterm {}",
490-
getId());
502+
"disconnect dbITerm({}, {:p}) '{}' from dbNet({}, {:p}) '{}' "
503+
"corresponding to dbModNet({}, {:p}) '{}'",
504+
getId(),
505+
static_cast<void*>(this),
506+
getName(),
507+
(net) ? net->getId() : 0,
508+
static_cast<void*>(net),
509+
(net) ? net->_name : "NULL",
510+
(mod_net_impl) ? mod_net_impl->getId() : 0,
511+
static_cast<void*>(mod_net),
512+
(mod_net) ? mod_net->getHierarchicalName() : "NULL");
491513

492514
block->_journal->beginAction(dbJournal::DISCONNECT_OBJECT);
493515
block->_journal->pushParam(dbITermObj);
494516
block->_journal->pushParam(getId());
495517
block->_journal->pushParam(net ? net->getOID() : 0U);
496-
block->_journal->pushParam(mod_net ? mod_net->getOID() : 0U);
518+
block->_journal->pushParam(mod_net_impl ? mod_net_impl->getOID() : 0U);
497519
block->_journal->endAction();
498520
}
499521

@@ -526,11 +548,11 @@ void dbITerm::disconnect()
526548
}
527549
}
528550

529-
if (mod_net) {
530-
if (mod_net->_iterms == id) {
531-
mod_net->_iterms = iterm->_next_modnet_iterm;
532-
if (mod_net->_iterms != 0) {
533-
_dbITerm* t = block->_iterm_tbl->getPtr(mod_net->_iterms);
551+
if (mod_net_impl) {
552+
if (mod_net_impl->_iterms == id) {
553+
mod_net_impl->_iterms = iterm->_next_modnet_iterm;
554+
if (mod_net_impl->_iterms != 0) {
555+
_dbITerm* t = block->_iterm_tbl->getPtr(mod_net_impl->_iterms);
534556
t->_prev_modnet_iterm = 0;
535557
}
536558
} else {
@@ -586,9 +608,13 @@ void dbITerm::disconnectDbNet()
586608
utl::ODB,
587609
"DB_ECO",
588610
1,
589-
"ECO: disconnect Iterm {} to net {}",
611+
"ECO: disconnect dbITerm({} {:p}) '{}' from dbNet({} {:p}) '{}'",
590612
getId(),
591-
net->getId());
613+
static_cast<void*>(this),
614+
getName(),
615+
net->getId(),
616+
static_cast<void*>(net),
617+
((dbNet*) net)->getName());
592618
block->_journal->beginAction(dbJournal::DISCONNECT_OBJECT);
593619
block->_journal->pushParam(dbITermObj);
594620
block->_journal->pushParam(getId());
@@ -639,9 +665,11 @@ void dbITerm::disconnectDbModNet()
639665
utl::ODB,
640666
"DB_ECO",
641667
1,
642-
"ECO: disconnect Iterm {} to modnet {}",
668+
"ECO: disconnect dbIterm({}) '{}' from dbModNet({}) '{}'",
643669
getId(),
644-
iterm->_mnet);
670+
getName(),
671+
iterm->_mnet,
672+
mod_net->_name);
645673
block->_journal->beginAction(dbJournal::DISCONNECT_OBJECT);
646674
block->_journal->pushParam(dbITermObj);
647675
block->_journal->pushParam(getId());

0 commit comments

Comments
 (0)