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 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(); }