Example #1
0
def _next_Instruction(instructions, tables, state):
    # Read instruction at program counter
    instruction = instructions[state.pc]

    if isinstance(instruction, I.ID):
        state = execute_ID(state)
    elif isinstance(instruction, I.DRP):
        state = execute_DRP(state, instruction.reason)
    elif isinstance(instruction, I.CTR):
        state = execute_CTR(state, instruction.reason)
    elif isinstance(instruction, I.ADD):
        state = execute_ADD(state, instruction.field, instruction.size)
    elif isinstance(instruction, I.RMV):
        state = execute_RMV(state, instruction.field)
    elif isinstance(instruction, I.LD):
        state = execute_LD(state, instruction.destination, instruction.source)
    elif isinstance(instruction, I.ST):
        state = execute_ST(state, instruction.location, instruction.source)
    elif isinstance(instruction, I.OP):
        state = execute_OP(state, instruction.destination, instruction.left_source,
                           instruction.operator, instruction.right_source)
    elif isinstance(instruction, I.PUSH):
        state = execute_PUSH(state, instruction.location)
    elif isinstance(instruction, I.POP):
        state = execute_POP(state, instruction.location)
    elif isinstance(instruction, I.BR):
        state = execute_BR(state, instruction.left_source, instruction.operator,
                           instruction.right_source, instruction.label)
    elif isinstance(instruction, I.JMP):
        state = execute_JMP(state, instruction.label)
    elif isinstance(instruction, I.LBL):
        state = execute_LBL(state)
    elif isinstance(instruction, I.LDt):
        state = execute_LDt(state, tables, instruction.destinations, instruction.table_id, instruction.index)
    elif isinstance(instruction, I.STt):
        state = execute_STt(state, tables, instruction.table_id, instruction.index, instruction.sources)
    elif isinstance(instruction, I.INCt):
        state = execute_INCt(state, tables, instruction.table_id, instruction.index)
    elif isinstance(instruction, I.LKt):
        state = execute_LKt(state, tables, instruction.index, instruction.table_id, instruction.sources)
    elif isinstance(instruction, I.CRC):
        state = execute_CRC(state, instruction.destination, instruction.sources)
    elif isinstance(instruction, I.HSH):
        state = execute_HSH(state, instruction.destination, instruction.sources)
    elif isinstance(instruction, I.CNC):
        state = _execute_CNC(state, tables, instruction.codes)
    elif isinstance(instruction, I.ATM):
        state = _execute_ATM(state, tables, instruction.code)
    elif isinstance(instruction, I.SEQ):
        state = _execute_SEQ(state, tables, instruction.code)
    else:
        raise RuntimeError()

    if state.label == syntax.Label(''):
        state.pc += 1
    else:
        state.pc, _ = get_label(instructions, state.label)

    return state
Example #2
0
def type_check_Instruction(instructions, tables, context):
    # Read instruction at program counter
    instruction = instructions[context.pc]

    # Check if HLT instruction
    if isinstance(instruction, I.HLT):
        type_check_HLT(context)
    else:
        next_Instruction(instructions, tables, context)

        if len(context.labels) == 1:
            if context.labels[0] == syntax.Label(''):
                context.pc += 1
            else:
                context.pc, _ = get_label(instructions, context.labels[0])
            type_check_Instruction(instructions, tables, context)
        elif len(context.labels) == 2:
            if context.labels[0] != '':
                pass
            else:
                raise TypeError("taken-branch label (%s) can't be empty."
                                % (context.labels[0]))
            if context.labels[1] == '':
                pass
            else:
                raise TypeError("not-taken-branch label (%s) must be empty."
                                % (context.labels[1]))

            # type check taken-branch
            contextT = deepcopy(context)
            contextT.pc, _ = get_label(instructions, context.labels[0])
            type_check_Instruction(instructions, tables, contextT)

            # type check not-taken-branch
            context.pc += 1
            type_check_Instruction(instructions, tables, context)
        else:
            raise TypeError("invalid labels (%s) count."
                            % context.labels)
