private static void addExplicitFlow(ConstructState state, OpTpl op, int flags,
			FlowSummary summary) {
		if (summary.flowState == null) {
			summary.flowState = new ArrayList<>();
		}
		FlowRecord res = new FlowRecord();
		summary.flowState.add(res);
		res.flowFlags = flags;
		res.op = op;
		res.addressnode = null;
		VarnodeTpl dest = op.getInput()[0];		// First varnode input contains the destination address
		if ((flags & (JUMPOUT | CALL | CROSSBUILD)) == 0) {
			return;
		}
		// If the flow is out of the instruction, store the ConstructState so we can easily calculate address
		if (state == null) {
			return;
		}
		if ((flags & CROSSBUILD) != 0) {
			res.addressnode = state;
		}
		else if (dest.getOffset().getType() == ConstTpl.HANDLE) {
			int oper = dest.getOffset().getHandleIndex();
			Constructor ct = state.getConstructor();
			OperandSymbol sym = ct.getOperand(oper);
			if (sym.isCodeAddress()) {
				res.addressnode = state.getSubState(oper);
			}
		}
	}
Cache the Constructor state which represents the base mnemonic, and the operands to that
mnemonic Cache the operand states for each operand in printing order
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighInstructionPrototype.java