HAL
pin_event.cpp
Go to the documentation of this file.
4 #include <algorithm>
5 #include <assert.h>
6 
7 namespace hal {
8 
9  template<>
10  std::map<PinEvent, std::string> EnumStrings<PinEvent>::data = {
11  {PinEvent::unknown, "unknown"},
12  {PinEvent::GroupCreate, "GroupCreate"},
13  {PinEvent::GroupReorder, "GroupReorder"},
14  {PinEvent::GroupRename, "GroupRename"},
15  {PinEvent::GroupTypeChange, "GroupTypeChange"},
16  {PinEvent::GroupDirChange, "GroupDirChange"},
17  {PinEvent::GroupDelete, "GroupDelete"},
18  {PinEvent::PinCreate, "PinCreate"},
19  {PinEvent::PinReorder, "PinReorder"},
20  {PinEvent::PinAssignToGroup, "PinAssignToGroup"},
21  {PinEvent::PinRename, "PinRename"},
22  {PinEvent::PinTypeChange, "PinTypeChange"},
23  {PinEvent::PinDirChange, "PinDirChange"},
24  {PinEvent::PinDelete, "PinDelete"}
25  };
26 
27  std::unordered_map<Module*,PinChangedEvent::EventStack*> PinChangedEvent::s_event_stack;
28  u64 PinChangedEvent::s_order = 0;
29 
31  : m_module(m), m_event(pev), m_id(id), m_order(++s_order)
32  {;}
33 
35  {
36  auto it = s_event_stack.find(m_module);
37  if (it == s_event_stack.end())
38  {
39  // not stacked, send event immediately
41  return;
42  }
43 
44  // put event on stack to emit it later
45  it->second->push_back(*this);
46  }
47 
49  {
50  return m_module;
51  }
52 
54  {
55  return (m_id << 4) | (((u32)m_event)&0xF);
56  }
57 
59  {
60  if (a.m_event < b.m_event) return true;
61  if (a.m_event > b.m_event) return false;
62  if (a.m_event == PinEvent::PinAssignToGroup)
63  return a.m_order > b.m_order; // revert order for descending pin groups
64  return a.m_id<b.m_id;
65  }
66 
67  void PinChangedEvent::EventStack::send_events(Module* m)
68  {
69  std::sort(begin(),end(),pin_event_order);
70  for (auto it=begin(); it != end(); ++it)
71  m->get_event_handler()->notify(ModuleEvent::event::pin_changed, m, it->associated_data());
72  }
73 
75  : m_module(m)
76  {
77  auto it = PinChangedEvent::s_event_stack.find(m);
78  if (it == PinChangedEvent::s_event_stack.end())
79  PinChangedEvent::s_event_stack[m] = new PinChangedEvent::EventStack;
80  else
81  ++it->second->m_count;
82  }
83 
85  {
86  auto it = PinChangedEvent::s_event_stack.find(m_module);
87  assert(it != PinChangedEvent::s_event_stack.end());
88  if (it->second->m_count > 0)
89  --it->second->m_count;
90  else
91  {
92  delete it->second;
93  PinChangedEvent::s_event_stack.erase(it);
94  }
95  }
96 
98  {
99  auto it = PinChangedEvent::s_event_stack.find(m_module);
100  assert(it != PinChangedEvent::s_event_stack.end());
101  if (it->second->m_count > 0) // do not send yet
102  return;
103  it->second->send_events(m_module);
104  }
105 }
NETLIST_API void notify(NetlistEvent::event ev, Netlist *netlist, u32 associated_data=0xFFFFFFFF)
@ pin_changed
associated_data = [4LSB: type of action] [28HSB: id of pin group or pin]
EventHandler * get_event_handler() const
Definition: module.cpp:1908
PinChangedEvent(Module *m, PinEvent pev, u32 id)
Definition: pin_event.cpp:30
Module * get_module() const
Definition: pin_event.cpp:48
PinChangedEventScope(Module *m)
Definition: pin_event.cpp:74
uint64_t u64
Definition: defines.h:42
PinEvent
Definition: pin_event.h:42
@ PinTypeChange
pin renamed
@ GroupReorder
changed PinDirection attribute of group (like input)
@ PinDirChange
changed PinType attribute of pin (like data)
@ PinCreate
moved group to a new position within containing module
@ GroupTypeChange
pin group renamed
@ PinRename
pin assigned to new group
@ PinAssignToGroup
new pin created
@ PinDelete
moved pin to a new position within containing group
@ GroupRename
new pin group created
@ GroupDelete
pin deleted
@ GroupDirChange
changed PinType attribute of group (like data)
@ PinReorder
changed PinDirection attribute of pin (like input)
bool pin_event_order(const PinChangedEvent &a, const PinChangedEvent &b)
Definition: pin_event.cpp:58
quint32 u32
i32 id