diff options
| author | Thomas Bauereiss | 2018-03-02 00:28:56 +0000 |
|---|---|---|
| committer | Thomas Bauereiss | 2018-03-14 12:05:46 +0000 |
| commit | dfc417cea131f3e8bb033f3e25b24c94f909c809 (patch) | |
| tree | 5e50e7841a1616a652836c493b696b49f7cc3a3d /src/gen_lib/state_monad.lem | |
| parent | 5494cba73d75349785452ec882b65cae11e78d8a (diff) | |
Add address to Write_tag outcome
The state monad currently assumes that tags are written to and read from
properly aligned addresses (since it does not know the capability size used in
the Sail model). This change allows the Sail model to pass in the aligned
address(es) even if data is written to an unaligned address. There might be
better ways to model tag writing, but this approach seems rather general.
Diffstat (limited to 'src/gen_lib/state_monad.lem')
| -rw-r--r-- | src/gen_lib/state_monad.lem | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/src/gen_lib/state_monad.lem b/src/gen_lib/state_monad.lem index 26f912fd..9fcbd5ce 100644 --- a/src/gen_lib/state_monad.lem +++ b/src/gen_lib/state_monad.lem @@ -179,15 +179,11 @@ let write_mem_valS v = match mem_bytes_of_bits v with | Nothing -> failS "write_mem_val" end -val write_tagS : forall 'regs 'e. bitU -> monadS 'regs bool 'e -let write_tagS t = - readS (fun s -> s.write_ea) >>$= (function - | Nothing -> failS "write ea has not been announced yet" - | Just (_, addr, _) -> - (*let taddr = addr / cap_alignment in*) - updateS (fun s -> <| s with tagstate = Map.insert addr t s.tagstate |>) >>$ - returnS true - end) +val write_tagS : forall 'regs 'a 'e. Bitvector 'a => 'a -> bitU -> monadS 'regs bool 'e +let write_tagS addr t = + (*let taddr = addr / cap_alignment in*) + updateS (fun s -> <| s with tagstate = Map.insert (unsigned addr) t s.tagstate |>) >>$ + returnS true val read_regS : forall 'regs 'rv 'a 'e. register_ref 'regs 'rv 'a -> monadS 'regs 'a 'e let read_regS reg = readS (fun s -> reg.read_from s.regstate) |
