Skip to content

Commit 6ede7da

Browse files
committed
2 parents 555128c + 1fba596 commit 6ede7da

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

src/backend/evaluator/evaluator.cpp

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

7682
void 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

274284
void 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

387407
void 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

432458
std::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;

src/backend/evaluator/evaluator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ class Evaluator {
152152
std::unique_ptr<EvalSimulator> evalSimulator;
153153

154154
bool changedICs = false;
155+
bool changedSim = false;
156+
bool changedPositioning = false;
155157

156158
void makeEditInPlace(SimPauseGuard& pauseGuard, eval_circuit_id_t evalCircuitId, DifferenceSharedPtr difference, DiffCache& diffCache);
157159

0 commit comments

Comments
 (0)