summaryrefslogtreecommitdiff
path: root/language/l2.ml
diff options
context:
space:
mode:
authorJon French2017-07-21 20:33:31 +0100
committerJon French2017-07-24 18:24:05 +0100
commitaa08c004b613d11b4e3d6b8909c06eec5cee5b86 (patch)
tree3ddedbb8699cf1291c24c5f2290e113750d241cc /language/l2.ml
parente609a9ead0505ffcf824177d211d43d685b7c08f (diff)
move value type definitions to ott, and introduce new E_internal_value ast node for passing around encapsulated evaluated values; change Interp.to_exp to now just wrap values in this node
Diffstat (limited to 'language/l2.ml')
-rw-r--r--language/l2.ml425
1 files changed, 294 insertions, 131 deletions
diff --git a/language/l2.ml b/language/l2.ml
index 318ed604..13cb2567 100644
--- a/language/l2.ml
+++ b/language/l2.ml
@@ -16,8 +16,8 @@ base_kind_aux = (* base kind *)
type
-base_kind =
- BK_aux of base_kind_aux * Parse_ast.l
+kid_aux = (* kinded IDs: $_$, $_$, $_$, and $_$ variables *)
+ Var of x
type
@@ -27,13 +27,13 @@ id_aux = (* identifier *)
type
-kid_aux = (* kinded IDs: $_$, $_$, $_$, and $_$ variables *)
- Var of x
+base_kind =
+ BK_aux of base_kind_aux * Parse_ast.l
type
-kind_aux = (* kinds *)
- K_kind of (base_kind) list
+kid =
+ Kid_aux of kid_aux * Parse_ast.l
type
@@ -42,13 +42,8 @@ id =
type
-kid =
- Kid_aux of kid_aux * Parse_ast.l
-
-
-type
-kind =
- K_aux of kind_aux * Parse_ast.l
+kind_aux = (* kinds *)
+ K_kind of (base_kind) list
type
@@ -67,13 +62,21 @@ and nexp =
type
+kind =
+ K_aux of kind_aux * Parse_ast.l
+
+
+type
base_effect_aux = (* effect *)
BE_rreg (* read register *)
| BE_wreg (* write register *)
| BE_rmem (* read memory *)
+ | BE_rmemt (* read memory and tag *)
| BE_wmem (* write memory *)
| BE_eamem (* signal effective address for writing memory *)
+ | BE_exmem (* determine if a store-exclusive (ARM) is going to succeed *)
| BE_wmv (* write memory, sending only value *)
+ | BE_wmvt (* write memory, sending only value and tag *)
| BE_barr (* memory barrier *)
| BE_depend (* dynamic footprint *)
| BE_undef (* undefined-instruction exception *)
@@ -113,12 +116,6 @@ effect =
type
-kinded_id_aux = (* optionally kind-annotated identifier *)
- KOpt_none of kid (* identifier *)
- | KOpt_kind of kind * kid (* kind-annotated variable *)
-
-
-type
n_constraint_aux = (* constraint over kind $_$ *)
NC_fixed of nexp * nexp
| NC_bounded_ge of nexp * nexp
@@ -127,8 +124,9 @@ n_constraint_aux = (* constraint over kind $_$ *)
type
-kinded_id =
- KOpt_aux of kinded_id_aux * Parse_ast.l
+kinded_id_aux = (* optionally kind-annotated identifier *)
+ KOpt_none of kid (* identifier *)
+ | KOpt_kind of kind * kid (* kind-annotated variable *)
type
@@ -137,6 +135,11 @@ n_constraint =
type
+kinded_id =
+ KOpt_aux of kinded_id_aux * Parse_ast.l
+
+
+type
quant_item_aux = (* kinded identifier or $_$ constraint *)
QI_id of kinded_id (* optionally kinded identifier *)
| QI_const of n_constraint (* $_$ constraint *)
@@ -154,20 +157,6 @@ typquant_aux = (* type quantifiers and constraints *)
type
-lit_aux = (* literal constant *)
- L_unit (* $() : _$ *)
- | L_zero (* $_ : _$ *)
- | L_one (* $_ : _$ *)
- | L_true (* $_ : _$ *)
- | L_false (* $_ : _$ *)
- | L_num of int (* natural number constant *)
- | L_hex of string (* bit vector constant, C-style *)
- | L_bin of string (* bit vector constant, C-style *)
- | L_string of string (* string constant *)
- | L_undef (* undefined-value constant *)
-
-
-type
typquant =
TypQ_aux of typquant_aux * Parse_ast.l
@@ -195,8 +184,17 @@ and typ_arg =
type
-lit =
- L_aux of lit_aux * Parse_ast.l
+lit_aux = (* literal constant *)
+ L_unit (* $() : _$ *)
+ | L_zero (* $_ : _$ *)
+ | L_one (* $_ : _$ *)
+ | L_true (* $_ : _$ *)
+ | L_false (* $_ : _$ *)
+ | L_num of int (* natural number constant *)
+ | L_hex of string (* bit vector constant, C-style *)
+ | L_bin of string (* bit vector constant, C-style *)
+ | L_string of string (* string constant *)
+ | L_undef (* undefined-value constant *)
type
@@ -205,6 +203,26 @@ typschm_aux = (* type scheme *)
type
+index_range_aux = (* index specification, for bitfields in register types *)
+ BF_single of int (* single index *)
+ | BF_range of int * int (* index range *)
+ | BF_concat of index_range * index_range (* concatenation of index ranges *)
+
+and index_range =
+ BF_aux of index_range_aux * Parse_ast.l
+
+
+type
+lit =
+ L_aux of lit_aux * Parse_ast.l
+
+
+type
+typschm =
+ TypSchm_aux of typschm_aux * Parse_ast.l
+
+
+type
'a pat_aux = (* pattern *)
P_lit of lit (* literal constant pattern *)
| P_wild (* wildcard *)
@@ -230,8 +248,191 @@ and 'a fpat =
type
-typschm =
- TypSchm_aux of typschm_aux * Parse_ast.l
+name_scm_opt_aux = (* optional variable naming-scheme constraint *)
+ Name_sect_none
+ | Name_sect_some of string
+
+
+type
+type_union_aux = (* type union constructors *)
+ Tu_id of id
+ | Tu_ty_id of typ * id
+
+
+type
+name_scm_opt =
+ Name_sect_aux of name_scm_opt_aux * Parse_ast.l
+
+
+type
+type_union =
+ Tu_aux of type_union_aux * Parse_ast.l
+
+
+type
+'a kind_def_aux = (* Definition body for elements of kind *)
+ KD_nabbrev of kind * id * name_scm_opt * nexp (* $_$-expression abbreviation *)
+ | KD_abbrev of kind * id * name_scm_opt * typschm (* type abbreviation *)
+ | KD_record of kind * id * name_scm_opt * typquant * ((typ * id)) list * bool (* struct type definition *)
+ | KD_variant of kind * id * name_scm_opt * typquant * (type_union) list * bool (* union type definition *)
+ | KD_enum of kind * id * name_scm_opt * (id) list * bool (* enumeration type definition *)
+ | KD_register of kind * id * nexp * nexp * ((index_range * id)) list (* register mutable bitfield type definition *)
+
+
+type
+'a type_def_aux = (* type definition body *)
+ TD_abbrev of id * name_scm_opt * typschm (* type abbreviation *)
+ | TD_record of id * name_scm_opt * typquant * ((typ * id)) list * bool (* struct type definition *)
+ | TD_variant of id * name_scm_opt * typquant * (type_union) list * bool (* tagged union type definition *)
+ | TD_enum of id * name_scm_opt * (id) list * bool (* enumeration type definition *)
+ | TD_register of id * nexp * nexp * ((index_range * id)) list (* register mutable bitfield type definition *)
+
+
+type
+'a kind_def =
+ KD_aux of 'a kind_def_aux * 'a annot
+
+
+type
+'a type_def =
+ TD_aux of 'a type_def_aux * 'a annot
+
+
+type
+ne = (* internal numeric expressions *)
+ Ne_id of x
+ | Ne_var of x
+ | Ne_const of int
+ | Ne_inf
+ | Ne_mult of ne * ne
+ | Ne_add of (ne) list
+ | Ne_minus of ne * ne
+ | Ne_exp of ne
+ | Ne_unary of ne
+
+
+type
+t = (* Internal types *)
+ T_id of x
+ | T_var of x
+ | T_fn of t * t * effect
+ | T_tup of (t) list
+ | T_app of x * t_args
+ | T_abbrev of t * t
+
+and t_arg = (* Argument to type constructors *)
+ T_arg_typ of t
+ | T_arg_nexp of ne
+ | T_arg_effect of effect
+ | T_arg_order of order
+
+and t_args = (* Arguments to type constructors *)
+ T_args of (t_arg) list
+
+
+type
+k = (* Internal kinds *)
+ Ki_typ
+ | Ki_nat
+ | Ki_ord
+ | Ki_efct
+ | Ki_ctor of (k) list * k
+ | Ki_infer (* Representing an unknown kind, inferred by context *)
+
+
+type
+tid = (* A type identifier or type variable *)
+ Tid_id of id
+ | Tid_var of kid
+
+
+type
+kinf = (* Whether a kind is default or from a local binding *)
+ Kinf_k of k
+ | Kinf_def of k
+
+
+type
+nec = (* Numeric expression constraints *)
+ Nec_lteq of ne * ne
+ | Nec_eq of ne * ne
+ | Nec_gteq of ne * ne
+ | Nec_in of x * (int) list
+ | Nec_cond of (nec) list * (nec) list
+ | Nec_branch of (nec) list
+
+
+type
+tag = (* Data indicating where the identifier arises and thus information necessary in compilation *)
+ Tag_empty
+ | Tag_intro (* Denotes an assignment and lexp that introduces a binding *)
+ | Tag_set (* Denotes an expression that mutates a local variable *)
+ | Tag_tuple_assign (* Denotes an assignment with a tuple lexp *)
+ | Tag_global (* Globally let-bound or enumeration based value/variable *)
+ | Tag_ctor (* Data constructor from a type union *)
+ | Tag_extern of string option (* External function, specied only with a val statement *)
+ | Tag_default (* Type has come from default declaration, identifier may not be bound locally *)
+ | Tag_spec
+ | Tag_enum of int
+ | Tag_alias
+ | Tag_unknown of string option (* Tag to distinguish an unknown path from a non-analysis non deterministic path *)
+
+
+type
+tinf = (* Type variables, type, and constraints, bound to an identifier *)
+ Tinf_typ of t
+ | Tinf_quant_typ of e_k * s_N * tag * t
+
+
+type
+conformsto = (* how much conformance does overloading need *)
+ Conformsto_full
+ | Conformsto_parm
+
+
+type
+widennum =
+ Widennum_widen
+ | Widennum_dont
+ | Widennum_dontcare
+
+
+type
+widenvec =
+ Widenvec_widen
+ | Widenvec_dont
+ | Widenvec_dontcare
+
+
+type
+widening = (* Should we widen vector start locations, should we widen atoms and ranges *)
+ Widening_w of widennum * widenvec
+
+
+type
+tinflist = (* In place so that a list of tinfs can be referred to without the dot form *)
+ Tinfs_empty
+ | Tinfs_ls of (tinf) list
+
+
+type
+i = (* Information given by type checking an expression *)
+ I of s_N * effect
+ | Iempty (* Empty constraints, effect *)
+ | Singleunion of i * i
+ | Iunion of (i) list (* Unions the constraints and effect *)
+
+
+type
+e = (* Definition environment and lexical environment *)
+ E of e_t * e_d
+ | E_union of e * e
+
+
+type
+i_direction =
+ IInc
+ | IDec
type
@@ -240,6 +441,23 @@ type
type
+ctor_kind =
+ C_Enum of nat
+ | C_Union
+
+
+type
+reg_form =
+ Form_Reg of id * tannot * i_direction
+ | Form_SubReg of id * reg_form * index_range
+
+
+type
+'a reg_id =
+ RI_aux of 'a reg_id_aux * 'a annot
+
+
+type
'a exp_aux = (* expression *)
E_block of ('a exp) list (* sequential block *)
| E_nondet of ('a exp) list (* nondeterministic block *)
@@ -279,10 +497,25 @@ type
| E_internal_let of 'a lexp * 'a exp * 'a exp (* This is an internal node for compilation that demonstrates the scope of a local mutable variable *)
| E_internal_plet of 'a pat * 'a exp * 'a exp (* This is an internal node, used to distinguised some introduced lets during processing from original ones *)
| E_internal_return of 'a exp (* For internal use to embed into monad definition *)
+ | E_internal_value of value (* For internal use in interpreter to wrap pre-evaluated values when returning an action *)
and 'a exp =
E_aux of 'a exp_aux * 'a annot
+and value = (* interpreter evaluated value *)
+ V_boxref of nat * t
+ | V_lit of lit
+ | V_tuple of (value) list
+ | V_list of (value) list
+ | V_vector of nat * i_direction * (value) list
+ | V_vector_sparse of nat * nat * i_direction * ((nat * value)) list * value
+ | V_record of t * ((id * value)) list
+ | V_ctor of id * t * ctor_kind * value
+ | V_unknown
+ | V_register of reg_form
+ | V_register_alias of tannot alias_spec * tannot
+ | V_track of value * reg_form_set
+
and 'a lexp_aux = (* lvalue expression *)
LEXP_id of id (* identifier *)
| LEXP_memory of id * ('a exp) list (* memory or register write via function call *)
@@ -327,28 +560,14 @@ and 'a letbind_aux = (* let binding *)
and 'a letbind =
LB_aux of 'a letbind_aux * 'a annot
+and 'a alias_spec_aux = (* register alias expression forms *)
+ AL_subreg of 'a reg_id * id
+ | AL_bit of 'a reg_id * 'a exp
+ | AL_slice of 'a reg_id * 'a exp * 'a exp
+ | AL_concat of 'a reg_id * 'a reg_id
-type
-'a reg_id =
- RI_aux of 'a reg_id_aux * 'a annot
-
-
-type
-type_union_aux = (* type union constructors *)
- Tu_id of id
- | Tu_ty_id of typ * id
-
-
-type
-name_scm_opt_aux = (* optional variable naming-scheme constraint *)
- Name_sect_none
- | Name_sect_some of string
-
-
-type
-effect_opt_aux = (* optional effect annotation for functions *)
- Effect_opt_pure (* sugar for empty effect set *)
- | Effect_opt_effect of effect
+and 'a alias_spec =
+ AL_aux of 'a alias_spec_aux * 'a annot
type
@@ -368,36 +587,9 @@ tannot_opt_aux = (* optional type annotation for functions *)
type
-'a alias_spec_aux = (* register alias expression forms *)
- AL_subreg of 'a reg_id * id
- | AL_bit of 'a reg_id * 'a exp
- | AL_slice of 'a reg_id * 'a exp * 'a exp
- | AL_concat of 'a reg_id * 'a reg_id
-
-
-type
-type_union =
- Tu_aux of type_union_aux * Parse_ast.l
-
-
-type
-index_range_aux = (* index specification, for bitfields in register types *)
- BF_single of int (* single index *)
- | BF_range of int * int (* index range *)
- | BF_concat of index_range * index_range (* concatenation of index ranges *)
-
-and index_range =
- BF_aux of index_range_aux * Parse_ast.l
-
-
-type
-name_scm_opt =
- Name_sect_aux of name_scm_opt_aux * Parse_ast.l
-
-
-type
-effect_opt =
- Effect_opt_aux of effect_opt_aux * Parse_ast.l
+effect_opt_aux = (* optional effect annotation for functions *)
+ Effect_opt_pure (* sugar for empty effect set *)
+ | Effect_opt_effect of effect
type
@@ -416,24 +608,8 @@ tannot_opt =
type
-'a alias_spec =
- AL_aux of 'a alias_spec_aux * 'a annot
-
-
-type
-'a default_spec_aux = (* default kinding or typing assumption *)
- DT_order of order
- | DT_kind of base_kind * kid
- | DT_typ of typschm * id
-
-
-type
-'a type_def_aux = (* type definition body *)
- TD_abbrev of id * name_scm_opt * typschm (* type abbreviation *)
- | TD_record of id * name_scm_opt * typquant * ((typ * id)) list * bool (* struct type definition *)
- | TD_variant of id * name_scm_opt * typquant * (type_union) list * bool (* tagged union type definition *)
- | TD_enum of id * name_scm_opt * (id) list * bool (* enumeration type definition *)
- | TD_register of id * nexp * nexp * ((index_range * id)) list (* register mutable bitfield type definition *)
+effect_opt =
+ Effect_opt_aux of effect_opt_aux * Parse_ast.l
type
@@ -444,13 +620,8 @@ type
type
-'a kind_def_aux = (* Definition body for elements of kind *)
- KD_nabbrev of kind * id * name_scm_opt * nexp (* $_$-expression abbreviation *)
- | KD_abbrev of kind * id * name_scm_opt * typschm (* type abbreviation *)
- | KD_record of kind * id * name_scm_opt * typquant * ((typ * id)) list * bool (* struct type definition *)
- | KD_variant of kind * id * name_scm_opt * typquant * (type_union) list * bool (* union type definition *)
- | KD_enum of kind * id * name_scm_opt * (id) list * bool (* enumeration type definition *)
- | KD_register of kind * id * nexp * nexp * ((index_range * id)) list (* register mutable bitfield type definition *)
+'a fundef_aux = (* function definition *)
+ FD_function of rec_opt * tannot_opt * effect_opt * ('a funcl) list
type
@@ -463,8 +634,10 @@ type
type
-'a fundef_aux = (* function definition *)
- FD_function of rec_opt * tannot_opt * effect_opt * ('a funcl) list
+'a default_spec_aux = (* default kinding or typing assumption *)
+ DT_order of order
+ | DT_kind of base_kind * kid
+ | DT_typ of typschm * id
type
@@ -475,23 +648,13 @@ type
type
-'a default_spec =
- DT_aux of 'a default_spec_aux * Parse_ast.l
-
-
-type
-'a type_def =
- TD_aux of 'a type_def_aux * 'a annot
-
-
-type
'a val_spec =
VS_aux of 'a val_spec_aux * 'a annot
type
-'a kind_def =
- KD_aux of 'a kind_def_aux * 'a annot
+'a fundef =
+ FD_aux of 'a fundef_aux * 'a annot
type
@@ -500,8 +663,8 @@ type
type
-'a fundef =
- FD_aux of 'a fundef_aux * 'a annot
+'a default_spec =
+ DT_aux of 'a default_spec_aux * Parse_ast.l
type