private void WriteBack() { if (PipelineRegistersList.MEMWB.Count == 0) { foreach (DataGridViewRow row in PipelineRegistersDataGridView.Rows) { if (row.Cells["Register"].Value.ToString() != "MEM/WB") { continue; } PipelineRegistersDataGridView[1, row.Index].Value = "-"; return; } } var opCode = PipelineRegistersList.MEMWB.Dequeue(); ControlUnit.SetAluControls(opCode.ToString()); Muxs.MemToRegMux = new uint[2]; Muxs.MemToRegMux[1] = uint.Parse(PipelineRegistersList.MEMWB.Dequeue().ToString()); Muxs.MemToRegMux[0] = uint.Parse(PipelineRegistersList.MEMWB.Dequeue().ToString()); RegisterFile.WriteData = Muxs.GetMemToRegMuxVal(ControlUnit.MemToReg); RegisterFile.WriteRegister = uint.Parse(PipelineRegistersList.MEMWB.Dequeue().ToString()); if (ControlUnit.RegWrite != 1) { return; } { RegisterFile.PerformRegisterWrite(); foreach (DataGridViewRow row in MipsRegistersDataGrid.Rows) { if (row.Cells["Register"].Value.ToString() != string.Concat("$", RegisterFile.WriteRegister.ToString())) { continue; } MipsRegistersDataGrid[1, row.Index].Value = RegisterFile.WriteData; var dt = (DataTable)MipsRegistersDataGrid.DataSource; MipsRegisters = GetDict(dt); break; } } }
private void Execute() { if (PipelineRegistersList.IDEX.Count == 0) { foreach (DataGridViewRow row in PipelineRegistersDataGridView.Rows) { if (row.Cells["Register"].Value.ToString() != "ID/EX") { continue; } PipelineRegistersDataGridView[1, row.Index].Value = "-"; return; } } var opCode = PipelineRegistersList.IDEX.Dequeue(); ControlUnit.SetAluControls(opCode.ToString()); var readDataOne = PipelineRegistersList.IDEX.Dequeue(); var readDataTwo = PipelineRegistersList.IDEX.Dequeue(); var signExtension = PipelineRegistersList.IDEX.Dequeue(); var rt = PipelineRegistersList.IDEX.Dequeue(); var rd = PipelineRegistersList.IDEX.Dequeue(); Muxs.AluSrcMux = new uint[2]; Muxs.AluSrcMux[0] = uint.Parse(readDataTwo.ToString()); Muxs.AluSrcMux[1] = uint.Parse(signExtension.ToString()); var aluValueTwo = Muxs.GetAluSrcMuxVal(ControlUnit.AluSrc); ALUControlBlock.ComputeOperation(); // Perform ALU Operation ALU.ValueOne = (uint)readDataOne; ALU.ValueTwo = aluValueTwo; ALU.Operation = ALUControlBlock.Operation; ALU.ComputeResult(); Muxs.RegDstMux = new uint[2]; Muxs.RegDstMux[0] = (uint)rt; Muxs.RegDstMux[1] = (uint)rd; // Enqueue in EX/MEM PipelineRegistersList.EXMEM.Enqueue(opCode); PipelineRegistersList.EXMEM.Enqueue(ALU.Result); PipelineRegistersList.EXMEM.Enqueue(readDataTwo); PipelineRegistersList.EXMEM.Enqueue(Muxs.GetRegDstMuxVal(ControlUnit.RegDst)); // Add to Pipeline DataGridView foreach (DataGridViewRow row in PipelineRegistersDataGridView.Rows) { if (row.Cells["Register"].Value.ToString() != "EX/MEM") { continue; } PipelineRegistersDataGridView[1, row.Index].Value = string.Concat( ALU.Result.ToString(), "\n", readDataTwo.ToString(), "\n", Muxs.GetRegDstMuxVal(ControlUnit.RegDst).ToString()); break; } }
private void Memory() { if (PipelineRegistersList.EXMEM.Count == 0) { foreach (DataGridViewRow row in PipelineRegistersDataGridView.Rows) { if (row.Cells["Register"].Value.ToString() != "EX/MEM") { continue; } PipelineRegistersDataGridView[1, row.Index].Value = "-"; return; } } var opCode = PipelineRegistersList.EXMEM.Dequeue(); ControlUnit.SetAluControls(opCode.ToString()); DataMemoryList.Address = uint.Parse(PipelineRegistersList.EXMEM.Dequeue().ToString()); DataMemoryList.WriteData = uint.Parse(PipelineRegistersList.EXMEM.Dequeue().ToString()); // Perform ReadData / WriteData if (Convert.ToBoolean(ControlUnit.MemRead)) { DataMemoryList.ComputeReadData(); } else if (Convert.ToBoolean(ControlUnit.MemWrite)) { DataMemoryList.ComputeWriteData(); } // Enqueue in MEM/WB PipelineRegistersList.MEMWB.Enqueue(opCode); PipelineRegistersList.MEMWB.Enqueue(DataMemoryList.ReadData); PipelineRegistersList.MEMWB.Enqueue(DataMemoryList.Address); var variable = PipelineRegistersList.EXMEM.Dequeue(); PipelineRegistersList.MEMWB.Enqueue(variable); // Add to DataGridView foreach (DataGridViewRow row in PipelineRegistersDataGridView.Rows) { if (row.Cells["Register"].Value.ToString() != "MEM/WB") { continue; } PipelineRegistersDataGridView[1, row.Index].Value = string.Concat( DataMemoryList.ReadData.ToString(), "\n", DataMemoryList.Address.ToString(), "\n", variable.ToString()); break; } // Add to DataMemory DataGridView if (uint.Parse(DataMemoryList.ReadData.ToString()) != 99 || DataMemoryList.Address <= 31) { return; } DataMemoryDataSource.Rows.Add(ALU.Result, DataMemoryList.ReadData); DataMemory[ALU.Result] = DataMemoryList.ReadData; }
private void Decode() { if (PipelineRegistersList.IFID.Count == 0) { foreach (DataGridViewRow row in PipelineRegistersDataGridView.Rows) { if (row.Cells["Register"].Value.ToString() != "IF/ID") { continue; } PipelineRegistersDataGridView[1, row.Index].Value = "-"; return; } } // Take instruction from IF/ID var currentInstruction = PipelineRegistersList.IFID.Dequeue(); // Remove extra spaces, commas, initial PC var instructionFormat = currentInstruction.ToString().Substring(6).Replace(" ", ""); var instructionOpCode = instructionFormat.Substring(0, 6); ControlUnit.SetAluControls(instructionOpCode); RegisterFile.ReadRegisterOne = Convert.ToUInt32(instructionFormat.Substring(6, 5), 2); RegisterFile.ReadRegisterTwo = Convert.ToUInt32(instructionFormat.Substring(11, 5), 2); // Read Data for given Register Addresses RegisterFile.ReadData1(); RegisterFile.ReadData2(); // Enqueue in ID/EX // Store opCode PipelineRegistersList.IDEX.Enqueue(instructionOpCode); // Store rs, rt PipelineRegistersList.IDEX.Enqueue(RegisterFile.ReadDataOne); PipelineRegistersList.IDEX.Enqueue(RegisterFile.ReadDataTwo); var address = Convert.ToUInt32(instructionFormat.Substring(16, 16), 2); // Store Sign Extension PipelineRegistersList.IDEX.Enqueue(address); // Store rt PipelineRegistersList.IDEX.Enqueue(RegisterFile.ReadRegisterTwo); // Store rd PipelineRegistersList.IDEX.Enqueue(Convert.ToUInt32(instructionFormat.Substring(16, 5), 2)); var func = instructionFormat.Substring(26, 6); var arr = func.ToCharArray(); Array.Reverse(arr); func = new string(arr); ALUControlBlock.Function = func; // Add to DataGridView foreach (DataGridViewRow row in PipelineRegistersDataGridView.Rows) { if (row.Cells["Register"].Value.ToString() != "ID/EX") { continue; } PipelineRegistersDataGridView[1, row.Index].Value = string.Concat( RegisterFile.ReadDataOne.ToString(), "\n", RegisterFile.ReadDataTwo, "\n", address.ToString(), "\n", RegisterFile.ReadRegisterTwo.ToString(), "\n", Convert.ToUInt32(instructionFormat.Substring(16, 5), 2).ToString()); break; } ALUControlBlock.AluOp = ControlUnit.AluOp0 + ControlUnit.AluOp1.ToString(); }