summaryrefslogtreecommitdiff
path: root/language/l2.lem
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.lem
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.lem')
-rw-r--r--language/l2.lem615
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
-
-