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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#5
0
        // 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);
        }
示例#6
0
        //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);
        }
示例#7
0
        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);
        }
示例#8
0
        // 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);
        }
示例#9
0
        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);
        }
示例#10
0
        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);
        }
示例#11
0
        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);
        }
示例#12
0
        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);
        }
示例#13
0
        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);
        }
示例#14
0
        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);
        }
示例#16
0
        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);
        }