Ejemplo n.º 1
0
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());
  }
}
Ejemplo n.º 2
0
void Bb10Ui::onChannelListTriggered(const QVariantList index)
{
    // Headers are not clickable
    if (index.length() < 2)
        return;
    QModelIndex modelIndex = qobject_cast<DataModelAdapter*>(m_channelListView->dataModel())->getQModelIndex(index);
    BufferInfo bufferInfo = modelIndex.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
    BufferId id = bufferInfo.bufferId();
    if (!id.isValid())
        return;

    QString bufferName = bufferInfo.bufferName();
    
    qDebug() << "xxxxx Bb10Ui::onChannelListTriggered bufferInfo = " << bufferInfo << " index = " << index << " modelIndex = " << modelIndex;
    ChatView *view = qobject_cast<ChatView *>(m_chatViews.value(id));
    if (!view) {
        view = new ChatView(id, bufferName);
        m_chatViews[id] = view;
    }
    m_currentBufferId = id;
    Client::bufferModel()->switchToBuffer(id);
    Client::networkModel()->clearBufferActivity(id);
    Client::setBufferLastSeenMsg(id, view->getLastMsgId());
    Client::backlogManager()->checkForBacklog(id);
    navPanePush(view->getPage());

    // ask channelListView to update the appearance
    qobject_cast<DataModelAdapter*>(m_channelListView->dataModel())->handleBufferModelDataChanged(modelIndex, modelIndex);
}
Ejemplo n.º 3
0
void AliasManager::expand(const QString &alias, const BufferInfo &bufferInfo, const QString &msg, CommandList &list) {
  const Network *net = network(bufferInfo.networkId());
  if(!net) {
    // FIXME send error as soon as we have a method for that!
    return;
  }

  QRegExp paramRangeR("\\$(\\d+)\\.\\.(\\d*)");
  QStringList commands = alias.split(QRegExp("; ?"));
  QStringList params = msg.split(' ');
  QStringList expandedCommands;
  for(int i = 0; i < commands.count(); i++) {
    QString command = commands[i];

    // replace ranges like $1..3
    if(!params.isEmpty()) {
      int pos;
      while((pos = paramRangeR.indexIn(command)) != -1) {
        int start = paramRangeR.cap(1).toInt();
        bool ok;
        int end = paramRangeR.cap(2).toInt(&ok);
        if(!ok) {
          end = params.count();
        }
        if(end < start)
          command = command.replace(pos, paramRangeR.matchedLength(), QString());
        else {
          command = command.replace(pos, paramRangeR.matchedLength(), QStringList(params.mid(start - 1, end - start + 1)).join(" "));
        }
      }
    }

    for(int j = params.count(); j > 0; j--) {
      IrcUser *ircUser = net->ircUser(params[j - 1]);
      command = command.replace(QString("$%1:hostname").arg(j), ircUser ? ircUser->host() : QString("*"));
      command = command.replace(QString("$%1").arg(j), params[j - 1]);
    }
    command = command.replace("$0", msg);
    command = command.replace("$channelname", bufferInfo.bufferName()); // legacy
    command = command.replace("$channel", bufferInfo.bufferName());
    command = command.replace("$currentnick", net->myNick()); // legacy
    command = command.replace("$nick", net->myNick());
    expandedCommands << command;
  }

  while(!expandedCommands.isEmpty()) {
    QString command;
    if(expandedCommands[0].trimmed().toLower().startsWith("/wait")) {
      command = expandedCommands.join("; ");
      expandedCommands.clear();
    } else {
      command = expandedCommands.takeFirst();
    }
    list.append(qMakePair(bufferInfo, command));
  }
}
Ejemplo n.º 4
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.º 5
0
void TopicWidget::on_topicLineEdit_textEntered() {
  QModelIndex currentIdx = currentIndex();
  if(currentIdx.isValid() && currentIdx.data(NetworkModel::BufferTypeRole) == BufferInfo::ChannelBuffer) {
    BufferInfo bufferInfo = currentIdx.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
    if(ui.topicLineEdit->text().isEmpty())
      Client::userInput(bufferInfo, QString("/quote TOPIC %1 :").arg(bufferInfo.bufferName()));
    else
      Client::userInput(bufferInfo, QString("/topic %1").arg(ui.topicLineEdit->text()));
  }
  switchPlain();
}
Ejemplo n.º 6
0
void Bb10Ui::joinChannel()
{
    QVariantList index = m_channelListView->selected();
    if (index.length() < 2)
        return;

    QModelIndex modelIndex = static_cast<DataModelAdapter*>(m_channelListView->dataModel())->getQModelIndex(index);
    BufferInfo bufInfo = modelIndex.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
    QString bufferName = bufInfo.bufferName();
    switchToOrJoinChat(bufferName, false);
}
Ejemplo n.º 7
0
void NetworkModelController::removeBuffers(const QModelIndexList &indexList)
{
    QList<BufferInfo> inactive;
    foreach(QModelIndex index, indexList) {
        BufferInfo info = index.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
        if (info.isValid()) {
            if (info.type() == BufferInfo::QueryBuffer
                || (info.type() == BufferInfo::ChannelBuffer && !index.data(NetworkModel::ItemActiveRole).toBool()))
                inactive << info;
        }
    }
Ejemplo n.º 8
0
void Bb10Ui::partChannel()
{
    QVariantList index = m_channelListView->selected();
    if (index.length() < 2)
        return;

    QModelIndex modelIndex = static_cast<DataModelAdapter*>(m_channelListView->dataModel())->getQModelIndex(index);
    BufferInfo bufInfo = modelIndex.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
    QString reason = Client::identity(Client::network(bufInfo.networkId())->identity())->partReason();
    Client::userInput(bufInfo, QString("/PART %1").arg(reason));
}
Ejemplo n.º 9
0
void Bb10Ui::onChannelAdded(QVariantList index)
{
    QModelIndex modelIndex = qobject_cast<DataModelAdapter*>(m_channelListView->dataModel())->getQModelIndex(index);
    BufferInfo bufferInfo = modelIndex.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
    if (m_toBeJoined.length() && bufferInfo.bufferName() == m_toBeJoined) {
        while (m_currentBufferId != -1)
            navPanePop();
        onChannelListTriggered(index);
    }
    Client::bufferModel()->sort(0);
}
Ejemplo n.º 10
0
/*****************************************
*  QueryBufferItem
*****************************************/
QueryBufferItem::QueryBufferItem(const BufferInfo &bufferInfo, NetworkItem *parent)
    : BufferItem(bufferInfo, parent),
    _ircUser(0)
{
    setFlags(flags() | Qt::ItemIsDropEnabled | Qt::ItemIsEditable);

    const Network *net = Client::network(bufferInfo.networkId());
    if (!net)
        return;

    IrcUser *ircUser = net->ircUser(bufferInfo.bufferName());
    setIrcUser(ircUser);
}
Ejemplo n.º 11
0
QString NetworkModelController::nickName(const QModelIndex &index) const
{
    IrcUser *ircUser = qobject_cast<IrcUser *>(index.data(NetworkModel::IrcUserRole).value<QObject *>());
    if (ircUser)
        return ircUser->nick();

    BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
    if (!bufferInfo.isValid())
        return QString();
    if (bufferInfo.type() != BufferInfo::QueryBuffer)
        return QString();

    return bufferInfo.bufferName(); // FIXME this might break with merged queries maybe
}
void ContextMenuActionProvider::addIrcUserActions(QMenu *menu, const QModelIndex &index)
{
    // this can be called: a) as a nicklist context menu (index has IrcUserItemType)
    //                     b) as a query buffer context menu (index has BufferItemType and is a QueryBufferItem)
    //                     c) right-click in a query chatview (same as b), index will be the corresponding QueryBufferItem)
    //                     d) right-click on some nickname (_contextItem will be non-null, _filter -> chatview, index -> message buffer)

    if (contextItem().isNull()) {
        // cases a, b, c
        bool haveQuery = indexList().count() == 1 && findQueryBuffer(index).isValid();
        NetworkModel::ItemType itemType = static_cast<NetworkModel::ItemType>(index.data(NetworkModel::ItemTypeRole).toInt());
        addAction(_nickModeMenuAction, menu, itemType == NetworkModel::IrcUserItemType);
        addAction(_nickCtcpMenuAction, menu);

        IrcUser *ircUser = qobject_cast<IrcUser *>(index.data(NetworkModel::IrcUserRole).value<QObject *>());
        if (ircUser) {
            Network *network = ircUser->network();
            // only show entries for usermode +h if server supports it
            if (network && network->prefixModes().contains('h')) {
                action(NickHalfop)->setVisible(true);
                action(NickDehalfop)->setVisible(true);
            }
            else {
                action(NickHalfop)->setVisible(false);
                action(NickDehalfop)->setVisible(false);
            }
            // ignoreliststuff
            QString bufferName;
            BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
            if (bufferInfo.type() == BufferInfo::ChannelBuffer)
                bufferName = bufferInfo.bufferName();
            QMap<QString, bool> ignoreMap = Client::ignoreListManager()->matchingRulesForHostmask(ircUser->hostmask(), ircUser->network()->networkName(), bufferName);
            addIgnoreMenu(menu, ircUser->hostmask(), ignoreMap);
            // end of ignoreliststuff
        }
        menu->addSeparator();
        addAction(NickQuery, menu, itemType == NetworkModel::IrcUserItemType && !haveQuery && indexList().count() == 1);
        addAction(NickSwitchTo, menu, itemType == NetworkModel::IrcUserItemType && haveQuery);
        menu->addSeparator();
        addAction(NickWhois, menu, true);
    }
    else if (!contextItem().isEmpty() && messageFilter()) {
        // case d
        // TODO
    }
}
Ejemplo n.º 13
0
void ClientUserInputHandler::handleJoin(const BufferInfo &bufferInfo, const QString &text)
{
    if (text.isEmpty()) {
        Client::messageModel()->insertErrorMessage(bufferInfo, tr("/JOIN expects a channel"));
        return;
    }
    switchBuffer(bufferInfo.networkId(), text.section(' ', 0, 0));
    // send to core
    defaultHandler("JOIN", bufferInfo, text);
}
Ejemplo n.º 14
0
void ClientUserInputHandler::handleQuery(const BufferInfo &bufferInfo, const QString &text)
{
    if (text.isEmpty()) {
        Client::messageModel()->insertErrorMessage(bufferInfo, tr("/QUERY expects at least a nick"));
        return;
    }
    switchBuffer(bufferInfo.networkId(), text.section(' ', 0, 0));
    // send to core
    defaultHandler("QUERY", bufferInfo, text);
}
Ejemplo n.º 15
0
// this would be the place for a client-side hook
void ClientUserInputHandler::handleUserInput(const BufferInfo &bufferInfo, const QString &msg)
{
    if (msg.isEmpty())
        return;

    if (!msg.startsWith('/')) {
        if (_nickRx.indexIn(msg) == 0) {
            const Network *net = Client::network(bufferInfo.networkId());
            IrcUser *user = net ? net->ircUser(_nickRx.cap(1)) : 0;
            if (user)
                user->setLastSpokenTo(bufferInfo.bufferId(), QDateTime::currentDateTime().toUTC());
        }
    }

    AliasManager::CommandList clist = Client::aliasManager()->processInput(bufferInfo, msg);

    for (int i = 0; i < clist.count(); i++) {
        QString cmd = clist.at(i).second.section(' ', 0, 0).remove(0, 1).toUpper();
        QString payload = clist.at(i).second.section(' ', 1);
        handle(cmd, Q_ARG(BufferInfo, clist.at(i).first), Q_ARG(QString, payload));
    }
}
void ContextMenuActionProvider::addBufferItemActions(QMenu *menu, const QModelIndex &index, bool isCustomBufferView)
{
    BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value<BufferInfo>();

    menu->addSeparator();
    switch (bufferInfo.type()) {
    case BufferInfo::ChannelBuffer:
        addAction(BufferJoin, menu, index, InactiveState);
        addAction(BufferPart, menu, index, ActiveState);
        menu->addSeparator();
        addHideEventsMenu(menu, bufferInfo.bufferId());
        menu->addSeparator();
        addAction(HideBufferTemporarily, menu, isCustomBufferView);
        addAction(HideBufferPermanently, menu, isCustomBufferView);
        addAction(BufferRemove, menu, index, InactiveState);
        break;

    case BufferInfo::QueryBuffer:
    {
        //IrcUser *ircUser = qobject_cast<IrcUser *>(index.data(NetworkModel::IrcUserRole).value<QObject *>());
        //if(ircUser) {
        addIrcUserActions(menu, index);
        menu->addSeparator();
        //}
        addHideEventsMenu(menu, bufferInfo.bufferId());
        menu->addSeparator();
        addAction(HideBufferTemporarily, menu, isCustomBufferView);
        addAction(HideBufferPermanently, menu, isCustomBufferView);
        addAction(BufferRemove, menu, index);
        break;
    }

    default:
        addAction(HideBufferTemporarily, menu, isCustomBufferView);
        addAction(HideBufferPermanently, menu, isCustomBufferView);
    }
}
Ejemplo n.º 17
0
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;
}
Ejemplo n.º 18
0
void ClientUserInputHandler::handleIgnore(const BufferInfo &bufferInfo, const QString &text)
{
    if (text.isEmpty()) {
        emit Client::instance()->displayIgnoreList("");
        return;
    }
    // If rule contains no ! or @, we assume it is just a nickname, and turn it into an ignore rule for that nick
    QString rule = (text.contains('!') || text.contains('@')) ? text : text + "!*@*";

    Client::ignoreListManager()->requestAddIgnoreListItem(
            IgnoreListManager::IgnoreType::SenderIgnore,
            rule,
            false,
            // Use a dynamic ignore rule, for reversibility
            IgnoreListManager::StrictnessType::SoftStrictness,
            // Use current network as scope
            IgnoreListManager::ScopeType::NetworkScope,
            Client::network(bufferInfo.networkId())->networkName(),
            true
    );
}
Ejemplo n.º 19
0
QDebug operator<<(QDebug dbg, const BufferInfo &b)
{
    dbg.nospace() << "(bufId: " << b.bufferId() << ", netId: " << b.networkId() << ", groupId: " << b.groupId() << ", buf: " << b.bufferName() << ")";
    return dbg.space();
}
Ejemplo n.º 20
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.º 21
0
void ClientUserInputHandler::handleList(const BufferInfo &bufferInfo, const QString &text)
{
    Q_UNUSED(text)
    Client::instance()->displayChannelList(bufferInfo.networkId());
}
Ejemplo n.º 22
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();
  }
}