34 #ifndef MC2LIB_CODEGEN_CATS_HPP_ 35 #define MC2LIB_CODEGEN_CATS_HPP_ 42 #include <unordered_map> 44 #include "../memconsistency/cats.hpp" 52 template <
class T1,
class T2>
53 constexpr
bool lt__(T1 a, T2 b) {
88 std::numeric_limits<types::Poi>::max() - (kMaxOpEvents - 1);
91 std::numeric_limits<types::WriteID>::min();
95 (
lt__(std::numeric_limits<types::WriteID>::max(), kMinOther)
96 ? std::numeric_limits<types::WriteID>::max()
100 static_assert(kMinOther > kMaxWrite,
"Invalid read/write ID limits!");
118 template <std::
size_t max_size_bytes,
class Func>
120 std::size_t size, Func mkevt) {
121 static_assert(max_size_bytes <= kMaxOpSize,
"Invalid size!");
122 static_assert(
sizeof(
types::WriteID) <= max_size_bytes,
"Invalid size!");
125 assert(size <= max_size_bytes);
145 template <std::
size_t max_size_bytes = sizeof(types::WriteID)>
148 std::size_t size = max_size_bytes) {
152 return MakeEvent<max_size_bytes>(pid, type, size, [&](
types::Addr offset) {
156 return &
ew_->events.Insert(event,
true);
160 template <std::
size_t max_size_bytes = sizeof(types::WriteID)>
163 std::size_t size = max_size_bytes) {
167 return MakeEvent<max_size_bytes>(pid, type, size, [&](
types::Addr offset) {
173 *(data + offset) = write_id;
174 return (
writes_[write_id] = &
ew_->events.Insert(event,
true));
178 template <std::
size_t max_size_bytes = sizeof(types::WriteID)>
182 std::size_t size = max_size_bytes) {
183 static_assert(max_size_bytes <= kMaxOpSize,
"Invalid size!");
184 static_assert(
sizeof(
types::WriteID) <= max_size_bytes,
"Invalid size!");
187 assert(size <= max_size_bytes);
193 result.fill(
nullptr);
196 WriteID_EventPtr::const_iterator write;
198 const bool valid = from_id[i] != kInitWrite &&
200 write->second->addr == addr &&
201 write->second->iiid != after[i]->iiid;
203 result[i] = write->second;
205 if (from_id[i] != kInitWrite) {
215 std::ostringstream oss;
216 oss << __func__ <<
": Invalid write!" 217 <<
" A=" << std::hex << addr <<
" S=" << size;
220 oss << ((write->second->addr != addr) ?
" (addr mismatch)" :
"")
221 << ((write->second->iiid == after[i]->iiid) ?
" (same iiid)" 225 throw std::logic_error(oss.str());
229 result[i] = &
ew_->events.Insert(initial);
238 mc::cats::ExecWitness *
ew() {
return ew_; }
240 const mc::cats::ExecWitness *
ew()
const {
return ew_; }
244 const mc::cats::Architecture *
arch()
const {
return arch_; }
259 typedef std::unordered_map<types::WriteID, const mc::Event *>
262 mc::cats::ExecWitness *
ew_;
static constexpr std::size_t kMaxOpSize
Definition: cats.hpp:81
std::unordered_map< types::WriteID, const mc::Event * > WriteID_EventPtr
Definition: cats.hpp:260
Types< true >::Poi Poi
Program order index type.
Definition: types.hpp:76
EvtStateCats(mc::cats::ExecWitness *ew, mc::cats::Architecture *arch)
Definition: cats.hpp:102
void set_addr_mask(types::Addr val)
Definition: cats.hpp:254
Interface to memconsistency::cats data structures.
Definition: cats.hpp:78
Definition: eventsets.hpp:53
const mc::cats::Architecture * arch() const
Definition: cats.hpp:244
mc::cats::Architecture * arch_
Definition: cats.hpp:263
EventPtrs< max_size_bytes > MakeWrite(types::Pid pid, mc::Event::Type type, types::Addr addr, types::WriteID *data, std::size_t size=max_size_bytes)
Definition: cats.hpp:161
void Reset()
Definition: cats.hpp:105
types::Addr addr_mask_
Definition: cats.hpp:270
EventPtrs< max_size_bytes > MakeRead(types::Pid pid, mc::Event::Type type, types::Addr addr, std::size_t size=max_size_bytes)
Definition: cats.hpp:146
types::Addr addr_mask() const
Definition: cats.hpp:256
mc::cats::ExecWitness * ew()
Definition: cats.hpp:238
static constexpr std::size_t kMaxOpEvents
Definition: cats.hpp:82
static constexpr types::WriteID kInitWrite
Definition: cats.hpp:90
types::WriteID last_write_id_
Definition: cats.hpp:267
Definition: eventsets.hpp:103
mc::cats::ExecWitness * ew_
Definition: cats.hpp:262
static constexpr types::Poi kMaxOther
Definition: cats.hpp:87
WriteID_EventPtr writes_
Definition: cats.hpp:265
constexpr bool lt__(T1 a, T2 b)
Definition: cats.hpp:53
static constexpr types::WriteID kMinWrite
Definition: cats.hpp:92
std::array< const mc::Event *, max_size_bytes/sizeof(types::WriteID)> EventPtrs
Definition: compiler.hpp:64
mc::cats::Architecture * arch()
Definition: cats.hpp:242
Types< true >::WriteID WriteID
Write ID type.
Definition: types.hpp:86
static constexpr types::Poi kMinOther
Definition: cats.hpp:85
Types< true >::Addr Addr
Address type.
Definition: types.hpp:66
EventPtrs< max_size_bytes > GetWrite(const EventPtrs< max_size_bytes > &after, types::Addr addr, const types::WriteID *from_id, std::size_t size=max_size_bytes)
Definition: cats.hpp:179
const mc::cats::ExecWitness * ew() const
Definition: cats.hpp:240
static constexpr types::WriteID kMaxWrite
Definition: cats.hpp:94
types::Poi last_other_id
Definition: cats.hpp:268
Types< true >::Pid Pid
Processor/thread ID type.
Definition: types.hpp:71
mc::Event MakeOther(types::Pid pid, mc::Event::Type type, types::Addr addr)
Definition: cats.hpp:139
EventPtrs< max_size_bytes > MakeEvent(types::Pid pid, mc::Event::Type type, std::size_t size, Func mkevt)
Definition: cats.hpp:119
bool Exhausted() const
Definition: cats.hpp:114