protected override void DoCommandAction()
        {
            string bufferFileName = XDLInFile.Equals(XDLOutFile) ? Path.GetTempFileName() : XDLOutFile;

            TextWriter resultingBlocker = new StreamWriter(bufferFileName, false);

            StreamReader xdlInFile   = new StreamReader(XDLInFile);
            string       currentLine = "";
            string       lastLine1   = "";
            string       lastLine2   = "";

            while ((currentLine = xdlInFile.ReadLine()) != null)
            {
                // filter out dummy clock nets
                if (BUFGInstanceName.Equals("NULL"))
                {
                    resultingBlocker.WriteLine(currentLine);
                }
                else
                {
                    // cut out clock nets
                    if (Regex.IsMatch(currentLine, "dummy_GOA_net.*CLK"))
                    {
                    }
                    else
                    {
                        resultingBlocker.WriteLine(currentLine);
                    }
                }

                // search for outpin "BUFG_Instance_name" O, might be spread over multiple lines
                // net "Inst_system/sys_clk_s" ,
                // outpin "Inst_system/clock_generator_0/clock_generator_0/Using_DCM0.DCM0_INST/Using_BUFG_for_CLKDV.CLKDV_BUFG_INST"
                // O ,

                lastLine1 = lastLine2;
                lastLine2 = currentLine;

                // remove line feed
                lastLine2 = Regex.Replace(lastLine2, "\n", "");

                // scan last four line for a match
                string multiLine    = lastLine1 + lastLine2;
                bool   multiLineHit = Regex.IsMatch(multiLine, "outpin.*" + BUFGInstanceName + ".*O");

                // scan the current line for a match
                bool singleLineHit = Regex.IsMatch(currentLine, "outpin.*" + BUFGInstanceName + ".*O");

                if (multiLineHit || singleLineHit)
                {
                    multiLine = "";
                    lastLine1 = "";
                    lastLine2 = "";

                    foreach (string blockerFileName in XDLBlockerFiles)
                    {
                        StreamReader blockerFile = new StreamReader(blockerFileName);

                        string currentBlockerLine = "";
                        while ((currentBlockerLine = blockerFile.ReadLine()) != null)
                        {
                            if (Regex.IsMatch(currentBlockerLine, "inpin.*CLK"))
                            {
                                // convert
                                // net "dummy_ModuleBlocker_clock0<302>",	inpin "SLICE_X82Y126" CLK,;
                                // net "dummy_GOA_netMACCSITE2_X18Y24CLK",                inpin "MACCSITE2_X18Y24" CLK,;
                                // to
                                // inpin "SLICE_X82Y126" CLK,
                                string[] atoms = Regex.Split(currentBlockerLine, ",");// ($net, $inpin) = split(/,/, $_ ,2);
                                string   net   = atoms[0];
                                string   inpin = atoms[1] + ",";

                                // # cut last ';'
                                inpin = Regex.Replace(inpin, ";", ""); // $inpin =~ tr/;/ /;
                                resultingBlocker.WriteLine(inpin);
                            }
                        }

                        blockerFile.Close();
                    }
                }
            }

            // add blocker xdl code without header, footer and without dummy clock nets (keep instance and net "...BlockSelection" net)
            foreach (string blockerFileName in XDLBlockerFiles)
            {
                StreamReader blockerFile = new StreamReader(blockerFileName);

                string currentBlockerLine = "";
                while ((currentBlockerLine = blockerFile.ReadLine()) != null)
                {
                    if (Regex.IsMatch(currentBlockerLine, "(design )|(module )|(endmodule)"))
                    {
                        continue;
                    }

                    if (!BUFGInstanceName.Equals("NULL") && Regex.IsMatch(currentBlockerLine, "(dummy_goa_net.*clock)|(dummy_GOA_net.*CLK)"))
                    {
                        continue;
                    }

                    resultingBlocker.WriteLine(currentBlockerLine);
                }

                blockerFile.Close();
            }

            xdlInFile.Close();
            resultingBlocker.Close();

            // overwrite XDLOutfile with temp file and delete temp file
            if (XDLInFile.Equals(XDLOutFile))
            {
                File.Copy(bufferFileName, XDLOutFile, true);
                File.Copy(bufferFileName, XDLOutFile + "before_sort", true);
                File.Delete(bufferFileName);
            }

            SimpleSortDesignFast simpleSortCmd = new SimpleSortDesignFast();

            simpleSortCmd.XDLInFile  = XDLOutFile;
            simpleSortCmd.XDLOutFile = XDLOutFile;

            CommandExecuter.Instance.Execute(simpleSortCmd);
        }
        protected override void DoCommandAction()
        {
            StreamReader  reader           = new StreamReader(XDLInFile);
            string        line             = "";
            bool          update           = false;
            bool          outbufFound      = false;
            List <string> unmodifiedBuffer = new List <string>();
            List <string> modifiedBuffer   = new List <string>();

            string bufferFileName = "";

            if (XDLInFile.Equals(XDLOutFile))
            {
                bufferFileName = Path.GetTempFileName();
            }
            else
            {
                bufferFileName = XDLOutFile;
            }
            TextWriter result = new StreamWriter(bufferFileName, false);

            while ((line = reader.ReadLine()) != null)
            {
                if (Regex.IsMatch(line, "^inst.*IOB"))
                {
                    update      = true;
                    outbufFound = false;
                    unmodifiedBuffer.Add(line);
                    modifiedBuffer.Add(line);
                }
                else if (Regex.IsMatch(line, ";"))
                {
                    update = false;
                    unmodifiedBuffer.Add(line);
                    modifiedBuffer.Add(line);
                    if (!outbufFound)
                    {
                        for (int i = 0; i < modifiedBuffer.Count; i++)
                        {
                            result.WriteLine(modifiedBuffer[i]);
                        }
                    }
                    else
                    {
                        for (int i = 0; i < unmodifiedBuffer.Count; i++)
                        {
                            result.WriteLine(unmodifiedBuffer[i]);
                        }
                    }
                    unmodifiedBuffer.Clear();
                    modifiedBuffer.Clear();
                }
                else if (update)
                {
                    unmodifiedBuffer.Add(line);

                    if (Regex.IsMatch(line, "OUTBUF:"))
                    {
                        outbufFound = true;
                    }
                    if (Regex.IsMatch(line, "PRE_EMPHASIS::#OFF"))
                    {
                        line = Regex.Replace(line, "PRE_EMPHASIS::#OFF", "");
                    }
                    modifiedBuffer.Add(line);
                }
                else
                {
                    result.WriteLine(line);
                }
            }
            reader.Close();
            result.Close();

            // overwrite XDLOutfile with temp file and delete temp file
            if (XDLInFile.Equals(XDLOutFile))
            {
                File.Copy(bufferFileName, XDLOutFile, true);
                File.Delete(bufferFileName);
            }
        }
