Ejemplo n.º 1
0
void SODData::Initialize(HDesign& hd)
{
  BufferInfo bi = BufferInfo::Create(hd);
  Lbuf = bi.Lbuf();
  Dbuf = bi.Dbuf();
  DbufLbufDifferenceOfSquares = Dbuf*Dbuf - Lbuf*Lbuf;

  gradientBalance = hd.cfg.ValueOf(".TAOOptions.gradientBalance", 1.0);

  InitializeNets(hd);
}
Ejemplo n.º 2
0
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);
    }
}
Ejemplo n.º 3
0
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();
  }
}