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 
30  : m_module(m), m_event(pev), m_id(id)
31  {;}
32 
34  {
35  auto it = s_event_stack.find(m_module);
36  if (it == s_event_stack.end())
37  {
38  // not stacked, send event immediately
40  return;
41  }
42 
43  // put event on stack to emit it later
44  it->second->push_back(*this);
45  }
46 
48  {
49  return m_module;
50  }
51 
53  {
54  return (m_id << 4) | (((u32)m_event)&0xF);
55  }
56 
58  {
59  if (a.m_event < b.m_event) return true;
60  if (a.m_event > b.m_event) return false;
61  return a.m_id<b.m_id;
62  }
63 
64  void PinChangedEvent::EventStack::send_events(Module* m)
65  {
66  std::sort(begin(),end(),pin_event_order);
67  for (auto it=begin(); it != end(); ++it)
68  m->get_event_handler()->notify(ModuleEvent::event::pin_changed, m, it->associated_data());
69  }
70 
72  : m_module(m)
73  {
74  auto it = PinChangedEvent::s_event_stack.find(m);
75  if (it == PinChangedEvent::s_event_stack.end())
76  PinChangedEvent::s_event_stack[m] = new PinChangedEvent::EventStack;
77  else
78  ++it->second->m_count;
79  }
80 
82  {
83  auto it = PinChangedEvent::s_event_stack.find(m_module);
84  assert(it != PinChangedEvent::s_event_stack.end());
85  if (it->second->m_count > 0)
86  --it->second->m_count;
87  else
88  {
89  delete it->second;
90  PinChangedEvent::s_event_stack.erase(it);
91  }
92  }
93 
95  {
96  auto it = PinChangedEvent::s_event_stack.find(m_module);
97  assert(it != PinChangedEvent::s_event_stack.end());
98  if (it->second->m_count > 0) // do not send yet
99  return;
100  it->second->send_events(m_module);
101  }
102 }
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:1899
PinChangedEvent(Module *m, PinEvent pev, u32 id)
Definition: pin_event.cpp:29
Module * get_module() const
Definition: pin_event.cpp:47
PinChangedEventScope(Module *m)
Definition: pin_event.cpp:71
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:57
quint32 u32
i32 id