public XILScheduleMonitor(XIL3Function func) { Func = func; _maxCStep = -1; _csteps = new int[func.Instructions.Length]; _ii = new int[func.Instructions.Length]; _lat = new int[func.Instructions.Length]; Instructions = PropMaps.CreateForArray(Func.Instructions, EAccess.ReadOnly); CStep = PropMaps.CreateForArray(_csteps, EAccess.ReadOnly); InitiationInterval = PropMaps.CreateForArray(_ii, EAccess.ReadOnly); Latency = PropMaps.CreateForArray(_lat, EAccess.ReadOnly); }
private void Init() { int numInstrs = _func.Instructions.Length; _predsBack = new ScheduleDependency <XIL3Instr> [numInstrs][]; _succsBack = new ScheduleDependency <XIL3Instr> [numInstrs][]; var tmp = new List <ScheduleDependency <XIL3Instr> > [numInstrs]; var rslot2instr = new Dictionary <int, XIL3Instr>(); foreach (XIL3Instr i in _func.Instructions) { foreach (int rslot in i.ResultSlots) { rslot2instr[rslot] = i; } var bb = _cfg.GetBasicBlockContaining(i.Index); _predsBack[i.Index] = i.Preds .Select(p => ToScheduleDependency(i, p)) .Concat(i.OperandSlots.Select(s => new ScheduleDependency <XIL3Instr>( rslot2instr[s], Latency[rslot2instr[s]], int.MaxValue))) .Distinct() .Where(_ => bb.Contains(_.Task)) // only admit predecessors from same basic block .ToArray(); tmp[i.Index] = new List <ScheduleDependency <XIL3Instr> >(); } foreach (XIL3Instr i in _func.Instructions) { foreach (var sdep in _predsBack[i.Index]) { tmp[sdep.Task.Index].Add(new ScheduleDependency <XIL3Instr>(i, sdep.MinDelay, sdep.MaxDelay)); } } foreach (XIL3Instr i in _func.Instructions) { _succsBack[i.Index] = tmp[i.Index].ToArray(); } _preds = PropMaps.CreateForArray <XIL3Instr, ScheduleDependency <XIL3Instr>[]>(_predsBack, i => i.Index, EAccess.ReadOnly); _succs = PropMaps.CreateForArray <XIL3Instr, ScheduleDependency <XIL3Instr>[]>(_succsBack, i => i.Index, EAccess.ReadOnly); }