Subversion

2lt

?curdirlinks? - Rev 1

?prevdifflink? - Blame



types 

Addr = token;
Data = token;

Memory :: addrs: set of Addr
          mapx: map Addr to Data;

MainMemory = Memory;

Cache :: addrs: set of Addr
         mapx: map Addr to Data
         dirty: set of Addr;

System :: cache: Cache
          main: MainMemory
inv system == system.cache.addrs subset system.main.addrs



functions

badAddrs : System -> set of Addr
badAddrs (s) == { x | x in set s.cache.addrs &
                      s.cache.mapx(x) <> s.main.mapx(x) };

load : System * Addr -> System
load (s, a) == mk_System(
                        mk_Cache(s.cache.addrs union {a},
                                 s.cache.mapx munion { a |-> s.main.mapx(a) },
                                 s.cache.dirty),
                        s.main)
pre a not in set s.cache.addrs;

systemWrite : System * Data * Addr -> System
systemWrite (s, d, a) == 
        mk_System (
                mk_Cache(s.cache.addrs,
                         s.cache.mapx ++ { a |-> d },
                         s.cache.dirty union {a} ),
                s.main);

flush : System -> System
flush (s) == let x in set s.cache.addrs
             in mk_System(
                        mk_Cache(s.cache.addrs \ {x},
                                 {x} <-: s.cache.mapx,
                                 s.cache.dirty \ {x}),
                        mk_Memory(s.main.addrs,
                                  s.main.mapx ++ { x |-> s.cache.mapx(x)}))



Theme by Vikram Singh | Powered by WebSVN v2.3.3