Skip to content

Commit b2207dd

Browse files
authored
Merge pull request #8778 from VLSIDA/nested_journal
odb: Nested ECO journaling
2 parents ce8a4f3 + 4aef3ec commit b2207dd

27 files changed

+535
-140
lines changed

src/dbSta/test/cpp/TestHconn.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -945,7 +945,6 @@ TEST_F(TestHconn, ConnectionMade)
945945
// Journalling test.
946946
// Undo everything and check initial state preserved
947947
//
948-
odb::dbDatabase::endEco(block_);
949948
odb::dbDatabase::undoEco(block_);
950949

951950
size_t restored_db_net_count = block_->getNets().size();

src/odb/include/odb/db.h

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7409,46 +7409,46 @@ class dbDatabase : public dbObject
74097409
///
74107410

74117411
///
7412-
/// Begin collecting netlist changes on specified block.
7413-
///
7414-
/// NOTE: Eco changes can not be nested at this time.
7412+
/// Start collecting ECO changes on the specified block.
74157413
///
74167414
static void beginEco(dbBlock* block);
74177415

74187416
///
7419-
/// End collecting netlist changes on specified block.
7417+
/// Stop collecting ECO changes on the specified block.
74207418
///
74217419
static void endEco(dbBlock* block);
74227420

74237421
///
7424-
/// Returns true of the pending eco is empty
7422+
/// Commit the last ECO changes on the specified block.
74257423
///
7426-
static bool ecoEmpty(dbBlock* block);
7424+
static void commitEco(dbBlock* block);
74277425

74287426
///
7429-
/// Read the eco changes from the specified stream to be applied to the
7430-
/// specified block.
7427+
/// Undo the last ECO changes on the specified block.
74317428
///
7432-
static void readEco(dbBlock* block, const char* filename);
7429+
static void undoEco(dbBlock* block);
74337430

74347431
///
7435-
/// Write the eco netlist changes to the specified stream.
7432+
/// Returns true if the current ECO is empty
74367433
///
7437-
static void writeEco(dbBlock* block, const char* filename);
7438-
static int checkEco(dbBlock* block);
7434+
static bool ecoEmpty(dbBlock* block);
74397435

74407436
///
7441-
/// Commit any pending netlist changes.
7437+
/// Return true if the ECO stack is empty. The ECO stack holds
7438+
/// the nested uncommitted ECOs that can still be undone.
74427439
///
7443-
static void commitEco(dbBlock* block);
7440+
static bool ecoStackEmpty(dbBlock* block);
74447441

74457442
///
7446-
/// Undo any pending netlist changes. Only supports:
7447-
/// create and destroy of dbInst and dbNet
7448-
/// dbInst::swapMaster
7449-
/// connect and disconnect of dbBTerm and dbITerm
7443+
/// Read the ECO changes from the specified file to be applied to the
7444+
/// specified block.
74507445
///
7451-
static void undoEco(dbBlock* block);
7446+
static void readEco(dbBlock* block, const char* filename);
7447+
7448+
///
7449+
/// Write the ECO changes to the specified file.
7450+
///
7451+
static void writeEco(dbBlock* block, const char* filename);
74527452

74537453
///
74547454
/// links to utl::Logger

src/odb/src/db/dbBTerm.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,6 @@ void _dbBTerm::connectModNet(_dbModNet* mod_net, _dbBlock* block)
691691
mod_net->getId(),
692692
static_cast<void*>(mod_net),
693693
((dbModNet*) mod_net)->getHierarchicalName());
694-
695694
block->_journal->beginAction(dbJournal::CONNECT_OBJECT);
696695
block->_journal->pushParam(dbBTermObj);
697696
block->_journal->pushParam(bterm->getId());

src/odb/src/db/dbBlock.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,6 @@ _dbBlock::_dbBlock(_dbDatabase* db)
422422
_searchDb = nullptr;
423423
_extmi = nullptr;
424424
_journal = nullptr;
425-
_journal_pending = nullptr;
426425
}
427426

428427
_dbBlock::~_dbBlock()
@@ -517,7 +516,6 @@ _dbBlock::~_dbBlock()
517516
(*_cbitr)->removeOwner();
518517
}
519518
delete _journal;
520-
delete _journal_pending;
521519
}
522520

