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