void TimingHelper::PrintNetPinsDetails(HNet net, BufferInfo& binf) { WRITELINE("Net: %s", hd.GetString<HNet::Name>(net).c_str()); AdaptiveRoute(hd, net); CalculateNetDelays<LayersModel_Lumped, SignalModel_Universal>(hd, net); NetInfo ni = NetInfo::Create(hd, net, binf); if (ni.Rd() == 0.0) { WRITELINE("DriverResistance: %.10f", binf.Rb()); WRITELINE("BufferDelay : %.10f", binf.Tb()); } else { WRITELINE("DriverResistance: %.10f", ni.Rd()); } WRITELINE("CellName PinName X Y ObservedC PathDelay"); for(HNet::PinsEnumeratorW pin = hd.Get<HNet::Pins, HNet::PinsEnumeratorW>(net); pin.MoveNext(); ) { HSteinerPointWrapper st = hd[hd.SteinerPoints[pin]]; WRITELINE("%s %s %10.2f %10.2f %12.10f %12.10f", hd.GetString<HCell::Name>(pin.Cell()).c_str(), pin.Name().c_str(), pin.X(), pin.Y(), st.ObservedC(), st.PathDelay()); } }
double GetNetMaxDelay(HDesign& hd, HNet net, HNet originalNet, BufferInfo& binf) { double maxDelay = 0.0; AdaptiveRoute(hd, net); CalculateNetDelays<LayersModel_Lumped, SignalModel_Universal>(hd, net); for(HNet::SinksEnumeratorW sink = hd.Get<HNet::Sinks, HNet::SinksEnumeratorW>(net); sink.MoveNext(); ) { double delay = hd.GetDouble<HSteinerPoint::PathDelay>(hd.SteinerPoints[sink]); if (sink.OriginalNet() != originalNet) { for (HCell::PinsEnumeratorW pin = hd.Get<HCell::Pins, HCell::PinsEnumeratorW>(sink.Cell()); pin.MoveNext(); ) if (!IsNull(pin.Net()) && pin.Direction() == PinDirection_OUTPUT) { double d = GetNetMaxDelay(hd, pin.Net(), originalNet, binf); double observedC = hd.GetDouble<HSteinerPoint::ObservedC>(hd.SteinerPoints[pin]); delay += binf.Tb() + binf.Rb() * observedC + d; break; } } if (delay > maxDelay) maxDelay = delay; } return maxDelay; }
void BufferingAndReport(HDesign& design) { { ConfigContext ctx(design.cfg.OpenContext("Buffering")); BufferInfo buf = BufferInfo::Create(design); //VanGinneken vg(design); WRITELINE("Buffering Parameters:"); WRITELINE("Rb: %.20f kOhm", buf.Rb()); WRITELINE("Cb: %.20f pF", buf.Cb()); WRITELINE("Tb: %.20f ns", buf.Tb()); WRITELINE("r: %.20f kOhm/nm", design.RoutingLayers.Physics.RPerDist); WRITELINE("c: %.20f pf/nm", design.RoutingLayers.Physics.LinearC); WRITELINE("Lbuf: %.20f", buf.Lbuf()); WRITELINE("Dbuf: %.20f", buf.Dbuf()); int buffers = 0; int vgbuffers = 0; string h1 = "fanout ", b1 = "%6d "; string h2 = "vgbufs ", b2 = "%6d "; string h3 = "kopt ", b3 = "%4d "; string h4 = "koptd ", b4 = "%5.3f "; string h5 = " knaked ", b5 = "%9.5f "; string h6 = " T(kopt) ", b6 = "%10.8f "; string h7 = " T(koptd) ", b7 = "%10.8f "; string hh = " vgSlack ", bb = "%10.8f "; string h8 = " T(0) ", b8 = "%10.8f "; string h9 = " maxSlack ", b9 = "%10.8f "; string f1 = " HPWL ", c1 = "%10.2f "; string f2 = " WL ", c2 = "%10.2f "; string f3 = " Rd ", c3 = "%10.8f "; string f4 = " Cs ", c4 = "%10.8f "; string f5 = "OO ", c5 = "%2d "; string f6 = "OM ", c6 = "%2d "; string f7 = "OE ", c7 = "%2d "; string ff = " Name", cc = "%10s"; string header = h1 + h2 + h3 + h4 + h5 + h6 + h7 + h8 + hh + h9 + f1 + f2 + f3 + f4 + f5 + f6 + f7 + ff; string bodyer = b1 + b2 + b3 + b4 + b5 + b6 + b7 + b8 + bb + b9 + c1 + c2 + c4 + c4 + c5 + c6 + c7 + cc; WRITELINE(header.c_str()); for(HNets::ActiveNetsEnumeratorW net = design.Nets.GetActiveNetsEnumeratorW(); net.MoveNext(); ) { NetInfo n = NetInfo::Create(design, net, buf); buffers += n.KoptInt(); //vg.__DriverResistance = n.Rd(); int vgbufs = 0;//vg.InsertBuffers(net); vgbuffers += vgbufs; double bufferedDelay = TimingHelper(design).GetBufferedNetMaxDelay(net, n, buf); WRITELINE(bodyer.c_str() , n.Fanout() //h1 , vgbufs //h2 , n.KoptInt() //h3 , n.Kopt() //h4 , n.KoptNaked() //h5 , n.KoptDelay() //h6 , n.OptimalDelay() //h7 , n.OttenDelay() //h8 , bufferedDelay //hh , n.MaxRealDelay() //h9 , n.HPWL() //f1 , n.WL() //f2 , n.Rd() //f3 , n.Cs() //f4 , n.IsOttenApplicable() //f5 , n.IsModifiedOttenApplicable() //f6 , n.IsOttenApplicableExact() //f7 , n.Name().c_str() //ff ); //if ((n.IsOttenApplicable() || n.IsModifiedOttenApplicable())) //{ //WRITELINE("%3d %3d %.5f %.5f %.5f %.5f %.5f %.5f %d %.5f %d", //n.Fanout(), n.KoptInt(), n.Kopt(), //n.KoptDelay(), n.OptimalDelay(), n.OttenDelay(), n.MaxRealDelay(), n.L(), n.IsOttenApplicable(), n.X2opt(), nets); //} } WRITELINE("Inserted %d buffers", buffers); WRITELINE("VanGinneken Inserted %d buffers", vgbuffers); } }
void NetInfo::SetNetInfoComputedFields(BufferInfo& buf, NetInfo& n, double r, double c) { n.m_Lnet = n.Rd() / r + n.Cs() / c; n.m_Dnet = sqrt(2.0 * n.Rd() * n.Cs() / r / c); n.m_Lext = n.L() + n.Lnet() - buf.Lbuf(); n.m_KoptNaked = n.Lext()/buf.Dbuf() - 1.0; n.m_X2opt = 0.5 * n.Lext() + (buf.Rb() - n.Rd()) / r; double discr = n.Lext() * n.Lext() - 2.0 * buf.Dbuf()*buf.Dbuf(); if (discr < 0) { n.m_Xmax = n.m_Xmin = 0.0; n.m_IsOttenApplicable = false; n.m_IsModifiedOttenApplicable = false; } else { // if (n.X2opt() >= 0 && n.X2opt() <= n.L()) //n.m_X2opt = n.X2opt(); double discr2 = sqrt(discr) * 0.5; n.m_Xmin = n.X2opt() - discr2; n.m_Xmax = n.X2opt() + discr2; if(n.X2opt() < 0 && n.Xmax() < 0 || n.X2opt() > n.L() && n.Xmin() > n.L()) { n.m_IsModifiedOttenApplicable = false; n.m_IsOttenApplicable = false; } else { if (n.X2opt() >= 0 && n.X2opt() <= n.L()) { n.m_IsOttenApplicable = true; n.m_IsModifiedOttenApplicable = false; } else { n.m_IsOttenApplicable = false; n.m_IsModifiedOttenApplicable = true; } } } { double k = (int)n.KoptNaked(); n.m_IsOttenApplicableExact = (n.Lext() >= 0.0) && (n.Lext() / (k + 1) + (buf.Rb() - n.Rd()) / r >= 0) && (n.Lext() / (k + 2) + (buf.Rb() - n.Rd()) / r >= 0) && (n.Lext() / (k + 1) + (buf.Cb() - n.Cs()) / c >= 0) && (n.Lext() / (k + 2) + (buf.Cb() - n.Cs()) / c >= 0); } n.m_OttenDelay = fnOttenDelay(0, r, c, buf.Lbuf(), n.Lnet(), n.Lext(), buf.Dbuf(), n.Dnet()); //n.m_OttenDelay = //n.Rd() * (n.Cs() + n.L() * c) + //c * 0.5* //n.L()// * (n.Cs() + n.L() * c * 0.5) //; if (n.IsOttenApplicable() || n.IsModifiedOttenApplicable()) { if (n.IsOttenApplicable()) { n.m_Kopt = n.KoptNaked(); n.m_KoptInt = (int)n.KoptNaked(); if (isOneMoreBetter(n.KoptInt(), n.Lext(), buf.Dbuf())) n.m_KoptInt++; n.m_KoptDelay = fnOttenDelay(n.KoptInt(), r, c, buf.Lbuf(), n.Lnet(), n.Lext(), buf.Dbuf(), n.Dnet()); n.m_OptimalDelay = fnOttenDelay(n.Kopt(), r, c, buf.Lbuf(), n.Lnet(), n.Lext(), buf.Dbuf(), n.Dnet()); } else if (n.X2opt() < 0) { NetInfo nf; nf.m_Rd = buf.Rb();//n.Rd(); nf.m_Cs = n.Cs(); nf.m_HPWL = n.HPWL(); nf.m_WL = n.WL(); SetNetInfoComputedFields(buf, nf, r, c); n.m_Kopt = 1.0 + nf.Kopt(); n.m_KoptInt = 1 + nf.KoptInt(); n.m_KoptDelay = n.Rd() * buf.Cb() + buf.Tb() + nf.KoptDelay(); n.m_OptimalDelay = n.Rd() * buf.Cb() + buf.Tb() + nf.OptimalDelay(); } else if (n.X2opt() > n.L()) { NetInfo nf; nf.m_Rd = n.Rd(); nf.m_Cs = buf.Cb();//n.Cs(); nf.m_HPWL = n.HPWL(); nf.m_WL = n.WL(); SetNetInfoComputedFields(buf, nf, r, c); n.m_Kopt = 1.0 + nf.Kopt(); n.m_KoptInt = 1 + nf.KoptInt(); n.m_KoptDelay = n.Cs() * buf.Rb() + buf.Tb() + nf.KoptDelay(); n.m_OptimalDelay = n.Cs() * buf.Rb() + buf.Tb() + nf.OptimalDelay(); } } else //if (discr < 0 || n.Xmax() < 0 || n.Xmin() > n.L()) { n.m_Kopt = 0.0; n.m_KoptInt = 0; n.m_KoptDelay = n.OttenDelay(); n.m_OptimalDelay = n.OttenDelay(); } }