523521
void dbBlock::clear()
@@ -561,11 +559,6 @@ void dbBlock::clear()
561559
delete block->_journal;
562560
block->_journal = nullptr;
563561
}
564-
565-
if (block->_journal_pending) {
566-
delete block->_journal_pending;
567-
block->_journal_pending = nullptr;
568-
}
569562
}
570563

571564
void _dbBlock::initialize(_dbChip* chip,

src/odb/src/db/dbBlock.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <functional>
77
#include <list>
88
#include <map>
9+
#include <stack>
910
#include <string>
1011
#include <unordered_map>
1112
#include <vector>
@@ -301,7 +302,7 @@ class _dbBlock : public _dbObject
301302
void* _extmi;
302303

303304
dbJournal* _journal;
304-
dbJournal* _journal_pending;
305+
std::stack<dbJournal*> _journal_stack;
305306

306307
_dbBlock(_dbDatabase* db);
307308
~_dbBlock();

src/odb/src/db/dbDatabase.cpp

Lines changed: 83 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -717,47 +717,104 @@ void dbDatabase::write(std::ostream& file)
717717
void dbDatabase::beginEco(dbBlock* block_)
718718
{
719719
_dbBlock* block = (_dbBlock*) block_;
720-
721-
{
722-
delete block->_journal;
720+
if (block->_journal) {
721+
endEco(block_);
723722
}
724-
725723
block->_journal = new dbJournal(block_);
726724
assert(block->_journal);
725+
debugPrint(block_->getImpl()->getLogger(),
726+
utl::ODB,
727+
"DB_ECO",
728+
2,
729+
"ECO: Started ECO #{}",
730+
block->_journal_stack.size());
727731
}
728732

729733
void dbDatabase::endEco(dbBlock* block_)
730734
{
731735
_dbBlock* block = (_dbBlock*) block_;
732-
dbJournal* eco = block->_journal;
736+
assert(block->_journal);
737+
block->_journal_stack.push(block->_journal);
733738
block->_journal = nullptr;
739+
debugPrint(block_->getImpl()->getLogger(),
740+
utl::ODB,
741+
"DB_ECO",
742+
2,
743+
"ECO: Ended ECO #{} (size {}) and pushed to ECO stack",
744+
block->_journal_stack.size() - 1,
745+
block->_journal_stack.top()->size());
746+
}
734747

735-
{
736-
delete block->_journal_pending;
737-
}
748+
void dbDatabase::commitEco(dbBlock* block_)
749+
{
750+
_dbBlock* block = (_dbBlock*) block_;
751+
// Commit the current ECO or the last ECO into stack
752+
assert(block->_journal || !block->_journal_stack.empty());
753+
if (!block->_journal) {
754+
block->_journal = block->_journal_stack.top();
755+
block->_journal_stack.pop();
756+
}
757+
if (!block->_journal_stack.empty()) {
758+
dbJournal* prev_journal = block->_journal_stack.top();
759+
int old_size = prev_journal->size();
760+
prev_journal->append(block->_journal);
761+
debugPrint(block_->getImpl()->getLogger(),
762+
utl::ODB,
763+
"DB_ECO",
764+
2,
765+
"ECO: Merged ECO #{} (size {}) with ECO #{} (size {} -> {})",
766+
block->_journal_stack.size(),
767+
block->_journal->size(),
768+
block->_journal_stack.size() - 1,
769+
old_size,
770+
block->_journal_stack.top()->size());
771+
} else {
772+
debugPrint(block_->getImpl()->getLogger(),
773+
utl::ODB,
774+
"DB_ECO",
775+
2,
776+
"ECO: Committed ECO #{} (size {}) and removed from ECO stack",
777+
block->_journal_stack.size(),
778+
block->_journal->size());
779+
}
780+
delete block->_journal;
781+
block->_journal = nullptr;
782+
}
738783

739-
block->_journal_pending = eco;
784+
void dbDatabase::undoEco(dbBlock* block_)
785+
{
786+
_dbBlock* block = (_dbBlock*) block_;
787+
assert(block->_journal || !block->_journal_stack.empty());
788+
if (!block->_journal) {
789+
block->_journal = block->_journal_stack.top();
790+
block->_journal_stack.pop();
791+
}
792+
debugPrint(block_->getImpl()->getLogger(),
793+
utl::ODB,
794+
"DB_ECO",
795+
2,
796+
"ECO: Undid ECO #{} (size {})",
797+
block->_journal_stack.size(),
798+
block->_journal->size());
799+
dbJournal* journal = block->_journal;
800+
block->_journal = nullptr;
801+
journal->undo();
802+
delete block->_journal;
740803
}
741804

742805
bool dbDatabase::ecoEmpty(dbBlock* block_)
743806
{
744807
_dbBlock* block = (_dbBlock*) block_;
745-
746808
if (block->_journal) {
747809
return block->_journal->empty();
748810
}
749-
750811
return false;
751812
}
752813

753-
int dbDatabase::checkEco(dbBlock* block_)
814+
bool dbDatabase::ecoStackEmpty(dbBlock* block_)
754815
{
755816
_dbBlock* block = (_dbBlock*) block_;
756-
757-
if (block->_journal) {
758-
return block->_journal->size();
759-
}
760-
return 0;
817+
return block->_journal_stack.empty();
761818
}
762819

763820
void dbDatabase::readEco(dbBlock* block_, const char* filename)
@@ -774,11 +831,10 @@ void dbDatabase::readEco(dbBlock* block_, const char* filename)
774831
assert(eco);
775832
stream >> *eco;
776833

777-
{
778-
delete block->_journal_pending;
779-
}
780-
781-
block->_journal_pending = eco;
834+
delete block->_journal;
835+
block->_journal = nullptr;
836+
eco->redo();
837+
block->_journal = eco;
782838
}
783839

784840
void dbDatabase::writeEco(dbBlock* block_, const char* filename)
@@ -796,33 +852,12 @@ void dbDatabase::writeEco(dbBlock* block_, const char* filename)
796852
file.exceptions(std::ifstream::failbit | std::ifstream::badbit
797853
| std::ios::eofbit);
798854

799-
if (block->_journal_pending) {
855+
if (block->_journal) {
800856
dbOStream stream(block->getDatabase(), file);
801-
stream << *block->_journal_pending;
802-
}
803-
}
804-
805-
void dbDatabase::commitEco(dbBlock* block_)
806-
{
807-
_dbBlock* block = (_dbBlock*) block_;
808-
809-
// TODO: Need a check to ensure the commit is not applied to the block of
810-
// which this eco was generated from.
811-
if (block->_journal_pending) {
812-
block->_journal_pending->redo();
813-
delete block->_journal_pending;
814-
block->_journal_pending = nullptr;
815-
}
816-
}
817-
818-
void dbDatabase::undoEco(dbBlock* block_)
819-
{
820-
_dbBlock* block = (_dbBlock*) block_;
821-
822-
if (block->_journal_pending) {
823-
block->_journal_pending->undo();
824-
delete block->_journal_pending;
825-
block->_journal_pending = nullptr;
857+
stream << *block->_journal;
858+
} else if (!block->_journal_stack.empty()) {
859+
dbOStream stream(block->getDatabase(), file);
860+
stream << *block->_journal_stack.top();
826861
}
827862
}
828863

src/odb/src/db/dbGuide.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ dbGuide* dbGuide::create(dbNet* net,
155155
utl::ODB,
156156
"DB_ECO",
157157
1,
158-
"ECO: create guide, layer {} box {}",
158+
"ECO: create dbGuide at id {}, in layer {} box {}",
159+
guide->getOID(),
159160
layer->getName(),
160161
box);
161162
block->_journal->beginAction(dbJournal::CREATE_OBJECT);
@@ -192,8 +193,10 @@ void dbGuide::destroy(dbGuide* guide)
192193
utl::ODB,
193194
"DB_ECO",
194195
1,
195-
"ECO: destroy guide, id: {}",
196-
guide->getId());
196+
"ECO: delete dbGuide at id {}, in layer {} box {}",
197+
guide->getId(),
198+
guide->getLayer()->getName(),
199+
guide->getBox());
197200
block->_journal->beginAction(dbJournal::DELETE_OBJECT);
198201
block->_journal->pushParam(dbGuideObj);
199202
block->_journal->pushParam(net->getOID());

src/odb/src/db/dbITerm.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,6 @@ void dbITerm::disconnect()
510510
(mod_net_impl) ? mod_net_impl->getId() : 0,
511511
static_cast<void*>(mod_net),
512512
(mod_net) ? mod_net->getHierarchicalName() : "NULL");
513-
514513
block->_journal->beginAction(dbJournal::DISCONNECT_OBJECT);
515514
block->_journal->pushParam(dbITermObj);
516515
block->_journal->pushParam(getId());

0 commit comments

Comments
 (0)