diff --git a/src/odb/src/db/dbBTerm.cpp b/src/odb/src/db/dbBTerm.cpp index 1cb1355a7f..6cfb23703e 100644 --- a/src/odb/src/db/dbBTerm.cpp +++ b/src/odb/src/db/dbBTerm.cpp @@ -665,6 +665,7 @@ dbBTerm* dbBTerm::create(dbNet* net_, const char* name) master_impl->flags_.frozen = 1; mterm->order_id_ = inst_hdr->mterms_.size(); inst_hdr->mterms_.push_back(mterm->getOID()); + inst_hdr->mterm_ptrs_.push_back(mterm); _dbInst* inst_impl = (_dbInst*) inst; _dbHier* hier = parent_block->hier_tbl_->getPtr(inst_impl->hierarchy_); diff --git a/src/odb/src/db/dbBlock.cpp b/src/odb/src/db/dbBlock.cpp index 8268386efc..9bf43ebbc5 100644 --- a/src/odb/src/db/dbBlock.cpp +++ b/src/odb/src/db/dbBlock.cpp @@ -72,8 +72,11 @@ #include "dbIsolation.h" #include "dbJournal.h" #include "dbLevelShifter.h" +#include "dbLib.h" #include "dbLogicPort.h" +#include "dbMTerm.h" #include "dbMarkerCategory.h" +#include "dbMaster.h" #include "dbModBTerm.h" #include "dbModITerm.h" #include "dbModInst.h" @@ -981,6 +984,18 @@ dbIStream& operator>>(dbIStream& stream, _dbBlock& block) stream >> *block.iterm_tbl_; stream >> *block.net_tbl_; stream >> *block.inst_hdr_tbl_; + + for (dbInstHdr* hdr_public : + dbSet((dbBlock*) &block, block.inst_hdr_tbl_)) { + _dbInstHdr* inst_hdr = (_dbInstHdr*) hdr_public; + _dbLib* lib = db->lib_tbl_->getPtr(inst_hdr->lib_); + _dbMaster* master = lib->master_tbl_->getPtr(inst_hdr->master_); + inst_hdr->mterm_ptrs_.resize(master->mterm_cnt_); + for (int i = 0; i < master->mterm_cnt_; ++i) { + dbId<_dbMTerm> mterm = inst_hdr->mterms_[i]; + inst_hdr->mterm_ptrs_[i] = master->mterm_tbl_->getPtr(mterm); + } + } if (db->isSchema(kSchemaDbRemoveHash)) { stream >> *block.module_tbl_; stream >> *block.inst_tbl_; diff --git a/src/odb/src/db/dbITerm.cpp b/src/odb/src/db/dbITerm.cpp index 1851415fc1..8867e64dd6 100644 --- a/src/odb/src/db/dbITerm.cpp +++ b/src/odb/src/db/dbITerm.cpp @@ -110,11 +110,7 @@ _dbMTerm* _dbITerm::getMTerm() const _dbBlock* block = (_dbBlock*) getOwner(); _dbInst* inst = block->inst_tbl_->getPtr(inst_); _dbInstHdr* inst_hdr = block->inst_hdr_tbl_->getPtr(inst->inst_hdr_); - _dbDatabase* db = getDatabase(); - _dbLib* lib = db->lib_tbl_->getPtr(inst_hdr->lib_); - _dbMaster* master = lib->master_tbl_->getPtr(inst_hdr->master_); - dbId<_dbMTerm> mterm = inst_hdr->mterms_[flags_.mterm_idx]; - return master->mterm_tbl_->getPtr(mterm); + return inst_hdr->mterm_ptrs_[flags_.mterm_idx]; } _dbInst* _dbITerm::getInst() const @@ -161,11 +157,7 @@ dbMTerm* dbITerm::getMTerm() const _dbBlock* block = (_dbBlock*) iterm->getOwner(); _dbInst* inst = block->inst_tbl_->getPtr(iterm->inst_); _dbInstHdr* inst_hdr = block->inst_hdr_tbl_->getPtr(inst->inst_hdr_); - _dbDatabase* db = iterm->getDatabase(); - _dbLib* lib = db->lib_tbl_->getPtr(inst_hdr->lib_); - _dbMaster* master = lib->master_tbl_->getPtr(inst_hdr->master_); - dbId<_dbMTerm> mterm = inst_hdr->mterms_[iterm->flags_.mterm_idx]; - return (dbMTerm*) master->mterm_tbl_->getPtr(mterm); + return (dbMTerm*) inst_hdr->mterm_ptrs_[iterm->flags_.mterm_idx]; } dbBTerm* dbITerm::getBTerm() diff --git a/src/odb/src/db/dbInstHdr.cpp b/src/odb/src/db/dbInstHdr.cpp index 8b1726ee2c..09cda89eb3 100644 --- a/src/odb/src/db/dbInstHdr.cpp +++ b/src/odb/src/db/dbInstHdr.cpp @@ -71,6 +71,7 @@ _dbInstHdr::_dbInstHdr(_dbDatabase*, const _dbInstHdr& i) lib_(i.lib_), master_(i.master_), mterms_(i.mterms_), + mterm_ptrs_(i.mterm_ptrs_), inst_cnt_(i.inst_cnt_) { } @@ -164,11 +165,14 @@ dbInstHdr* dbInstHdr::create(dbBlock* block_, dbMaster* master_) // MACRO until the complete MACRO is parsed... // inst_hdr->mterms_.resize(master->mterm_cnt_); + inst_hdr->mterm_ptrs_.resize(master->mterm_cnt_); // mterms, this set is ordered: {output, inout, input} int i = 0; for (dbMTerm* mterm : master_->getMTerms()) { - inst_hdr->mterms_[i++] = mterm->getImpl()->getOID(); + inst_hdr->mterms_[i] = mterm->getImpl()->getOID(); + inst_hdr->mterm_ptrs_[i] = (_dbMTerm*) mterm; + i++; } return (dbInstHdr*) inst_hdr; diff --git a/src/odb/src/db/dbInstHdr.h b/src/odb/src/db/dbInstHdr.h index f8f089de0b..a36dcb91df 100644 --- a/src/odb/src/db/dbInstHdr.h +++ b/src/odb/src/db/dbInstHdr.h @@ -4,6 +4,7 @@ #pragma once #include +#include #include "dbCore.h" #include "dbVector.h" @@ -48,7 +49,8 @@ class _dbInstHdr : public _dbObject dbId<_dbLib> lib_; dbId<_dbMaster> master_; dbVector> mterms_; - int inst_cnt_; // number of instances of this InstHdr + std::vector<_dbMTerm*> mterm_ptrs_; // non-persistent + int inst_cnt_; // number of instances of this InstHdr }; dbOStream& operator<<(dbOStream& stream, const _dbInstHdr& inst_hdr);