Esempio n. 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;
                }
            }
        }
Esempio n. 2
0
        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;
            }
        }
Esempio n. 3
0
        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;
        }
Esempio n. 4
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();
        }