private void initialize(TaskMonitor monitor) throws CancelledException {

		if (cachedForwardAddressMap != null) {
			return;
		}
		cachedForwardAddressMap = new HashMap<Address, AddressRange>();

		AddressSetView sourceAddressSet =
			(sourceFunction != null) ? sourceFunction.getBody() : null;
		AddressSetView destinationAddressSet =
			(destinationFunction != null) ? destinationFunction.getBody() : null;

		if (sourceAddressSet == null || destinationAddressSet == null) {
			return;
		}

		CodeUnitIterator srcIter =
			sourceFunction.getProgram().getListing().getCodeUnits(sourceAddressSet, true);
		CodeUnitIterator destIter =
			destinationFunction.getProgram().getListing().getCodeUnits(destinationAddressSet, true);

		monitor.setMessage("Defining address ranges...");
		monitor.initialize(sourceAddressSet.getNumAddresses());
		while (srcIter.hasNext() && destIter.hasNext()) {
			CodeUnit srcCodeUnit = srcIter.next();
			CodeUnit destCodeUnit = destIter.next();
			String srcMnemonic = srcCodeUnit.getMnemonicString();
			String destMnemonic = destCodeUnit.getMnemonicString();
			if (srcMnemonic.equals(destMnemonic)) {
				monitor.checkCancelled();
				monitor.incrementProgress(srcCodeUnit.getLength());
				defineRange(cachedForwardAddressMap, srcCodeUnit, destCodeUnit);
			}
			else {
				break;			// First mismatch we break out of the loop
			}
		}
		computeParamCorrelation();
	}
Generate address correlations by viewing each function as a list of instructions in address order
Instructions are paired one at a time, in order, if the mnemonics of the instructions match.
The correlation gives up at the first mismatch.

This algorithm is suitable for correlating functions paired by "exact match" program correlations, where
we know apriori that the functions are identical, instruction for instruction.
Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/api/correlator/address/StraightLineCorrelation.java