Esempio n. 1
0
        private bool ResourceMatch(ResourceRequirements resourceRequirements, string resourceString, int height)
        {
            Dictionary <IdentifierManager.RegexTypes, int> resources = GetResourceInArea(resourceString, height);

            foreach (IdentifierManager.RegexTypes resourceType in m_resStringInfo.GetResourceTypes())
            {
                // there is no such resource
                if (!resources.ContainsKey(resourceType) && resourceRequirements.GetResourceRequirement(resourceType) > 0)
                {
                    return(false);
                }
                // there are too less of them
                else if (resources[resourceType] < resourceRequirements.GetResourceRequirement(resourceType))
                {
                    return(false);
                }
            }

            // prepare bins
            Dictionary <IdentifierManager.RegexTypes, Dictionary <int, int> > bins = new Dictionary <IdentifierManager.RegexTypes, Dictionary <int, int> >();

            foreach (IdentifierManager.RegexTypes resourceType in m_resStringInfo.GetResourceTypes())
            {
                if (!bins.ContainsKey(resourceType))
                {
                    bins.Add(resourceType, new Dictionary <int, int>());
                }
                bins[resourceType] = GetBins(resourceType, resourceString, height);
            }


            // every chain (except CLBs) has to fit into resources (first fit)
            foreach (IdentifierManager.RegexTypes resourceType in m_resStringInfo.GetResourceTypes().Where(rt => rt != IdentifierManager.RegexTypes.CLB))
            {
                // copy!
                Dictionary <int, int> bin = new Dictionary <int, int>(bins[resourceType]);

                for (int i = 0; i < resourceRequirements.Chains[resourceType].Count; i++)
                {
                    bool binFound = false;
                    for (int b = 0; b < bin.Count; b++)
                    {
                        if (bin[b] - resourceRequirements.Chains[resourceType][i] >= 0)
                        {
                            bin[b]  -= resourceRequirements.Chains[resourceType][i];
                            binFound = true;
                            break;
                        }
                    }
                    if (!binFound)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
Esempio n. 2
0
        private Fragmentation GetFragmentation(SelectionInfo selInfo, int height, ResourceRequirements resourceRequirements)
        {
            Dictionary <IdentifierManager.RegexTypes, int> resources = GetResourceInArea(selInfo.ResourceString, height);

            Fragmentation result = new Fragmentation();

            foreach (IdentifierManager.RegexTypes resourceType in m_resStringInfo.GetResourceTypes())
            {
                result.ResourceTypeFragmentation[resourceType] = resources[resourceType] - resourceRequirements.GetResourceRequirement(resourceType);
            }

            return(result);
        }
Esempio n. 3
0
        private ResourceRequirements GetResourceRequirements()
        {
            // get component wise maximum from files
            PrintComponentWiseMaximalResourceConsumption printCmd = new PrintComponentWiseMaximalResourceConsumption();

            printCmd.Files = XDLModules;
            CommandExecuter.Instance.Execute(printCmd);
            string output = printCmd.OutputManager.GetOutput();

            string[] atoms = output.Split(' ');

            int clbs = int.Parse(atoms[1]);
            int dsp  = int.Parse(atoms[3]);
            int bram = int.Parse(atoms[5]);

            // TODO detect chains

            // store result
            ResourceRequirements unionRequirements = new ResourceRequirements();

            foreach (IdentifierManager.RegexTypes resourceType in m_resStringInfo.GetResourceTypes())
            {
                unionRequirements.Chains.Add(resourceType, new List <int>());
            }
            unionRequirements.Chains[IdentifierManager.RegexTypes.CLB].Add(clbs);
            unionRequirements.Chains[IdentifierManager.RegexTypes.DSP].Add(dsp);
            unionRequirements.Chains[IdentifierManager.RegexTypes.BRAM].Add(bram);

            /*
             * Random rnd = new Random();
             * ResourceRequirements unionRequirements = new ResourceRequirements();
             * unionRequirements.Name = "union";
             * foreach (IdentifierManager.RegexTypes resourceType in this.m_resStringInfo.GetResourceTypes())
             * {
             *  unionRequirements.Chains.Add(resourceType, new List<int>());
             *  // max four chains of max lenght 3 each
             *  int numberOfChains = rnd.Next(1,3);
             *  for(int c=0;c<numberOfChains;c++)
             *  {
             *      unionRequirements.Chains[resourceType].Add(rnd.Next(1,4));
             *  }
             * }
             * unionRequirements.Chains[IdentifierManager.RegexTypes.CLBRegex].Clear();
             * unionRequirements.Chains[IdentifierManager.RegexTypes.CLBRegex].Add(rnd.Next(30));
             * unionRequirements.XCenter = rnd.NextDouble() * (double)FPGA.FPGA.Instance.MaxX;
             * unionRequirements.YCenter = rnd.NextDouble() * (double)FPGA.FPGA.Instance.MaxY;
             */
            return(unionRequirements);
        }
Esempio n. 4
0
        protected override void DoCommandAction()
        {
            // get resource requirments from module
            ResourceRequirements resourceRequirements = GetResourceRequirements();

            // select a whole line and check wether we found all resource types at least one
            int sweepLineY = FindSweepLine();

            m_resStringInfo = new ResourceStringInfo();
            m_resStringInfo.InitResourceStrings(sweepLineY);

            List <AreaCandidate> candidates = new List <AreaCandidate>();

            for (int h = 1; h < Height; h++)
            {
                foreach (KeyValuePair <string, SelectionInfo> tupel in m_resStringInfo.EvaluatedResourceStrings)
                {
                    if (ResourceMatch(resourceRequirements, tupel.Key, h))
                    {
                        AreaCandidate candidate = new AreaCandidate();
                        candidate.SelectionInfo     = tupel.Value;
                        candidate.FragmentationInfo = GetFragmentation(tupel.Value, h, resourceRequirements);
                        candidate.Height            = h;
                        // weiter: Center of mass ausrechnen
                        //

                        candidates.Add(candidate);
                    }
                }
            }

            if (candidates.Count == 0)
            {
                throw new ArgumentException("No selection found");
            }

            int topN = 1;

            foreach (AreaCandidate result in candidates.OrderBy(c => c.FragmentationInfo.TotalFragmentation))
            {
                OutputManager.WriteOutput(result.ToString());
                if (topN > TopN)
                {
                    break;
                }
            }
        }