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); }
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); }
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); }
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; } } }