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  if (pgroup->get_type() != PinType::none)
362  mTempUndoActions.append(QList<AtomicAction>({
363  AtomicAction(PinActionType::GroupTypeChange,pgroup->get_id(),"",(int)pgroup->get_type())}));
364  if (!mParentModule->set_pin_group_type(pgroup, (PinType) aa.mValue))
365  return false;
366  break;
368  if (pgroup->get_direction() != PinDirection::none)
369  mTempUndoActions.append(QList<AtomicAction>({
370  AtomicAction(PinActionType::GroupDirChange,pgroup->get_id(),"",(int)pgroup->get_direction())}));
371  if (!mParentModule->set_pin_group_direction(pgroup, (PinDirection) aa.mValue))
372  return false;
373  break;
375  mTempUndoActions.append(QList<AtomicAction>({
376  AtomicAction(PinActionType::PinAsignToGroup,aa.mId,"",pin->get_group().first->get_id()),
377  AtomicAction(PinActionType::PinMoveToRow,aa.mId,"",ActionPingroup::pinIndex2Row(pin,pin->get_group().second))}));
378  mPinsMoved.insert(aa.mId);
379  pgroup = getGroup(aa.mValue);
380  if (!pgroup) return false;
381  if (!mParentModule->assign_pin_to_group(pgroup,pin))
382  {
383  qDebug() << "assign_pin_to_group failed";
384  return false;
385  }
386  // dumpPingroups();
387  break;
389  mTempUndoActions.append(QList<AtomicAction>({
390  AtomicAction(PinActionType::PinRename,aa.mId, QString::fromStdString(pin->get_name()))}));
391  if (!mParentModule->set_pin_name(pin, aa.mName.toStdString()))
392  return false;
393  break;
395  mTempUndoActions.append(QList<AtomicAction>({
396  AtomicAction(PinActionType::PinTypeChange,aa.mId,"",(int)pin->get_type())}));
397  if (!mParentModule->set_pin_type(pin, (PinType) aa.mValue))
398  return false;
399  break;
401  if (!mPinsMoved.contains(aa.mId))
402  mTempUndoActions.append(QList<AtomicAction>({
403  AtomicAction(PinActionType::PinMoveToRow,aa.mId,"",ActionPingroup::pinIndex2Row(pin,pin->get_group().second))}));
404  pgroup = pin->get_group().first;
405  if (!mParentModule->move_pin_within_group(pgroup,pin,ActionPingroup::pinRow2Index(pin,aa.mValue)))
406  {
407  qDebug() << "move_pin_within_group failed";
408  return false;
409  }
410  // dumpPingroups();
411  break;
412  default:
413  break;
414  }
415  }
416 
417  finalizeUndoAction();
418 
419  return UserAction::exec();
420  }
421 
422  ActionPingroup* ActionPingroup::addPinsToExistingGroup(const Module *m, u32 grpId, QList<u32> pinIds, int pinRow)
423  {
424  ActionPingroup* retval = nullptr;
425  for (u32 pinId : pinIds)
426  {
427  if (retval)
428  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pinId,"",grpId));
429  else
430  retval = new ActionPingroup(PinActionType::PinAsignToGroup,pinId,"",grpId);
431  if (pinRow >= 0)
432  retval->mPinActions.append(AtomicAction(PinActionType::PinMoveToRow,pinId,"",pinRow++));
433  }
434  if (retval)
435  retval->setObject(UserActionObject(m->get_id(),UserActionObjectType::Module));
436  return retval;
437  }
438 
439  ActionPingroup* ActionPingroup::addPinToExistingGroup(const Module* m, u32 grpId, u32 pinId, int pinRow)
440  {
441  QList<u32> pinIds;
442  pinIds << pinId;
443  return addPinsToExistingGroup(m,grpId,pinIds,pinRow);
444  }
445 
446  ActionPingroup* ActionPingroup::addPinsToNewGroup(const Module* m, const QString& name, QList<u32> pinIds, int grpRow)
447  {
448  static int vid = -9;
449  ActionPingroup* retval = new ActionPingroup(PinActionType::GroupCreate,vid,name);
450  if (!pinIds.isEmpty())
451  {
452  ModulePin* pin = m->get_pin_by_id(pinIds.first());
453  if (pin)
454  {
455  retval->mPinActions.append(AtomicAction(PinActionType::GroupDirChange,vid,"",(int)pin->get_direction()));
456  retval->mPinActions.append(AtomicAction(PinActionType::GroupTypeChange,vid,"",(int)pin->get_type()));
457  }
458  }
459  for (u32 pinId : pinIds)
460  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pinId,"",vid));
461 
462  if (grpRow >= 0)
463  retval->mPinActions.append(AtomicAction(PinActionType::GroupMoveToRow,vid,"",grpRow));
464  retval->setObject(UserActionObject(m->get_id(),UserActionObjectType::Module));
465  return retval;
466  }
467 
468  ActionPingroup* ActionPingroup::addPinToNewGroup(const Module *m, const QString& name, u32 pinId, int grpRow)
469  {
470  QList<u32> pinIds;
471  pinIds << pinId;
472  return addPinsToNewGroup(m,name,pinIds, grpRow);
473  }
474 
475  ActionPingroup* ActionPingroup::deletePinGroup(const Module *m, u32 grpId)
476  {
477  ActionPingroup* retval = nullptr;
478 
479  PinGroup<ModulePin>* groupToDelete = m->get_pin_group_by_id(grpId);
480  if (!groupToDelete) return retval;
481 
482  QMap<QString,int> existingGroups;
483  for (PinGroup<ModulePin>* pgroup : m->get_pin_groups())
484  existingGroups.insert(QString::fromStdString(pgroup->get_name()),pgroup->get_id());
485 
486  bool doNotDelete = false; // if there is a pin with the same name as the
487  int vid = -1;
488 
489  std::vector<ModulePin*> orderedPins = groupToDelete->get_pins();
490  if (groupToDelete->is_descending())
491  std::reverse(orderedPins.begin(), orderedPins.end());
492 
493  for (ModulePin* pin : orderedPins)
494  {
495  if (pin->get_name() == groupToDelete->get_name())
496  doNotDelete = true;
497  else
498  {
499  QString pinName = QString::fromStdString(pin->get_name());
500  auto it = existingGroups.find(pinName);
501  if (it == existingGroups.end())
502  {
503  if (retval)
504  retval->mPinActions.append(AtomicAction(PinActionType::GroupCreate,vid,pinName));
505  else
506  retval = new ActionPingroup(PinActionType::GroupCreate,vid,pinName);
507  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pin->get_id(),"",vid));
508  if (pin->get_direction() != PinDirection::none)
509  retval->mPinActions.append(AtomicAction(PinActionType::GroupDirChange,vid,"",(int)pin->get_direction()));
510  if (pin->get_type() != PinType::none)
511  retval->mPinActions.append(AtomicAction(PinActionType::GroupTypeChange,vid,"",(int)pin->get_type()));
512  --vid;
513  }
514  else
515  {
516  if (retval)
517  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pin->get_id(),"",it.value()));
518  else
519  retval = new ActionPingroup(PinActionType::PinAsignToGroup,pin->get_id(),"",it.value());
520  }
521  }
522 
523  }
524 
525  if (!doNotDelete)
526  {
527  if (retval)
528  retval->mPinActions.append(AtomicAction(PinActionType::GroupDelete,groupToDelete->get_id()));
529  else
530  retval = new ActionPingroup(PinActionType::GroupDelete,groupToDelete->get_id());
531  }
532 
533  retval->setObject(UserActionObject(m->get_id(),UserActionObjectType::Module));
534  return retval;
535  }
536 
537  ActionPingroup* ActionPingroup::removePinsFromGroup(const Module* m, QList<u32> pinIds)
538  {
539  ActionPingroup* retval = nullptr;
540  QSet<QString> existingGroupNames;
541  for (PinGroup<ModulePin>* pgroup : m->get_pin_groups())
542  existingGroupNames.insert(QString::fromStdString(pgroup->get_name()));
543  int vid = -1;
544  QString basename;
545  for (u32 pinId : pinIds)
546  {
547  ModulePin* pin = m->get_pin_by_id(pinId);
548  if (!pin) return nullptr;
549  int count = 2;
550  QString name = basename = QString::fromStdString(pin->get_name());
551  while (existingGroupNames.contains(name))
552  name = QString("%1_%2").arg(basename).arg(count++);
553  if (retval)
554  retval->mPinActions.append(AtomicAction(PinActionType::GroupCreate,vid,name));
555  else
556  retval = new ActionPingroup(PinActionType::GroupCreate,vid,name);
557  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup,pinId,"",vid));
558  if (pin->get_direction() != PinDirection::none)
559  retval->mPinActions.append(AtomicAction(PinActionType::GroupDirChange,vid,"",(int)pin->get_direction()));
560  if (pin->get_type() != PinType::none)
561  retval->mPinActions.append(AtomicAction(PinActionType::GroupTypeChange,vid,"",(int)pin->get_type()));
562  --vid;
563  }
564  if (retval)
565  retval->setObject(UserActionObject(m->get_id(),UserActionObjectType::Module));
566  return retval;
567  }
568 
569  ActionPingroup* ActionPingroup::automaticallyRenamePins(const Module* m, u32 grpId)
570  {
571  PinGroup<ModulePin>* pinGroup = m->get_pin_group_by_id(grpId);
572  if (!pinGroup) return nullptr;
573  QString baseName = QString::fromStdString(pinGroup->get_name());
574  QHash<u32,QString> assignedNameHash;
575  ActionPingroup* retval = nullptr;
576 
577  QList<AtomicAction> renameActions;
578  for (ModulePin* pin : pinGroup->get_pins())
579  {
580  QString designatedName = QString("%1(%2)").arg(baseName).arg(pin->get_group().second);
581  if (pin->get_name() == designatedName.toStdString()) continue; // nothing to do
582 
583  renameActions.append(AtomicAction(PinActionType::PinRename, pin->get_id(), designatedName));
584  if (retval)
585  retval->mPinActions.append(AtomicAction(PinActionType::PinRename,pin->get_id(),"temp_" + QUuid::createUuid().toString(QUuid::Id128)));
586  else
587  retval = new ActionPingroup(PinActionType::PinRename,pin->get_id(),"temp_" + QUuid::createUuid().toString(QUuid::Id128));
588  }
589 
590  if (retval)
591  {
592  for (const AtomicAction& aa : renameActions)
593  retval->mPinActions.append(aa);
594  retval->setObject(UserActionObject(m->get_id(),UserActionObjectType::Module));
595  }
596 
597  return retval;
598  }
599 
600  ActionPingroup* ActionPingroup::toggleAscendingGroup(const Module* m, u32 grpId)
601  {
602  PinGroup<ModulePin>* pinGroup = m->get_pin_group_by_id(grpId);
603  if (!pinGroup) return nullptr;
604  bool toAscending = ! pinGroup->is_ascending();
605  int val = (pinGroup->get_lowest_index() << 1) | (toAscending ? 1 : 0);
606  std::vector<ModulePin*> pins = pinGroup->get_pins();
607  QString tempName = "temp_" + QUuid::createUuid().toString(QUuid::Id128);
608  QString grpName = QString::fromStdString(pinGroup->get_name());
609  int grpRow = pinGroupRow(m, pinGroup);
610  static int vid = -9;
611 
612  ActionPingroup* retval = new ActionPingroup(PinActionType::GroupCreate,vid,tempName,val);
613  if (pinGroup->get_direction() != PinDirection::none)
614  retval->mPinActions.append(AtomicAction(PinActionType::GroupDirChange, vid, "", (int)pinGroup->get_direction()));
615  if (pinGroup->get_type() != PinType::none)
616  retval->mPinActions.append(AtomicAction(PinActionType::GroupTypeChange, vid, "", (int)pinGroup->get_type()));
617  if (toAscending)
618  {
619  for (auto it = pins.rbegin(); it != pins.rend(); ++it)
620  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup, (*it)->get_id(), QString(), vid));
621  }
622  else
623  {
624  for (auto it = pins.begin(); it != pins.end(); ++it)
625  retval->mPinActions.append(AtomicAction(PinActionType::PinAsignToGroup, (*it)->get_id(), QString(), vid));
626  }
627 
628  // note: old group gets deleted after last pin gets moved. If that behavior changes insert following line:
629  // retval->mPinActions.append(AtomicAction(PinActionType::GroupDelete, grpId));
630 
631  retval->mPinActions.append(AtomicAction(PinActionType::GroupRename, vid, grpName));
632  retval->mPinActions.append(AtomicAction(PinActionType::GroupMoveToRow, vid, QString(), grpRow));
633  retval->setObject(UserActionObject(m->get_id(),UserActionObjectType::Module));
634  return retval;
635  }
636 
637  ActionPingroup* ActionPingroup::changePinGroupType(const Module* m, u32 grpId, int ptype)
638  {
639  PinGroup<ModulePin>* pinGroup = m->get_pin_group_by_id(grpId);
640  if (!pinGroup) return nullptr;
641  std::vector<ModulePin*> pins = pinGroup->get_pins();
642 
643  ActionPingroup* retval = new ActionPingroup(PinActionType::GroupTypeChange, pinGroup->get_id(), "", ptype);
644  for (ModulePin* pin : pins)
645  retval->mPinActions.append(AtomicAction(PinActionType::PinTypeChange,pin->get_id(),"",ptype));
646  retval->setObject(UserActionObject(m->get_id(), UserActionObjectType::Module));
647  return retval;
648  }
649 
650  ActionPingroup::GroupRestore::GroupRestore(Module* m, PinGroup<ModulePin>* pgroup)
651  : mId(pgroup->get_id()),
652  mName(QString::fromStdString(pgroup->get_name())),
653  mRow(pinGroupRow(m,pgroup)),
654  mStartIndex( (pgroup->get_lowest_index() << 1) | (pgroup->is_ascending() ? 1 : 0)),
655  mDirection(pgroup->get_direction()),
656  mType(pgroup->get_type())
657  {;}
658 }
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 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 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
std::string toStdString() 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)