private SimState simBranch(InstructionBranch branch, Stack stack, Block block) throws SimException {
        Instruction currIns = null;
        try {
            (currIns = branch.getInstruction()).execute(this, stack, block);
            SimState lastState = SimState.RUNNING;
            for (InstructionBranch subBranch : branch.getOutputs()) {
                lastState = simBranch(subBranch, stack, block);
                if (!lastState.equals(SimState.RUNNING) || !programState.equals(SimState.RUNNING)) {
                    break;
                }
            }
            return lastState;
        } catch (Exception exec) {
            if (!(exec instanceof SimException)) {
                throw new SimExceptionUnknown(this, currIns, exec);
            } else {
                throw (SimException) exec;
            }
        }
    }