Example #3
0
def type_check_Instruction(instructions, tables, context):
    # Read instruction at program counter
    instruction = instructions[context.pc]

    # Check if HLT instruction
    if isinstance(instruction, I.HLT):
        type_check_HLT(context)
    else:
        next_Instruction(instructions, tables, context)

        if len(context.labels) == 1:
            if context.labels[0] == syntax.Label(''):
                context.pc += 1
            else:
                context.pc, _ = get_label(instructions, context.labels[0])
            type_check_Instruction(instructions, tables, context)
        elif len(context.labels) == 2:
            if context.labels[0] != '':
                pass
            else:
                raise TypeError("taken-branch label (%s) can't be empty." %
                                (context.labels[0]))
            if context.labels[1] == '':
                pass
            else:
                raise TypeError("not-taken-branch label (%s) must be empty." %
                                (context.labels[1]))

            # type check taken-branch
            contextT = deepcopy(context)
            contextT.pc, _ = get_label(instructions, context.labels[0])
            type_check_Instruction(instructions, tables, contextT)

            # type check not-taken-branch
            context.pc += 1
            type_check_Instruction(instructions, tables, context)
        else:
            raise TypeError("invalid labels (%s) count." % context.labels)
Example #4
0
def _next_Instruction(instructions, tables, state):
    # Read instruction at program counter
    instruction = instructions[state.pc]

    if isinstance(instruction, I.ID):
        state = execute_ID(state)
    elif isinstance(instruction, I.DRP):
        state = execute_DRP(state, instruction.reason)
    elif isinstance(instruction, I.CTR):
        state = execute_CTR(state, instruction.reason)
    elif isinstance(instruction, I.ADD):
        state = execute_ADD(state, instruction.field, instruction.size)
    elif isinstance(instruction, I.RMV):
        state = execute_RMV(state, instruction.field)
    elif isinstance(instruction, I.LD):
        state = execute_LD(state, instruction.destination, instruction.source)
    elif isinstance(instruction, I.ST):
        state = execute_ST(state, instruction.location, instruction.source)
    elif isinstance(instruction, I.OP):
        state = execute_OP(state, instruction.destination,
                           instruction.left_source, instruction.operator,
                           instruction.right_source)
    elif isinstance(instruction, I.PUSH):
        state = execute_PUSH(state, instruction.location)
    elif isinstance(instruction, I.POP):
        state = execute_POP(state, instruction.location)
    elif isinstance(instruction, I.BR):
        state = execute_BR(state, instruction.left_source,
                           instruction.operator, instruction.right_source,
                           instruction.label)
    elif isinstance(instruction, I.JMP):
        state = execute_JMP(state, instruction.label)
    elif isinstance(instruction, I.LBL):
        state = execute_LBL(state)
    elif isinstance(instruction, I.LDt):
        state = execute_LDt(state, tables, instruction.destinations,
                            instruction.table_id, instruction.index)
    elif isinstance(instruction, I.STt):
        state = execute_STt(state, tables, instruction.table_id,
                            instruction.index, instruction.sources)
    elif isinstance(instruction, I.INCt):
        state = execute_INCt(state, tables, instruction.table_id,
                             instruction.index)
    elif isinstance(instruction, I.LKt):
        state = execute_LKt(state, tables, instruction.index,
                            instruction.table_id, instruction.sources)
    elif isinstance(instruction, I.CRC):
        state = execute_CRC(state, instruction.destination,
                            instruction.sources)
    elif isinstance(instruction, I.HSH):
        state = execute_HSH(state, instruction.destination,
                            instruction.sources)
    elif isinstance(instruction, I.CNC):
        state = _execute_CNC(state, tables, instruction.codes)
    elif isinstance(instruction, I.ATM):
        state = _execute_ATM(state, tables, instruction.code)
    elif isinstance(instruction, I.SEQ):
        state = _execute_SEQ(state, tables, instruction.code)
    else:
        raise RuntimeError()

    if state.label == syntax.Label(''):
        state.pc += 1
    else:
        state.pc, _ = get_label(instructions, state.label)

    return state