예제 #3
0
        protected override void DoCommandAction()
        {
            string bufferFileName     = "";
            string instBufferFileName = Path.GetTempFileName();
            string netBufferFileName  = Path.GetTempFileName();

            if (XDLInFile.Equals(XDLOutFile))
            {
                bufferFileName = Path.GetTempFileName();
            }
            else
            {
                bufferFileName = XDLOutFile;
            }

            TextWriter   result     = new StreamWriter(bufferFileName, false);
            TextWriter   instBuffer = new StreamWriter(instBufferFileName, false);
            TextWriter   netBuffer  = new StreamWriter(netBufferFileName, false);
            StreamReader inFile     = new StreamReader(XDLInFile);

            bool scanForKeyWord = true;
            bool readDesign     = false;
            bool readModule     = false;
            bool readInst       = false;
            bool readNet        = false;
            bool readConfig     = false;

            StringBuilder blockBuffer   = new StringBuilder();
            string        keyWordBuffer = "";

            foreach (string c in Read(inFile))
            {
                blockBuffer.Append(c);

                if (scanForKeyWord)
                {
                    keyWordBuffer += c;
                    if (Regex.IsMatch(keyWordBuffer, @"^\s*design"))
                    {
                        readDesign     = true;
                        scanForKeyWord = false;
                    }
                    else if (Regex.IsMatch(keyWordBuffer, @"^\s*module"))
                    {
                        readModule     = true;
                        scanForKeyWord = false;
                    }
                    else if (Regex.IsMatch(keyWordBuffer, @"^\s*inst"))
                    {
                        readInst       = true;
                        scanForKeyWord = false;
                    }
                    else if (Regex.IsMatch(keyWordBuffer, @"^\s*net"))
                    {
                        readNet        = true;
                        scanForKeyWord = false;
                    }
                    else if (Regex.IsMatch(keyWordBuffer, @"^\s*cfg"))
                    {
                        readConfig     = true;
                        scanForKeyWord = false;
                    }
                }

                if (readDesign)
                {
                    if (c.Equals(";"))
                    {
                        result.Write(blockBuffer.ToString());
                        readDesign = false;
                        blockBuffer.Clear();
                        scanForKeyWord = true;
                        keyWordBuffer  = "";
                    }
                }
                else if (readModule)
                {
                    if (Regex.IsMatch(blockBuffer.ToString(), "endmodule.*;"))
                    {
                        result.Write(blockBuffer.ToString());
                        readModule = false;
                        blockBuffer.Clear();
                        scanForKeyWord = true;
                        keyWordBuffer  = "";
                    }
                }
                else if (readInst)
                {
                    if (c.Equals(";"))
                    {
                        instBuffer.Write(blockBuffer.ToString());
                        readInst = false;
                        blockBuffer.Clear();
                        scanForKeyWord = true;
                        keyWordBuffer  = "";
                    }
                }
                else if (readNet)
                {
                    if (c.Equals(";"))
                    {
                        netBuffer.Write(blockBuffer.ToString());
                        readNet = false;
                        blockBuffer.Clear();
                        scanForKeyWord = true;
                        keyWordBuffer  = "";
                    }
                }
                else if (readConfig)
                {
                    if (c.Equals(";"))
                    {
                        readConfig = false;
                        blockBuffer.Clear();
                        scanForKeyWord = true;
                        keyWordBuffer  = "";
                    }
                }
            }

            instBuffer.Close();
            netBuffer.Close();
            inFile.Close();

            // append inst and net buffer to result
            TextReader rd     = new StreamReader(instBufferFileName);
            string     buffer = "";

            while ((buffer = rd.ReadLine()) != null)
            {
                result.WriteLine(buffer);
            }
            rd.Close();
            rd     = new StreamReader(netBufferFileName);
            buffer = "";
            while ((buffer = rd.ReadLine()) != null)
            {
                result.WriteLine(buffer);
            }
            rd.Close();

            result.Close();

            // overwrite XDLOutfile with temp file and delete temp file
            if (XDLInFile.Equals(XDLOutFile))
            {
                File.Copy(bufferFileName, XDLOutFile, true);
                File.Delete(bufferFileName);
            }
        }