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