Skip to content

Commit af03f52

Browse files
committed
2 parents 188ece9 + aa40af6 commit af03f52

4 files changed

Lines changed: 60 additions & 0 deletions

File tree

src/backend/evaluator/evaluator.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ void Evaluator::edit_removeBlock(
147147
logError("Node at position {} not found", "Evaluator::edit_removeBlock", position.toString());
148148
return;
149149
}
150+
circuitNodeToBlockTypeMap.erase(node.value());
150151
removeDependentInterCircuitConnections(pauseGuard, node.value());
151152
if (node->isIC()) {
152153
eval_circuit_id_t icId = node->getEvalCircuitId();
@@ -209,6 +210,7 @@ void Evaluator::edit_placeBlock(
209210
}
210211
CircuitNode node = CircuitNode::fromMiddle(gateId);
211212
evalCircuit->setNode(position, node);
213+
circuitNodeToBlockTypeMap[node] = blockType;
212214
dirtyBlockAt(position, evalCircuitId);
213215
checkToCreateExternalConnections(pauseGuard, evalCircuitId, position);
214216
}
@@ -286,12 +288,49 @@ void Evaluator::edit_createConnection(
286288
return;
287289
}
288290
EvalConnection connection(outputPoint.value(), inputPoint.value());
291+
292+
// if (!checkIfBitWidthsMatch(connection)) {
293+
// return;
294+
// }
295+
289296
if (!circuitPortDependencies.empty() || !circuitNodeDependencies.empty()) {
290297
interCircuitConnections.push_back({ connection, circuitPortDependencies, circuitNodeDependencies });
291298
}
292299
evalSimulator->makeConnection(pauseGuard, connection);
293300
}
294301

302+
// bool Evaluator::checkIfBitWidthsMatch(
303+
// const EvalConnection& connection
304+
// ) const {
305+
// CircuitNode outputNode = CircuitNode::fromMiddle(connection.source.gateId);
306+
// CircuitNode inputNode = CircuitNode::fromMiddle(connection.destination.gateId);
307+
// if (!circuitNodeToBlockTypeMap.contains(outputNode) || !circuitNodeToBlockTypeMap.contains(inputNode)) {
308+
// logError("CircuitNode not found in circuitNodeToBlockTypeMap", "Evaluator::checkIfBitWidthsMatch");
309+
// return false;
310+
// }
311+
// BlockType outputBlockType = circuitNodeToBlockTypeMap.at(outputNode);
312+
// unsigned int outputBitWidth;
313+
// if (outputBlockType == BlockType::SWITCH || outputBlockType == BlockType::BUTTON || outputBlockType == BlockType::TICK_BUTTON) {
314+
// outputBitWidth = 1;
315+
// } else {
316+
// BlockData* outputBlockData = blockDataManager.getBlockData(outputBlockType);
317+
// connection_end_id_t outputConnectionEndId = connection.source.portId;
318+
// outputBitWidth = outputBlockData->getConnectionBitWidth(outputConnectionEndId);
319+
// }
320+
321+
// BlockType inputBlockType = circuitNodeToBlockTypeMap.at(inputNode);
322+
// unsigned int inputBitWidth;
323+
// if (inputBlockType == BlockType::LIGHT) {
324+
// inputBitWidth = 1;
325+
// } else{
326+
// BlockData* inputBlockData = blockDataManager.getBlockData(inputBlockType);
327+
// connection_end_id_t inputConnectionEndId = connection.destination.portId;
328+
// inputBitWidth = inputBlockData->getConnectionBitWidth(inputConnectionEndId);
329+
// }
330+
331+
// return outputBitWidth == inputBitWidth;
332+
// }
333+
295334
void Evaluator::removeDependentInterCircuitConnections(SimPauseGuard& pauseGuard, CircuitPortDependency circuitPortDependency) {
296335
// delete any connections that have the pair {circuitId, connectionEndId} in their traceSet
297336
for (auto it = interCircuitConnections.begin(); it != interCircuitConnections.end();) {
@@ -999,8 +1038,10 @@ void Evaluator::traceOutwardsIC(
9991038
} else {
10001039
evalConnection = EvalConnection(targetConnectionPoint, connectionPoint.value());
10011040
}
1041+
// if (checkIfBitWidthsMatch(evalConnection)) {
10021042
evalSimulator->makeConnection(pauseGuard, evalConnection);
10031043
interCircuitConnections.push_back({ evalConnection, circuitPortDependenciesCopy, circuitNodeDependenciesCopy });
1044+
// }
10041045

10051046
traceOutwardsIC(
10061047
pauseGuard,

src/backend/evaluator/evaluator.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ class Evaluator {
175175
std::unordered_set<EvalPosition> dirtyNodes;
176176
std::unordered_multimap<simulator_id_t, EvalPosition> pinSimulatorIdToEvalPositionMap;
177177
std::unordered_map<middle_id_t, EvalPosition> middleIdToEvalPositionMap;
178+
std::unordered_map<CircuitNode, BlockType> circuitNodeToBlockTypeMap;
178179

179180
std::map<void*, SimulatorMappingUpdateListener> listeners;
180181
void sendSimulatorMappingUpdate(eval_circuit_id_t targetEvalCircuitId, const std::vector<SimulatorMappingUpdate>& updates) {
@@ -187,6 +188,9 @@ class Evaluator {
187188

188189
void processDirtyNodes();
189190
void dirtyBlockAt(Position position, eval_circuit_id_t evalCircuitId);
191+
bool checkIfBitWidthsMatch(
192+
const EvalConnection& connection
193+
) const;
190194

191195
mutable std::shared_mutex simMutex;
192196
};

src/backend/evaluator/layers/layer4_replacer.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,9 @@ void Replacer::mergeBusLane(SimPauseGuard& pauseGuard, int layer, int junctionOv
180180
if (sourceBlockType != BlockType::JUNCTION) {
181181
const BlockData* sourceBlockData = blockDataManager.getBlockData(sourceBlockType);
182182
const BlockData::ConnectionData* sourceConnectionData = sourceBlockData->getConnectionData(input.source.portId);
183+
if (!sourceConnectionData) {
184+
continue;
185+
}
183186
sourceLaneId = sourceConnectionData->getLaneId(connectionLaneIndex);
184187
}
185188
BlockLane sourceLane = { sourceBlockId, sourceLaneId };
@@ -214,6 +217,9 @@ void Replacer::mergeBusLane(SimPauseGuard& pauseGuard, int layer, int junctionOv
214217
if (destBlockType != BlockType::JUNCTION) {
215218
const BlockData* destBlockData = blockDataManager.getBlockData(destBlockType);
216219
const BlockData::ConnectionData* destConnectionData = destBlockData->getConnectionData(output.destination.portId);
220+
if (!destConnectionData) {
221+
continue;
222+
}
217223
destLaneId = destConnectionData->getLaneId(connectionLaneIndex);
218224
}
219225
BlockLane destLane = { destBlockId, destLaneId };

src/backend/evaluator/util/circuitNode.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,13 @@ class CircuitNode {
3535
unsigned int id_and_type;
3636
};
3737

38+
namespace std {
39+
template<>
40+
struct hash<CircuitNode> {
41+
size_t operator()(const CircuitNode& node) const noexcept {
42+
return std::hash<unsigned int>()(node.isIC() ? (node.getEvalCircuitId().get() << 1) | 1 : (node.getMiddleId().get() << 1));
43+
}
44+
};
45+
}
46+
3847
#endif /* circuitNode_h */

0 commit comments

Comments
 (0)