From 7b33c16d10fb3c9a7f8e23f93935519e8c4a556b Mon Sep 17 00:00:00 2001 From: karthikmurakonda Date: Sat, 24 Sep 2022 08:52:33 +0530 Subject: [PATCH] final submission assignment-3 Co-authored-by: SriRam Mudragada --- assignment-3/report.pdf | Bin 0 -> 42289 bytes assignment-3/src/generic/Simulator.java | 29 +++-- .../src/processor/pipeline/Execute.java | 74 +++++++++--- .../processor/pipeline/InstructionFetch.java | 10 +- .../src/processor/pipeline/OperandFetch.java | 107 +++++++++++++----- .../src/processor/pipeline/RegisterWrite.java | 2 +- 6 files changed, 162 insertions(+), 60 deletions(-) create mode 100644 assignment-3/report.pdf diff --git a/assignment-3/report.pdf b/assignment-3/report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6f5e23c2ad16184201f8c66f5ddf81fd90f59f40 GIT binary patch literal 42289 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 0){ + int next = d_is.readInt(); + System.out.println(next); + if(address == -1){ + processor.getRegisterFile().setProgramCounter(next); } + else{ + processor.getMainMemory().setWord(address, next); + } + address += 1; + } processor.getRegisterFile().setValue(0, 0); processor.getRegisterFile().setValue(1, 65535); processor.getRegisterFile().setValue(2, 65535); diff --git a/assignment-3/src/processor/pipeline/Execute.java b/assignment-3/src/processor/pipeline/Execute.java index e70cdde..0bb637b 100644 --- a/assignment-3/src/processor/pipeline/Execute.java +++ b/assignment-3/src/processor/pipeline/Execute.java @@ -1,5 +1,6 @@ package processor.pipeline; import processor.Processor; + import generic.Instruction; import generic.Instruction.OperationType; import generic.Simulator; @@ -21,16 +22,21 @@ public class Execute { public void performEX() { - //TODO + // storing x31 here itself to not to complicate. + // TODO:remove this later in pipeline if(OF_EX_Latch.isEX_enable()) { int op1 = OF_EX_Latch.getOp1(); int op2 = OF_EX_Latch.getOp2(); int imm = OF_EX_Latch.getImm(); + System.out.println("op1: "+op1+" op2: "+op2+" imm: "+imm); Instruction instruction = OF_EX_Latch.getInstruction(); int cur_pc = containingProcessor.getRegisterFile().getProgramCounter(); int alu_result = 0; + System.out.println("EX: " + instruction); OperationType alu_op = OF_EX_Latch.getInstruction().getOperationType(); + System.out.println("ALU OP: " + alu_op); + boolean noma = false; switch(alu_op) { case add: alu_result = op1 + op2; break; @@ -39,8 +45,14 @@ public class Execute { case subi: alu_result = op1 - imm; break; case mul: alu_result = op1 * op2; break; case muli: alu_result = op1 * imm; break; - case div: alu_result = op1 / op2; break; - case divi: alu_result = op1 / imm; break; + case div: + alu_result = op1 / op2; + containingProcessor.getRegisterFile().setValue(31, op1 % op2); + break; + case divi: + alu_result = op1 / imm; + containingProcessor.getRegisterFile().setValue(31, op1 % imm); + break; case and: alu_result = op1 & op2; break; case andi: alu_result = op1 & imm; break; case or: alu_result = op1 | op2; break; @@ -49,25 +61,48 @@ public class Execute { case xori: alu_result = op1 ^ imm; break; case slt: alu_result= (op1 < op2) ? 1 : 0; break; case slti: alu_result= (op1 < imm) ? 1 : 0; break; - case sll: alu_result = op1 << op2; break; - case slli: alu_result = op1 << imm; break; - case srl: alu_result = op1 >>> op2; break; - case srli: alu_result = op1 >>> imm; break; - case sra: alu_result = op1 >> op2; break; - case srai: alu_result = op1 >> imm; break; + case sll: + containingProcessor.getRegisterFile().setValue(31, (int) Math.pow(2, op2)); + alu_result = op1 << op2; + break; + case slli: + containingProcessor.getRegisterFile().setValue(31, (int) Math.pow(2, imm)); + alu_result = op1 << imm; + break; + case srl: + containingProcessor.getRegisterFile().setValue(31, op1 & (1 << (op2 - 1))); + alu_result = op1 >>> op2; + break; + case srli: + containingProcessor.getRegisterFile().setValue(31, op1 & (1 << (imm - 1))); + alu_result = op1 >>> imm; + break; + case sra: + containingProcessor.getRegisterFile().setValue(31, op1 & (1 << (op2 - 1))); + alu_result = op1 >> op2; + break; + case srai: + containingProcessor.getRegisterFile().setValue(31, op1 & (1 << (imm - 1))); + alu_result = op1 >> imm; + break; + + case load: alu_result = op1 + imm; break; + case store: alu_result = op2 + imm; break; case jmp: { - OperandType optype = instruction.getDestinationOperand().getOperandType(); + OperandType optype = instruction.getSourceOperand1().getOperandType(); if (optype == OperandType.Register){ imm = containingProcessor.getRegisterFile().getValue( - instruction.getDestinationOperand().getValue()); + instruction.getSourceOperand1().getValue()); } else{ imm = OF_EX_Latch.getImm(); } - alu_result = cur_pc + imm; + alu_result = cur_pc + imm ; EX_IF_Latch.setIF_enable(true); + EX_IF_Latch.setPC(alu_result); + noma = true; } break; case beq: @@ -77,6 +112,7 @@ public class Execute { alu_result = cur_pc + imm; EX_IF_Latch.setIF_enable(true); EX_IF_Latch.setPC(alu_result); + noma = true; } } break; @@ -87,17 +123,22 @@ public class Execute { alu_result = cur_pc + imm; EX_IF_Latch.setIF_enable(true); EX_IF_Latch.setPC(alu_result); + noma = true; } } break; case blt: { + if(op1 < op2) { alu_result = cur_pc + imm; EX_IF_Latch.setIF_enable(true); EX_IF_Latch.setPC(alu_result); + noma = true; + System.out.println("hello world"); } + System.out.println("hello world2"); } break; case bgt: @@ -107,6 +148,7 @@ public class Execute { alu_result = cur_pc + imm; EX_IF_Latch.setIF_enable(true); EX_IF_Latch.setPC(alu_result); + noma = true; } } break; @@ -118,9 +160,15 @@ public class Execute { break; } + + System.out.println("ALU RESULT: " + alu_result+"\n\n"); + EX_MA_Latch.setALUResult(alu_result); EX_MA_Latch.setInstruction(OF_EX_Latch.getInstruction()); - EX_MA_Latch.setMA_enable(true); + if(!noma) + { + EX_MA_Latch.setMA_enable(true); + } OF_EX_Latch.setEX_enable(false); } } diff --git a/assignment-3/src/processor/pipeline/InstructionFetch.java b/assignment-3/src/processor/pipeline/InstructionFetch.java index f6d85d0..5bebbd5 100644 --- a/assignment-3/src/processor/pipeline/InstructionFetch.java +++ b/assignment-3/src/processor/pipeline/InstructionFetch.java @@ -18,8 +18,13 @@ public class InstructionFetch { } public void performIF() - { - if(IF_EnableLatch.isIF_enable()) + { + if(EX_IF_Latch.isIF_enable()){ + containingProcessor.getRegisterFile().setProgramCounter(EX_IF_Latch.getPC()-1); + + System.out.println("IF: PC set to " + EX_IF_Latch.getPC()); + } + if(IF_EnableLatch.isIF_enable()|| EX_IF_Latch.isIF_enable()) { int currentPC = containingProcessor.getRegisterFile().getProgramCounter(); int newInstruction = containingProcessor.getMainMemory().getWord(currentPC); @@ -28,6 +33,7 @@ public class InstructionFetch { IF_EnableLatch.setIF_enable(false); IF_OF_Latch.setOF_enable(true); + EX_IF_Latch.setIF_enable(false); } } diff --git a/assignment-3/src/processor/pipeline/OperandFetch.java b/assignment-3/src/processor/pipeline/OperandFetch.java index 2b9309a..ecef8f6 100644 --- a/assignment-3/src/processor/pipeline/OperandFetch.java +++ b/assignment-3/src/processor/pipeline/OperandFetch.java @@ -5,6 +5,7 @@ import java.util.Arrays; import generic.Instruction; import processor.Processor; import generic.Instruction.OperationType; +import generic.Operand.OperandType; import generic.Operand; public class OperandFetch { @@ -19,6 +20,21 @@ public class OperandFetch { this.IF_OF_Latch = iF_OF_Latch; this.OF_EX_Latch = oF_EX_Latch; } + + public static int twoscompliment(String s) { + char[] chars = s.toCharArray(); + for (int i = 0; i < chars.length; i++) { + if (chars[i] == '0') { + chars[i] = '1'; + } else { + chars[i] = '0'; + } + } + String s1 = new String(chars); + int num = Integer.parseInt(s1, 2); + num = num + 1; + return num; + } public void performOF() { @@ -27,6 +43,15 @@ public class OperandFetch { int instruction = IF_OF_Latch.getInstruction(); Instruction instr = new Instruction(); String bin_instr = Integer.toBinaryString(instruction); + if (bin_instr.length() < 32) { // TODO: check if this is correct + int diff = 32 - bin_instr.length(); + String zeros = ""; + for (int i = 0; i < diff; i++) { + zeros += "0"; + } + bin_instr = zeros + bin_instr; + } + instr.setProgramCounter(containingProcessor.getRegisterFile().getProgramCounter()); int opcode = Integer.parseInt(bin_instr.substring(0, 5), 2); instr.setOperationType(opTypes[opcode]); @@ -34,16 +59,8 @@ public class OperandFetch { int R2I_type_operators[] = {1,3,5,7,9,11,13,15,17,19,21,22,23,25,26,27,28}; int R1I_type_operators[] = {24,29}; - // if (bin_instr.length() < 32) { // TODO: check if this is correct - // int diff = 32 - bin_instr.length(); - // String zeros = ""; - // for (int i = 0; i < diff; i++) { - // zeros += "0"; - // } - // bin_instr = zeros + bin_instr; - // } - - if (Arrays.asList(R3_type_operators).contains(opcode)){ + // check if the instruction is of type R3 + if (Arrays.stream(R3_type_operators).anyMatch(x -> x == opcode)) { Operand rs1 = new Operand(); Operand rs2 = new Operand(); Operand rd = new Operand(); @@ -52,8 +69,8 @@ public class OperandFetch { rd.setOperandType(Operand.OperandType.Register); rs1.setValue(Integer.parseInt(bin_instr.substring(5, 10), 2)); - rs2.setValue(Integer.parseInt(bin_instr.substring(9, 14), 2)); - rd.setValue(Integer.parseInt(bin_instr.substring(14, 19), 2)); + rs2.setValue(Integer.parseInt(bin_instr.substring(10, 15), 2)); + rd.setValue(Integer.parseInt(bin_instr.substring(15, 20), 2)); int op1 = containingProcessor.getRegisterFile().getValue(rs1.getValue()); int op2 = containingProcessor.getRegisterFile().getValue(rs2.getValue()); @@ -65,37 +82,71 @@ public class OperandFetch { instr.setSourceOperand1(rs1); instr.setSourceOperand2(rs2); } - else if (Arrays.asList(R2I_type_operators).contains(opcode)){ + else if (Arrays.stream(R2I_type_operators).anyMatch(x -> x == opcode)) { Operand rs1 = new Operand(); Operand rd = new Operand(); rs1.setOperandType(Operand.OperandType.Register); rd.setOperandType(Operand.OperandType.Register); rs1.setValue(Integer.parseInt(bin_instr.substring(5, 10), 2)); - rd.setValue(Integer.parseInt(bin_instr.substring(14, 19), 2)); - - int imm = Integer.parseInt(bin_instr.substring(19, 32), 2); // TODO: 2's complement - + rd.setValue(Integer.parseInt(bin_instr.substring(10, 15), 2)); + // check 15th bit to see if it is negative + int imm = Integer.parseInt(bin_instr.substring(15, 32), 2); // TODO: 2's complement + if (bin_instr.charAt(15)=='1'){ + imm = -1*twoscompliment(bin_instr.substring(15, 32)); + System.out.println(bin_instr); + } int op1 = containingProcessor.getRegisterFile().getValue(rs1.getValue()); + int op2 = containingProcessor.getRegisterFile().getValue(rd.getValue()); + System.out.println("imm: " + imm); OF_EX_Latch.setInstruction(instr); OF_EX_Latch.setImm(imm); OF_EX_Latch.setOp1(op1); + OF_EX_Latch.setOp2(op2); + System.out.println("op1: " + op1); + System.out.println("op2: " + rd); instr.setDestinationOperand(rd); instr.setSourceOperand1(rs1); } - else if (Arrays.asList(R1I_type_operators).contains(opcode)){ - Operand rd = new Operand(); - rd.setOperandType(Operand.OperandType.Register); - rd.setValue(Integer.parseInt(bin_instr.substring(5, 10), 2)); - - instr.setDestinationOperand(rd); - - int imm = Integer.parseInt(bin_instr.substring(10, 32), 2); // TODO: 2's complement - - OF_EX_Latch.setInstruction(instr); - OF_EX_Latch.setImm(imm); + else if (Arrays.stream(R1I_type_operators).anyMatch(x -> x == opcode)) { + if(opcode != 24){ + Operand rd = new Operand(); + rd.setOperandType(Operand.OperandType.Register); + rd.setValue(Integer.parseInt(bin_instr.substring(5, 10), 2)); + + instr.setDestinationOperand(rd); + + int imm = Integer.parseInt(bin_instr.substring(10, 32), 2); // TODO: 2's complement + if (bin_instr.charAt(10)=='1'){ + imm = -1*twoscompliment(bin_instr.substring(10, 32)); + System.out.println(bin_instr); + } + System.out.println("imm: " + imm); + OF_EX_Latch.setInstruction(instr); + OF_EX_Latch.setImm(imm); + } + else{ + Operand op = new Operand(); + String imm = bin_instr.substring(10, 32); + int imm_val = Integer.parseInt(imm, 2); + if (imm.charAt(0) == '1'){ + imm_val = -1*twoscompliment(imm); + } + if (imm_val != 0){ + op.setOperandType(OperandType.Immediate); + op.setValue(imm_val); + instr.setSourceOperand1(op); + } + else{ + op.setOperandType(OperandType.Register); + op.setValue(Integer.parseInt(bin_instr.substring(5, 10), 2)); + instr.setSourceOperand1(op); + } + OF_EX_Latch.setInstruction(instr); + OF_EX_Latch.setImm(imm_val); + } } IF_OF_Latch.setOF_enable(false); diff --git a/assignment-3/src/processor/pipeline/RegisterWrite.java b/assignment-3/src/processor/pipeline/RegisterWrite.java index 71d9fc4..a1bc405 100644 --- a/assignment-3/src/processor/pipeline/RegisterWrite.java +++ b/assignment-3/src/processor/pipeline/RegisterWrite.java @@ -1,9 +1,9 @@ package processor.pipeline; import generic.Simulator; -import processor.Processor; import generic.Instruction; import generic.Instruction.OperationType; +import processor.Processor; public class RegisterWrite { Processor containingProcessor;