예제 #1
0
def test_single_inst_add32():
    instructions = [(opcode_factory.add32_immediate(rd=1, rn=0, imm=0b01010101010), 32),
                    (opcode_factory.bkpt16(), 16)]
    epiphany = MockEpiphany()
    epiphany.init_state(instructions, rf0=0b01010101010)
    assert epiphany.state.running
    epiphany.run()
    expected_state = StateChecker(AZ=0, pc=(6 + RESET_ADDR), rf1=(0b01010101010 * 2))
    expected_state.check(epiphany.state)
    assert not epiphany.state.running
예제 #2
0
def test_single_inst_add32():
    instructions = [(opcode_factory.add32_immediate(rd=1, rn=0, imm=0b01010101010), 32),
                    (opcode_factory.trap16(3), 16)]
    revelation = MockRevelation()
    revelation.init_state(instructions, rf0=0b01010101010)
    assert revelation.states[0x808].running
    exit_code, ticks = revelation.run()
    expected_state = StateChecker(AZ=0, pc=(6 + RESET_ADDR), rf1=(0b01010101010 * 2))
    expected_state.check(revelation.states[0x808])
    assert EXIT_SUCCESS == exit_code
    assert len(instructions) == ticks
    assert not revelation.states[0x808].running
예제 #3
0
def test_add32_nop16_sub32():
    from pydgin.utils import trim_32
    instructions = [(opcode_factory.add32_immediate(rd=1, rn=0, imm=0b01010101010), 32),
                    (opcode_factory.nop16(), 16),
                    (opcode_factory.sub32_immediate(rd=1, rn=0, imm=0b01010101010), 32),
                    (opcode_factory.bkpt16(), 16),
                    ]
    epiphany = MockEpiphany()
    epiphany.init_state(instructions, rf0=0)
    assert epiphany.state.running
    epiphany.run()
    expected_state = StateChecker(pc=(12 + RESET_ADDR), AC=0, AN=1, AZ=0,
                                  rf1=trim_32(0 - 0b01010101010))
    expected_state.check(epiphany.state)
    assert not epiphany.state.running
예제 #4
0
def test_add32_sub32():
    from pydgin.utils import trim_32
    instructions = [(opcode_factory.add32_immediate(rd=1,rn=0, imm=0b01010101010), 32),
    # TODO: Add new instruction to move the result of instruction 1
    # TODO: to rf[0] before instruction 2 is executed.
                    (opcode_factory.sub32_immediate(rd=1, rn=0, imm=0b01010101010), 32),
                    (opcode_factory.bkpt16(), 16),
                    ]
    epiphany = MockEpiphany()
    epiphany.init_state(instructions, rf0=0)
    assert epiphany.state.running
    epiphany.run()
    expected_state = StateChecker(AZ=0, AN=1, AC=0, pc=(10 + RESET_ADDR),
                                  rf1=trim_32(0 - 0b01010101010))
    expected_state.check(epiphany.state)
    assert not epiphany.state.running
예제 #5
0
def test_add32_nop16_sub32():
    from pydgin.utils import trim_32
    instructions = [(opcode_factory.add32_immediate(rd=1, rn=0, imm=0b01010101010), 32),
                    (opcode_factory.nop16(), 16),
                    (opcode_factory.sub32_immediate(rd=1, rn=0, imm=0b01010101010), 32),
                    (opcode_factory.trap16(3), 16),
                    ]
    revelation = MockRevelation()
    revelation.init_state(instructions, rf0=0)
    assert revelation.states[0x808].running
    exit_code, ticks = revelation.run()
    expected_state = StateChecker(pc=(12 + RESET_ADDR), AC=0, AN=1, AZ=0,
                                  rf1=trim_32(0 - 0b01010101010))
    expected_state.check(revelation.states[0x808])
    assert EXIT_SUCCESS == exit_code
    assert len(instructions) == ticks
    assert not revelation.states[0x808].running
예제 #6
0
def test_bcond32():
    instructions = [(opcode_factory.sub32_immediate(rd=1, rn=0, imm=0b00000000101), 32),
                    (opcode_factory.bcond32(condition=0b0000, imm=0b000000000000000000000100), 32),
                    (opcode_factory.add32_immediate(rd=1, rn=0, imm=0b01010101010), 32),
                    (opcode_factory.bkpt16(), 16),
                    ]
    epiphany = MockEpiphany()
    epiphany.init_state(instructions, rf0=5)
    assert epiphany.state.running
    epiphany.run()
    expected_state = StateChecker(pc=(14 + RESET_ADDR), rf1=0)
    expected_state.check(epiphany.state)
    assert not epiphany.state.running
    epiphany.init_state(instructions, rf0=8)
    epiphany.run()
    expected_state = StateChecker(pc=(14 + RESET_ADDR), rf1=(8 + 0b01010101010))
    expected_state.check(epiphany.state)
    assert not epiphany.state.running
