summaryrefslogtreecommitdiff
path: root/language/bytecode.ott
diff options
context:
space:
mode:
Diffstat (limited to 'language/bytecode.ott')
-rw-r--r--language/bytecode.ott172
1 files changed, 0 insertions, 172 deletions
diff --git a/language/bytecode.ott b/language/bytecode.ott
deleted file mode 100644
index cc329e02..00000000
--- a/language/bytecode.ott
+++ /dev/null
@@ -1,172 +0,0 @@
-indexvar n , m , i , j ::=
- {{ phantom }}
- {{ com Index variables for meta-lists }}
-
-metavar nat ::=
- {{ phantom }}
- {{ ocaml int }}
- {{ lem nat }}
-
-metavar id ::=
- {{ phantom }}
- {{ ocaml id }}
- {{ lem id }}
-
-metavar mid ::=
- {{ phantom }}
- {{ ocaml id option }}
- {{ lem maybe id }}
-
-metavar string ::=
- {{ phantom }}
- {{ ocaml string }}
- {{ lem string }}
-
-metavar op ::=
- {{ phantom }}
- {{ ocaml string }}
- {{ lem string }}
-
-metavar bool ::=
- {{ phantom }}
- {{ ocaml bool }}
- {{ lem bool }}
-
-metavar value ::=
- {{ phantom }}
- {{ lem vl }}
- {{ ocaml vl }}
-
-embed
-{{ lem
-
-open import Ast
-open import Value2
-
-}}
-
-grammar
-
-% Fragments are small pure snippets of (abstract) C code, mostly
-% expressions, used by the aval and cval types.
-fragment :: 'F_' ::=
- | id :: :: id
- | '&' id :: :: ref
- | value :: :: lit
- | have_exception :: :: have_exception
- | current_exception :: :: current_exception
- | fragment op fragment' :: :: op
- | op fragment :: :: unary
- | string ( fragment0 , ... , fragmentn ) :: :: call
- | fragment . string :: :: field
- | string :: :: raw
- | poly fragment :: :: poly
-
-% init / clear -> create / kill
-
-ctyp :: 'CT_' ::=
- {{ com C type }}
- | mpz_t :: :: lint
-% Arbitrary precision GMP integer, mpz_t in C.
- | bv_t ( bool ) :: :: lbits
-% Variable length bitvector - flag represents direction, true - dec or false - inc
- | sbv_t ( bool ) :: :: sbits
-% Small variable length bitvector - less than 64 bits
- | 'uint64_t' ( nat , bool ) :: :: fbits
-% Fixed length bitvector that fits within a 64-bit word. - int
-% represents length, and flag is the same as CT_bv.
- | 'int64_t' nat :: :: fint
-% Used for (signed) integers that fit within 64-bits.
- | unit_t :: :: unit
-% unit is a value in sail, so we represent it as a one element type
-% here too for clarity but we actually compile it to an int which is
-% always 0.
- | bool_t :: :: bool
- | real_t :: :: real
- | bit_t :: :: bit
-% The real type in sail. Abstract here, but implemented using either
-% GMP rationals or high-precision floating point.
- | ( ctyp0 , ... , ctypn ) :: :: tup
- | string_t :: :: string
- | enum id ( id0 , ... , idn ) :: :: enum
- | struct id ( id0 * ctyp0 , ... , idn * ctypn ) :: :: struct
- | variant id ( id0 * ctyp0 , ... , idn * ctypn ) :: :: variant
-% Abstractly represent how all the Sail user defined types get mapped
-% into C. We don't fully worry about precise implementation details at
-% this point, as C doesn't have variants or tuples natively, but these
-% need to be encoded.
- | vector ( bool , ctyp ) :: :: vector
- | list ( ctyp ) :: :: list
-% A vector type for non-bit vectors, and a list type.
- | ref ( ctyp ) :: :: ref
- | poly :: :: poly
-
-cval :: 'CV_' ::=
- {{ ocaml fragment * ctyp }}
- {{ lem fragment * ctyp }}
-
-clexp :: 'CL_' ::=
- | id : ctyp :: :: id
- | clexp . string :: :: field
- | * clexp :: :: addr
- | clexp . nat :: :: tuple
- | current_exception : ctyp :: :: current_exception
- | have_exception :: :: have_exception
-
-ctype_def :: 'CTD_' ::=
- {{ com C type definition }}
- | enum id = id0 '|' ... '|' idn :: :: enum
- | struct id = { id0 : ctyp0 , ... , idn : ctypn } :: :: struct
- | variant id = { id0 : ctyp0 , ... , idn : ctypn } :: :: variant
-
-iannot :: 'IA_' ::=
- {{ lem nat * nat * nat }}
- {{ ocaml int * int * int }}
-
-instr :: 'I_' ::=
- {{ aux _ iannot }}
- | ctyp id :: :: decl
- | ctyp id = cval :: :: init
- | if ( cval ) { instr0 ; ... ; instrn }
- else { instr0 ; ... ; instrm } : ctyp :: :: if
- | jump ( cval ) string :: :: jump
- | clexp = bool id ( cval0 , ... , cvaln ) :: :: funcall
- | clexp = cval :: :: copy
- | alias clexp = cval :: :: alias
- | clear ctyp id :: :: clear
- | return cval :: :: return
- | { instr0 ; ... ; instrn } :: :: block
- | try { instr0 ; ... ; instrn } :: :: try_block
- | throw cval :: :: throw
- | '//' string :: :: comment
- | C string :: :: raw % only used for GCC attributes
- | string : :: :: label
- | goto string :: :: goto
- | undefined ctyp :: :: undefined
- | match_failure :: :: match_failure
-
-% For optimising away allocations.
- | reset ctyp id :: :: reset
- | ctyp id = cval :: :: reinit
-
-cdef :: 'CDEF_' ::=
- | register id : ctyp = {
- instr0 ; ... ; instrn
- } :: :: reg_dec
- | ctype_def :: :: type
- | let nat ( id0 : ctyp0 , ... , idn : ctypn ) = {
- instr0 ; ... ; instrm
- } :: :: let
-% The first list of instructions creates up the global letbinding, the
-% second kills it.
- | val id ( ctyp0 , ... , ctypn ) -> ctyp
- :: :: spec
- | function id mid ( id0 , ... , idn ) {
- instr0 ; ... ; instrm
- } :: :: fundef
- | startup id {
- instr0 ; ... ; instrn
- } :: :: startup
- | finish id {
- instr0 ; ... ; instrn
- } :: :: finish