private static boolean isBlockPair(ArrayList<DataCtrl> frags, int start, int stop) {
		int leftCount = 0;
		int rightCount = 0;
		int leftUid = -1;
		int rightUid = -1;
		for (int i = start; i < stop; ++i) {
			DataCtrl frag = frags.get(i);
			DataVertex vert = frag.dataVertex;
			if (!vert.sinks.isEmpty() &&
				(!vert.isOp() || vert.op.getOpcode() != PcodeOp.MULTIEQUAL)) {
				// Nodes must be terminal roots of data-flow or MULTIEQUAL ops
				return false;
			}
			CtrlVertex cvert = frag.ctrlNGram.root;
			if (cvert.graph.side == Side.LEFT) {
				leftCount += 1;
				if (leftCount == 1) {
					leftUid = cvert.uid;
				}
				else if (leftUid != cvert.uid) {
					return false;		// More than one block on LEFT side
				}
			}
			else {
				rightCount += 1;
				if (rightCount == 1) {
					rightUid = cvert.uid;
				}
				else if (rightUid != cvert.uid) {
					return false;		// More than one block on RIGHT side
				}
			}
		}
		return (leftCount == rightCount);
	}
Test if a range of vertices that have a matching data n-gram and a matching control-flow n-gram
occur within a single pair of basic blocks.  There must be an equal number of vertices
in one basic block on the LEFT and in one on the RIGHT.   Additionally, the vertices must
either have no output edges or be MULTIEQUAL op nodes.
@param frags is the list of vertices associated with control-flow n-grams
@param start is the start of the matching range
@param stop is the end of the matching range
@return true if the vertices occur within a single pair of basic blocks and can be paired
Ghidra/Features/CodeCompare/src/main/java/ghidra/features/codecompare/graphanalysis/Pinning.java