@Override
		public FunctionNode process(Function function, TaskMonitor monitor) throws Exception {

			monitor.checkCancelled();
			DecompInterface decompiler = pool.get();
			try {
				LSHVector vec = null;
				ArrayList<Address> callAddresses = null;
				SignatureResult sigres =
					decompiler.generateSignatures(function, !callsByReference, TIMEOUT, monitor);
				if (sigres == null) {
					callAddresses = new ArrayList<Address>();
				}
				else {
					vec = vectorFactory.buildVector(sigres.features);
					if (callsByReference) {
						callAddresses = getCallAddressesByReference(function, monitor);
					}
					else {
						callAddresses = sigres.calllist;	//It will take a second pass through the data to figure out how the call graph fits together.
					}
				}
				FunctionNode res = new FunctionNode(function, vec, callAddresses);
				if (res.getVector() == null) {
					String errmsg = decompiler.getLastMessage();
					if (errmsg.startsWith("Bad command")) {
						throw new DecompileException(BSimProgramCorrelatorFactory.NAME, errmsg);
					}
				}
				return res;
			}
			finally {
				pool.release(decompiler);
			}
		}
Establish decompiler options for the feature vector calculation
@param program is the specific program to decompile
@return the formal options object
Ghidra/Features/VersionTrackingBSim/src/main/java/ghidra/feature/vt/api/BSimProgramCorrelator.java