summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher2015-12-07 21:01:20 +0000
committerChristopher2015-12-07 21:01:20 +0000
commit0a6f3f0e1bd32fcb0102d72e18662122db664368 (patch)
treeca680d12a0af7e660ed4c5efde5e113bfa3f6daf
parent164ad7d6660095e89e1963625f358ba4dc172c81 (diff)
adapted pp for Kathy's effect type changes
-rw-r--r--src/gen_lib/state.lem12
-rw-r--r--src/pretty_print.ml40
2 files changed, 31 insertions, 21 deletions
diff --git a/src/gen_lib/state.lem b/src/gen_lib/state.lem
index eeff4717..7777cf5e 100644
--- a/src/gen_lib/state.lem
+++ b/src/gen_lib/state.lem
@@ -74,8 +74,8 @@ let write_memory addr l (V bits _ _) s =
let bytes = byte_chunks l bits in
(Left (), <| s with memstate = foldl write_memstate s.memstate (zip addrs bytes) |>)
-val read_reg_range : forall 'e. register -> (integer * integer) (*(nat * nat)*) -> M state 'e (vector bit)
-let read_reg_range reg (i,j) s =
+val read_reg_range : forall 'e. register -> integer -> integer (*(nat * nat)*) -> M state 'e (vector bit)
+let read_reg_range reg i j s =
let v = slice (read_regstate s reg) i j in
(Left v,s)
@@ -84,8 +84,8 @@ let read_reg_bit reg i s =
let v = access (read_regstate s reg) i in
(Left v,s)
-val write_reg_range : forall 'e. register -> (integer * integer) (*(nat * nat)*) -> vector bit -> M state 'e unit
-let write_reg_range (reg : register) (i,j) (v : vector bit) s =
+val write_reg_range : forall 'e. register -> integer -> integer (*(nat * nat)*) -> vector bit -> M state 'e unit
+let write_reg_range reg i j v s =
let v' = update (read_regstate s reg) i j v in
let s' = write_regstate s reg v' in
(Left (),s')
@@ -148,10 +148,10 @@ let rec foreachM_dec (i,stop,by) vars body =
else return ((),vars)
val read_reg_field : forall 'e. register -> register_field -> M state 'e (vector bit)
-let read_reg_field reg rfield = read_reg_range reg (field_indices rfield)
+let read_reg_field reg rfield = uncurry (read_reg_range reg) (field_indices rfield)
val write_reg_field : forall 'e. register -> register_field -> vector bit -> M state 'e unit
-let write_reg_field reg rfield = write_reg_range reg (field_indices rfield)
+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)
diff --git a/src/pretty_print.ml b/src/pretty_print.ml
index 7e2e87b0..1e8f185c 100644
--- a/src/pretty_print.ml
+++ b/src/pretty_print.ml
@@ -2082,25 +2082,35 @@ let doc_exp_lem, doc_let_lem =
if aexp_needed then parens (align epp) else epp
)
)
- | E_vector_access(v,e) ->
- let epp = separate space [string "access";exp v;exp e] in
+ | E_vector_access (v,e) ->
+ let (Base (_,_,_,_,eff,_)) = annot in
+ let epp =
+ if has_rreg_effect eff then
+ separate space [string "read_reg_bit";exp v;exp e]
+ else
+ separate space [string "access";exp v;exp e] in
if aexp_needed then parens (align epp) else epp
- | E_vector_subrange(v,e1,e2) ->
- let epp = align (string "slice" ^^ space ^^ exp v ^//^ exp e1 ^//^ exp e2) in
+ | E_vector_subrange (v,e1,e2) ->
+ let (Base (_,_,_,_,eff,_)) = annot in
+ let epp =
+ if has_rreg_effect eff then
+ align (string "read_reg_range" ^^ space ^^ exp v ^//^ exp e1 ^//^ exp e2)
+ else
+ align (string "slice" ^^ space ^^ exp v ^//^ exp e1 ^//^ exp e2) in
if aexp_needed then parens (align epp) else epp
| E_field((E_aux(_,(_,fannot)) as fexp),id) ->
let (Base ((_,{t = t}),_,_,_,_,_)) = fannot in
- (match t with
- | Tabbrev({t = Tid regtyp},{t=Tapp("register",_)}) ->
- let field_f = match annot with
- | Base((_,{t = Tid "bit"}),_,_,_,_,_)
- | Base((_,{t = Tabbrev(_,{t=Tid "bit"})}),_,_,_,_,_) ->
- string "read_reg_field_bit"
- | _ -> string "read_reg_field" in
- let epp = field_f ^^ space ^^ (exp fexp) ^^ space ^^
- string (regtyp ^ "_") ^^ doc_id_lem id in
- if aexp_needed then parens (align epp) else epp
- | _ -> exp fexp ^^ dot ^^ doc_id_lem id)
+ (match t with
+ | Tabbrev({t = Tid regtyp},{t=Tapp("register",_)}) ->
+ let field_f = match annot with
+ | Base((_,{t = Tid "bit"}),_,_,_,_,_)
+ | Base((_,{t = Tabbrev(_,{t=Tid "bit"})}),_,_,_,_,_) ->
+ string "read_reg_field_bit"
+ | _ -> string "read_reg_field" in
+ let epp = field_f ^^ space ^^ (exp fexp) ^^ space ^^
+ string (regtyp ^ "_") ^^ doc_id_lem id in
+ if aexp_needed then parens (align epp) else epp
+ | _ -> exp fexp ^^ dot ^^ doc_id_lem id)
| E_block [] -> string "()"
| E_block exps -> failwith "Blocks should have been removed till now."
| E_nondet exps -> failwith "Nondet blocks not supported."