public static Interpretation getInterpretation(Program program, Address addr,
			BasicBlockModel model, TaskMonitor monitor) throws CancelledException {
		CodeUnit cu = program.getListing().getCodeUnitContaining(addr);
		if (cu instanceof Data) {
			if (((Data) cu).isDefined()) {
				return DATA;
			}
			return UNDEFINED;
		}
		if (program.getListing().getInstructionAt(addr) == null &&
			program.getListing().getInstructionContaining(addr) != null) {
			return OFFCUT;
		}
		if (program.getFunctionManager().getFunctionAt(addr) != null) {
			return FUNCTION_START;
		}
		if (program.getFunctionManager().getFunctionContaining(addr) != null) {
			return FUNCTION_INTERIOR;
		}
		if (model.getCodeBlockAt(addr, monitor) == null) {
			return WITHIN_BLOCK;
		}
		return Interpretation.BLOCK_START;
	}
Get the {@link Interpretation} for the given address in the given program.  This
method is intended to be called repeatedly in a loop, so it takes a {@link BasicBlockModel}
as a parameter (which only need be created once).
@param program source program
@param addr address in question
@param model block model
@param monitor task model
@return interpretation of addr
@throws CancelledException if user cancels monitor
Ghidra/Extensions/MachineLearning/src/main/java/ghidra/machinelearning/functionfinding/Interpretation.java