예제 #7
0
def test_add32_sub32():
    from pydgin.utils import trim_32
    instructions = [(opcode_factory.add32_immediate(rd=1,rn=0, imm=0b01010101010), 32),
    # TODO: Add new instruction to move the result of instruction 1
    # TODO: to rf[0] before instruction 2 is executed.
                    (opcode_factory.sub32_immediate(rd=1, rn=0, imm=0b01010101010), 32),
                    (opcode_factory.trap16(3), 16),
                    ]
    revelation = MockRevelation()
    revelation.init_state(instructions, rf0=0)
    assert revelation.states[0x808].running
    exit_code, ticks = revelation.run()
    expected_state = StateChecker(AZ=0, AN=1, AC=0, pc=(10 + RESET_ADDR),
                                  rf1=trim_32(0 - 0b01010101010))
    expected_state.check(revelation.states[0x808])
    assert EXIT_SUCCESS == exit_code
    assert len(instructions) == ticks
    assert not revelation.states[0x808].running
예제 #8
0
def test_bcond32():
    instructions = [(opcode_factory.sub32_immediate(rd=1, rn=0, imm=0b00000000101), 32),
                    (opcode_factory.bcond32(condition=0b0000, imm=0b000000000000000000000100), 32),
                    (opcode_factory.add32_immediate(rd=1, rn=0, imm=0b01010101010), 32),
                    (opcode_factory.trap16(3), 16),
                    ]
    revelation = MockRevelation()
    revelation.init_state(instructions, rf0=5)
    assert revelation.states[0x808].running
    exit_code, ticks = revelation.run()
    expected_state = StateChecker(pc=(14 + RESET_ADDR), rf1=0)
    expected_state.check(revelation.states[0x808])
    assert EXIT_SUCCESS == exit_code
    assert len(instructions) - 1 == ticks
    assert not revelation.states[0x808].running
    revelation = MockRevelation()
    revelation.init_state(instructions, rf0=8)
    exit_code, ticks = revelation.run()
    expected_state = StateChecker(pc=(14 + RESET_ADDR), rf1=(8 + 0b01010101010))
    expected_state.check(revelation.states[0x808])
    assert EXIT_SUCCESS == exit_code
    assert len(instructions) == ticks
    assert not revelation.states[0x808].running
예제 #9
0
def test_decode_add32_immediate_argument():
    instr = Instruction(opcode_factory.add32_immediate(rd=1, rn=0, imm=0b01010101010), '')
    assert instr.rd == 1
    assert instr.rn == 0
    assert instr.imm11 == 0b01010101010
예제 #10
0
from epiphany.instruction import Instruction

import opcode_factory

import pytest

@pytest.mark.parametrize('name,instr',
                         [('add32',       opcode_factory.add32(rd=0, rn=0, rm=0)),
                          ('add16',       opcode_factory.add16(rd=0, rn=0, rm=0)),
                          ('add32',       opcode_factory.add32(rd=1, rn=1, rm=1)),
                          ('add16',       opcode_factory.add16(rd=1, rn=1, rm=1)),
                          ('sub32',       opcode_factory.sub32(rd=0, rn=0, rm=0)),
                          ('sub16',       opcode_factory.sub16(rd=0, rn=0, rm=0)),
                          ('sub32',       opcode_factory.sub32(rd=1, rn=1, rm=1)),
                          ('sub16',       opcode_factory.sub16(rd=1, rn=1, rm=1)),
                          ('add32',       opcode_factory.add32_immediate(rd=1, rn=0, imm=0b01010101010)),
                          ('add16',       opcode_factory.add16_immediate(rd=1, rn=0, imm=0b0101)),
                          ('sub32',       opcode_factory.sub32_immediate(rd=1, rn=0, imm=0b01010101010)),
                          ('sub16',       opcode_factory.sub16_immediate(rd=1, rn=0, imm=0b0101)),
                          ('and32',       opcode_factory.and32(rd=1, rn=1, rm=1)),
                          ('and16',       opcode_factory.and16(rd=1, rn=1, rm=1)),
                          ('orr32',       opcode_factory.orr32(rd=1, rn=1, rm=1)),
                          ('orr16',       opcode_factory.orr16(rd=1, rn=1, rm=1)),
                          ('eor32',       opcode_factory.eor32(rd=1, rn=1, rm=1)),
                          ('eor16',       opcode_factory.eor16(rd=1, rn=1, rm=1)),
                          ('asr32',       opcode_factory.asr32(rd=1, rn=1, rm=1)),
                          ('asr16',       opcode_factory.asr16(rd=1, rn=1, rm=1)),
                          ('lsr32',       opcode_factory.lsr32(rd=1, rn=1, rm=1)),
                          ('lsr16',       opcode_factory.lsr16(rd=1, rn=1, rm=1)),
                          ('lsl32',       opcode_factory.lsl32(rd=1, rn=1, rm=1)),
                          ('lsl16',       opcode_factory.lsl16(rd=1, rn=1, rm=1)),