@Override
	public CompletableFuture<Void> placeBreakpointAsync(AddressRange range,
			Set<TraceBreakpointKind> kinds, String condition, String commands) {
		Set<TraceBreakpointKind> copyKinds = Set.copyOf(kinds);
		if (copyKinds.equals(TraceBreakpointKindSet.HW_EXECUTE)) {
			return placeHwExecBreakAsync(expectSingleAddr(range, TraceBreakpointKind.HW_EXECUTE),
				condition, commands);
		}
		if (copyKinds.equals(TraceBreakpointKindSet.SW_EXECUTE)) {
			return placeSwExecBreakAsync(expectSingleAddr(range, TraceBreakpointKind.SW_EXECUTE),
				condition, commands);
		}
		if (copyKinds.equals(TraceBreakpointKindSet.READ)) {
			return placeReadBreakAsync(range, condition, commands);
		}
		if (copyKinds.equals(TraceBreakpointKindSet.WRITE)) {
			return placeWriteBreakAsync(range, condition, commands);
		}
		if (copyKinds.equals(TraceBreakpointKindSet.ACCESS)) {
			return placeAccessBreakAsync(range, condition, commands);
		}
		Msg.error(this, "Invalid kinds in combination: " + kinds);
		return AsyncUtils.nil();
	}
When checking for register validity, we consider it valid if it or any of its parents are
valid, or any alias thereof.
Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/service/tracermi/TraceRmiTarget.java