Example #1
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);
        }
Example #2
0
        private void UpdateFanOutRegisters(DelayGraphVertex vertex, int incomingDelay, HashSet <DelayGraphVertex> faninRegisters, HashSet <DelayGraphVertex> fanoutRegisters)
        {
            // update fanin and fanout registers maps and delays now that vertex is NOT a register anymore
            if (fanoutRegisters == null)
            {
                return;
            }
            // update each downstream register vertex
            foreach (var fanoutReg in fanoutRegisters)
            {
                int fanoutDelay = GetRegisterToRegisterDelay(@from: vertex, to: fanoutReg);
                int totalDelay  = incomingDelay + fanoutDelay;
                // update reg's input delay to be max of total delay and original delay
                int origDelay;
                if (!InputDelayMap.TryGetValue(fanoutReg, out origDelay) ||
                    origDelay < totalDelay)
                {
                    InputDelayMap[fanoutReg] = totalDelay;
                }

                // remove vertex from fanout reg's fanin registers
                HashSet <DelayGraphVertex> origFaninRegs;
                if (FaninRegistersMap.TryGetValue(fanoutReg, out origFaninRegs))
                {
                    origFaninRegs.Remove(vertex);
                }

                // add vertex's fanin registers to reg's fanin registers
                if (faninRegisters != null)
                {
                    if (origFaninRegs == null)
                    {
                        origFaninRegs = new HashSet <DelayGraphVertex>(faninRegisters);
                        FaninRegistersMap[fanoutReg] = origFaninRegs;
                    }
                    else
                    {
                        foreach (var next in faninRegisters)
                        {
                            origFaninRegs.Add(next);
                        }
                    }
                    // update faninReg -> fanoutRegister with faninDelay + v->fanoutRegister delay
                    foreach (var faninReg in faninRegisters)
                    {
                        int faninDelay = GetRegisterToRegisterDelay(@from: faninReg, to: vertex);
                        UpdateRegisterRegisterDelay(@from: faninReg, to: fanoutReg, delay: faninDelay + fanoutDelay);
                    }
                }
            }
        }