@@ -54,6 +54,8 @@ void Evaluator::makeEdit(DifferenceSharedPtr difference, circuit_id_t circuitId)
5454 ZoneScoped;
5555#endif
5656 changedICs = false ;
57+ changedSim = false ;
58+ changedPositioning = false ;
5759 // logInfo("_________________________________________________________________________________________");
5860 // logInfo("Applying edit to Evaluator with ID {} for Circuit ID {}", "Evaluator::makeEdit", evaluatorId, circuitId);
5961 {
@@ -65,12 +67,16 @@ void Evaluator::makeEdit(DifferenceSharedPtr difference, circuit_id_t circuitId)
6567 makeEditInPlace (pauseGuard, evalCircuitId, difference, diffCache);
6668 }
6769 }
68- evalSimulator->endEdit (pauseGuard);
70+ if (changedSim){
71+ evalSimulator->endEdit (pauseGuard);
72+ }
6973 }
7074 if (changedICs) {
7175 dataUpdateEventManager.sendEvent (" addressTreeMakeBranch" );
7276 }
73- processDirtyNodes ();
77+ if (changedSim || changedPositioning){
78+ processDirtyNodes ();
79+ }
7480}
7581
7682void Evaluator::makeEditInPlace (SimPauseGuard& pauseGuard, eval_circuit_id_t evalCircuitId, DifferenceSharedPtr difference, DiffCache& diffCache) {
@@ -161,6 +167,7 @@ void Evaluator::edit_removeBlock(
161167 middle_id_t gateId = node->getMiddleId ();
162168 middleIdToEvalPositionMap.erase (gateId);
163169 evalSimulator->removeGate (pauseGuard, gateId);
170+ changedSim = true ;
164171 middleIdProvider.releaseId (gateId);
165172 evalCircuit->removeNode (position);
166173}
@@ -187,6 +194,7 @@ void Evaluator::edit_deleteICContents(SimPauseGuard& pauseGuard, eval_circuit_id
187194 circuitNodeToBlockTypeMap.erase (node);
188195 middleIdToEvalPositionMap.erase (gateId);
189196 evalSimulator->removeGate (pauseGuard, gateId);
197+ changedSim = true ;
190198 middleIdProvider.releaseId (gateId);
191199 }
192200 evalCircuit->removeNode (pos);
@@ -209,6 +217,7 @@ void Evaluator::edit_placeBlock(
209217
210218 middle_id_t gateId = middleIdProvider.getNewId ();
211219 evalSimulator->addGate (pauseGuard, blockType, gateId);
220+ changedSim = true ;
212221 middleIdToEvalPositionMap[gateId] = { position, evalCircuitId };
213222 EvalCircuit* evalCircuit = evalCircuitContainer.getCircuit (evalCircuitId);
214223 if (!evalCircuit) {
@@ -269,6 +278,7 @@ void Evaluator::edit_removeConnection(
269278 interCircuitConnections.erase (it);
270279 }
271280 evalSimulator->removeConnection (pauseGuard, connection);
281+ changedSim = true ;
272282}
273283
274284void Evaluator::edit_createConnection (
@@ -306,8 +316,10 @@ void Evaluator::edit_createConnection(
306316 }
307317 for (const EvalPosition& evalPosition : visitedEvalPositions) {
308318 dirtyNodes.insert (evalPosition);
319+ changedPositioning = true ;
309320 }
310321 evalSimulator->makeConnection (pauseGuard, connection);
322+ changedSim = true ;
311323}
312324
313325// bool Evaluator::checkIfBitWidthsMatch(
@@ -347,6 +359,7 @@ void Evaluator::removeDependentInterCircuitConnections(SimPauseGuard& pauseGuard
347359 for (auto it = interCircuitConnections.begin (); it != interCircuitConnections.end ();) {
348360 if (it->circuitPortDependencies .find (circuitPortDependency) != it->circuitPortDependencies .end ()) {
349361 evalSimulator->removeConnection (pauseGuard, it->connection );
362+ changedSim = true ;
350363 it = interCircuitConnections.erase (it);
351364 } else {
352365 ++it;
@@ -358,6 +371,7 @@ void Evaluator::removeDependentInterCircuitConnections(SimPauseGuard& pauseGuard
358371 for (auto it = interCircuitConnections.begin (); it != interCircuitConnections.end ();) {
359372 if (it->circuitNodeDependencies .find (node) != it->circuitNodeDependencies .end ()) {
360373 evalSimulator->removeConnection (pauseGuard, it->connection );
374+ changedSim = true ;
361375 it = interCircuitConnections.erase (it);
362376 } else {
363377 ++it;
@@ -376,12 +390,18 @@ void Evaluator::removeCircuitIO(const DataUpdateEventManager::EventData* data) {
376390 BlockType blockType = std::get<0 >(dataValue);
377391 connection_end_id_t connectionEndId = std::get<1 >(dataValue);
378392 Position position = std::get<2 >(dataValue);
379-
393+
380394 circuit_id_t circuitId = circuitBlockDataManager.getCircuitId (blockType);
381395 SimPauseGuard pauseGuard = evalSimulator->beginEdit ();
396+ changedSim = false ;
397+ changedPositioning = false ;
382398 removeDependentInterCircuitConnections (pauseGuard, { circuitId, connectionEndId });
383- evalSimulator->endEdit (pauseGuard);
384- processDirtyNodes ();
399+ if (changedSim){
400+ evalSimulator->endEdit (pauseGuard);
401+ }
402+ if (changedSim || changedPositioning) {
403+ processDirtyNodes ();
404+ }
385405}
386406
387407void Evaluator::setCircuitIO (const DataUpdateEventManager::EventData* data) {
@@ -394,13 +414,15 @@ void Evaluator::setCircuitIO(const DataUpdateEventManager::EventData* data) {
394414 std::pair<BlockType, connection_end_id_t > dataValue = eventData->get ();
395415 BlockType blockType = dataValue.first ;
396416 connection_end_id_t connectionEndId = dataValue.second ;
397-
417+
398418 circuit_id_t circuitId = circuitBlockDataManager.getCircuitId (blockType);
399419 if (circuitId == 0 ) {
400420 logError (" Circuit ID for BlockType {} is 0, cannot set IO" , " Evaluator::setCircuitIO" , blockType);
401421 return ;
402422 }
403423 SimPauseGuard pauseGuard = evalSimulator->beginEdit ();
424+ changedSim = false ;
425+ changedPositioning = false ;
404426 removeDependentInterCircuitConnections (pauseGuard, { circuitId, connectionEndId });
405427 // get the new position
406428 CircuitBlockData* circuitBlockData = circuitBlockDataManager.getCircuitBlockData (circuitId);
@@ -425,8 +447,12 @@ void Evaluator::setCircuitIO(const DataUpdateEventManager::EventData* data) {
425447 }
426448 checkToCreateExternalConnections (pauseGuard, evalCircuitId, *position);
427449 }
428- evalSimulator->endEdit (pauseGuard);
429- processDirtyNodes ();
450+ if (changedSim){
451+ evalSimulator->endEdit (pauseGuard);
452+ }
453+ if (changedSim || changedPositioning) {
454+ processDirtyNodes ();
455+ }
430456}
431457
432458std::optional<connection_end_id_t > Evaluator::getPortId (
@@ -666,6 +692,7 @@ void Evaluator::edit_moveBlock(
666692 middleIdToEvalPositionMap[gateId] = { newPosition, evalCircuitId };
667693 }
668694 evalCircuit->moveNode (curPosition, newPosition);
695+ changedPositioning = true ;
669696 if (finalMove != MoveType::MULTI_BEGIN && finalMove != MoveType::MULTI_MIDDLE) {
670697 checkToCreateExternalConnections (pauseGuard, evalCircuitId, newPosition);
671698 }
@@ -1055,6 +1082,7 @@ void Evaluator::traceOutwardsIC(
10551082 }
10561083 // if (checkIfBitWidthsMatch(evalConnection)) {
10571084 evalSimulator->makeConnection (pauseGuard, evalConnection);
1085+ changedSim = true ;
10581086 interCircuitConnections.push_back ({ evalConnection, circuitPortDependenciesCopy, circuitNodeDependenciesCopy });
10591087 // }
10601088
@@ -1197,6 +1225,7 @@ void Evaluator::dirtyBlockAt(Position position, eval_circuit_id_t evalCircuitId)
11971225 logError (" Block not found at position {}" , " Evaluator::dirtyBlockAt" , position.toString ());
11981226 return ;
11991227 }
1228+ changedPositioning = true ;
12001229 if (block->type () == BlockType::LIGHT) {
12011230 dirtyNodes.insert ({ position, evalCircuitId });
12021231 return ;
0 commit comments