public PortClause(List <PortInterfaceElement> portExpressions, List <RecordTypeDeclaration> Unpacked)
 {
     fExpressions   = portExpressions;
     fUnpackedList  = Unpacked;
     fClock         = new PortInterfaceElement(null, null, null, null, false);
     fReset         = new PortInterfaceElement(null, null, null, null, false);
     fInterfaceList = new List <ExtractedInterface> ();
     UnknownSignals = new List <PortInterfaceElement> ();
 }
示例#2
0
 public ExtractedInterface(string name, string InterfaceType, List <PortInterfaceElement> portExpressions, PortInterfaceElement dataSig, PortInterfaceElement ready, PortInterfaceElement metadata, PortInterfaceElement acknowledge, Boolean Array)
 {
     fExpressions   = portExpressions;
     fType          = InterfaceType;
     fName          = name;
     freq           = ready;
     fack           = acknowledge;
     fdata          = dataSig;
     fmetadata      = metadata;
     arrayInterface = Array;
 }
 public void ExtractClockReset()
 {
     foreach (PortInterfaceElement element in fExpressions)
     {
         if (element.Name.Contains("clock") || element.Name.Contains("clk"))
         {
             fClock = element;
         }
         if (element.Name.Contains("reset") || element.Name.Contains("rst"))
         {
             fReset = element;
         }
     }
 }
        public void ExtractInterfaces()
        {
            List <PortInterfaceElement> AllSignals = new List <PortInterfaceElement> ();

            AllSignals = fExpressions.ToList();
            ExtractClockReset();

            string[]      indentifiers  = null;
            List <string> interfaceName = new List <string> ();

            foreach (PortInterfaceElement element in fExpressions)
            {
                indentifiers = element.Name.Split('_');
                interfaceName.Add(String.Concat(indentifiers[0] + '_' + indentifiers[1]));
            }
            //In .NET framework 3.5 and above you can use Enumerable.GroupBy which returns an enumerable of enumerables of duplicate keys, and then filter out any of the enumerables that have a Count of <=1, then select their keys to get back down to a single enumerable:
            var duplicateKeys = interfaceName.GroupBy(x => x)
                                .Where(group => group.Count() > 3)
                                .Select(group => group.Key);

            //Check for Handshake interface
            foreach (string key in duplicateKeys)
            {
                List <PortInterfaceElement> groupedInterface = new List <PortInterfaceElement> ();
                PortInterfaceElement        data             = null;
                PortInterfaceElement        ready            = null;
                PortInterfaceElement        metadata         = null;
                PortInterfaceElement        acknowledge      = null;
                Boolean arrayInterface;
                foreach (PortInterfaceElement element in fExpressions)
                {
                    if (element.Name.Contains(key))
                    {
                        if (element.Name.Contains("rdy"))
                        {
                            ready = element;
                            ready.setRole("req");
                        }
                        else if (element.Name.Contains("info"))
                        {
                            metadata = element;
                            metadata.setRole("metadata");
                        }
                        else if (element.Name.Contains("ack"))
                        {
                            acknowledge = element;
                            acknowledge.setRole("ack");
                        }
                        else
                        {
                            data = element;
                            data.setRole("data");
                        }
                    }
                }
                if (data != null && ready != null && metadata != null && acknowledge != null)
                {
                    //Bundle all interface elements
                    if (data.isArray && ready.isArray && metadata.isArray && acknowledge.isArray)
                    {
                        arrayInterface = true;
                    }
                    else
                    {
                        arrayInterface = false;
                    }

                    groupedInterface.Add(data);
                    groupedInterface.Add(ready);
                    groupedInterface.Add(metadata);
                    groupedInterface.Add(acknowledge);
                    ExtractedInterface extractInter = new ExtractedInterface(key, "handshake", groupedInterface, data, ready, metadata, acknowledge, arrayInterface);
                    fInterfaceList.Add(extractInter);
                    //REMOVE ALL SIGNALS THAT ARE IN INTERFACES
                    AllSignals.RemoveAll(x => groupedInterface.Contains(x));
                }
            }

            AllSignals.Remove(fClock);
            AllSignals.Remove(fReset);
            UnknownSignals = AllSignals.ToList();
        }