HAL
action_pingroup.cpp
Go to the documentation of this file.
2 #include "gui/gui_globals.h"
5 #include <QMetaEnum>
6 #include <QUuid>
7 
8 namespace hal
9 {
11  {
12  if (!mod || !pgrp) return -1;
13  int inx = 0;
14  for (const PinGroup<ModulePin>* testgrp : mod->get_pin_groups())
15  {
16  if (testgrp == pgrp) return inx;
17  ++inx;
18  }
19  return -1;
20  }
21 
23  {
24  if (!m) m = gNetlist->get_top_module();
25  std::cerr << "module: " << m->get_id() << " <" << m->get_name() << ">\n";
26  for (PinGroup<ModulePin>* pg : m->get_pin_groups())
27  {
28  std::cerr << " grp: " << pg->get_id() << (pg->is_ascending()?" asc ": " des ") << pg->get_start_index()
29  << " <" << pg->get_name() << ">\n";
30  for (ModulePin* pin : pg->get_pins())
31  std::cerr << " pin: " << pin->get_id() << " inx:" << pin->get_group().second << " row:"
32  << ActionPingroup::pinIndex2Row(pin,pin->get_group().second) << " <" << pin->get_name() << ">\n";
33  }
34  std::cerr << "-------------" << std::endl;
35  for (Module* sm : m->get_submodules())
36  dumpPingroups(sm);
37  }
38 
39  int ActionPingroup::pinIndex2Row(const ModulePin* pin, int index)
40  {
41  auto pg = pin->get_group();
42  if (pg.first->is_ascending())
43  return index - pg.first->get_start_index();
44  return pg.first->get_start_index() - index;
45  }
46 
47  int ActionPingroup::pinRow2Index(const ModulePin* pin, int row)
48  {
49  auto pg = pin->get_group();
50  if (pg.first->is_ascending())
51  return pg.first->get_start_index() + row;
52  return pg.first->get_start_index() - row;
53  }
54 
55  uint qHash(PinEvent pev)
56  {
57  return (uint) pev;
58  }
59 
61  {
62  QString baseName = QString::fromStdString(pin->get_name());
63  QSet<QString> existingGroups;
64  for (auto g : mod->get_pin_groups())
65  existingGroups.insert(QString::fromStdString(g->get_name()));
66  QString retval = baseName;
67  int count = 1;
68  while (existingGroups.contains(retval))
69  retval = QString("%1_%2").arg(baseName).arg(++count);
70  return retval;
71  }
72 
74  {
75  QMetaEnum me = QMetaEnum::fromType<Type>();
76  return QString(me.key(tp));
77  }
78 
80  {
81  QMetaEnum me = QMetaEnum::fromType<Type>();
82  for (int t = None; t < MaxAction; t++)
83  if (s == me.key(t))
84  {
85  return static_cast<Type>(t);
86  }
87  return None;
88  }
89 
91  {
93  return types.contains(tp);
94  }
95 
97  {
99  return types.contains(tp);
100  }
101 
103  : UserActionFactory("Pingroup") {;}
104 
106 
108  {
109  return new ActionPingroup;
110  }
111 
113  {
115  }
116 
118  {
119  mPinActions.append(AtomicAction(tp, id, name, value));
120  }
121 
123  : mPinActions(aaList)
124  {;}
125 
127  {
128  for (const AtomicAction& aa : mPinActions)
129  {
130  cryptoHash.addData((char*)(&aa.mType),sizeof(aa.mType));
131  cryptoHash.addData((char*)(&aa.mId),sizeof(aa.mId));
132  cryptoHash.addData(aa.mName.toUtf8());
133  cryptoHash.addData((char*)(&aa.mValue),sizeof(aa.mValue));
134  }
135  }
136 
138  {
139  // TODO xml parent element
140  for (const AtomicAction& aa : mPinActions)
141  {
142  if (aa.mType != PinActionType::None)
143  xmlOut.writeTextElement("type", PinActionType::toString(aa.mType));
144  if (aa.mId)
145  xmlOut.writeTextElement("id", QString::number(aa.mId));
146  if (!aa.mName.isEmpty())
147  xmlOut.writeTextElement("name", aa.mName);
148  if (aa.mValue)
149  xmlOut.writeTextElement("value", QString::number(aa.mValue));
150  }
151  }
152 
154  {
155  // TODO loop xml parent element
156  while (xmlIn.readNextStartElement())
157  {
159  int id = 0;
160  QString name;
161  int val = 0;
162 
163  if (xmlIn.name() == "type")
165  if (xmlIn.name() == "id")
166  id = xmlIn.readElementText().toInt();
167  if (xmlIn.name() == "name")
168  name = xmlIn.readElementText();
169  if (xmlIn.name() == "value")
170  val = xmlIn.readElementText().toInt();
171  mPinActions.append(AtomicAction(tp,id,name,val));
172  }
173  }
174  PinGroup<ModulePin>* ActionPingroup::getGroup(ModulePin* pin) const
175  {
176  return pin->get_group().first;
177  }
178 
179  PinGroup<ModulePin>* ActionPingroup::getGroup(int grpId) const
180  {
181  PinGroup<ModulePin>* pgroup = mPinGroups.value(grpId);
182  if (pgroup) return pgroup;
183  if (!mParentModule || grpId<=0) return nullptr;
184  return mParentModule->get_pin_group_by_id(grpId);
185  }
186 
187 
188  void ActionPingroup::prepareUndoAction()
189  {
190  QHash<PinGroup<ModulePin>*,int> remainingPins;
191  for (const AtomicAction& aa : mPinActions)
192  {
193  if (aa.mType != PinActionType::PinAsignToGroup)
194  continue;
195  ModulePin* pin = mParentModule->get_pin_by_id(aa.mId);
196  PinGroup<ModulePin>* pgroup = pin->get_group().first;
197  if (remainingPins.contains(pgroup))
198  remainingPins[pgroup]--;
199  else
200  remainingPins[pgroup] = pgroup->size()-1;
201  }
202 
203  // for groups that will be deleted after pin assign a create action is needed in undo
204  for (auto it = remainingPins.begin(); it != remainingPins.end(); ++it)
205  {
206  if (it.value() > 0) continue;
207  GroupRestore gr(mParentModule,it.key());
208  mGroupRestore.insert(gr.mRow,gr);
209  }
210  }
211 
212  void ActionPingroup::finalizeUndoAction()
213  {
214  QList<AtomicAction> restoreActions;
215  for (auto it = mGroupRestore.begin(); it != mGroupRestore.end(); ++it)
216  {
217  const GroupRestore& gr = it.value();
218  restoreActions.append(AtomicAction(PinActionType::GroupCreate,gr.mId,gr.mName,gr.mStartIndex));
219  restoreActions.append(AtomicAction(PinActionType::GroupMoveToRow,gr.mId,"",gr.mRow));
220  if (gr.mType != PinType::none)
221  restoreActions.append(AtomicAction(PinActionType::GroupTypeChange,gr.mId,"",(int)gr.mType));
222  if (gr.mDirection != PinDirection::none)
223  restoreActions.append(AtomicAction(PinActionType::GroupDirChange,gr.mId,"",(int)gr.mDirection));
224  }
225 
226  for (auto it = mTempUndoActions.rbegin(); it != mTempUndoActions.rend(); ++it)
227  {
228  for (const AtomicAction& aa : (*it))
229  restoreActions.append(aa);
230  }
231 
232  for (u32 grpId : mGroupToRemove)
233  {
234  restoreActions.append(AtomicAction(PinActionType::GroupDelete,grpId));
235  }
236 
237  if (!restoreActions.isEmpty())
238  {
239  mUndoAction = new ActionPingroup(restoreActions);
240  mUndoAction->setObject(object());
241  }
242  }
243 
244  int ActionPingroup::pinGroupRow(const Module *m, PinGroup<ModulePin>* pgroup)
245  {
246  int inx = 0;
247  for (PinGroup<ModulePin>* testgroup : m->get_pin_groups())
248  {
249  if (testgroup == pgroup) return inx;
250  ++inx;
251  }
252  return -1;
253  }
254 
256  {
257  mPinGroups.clear();
258  mGroupRestore.clear();
259  mPinsMoved.clear();
260  mGroupToRemove.clear();
261  mTempUndoActions.clear();
263  return false;
264 
265  mParentModule = gNetlist->get_module_by_id(mObject.id());
266  if (!mParentModule)
267  return false;
268 
269  prepareUndoAction(); // create pingroups in case we are going to delete some while assigning
270  LayoutLocker llock;
271 
272  for (const AtomicAction& aa : mPinActions)
273  {
274  PinGroup<ModulePin>* pgroup = nullptr;
275  ModulePin* pin = nullptr;
276 
277  if (PinActionType::useExistingGroup(aa.mType))
278  {
279  auto it = mPinGroups.find(aa.mId);
280  if (it == mPinGroups.end())
281  {
282  pgroup = mParentModule->get_pin_group_by_id(aa.mId);
283  if (!pgroup)
284  {
285  // special case : the group delete command cannot be executed since the
286  // group was already deleted when re-assigning its last pin
287  if (aa.mType == PinActionType::GroupDelete)
288  continue;
289  return false;
290  }
291  mPinGroups.insert(aa.mId,pgroup);
292  }
293  else
294  pgroup = it.value();
295  }
296 
297  if (PinActionType::useExistingPin(aa.mType))
298  {
299  pin = mParentModule->get_pin_by_id(aa.mId);
300  }
301 
302  switch (aa.mType)
303  {
305  {
306  int startIndex = aa.mValue >> 1;
307  bool ascending = (aa.mValue & 1) > 0;
308  if (aa.mId > 0)
309  {
310  if (auto res = mParentModule->create_pin_group(aa.mId, aa.mName.toStdString(), {}, PinDirection::none, PinType::none,ascending,startIndex); res.is_ok())
311  pgroup = res.get();
312  else
313  return false;
314  }
315  else
316  {
317  if (auto res = mParentModule->create_pin_group(aa.mName.toStdString(), {}, PinDirection::none, PinType::none,ascending,startIndex); res.is_ok())
318  pgroup = res.get();
319  else
320  return false;
321  }
322  if (pgroup)
323  {
324  mPinGroups[aa.mId] = pgroup;
325  mGroupToRemove.insert(pgroup->get_id());
326  }
327  break;
328  }
330  {
331  int v = (pgroup->get_lowest_index() << 1) | (pgroup->is_ascending() ? 1 : 0);
332  u32 id = pgroup->get_id();
333  int ptype = (int) pgroup->get_type();
334  int pdir = (int) pgroup->get_direction();
336  if (!mParentModule->delete_pin_group(pgroup))
337  return false;
338  mTempUndoActions.append(QList<AtomicAction>({
339  AtomicAction(PinActionType::GroupCreate,id,name,v),
340  AtomicAction(PinActionType::GroupTypeChange,id,"",ptype),
341  AtomicAction(PinActionType::GroupDirChange,id,"",pdir)}));
342  break;
343  }
345  {
346  int inx = pinGroupRow(mParentModule,pgroup);
347  if (inx < 0) return false;
348  mTempUndoActions.append(QList<AtomicAction>({
349  AtomicAction(PinActionType::GroupMoveToRow,pgroup->get_id(),"",inx)}));
350  if (!mParentModule->move_pin_group(pgroup,aa.mValue))
351  return false;
352  break;
353  }
355  mTempUndoActions.append(QList<AtomicAction>({
356  AtomicAction(PinActionType::GroupRename,pgroup->get_id(),QString::fromStdString(pgroup->get_name()))}));
357  if (!mParentModule->set_pin_group_name(pgroup,aa.mName.toStdString()))
358  return false;
359  break;
361  mTempUndoActions.append(QList<AtomicAction>({
362  AtomicAction(PinActionType::GroupTypeChange,pgroup->get_id(),"",(int)pgroup->get_type())}));
363  if (!mParentModule->set_pin_group_type(pgroup, (PinType) aa.mValue))
364  return false;
365  break;
367  mTempUndoActions.append(QList<AtomicAction>({
368  AtomicAction(PinActionType::GroupDirChange,pgroup->get_id(),"",(int)pgroup->get_direction())}));
369  if (!mParentModule->set_pin_group_direction(pgroup, (PinDirection) aa.mValue))
370  return false;
371  break;
373  mTempUndoActions.append(QList<AtomicAction>({
374  AtomicAction(PinActionType::PinAsignToGroup,aa.mId,"",pin->get_group().first->get_id()),
375  AtomicAction(PinActionType::PinMoveToRow,aa.mId,"",ActionPingroup::pinIndex2Row(pin,pin->get_group().second))}));
376  mPinsMoved.insert(aa.mId);
377  pgroup = getGroup(aa.mValue);
378  if (!pgroup) return false;
379  if (!mParentModule->assign_pin_to_group(pgroup,pin))
380  {
381  qDebug() << "assign_pin_to_group failed";
382  return false;
383  }
384  // dumpPingroups();
385  break;
387  mTempUndoActions.append(QList<AtomicAction>({
388  AtomicAction(PinActionType::PinRename,aa.mId, QString::fromStdString(pin->get_name()))}));
389  if (!mParentModule->set_pin_name(pin, aa.mName.toStdString()))
390  return false;
391  break;
393  mTempUndoActions.append(QList<AtomicAction>({
394  AtomicAction(PinActionType::PinTypeChange,aa.mId,"",(int)pin->get_type())}));
395  if (!mParentModule->set_pin_type(pin, (PinType) aa.mValue))
396  return false;
397  break;
399  if (!mPinsMoved.contains(aa.mId))
400  mTempUndoActions.append(QList<AtomicAction>({
401  AtomicAction(PinActionType::PinMoveToRow,aa.mId,"",ActionPingroup::pinIndex2Row(pin,pin->get_group().second))}));
402  pgroup = pin->get_group().first;
403  if (!mParentModule->move_pin_within_group(pgroup,pin,ActionPingroup::pinRow2Index(pin,aa.mValue)))
404  {
405  qDebug() << "move_pin_within_group failed";
406  return false;
407  }
408  // dumpPingroups();
409  break;
410  default:
411  break;
412  }
413  }
414 
415  finalizeUndoAction();
416 
417  return UserAction::exec();
418  }
419 
420  ActionPingroup* ActionPingroup::addPinsToExistingGroup(const Module *m, u32 grpId, QList<u32> pinIds, int pinRow)
421  {
422  ActionPingroup* retval = nullptr;
423  for (u32 pinId : pinIds)
424  {
425  if (retval)
426  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pinId,"",grpId));
427  else
428  retval = new ActionPingroup(PinActionType::PinAsignToGroup,pinId,"",grpId);
429  if (pinRow >= 0)
430  retval->mPinActions.append(AtomicAction(PinActionType::PinMoveToRow,pinId,"",pinRow++));
431  }
432  if (retval)
433  retval->setObject(UserActionObject(m->get_id(),UserActionObjectType::Module));
434  return retval;
435  }
436 
437  ActionPingroup* ActionPingroup::addPinToExistingGroup(const Module* m, u32 grpId, u32 pinId, int pinRow)
438  {
439  QList<u32> pinIds;
440  pinIds << pinId;
441  return addPinsToExistingGroup(m,grpId,pinIds,pinRow);
442  }
443 
444  ActionPingroup* ActionPingroup::addPinsToNewGroup(const Module* m, const QString& name, QList<u32> pinIds, int grpRow)
445  {
446  static int vid = -9;
447  ActionPingroup* retval = new ActionPingroup(PinActionType::GroupCreate,vid,name);
448  if (!pinIds.isEmpty())
449  {
450  ModulePin* pin = m->get_pin_by_id(pinIds.first());
451  if (pin)
452  {
453  retval->mPinActions.append(AtomicAction(PinActionType::GroupDirChange,vid,"",(int)pin->get_direction()));
454  retval->mPinActions.append(AtomicAction(PinActionType::GroupTypeChange,vid,"",(int)pin->get_type()));
455  }
456  }
457  for (u32 pinId : pinIds)
458  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pinId,"",vid));
459 
460  if (grpRow >= 0)
461  retval->mPinActions.append(AtomicAction(PinActionType::GroupMoveToRow,vid,"",grpRow));
462  retval->setObject(UserActionObject(m->get_id(),UserActionObjectType::Module));
463  return retval;
464  }
465 
466  ActionPingroup* ActionPingroup::addPinToNewGroup(const Module *m, const QString& name, u32 pinId, int grpRow)
467  {
468  QList<u32> pinIds;
469  pinIds << pinId;
470  return addPinsToNewGroup(m,name,pinIds, grpRow);
471  }
472 
473  ActionPingroup* ActionPingroup::deletePinGroup(const Module *m, u32 grpId)
474  {
475  ActionPingroup* retval = nullptr;
476 
477  PinGroup<ModulePin>* groupToDelete = m->get_pin_group_by_id(grpId);
478  if (!groupToDelete) return retval;
479 
480  QMap<QString,int> existingGroups;
481  for (PinGroup<ModulePin>* pgroup : m->get_pin_groups())
482  existingGroups.insert(QString::fromStdString(pgroup->get_name()),pgroup->get_id());
483 
484  bool doNotDelete = false; // if there is a pin with the same name as the
485  int vid = -1;
486 
487  std::vector<ModulePin*> orderedPins = groupToDelete->get_pins();
488  if (groupToDelete->is_descending())
489  std::reverse(orderedPins.begin(), orderedPins.end());
490 
491  for (ModulePin* pin : orderedPins)
492  {
493  if (pin->get_name() == groupToDelete->get_name())
494  doNotDelete = true;
495  else
496  {
497  QString pinName = QString::fromStdString(pin->get_name());
498  auto it = existingGroups.find(pinName);
499  if (it == existingGroups.end())
500  {
501  if (retval)
502  retval->mPinActions.append(AtomicAction(PinActionType::GroupCreate,vid,pinName));
503  else
504  retval = new ActionPingroup(PinActionType::GroupCreate,vid,pinName);
505  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pin->get_id(),"",vid));
506  --vid;
507  }
508  else
509  {
510  if (retval)
511  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pin->get_id(),"",it.value()));
512  else
513  retval = new ActionPingroup(PinActionType::PinAsignToGroup,pin->get_id(),"",it.value());
514  }
515  }
516 
517  }
518 
519  if (!doNotDelete)
520  {
521  if (retval)
522  retval->mPinActions.append(AtomicAction(PinActionType::GroupDelete,groupToDelete->get_id()));
523  else
524  retval = new ActionPingroup(PinActionType::GroupDelete,groupToDelete->get_id());
525  }
526 
527  retval->setObject(UserActionObject(m->get_id(),UserActionObjectType::Module));
528  return retval;
529  }
530 
531  ActionPingroup* ActionPingroup::removePinsFromGroup(const Module* m, QList<u32> pinIds)
532  {
533  ActionPingroup* retval = nullptr;
534  QSet<QString> existingGroupNames;
535  for (PinGroup<ModulePin>* pgroup : m->get_pin_groups())
536  existingGroupNames.insert(QString::fromStdString(pgroup->get_name()));
537  int vid = -1;
538  QString basename;
539  for (u32 pinId : pinIds)
540  {
541  ModulePin* pin = m->get_pin_by_id(pinId);
542  if (!pin) return nullptr;
543  int count = 2;
544  QString name = basename = QString::fromStdString(pin->get_name());
545  while (existingGroupNames.contains(name))
546  name = QString("%1_%2").arg(basename).arg(count++);
547  if (retval)
548  retval->mPinActions.append(AtomicAction(PinActionType::GroupCreate,vid,name));
549  else
550  retval = new ActionPingroup(PinActionType::GroupCreate,vid,name);
551  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pinId,"",vid));
552  --vid;
553  }
554  if (retval)
555  retval->setObject(UserActionObject(m->get_id(),UserActionObjectType::Module));
556  return retval;
557  }
558 
559  ActionPingroup* ActionPingroup::toggleAscendingGroup(const Module* m, u32 grpId)
560  {
561  PinGroup<ModulePin>* pinGroup = m->get_pin_group_by_id(grpId);
562  if (!pinGroup) return nullptr;
563  bool toAscending = ! pinGroup->is_ascending();
564  int val = (pinGroup->get_lowest_index() << 1) | (toAscending ? 1 : 0);
565  std::vector<ModulePin*> pins = pinGroup->get_pins();
566  QString tempName = QUuid::createUuid().toString();
567  QString grpName = QString::fromStdString(pinGroup->get_name());
568  int grpRow = pinGroupRow(m, pinGroup);
569  static int vid = -9;
570 
571  ActionPingroup* retval = new ActionPingroup(PinActionType::GroupCreate,vid,tempName,val);
572  if (toAscending)
573  {
574  for (auto it = pins.rbegin(); it != pins.rend(); ++it)
575  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup, (*it)->get_id(), QString(), vid));
576  }
577  else
578  {
579  for (auto it = pins.begin(); it != pins.end(); ++it)
580  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup, (*it)->get_id(), QString(), vid));
581  }
582 
583  // note: old group gets deleted after last pin gets moved. If that behavior changes insert following line:
584  // retval->mPinActions.append(AtomicAction(PinActionType::GroupDelete, grpId));
585 
586  retval->mPinActions.append(AtomicAction(PinActionType::GroupRename, vid, grpName));
587  retval->mPinActions.append(AtomicAction(PinActionType::GroupMoveToRow, vid, QString(), grpRow));
588  retval->setObject(UserActionObject(m->get_id(),UserActionObjectType::Module));
589  return retval;
590  }
591 
592  ActionPingroup* ActionPingroup::changePinGroupType(const Module* m, u32 grpId, int ptype)
593  {
594  PinGroup<ModulePin>* pinGroup = m->get_pin_group_by_id(grpId);
595  if (!pinGroup) return nullptr;
596  std::vector<ModulePin*> pins = pinGroup->get_pins();
597 
598  ActionPingroup* retval = new ActionPingroup(PinActionType::GroupTypeChange, pinGroup->get_id(), "", ptype);
599  for (ModulePin* pin : pins)
600  retval->mPinActions.append(AtomicAction(PinActionType::PinTypeChange,pin->get_id(),"",ptype));
601  retval->setObject(UserActionObject(m->get_id(), UserActionObjectType::Module));
602  return retval;
603  }
604 
605  ActionPingroup::GroupRestore::GroupRestore(Module* m, PinGroup<ModulePin>* pgroup)
606  : mId(pgroup->get_id()),
607  mName(QString::fromStdString(pgroup->get_name())),
608  mRow(pinGroupRow(m,pgroup)),
609  mStartIndex( (pgroup->get_lowest_index() << 1) | (pgroup->is_ascending() ? 1 : 0)),
610  mDirection(pgroup->get_direction()),
611  mType(pgroup->get_type())
612  {;}
613 }
UserActionFactory for ActionPingroup.
UserAction * newAction() const
static ActionPingroupFactory * sFactory
Pingroup user actions.
static QString generateGroupName(const Module *mod, const ModulePin *pin)
void readFromXml(QXmlStreamReader &xmlIn) override
void writeToXml(QXmlStreamWriter &xmlOut) const override
ActionPingroup(PinActionType::Type tp=PinActionType::None, int id=0, const QString &name=QString(), int value=0)
static int pinGroupIndex(const Module *mod, const PinGroup< ModulePin > *pgrp)
static int pinIndex2Row(const ModulePin *pin, int index)
void addToHash(QCryptographicHash &cryptoHash) const override
static int pinRow2Index(const ModulePin *pin, int row)
bool exec() override
QString tagname() const override
const std::string & get_name() const
Definition: base_pin.h:108
PinType get_type() const
Definition: base_pin.h:148
const std::pair< PinGroup< T > *, i32 > & get_group() const
Definition: base_pin.h:158
PinDirection get_direction() const
Definition: base_pin.h:128
bool move_pin_within_group(PinGroup< ModulePin > *pin_group, ModulePin *pin, u32 new_index)
Definition: module.cpp:1512
bool assign_pin_to_group(PinGroup< ModulePin > *pin_group, ModulePin *pin, bool delete_empty_groups=true)
Definition: module.cpp:1408
ModulePin * get_pin_by_id(const u32 id) const
Definition: module.cpp:985
bool set_pin_group_type(PinGroup< ModulePin > *pin_group, PinType new_type)
Definition: module.cpp:1203
bool set_pin_type(ModulePin *pin, PinType new_type)
Definition: module.cpp:1124
bool delete_pin_group(PinGroup< ModulePin > *pin_group)
Definition: module.cpp:1326
bool move_pin_group(PinGroup< ModulePin > *pin_group, u32 new_index)
Definition: module.cpp:1366
bool set_pin_name(ModulePin *pin, const std::string &new_name, bool force_name=false)
Definition: module.cpp:1070
std::string get_name() const
Definition: module.cpp:87
bool set_pin_group_direction(PinGroup< ModulePin > *pin_group, PinDirection new_direction)
Definition: module.cpp:1226
Result< PinGroup< ModulePin > * > create_pin_group(const u32 id, const std::string &name, const std::vector< ModulePin * > pins={}, PinDirection direction=PinDirection::none, PinType type=PinType::none, bool ascending=true, u32 start_index=0, bool delete_empty_groups=true, bool force_name=false)
Definition: module.cpp:1253
bool set_pin_group_name(PinGroup< ModulePin > *pin_group, const std::string &new_name, bool force_name=false)
Definition: module.cpp:1147
std::vector< PinGroup< ModulePin > * > get_pin_groups(const std::function< bool(PinGroup< ModulePin > *)> &filter=nullptr) const
Definition: module.cpp:964
PinGroup< ModulePin > * get_pin_group_by_id(const u32 id) const
Definition: module.cpp:1036
std::vector< Module * > get_submodules(const std::function< bool(Module *)> &filter=nullptr, bool recursive=false) const
Definition: module.cpp:261
u32 get_id() const
Definition: module.cpp:82
Module * get_top_module() const
Definition: netlist.cpp:608
Module * get_module_by_id(u32 module_id) const
Definition: netlist.cpp:613
static Type fromString(const QString &s)
static QString toString(Type tp)
static bool useExistingPin(Type tp)
static bool useExistingGroup(Type tp)
std::vector< T * > get_pins(const std::function< bool(T *)> &filter=nullptr) const
Definition: pin_group.h:202
u32 get_id() const
Definition: pin_group.h:130
i32 get_lowest_index() const
Definition: pin_group.h:293
const std::string & get_name() const
Definition: pin_group.h:150
bool is_ascending() const
Definition: pin_group.h:273
PinDirection get_direction() const
Definition: pin_group.h:190
bool is_descending() const
Definition: pin_group.h:283
PinType get_type() const
Definition: pin_group.h:170
The UserActionFactory is the abstract base class for registration.
Definition: user_action.h:225
QString tagname() const
Definition: user_action.h:242
The UserAction class is the abstract base class for user interactions.
Definition: user_action.h:57
UserAction * mUndoAction
Definition: user_action.h:186
virtual bool exec()
Definition: user_action.cpp:23
virtual void setObject(const UserActionObject &obj)
Definition: user_action.cpp:32
UserActionObject mObject
Definition: user_action.h:183
The UserActionObject class represents a single object used in UserAction.
UserActionObjectType::ObjectType type() const
PinDirection
Definition: pin_direction.h:36
PinEvent
Definition: pin_event.h:42
void dumpPingroups(Module *m=nullptr)
Netlist * gNetlist
Definition: plugin_gui.cpp:80
PinType
Definition: pin_type.h:36
uint qHash(const LaneIndex &ri)
quint32 u32
std::vector< PinInformation > pins
bool ascending
std::string name
void addData(const char *data, int length)
QHash::iterator begin()
bool contains(const Key &key) const const
QHash::iterator end()
int size() const const
void append(const T &value)
void clear()
T & first()
bool isEmpty() const const
QList::reverse_iterator rbegin()
QList::reverse_iterator rend()
T value(int i) const const
QMap::iterator begin()
void clear()
QMap::iterator end()
QMap::iterator find(const Key &key)
QMap::iterator insert(const Key &key, const T &value)
const char * key(int index) const const
void clear()
bool contains(const T &value) const const
QSet::iterator insert(const T &value)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString fromStdString(const std::string &str)
QString number(int n, int base)
int toInt(bool *ok, int base) const const
QUuid createUuid()
QString toString() const const
QStringRef name() const const
QString readElementText(QXmlStreamReader::ReadElementTextBehaviour behaviour)
bool readNextStartElement()
void writeTextElement(const QString &qualifiedName, const QString &text)