ASL
let AArch64 = ~ASLLocal
let asl_iico_ctrl = iico_ctrl
let asl_iico_data = iico_data
let asl_rf_reg = rf-reg
let asl_rf = rf
let asl_po = as_transitive (partial_po)
let aarch64 = AArch64 * AArch64
let asl_data = asl_iico_data | asl_rf_reg
let asl_deps = asl_data+
let asl_ctrl_deps = (asl_data | asl_iico_ctrl)+
let aarch64_iico_data = [AArch64 \ B]; asl_deps; [AArch64]
let aarch64_iico_ctrl = [B]; asl_ctrl_deps; [AArch64]
let asl_fr = asl_po & ([R] ; loc ; [W])
let aarch64_iico_order = asl_fr & aarch64
let aarch64_intrinsic = aarch64_iico_ctrl | aarch64_iico_data | aarch64_iico_order
acyclic (aarch64_intrinsic | asl_po) as asl_determinism
let restrict-finals s =
let non-final = domain(rf-reg) in
s \ non-final
let AArch64_Finals = restrict-finals(AArch64&Wreg)
let AArch64Reg = AArch64\(M|B)
let to_addr = [AArch64Reg]; asl_deps; [ADDR]; asl_iico_data; [AArch64]
let AArch64_ADDR = domain(to_addr)
let to_memwrite =
[AArch64Reg \ AArch64_ADDR]; aarch64_iico_data; aarch64_iico_ctrl?; [W]
let AArch64_DATA = domain(to_memwrite)
let AArch64_BCC = domain ([B]; aarch64_iico_ctrl; [WPC])
let AArch64NoB = AArch64 \ B
let reaching = domain ([B]; aarch64_iico_ctrl; [AArch64NoB])
let R = [B];asl_iico_ctrl;asl_data?
let reachable = range ([AArch64NoB]; aarch64_iico_data; R?; [B])
let AArch64B = reaching & reachable
let AArch64 = AArch64NoB | AArch64B
show AArch64
show aarch64_iico_ctrl
show aarch64_iico_data
show aarch64_iico_order
show AArch64_Finals
show AArch64_ADDR
show AArch64_DATA
show AArch64_BCC