From 527b74b8e4552f1a33f619bd23b592146bf809fb Mon Sep 17 00:00:00 2001 From: James Cherry Date: Fri, 21 Jun 2019 12:02:35 -0700 Subject: [PATCH] ConcreteNetwork::replaceCell failed if port order differed --- network/ConcreteNetwork.cc | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/network/ConcreteNetwork.cc b/network/ConcreteNetwork.cc index 25469171..a2a986c4 100644 --- a/network/ConcreteNetwork.cc +++ b/network/ConcreteNetwork.cc @@ -1149,20 +1149,19 @@ ConcreteNetwork::replaceCell(Instance *inst, Cell *cell) { ConcreteCell *ccell = reinterpret_cast(cell); - InstancePinIterator *pin_iter = pinIterator(inst); - while (pin_iter->hasNext()) { - Pin *pin = pin_iter->next(); - ConcretePin *cpin = reinterpret_cast(pin); + int port_count = ccell->portBitCount(); + ConcreteInstance *cinst = reinterpret_cast(inst); + ConcretePin **pins = cinst->pins_; + ConcretePin **rpins = new ConcretePin*[port_count]; + for (int i = 0; i < port_count; i++) { + ConcretePin *cpin = pins[i]; ConcretePort *pin_cport = reinterpret_cast(cpin->port()); ConcretePort *cport = ccell->findPort(pin_cport->name()); - if (cport) - cpin->port_ = cport; - else - deletePin(pin); + rpins[cport->pinIndex()] = cpin; + cpin->port_ = cport; } - delete pin_iter; - - ConcreteInstance *cinst = reinterpret_cast(inst); + delete [] pins; + cinst->pins_ = rpins; cinst->setCell(ccell); }