diff options
| author | Jon French | 2017-07-21 20:33:31 +0100 |
|---|---|---|
| committer | Jon French | 2017-07-24 18:24:05 +0100 |
| commit | aa08c004b613d11b4e3d6b8909c06eec5cee5b86 (patch) | |
| tree | 3ddedbb8699cf1291c24c5f2290e113750d241cc /language/l2.lem | |
| parent | e609a9ead0505ffcf824177d211d43d685b7c08f (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.lem')
| -rw-r--r-- | language/l2.lem | 615 |
1 files changed, 326 insertions, 289 deletions
diff --git a/language/l2.lem b/language/l2.lem index f9d0a087..2d99e304 100644 --- a/language/l2.lem +++ b/language/l2.lem @@ -1,6 +1,8 @@ -(* generated by Ott 0.25 from: l2_typ.ott l2.ott *) +(* generated by Ott 0.25 from: l2.ott *) open import Pervasives +open import Pervasives +open import Pervasives_extra open import Map open import Maybe open import Set_extra @@ -30,10 +32,6 @@ type base_kind_aux = (* base kind *) | BK_effect (* kind of effect sets *) -type base_kind = - | BK_aux of base_kind_aux * l - - type kid_aux = (* kinded IDs: $Type$, $Nat$, $Order$, and $Effect$ variables *) | Var of x @@ -43,8 +41,8 @@ type id_aux = (* identifier *) | DeIid of x (* remove infix status *) -type kind_aux = (* kinds *) - | K_kind of list base_kind +type base_kind = + | BK_aux of base_kind_aux * l type kid = @@ -55,8 +53,8 @@ type id = | Id_aux of id_aux * l -type kind = - | K_aux of kind_aux * l +type kind_aux = (* kinds *) + | K_kind of list base_kind type nexp_aux = (* numeric expression, of kind $Nat$ *) @@ -73,13 +71,20 @@ and nexp = | Nexp_aux of nexp_aux * l +type kind = + | K_aux of kind_aux * 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 *) @@ -118,11 +123,6 @@ let effect_union e1 e2 = end -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 $Nat$ *) | NC_fixed of nexp * nexp | NC_bounded_ge of nexp * nexp @@ -130,14 +130,19 @@ type n_constraint_aux = (* constraint over kind $Nat$ *) | NC_nat_set_bounded of kid * list integer -type kinded_id = - | KOpt_aux of kinded_id_aux * l +type kinded_id_aux = (* optionally kind-annotated identifier *) + | KOpt_none of kid (* identifier *) + | KOpt_kind of kind * kid (* kind-annotated variable *) type n_constraint = | NC_aux of n_constraint_aux * l +type kinded_id = + | KOpt_aux of kinded_id_aux * l + + type quant_item_aux = (* kinded identifier or $Nat$ constraint *) | QI_id of kinded_id (* optionally kinded identifier *) | QI_const of n_constraint (* $Nat$ constraint *) @@ -152,19 +157,6 @@ type typquant_aux = (* type quantifiers and constraints *) | TypQ_no_forall (* empty *) -type lit_aux = (* literal constant *) - | L_unit (* $() : unit$ *) - | L_zero (* $bitzero : bit$ *) - | L_one (* $bitone : bit$ *) - | L_true (* $true : bool$ *) - | L_false (* $false : bool$ *) - | L_num of integer (* 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 * l @@ -190,14 +182,40 @@ and typ_arg = | Typ_arg_aux of typ_arg_aux * l -type lit = - | L_aux of lit_aux * l +type lit_aux = (* literal constant *) + | L_unit (* $() : unit$ *) + | L_zero (* $bitzero : bit$ *) + | L_one (* $bitone : bit$ *) + | L_true (* $true : bool$ *) + | L_false (* $false : bool$ *) + | L_num of integer (* 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 index_range_aux = (* index specification, for bitfields in register types *) + | BF_single of integer (* single index *) + | BF_range of integer * integer (* index range *) + | BF_concat of index_range * index_range (* concatenation of index ranges *) + +and index_range = + | BF_aux of index_range_aux * l type typschm_aux = (* type scheme *) | TypSchm_ts of typquant * typ +type lit = + | L_aux of lit_aux * l + + +type typschm = + | TypSchm_aux of typschm_aux * l + + type pat_aux 'a = (* pattern *) | P_lit of lit (* literal constant pattern *) | P_wild (* wildcard *) @@ -222,14 +240,252 @@ and fpat 'a = | FP_aux of (fpat_aux 'a) * annot 'a -type typschm = - | TypSchm_aux of typschm_aux * l +type 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 * l + + +type type_union = + | Tu_aux of type_union_aux * l + + +type kind_def_aux 'a = (* Definition body for elements of kind *) + | KD_nabbrev of kind * id * name_scm_opt * nexp (* $Nat$-expression abbreviation *) + | KD_abbrev of kind * id * name_scm_opt * typschm (* type abbreviation *) + | KD_record of kind * id * name_scm_opt * typquant * list (typ * id) * bool (* struct type definition *) + | KD_variant of kind * id * name_scm_opt * typquant * list type_union * bool (* union type definition *) + | KD_enum of kind * id * name_scm_opt * list id * bool (* enumeration type definition *) + | KD_register of kind * id * nexp * nexp * list (index_range * id) (* register mutable bitfield type definition *) + + +type type_def_aux 'a = (* type definition body *) + | TD_abbrev of id * name_scm_opt * typschm (* type abbreviation *) + | TD_record of id * name_scm_opt * typquant * list (typ * id) * bool (* struct type definition *) + | TD_variant of id * name_scm_opt * typquant * list type_union * bool (* tagged union type definition *) + | TD_enum of id * name_scm_opt * list id * bool (* enumeration type definition *) + | TD_register of id * nexp * nexp * list (index_range * id) (* register mutable bitfield type definition *) + + +type kind_def 'a = + | KD_aux of (kind_def_aux 'a) * annot 'a + + +type type_def 'a = + | TD_aux of (type_def_aux 'a) * annot 'a + + +let rec remove_one i l = + match l with + | [] -> [] + | i2::l2 -> if i2 = i then l2 else i2::(remove_one i l2) +end + +let rec remove_from l l2 = + match l2 with + | [] -> l + | i::l2' -> remove_from (remove_one i l) l2' +end + +let disjoint s1 s2 = Set.null (s1 inter s2) + +let rec disjoint_all sets = + match sets with + | [] -> true + | s1::[] -> true + | s1::s2::sets -> (disjoint s1 s2) && (disjoint_all (s2::sets)) +end + + +type ne = (* internal numeric expressions *) + | Ne_id of x + | Ne_var of x + | Ne_const of integer + | Ne_inf + | Ne_mult of ne * ne + | Ne_add of list ne + | 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 list t + | 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 list t_arg + + +type k = (* Internal kinds *) + | Ki_typ + | Ki_nat + | Ki_ord + | Ki_efct + | Ki_ctor of list k * 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 * list integer + | Nec_cond of list nec * list nec + | Nec_branch of list nec + + +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 maybe string (* 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 integer + | Tag_alias + | Tag_unknown of maybe string (* 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 (map tid kinf) * list nec * 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 list tinf + + type definition_env = + | DenvEmp + | Denv of (map tid kinf) * (map (list (id*t)) tinf) * (map t (list (nat*id))) + + +let blength (bit) = Ne_const 8 +let hlength (bit) = Ne_const 8 + + type env = + | EnvEmp + | Env of (map id tinf) * definition_env + + type inf = + | Iemp + | Inf of (list nec) * effect + + val denv_union : definition_env -> definition_env -> definition_env + let denv_union de1 de2 = + match (de1,de2) with + | (DenvEmp,de2) -> de2 + | (de1,DenvEmp) -> de1 + | ((Denv ke1 re1 ee1),(Denv ke2 re2 ee2)) -> + Denv (ke1 union ke2) (re1 union re2) (ee1 union ee2) + end + + val env_union : env -> env -> env + let env_union e1 e2 = + match (e1,e2) with + | (EnvEmp,e2) -> e2 + | (e1,EnvEmp) -> e1 + | ((Env te1 de1),(Env te2 de2)) -> + Env (te1 union te2) (denv_union de1 de2) + end + +let inf_union i1 i2 = + match (i1,i2) with + | (Iemp,i2) -> i2 + | (i1,Iemp) -> i1 + | (Inf n1 e1,Inf n2 e2) -> (Inf (n1++n2) (effect_union e1 e2)) + end + +let fresh_kid denv = Var "x" (*TODO When strings can be manipulated, this should actually build a fresh string*) + + + +type I = inf + + +type E = env + + +type tannot = maybe (t * tag * list nec * effect * effect) + + + +type i_direction = + | IInc + | IDec type reg_id_aux 'a = | RI_id of id +type reg_form = + | Form_Reg of id * tannot * i_direction + | Form_SubReg of id * reg_form * index_range + + +type ctor_kind = + | C_Enum of nat + | C_Union + + +type reg_id 'a = + | RI_aux of (reg_id_aux 'a) * annot 'a + + type exp_aux 'a = (* expression *) | E_block of list (exp 'a) (* sequential block *) | E_nondet of list (exp 'a) (* nondeterministic block *) @@ -269,10 +525,25 @@ type exp_aux 'a = (* expression *) | E_internal_let of (lexp 'a) * (exp 'a) * (exp 'a) (* This is an internal node for compilation that demonstrates the scope of a local mutable variable *) | E_internal_plet of (pat 'a) * (exp 'a) * (exp 'a) (* This is an internal node, used to distinguised some introduced lets during processing from original ones *) | E_internal_return of (exp 'a) (* 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 exp 'a = | E_aux of (exp_aux 'a) * annot 'a +and value = (* interpreter evaluated value *) + | V_boxref of nat * t + | V_lit of lit + | V_tuple of list value + | V_list of list value + | V_vector of nat * i_direction * list value + | V_vector_sparse of nat * nat * i_direction * list (nat * value) * value + | V_record of t * list (id * value) + | V_ctor of id * t * ctor_kind * value + | V_unknown + | V_register of reg_form + | V_register_alias of alias_spec tannot * tannot + | V_track of value * set reg_form + and lexp_aux 'a = (* lvalue expression *) | LEXP_id of id (* identifier *) | LEXP_memory of id * list (exp 'a) (* memory or register write via function call *) @@ -317,24 +588,14 @@ and letbind_aux 'a = (* let binding *) and letbind 'a = | LB_aux of (letbind_aux 'a) * annot 'a +and alias_spec_aux 'a = (* register alias expression forms *) + | AL_subreg of (reg_id 'a) * id + | AL_bit of (reg_id 'a) * (exp 'a) + | AL_slice of (reg_id 'a) * (exp 'a) * (exp 'a) + | AL_concat of (reg_id 'a) * (reg_id 'a) -type reg_id 'a = - | RI_aux of (reg_id_aux 'a) * annot 'a - - -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 alias_spec 'a = + | AL_aux of (alias_spec_aux 'a) * annot 'a type funcl_aux 'a = (* function clause *) @@ -350,32 +611,9 @@ type tannot_opt_aux = (* optional type annotation for functions *) | Typ_annot_opt_some of typquant * typ -type alias_spec_aux 'a = (* register alias expression forms *) - | AL_subreg of (reg_id 'a) * id - | AL_bit of (reg_id 'a) * (exp 'a) - | AL_slice of (reg_id 'a) * (exp 'a) * (exp 'a) - | AL_concat of (reg_id 'a) * (reg_id 'a) - - -type type_union = - | Tu_aux of type_union_aux * l - - -type index_range_aux = (* index specification, for bitfields in register types *) - | BF_single of integer (* single index *) - | BF_range of integer * integer (* index range *) - | BF_concat of index_range * index_range (* concatenation of index ranges *) - -and index_range = - | BF_aux of index_range_aux * l - - -type name_scm_opt = - | Name_sect_aux of name_scm_opt_aux * l - - -type effect_opt = - | Effect_opt_aux of effect_opt_aux * l +type effect_opt_aux = (* optional effect annotation for functions *) + | Effect_opt_pure (* sugar for empty effect set *) + | Effect_opt_effect of effect type funcl 'a = @@ -390,22 +628,8 @@ type tannot_opt = | Typ_annot_opt_aux of tannot_opt_aux * l -type alias_spec 'a = - | AL_aux of (alias_spec_aux 'a) * annot 'a - - -type default_spec_aux 'a = (* default kinding or typing assumption *) - | DT_order of order - | DT_kind of base_kind * kid - | DT_typ of typschm * id - - -type type_def_aux 'a = (* type definition body *) - | TD_abbrev of id * name_scm_opt * typschm (* type abbreviation *) - | TD_record of id * name_scm_opt * typquant * list (typ * id) * bool (* struct type definition *) - | TD_variant of id * name_scm_opt * typquant * list type_union * bool (* tagged union type definition *) - | TD_enum of id * name_scm_opt * list id * bool (* enumeration type definition *) - | TD_register of id * nexp * nexp * list (index_range * id) (* register mutable bitfield type definition *) +type effect_opt = + | Effect_opt_aux of effect_opt_aux * l type val_spec_aux 'a = (* value type specification *) @@ -414,13 +638,8 @@ type val_spec_aux 'a = (* value type specification *) | VS_extern_spec of typschm * id * string (* specify the type of a function from Lem *) -type kind_def_aux 'a = (* Definition body for elements of kind *) - | KD_nabbrev of kind * id * name_scm_opt * nexp (* $Nat$-expression abbreviation *) - | KD_abbrev of kind * id * name_scm_opt * typschm (* type abbreviation *) - | KD_record of kind * id * name_scm_opt * typquant * list (typ * id) * bool (* struct type definition *) - | KD_variant of kind * id * name_scm_opt * typquant * list type_union * bool (* union type definition *) - | KD_enum of kind * id * name_scm_opt * list id * bool (* enumeration type definition *) - | KD_register of kind * id * nexp * nexp * list (index_range * id) (* register mutable bitfield type definition *) +type fundef_aux 'a = (* function definition *) + | FD_function of rec_opt * tannot_opt * effect_opt * list (funcl 'a) type scattered_def_aux 'a = (* scattered function and union type definitions *) @@ -431,8 +650,10 @@ type scattered_def_aux 'a = (* scattered function and union type definitions *) | SD_scattered_end of id (* scattered definition end *) -type fundef_aux 'a = (* function definition *) - | FD_function of rec_opt * tannot_opt * effect_opt * list (funcl 'a) +type default_spec_aux 'a = (* default kinding or typing assumption *) + | DT_order of order + | DT_kind of base_kind * kid + | DT_typ of typschm * id type dec_spec_aux 'a = (* register declarations *) @@ -441,28 +662,20 @@ type dec_spec_aux 'a = (* register declarations *) | DEC_typ_alias of typ * id * (alias_spec 'a) -type default_spec 'a = - | DT_aux of (default_spec_aux 'a) * l - - -type type_def 'a = - | TD_aux of (type_def_aux 'a) * annot 'a - - type val_spec 'a = | VS_aux of (val_spec_aux 'a) * annot 'a -type kind_def 'a = - | KD_aux of (kind_def_aux 'a) * annot 'a +type fundef 'a = + | FD_aux of (fundef_aux 'a) * annot 'a type scattered_def 'a = | SD_aux of (scattered_def_aux 'a) * annot 'a -type fundef 'a = - | FD_aux of (fundef_aux 'a) * annot 'a +type default_spec 'a = + | DT_aux of (default_spec_aux 'a) * l type dec_spec 'a = @@ -489,180 +702,4 @@ type defs 'a = (* definition sequence *) | Defs of list (def 'a) -let rec remove_one i l = - match l with - | [] -> [] - | i2::l2 -> if i2 = i then l2 else i2::(remove_one i l2) -end - -let rec remove_from l l2 = - match l2 with - | [] -> l - | i::l2' -> remove_from (remove_one i l) l2' -end - -let disjoint s1 s2 = Set.null (s1 inter s2) - -let rec disjoint_all sets = - match sets with - | [] -> true - | s1::[] -> true - | s1::s2::sets -> (disjoint s1 s2) && (disjoint_all (s2::sets)) -end - - -type ne = (* internal numeric expressions *) - | Ne_id of x - | Ne_var of x - | Ne_const of integer - | Ne_inf - | Ne_mult of ne * ne - | Ne_add of list ne - | Ne_minus of ne * ne - | Ne_exp of ne - | Ne_unary of ne - - -type k = (* Internal kinds *) - | Ki_typ - | Ki_nat - | Ki_ord - | Ki_efct - | Ki_ctor of list k * k - | Ki_infer (* Representing an unknown kind, inferred by context *) - - -type nec = (* Numeric expression constraints *) - | Nec_lteq of ne * ne - | Nec_eq of ne * ne - | Nec_gteq of ne * ne - | Nec_in of x * list integer - | Nec_cond of list nec * list nec - | Nec_branch of list nec - - -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 t = (* Internal types *) - | T_id of x - | T_var of x - | T_fn of t * t * effect - | T_tup of list t - | 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 list t_arg - - -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 maybe string (* 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 integer - | Tag_alias - | Tag_unknown of maybe string (* 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 (map tid kinf) * list nec * tag * t - - -type conformsto = (* how much conformance does overloading need *) - | Conformsto_full - | Conformsto_parm - - -type widenvec = - | Widenvec_widen - | Widenvec_dont - | Widenvec_dontcare - - -type widennum = - | Widennum_widen - | Widennum_dont - | Widennum_dontcare - - -type tinflist = (* In place so that a list of tinfs can be referred to without the dot form *) - | Tinfs_empty - | Tinfs_ls of list tinf - - -type widening = (* Should we widen vector start locations, should we widen atoms and ranges *) - | Widening_w of widennum * widenvec - - type definition_env = - | DenvEmp - | Denv of (map tid kinf) * (map (list (id*t)) tinf) * (map t (list (nat*id))) - - -let blength (bit) = Ne_const 8 -let hlength (bit) = Ne_const 8 - - type env = - | EnvEmp - | Env of (map id tinf) * definition_env - - type inf = - | Iemp - | Inf of (list nec) * effect - - val denv_union : definition_env -> definition_env -> definition_env - let denv_union de1 de2 = - match (de1,de2) with - | (DenvEmp,de2) -> de2 - | (de1,DenvEmp) -> de1 - | ((Denv ke1 re1 ee1),(Denv ke2 re2 ee2)) -> - Denv (ke1 union ke2) (re1 union re2) (ee1 union ee2) - end - - val env_union : env -> env -> env - let env_union e1 e2 = - match (e1,e2) with - | (EnvEmp,e2) -> e2 - | (e1,EnvEmp) -> e1 - | ((Env te1 de1),(Env te2 de2)) -> - Env (te1 union te2) (denv_union de1 de2) - end - -let inf_union i1 i2 = - match (i1,i2) with - | (Iemp,i2) -> i2 - | (i1,Iemp) -> i1 - | (Inf n1 e1,Inf n2 e2) -> (Inf (n1++n2) (effect_union e1 e2)) - end - -let fresh_kid denv = Var "x" (*TODO When strings can be manipulated, this should actually build a fresh string*) - - - -type E = env - - -type I = inf - - |
