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 {
10  int pinGroupIndex(const Module* mod, const PinGroup<ModulePin>* pgrp)
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  << 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 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 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 
60  QString generateGroupName(const Module* mod, const ModulePin* pin)
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  void ActionPingroup::addUndoAction(PinActionType::Type tp, int id, const QString& name, int value)
188  {
189  ActionPingroup* undo = nullptr;
190  if (mUndoAction)
191  {
192  undo = static_cast<ActionPingroup*>(mUndoAction);
193  undo->mPinActions.append(AtomicAction(tp,id,name,value));
194  }
195  else
196  {
197  undo = new ActionPingroup(tp,id,name,value);
198  undo->setObject(object());
199  }
200  mUndoAction = undo;
201  }
202 
203 
204  void ActionPingroup::prepareUndoAction()
205  {
206  QHash<PinGroup<ModulePin>*,int> remainingPins;
207  for (const AtomicAction& aa : mPinActions)
208  {
209  if (aa.mType != PinActionType::PinAsignToGroup)
210  continue;
211  ModulePin* pin = mParentModule->get_pin_by_id(aa.mId);
212  PinGroup<ModulePin>* pgroup = pin->get_group().first;
213  if (remainingPins.contains(pgroup))
214  remainingPins[pgroup]--;
215  else
216  remainingPins[pgroup] = pgroup->size()-1;
217  }
218 
219  // for groups that will be deleted after pin assign a create action is needed in undo
220  for (auto it = remainingPins.begin(); it != remainingPins.end(); ++it)
221  {
222  if (it.value() > 0) continue;
223  GroupRestore gr(mParentModule,it.key());
224  mGroupRestore.insert(gr.mRow,gr);
225  }
226  }
227 
228  void ActionPingroup::finalizeUndoAction()
229  {
230  QList<AtomicAction> restoreActions;
231  for (auto it = mGroupRestore.begin(); it != mGroupRestore.end(); ++it)
232  {
233  const GroupRestore& gr = it.value();
234  restoreActions.append(AtomicAction(PinActionType::GroupCreate,gr.mId,gr.mName,gr.mStartIndex));
235  restoreActions.append(AtomicAction(PinActionType::GroupMoveToRow,gr.mId,"",gr.mRow));
236  if (gr.mType != PinType::none)
237  restoreActions.append(AtomicAction(PinActionType::GroupTypeChange,gr.mId,"",(int)gr.mType));
238  if (gr.mDirection != PinDirection::none)
239  restoreActions.append(AtomicAction(PinActionType::GroupDirChange,gr.mId,"",(int)gr.mDirection));
240  }
241  if (!restoreActions.isEmpty())
242  {
243  if (mUndoAction)
244  {
245  ActionPingroup* act = static_cast<ActionPingroup*>(mUndoAction);
246  restoreActions += act->mPinActions;
247  act->mPinActions = restoreActions;
248  }
249  else
250  {
251  mUndoAction = new ActionPingroup(restoreActions);
252  }
253  }
254 
255  for (u32 grpId : mGroupToRemove)
256  {
257  if (mUndoAction)
258  {
259  ActionPingroup* act = static_cast<ActionPingroup*>(mUndoAction);
260  act->mPinActions.append(AtomicAction(PinActionType::GroupDelete,grpId));
261  }
262  else
264  }
265 
266  if (mUndoAction) mUndoAction->setObject(object());
267  }
268 
269  int ActionPingroup::pinGroupRow(const Module *m, PinGroup<ModulePin>* pgroup)
270  {
271  int inx = 0;
272  for (PinGroup<ModulePin>* testgroup : m->get_pin_groups())
273  {
274  if (testgroup == pgroup) return inx;
275  ++inx;
276  }
277  return -1;
278  }
279 
281  {
282  mPinGroups.clear();
283  mGroupRestore.clear();
284  mPinsMoved.clear();
285  mGroupToRemove.clear();
287  return false;
288 
289  mParentModule = gNetlist->get_module_by_id(mObject.id());
290  if (!mParentModule)
291  return false;
292 
293  prepareUndoAction(); // create pingroups in case we are going to delete some while assigning
294  LayoutLocker llock;
295 
296  for (const AtomicAction& aa : mPinActions)
297  {
298  PinGroup<ModulePin>* pgroup = nullptr;
299  ModulePin* pin = nullptr;
300 
301  if (PinActionType::useExistingGroup(aa.mType))
302  {
303  auto it = mPinGroups.find(aa.mId);
304  if (it == mPinGroups.end())
305  {
306  pgroup = mParentModule->get_pin_group_by_id(aa.mId);
307  if (!pgroup) return false;
308  mPinGroups.insert(aa.mId,pgroup);
309  }
310  else
311  pgroup = it.value();
312  }
313 
314  if (PinActionType::useExistingPin(aa.mType))
315  {
316  pin = mParentModule->get_pin_by_id(aa.mId);
317  }
318 
319  switch (aa.mType)
320  {
322  {
323  int startIndex = aa.mValue;
324  bool ascending = true;
325  if (aa.mValue < 0)
326  {
327  ascending = false;
328  startIndex = -aa.mValue-1;
329  }
330  if (aa.mId > 0)
331  {
332  if (auto res = mParentModule->create_pin_group(aa.mId, aa.mName.toStdString(), {}, PinDirection::none, PinType::none,ascending,startIndex); res.is_ok())
333  pgroup = res.get();
334  else
335  return false;
336  }
337  else
338  {
339  if (auto res = mParentModule->create_pin_group(aa.mName.toStdString(), {}, PinDirection::none, PinType::none,ascending,startIndex); res.is_ok())
340  pgroup = res.get();
341  else
342  return false;
343  }
344  if (pgroup)
345  {
346  mPinGroups[aa.mId] = pgroup;
347  mGroupToRemove.insert(pgroup->get_id());
348  }
349  break;
350  }
352  {
353  int v = pgroup->get_start_index();
354  if (!pgroup->is_ascending()) v = -v-1;
355  u32 id = pgroup->get_id();
356  int ptype = (int) pgroup->get_type();
357  int pdir = (int) pgroup->get_direction();
359  if (!mParentModule->delete_pin_group(pgroup))
360  return false;
361  addUndoAction(PinActionType::GroupCreate,id,name,v);
362  addUndoAction(PinActionType::GroupTypeChange,id,"",ptype);
363  addUndoAction(PinActionType::GroupDirChange,id,"",pdir);
364  break;
365  }
367  {
368  int inx = pinGroupRow(mParentModule,pgroup);
369  if (inx < 0) return false;
370  addUndoAction(PinActionType::GroupMoveToRow,pgroup->get_id(),"",inx);
371  if (!mParentModule->move_pin_group(pgroup,aa.mValue))
372  return false;
373  break;
374  }
376  addUndoAction(PinActionType::GroupRename,pgroup->get_id(),QString::fromStdString(pgroup->get_name()));
377  if (!mParentModule->set_pin_group_name(pgroup,aa.mName.toStdString()))
378  return false;
379  break;
381  addUndoAction(PinActionType::GroupTypeChange,pgroup->get_id(),"",(int)pgroup->get_type());
382  if (!mParentModule->set_pin_group_type(pgroup, (PinType) aa.mValue))
383  return false;
384  break;
386  addUndoAction(PinActionType::GroupDirChange,pgroup->get_id(),"",(int)pgroup->get_direction());
387  if (!mParentModule->set_pin_group_direction(pgroup, (PinDirection) aa.mValue))
388  return false;
389  break;
391  addUndoAction(PinActionType::PinAsignToGroup,aa.mId,"",pin->get_group().first->get_id());
392  addUndoAction(PinActionType::PinMoveToRow,aa.mId,"",pinIndex2Row(pin,pin->get_group().second));
393  mPinsMoved.insert(aa.mId);
394  pgroup = getGroup(aa.mValue);
395  if (!pgroup) return false;
396  if (!mParentModule->assign_pin_to_group(pgroup,pin))
397  {
398  qDebug() << "assign_pin_to_group failed";
399  return false;
400  }
401  // dumpPingroups();
402  break;
404  addUndoAction(PinActionType::PinRename,aa.mId, QString::fromStdString(pin->get_name()));
405  if (!mParentModule->set_pin_name(pin, aa.mName.toStdString()))
406  return false;
407  break;
409  addUndoAction(PinActionType::PinTypeChange,aa.mId,"",(int)pin->get_type());
410  if (!mParentModule->set_pin_type(pin, (PinType) aa.mValue))
411  return false;
412  break;
414  if (!mPinsMoved.contains(aa.mId))
415  addUndoAction(PinActionType::PinMoveToRow,aa.mId,"",pinIndex2Row(pin,pin->get_group().second));
416  pgroup = pin->get_group().first;
417  if (!mParentModule->move_pin_within_group(pgroup,pin,pinRow2Index(pin,aa.mValue)))
418  {
419  qDebug() << "move_pin_within_group failed";
420  return false;
421  }
422  // dumpPingroups();
423  break;
424  default:
425  break;
426  }
427  }
428 
429  finalizeUndoAction();
430 
431  return UserAction::exec();
432  }
433 
435  {
436  ActionPingroup* retval = nullptr;
437  for (u32 pinId : pinIds)
438  {
439  if (retval)
440  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pinId,"",grpId));
441  else
442  retval = new ActionPingroup(PinActionType::PinAsignToGroup,pinId,"",grpId);
443  if (pinRow >= 0)
444  retval->mPinActions.append(AtomicAction(PinActionType::PinMoveToRow,pinId,"",pinRow++));
445  }
446  if (retval)
448  return retval;
449  }
450 
452  {
453  QList<u32> pinIds;
454  pinIds << pinId;
455  return addPinsToExistingGroup(m,grpId,pinIds,pinRow);
456  }
457 
459  {
460  static int vid = -9;
462  if (!pinIds.isEmpty())
463  {
464  ModulePin* pin = m->get_pin_by_id(pinIds.first());
465  if (pin)
466  {
467  retval->mPinActions.append(AtomicAction(PinActionType::GroupDirChange,vid,"",(int)pin->get_direction()));
468  retval->mPinActions.append(AtomicAction(PinActionType::GroupTypeChange,vid,"",(int)pin->get_type()));
469  }
470  }
471  for (u32 pinId : pinIds)
472  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pinId,"",vid));
473 
474  if (grpRow >= 0)
475  retval->mPinActions.append(AtomicAction(PinActionType::GroupMoveToRow,vid,"",grpRow));
477  return retval;
478  }
479 
481  {
482  QList<u32> pinIds;
483  pinIds << pinId;
484  return addPinsToNewGroup(m,name,pinIds, grpRow);
485  }
486 
488  {
489  ActionPingroup* retval = nullptr;
490 
491  PinGroup<ModulePin>* groupToDelete = m->get_pin_group_by_id(grpId);
492  if (!groupToDelete) return retval;
493 
494  QMap<QString,int> existingGroups;
495  for (PinGroup<ModulePin>* pgroup : m->get_pin_groups())
496  existingGroups.insert(QString::fromStdString(pgroup->get_name()),pgroup->get_id());
497 
498  bool doNotDelete = false; // if there is a pin with the same name as the
499  int vid = -1;
500 
501  for (ModulePin* pin : groupToDelete->get_pins())
502  {
503  if (pin->get_name() == groupToDelete->get_name())
504  doNotDelete = true;
505  else
506  {
507  QString pinName = QString::fromStdString(pin->get_name());
508  auto it = existingGroups.find(pinName);
509  if (it == existingGroups.end())
510  {
511  if (retval)
512  retval->mPinActions.append(AtomicAction(PinActionType::GroupCreate,vid,pinName));
513  else
514  retval = new ActionPingroup(PinActionType::GroupCreate,vid,pinName);
515  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pin->get_id(),"",vid));
516  --vid;
517  }
518  else
519  {
520  if (retval)
521  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pin->get_id(),"",it.value()));
522  else
523  retval = new ActionPingroup(PinActionType::PinAsignToGroup,pin->get_id(),"",it.value());
524  }
525  }
526 
527  }
528 
529  if (!doNotDelete)
530  {
531  if (retval)
532  retval->mPinActions.append(AtomicAction(PinActionType::GroupDelete,groupToDelete->get_id()));
533  else
534  retval = new ActionPingroup(PinActionType::GroupDelete,groupToDelete->get_id());
535  }
536 
538  return retval;
539  }
540 
542  {
543  ActionPingroup* retval = nullptr;
544  QSet<QString> existingGroupNames;
545  for (PinGroup<ModulePin>* pgroup : m->get_pin_groups())
546  existingGroupNames.insert(QString::fromStdString(pgroup->get_name()));
547  int vid = -1;
548  QString basename;
549  for (u32 pinId : pinIds)
550  {
551  ModulePin* pin = m->get_pin_by_id(pinId);
552  if (!pin) return nullptr;
553  int count = 2;
554  QString name = basename = QString::fromStdString(pin->get_name());
555  while (existingGroupNames.contains(name))
556  name = QString("%1_%2").arg(basename).arg(count++);
557  if (retval)
558  retval->mPinActions.append(AtomicAction(PinActionType::GroupCreate,vid,name));
559  else
561  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pinId,"",vid));
562  --vid;
563  }
564  if (retval)
566  return retval;
567  }
568 
570  {
571  PinGroup<ModulePin>* pinGroup = m->get_pin_group_by_id(grpId);
572  if (!pinGroup) return nullptr;
573  bool toAscending = ! pinGroup->is_ascending();
574  std::vector<ModulePin*> pins = pinGroup->get_pins();
575  QString tempName = QUuid::createUuid().toString();
576  QString grpName = QString::fromStdString(pinGroup->get_name());
577  int grpRow = pinGroupRow(m, pinGroup);
578  static int vid = -9;
579 
580  ActionPingroup* retval = new ActionPingroup(PinActionType::GroupCreate,vid,tempName,toAscending ? 0 : -1);
581  if (toAscending)
582  {
583  for (auto it = pins.rbegin(); it != pins.rend(); ++it)
584  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup, (*it)->get_id(), QString(), vid));
585  }
586  else
587  {
588  for (auto it = pins.begin(); it != pins.end(); ++it)
589  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup, (*it)->get_id(), QString(), vid));
590  }
591 
592  // note: old group gets deleted after last pin gets moved. If that behavior changes insert following line:
593  // retval->mPinActions.append(AtomicAction(PinActionType::GroupDelete, grpId));
594 
595  retval->mPinActions.append(AtomicAction(PinActionType::GroupRename, vid, grpName));
596  retval->mPinActions.append(AtomicAction(PinActionType::GroupMoveToRow, vid, QString(), grpRow));
598  return retval;
599  }
600 
602  {
603  PinGroup<ModulePin>* pinGroup = m->get_pin_group_by_id(grpId);
604  if (!pinGroup) return nullptr;
605  std::vector<ModulePin*> pins = pinGroup->get_pins();
606 
607  ActionPingroup* retval = new ActionPingroup(PinActionType::GroupTypeChange, pinGroup->get_id(), "", ptype);
608  for (ModulePin* pin : pins)
609  retval->mPinActions.append(AtomicAction(PinActionType::PinTypeChange,pin->get_id(),"",ptype));
611  return retval;
612  }
613 
614  ActionPingroup::GroupRestore::GroupRestore(Module* m, PinGroup<ModulePin>* pgroup)
615  : mId(pgroup->get_id()),
616  mName(QString::fromStdString(pgroup->get_name())),
617  mRow(pinGroupRow(m,pgroup)),
618  mStartIndex(pgroup->get_start_index()),
619  mDirection(pgroup->get_direction()),
620  mType(pgroup->get_type())
621  {
622  if (!pgroup->is_ascending()) mStartIndex = -mStartIndex-1;
623  }
624 }
UserActionFactory for ActionPingroup.
UserAction * newAction() const
static ActionPingroupFactory * sFactory
Pingroup user actions.
static ActionPingroup * addPinToNewGroup(const Module *m, const QString &name, u32 pinId, int grpRow=-1)
static ActionPingroup * deletePinGroup(const Module *m, u32 grpId)
void readFromXml(QXmlStreamReader &xmlIn) override
static ActionPingroup * addPinToExistingGroup(const Module *m, u32 grpId, u32 pinId, int pinRow=-1)
void writeToXml(QXmlStreamWriter &xmlOut) const override
static ActionPingroup * addPinsToExistingGroup(const Module *m, u32 grpId, QList< u32 > pinIds, int pinRow=-1)
ActionPingroup(PinActionType::Type tp=PinActionType::None, int id=0, const QString &name=QString(), int value=0)
static ActionPingroup * toggleAscendingGroup(const Module *m, u32 grpId)
void addToHash(QCryptographicHash &cryptoHash) const override
static ActionPingroup * addPinsToNewGroup(const Module *m, const QString &name, QList< u32 > pinIds, int grpRow=-1)
static ActionPingroup * removePinsFromGroup(const Module *m, QList< u32 > pinIds)
bool exec() override
QString tagname() const override
static ActionPingroup * changePinGroupType(const Module *m, u32 grpId, int ptype)
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
i32 get_start_index() const
Definition: pin_group.h:315
u32 get_id() const
Definition: pin_group.h:130
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
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
int pinGroupIndex(const Module *mod, const PinGroup< ModulePin > *pgrp)
PinEvent
Definition: pin_event.h:42
int pinIndex2Row(const ModulePin *pin, int index)
int pinRow2Index(const ModulePin *pin, int row)
void dumpPingroups(Module *m=nullptr)
Netlist * gNetlist
Definition: plugin_gui.cpp:80
PinType
Definition: pin_type.h:36
QString generateGroupName(const Module *mod, const ModulePin *pin)
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)
T & first()
bool isEmpty() const const
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)