123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144(****************************************************************************)(* Sail *)(* *)(* Sail and the Sail architecture models here, comprising all files and *)(* directories except the ASL-derived Sail code in the aarch64 directory, *)(* are subject to the BSD two-clause licence below. *)(* *)(* The ASL derived parts of the ARMv8.3 specification in *)(* aarch64/no_vector and aarch64/full are copyright ARM Ltd. *)(* *)(* Copyright (c) 2013-2021 *)(* Kathyrn Gray *)(* Shaked Flur *)(* Stephen Kell *)(* Gabriel Kerneis *)(* Robert Norton-Wright *)(* Christopher Pulte *)(* Peter Sewell *)(* Alasdair Armstrong *)(* Brian Campbell *)(* Thomas Bauereiss *)(* Anthony Fox *)(* Jon French *)(* Dominic Mulligan *)(* Stephen Kell *)(* Mark Wassell *)(* Alastair Reid (Arm Ltd) *)(* *)(* All rights reserved. *)(* *)(* This work was partially supported by EPSRC grant EP/K008528/1 <a *)(* href="http://www.cl.cam.ac.uk/users/pes20/rems">REMS: Rigorous *)(* Engineering for Mainstream Systems</a>, an ARM iCASE award, EPSRC IAA *)(* KTF funding, and donations from Arm. This project has received *)(* funding from the European Research Council (ERC) under the European *)(* Union’s Horizon 2020 research and innovation programme (grant *)(* agreement No 789108, ELVER). *)(* *)(* This software was developed by SRI International and the University of *)(* Cambridge Computer Laboratory (Department of Computer Science and *)(* Technology) under DARPA/AFRL contracts FA8650-18-C-7809 ("CIFV") *)(* and FA8750-10-C-0237 ("CTSRD"). *)(* *)(* SPDX-License-Identifier: BSD-2-Clause *)(****************************************************************************)openAstopenAst_compareopenAst_defsopenAst_utilopenType_check(* For v1 of the concurrency interface, this extracts a fixed set of types. *)typeparameters={abort_type:typ;barrier_type:typ;cache_op_type:typ;fault_type:typ;pa_type:typ;tlbi_type:typ;translation_summary_type:typ;trans_start_type:typ;trans_end_type:typ;arch_ak_type:typ;sys_reg_id_type:typ;}letfind_monad_parameterstype_env=(* We treat the memory read function as an indication that we want the
concurrency interface. *)letmemory_types=matchEnv.get_val_spec(mk_id"sail_mem_read")type_envwith|(_,Typ_aux(Typ_fn([Typ_aux(Typ_app(req_id,[_;_;A_aux(A_typpa_arg,_);A_aux(A_typtrans_sum_arg,_);A_aux(A_typarch_ak_arg,_)]),_);],Typ_aux(Typ_app(result_id,[_;A_aux(A_typabort_arg,_)]),_)),_))whenId.comparereq_id(mk_id"Mem_read_request")==0&&Id.compareresult_id(mk_id"result")==0->Some(abort_arg,pa_arg,trans_sum_arg,arch_ak_arg)|_->None|exception_->Noneinmatchmemory_typeswith|None->None|Some(abort_type,pa_type,translation_summary_type,arch_ak_type)->(* and then treat the remaining types as optional *)letextract_arg_typfn_name=matchEnv.get_val_spec(mk_idfn_name)type_envwith|_,Typ_aux(Typ_fn(typ::_,_),_)->typ|_->unit_typ|exception_->unit_typinletbarrier_type=extract_arg_typ"sail_barrier"inletcache_op_type=extract_arg_typ"sail_cache_op"inletfault_type=extract_arg_typ"sail_take_exception"inlettlbi_type=extract_arg_typ"sail_tlbi"inlettrans_start_type=extract_arg_typ"sail_translation_start"inlettrans_end_type=extract_arg_typ"sail_translation_end"inletsys_reg_id_type=extract_arg_typ"sail_sys_reg_read"inSome{abort_type;barrier_type;cache_op_type;fault_type;pa_type;tlbi_type;translation_summary_type;trans_start_type;trans_end_type;arch_ak_type;sys_reg_id_type;}(* For later versions, find_instantiations pulls out mappings for
instantiated types and identifiers. *)letfind_instantiationsdefs=List.fold_left(fun(type_substs,id_substs)def->matchdefwith|DEF_aux(DEF_instantiation(_,substs),_)->List.fold_left(fun(type_substs,id_substs)(IS_aux(is,_))->matchiswith|IS_typ(kid,ty_arg)->(KBindings.addkidty_argtype_substs,id_substs)|IS_id(id_from,id_to)->(type_substs,Bindings.addid_fromid_toid_substs))(type_substs,id_substs)substs|_->(type_substs,id_substs))(KBindings.empty,Bindings.empty)defs