ASL
let NASLLocal = ~ASLLocal
let ASLDATA = DATA
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 = partial_po
let aarch64 = NASLLocal * NASLLocal
let asl_fr_reg = inter_transitive (asl_po,[Rreg];loc;[Wreg])
let asl_fr = inter_transitive (asl_po,[R] ; loc ; [W])
let asl_data = asl_iico_data | asl_rf_reg
let asl_deps = asl_data
let asl_deps_restricted = id | (asl_deps ; ([ASLLocal] ; asl_deps)+)
let aarch64_iico_data = ( asl_deps_restricted ; asl_data+ ) & aarch64
let aarch64_iico_ctrl = ([B]; asl_iico_ctrl; asl_iico_data*)+ & aarch64
let aarch64_iico_order = ( asl_fr | asl_fr_reg ) & aarch64
let aarch64_intrinsic = aarch64_iico_ctrl | aarch64_iico_data | aarch64_iico_order
let restrict-finals s =
let non-final = domain(rf-reg) in
s \ non-final
let AArch64 = NASLLocal
let AArch64Finals = restrict-finals(AArch64&Wreg)
let to_data = (asl_deps_restricted ; [DATA] ; asl_iico_data ; [W | Wreg]) & aarch64
let AArch64_DATA = NASLLocal & domain (to_data)
show [AArch64_DATA] as AArch64_DATA
show [DATA] as debug_data
acyclic (aarch64_intrinsic | asl_po) as asl_determinism
let AArch64NoB = AArch64 \ B
let reaching = domain ([B]; aarch64_iico_ctrl; [AArch64NoB])
let reachable = range ([AArch64NoB]; aarch64_iico_data; aarch64_iico_ctrl?; [B])
let AArch64B = reaching & reachable
let AArch64 = AArch64NoB | AArch64B
show AArch64,AArch64Finals,AArch64_DATA
show aarch64_iico_ctrl as aarch64_iico_ctrl
show aarch64_iico_data, aarch64_iico_order
let AArch64_BCC = domain ([B]; aarch64_iico_ctrl; [WPC])
show AArch64_BCC