public DataTable GenerateDataSGDT() { DataSGDT = new DataTable(); string initAddr = "0x00000000"; // Create Columns DataSGDT.Columns.Add("Address", typeof(string)); DataSGDT.Columns.Add("Name", typeof(string)); DataSGDT.Columns.Add("Value", typeof(string)); foreach (var data in dxSG) { initAddr = data.Addr; foreach (var value in data.StoredValue) { DataSGDT.Rows.Add(initAddr, data.Name.Remove(data.Name.Length - 1, 1), value); int addr = Convert.ToInt32(Converter.ConvertHexToDec(initAddr.Remove(0, 2))) + 1; initAddr = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex(addr.ToString())); } } int limit = 2047 - Int32.Parse(Converter.ConvertHexToDec(initAddr.Remove(0, 2))); for (int i = 0; i < limit; i++) { int addr = Convert.ToInt32(Converter.ConvertHexToDec(initAddr.Remove(0, 2))) + 1; initAddr = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex(addr.ToString())); DataSGDT.Rows.Add(initAddr, "", "0x00"); } return(DataSGDT); }
private static List <Register> BNE() { string imm = tx.Params.Immediate; string offset = imm.Substring(0, 1) + imm.Substring(11, 1) + imm.Substring(1, 10); int num; if (offset.Substring(0, 1) == "1") { offset = DataCleaner.PadHexOpValue(32, offset, '1'); num = Int32.Parse(Convert.ToString(Convert.ToInt32(offset, 2), 10)); } else { num = Int32.Parse(Converter.ConvertBinToDec(offset)); } int ioffSet = (num * 2) + Int32.Parse(Converter.ConvertHexToDec(tx.Address.Replace("0x", ""))); int paramOne = GetRegisterValue(rxSG, GetRegisterIndex(rxSG, tx.Params.RSourceOne)); int paramTwo = GetRegisterValue(rxSG, GetRegisterIndex(rxSG, tx.Params.RDestination)); if (paramOne != paramTwo) { NextAddr = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex(ioffSet.ToString())); } return(rxSG); }
private static List <Register> LH() { // LW x1, var1 //string addr = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertBinToHex(tx.Params.Immediate)); //int index = dx.FindIndex(p => p.Addr == addr); //string value = string.Empty; //for (int i = 0; i < 2; i++) //{ // value = dx[index].StoredValue[i] + value; //} //value = value.Replace("0x", ""); //rxSG[GetRegisterIndex(rxSG, tx.Params.RDestination)].Value = "0x" + DataCleaner.PadHexValue(8, value); ////rxSG[GetRegisterIndex(rxSG, tx.Params.RDestination)].Value = dx[index].Addr; ; int imm = Int32.Parse(Converter.ConvertBinToDec(tx.Params.Immediate)); int sourceOne = 0; if (tx.Params.RSourceOne != null) { sourceOne = Int32.Parse(Converter.ConvertHexToDec( rxSG[GetRegisterIndex(rxSG, tx.Params.RSourceOne)].Value.Replace("0x", "") )); } string addr = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex((imm + sourceOne).ToString())); string value = GetRowValue(addr, 2); value = value.Replace("0x", ""); rxSG[GetRegisterIndex(rxSG, tx.Params.RDestination)].Value = "0x" + DataCleaner.PadHexValue(8, value); return(rxSG); }
private static List <TextSegment> SetAddress(List <TextSegment> txSegment) { int i = 4096; foreach (var tx in txSegment) { tx.Address = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex(i.ToString())); i += 4;; } return(txSegment); }
// REGISTER private static List <Register> ADD() { // ADD x1, x2, x3 int rsOne = GetRegisterValue(rxSG, GetRegisterIndex(rxSG, tx.Params.RSourceOne)); int rsTwo = GetRegisterValue(rxSG, GetRegisterIndex(rxSG, tx.Params.RSourceTwo)); string rsDest = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex((rsOne + rsTwo).ToString())); int index = GetRegisterIndex(rxSG, tx.Params.RDestination); rxSG[index].Value = rsDest; return(rxSG); }
//public static List<Register> ExecuteOperation(TextSegment tx, List<DataSegment> dx, List<Register> rxSG) public static List <Register> ExecuteOperation(TextSegment _tx, DataTable _dx, List <Register> _rxSG) { if (_tx.Address == NextAddr) { tx = _tx; dxDT = _dx; rxSG = _rxSG; if (tx.Params.Immediate == null) { tx.Params.Immediate = "000000"; } string next = (Int32.Parse(Converter.ConvertHexToDec(NextAddr.Replace("0x", ""))) + 4).ToString(); NextAddr = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex(next)); switch (tx.Operation.ToUpper()) { case "LW": rxSG = LW(); break; case "LH": rxSG = LH(); break; case "LB": rxSG = LB(); break; case "ADD": rxSG = ADD(); break; case "SLT": rxSG = SLT(); break; case "SUB": rxSG = SUB(); break; case "ADDI": rxSG = ADDI(); break; case "SLTI": rxSG = SLTI(); break; case "SW": rxSG = SW(); break; case "SH": rxSG = SH(); break; case "SB": rxSG = SB(); break; case "BEQ": rxSG = BEQ(); break; case "BNE": rxSG = BNE(); break; case "BLT": rxSG = BLT(); break; case "BGE": rxSG = BGE(); break; } } return(rxSG); }
private static List <Register> BGE() { string imm = tx.Params.Immediate; string offset = imm.Substring(0, 1) + imm.Substring(11, 1) + imm.Substring(1, 9); int ioffSet = (Int32.Parse(Converter.ConvertBinToDec(offset)) * 2) + Int32.Parse(Converter.ConvertHexToDec(tx.Address.Replace("0x", ""))); int paramOne = GetRegisterValue(rxSG, GetRegisterIndex(rxSG, tx.Params.RSourceOne)); int paramTwo = GetRegisterValue(rxSG, GetRegisterIndex(rxSG, tx.Params.RDestination)); if (paramTwo > paramOne) { NextAddr = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex(ioffSet.ToString())); } return(rxSG); }
// IMMEDIATE private static List <Register> ADDI() { // ADDI x1, x2, x3 int rsOne = GetRegisterValue(rxSG, GetRegisterIndex(rxSG, tx.Params.RSourceOne)); string immRsTwo = tx.Params.Immediate + tx.Params.RSourceTwo; if (immRsTwo.Substring(0, 1) == "1") { immRsTwo = DataCleaner.PadHexOpValue(64, immRsTwo, '1'); } int rsTwo = Int32.Parse(Converter.ConvertBinToDec(immRsTwo)); string rsDest = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex((rsOne + rsTwo).ToString())); int index = GetRegisterIndex(rxSG, tx.Params.RDestination); rxSG[index].Value = rsDest; return(rxSG); }
private static List <Register> SLT() { // SLT x1, x2, x3 int rsOne = GetRegisterValue(rxSG, GetRegisterIndex(rxSG, tx.Params.RSourceOne)); int rsTwo = GetRegisterValue(rxSG, GetRegisterIndex(rxSG, tx.Params.RSourceTwo)); string rsDest = string.Empty; if (rsOne < rsTwo) { rsDest = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex((1).ToString())); } else { rsDest = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex((0).ToString())); } int index = GetRegisterIndex(rxSG, tx.Params.RDestination); rxSG[index].Value = rsDest; return(rxSG); }
private static List <DataSegment> SetStoredValue(List <DataSegment> dataSG) { foreach (var ds in dataSG) { int valueLength = CheckMaxValueLength(ds.Type); List <string> tempSV = new List <string>(); string tempVal = string.Empty; int maxItr = 8 / valueLength; int i = 0; foreach (var value in ds.Value) { if (i != maxItr) { //tempVal += DataCleaner.PadHexValue(valueLength, value); tempVal = DataCleaner.PadHexValue(valueLength, value) + tempVal; i++; } if (i == maxItr) { //var lines = Regex.Matches(tempVal, @"[\s\S]{0,2}").Cast<Match>().Select(x => x.Value).ToList<string>(); //lines.Reverse(); //lines = lines.Where(s => !string.IsNullOrWhiteSpace(s)).ToList(); //tempSV.Add("0x" + tempVal); tempSV.AddRange(PartitionToBytes(tempVal, ds.Type.ToLower())); tempVal = string.Empty; i = 0; } } if (!string.IsNullOrEmpty(tempVal)) { //tempSV.Add("0x" + DataCleaner.PadHexValue(8, tempVal)); //tempVal = DataCleaner.PadHexLeftValue(8, tempVal); //tempVal = DataCleaner.PadHexValue(8, tempVal); tempSV.AddRange(PartitionToBytes(tempVal, ds.Type.ToLower())); } ds.StoredValue = tempSV; } return(dataSG); }
private static List <Register> LB() { // LW x1, var1 int imm = Int32.Parse(Converter.ConvertBinToDec(tx.Params.Immediate)); int sourceOne = 0; if (tx.Params.RSourceOne != null) { sourceOne = Int32.Parse(Converter.ConvertHexToDec( rxSG[GetRegisterIndex(rxSG, tx.Params.RSourceOne)].Value.Replace("0x", "") )); } string addr = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex((imm + sourceOne).ToString())); string value = GetRowValue(addr, 1); value = value.Replace("0x", ""); rxSG[GetRegisterIndex(rxSG, tx.Params.RDestination)].Value = "0x" + DataCleaner.PadHexValue(8, value); //rxSG[GetRegisterIndex(rxSG, tx.Params.RDestination)].Value = dx[index].Addr; ; return(rxSG); }
private static List <Register> SB() { int imm = Int32.Parse(Converter.ConvertBinToDec(tx.Params.Immediate)); int sourceOne = 0; if (tx.Params.RSourceOne != null) { sourceOne = Int32.Parse(Converter.ConvertHexToDec( rxSG[GetRegisterIndex(rxSG, tx.Params.RSourceOne)].Value.Replace("0x", "") )); } string addr = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex((imm + sourceOne).ToString())); string value = rxSG[GetRegisterIndex(rxSG, tx.Params.RDestination)].Value.Replace("0x", ""); var lines = Regex.Matches(value, @"[\s\S]{0,2}").Cast <Match>().Select(x => x.Value).ToList <string>(); lines.RemoveAll(s => string.IsNullOrWhiteSpace(s)); lines.Reverse(); SetRowValue(addr, 1, lines); return(rxSG); }
public static List <Cache> UpdateCache(TextSegment tx, DataTable dxDT, List <Cache> cacheLst, bool IsMRU, List <Register> rxSG) { if ((tx.Operation.ToLower() == "lw") || (tx.Operation.ToLower() == "lh") || (tx.Operation.ToLower() == "lb") || (tx.Operation.ToLower() == "sw") || (tx.Operation.ToLower() == "sh") || (tx.Operation.ToLower() == "sb")) { int imm = Int32.Parse(Converter.ConvertBinToDec(tx.Params.Immediate)); int sourceOne = 0; if (tx.Params.RSourceOne != null) { sourceOne = Int32.Parse(Converter.ConvertHexToDec( rxSG[GetRegisterIndex(rxSG, tx.Params.RSourceOne)].Value.Replace("0x", "") )); } string addr = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex((imm + sourceOne).ToString())); // string addr = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertBinToHex(tx.Params.Immediate)); int IsInCache = cacheLst.FindIndex(p => p.Addr == addr); int beforeAge = 0, afterAge = 0; if (IsInCache == -1) { CacheMiss++; int item = cacheLst.Min(x => x.Age); if (item != 0) { if (IsMRU) { item = cacheLst.Min(x => x.Age); } else { item = cacheLst.Max(x => x.Age); } } IsInCache = cacheLst.FindIndex(p => p.Age == item); int rowIndex = GetRowIndex(dxDT, addr); int cacheIndex = IsInCache; for (int i = 0; i < (blockSize * 4); i++) { if ((rowIndex < dxDT.Rows.Count) && (cacheIndex < cacheLst.Count)) { beforeAge = cacheLst[cacheIndex].Age; afterAge = 1; //cacheLst[cacheIndex].Age++; cacheLst[cacheIndex].Age = 1; cacheLst[cacheIndex].Addr = dxDT.Rows[rowIndex]["Address"].ToString(); cacheLst[cacheIndex].Value = dxDT.Rows[rowIndex]["Value"].ToString(); string binValue = Converter.ConvertHexToBin(cacheLst[cacheIndex].Addr.Replace("0x", "")); if (binValue.Length < 11) { binValue = DataCleaner.PadHexValue(11, binValue); } //string tagWord = binValue.Substring(binValue.Length - 12, 11); cacheLst[cacheIndex].Word = binValue.Substring(tagSize, wordSize); cacheLst[cacheIndex].Tag = binValue.Substring(0, tagSize); rowIndex++; cacheIndex++; } } } else { CacheHit++; int cacheIndex = IsInCache; int lLimit = cacheIndex - (cacheIndex % (blockSize * 4)); int uLimit = lLimit + (blockSize * 4); int limit = cacheIndex % (blockSize * 4); for (int i = 0; i < (blockSize * 4); i++) { if ((i > lLimit) && (i < uLimit)) { beforeAge = cacheLst[cacheIndex].Age; afterAge = 1; cacheLst[cacheIndex].Age = 1; } // cacheLst[cacheIndex].Age++; //cacheIndex++; } IsInCache = lLimit; } if (beforeAge != afterAge) { cacheLst = UpdateCacheAge(cacheLst, IsInCache, blockSize); } } foreach (var cache in cacheLst) { cache.Value = GetValue(dxDT, cache.Addr); } return(cacheLst); }
public static List <TextSegment> GenerateOpCode(List <TextSegment> txSegment) { foreach (var tx in txSegment) { string format = GetParamCount(tx.Operation); string type = GetType(tx.Operation); string opCode = string.Empty; if ((type == "Register") || (type == "Immediate") || (type == "Load")) { string secondParam = "00000"; string thirdParam = string.Empty; if (!string.IsNullOrEmpty(tx.Params.RSourceOne)) { secondParam = tx.Params.RSourceOne; } if (!string.IsNullOrEmpty(tx.Params.RSourceTwo)) { thirdParam = DataCleaner.PadHexValue(12, tx.Params.RSourceTwo); } if (!string.IsNullOrEmpty(tx.Params.Immediate)) { thirdParam = DataCleaner.PadHexValue(12, tx.Params.Immediate); } if (string.IsNullOrEmpty(thirdParam)) { thirdParam = "000000000000"; } opCode = String.Format(format, tx.Params.RDestination, secondParam, thirdParam).Replace(" ", ""); } else { string firstImm = string.Empty; string secondImm = string.Empty; if (type == "Store") { if (tx.Params.Immediate == null) { tx.Params.Immediate = "000000000000"; } secondImm = tx.Params.Immediate.Substring(0, 7); firstImm = tx.Params.Immediate.Substring(7, 5); } else { string[] spltParam = tx.SourceCode.Split(' '); string thirdParam = spltParam[3]; //string thirdParam = tx.Params.Immediate.Substring(9, tx.Params.Immediate.Length-1); int currentAddr = Int32.Parse(Converter.ConvertHexToDec(tx.Address)); int i = txSegment.FindIndex(p => p.SourceCode.Contains(thirdParam + ":")); int lblAddr = Int32.Parse(Converter.ConvertHexToDec(txSegment[i].Address)); int sub = (lblAddr - currentAddr) / 2; string imm; if (sub < 0) { imm = Convert.ToString(Int32.Parse(sub.ToString()), 2); imm = imm.Substring(imm.Length - 12, 12); } else { imm = DataCleaner.PadHexValue(12, Converter.ConvertDecToBin(sub.ToString())); } secondImm = imm.Substring(0, 1) + imm.Substring(2, 6); firstImm = imm.Substring(8, 4) + imm.Substring(1, 1); tx.Params.Immediate = secondImm + firstImm; } opCode = String.Format(format, firstImm, tx.Params.RDestination, tx.Params.RSourceOne, secondImm).Replace(" ", ""); } tx.OpCode = opCode; tx.OpCodeHex = GenerateOpCodeHex(opCode); } return(txSegment); }
private static OpParameters GetParameterObj(string param) { string[] prms = param.Split(','); OpParameters paramObj = new OpParameters(); for (int x = 0; x < prms.Length; x++) { if (x == 0) { paramObj.RDestination = DataCleaner.PadHexValue(5, prms[x]); } if (x == 1) { if (!prms[x].StartsWith("Imm_")) { paramObj.RSourceOne = DataCleaner.PadHexValue(5, prms[x]); } else { string varName = prms[x].Replace("Imm_", ""); int index = dxSG.FindIndex(p => p.Name.Replace(":", "") == varName); if (index > -1) { paramObj.Immediate = DataCleaner.PadHexValue(12, Converter.ConvertDecToBin(Converter.ConvertHexToDec(dxSG[index].Addr.Replace("0x", "")))); } } } if (x == 2) { if (!prms[x].StartsWith("Imm_")) { paramObj.RSourceTwo = DataCleaner.PadHexValue(5, prms[x]); } else { string varName = prms[x].Replace("Imm_", ""); if (varName.StartsWith("0x")) { paramObj.Immediate = DataCleaner.PadHexValue(12, Converter.ConvertDecToBin(Converter.ConvertHexToDec(varName.Replace("0x", "")))); } else { int index = dxSG.FindIndex(p => p.Name.Replace(":", "") == varName); if (index > -1) { paramObj.Immediate = DataCleaner.PadHexValue(12, Converter.ConvertDecToBin(Converter.ConvertHexToDec(dxSG[index].Addr.Replace("0x", "")))); } } } } } if (prms[prms.Length - 1].StartsWith("Imm_")) { string varName = prms[prms.Length - 1].Replace("Imm_", ""); int index = dxSG.FindIndex(p => p.Name.Replace(":", "") == varName); if (index > -1) { paramObj.Immediate = DataCleaner.PadHexValue(12, Converter.ConvertDecToBin(Converter.ConvertHexToDec(dxSG[index].Addr.Replace("0x", "")))); } else { if (varName.StartsWith("0x")) { paramObj.Immediate = DataCleaner.PadHexValue(12, Converter.ConvertDecToBin(Converter.ConvertHexToDec(varName.Replace("0x", "")))); } else { paramObj.Immediate = DataCleaner.PadHexValue(12, prms[prms.Length - 1]).Replace("Imm_", ""); } } } return(paramObj); }
private static List <DataSegment> SetAddress(List <DataSegment> dataSG) { int i = 0, x = 1; foreach (var ds in dataSG) { ds.Addr = "0x" + DataCleaner.PadHexValue(8, Converter.ConvertDecToHex(i.ToString())); int count = ds.StoredValue.Count; i = i + count; if (x < dataSG.Count) { int remainder = 0; if (ds.Type.ToLower() == ".byte") { if (dataSG[x].Type.ToLower() == ".half") { remainder = i % 2; for (int y = 0; y < remainder; y++) { ds.StoredValue.Add("0x00"); } } if (dataSG[x].Type.ToLower() == ".word") { remainder = i % 4; if (remainder != 0) { remainder = 4 - remainder; for (int y = 0; y < remainder; y++) { ds.StoredValue.Add("0x00"); } } } } if (ds.Type.ToLower() == ".half") { if (dataSG[x].Type.ToLower() == ".word") { remainder = i % 4; if (remainder != 0) { remainder = 4 - remainder; for (int y = 0; y < remainder; y++) { ds.StoredValue.Add("0x00"); } } } } i = i + remainder; } x++; } return(dataSG); }