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()); } }
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); }
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)); } }
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); }
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(); }
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); }
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; } }
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)); }
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); }
/***************************************** * 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); }
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 } }
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); }
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); }
// 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); } }
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 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 ); }
QDebug operator<<(QDebug dbg, const BufferInfo &b) { dbg.nospace() << "(bufId: " << b.bufferId() << ", netId: " << b.networkId() << ", groupId: " << b.groupId() << ", buf: " << b.bufferName() << ")"; return dbg.space(); }
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 ClientUserInputHandler::handleList(const BufferInfo &bufferInfo, const QString &text) { Q_UNUSED(text) Client::instance()->displayChannelList(bufferInfo.networkId()); }
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(); } }