bmv2
Designing your own switch target with bmv2
|
Go to the documentation of this file.
35 #ifndef BM_BM_SIM_STATEFUL_H_
36 #define BM_BM_SIM_STATEFUL_H_
41 #include <unordered_set>
42 #include <unordered_map>
45 #include <boost/thread/locks.hpp>
50 #include "short_alloc.h"
60 enum RegisterErrorCode {
62 INVALID_REGISTER_NAME,
70 void export_bytes()
override;
79 using register_array_id_t = p4object_id_t;
93 friend class RegisterSync;
97 using iterator = std::vector<Register>::iterator;
98 using const_iterator = std::vector<Register>::const_iterator;
100 using UniqueLock = std::unique_lock<std::mutex>;
107 size_t size,
int bitwidth);
111 assert(idx <
size());
112 return registers[idx];
117 assert(idx <
size());
118 return registers[idx];
124 return registers.at(idx);
129 return registers.at(idx);
135 iterator
begin() {
return registers.begin(); }
138 const_iterator
begin()
const {
return registers.begin(); }
141 iterator
end() {
return registers.end(); }
144 const_iterator
end()
const {
return registers.end(); }
148 size_t size()
const {
return registers.size(); }
165 void unlock(UniqueLock &lock)
const { lock.unlock(); }
168 void notify(
const Register ®)
const;
170 std::vector<Register> registers{};
171 mutable std::mutex m_mutex{};
173 std::vector<Notifier> notifiers{};
183 using Lock = RegisterArray::UniqueLock;
185 template <
size_t NumLocks = 4>
186 using LockVector = std::vector<
187 Lock, ::detail::short_alloc<Lock, NumLocks *
sizeof(Lock),
alignof(Lock)> >;
189 struct RegisterLocks {
190 LockVector<>::allocator_type::arena_type a;
194 void add_register_array(
const RegisterArray *register_array);
196 void merge_from(
const RegisterSync &other);
199 void lock(RegisterLocks *RL)
const {
200 for (
auto m : mutexes) RL->v.emplace_back(*m, std::defer_lock);
201 boost::lock(RL->v.begin(), RL->v.end());
205 mutable std::vector<std::mutex *> mutexes{};
206 std::unordered_set<const RegisterArray *> register_arrays{};
211 #endif // BM_BM_SIM_STATEFUL_H_
Definition: named_p4object.h:39
const_iterator end() const
NC.
Definition: stateful.h:144
const_iterator begin() const
NC.
Definition: stateful.h:138
iterator end()
NC.
Definition: stateful.h:141
std::function< void(size_t idx)> Notifier
Definition: stateful.h:104
Definition: stateful.h:58
void register_notifier(Notifier notifier)
Definition: stateful.h:92
UniqueLock unique_lock() const
Definition: stateful.h:163
Register & operator[](size_t idx)
Access the register at position idx, asserts if bad idx.
Definition: stateful.h:110
Register & at(size_t idx)
Definition: stateful.h:123
const Register & operator[](size_t idx) const
Access the register at position idx, asserts if bad idx.
Definition: stateful.h:116
iterator begin()
NC.
Definition: stateful.h:135
const Register & at(size_t idx) const
Definition: stateful.h:128
size_t size() const
Definition: stateful.h:148