Esempio n. 1
0
int main(int argc, char* argv[]) {
    (void) argc; (void) argv;
    Mem* mem;
    NEW(mem);
    instantiateMem(mem, MEM_SEG_LEN);

    UM_Word index = mapSegment(mem, 10);
    printf("mapped index: %u\n", index);
    verifyMapped(mem->mappedIDs, mem->unmappedIDs);

    UM_Word value = 20;
    segmentedStore(mem, 0, 9, value);

    if(segmentedLoad(mem, 0, 9) != value) {
        fprintf(stderr, "incorrect load and store");
        exit(1);
    }
    else {
        printf("value: %u\n", segmentedLoad(mem, 0, 9));
        printf("Woohoo! Correct seg store and load!\n");
    }
    
    unmapSegment(mem, index);
    verifyMapped(mem->mappedIDs, mem->unmappedIDs);

    freeMem(mem);
    return 0;
}
Esempio n. 2
0
File: unitTests.c Progetto: rlew/um
int main(int argc, char* argv[]) {
    (void) argc; (void) argv;
    Mem* mem;
    NEW(mem);
    instantiateMem(mem, MEM_SEG_LEN);
    printf("Verifying after instantiate:\n");
    verifyMapped(mem->mappedIDs, mem->unmappedIDs);

    mapSegment(mem, 0, 10);
    verifyMapped(mem->mappedIDs, mem->unmappedIDs);

    UM_Word value = 0;
    segmentedStore(mem, 0, 9, value);

    if(segmentedLoad(mem, 0, 9) != value) {
        fprintf(stderr, "incorrect load and store");
        exit(1);
    }
    else {
        printf("value at memseg: %u\n", segmentedLoad(mem, 0, 9));
        printf("Woohoo! Correct seg store and load!\n");
    }
  
    printf("resizing\n");
    mapSegment(mem, 11, 1);
    printf("verifying index 1 mapping\n");
    verifyMapped(mem->mappedIDs, mem->unmappedIDs);

    unmapSegment(mem, 0);
    printf("verifying index 0 unmapping\n");
    verifyMapped(mem->mappedIDs, mem->unmappedIDs);

    unmapSegment(mem, 11);
    printf("verifying index 1 unmapping\n");
    verifyMapped(mem->mappedIDs, mem->unmappedIDs);

    freeMem(mem);
    return 0;
}
Esempio n. 3
0
/*
 * Executes the Instruction based on the opcode.
 */
static inline void execute_instruction(Instruction instr){
    switch(instr.op) {
        case MOVE:{
            conditionalMove(registers, instr.reg1, instr.reg2, instr.reg3);
            programCounter++;
            break;
        }
        case SEGLOAD:{
            UM_Word ID = registers[instr.reg2];
            UM_Word offset = registers[instr.reg3];
            UM_Word toStore = segmentedLoad(memorySegments, ID, offset);
            registers[instr.reg1] = toStore;
            programCounter++;
            break;
        }
        case SEGSTORE:{
            UM_Word ID = registers[instr.reg1];
            UM_Word offset = registers[instr.reg2];
            UM_Word value = registers[instr.reg3];
            segmentedStore(memorySegments, ID, offset, value);
            programCounter++;
            break;
        }
        case ADD:{
            addition(registers, instr.reg1, instr.reg2, instr.reg3);
            programCounter++;
            break;
        }
        case MULTIPLY:{
            multiplication(registers, instr.reg1, instr.reg2, instr.reg3);
            programCounter++;
            break;
        }
        case DIVIDE:{
            division(registers, instr.reg1, instr.reg2, instr.reg3);
            programCounter++;
            break;
        }
        case NAND:{
            bitwiseNAND(registers, instr.reg1, instr.reg2, instr.reg3);
            programCounter++;
            break;
        }
        case HALT: {
            programCounter = 0;
            break;
        }
        case MAP:{
            UM_Word length = registers[instr.reg3];
            registers[instr.reg2] = mapSegment(memorySegments, length);
            programCounter++;
            break;
        }
        case UNMAP:{
            UM_Word ID = registers[instr.reg3];
            unmapSegment(memorySegments, ID);
            programCounter++;
            break;
        }
        case OUTPUT:{
            output(registers, instr.reg3);
            programCounter++;
            break;
        }
        case INPUT:{
            input(registers, instr.reg3);
            programCounter++;
            break;
        }
        case LOADPROG:{
            UM_Word ID = registers[instr.reg2];
            if(ID != 0){
                loadProgram(memorySegments, ID);
                numInstructions = instructionLength(memorySegments);
                //programPointer = getInstructions(memorySegments);
            }
            programCounter = registers[instr.reg3];
            break;
        }
        case LOADVAL:{
            registers[instr.reg1] = instr.value;
            programCounter++;
            break;
        }
    }
}