From 8a6c4c6d8805312786d7b252662f774cbcf23ec9 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Mon, 27 May 2024 19:33:08 -0700 Subject: [PATCH] set_logic_one/zero bidir loop Signed-off-by: James Cherry --- search/Sim.cc | 51 +++++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/search/Sim.cc b/search/Sim.cc index 6c46dabe..105d5d38 100644 --- a/search/Sim.cc +++ b/search/Sim.cc @@ -802,31 +802,38 @@ Sim::setPinValue(const Pin *pin, Vertex *vertex, *bidirect_drvr_vertex; graph_->pinVertices(pin, vertex, bidirect_drvr_vertex); // Set vertex constant flags. - if (vertex) + bool value_changed = false; + if (vertex) { + value_changed |= value != vertex->simValue(); setSimValue(vertex, value); - if (bidirect_drvr_vertex) - setSimValue(bidirect_drvr_vertex, value); - Instance *inst = network_->instance(pin); - if (logicValueZeroOne(value)) - instances_with_const_pins_.insert(inst); - instances_to_annotate_.insert(inst); - - if (network_->isLeaf(inst) - && network_->direction(pin)->isAnyInput()) { - if (eval_queue_.empty() - || (eval_queue_.back() != inst)) - eval_queue_.push(inst); } - else if (network_->isDriver(pin)) { - // Enqueue instances with input pins connected to net. - PinConnectedPinIterator *pin_iter=network_->connectedPinIterator(pin); - while (pin_iter->hasNext()) { - const Pin *pin1 = pin_iter->next(); - if (pin1 != pin - && network_->isLoad(pin1)) - setPinValue(pin1, value); + if (bidirect_drvr_vertex) { + value_changed |= value != bidirect_drvr_vertex->simValue(); + setSimValue(bidirect_drvr_vertex, value); + } + if (value_changed) { + Instance *inst = network_->instance(pin); + if (logicValueZeroOne(value)) + instances_with_const_pins_.insert(inst); + instances_to_annotate_.insert(inst); + + if (network_->isLeaf(inst) + && network_->direction(pin)->isAnyInput()) { + if (eval_queue_.empty() + || (eval_queue_.back() != inst)) + eval_queue_.push(inst); + } + else if (network_->isDriver(pin)) { + // Enqueue instances with input pins connected to net. + PinConnectedPinIterator *pin_iter=network_->connectedPinIterator(pin); + while (pin_iter->hasNext()) { + const Pin *pin1 = pin_iter->next(); + if (pin1 != pin + && network_->isLoad(pin1)) + setPinValue(pin1, value); + } + delete pin_iter; } - delete pin_iter; } } }