Exemplo n.º 1
0
        private void DeleteRegisterToRegisterDelay(DelayGraphVertex from, DelayGraphVertex to)
        {
            var key = Tuple.Create(from, to);

            if (!RegisterToRegisterDelays.Remove(key))
            {
                throw new Exception("this should not happen");
            }
        }
Exemplo n.º 2
0
        private bool IsSafeToDeRegister(DelayGraphVertex vertex)
        {
            if (vertex.IsRegistered)
            {
                return(false);
            }
            // get incoming delay
            int incomingDelay;

            if (!InputDelayMap.TryGetValue(vertex, out incomingDelay))
            {
                incomingDelay = 0;
            }
            // get outgoing delay
            int outgoingDelay;

            if (!OutputDelayMap.TryGetValue(vertex, out outgoingDelay))
            {
                outgoingDelay = 0;
            }
            int totalDelay = incomingDelay + outgoingDelay;

            if (totalDelay > TargetPeriod)
            {
                return(false);
            }
            // double check for cycles if vertex register is removed
            HashSet <DelayGraphVertex> faninRegisters;

            if (FaninRegistersMap.TryGetValue(vertex, out faninRegisters))
            {
                if (faninRegisters.Contains(vertex))
                {
                    return(false);   // vertex is its own fanin register - cannot remove register or there would be a cycle
                }
            }

            HashSet <DelayGraphVertex> fanoutRegisters;

            if (FanoutRegistersMap.TryGetValue(vertex, out fanoutRegisters))
            {
                if (fanoutRegisters.Contains(vertex))
                {
                    return(false);   // vertex is its own fanout register - cannot remove register or there would be a cycle
                }
            }

            UpdateFanInRegisters(vertex, outgoingDelay, faninRegisters, fanoutRegisters);

            UpdateFanOutRegisters(vertex, incomingDelay, faninRegisters, fanoutRegisters);

            CleanFromRegisterToRegisterMap(vertex, faninRegisters, fanoutRegisters);

            return(true);
        }
Exemplo n.º 3
0
        private int GetRegisterToRegisterDelay(DelayGraphVertex from, DelayGraphVertex to)
        {
            var key = Tuple.Create(from, to);
            int delay;

            if (!RegisterToRegisterDelays.TryGetValue(key, out delay))
            {
                throw new Exception("This is not supposed to ever happen");
            }
            return(delay);
        }
Exemplo n.º 4
0
        private void UpdateRegisterRegisterDelay(DelayGraphVertex from, DelayGraphVertex to, int delay)
        {
            var key = Tuple.Create(from, to);
            int origDelay;

            if (!RegisterToRegisterDelays.TryGetValue(key, out origDelay) ||
                origDelay < delay)
            {
                RegisterToRegisterDelays[key] = delay;
            }
        }
Exemplo n.º 5
0
        private void UpdateFanInRegisters(DelayGraphVertex vertex, int outgoingDelay, HashSet <DelayGraphVertex> faninRegisters, HashSet <DelayGraphVertex> fanoutRegisters)
        {
            // update fanin and fanout registers maps and delays now that vertex is NOT a register anymore
            if (faninRegisters == null)
            {
                return;
            }
            // update each upstream register vertex
            foreach (var faninReg in faninRegisters)
            {
                int faninDelay = GetRegisterToRegisterDelay(@from: faninReg, to: vertex);
                int totalDelay = faninDelay + outgoingDelay;

                // update faninReg's output delay to be max of total delay and original delay
                int origDelay;
                if (!OutputDelayMap.TryGetValue(faninReg, out origDelay) ||
                    origDelay < totalDelay)
                {
                    OutputDelayMap[faninReg] = totalDelay;
                }

                // remove vertex from reg's fanout registers
                HashSet <DelayGraphVertex> origFanoutRegs;
                if (FanoutRegistersMap.TryGetValue(faninReg, out origFanoutRegs))
                {
                    origFanoutRegs.Remove(vertex);
                }

                // add vertex's fanout registers to reg's fanout registers
                if (fanoutRegisters != null)
                {
                    if (origFanoutRegs == null)
                    {
                        origFanoutRegs = new HashSet <DelayGraphVertex>(fanoutRegisters);
                        FanoutRegistersMap[faninReg] = origFanoutRegs;
                    }
                    else
                    {
                        foreach (var next in fanoutRegisters)
                        {
                            origFanoutRegs.Add(next);
                        }
                    }

                    // update faninReg -> fanoutRegister with faninDelay + v->fanoutRegister delay
                    foreach (var fanoutReg in fanoutRegisters)
                    {
                        int fanoutDelay = GetRegisterToRegisterDelay(@from: vertex, to: fanoutReg);
                        UpdateRegisterRegisterDelay(@from: faninReg, to: fanoutReg, delay: faninDelay + fanoutDelay);
                    }
                }
            }
        }
Exemplo n.º 6
0
 /// <summary>
 /// clean up data structures when vertex is no longer a register
 /// </summary>
 /// <param name="vertex"></param>
 /// <param name="faninRegisters"></param>
 /// <param name="fanoutRegisters"></param>
 private void CleanFromRegisterToRegisterMap(DelayGraphVertex vertex, HashSet <DelayGraphVertex> faninRegisters, HashSet <DelayGraphVertex> fanoutRegisters)
 {
     if (faninRegisters != null)
     {
         foreach (var faninReg in faninRegisters)
         {
             DeleteRegisterToRegisterDelay(@from: faninReg, to: vertex);
         }
     }
     if (fanoutRegisters != null)
     {
         foreach (var fanoutReg in fanoutRegisters)
         {
             DeleteRegisterToRegisterDelay(@from: vertex, to: fanoutReg);
         }
     }
     FaninRegistersMap.Remove(vertex);
     FanoutRegistersMap.Remove(vertex);
 }