void Awake() { if (_instance == null) { _instance = this; } else if (_instance != null) { Destroy(this.gameObject); } tempEnemies = FindObjectsOfType <Enemy>(); if (testing) { percentageChance1 = 0; percentageChance2 = 0; } else { percentageChance1 = 1 - percentageChance1; percentageChance2 = 1 - percentageChance2; } FilterEnemies(); }
public void TellMapping(XIL3Instr instr, long cstep, IXILMapping mapping) { foreach (int rslot in instr.ResultSlots) { if (!_interlinks.ContainsKey(rslot)) { _interlinks[rslot] = new Interlink(rslot); } } var sources = instr.OperandSlots.Select(os => _interlinks[os]).ToArray(); var sinks = instr.ResultSlots.Select(rs => _interlinks[rs]).ToArray(); var verbs = mapping.Realize(sources, sinks); long curStep = cstep; foreach (var verb in verbs) { var pflow = verb.ToCombFlow(); foreach (var flow in pflow.Flows) { var sflow = flow as SignalFlow; if (sflow == null) { continue; } if (sflow.Target.Desc.HasAttribute <int>()) { int index = sflow.Target.Desc.QueryAttribute <int>(); _interlinks[index].Driver = sflow.Source.Desc; _interlinks[index].DriveTime = curStep; } else if (sflow.Source.Desc.HasAttribute <int>()) { Dictionary <ISignalOrPortDescriptor, int> fanIn; if (!_fanIn.TryGetValue(sflow.Target.Desc, out fanIn)) { fanIn = new Dictionary <ISignalOrPortDescriptor, int>(); _fanIn[sflow.Target.Desc] = fanIn; } int index = sflow.Source.Desc.QueryAttribute <int>(); var driver = _interlinks[index].Driver; if (driver == null) { continue; } int slack = (int)(curStep - _interlinks[index].DriveTime); int prevSlack; if (!fanIn.TryGetValue(driver, out prevSlack) || prevSlack > slack) { fanIn[driver] = slack; } } } } object iclass = mapping.TASite.Host.GetType(); HashSet <object> fuSet; if (!_fuCount.TryGetValue(iclass, out fuSet)) { fuSet = new HashSet <object>(); _fuCount[iclass] = fuSet; } fuSet.Add(mapping.TASite); }
public EAllocationDecision SelectBestMapping(XIL3Instr instr, long cstep, IEnumerable <IXILMapping> mappings, out IXILMapping bestMapping) { foreach (int rslot in instr.ResultSlots) { _interlinks[rslot] = new Interlink(rslot); } bestMapping = null; double bestCost = double.MaxValue; foreach (var mapping in mappings) { var sources = instr.OperandSlots.Select(os => _interlinks[os]).ToArray(); var sinks = instr.ResultSlots.Select(rs => _interlinks[rs]).ToArray(); var verbs = mapping.Realize(sources, sinks); long curStep = cstep; double cost = 0.0; foreach (var verb in verbs) { var pflow = verb.ToCombFlow(); foreach (var flow in pflow.Flows) { var sflow = flow as SignalFlow; if (sflow == null) { continue; } if (sflow.Source.Desc.HasAttribute <int>() && !sflow.Target.Desc.HasAttribute <int>()) { int index = sflow.Source.Desc.QueryAttribute <int>(); var driver = _interlinks[index].Driver; if (driver == null) { continue; } var fanIn = _fanIn[sflow.Target.Desc]; foreach (int v in fanIn.Values) { cost += Math.Pow(2.0, -v); } int prevSlack; if (fanIn.TryGetValue(driver, out prevSlack)) { cost -= Math.Pow(2.0, -prevSlack); } int slack = (int)(curStep - _interlinks[index].DriveTime); cost += Math.Pow(2.0, -slack); } } curStep++; } cost /= instr.OperandSlots.Length; if (cost < bestCost) { bestCost = cost; bestMapping = mapping; } } object iclass = mappings.First().TASite.Host.GetType(); var fuSet = _fuCount[iclass]; int curCount = fuSet.Count; int limit; if (!FULimits.TryGetValue(iclass, out limit)) { limit = int.MaxValue; } if (curCount < limit && bestCost > MaxCost) { return(EAllocationDecision.AllocateNew); } else { return(EAllocationDecision.UseExisting); } }