Ejemplo n.º 1
0
        public override Input get_req(int pid_)
        {
            string currentline = "";

            while (true)
            {
                currentline = sr[pid_].ReadLine();
                if (currentline == null)
                {
                    Instruction res = new Instruction();
                    res.type = InstructionType.EOF;
                    return(res);
                }

                if (currentline.StartsWith("#") || currentline.StartsWith(";"))
                {
                    continue;
                }

                if (currentline.Contains(";"))
                {
                    currentline = currentline.Substring(0, currentline.IndexOf(";") + 1);
                }
                if (!currentline.Contains("PIM_") && !currentline.Contains("START") && !currentline.Contains("END"))
                {
                    return(parse_ins(currentline, pid_));
                }
                else
                {
                    if (currentline.Contains("PIM_") && currentline.Contains("_START"))
                    {
                        //reading block
                        int block_size          = 0;
                        InstructionBlock to_add = new InstructionBlock();
                        to_add.name = currentline.Replace("PIM_", "").Replace("_START", "");
                        while (true)
                        {
                            currentline = sr[pid_].ReadLine();
                            if (currentline == null)
                            {
                                return(new Instruction(InstructionType.EOF));
                            }
                            if (currentline.StartsWith("#") || currentline.StartsWith(";"))
                            {
                                continue;
                            }
                            if (currentline.Contains("PIM_") && currentline.Contains("END"))
                            {
                                return(to_add);
                            }
                            if (currentline.Contains(";"))
                            {
                                currentline = currentline.Substring(0, currentline.IndexOf(";") + 1);
                            }
                            to_add.add_ins(parse_ins(currentline, pid_));
                            block_size++;
                            if (block_size > PIMConfigs.max_pim_block)
                            {
                                //error
                                Environment.Exit(1);
                            }
                        }
                    }
                    else
                    {
                        if (currentline.Contains("FUNCTION_") && currentline.Contains("_START"))
                        {
                            Function func = new Function();
                            func.cycle = UInt64.Parse(currentline.Substring(0, currentline.IndexOf("|")));
                            func.name  = currentline.Split('_')[1];
                            while (true)
                            {
                                currentline = sr[pid_].ReadLine().Replace("\t", "").Replace(" ", "");
                                if (currentline == null)
                                {
                                    return(new Instruction(InstructionType.EOF));
                                }
                                if (currentline.StartsWith("#") || currentline.StartsWith(";"))
                                {
                                    continue;
                                }
                                if (currentline.Contains("FUNCTION_") && currentline.Contains("_END"))
                                {
                                    return(func);
                                }
                                if (currentline.Contains(";"))
                                {
                                    currentline = currentline.Substring(0, currentline.IndexOf(";") + 1);
                                }
                                currentline = currentline.Replace(" ", "");
                                string[] tp = currentline.Split('=');
                                if (tp[0].Equals("input"))
                                {
                                    func.input.Add(UInt64.Parse(tp[1].Replace("0x", ""), System.Globalization.NumberStyles.AllowHexSpecifier));
                                }
                                else
                                {
                                    if (tp[0].Equals("output"))
                                    {
                                        func.output.Add(UInt64.Parse(tp[1].Replace("0x", ""), System.Globalization.NumberStyles.AllowHexSpecifier));
                                    }
                                    else
                                    {
                                        if (tp[0].Equals("latency"))
                                        {
                                            func.latency = UInt64.Parse(tp[1].Replace("0x", ""));
                                        }
                                        else
                                        {
                                            ///?????
                                            ///
                                            Environment.Exit(1);
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            return(parse_ins(currentline, pid_));
                        }
                    }
                }
            }
        }