Example #1
0
 public void write_to_reg(ref Multiplexer writedt_dest, int pc_plus4, ref Multiplexer memtoreg)
 {
     writeData = writedt_dest.Result();
     if (RegWrite)
     {
         registers[Convert.ToInt32(writeRegister, 2)] = writeData;
     }
 }
Example #2
0
        public void get_data(ref ALU alu, ref Multiplexer alu_src, ref Multiplexer ec, ref Memory mem)
        {
            //Don't forget to remove these
            registers[0] = "0";
            int index1 = Convert.ToInt32(ReadRegister1, 2);
            int index2 = Convert.ToInt32(ReadRegister2, 2);

            ReadData1      = registers[index1];
            ReadData2      = registers[index2];
            alu.ReadData1  = ReadData1;
            alu_src.Zero   = ReadData2;
            alu_src.One    = ec.Result();
            mem.Write_Data = Convert.ToInt32(ReadData2, 2);
        }
Example #3
0
        public void calculate(ref Multiplexer alu_scr, ref Memory mem, ref Multiplexer memtoreg, ref Branch_AND_Gate bag)
        {
            switch (Alu_Ctrl)
            {
            case "000":
                int operand1 = Convert.ToInt32(ReadData1, 2);
                int operand2 = Convert.ToInt32(alu_scr.Result(), 2);
                int result   = operand1 + operand2;
                mem.Address  = result;
                memtoreg.One = Convert.ToString(result, 2);
                break;

            case "001":
                operand1 = Convert.ToInt32(ReadData1, 2);
                operand2 = Convert.ToInt32(alu_scr.Result(), 2);
                result   = operand1 - operand2;
                if (result == 0)
                {
                    bag.ALU_Zero = true;
                }
                mem.Address  = result;
                memtoreg.One = Convert.ToString(result, 2);
                break;

            case "010":
                operand1 = Convert.ToInt32(ReadData1, 2);
                operand2 = Convert.ToInt32(alu_scr.Result(), 2);
                if (operand1 < operand2)
                {
                    result = 1;
                }
                else
                {
                    result = 0;
                }
                mem.Address  = result;
                memtoreg.One = Convert.ToString(result, 2);
                break;

            case "011":
                operand1     = Convert.ToInt32(ReadData1, 2);
                operand2     = Convert.ToInt32(alu_scr.Result(), 2);
                result       = operand2 | operand2;
                mem.Address  = result;
                memtoreg.One = Convert.ToString(result, 2);
                break;

            case "100":
                operand1     = Convert.ToInt32(ReadData1, 2);
                operand2     = Convert.ToInt32(alu_scr.Result(), 2);
                result       = operand1 ^ operand2;
                mem.Address  = result;
                memtoreg.One = Convert.ToString(result, 2);
                break;

            case "111":
                operand2     = Convert.ToInt32(alu_scr.Result(), 2);
                result       = operand2 << 16;
                mem.Address  = result;
                memtoreg.One = Convert.ToString(result, 2);
                break;
            }
        }
Example #4
0
        public string[] startProject(string directory)
        {
            string[] lines = System.IO.File.ReadAllLines(directory); // Don't forget to change it
            for (; used_memory < lines.Length; used_memory++)        // inserting texts in memory
            {
                mem.MemArray[(int)used_memory] = Convert.ToInt32(lines[(int)used_memory]);
            }

            while (true)                                   //don't forget to change it
            {
                if (!im.MemArray.ContainsKey(pc_plus_one)) // IM miss, so it should be filled again
                {
                    for (int i = 0, j = pc_plus_one; i < 10; i++, j++)
                    {
                        im.MemArray.Add(j, mem.MemArray[j]);
                    }
                }
                string instr = Convert.ToString(im.MemArray[pc_plus_one++], 2);

                id.decode(ref instr, ref reg_des, ref rf, ref cu);
                string sign_extended = se.load(instr.Substring(16, 16));
                string zero_extened  = ze.extension(instr.Substring(16, 16));

                ec.Zero = sign_extended;
                ec.One  = zero_extened;

                if (cu.set_controls(ref rf, ref alusrc, ref mem, ref alu, ref memtoreg, ref bag, ref reg_des, ref ec,
                                    ref writedt_dest, ref jalr_or_pc, ref jump_or_pc))
                {
                    break;// it was halt so we're done
                }
                rf.WriteRegister = reg_des.Result();
                rf.get_data(ref alu, ref alusrc, ref ec, ref mem);
                alu.calculate(ref alusrc, ref mem, ref memtoreg, ref bag);

                int pc_plus_sign_ext = Convert.ToInt32(sign_extended, 2) + pc_plus_one;
                beq_or_pc.Zero = Convert.ToString(pc_plus_one, 2);
                beq_or_pc.One  = Convert.ToString(pc_plus_sign_ext, 2);

                if (bag.ALU_Zero && bag.Control_Unit)
                {
                    beq_or_pc.Destination = true;
                }

                mem.get_or_set_data(ref memtoreg);

                jalr_or_pc.Zero = beq_or_pc.Result();
                jalr_or_pc.One  = rf.ReadData1;// amount of $rs

                writedt_dest.Zero = Convert.ToString(pc_plus_one, 2);
                writedt_dest.One  = memtoreg.Result();

                rf.write_to_reg(ref writedt_dest, pc_plus_one, ref memtoreg);// choose whether write pc or memtoreg result

                jump_or_pc.Zero = jalr_or_pc.Result();
                jump_or_pc.One  = zero_extened;
                pc_plus_one     = Convert.ToInt32(jump_or_pc.Result(), 2);
                if (rf.Registers[1] == "0")
                {
                    rf.Registers[0] = "0";
                }
            }
            double used_register = 0;

            for (int i = 0; i < 16; i++)
            {
                if (rf.Registers[i] != null)
                {
                    used_register++;
                }
            }

            string[] results = new string[19];

            for (int i = 0; i < 16; i++)
            {
                results[i] = rf.Registers[i];
            }
            results[16] = Convert.ToString((used_register / 16) * 100);
            results[17] = Convert.ToString((used_memory / 16384) * 100);
            results[18] = Convert.ToString(pc_plus_one);
            return(results);
        }