@@ -492,6 +492,28 @@ Resizer::bufferInput(const Pin *top_pin,
492492 Net *input_net = db_network_->net (term);
493493 LibertyPort *input, *output;
494494 buffer_cell->bufferPorts (input, output);
495+
496+ bool has_dont_touch = false ;
497+ NetConnectedPinIterator *pin_iter = network_->connectedPinIterator (input_net);
498+ while (pin_iter->hasNext ()) {
499+ Pin *pin = pin_iter->next ();
500+ // Leave input port pin connected to input_net.
501+ if (pin != top_pin && dontTouch (network_->instance (pin))) {
502+ has_dont_touch = true ;
503+ logger_->warn (RSZ,
504+ 85 ,
505+ " Input {} can't be buffered due to dont-touch fanout {}" ,
506+ network_->name (input_net),
507+ network_->name (pin));
508+ break ;
509+ }
510+ }
511+ delete pin_iter;
512+
513+ if (has_dont_touch) {
514+ return nullptr ;
515+ }
516+
495517 string buffer_name = makeUniqueInstName (" input" );
496518 Instance *parent = db_network_->topInstance ();
497519 Net *buffer_out = makeUniqueNet ();
@@ -501,7 +523,7 @@ Resizer::bufferInput(const Pin *top_pin,
501523 parent, pin_loc);
502524 inserted_buffer_count_++;
503525
504- NetConnectedPinIterator * pin_iter = network_->connectedPinIterator (input_net);
526+ pin_iter = network_->connectedPinIterator (input_net);
505527 while (pin_iter->hasNext ()) {
506528 Pin *pin = pin_iter->next ();
507529 // Leave input port pin connected to input_net.
@@ -1186,6 +1208,9 @@ bool
11861208Resizer::dontTouch (const Instance *inst)
11871209{
11881210 dbInst *db_inst = db_network_->staToDb (inst);
1211+ if (!db_inst) {
1212+ return false ;
1213+ }
11891214 return db_inst->isDoNotTouch ();
11901215}
11911216
0 commit comments