summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gen_lib/power_extras.lem11
-rw-r--r--src/gen_lib/sail_values.lem40
-rw-r--r--src/gen_lib/state.lem34
-rw-r--r--src/gen_lib/vector.lem24
-rw-r--r--src/pretty_print.ml247
-rw-r--r--src/process_file.ml6
-rw-r--r--src/rewriter.ml13
7 files changed, 225 insertions, 150 deletions
diff --git a/src/gen_lib/power_extras.lem b/src/gen_lib/power_extras.lem
index f2941aff..8515a406 100644
--- a/src/gen_lib/power_extras.lem
+++ b/src/gen_lib/power_extras.lem
@@ -1,4 +1,5 @@
open import Pervasives
+open import Vector
open import State
open import Sail_values
@@ -33,3 +34,13 @@ let H_Sync () = return ()
let LW_Sync () = return ()
let EIEIO_Sync () = return ()
+let recalculate_dependency () = return ()
+
+let trap () = ()
+(* this needs to change, but for that we'd have to make the type checker know about trap
+ * as an effect *)
+
+val countLeadingZeroes : vector bit * integer -> integer
+let countLeadingZeroes (V bits _ _ ,n) =
+ let (_,bits) = List.splitAt (natFromInteger n) bits in
+ integerFromNat (List.length (takeWhile ((=) O) bits))
diff --git a/src/gen_lib/sail_values.lem b/src/gen_lib/sail_values.lem
index b02e47cb..481a4e5b 100644
--- a/src/gen_lib/sail_values.lem
+++ b/src/gen_lib/sail_values.lem
@@ -25,6 +25,10 @@ let (~) = bitwise_not_bit
let bitwise_not (V bs start is_inc) =
V (List.map bitwise_not_bit bs) start is_inc
+val is_one : integer -> bit
+let is_one i =
+ if i = 1 then I else O
+
let bool_to_bit b = if b then I else O
let bitwise_binop_bit op = function
@@ -106,15 +110,15 @@ let rec divide_by_2 bs (i : integer) (n : integer) =
then bs
else
if (n mod 2 = 1)
- then divide_by_2 (replace bs (natFromInteger i,I)) (i - 1) (n / 2)
+ then divide_by_2 (replace bs (i,I)) (i - 1) (n / 2)
else divide_by_2 bs (i-1) (n div 2)
let rec add_one_bit bs co (i : integer) =
if i < 0 then bs
else match (nth bs i,co) with
- | (O,false) -> replace bs (natFromInteger i,I)
- | (O,true) -> add_one_bit (replace bs (natFromInteger i,I)) true (i-1)
- | (I,false) -> add_one_bit (replace bs (natFromInteger i,O)) true (i-1)
+ | (O,false) -> replace bs (i,I)
+ | (O,true) -> add_one_bit (replace bs (i,I)) true (i-1)
+ | (I,false) -> add_one_bit (replace bs (i,O)) true (i-1)
| (I,true) -> add_one_bit bs true (i-1)
| _ -> failwith "add_one_bit applied to list with undefined bit"
(* | Vundef,_ -> assert false*)
@@ -218,6 +222,8 @@ let add_VII = arith_op_vec_range_range integerAdd false
let addS_VII = arith_op_vec_range_range integerAdd true
let minus_VII = arith_op_vec_range_range integerMinus false
+
+
let arith_op_vec_vec_range op sign l r =
let (l',r') = (to_num sign l,to_num sign r) in
op l' r'
@@ -270,7 +276,7 @@ let minusO_VVV = arith_op_overflow_vec integerMinus false 1
let minusSO_VVV = arith_op_overflow_vec integerMinus true 1
let multO_VVV = arith_op_overflow_vec integerMult false 2
let multSO_VVV = arith_op_overflow_vec integerMult true 2
-
+
let rec arith_op_overflow_vec_bit (op : integer -> integer -> integer) sign (size : integer)
(V _ _ is_inc as l) r_bit =
let act_size = length l * size in
@@ -373,7 +379,7 @@ let arith_op_overflow_no0_vec op sign size (((V _ start is_inc) as l),r) =
let quotO_VVV = arith_op_overflow_no0_vec integerDiv false 1
let quotSO_VVV = arith_op_overflow_no0_vec integerDiv true 1
-let arith_op_vec_range_no0 op sign size ((V _ _ is_inc as l),r) =
+let arith_op_vec_range_no0 op sign size (V _ _ is_inc as l) r =
arith_op_vec_no0 op sign size (l,to_vec is_inc (length l,r))
let mod_VIV = arith_op_vec_range_no0 integerMod false 1
@@ -438,3 +444,25 @@ let EXTS (v1,(V _ _ is_inc as v)) =
to_vec is_inc (v1,signed v)
let EXTZ = EXTS
+
+val make_indexed_vector_reg : list (integer * register) -> maybe register -> integer -> integer ->
+ vector register
+let make_indexed_vector_reg entries default start length =
+ let length = natFromInteger length in
+ match default with
+ | Just v -> V (List.foldl replace (replicate length v) entries) start defaultDir
+ | Nothing -> failwith "make_indexed_vector used without default value"
+ end
+
+val make_indexed_vector_bit : list (integer * bit) -> maybe bit -> integer -> integer -> vector bit
+let make_indexed_vector_bit entries default start length =
+ let length = natFromInteger length in
+ let default = match default with Nothing -> Undef | Just v -> v end in
+ V (List.foldl replace (replicate length default) entries) start defaultDir
+
+val make_bit_vector_undef : integer -> vector bit
+let make_bitvector_undef length =
+ V (replicate (natFromInteger length) Undef) 0 true
+
+
+let bitwise_not_range_bit n = bitwise_not (to_vec defaultDir n)
diff --git a/src/gen_lib/state.lem b/src/gen_lib/state.lem
index 7777cf5e..f79f8eff 100644
--- a/src/gen_lib/state.lem
+++ b/src/gen_lib/state.lem
@@ -128,8 +128,8 @@ let rec foreach_dec (i,stop,by) vars body =
else ((),vars)
-val foreachM_inc : forall 's 'e 'vars. (nat * nat * nat) -> 'vars ->
- (nat -> 'vars -> M 's 'e (unit * 'vars)) -> M 's 'e (unit * 'vars)
+val foreachM_inc : forall 's 'e 'vars. (integer * integer * integer) -> 'vars ->
+ (integer -> 'vars -> M 's 'e (unit * 'vars)) -> M 's 'e (unit * 'vars)
let rec foreachM_inc (i,stop,by) vars body =
if i <= stop
then
@@ -138,8 +138,8 @@ let rec foreachM_inc (i,stop,by) vars body =
else return ((),vars)
-val foreachM_dec : forall 's 'e 'vars. (nat * nat * nat) -> 'vars ->
- (nat -> 'vars -> M 's 'e (unit * 'vars)) -> M 's 'e (unit * 'vars)
+val foreachM_dec : forall 's 'e 'vars. (integer * integer * integer) -> 'vars ->
+ (integer -> 'vars -> M 's 'e (unit * 'vars)) -> M 's 'e (unit * 'vars)
let rec foreachM_dec (i,stop,by) vars body =
if i >= stop
then
@@ -153,11 +153,24 @@ let read_reg_field reg rfield = uncurry (read_reg_range reg) (field_indices rfie
val write_reg_field : forall 'e. register -> register_field -> vector bit -> M state 'e unit
let write_reg_field reg rfield = uncurry (write_reg_range reg) (field_indices rfield)
-val read_reg_field_bit : forall 'e. register -> register_field_bit -> M state 'e bit
-let read_reg_field_bit reg rbit = read_reg_bit reg (field_index_bit rbit)
+val read_reg_bitfield : forall 'e. register -> register_bitfield -> M state 'e bit
+let read_reg_bitfield reg rbit = read_reg_bit reg (field_index_bit rbit)
+
+val write_reg_bitfield : forall 'e. register -> register_bitfield -> bit -> M state 'e unit
+let write_reg_bitfield reg rbit = write_reg_bit reg (field_index_bit rbit)
+
+val write_reg_field_range : forall 'e. register -> register_field -> integer -> integer ->
+ vector bit -> M state 'e unit
+let write_reg_field_range reg rfield i j v =
+ let (i',j') = field_indices rfield in
+ write_reg_range reg i' j' v
+
+val write_reg_field_bit : forall 'e. register -> register_field -> integer ->
+ bit -> M state 'e unit
+let write_reg_field_bit reg rfield i v =
+ let (i',_) = field_indices rfield in
+ write_reg_bit reg (i + i') v
-val write_reg_field_bit : forall 'e. register -> register_field_bit -> bit -> M state 'e unit
-let write_reg_field_bit reg rbit = write_reg_bit reg (field_index_bit rbit)
let length l = integerFromNat (length l)
@@ -172,3 +185,8 @@ let write_two_regs r1 r2 vec =
(if defaultDir then size - start else start - size)
(if defaultDir then vsize - start else start - vsize) in
write_reg r1 r1_v >> write_reg r2 r2_v
+
+let read_two_regs r1 r2 =
+ read_reg r1 >>= fun v1 ->
+ read_reg r2 >>= fun v2 ->
+ return (v1 ^^ v2)
diff --git a/src/gen_lib/vector.lem b/src/gen_lib/vector.lem
index ad0ba1db..4044e23c 100644
--- a/src/gen_lib/vector.lem
+++ b/src/gen_lib/vector.lem
@@ -18,25 +18,15 @@ let to_bool = function
let get_start (V _ s _) = s
let length (V bs _ _) = length bs
-let rec replace bs ((n : nat),b') = match (n,bs) with
- | (_, []) -> []
- | (0, _::bs) -> b' :: bs
- | (n+1, b::bs) -> b :: replace bs (n,b')
+let rec replace bs ((n : integer),b') = match bs with
+ | [] -> []
+ | b :: bs ->
+ if n = 0 then
+ b' :: bs
+ else
+ b :: replace bs (n - 1,b')
end
-let make_indexed_vector_reg entries default start length =
- match default with
- | Just v -> V (List.foldl replace (replicate length v) entries) start
- | Nothing -> failwith "make_indexed_vector used without default value"
- end
-
-let make_indexed_vector_bit entries default start length =
- let default = match default with Nothing -> Undef | Just v -> v end in
- V (List.foldl replace (replicate length default) entries) start
-
-let make_bitvector_undef length =
- V (replicate length Undef) 0 true
-
let vector_concat (V bs start is_inc) (V bs' _ _) =
V (bs ++ bs') start is_inc
diff --git a/src/pretty_print.ml b/src/pretty_print.ml
index 1e8f185c..b9b32ac4 100644
--- a/src/pretty_print.ml
+++ b/src/pretty_print.ml
@@ -1443,7 +1443,7 @@ let doc_exp_ocaml, doc_let_ocaml =
else doc_id_ocaml id
| Base(_,(Constructor i |Enum i),_,_,_,_) -> doc_id_ocaml_ctor i id
| Base((_,t),Alias alias_info,_,_,_,_) ->
- (match alias_info with
+ (match alias_info with
| Alias_field(reg,field) ->
let field_f = match t.t with
| Tid "bit" | Tabbrev(_,{t=Tid "bit"}) -> string "get_register_field_bit"
@@ -1943,12 +1943,13 @@ let doc_pat_lem apat_needed =
| P_list pats -> brackets (separate_map semi pat pats) (*Never seen but easy in lem*)
in pat
+let rec getregtyp_annot (Base ((_,t),_,_,_,_,_)) =
+ match t with
+ | {t = Tabbrev ({t = Tid name},_)} -> name
+
let rec getregtyp (LEXP_aux (le,(_,annot))) = match le with
| LEXP_id _
- | LEXP_cast _ ->
- let (Base ((_,t),_,_,_,_,_)) = annot in
- (match t with
- | {t = Tabbrev ({t = Tid name},_)} -> name)
+ | LEXP_cast _ -> getregtyp_annot annot
| LEXP_memory _ -> failwith "This lexp writes memory"
| LEXP_vector (le,_)
| LEXP_vector_range (le,_,_)
@@ -1962,47 +1963,69 @@ let doc_exp_lem, doc_let_lem =
| E_assign((LEXP_aux(le_act,tannot) as le),e) ->
(* can only be register writes *)
let (_,(Base ((_,{t = t}),tag,_,_,_,_))) = tannot in
- let E_aux (_,(_,(Base ((_,{t = et}),_,_,_,_,_)))) = e in
- (match tag with
- | External _ ->
- (match le_act with
- | LEXP_vector (le,e2) ->
- (prefix 2 1)
- (string "write_reg_bit")
- (doc_lexp_deref_lem le ^^ space ^^
- exp e2 ^/^ exp e)
- | LEXP_vector_range (le,e2,e3) ->
+ (match le_act, t, tag with
+ | LEXP_vector_range (le,e2,e3),_,_ ->
+ (match le with
+ | LEXP_aux (LEXP_field (le,id), (_,((Base ((_,{t = t}),_,_,_,_,_))))) ->
+ if t = Tid "bit" then
+ failwith "indexing a register's (single bit) bitfield not supported"
+ else
+ let typprefix = String.uncapitalize (getregtyp le) ^ "_" in
+ (prefix 2 1)
+ (string "write_reg_field_range")
+ (align (doc_lexp_deref_lem le ^^ space ^^ string typprefix ^^
+ doc_id_lem id ^/^ exp e2 ^/^ exp e3 ^/^ exp e))
+ | _ ->
(prefix 2 1)
(string "write_reg_range")
- (align (doc_lexp_deref_lem le ^^ space ^^
- (parens (group (align (exp e2 ^^ comma ^^ break 0 ^^ exp e3)))) ^/^
- exp e))
- | LEXP_field (lexp,id) ->
- let typprefix = String.uncapitalize (getregtyp lexp) ^ "_" in
- (match et with
- | Tid "bit"
- | Tabbrev (_,{t=Tid "bit"}) ->
- (prefix 2 1)
- (string "write_reg_field_bit")
- (doc_lexp_deref_lem lexp ^^ space ^^ string typprefix ^^ doc_id_lem id ^/^
- exp e)
- | Tapp ("vector",_)
- | Tabbrev (_,{t=Tapp ("vector",_)}) ->
- (prefix 2 1)
- (string "write_reg_field")
- (doc_lexp_deref_lem lexp ^^ space ^^ string typprefix ^^ doc_id_lem id ^/^
- exp e)
- | _ -> failwith (t_to_string {t = et})
- )
- | (LEXP_id _ | LEXP_cast _) ->
+ (align (doc_lexp_deref_lem le ^^ space ^^ exp e2 ^/^ exp e3 ^/^ exp e))
+ )
+ | LEXP_vector (le,e2), (Tid "bit" | Tabbrev (_,{t=Tid "bit"})),_ ->
+ (match le with
+ | LEXP_aux (LEXP_field (le,id), (_,((Base ((_,{t = t}),_,_,_,_,_))))) ->
+ if t = Tid "bit" then
+ failwith "indexing a register's (single bit) bitfield not supported"
+ else
+ let typprefix = String.uncapitalize (getregtyp le) ^ "_" in
+ (prefix 2 1)
+ (string "write_reg_field_bit")
+ (align (doc_lexp_deref_lem le ^^ space ^^ string typprefix ^^
+ doc_id_lem id ^/^ exp e2 ^/^ exp e))
+ | _ ->
(prefix 2 1)
- (string "write_reg")
- (doc_lexp_deref_lem le ^/^ exp e))
- | _ ->
- (prefix 2 1)
- (string "write_reg")
- (doc_lexp_deref_lem le ^/^ exp e)
- )
+ (string "write_reg_bit")
+ (doc_lexp_deref_lem le ^^ space ^^ exp e2 ^/^ exp e)
+ )
+ | LEXP_field (le,id), (Tid "bit"| Tabbrev (_,{t=Tid "bit"})), _ ->
+ let typprefix = String.uncapitalize (getregtyp le) ^ "_" in
+ (prefix 2 1)
+ (string "write_reg_bitfield")
+ (doc_lexp_deref_lem le ^^ space ^^ string typprefix ^^
+ doc_id_lem id ^/^ exp e)
+ | LEXP_field (le,id), _, _ ->
+ let typprefix = String.uncapitalize (getregtyp le) ^ "_" in
+ (prefix 2 1)
+ (string "write_reg_field")
+ (doc_lexp_deref_lem le ^^ space ^^ string typprefix ^^
+ doc_id_lem id ^/^ exp e)
+ | (LEXP_id id | LEXP_cast (_,id)), t, Alias alias_info ->
+ (match alias_info with
+ | Alias_field(reg,field) ->
+ let f = match t with
+ | (Tid "bit" | Tabbrev (_,{t=Tid "bit"})) ->
+ string "write_reg_bitfield"
+ | _ -> string "write_reg_bitfield" in
+ (prefix 2 1)
+ f
+ (separate space [string reg;string (String.lowercase reg ^ "_" ^ field);exp e])
+ (* the type should go instead of the lowercase reg *)
+ | Alias_pair(reg1,reg2) ->
+ string "write_two_regs" ^^ space ^^ string reg1 ^^ space ^^
+ string reg2 ^^ space ^^ exp e)
+ | _ ->
+ (prefix 2 1)
+ (string "write_reg")
+ (doc_lexp_deref_lem le ^/^ exp e))
| E_vector_append(l,r) ->
let epp =
align (separate space [exp l;string "^^"] ^/^ exp r) in
@@ -2036,22 +2059,26 @@ let doc_exp_lem, doc_let_lem =
match vars with
| [v] -> v
| _ -> parens (separate comma vars) in
- (prefix 2 1)
- (parens ((separate space) [string loopf;group (exp indices);exp e5]))
- (parens
- ((prefix 1 1)
- (separate space [string "fun";exp id;varspp;arrow])
- (top_exp false body)
- )
+ parens (
+ (prefix 2 1)
+ ((separate space) [string loopf;group (exp indices);exp e5])
+ (parens
+ ((prefix 1 1)
+ (separate space [string "fun";exp id;varspp;arrow])
+ (top_exp false body)
+ )
+ )
)
| E_aux (E_lit (L_aux (L_unit,_)),_) ->
- (prefix 2 1)
- (parens ((separate space) [string loopf;group (exp indices);exp e5]))
- (parens
- ((prefix 1 1)
- (separate space [string "fun";exp id;string "_";arrow])
- (top_exp false body)
- )
+ parens (
+ (prefix 2 1)
+ ((separate space) [string loopf;group (exp indices);exp e5])
+ (parens
+ ((prefix 1 1)
+ (separate space [string "fun";exp id;string "_";arrow])
+ (top_exp false body)
+ )
+ )
)
)
| _ ->
@@ -2105,7 +2132,7 @@ let doc_exp_lem, doc_let_lem =
let field_f = match annot with
| Base((_,{t = Tid "bit"}),_,_,_,_,_)
| Base((_,{t = Tabbrev(_,{t=Tid "bit"})}),_,_,_,_,_) ->
- string "read_reg_field_bit"
+ string "read_reg_bitfield"
| _ -> string "read_reg_field" in
let epp = field_f ^^ space ^^ (exp fexp) ^^ space ^^
string (regtyp ^ "_") ^^ doc_id_lem id in
@@ -2115,49 +2142,42 @@ let doc_exp_lem, doc_let_lem =
| E_block exps -> failwith "Blocks should have been removed till now."
| E_nondet exps -> failwith "Nondet blocks not supported."
| E_id id ->
- (match annot with
- | Base((_, ({t = Tapp("reg",_)} | {t=Tabbrev(_,{t=Tapp("reg",_)})})),_,_,_,_,_) ->
- doc_id_lem id
- | Base((_, ({t = Tapp("register",_)} | {t=Tabbrev(_,{t=Tapp("register",_)})})),tag,_,_,_,_) ->
- (match tag with
- | External _ -> separate space [string "read_reg";doc_id_lem id]
- | _ -> doc_id_lem id)
- | Base(_,(Constructor i |Enum i),_,_,_,_) -> doc_id_lem_ctor aexp_needed id
- | Base((_,t),Alias alias_info,_,_,_,_) ->
- (match alias_info with
- | Alias_field(reg,field) ->
- let field_f = match t.t with
- | Tid "bit" | Tabbrev(_,{t=Tid "bit"}) -> string "read_reg_field_bit"
- | _ -> string "read_reg_field" in
- separate space [field_f; string reg; string_lit (string field)]
- | Alias_extract(reg,start,stop) ->
- let epp =
- if start = stop then
- separate space [string "access";string reg;doc_int start]
- else
- separate space [string "slice"; string reg; doc_int start; doc_int stop] in
- if aexp_needed then parens (align epp) else epp
- | Alias_pair(reg1,reg2) ->
- let epp = separate space [string "vector_concat";string reg1;string reg2] in
- if aexp_needed then parens (align epp) else epp
- | Alias_extract(reg,start,stop) ->
- let epp =
- if start = stop then
- (separate space)
- [string "access";doc_int start;
- parens (string "read_reg" ^^ space ^^ string reg)]
- else
- (separate space)
- [string "slice"; doc_int start; doc_int stop;
- parens (string "read_reg" ^^ space ^^ string reg)] in
- if aexp_needed then parens (align epp) else epp
- | Alias_pair(reg1,reg2) ->
- let epp = separate space [string "vector_concat";
- parens (string "read_reg" ^^ space ^^ string reg1);
- parens (string "read_reg" ^^ space ^^ string reg2)] in
- if aexp_needed then parens (align epp) else epp
- )
- | _ -> doc_id_lem id)
+ (match annot with
+ | Base((_, ({t = Tapp("register",_)} | {t=Tabbrev(_,{t=Tapp("register",_)})})),
+ External _,_,eff,_,_) ->
+ separate space [string "read_reg";doc_id_lem id]
+ | Base(_,(Constructor i |Enum i),_,_,_,_) -> doc_id_lem_ctor aexp_needed id
+ | Base((_,t),Alias alias_info,_,_,_,_) ->
+ (match alias_info with
+ | Alias_field(reg,field) ->
+ let epp = match t.t with
+ | Tid "bit" | Tabbrev (_,{t=Tid "bit"}) ->
+ (separate space)
+ [string "read_reg_bitfield"; string reg;
+ string (String.lowercase reg ^ "_" ^ field)]
+ (* the type should go instead of the lowercase reg *)
+ | _ ->
+ (separate space)
+ [string "read_reg_field"; string reg;
+ string (String.lowercase reg ^ "_" ^ field)] in
+ (* the type should go instead of the lowercase reg *)
+ if aexp_needed then parens (align epp) else epp
+ | Alias_pair(reg1,reg2) ->
+ let epp = separate space [string "read_two_regs";string reg1;string reg2] in
+ if aexp_needed then parens (align epp) else epp
+ | Alias_extract(reg,start,stop) ->
+ let epp =
+ if start = stop then
+ (separate space)
+ [string "access";doc_int start;
+ parens (string "read_reg" ^^ space ^^ string reg)]
+ else
+ (separate space)
+ [string "slice"; doc_int start; doc_int stop;
+ parens (string "read_reg" ^^ space ^^ string reg)] in
+ if aexp_needed then parens (align epp) else epp
+ )
+ | _ -> doc_id_lem id)
| E_lit lit -> doc_lit_lem false lit
| E_cast(typ,e) ->
(match annot with
@@ -2287,7 +2307,7 @@ let doc_exp_lem, doc_let_lem =
| "minus" -> aux "-"
| "multiply" -> aux "*"
| "quot" -> aux "/"
- | "modulo" -> aux "(mod)"
+ | "modulo" -> aux "mod"
| "add_vec" -> aux2 "add_VVV"
| "add_vec_signed" -> aux2 "addS_VVV"
@@ -2299,6 +2319,7 @@ let doc_exp_lem, doc_let_lem =
| "minus_vec_range" -> aux2 "minus_VIV"
| "mult_vec_range" -> aux2 "mult_VIV"
| "mult_vec_range_signed" -> aux2 "multS_VIV"
+ | "mod_vec_range" -> aux2 "minus_VIV"
| "add_range_vec" -> aux2 "add_IVV"
| "add_range_vec_signed" -> aux2 "addS_IVV"
| "minus_range_vec" -> aux2 "minus_IVV"
@@ -2310,6 +2331,8 @@ let doc_exp_lem, doc_let_lem =
| "add_vec_range_range" -> aux2 "add_VII"
| "add_vec_range_range_signed" -> aux2 "addS_VII"
| "minus_vec_range_range" -> aux2 "minus_VII"
+ | "add_vec_vec_range" -> aux2 "add_VVI"
+ | "add_vec_vec_range_signed" -> aux2 "addS_VVI"
| "add_vec_bit" -> aux2 "add_VBV"
| "add_vec_bit_signed" -> aux2 "addS_VBV"
| "minus_vec_bit_signed" -> aux2 "minus_VBV"
@@ -2319,6 +2342,8 @@ let doc_exp_lem, doc_let_lem =
| "minus_overflow_vec_signed" -> aux2 "minusSO_VVV"
| "mult_overflow_vec" -> aux2 "multO_VVV"
| "mult_overflow_vec_signed" -> aux2 "multSO_VVV"
+ | "quot_overflow_vec" -> aux2 "quotO_VVV"
+ | "quot_overflow_vec_signed" -> aux2 "quot_SO_VVV"
| "add_overflow_vec_bit_signed" -> aux2 "addSO_VBV"
| "minus_overflow_vec_bit" -> aux2 "minusO_VBV"
| "minus_overflow_vec_bit_signed" -> aux2 "minusSO_VBV"
@@ -2371,8 +2396,9 @@ let doc_exp_lem, doc_let_lem =
| LEXP_vector(le,e) ->
parens ((separate space) [string "access";doc_lexp_deref_lem le;top_exp true e])
| LEXP_id id -> doc_id_lem id
- | _ -> empty
-
+ | LEXP_cast (typ,id) -> doc_id_lem id
+ | _ ->
+ raise (Reporting_basic.err_unreachable l ("doc_lexp_deref_lem: Shouldn't happen"))
(* expose doc_exp_lem and doc_let *)
in top_exp, let_exp
@@ -2599,7 +2625,7 @@ let reg_decls (Defs defs) =
if rsbits = [] then empty
else
(prefix 2 1)
- (separate space [string "let";string "register_field_bit_to_string";
+ (separate space [string "let";string "register_bitfield_to_string";
equals;string "function"])
((separate_map (break 1))
(fun (fname,tname,_) ->
@@ -2618,10 +2644,10 @@ let reg_decls (Defs defs) =
let regfieldsbit_pp =
if rsbits = [] then
- string "type register_field_bit = | NO_REGISTER_FIELD_BITS"
+ string "type register_bitfield = | no_REGISTER_BITFIELDS"
else
(prefix 2 1)
- (separate space [string "type";string "register_field_bit";equals])
+ (separate space [string "type";string "register_bitfield";equals])
(separate_map space (fun (fname,tname,_) ->
pipe ^^ space ^^ string (tname ^ "_" ^ fname)) rsbits) in
@@ -2668,7 +2694,7 @@ let reg_decls (Defs defs) =
else
(prefix 2 1)
((separate space) [string "let";string "field_index_bit";
- colon;string "register_field_bit";arrow;string "integer";
+ colon;string "register_bitfield";arrow;string "integer";
equals;string "function"])
(
((separate_map (break 1))
@@ -2751,10 +2777,9 @@ let pp_defs_lem f_arch f d top_line opens =
print f
(string "(*" ^^ (string top_line) ^^ string "*)" ^/^
((separate_map hardline)
- (fun lib -> separate space [string "open import";string lib])
- ("Pervasives" :: "Vector" :: "State" :: "Arch" :: opens)) ^/^ defs);
+ (fun lib -> separate space [string "open import";string lib]) opens) ^/^ hardline ^^ defs);
print f_arch
(string "(*" ^^ (string top_line) ^^ string "*)" ^/^
((separate_map hardline)
(fun lib -> separate space [string "open import";string lib])
- ["Pervasives";"Assert_extra";"Vector"]) ^/^ decls)
+ ["Pervasives";"Assert_extra";"Vector"]) ^/^ hardline ^^ decls)
diff --git a/src/process_file.ml b/src/process_file.ml
index 1a776cff..8dd6fd46 100644
--- a/src/process_file.ml
+++ b/src/process_file.ml
@@ -177,7 +177,8 @@ let output1 libpath out_arg filename defs (* alldoc_accum alldoc_inc_accum alldo
open_output_with_check_unformatted ("arch.lem") in
let ((o2,_, _) as ext_o2) =
open_output_with_check_unformatted (f' ^ "embed.lem") in
- Pretty_print.pp_defs_lem o1 o2 defs (generated_line filename) ["Sail_values"];
+ (Pretty_print.pp_defs_lem o1 o2 defs (generated_line filename))
+ ["Pervasives";"Vector";"State";"Arch";"Sail_values";"Power_extras"];
close_output_with_check ext_o1;
close_output_with_check ext_o2
| Lem_out (Some lib) ->
@@ -185,7 +186,8 @@ let output1 libpath out_arg filename defs (* alldoc_accum alldoc_inc_accum alldo
open_output_with_check_unformatted ("arch.lem") in
let ((o2,_, _) as ext_o2) =
open_output_with_check_unformatted (f' ^ "embed.lem") in
- Pretty_print.pp_defs_lem o1 o2 defs (generated_line filename) ["Sail_values"; lib];
+ (Pretty_print.pp_defs_lem o1 o2 defs (generated_line filename))
+ ["Pervasives";"Vector";"State";"Arch";"Sail_values";"Power_extras"; lib];
close_output_with_check ext_o1;
close_output_with_check ext_o2
| Ocaml_out None ->
diff --git a/src/rewriter.ml b/src/rewriter.ml
index e1a1f5a2..5fbbe050 100644
--- a/src/rewriter.ml
+++ b/src/rewriter.ml
@@ -1285,14 +1285,15 @@ and n_lexp (lexp : 'a lexp) (k : 'a lexp -> 'a exp) : 'a exp =
k (fix_effsum_lexp (LEXP_aux (LEXP_memory (id,es),annot))))
| LEXP_cast (typ,id) ->
k (fix_effsum_lexp (LEXP_aux (LEXP_cast (typ,id),annot)))
- | LEXP_vector (lexp,id) ->
+ | LEXP_vector (lexp,e) ->
n_lexp lexp (fun lexp ->
- k (fix_effsum_lexp (LEXP_aux (LEXP_vector (lexp,id),annot))))
- | LEXP_vector_range (lexp,exp1,exp2) ->
+ n_exp_name e (fun e ->
+ k (fix_effsum_lexp (LEXP_aux (LEXP_vector (lexp,e),annot))))
+ | LEXP_vector_range (lexp,e1,e2) ->
n_lexp lexp (fun lexp ->
- n_exp_name exp1 (fun exp1 ->
- n_exp_name exp2 (fun exp2 ->
- k (fix_effsum_lexp (LEXP_aux (LEXP_vector_range (lexp,exp1,exp2),annot))))))
+ n_exp_name exp1 (fun e1 ->
+ n_exp_name exp2 (fun e2 ->
+ k (fix_effsum_lexp (LEXP_aux (LEXP_vector_range (lexp,e1,e2),annot))))))
| LEXP_field (lexp,id) ->
n_lexp lexp (fun lexp ->
k (fix_effsum_lexp (LEXP_aux (LEXP_field (lexp,id),annot))))