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