getsLogic method

  1. @override
void getsLogic(
  1. 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);
  }
}