public void WriteBack() { if (MEMWB == "0") { return; } String[] instruction = MEMWB.Split(' '); char op = instruction[0] == "0" ? 'r' : 'i'; ControlUnit(op); int val1 = int.Parse(instruction[1]); int val2 = int.Parse(instruction[2]); int writeData = Mux2x1(val1, val2, memToReg); int writeRegister = int.Parse(instruction[3]); mipsRegisters[writeRegister] = writeData; }
public int[] GetPipelineValues() { int[] pipelineValues = new int[30]; int currentAddress = (currentIndex * 4) + startAddress; pipelineValues[0] = currentIndex != -1 ? currentAddress + 4 : pcReg; pipelineValues[1] = currentIndex != -1 ? currentAddress + 8 : pcReg + 4; if (branchGUI) { pipelineValues[0] -= 4; pipelineValues[1] -= 4; branchGUI = false; } if (IFID != "0") { String[] instruction = IFID.Split(' '); pipelineValues[2] = int.Parse(instruction[7]); // RS pipelineValues[3] = int.Parse(instruction[3]); // RT pipelineValues[4] = int.Parse(instruction[1]); // Read data 1 pipelineValues[5] = int.Parse(instruction[2]); // Read data 2 pipelineValues[6] = instruction[0] == "0" ? int.Parse(instruction[4]) : -1; // Write Register pipelineValues[7] = instruction[0] == "0" ? mipsRegisters[int.Parse(instruction[4])] : -1; // Write Data pipelineValues[8] = instruction[0] == "0" ? -1 : int.Parse(instruction[4]); // Immediate pipelineValues[9] = instruction[0] == "0" ? int.Parse(instruction[3]) : -1; // RT pipelineValues[10] = instruction[0] == "0" ? int.Parse(instruction[4]) : -1; // RD } else { pipelineValues[2] = -1; pipelineValues[3] = -1; pipelineValues[4] = -1; pipelineValues[5] = -1; pipelineValues[6] = -1; pipelineValues[7] = -1; pipelineValues[8] = -1; pipelineValues[9] = -1; pipelineValues[10] = -1; } if (IDEX != "0") { String[] instruction = IDEX.Split(' '); pipelineValues[11] = pipelineValues[4]; // RS pipelineValues[12] = pipelineValues[5]; // RT pipelineValues[13] = pipelineValues[8]; // RT pipelineValues[14] = instruction[0] == "0" ? pipelineValues[12] : pipelineValues[13]; // Mux Value // RT pipelineValues[15] = int.Parse(instruction[1]); // ALU value pipelineValues[16] = pipelineValues[9]; // RT pipelineValues[17] = pipelineValues[10]; // RD pipelineValues[18] = instruction[0] == "0" ? pipelineValues[16] : -1; // RT pipelineValues[19] = pcReg - 4; // PC Reg pipelineValues[20] = instruction[0] == "0" ? -1 : int.Parse(instruction[4]); // Adder value } else { pipelineValues[11] = -1; pipelineValues[12] = -1; pipelineValues[13] = -1; pipelineValues[14] = -1; pipelineValues[15] = -1; pipelineValues[16] = -1; pipelineValues[17] = -1; pipelineValues[18] = -1; pipelineValues[19] = -1; pipelineValues[20] = -1; } if (EXMEM != "0") { String[] instruction = EXMEM.Split(' '); pipelineValues[21] = pipelineValues[20]; // Adder Value pipelineValues[22] = pipelineValues[15]; // ALU Value pipelineValues[23] = pipelineValues[12]; // Read Data 2 pipelineValues[24] = pipelineValues[23]; // Read Data 2 pipelineValues[25] = pipelineValues[18]; // Mux Value } else { pipelineValues[21] = -1; pipelineValues[22] = -1; pipelineValues[23] = -1; pipelineValues[24] = -1; pipelineValues[25] = -1; } if (MEMWB != "0") { String[] instruction = MEMWB.Split(' '); pipelineValues[26] = pipelineValues[24]; // Read Data 2 pipelineValues[27] = pipelineValues[22]; // ALU Value pipelineValues[28] = instruction[0] == "0" ? pipelineValues[27] : -1; // ALU Value pipelineValues[29] = pipelineValues[25]; // RD } else { pipelineValues[26] = -1; pipelineValues[27] = -1; pipelineValues[28] = -1; pipelineValues[29] = -1; } return(pipelineValues); }