getsLogic method
- Logic other
override
Connects this port to be driven by a Logic signal.
This is a direct connection where the Logic signal drives this port.
Implementation
@override
void getsLogic(Logic other) {
var receiver = _externalPort;
// we must look at the *port* for dimension analysis
int? leafIndex;
var startIdx = 0;
var receiverStartIdx = 0;
var elementWidth = port.elements.first.width;
var endIdx = port.width - 1;
var portElement = port;
if (dimensionAccess != null) {
for (final index in dimensionAccess!) {
if (portElement is! LogicArray) {
leafIndex = index;
elementWidth = portElement.elements.first.width;
break;
}
portElement = portElement.elements[index];
elementWidth = portElement.width;
startIdx += index * elementWidth;
endIdx = startIdx + elementWidth - 1;
if (receiver is LogicArray) {
receiver = receiver.elements[index];
} else {
receiverStartIdx += index * elementWidth;
}
}
}
elementWidth = portElement.elements.first.width;
if (hasSlicing) {
startIdx += sliceLowerIndex! * elementWidth;
endIdx = startIdx + _sliceCount! * elementWidth - 1;
if (receiver is LogicArray) {
receiverStartIdx = sliceLowerIndex!;
} else {
receiverStartIdx += sliceLowerIndex! * elementWidth;
}
}
if (leafIndex != null) {
startIdx += leafIndex;
endIdx = startIdx + elementWidth - 1;
if (receiver is! LogicArray) {
receiverStartIdx += leafIndex;
}
}
final receiverDriver = Logic(width: endIdx - startIdx + 1);
receiverDriver <= other;
if (receiver is LogicArray && hasSlicing) {
final receivers = receiver.elements
.getRange(receiverStartIdx, receiverStartIdx + _sliceCount!);
var incrIndex = 0;
for (final r in receivers) {
r <= receiverDriver.getRange(incrIndex, incrIndex + r.width);
incrIndex += r.width;
}
} else {
receiver.assignSubset(receiverDriver.elements, start: receiverStartIdx);
}
}