@Override
	public void decode(Decoder decoder) throws DecoderException {
		int el = decoder.openElement(ELEM_VARSIG);
		hash = (int) decoder.readUnsignedInteger(ATTRIB_HASH);
		int subel = decoder.openElement();
		Address vnAddr = AddressXML.decodeFromAttributes(decoder);
		int vnSize = 0;
		if (vnAddr.getAddressSpace().isVariableSpace()) {
			//varnodes in the variable space will have a default offset of -1
			//but we can get the correct size
			decoder.rewindAttributes();
			Varnode.Join join = Varnode.decodePieces(decoder);
			vnSize = join.logicalSize;
		}
		else {
			vnSize = (int) decoder.readSignedInteger(ATTRIB_SIZE);
		}
		vn = new Varnode(vnAddr, vnSize);
		decoder.closeElement(subel);
		if (decoder.peekElement() != 0) {
			subel = decoder.openElement();
			int opc = (int) decoder.readSignedInteger(ATTRIB_CODE);
			opcode = PcodeOp.getMnemonic(opc);
			seqNum = SequenceNumber.decode(decoder);
			decoder.closeElementSkipping(subel);	// Skip the input/output varnodes
		}
		else {
			seqNum = null;
			opcode = null;
		}
		decoder.closeElement(el);
	}
A feature representing a portion of the data-flow graph rooted at a particular Varnode.
The feature recursively incorporates details about the Varnode, the operation that defined it, and
the operation's input Varnodes, up to a specific depth.
Ghidra/Features/Decompiler/src/main/java/ghidra/app/decompiler/signature/VarnodeSignature.java