include "aarch64deps.cat"
let tc-before =
[Imp & Tag & R]; iico_data; [B]; iico_ctrl; [Exp & M | TagCheck & FAULT]
let tc-ib = tc-before; [~(Exp & R)]
let f-ib =
[Imp & Instr & R]; iico_data; [B]; (iico_ctrl | iico_ctrl; iico_data)
let DSB-ob =
[M | DC.CVAU | IC]; po; [dsb.full]; po; [~(Imp & TTD & M | Imp & Instr & R)]
| (
if "ETS2" ||
"ETS3" then [M | DC.CVAU | IC]; po; [dsb.full]; po; [Imp & TTD & M]
else 0)
| [(Exp & R) \ NoRet | Imp & Tag & R]; po; [dsb.ld]; po; [~(Imp & TTD & M | Imp & Instr & R)]
| (
if "ETS2" ||
"ETS3" then [(Exp & R) \ NoRet]; po; [dsb.ld]; po; [Imp & TTD & M]
else 0)
| [Exp & W]; po; [dsb.st]; po; [~(Imp & TTD & M | Imp & Instr & R)]
| (
if "ETS2" ||
"ETS3" then [Exp & W]; po; [dsb.st]; po; [Imp & TTD & M]
else 0)
let EXC-ENTRY-IFB =
if not "ExS" ||
"EIS" then EXC-ENTRY
else EXC-ENTRY \ SVC
let EXC-RET-IFB =
if not "ExS" ||
"EOS" then EXC-RET
else {}
let IFB = ISB | EXC-ENTRY-IFB | EXC-RET-IFB
let IFB-ob =
[Exp & R]; ctrl; [IFB]; po
| [Exp & R]; pick-ctrl-dep; [IFB]; po
| [Exp & R]; addr; [Exp & M]; po; [IFB]; po
| [Exp & R]; pick-addr-dep; [Exp & M]; po; [IFB]; po
| [Exp & R]; pick-addr-dep; (tc-ib | tr-ib); [IFB]; po
| DSB-ob; [IFB]; po
| [Imp & TTD & R]; tr-ib; [IFB]; po
| [Imp & Tag & R]; tc-ib; [IFB]; po
| [Imp & TTD & R]; tr-ib; [Exp & M]; po; [IFB]; po
| [Imp & Tag & R]; tc-before; [Exp & M]; po; [IFB]; po
let dob =
addr
| data
| ctrl; [Exp & W | HU | TLBI | DC.CVAU | IC]
| addr; [Exp & M]; po; [Exp & W | HU]
| addr; [Exp & M]; lrs; [Exp & R | Imp & Tag & R]
| data; [Exp & M]; lrs; [Exp & R | Imp & Tag & R]
| [Imp & TTD & R]; tr-ib; [Exp & M]; po; [Exp & W]
| [Imp & Tag & R]; tc-before; [Exp & M]; po; [Exp & W]
let f-ob =
[Imp & Instr & R]; po; [~(Imp & Instr & R)]
let pob =
pick-addr-dep; [Exp & W | HU | TLBI | DC.CVAU | IC]
| pick-data-dep
| pick-ctrl-dep; [Exp & W | HU | TLBI | DC.CVAU | IC]
| pick-addr-dep; [Exp & M]; po; [Exp & W | HU]
let aob =
[Exp & M]; rmw; [Exp & M]
| [Exp & M]; rmw; lrs; [A | Q]
| [Imp & TTD & R]; rmw; [HU]
let bob =
[Exp & M | Imp & Tag & R]; po; [dmb.full]; po; [Exp & M | Imp & Tag & R | MMU & FAULT]
| [Exp & M]; po; [dmb.full]; po; [DC.CVAU]
| [DC.CVAU]; po; [dmb.full]; po; [Exp & M]
| [DC.CVAU]; po; [dmb.full]; po; [DC.CVAU]
| [Exp & (R \ NoRet) | Imp & Tag & R]; po; [dmb.ld]; po; [Exp & M | Imp & Tag & R | MMU & FAULT]
| [Exp & W]; po; [dmb.st]; po; [Exp & W | MMU & FAULT]
| [range([A];amo;[L])]; po; [Exp & M | Imp & Tag & R | MMU & FAULT]
| [L]; po; [A]
| [A | Q]; po; [Exp & M | Imp & Tag & R | MMU & FAULT]
| [A | Q]; iico_order; [Exp & M | Imp & Tag & R | MMU & FAULT]
| [Exp & M | Imp & Tag & R]; po; [L]
| [Exp & M | Imp & Tag & R]; iico_order; [L]
let po-scl-ob =
[Exp & M]; (po & scl); [DC.CVAU]
| [DC.CVAU]; (po & scl); [Exp & M]
| [DC.CVAU]; (po & scl); [DC.CVAU]
let TLBUncacheable = MMU & (Translation | AccessFlag)
let ets-ob =
(
if "ETS2" then
[Exp & M]; po; [TLBUncacheable & FAULT]; tr-ib^-1; [Imp & TTD & R]
else 0)
| (
if "ETS3" then
[Exp & M]; po; [MMU & FAULT]; tr-ib^-1; [Imp & TTD & R]
else 0)
| (
if "ETS3" then
[Exp & M]; po; [TagCheck & EXC-ENTRY]; tc-ib^-1; [Imp & Tag & R]
else 0)
let rec lob =
tc-ib
| tr-ib
| f-ib
| ets-ob
| f-ob
| po-scl-ob
| DSB-ob
| IFB-ob
| lwfs
| lwfs; sca-class
| dob
| pob
| aob
| bob
| lob; lob
let pick-lob =
pick-dep; lob; [Exp & W]
let rec local-hw-reqs =
lob
| pick-lob
| local-hw-reqs; local-hw-reqs