MemSynth results: PowerPC
Initial synthesized model
(define ppo
(& po (- (& (+ (- po dp) (& po dp)) (-> (- MemoryEvent Writes) (+ MemoryEvent Reads))) (- (+ (-> Reads Reads) (-> Reads Writes)) (& po dp)))))
(define grf
(-> none none))
; let-expressions inserted manually for readability
(define fences
(let ([poFpo (join (:> po Syncs) po)]
[poLFpo (join (:> po Lwsyncs) po)]
[RE+WW (+ (-> Reads MemoryEvent) (-> Writes Writes))])
(+
(<:
(+ Reads (join (+ rf poFpo) (+ Reads Writes)))
(+ (:> (join poFpo rf) Reads) (+ poFpo (join rf poFpo))))
(:> (<: (+ Reads Writes)
(+ (& RE+WW poLFpo) (join (& RE+WW poLFpo) rf)))
(+ (+ Writes (join (& RE+WW poLFpo) Writes))
(:> (join Reads (& RE+WW poLFpo)) Reads))))))
(define PPC_0 (make-model ppo grf fences))
Distinguishing litmus tests
Also available in Herd format: browse.
Test ppc/ambig/1
=============================
P0 | P1
-----------------------------
r1 <- [B] | r2 <- [A]
sync | r3 <- r2 ^ r2
[A] <- 1 | [B+r3] <- 1
=============================
r1=1 /\ r2=1
Test ppc/ambig/2
=============================
P0 | P1
-----------------------------
r1 <- [B] | r2 <- [A]
lwsync | r3 <- r2 ^ r2
[A] <- 1 | [B+r3] <- 1
=============================
r1=1 /\ r2=1
Test ppc/ambig/3
=====================
P0 | P1
---------------------
r1 <- [B] | r2 <- [A]
lwsync | lwsync
[A] <- 1 | [B] <- 1
=====================
r1=1 /\ r2=1
Test ppc/ambig/4
=============================
P0 | P1
-----------------------------
r1 <- [B] | r3 <- [A]
sync | lwsync
r2 <- r1 ^ r1 | [B] <- 1
[A+r2] <- 1 |
=============================
r1=1 /\ r3=1
Test ppc/ambig/5
=============================
P0 | P1
-----------------------------
r1 <- [A] | [B] <- 1
r2 <- r1 ^ r1 | lwsync
r3 <- [B+r2] | [A] <- 1
r4 <- [B] |
=============================
r1=1 /\ r3=0 /\ r4=1
Test ppc/ambig/6
=============================
P0 | P1
-----------------------------
r1 <- [B] | r2 <- [A]
sync | r3 <- r2 ^ r2
lwsync | [B+r3] <- 1
[A] <- 1 |
=============================
r1=1 /\ r2=1
Test ppc/ambig/7
=============================
P0 | P1
-----------------------------
r1 <- [B] | r3 <- [A]
r2 <- r1 ^ r1 | r4 <- r3 ^ r3
[A+r2] <- 1 | [B+r4] <- 1
sync |
[A] <- 1 |
=============================
r1=1 /\ r3=1
Test ppc/ambig/8
=============================
P0 | P1
-----------------------------
r1 <- [B] | r4 <- [A]
sync | r5 <- r4 ^ r4
[A] <- 1 | [B+r5] <- 1
r2 <- r1 ^ r1 |
r3 <- [A+r2] |
=============================
r1=1 /\ r3=1 /\ r4=1
Test ppc/ambig/9
=============================
P0 | P1
-----------------------------
[B] <- 1 | r2 <- [A]
r1 <- [B] | r3 <- r2 ^ r2
lwsync | r4 <- [B+r3]
[A] <- 1 |
=============================
r1=1 /\ r2=1 /\ r4=0
Final synthesized model
(define ppo
(& po (- (+ (-> Reads MemoryEvent) (-> (- MemoryEvent Writes) (+ Reads Writes))) (& (- (- po dp) (-> Writes Writes)) (+ (-> Reads Reads) (-> Reads Writes))))))
(define grf
(-> none none))
; let-expressions inserted manually for readability
(define fences
(let ([poFpo (join (:> po Syncs) po)]
[poLFpo (join (:> po Lwsyncs) po)]
[RE+WW (+ (-> Reads MemoryEvent) (-> Writes Writes))])
(+
(:>
(+ (+ (join rf poFpo) (<: Writes poFpo)) (join poFpo (+ rf poFpo)))
(+ (join (+ Reads Writes) (+ rf poFpo)) (<: Reads (join poFpo Writes))))
(:> (:> (+ (:> (& RE+WW poLFpo) Writes) (join rf (& RE+WW poLFpo)))
(+ Reads Writes))
(:> (+ Writes (join (& RE+WW poLFpo) Writes))
(join (+ Reads Writes) (+ rf (& RE+WW poLFpo))))))))
(define PPC_1 (make-model ppo grf fences))