34 #ifndef MC2LIB_MEMCONSISTENCY_MODEL12_HPP_ 35 #define MC2LIB_MEMCONSISTENCY_MODEL12_HPP_ 42 namespace memconsistency {
58 template <
class FilterFunc>
62 for (
const auto& rf_tuples :
rf.
get()) {
63 const auto ws_reach =
ws.
Reachable(rf_tuples.first);
64 for (
const auto& ws_w : ws_reach.get()) {
65 for (
const auto& rf_r : rf_tuples.second.get()) {
66 if (filter_func(std::make_pair(rf_tuples.first, rf_r),
67 std::make_pair(rf_tuples.first, ws_w))) {
85 return t1.second.iiid.pid == t2.second.iiid.pid;
91 return t1.second.iiid.pid != t2.second.iiid.pid;
153 virtual std::unique_ptr<Checker> MakeChecker(
161 return ew.
ws | ew.
fr() | ppo(ew) | grf(ew) | ab(ew);
178 : arch_(arch), exec_(exec) {}
185 for (
const auto& tuples : exec_->rf.get()) {
186 if (!tuples.first.AnyType(arch_->EventTypeWrite())) {
187 throw Error(
"WF_RF_NOT_FROM_WRITE");
190 for (
const auto& e : tuples.second.get()) {
191 if (!e.AnyType(arch_->EventTypeRead()) || tuples.first.addr != e.addr) {
192 throw Error(
"WF_RF_NOT_SAME_LOC");
197 throw Error(
"WF_RF_MULTI_SOURCE");
205 std::unordered_set<types::Addr> addrs;
208 for (
const auto& tuples : exec_->ws.get()) {
209 addrs.insert(tuples.first.addr);
211 for (
const auto& e : tuples.second.get()) {
212 if (tuples.first.addr != e.addr) {
213 throw Error(
"WF_WS_NOT_SAME_LOC");
218 auto writes = exec_->events.Filter(
219 [&](
const Event& e) {
return e.
AnyType(arch_->EventTypeWrite()); });
220 if (!exec_->ws.StrictPartialOrder(writes)) {
221 throw Error(
"WF_WS_NOT_STRICT_PARTIAL_ORDER");
224 for (
const auto& addr : addrs) {
225 auto same_addr_writes =
226 writes.Filter([&](
const Event& e) {
return e.
addr == addr; });
227 if (!exec_->ws.ConnexOn(same_addr_writes)) {
228 throw Error(
"WF_WS_NOT_CONNEX");
233 virtual void wf()
const {
239 return (exec_->com() | exec_->po_loc()).Acyclic(cyclic);
243 return (exec_->rf | exec_->dp).Acyclic(cyclic);
247 return arch_->ghb(*exec_).Acyclic(cyclic);
253 if (!uniproc(cyclic)) {
254 throw Error(
"UNIPROC");
261 if (!check_exec(cyclic)) {
262 throw Error(
"CHECK_EXEC");
281 return std::unique_ptr<Checker>(
new Checker(arch, exec));
300 void Clear()
override { mfence.Clear(); }
304 return std::unique_ptr<Checker>(
new Checker(arch, exec));
317 if (mfence.empty()) {
331 return EventRelSeq({postar, mfence, postar}).EvalClear();
Definition: eventsets.hpp:227
virtual void Clear()
Definition: model12.hpp:148
bool AllType(Type type_mask) const
Definition: eventsets.hpp:209
bool AnyType(Type type_mask) const
Definition: eventsets.hpp:213
EventRel ws
Definition: model12.hpp:139
bool Transitive() const
Definition: sets.hpp:693
EventRel fr(FilterFunc filter_func) const
Definition: model12.hpp:59
virtual ~Checker()
Definition: model12.hpp:180
virtual void wf() const
Definition: model12.hpp:233
Set< Ts > Reachable(const Element &e) const
Definition: sets.hpp:656
virtual void wf_rf() const
Definition: model12.hpp:182
Event::Type EventTypeWrite() const override
Definition: model12.hpp:295
EventRel rfe() const
Definition: model12.hpp:101
EventRel fr() const
Definition: model12.hpp:77
EventRel rfi() const
Definition: model12.hpp:95
Definition: model12.hpp:277
Event::Type EventTypeWrite() const override
Definition: model12.hpp:336
Definition: model12.hpp:56
Definition: model12.hpp:144
EventRel ab(const ExecWitness &ew) const override
Definition: model12.hpp:316
EventRel wse() const
Definition: model12.hpp:113
EventRel grf(const ExecWitness &ew) const override
Definition: model12.hpp:289
const Element & Insert(const Element &e, bool assert_unique=false)
Definition: sets.hpp:112
std::uint32_t Type
Definition: eventsets.hpp:111
void Clear()
Definition: model12.hpp:126
Iiid iiid
Definition: eventsets.hpp:220
std::vector< Element > Path
Definition: sets.hpp:327
Event::Type EventTypeRead() const override
Definition: model12.hpp:334
std::pair< Element, Element > Tuple
Definition: sets.hpp:325
virtual bool uniproc(EventRel::Path *cyclic=nullptr) const
Definition: model12.hpp:238
Definition: eventsets.hpp:103
sets::RelationSeq< sets::Types< Event > > EventRelSeq
Definition: eventsets.hpp:225
std::unique_ptr< Checker > MakeChecker(const Architecture *arch, const ExecWitness *exec) const override
Definition: model12.hpp:279
static constexpr Properties kReflexiveClosure
Definition: sets.hpp:341
void Clear()
Definition: sets.hpp:156
bool Contains(const Element &e) const
Definition: sets.hpp:158
Relation Eval() const
Definition: sets.hpp:475
Checker(const Architecture *arch, const ExecWitness *exec)
Definition: model12.hpp:177
Definition: model12.hpp:298
virtual bool check_exec(EventRel::Path *cyclic=nullptr) const
Definition: model12.hpp:246
virtual void wf_ws() const
Definition: model12.hpp:204
EventSet events
Definition: model12.hpp:135
const Container & get() const
Definition: sets.hpp:355
EventRel fre() const
Definition: model12.hpp:89
std::unique_ptr< Checker > MakeChecker(const Architecture *arch, const ExecWitness *exec) const override
Definition: model12.hpp:302
EventRel ab(const ExecWitness &ew) const override
Definition: model12.hpp:291
virtual bool thin(EventRel::Path *cyclic=nullptr) const
Definition: model12.hpp:242
virtual void valid_exec(EventRel::Path *cyclic=nullptr) const
Definition: model12.hpp:250
EventRel rf
Definition: model12.hpp:138
EventRel po
Definition: model12.hpp:136
EventRel com() const
Definition: model12.hpp:119
sets::Relation< sets::Types< Event > > EventRel
Definition: eventsets.hpp:224
Definition: model12.hpp:175
EventRel po_loc() const
Definition: model12.hpp:121
void Clear() override
Definition: model12.hpp:300
types::Addr addr
Definition: eventsets.hpp:218
const ExecWitness * exec_
Definition: model12.hpp:268
Relation Filter(FilterFunc filterFunc) const
Definition: sets.hpp:511
EventRel ppo(const ExecWitness &ew) const override
Definition: model12.hpp:284
void Insert(const Element &e1, const Element &e2, bool assert_unique=false)
Definition: sets.hpp:384
static constexpr Type kRead
Definition: eventsets.hpp:118
virtual ~Architecture()
Definition: model12.hpp:146
static constexpr Type kWrite
Definition: eventsets.hpp:119
types::Pid pid
Definition: eventsets.hpp:99
virtual EventRel ghb(const ExecWitness &ew) const
Definition: model12.hpp:160
Event::Type EventTypeRead() const override
Definition: model12.hpp:293
EventRel grf(const ExecWitness &ew) const override
Definition: model12.hpp:314
EventRel mfence
Definition: model12.hpp:339
EventRel fri() const
Definition: model12.hpp:83
const Architecture * arch_
Definition: model12.hpp:267
EventRel ppo(const ExecWitness &ew) const override
Definition: model12.hpp:307
EventRel wsi() const
Definition: model12.hpp:107
EventRel dp
Definition: model12.hpp:137
void Clear()
Definition: sets.hpp:596