@@ -36,6 +36,12 @@ bool _dbScanInst::operator==(const _dbScanInst& rhs) const
3636 if (clock_edge_ != rhs.clock_edge_ ) {
3737 return false ;
3838 }
39+ if (_next_list_scan_inst != rhs._next_list_scan_inst ) {
40+ return false ;
41+ }
42+ if (_prev_list_scan_inst != rhs._prev_list_scan_inst ) {
43+ return false ;
44+ }
3945
4046 return true ;
4147}
@@ -59,6 +65,12 @@ dbIStream& operator>>(dbIStream& stream, _dbScanInst& obj)
5965 stream >> obj.inst_ ;
6066 stream >> obj.scan_clock_ ;
6167 stream >> obj.clock_edge_ ;
68+ if (obj.getDatabase ()->isSchema (db_schema_block_owns_scan_insts)) {
69+ stream >> obj._next_list_scan_inst ;
70+ }
71+ if (obj.getDatabase ()->isSchema (db_schema_block_owns_scan_insts)) {
72+ stream >> obj._prev_list_scan_inst ;
73+ }
6274 return stream;
6375}
6476
@@ -70,6 +82,8 @@ dbOStream& operator<<(dbOStream& stream, const _dbScanInst& obj)
7082 stream << obj.inst_ ;
7183 stream << obj.scan_clock_ ;
7284 stream << obj.clock_edge_ ;
85+ stream << obj._next_list_scan_inst ;
86+ stream << obj._prev_list_scan_inst ;
7387 return stream;
7488}
7589
@@ -137,28 +151,24 @@ uint dbScanInst::getBits() const
137151void dbScanInst::setScanEnable (dbBTerm* scan_enable)
138152{
139153 _dbScanInst* scan_inst = (_dbScanInst*) this ;
140- _dbScanChain* scan_chain = (_dbScanChain *) scan_inst->getOwner ();
141- dbDft* dft = (dbDft*) scan_chain-> getOwner ( );
154+ _dbBlock* block = (_dbBlock *) scan_inst->getOwner ();
155+ dbDft* dft = (dbDft*) block-> _dft_tbl -> getPtr (block-> _dft );
142156 scan_inst->scan_enable_ = dbScanPin::create (dft, scan_enable);
143157}
144158
145159void dbScanInst::setScanEnable (dbITerm* scan_enable)
146160{
147161 _dbScanInst* scan_inst = (_dbScanInst*) this ;
148- _dbScanList* scan_list = (_dbScanList*) scan_inst->getOwner ();
149- _dbScanPartition* scan_partition = (_dbScanPartition*) scan_list->getOwner ();
150- _dbScanChain* scan_chain = (_dbScanChain*) scan_partition->getOwner ();
151- dbDft* dft = (dbDft*) scan_chain->getOwner ();
162+ _dbBlock* block = (_dbBlock*) scan_inst->getOwner ();
163+ dbDft* dft = (dbDft*) block->_dft_tbl ->getPtr (block->_dft );
152164 scan_inst->scan_enable_ = dbScanPin::create (dft, scan_enable);
153165}
154166
155167std::variant<dbBTerm*, dbITerm*> dbScanInst::getScanEnable () const
156168{
157169 _dbScanInst* scan_inst = (_dbScanInst*) this ;
158- _dbScanList* scan_list = (_dbScanList*) scan_inst->getOwner ();
159- _dbScanPartition* scan_partition = (_dbScanPartition*) scan_list->getOwner ();
160- _dbScanChain* scan_chain = (_dbScanChain*) scan_partition->getOwner ();
161- _dbDft* dft = (_dbDft*) scan_chain->getOwner ();
170+ _dbBlock* block = (_dbBlock*) scan_inst->getOwner ();
171+ _dbDft* dft = (_dbDft*) block->_dft_tbl ->getPtr (block->_dft );
162172 const dbScanPin* scan_enable = (dbScanPin*) dft->scan_pins_ ->getPtr (
163173 (dbId<_dbScanPin>) scan_inst->scan_enable_ );
164174 return scan_enable->getPin ();
@@ -177,10 +187,8 @@ std::string_view getName(odb::dbITerm* iterm)
177187void dbScanInst::setAccessPins (const AccessPins& access_pins)
178188{
179189 _dbScanInst* scan_inst = (_dbScanInst*) this ;
180- _dbScanList* scan_list = (_dbScanList*) scan_inst->getOwner ();
181- _dbScanPartition* scan_partition = (_dbScanPartition*) scan_list->getOwner ();
182- _dbScanChain* scan_chain = (_dbScanChain*) scan_partition->getOwner ();
183- dbDft* dft = (dbDft*) scan_chain->getOwner ();
190+ _dbBlock* block = (_dbBlock*) scan_inst->getOwner ();
191+ dbDft* dft = (dbDft*) block->_dft_tbl ->getPtr (block->_dft );
184192
185193 std::visit (
186194 [&access_pins, scan_inst, dft](auto && scan_in_pin) {
@@ -200,10 +208,8 @@ dbScanInst::AccessPins dbScanInst::getAccessPins() const
200208{
201209 AccessPins access_pins;
202210 _dbScanInst* scan_inst = (_dbScanInst*) this ;
203- _dbScanList* scan_list = (_dbScanList*) scan_inst->getOwner ();
204- _dbScanPartition* scan_partition = (_dbScanPartition*) scan_list->getOwner ();
205- _dbScanChain* scan_chain = (_dbScanChain*) scan_partition->getOwner ();
206- _dbDft* dft = (_dbDft*) scan_chain->getOwner ();
211+ _dbBlock* block = (_dbBlock*) scan_inst->getOwner ();
212+ _dbDft* dft = (_dbDft*) block->_dft_tbl ->getPtr (block->_dft );
207213
208214 const auto & [scan_in_id, scan_out_id] = scan_inst->access_pins_ ;
209215
@@ -221,19 +227,34 @@ dbScanInst::AccessPins dbScanInst::getAccessPins() const
221227dbInst* dbScanInst::getInst () const
222228{
223229 _dbScanInst* scan_inst = (_dbScanInst*) this ;
224- _dbScanList* scan_list = (_dbScanList*) scan_inst->getOwner ();
225- _dbScanPartition* scan_partition = (_dbScanPartition*) scan_list->getOwner ();
226- _dbScanChain* scan_chain = (_dbScanChain*) scan_partition->getOwner ();
227- _dbDft* dft = (_dbDft*) scan_chain->getOwner ();
228- _dbBlock* block = (_dbBlock*) dft->getOwner ();
229-
230+ _dbBlock* block = (_dbBlock*) scan_inst->getOwner ();
230231 return (dbInst*) block->_inst_tbl ->getPtr ((dbId<_dbInst>) scan_inst->inst_ );
231232}
232233
234+ void dbScanInst::insertAtFront (dbScanList* scan_list_)
235+ {
236+ _dbScanInst* scan_inst = (_dbScanInst*) this ;
237+ _dbScanList* scan_list = (_dbScanList*) scan_list_;
238+ _dbBlock* block = (_dbBlock*) scan_inst->getOwner ();
239+
240+ if (scan_list->_first_scan_inst != 0 ) {
241+ _dbScanInst* head
242+ = block->_scan_inst_tbl ->getPtr (scan_list->_first_scan_inst );
243+ scan_inst->_next_list_scan_inst = scan_list->_first_scan_inst ;
244+ head->_prev_list_scan_inst = scan_inst->getOID ();
245+ } else {
246+ // Needed if an already listed scan inst is moved to an empty list.
247+ scan_inst->_next_list_scan_inst = 0 ;
248+ }
249+
250+ scan_inst->_prev_list_scan_inst = 0 ;
251+ scan_list->_first_scan_inst = scan_inst->getOID ();
252+ }
253+
233254dbScanInst* dbScanInst::create (dbScanList* scan_list, dbInst* inst)
234255{
235- _dbScanList* obj = (_dbScanList *) scan_list ;
236- _dbScanInst* scan_inst = (_dbScanInst*) obj-> scan_insts_ ->create ();
256+ _dbBlock* block = (_dbBlock *) ((_dbInst*) inst)-> getOwner () ;
257+ _dbScanInst* scan_inst = (_dbScanInst*) block-> _scan_inst_tbl ->create ();
237258 scan_inst->inst_ = ((_dbInst*) inst)->getId ();
238259
239260 return (dbScanInst*) scan_inst;
0 commit comments