Exemple #1
0
        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;
                }
            }
        }
Exemple #2
0
        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();
        }