@@ -18,6 +18,7 @@ module Pulse.Lib.MutableSlice
1818# lang - pulse
1919
2020module AP = Pulse.Lib.ArrayPtr
21+ module Trade = Pulse.Lib.Trade.Util
2122
2223noeq
2324type slice t = {
@@ -159,6 +160,41 @@ ensures
159160 fold_pts_to s # p v
160161}
161162
163+ module CAP = Pulse.Lib.ConstArrayPtr
164+
165+ fn to_slice
166+ (# t : Type) ( s : slice t ) (# p : perm ) (# v : Ghost . erased ( Seq. seq t ))
167+ requires
168+ pts_to s # p v
169+ returns res : S. slice t
170+ ensures
171+ pts_to res # p v ** Trade. trade ( pts_to res # p v ) ( pts_to s # p v )
172+ {
173+ let len = len s ;
174+ pts_to_len s ;
175+ let a = slice_to_arrayptr_intro s ;
176+ ghost fn aux ( _ : unit)
177+ requires slice_to_arrayptr s a ** pts_to a # p v
178+ ensures pts_to s # p v
179+ {
180+ slice_to_arrayptr_elim a ;
181+ };
182+ Trade. intro _ _ _ aux ;
183+ let ca = CAP. from_arrayptr a ;
184+ Trade. trans _ _ ( pts_to s # p v );
185+ let res = S. arrayptr_to_slice_intro ca len ;
186+ S. pts_to_len res ;
187+ ghost fn aux2 ( _ : unit)
188+ requires S. arrayptr_to_slice ca res ** pts_to res # p v
189+ ensures pts_to ca # p v
190+ {
191+ S. arrayptr_to_slice_elim res
192+ };
193+ Trade. intro _ _ _ aux2 ;
194+ Trade. trans _ _ ( pts_to s # p v );
195+ res
196+ }
197+
162198fn op_Array_Access
163199 (# t : Type)
164200 ( a : slice t )
@@ -324,19 +360,21 @@ fn subslice #t (s: slice t) #p (i j: SZ.t) (#v: erased (Seq.seq t) { SZ.v i <= S
324360}
325361
326362fn copy
327- (# t : Type) ( dst : slice t ) (# p : perm ) ( src : slice t ) (# v : Ghost . erased ( Seq. seq t ))
363+ (# t : Type) ( dst : slice t ) (# p : perm ) ( src : S. slice t ) (# v : Ghost . erased ( Seq. seq t ))
328364requires
329- ( exists * v_dst . pts_to dst v_dst ** pts_to src # p v ** pure ( len src == len dst ))
365+ ( exists * v_dst . pts_to dst v_dst ** pts_to src # p v ** pure ( S. len src == len dst ))
330366ensures
331367 ( pts_to dst v ** pts_to src # p v )
332368{
333369 with v_dst . assert ( pts_to dst v_dst );
334370 unfold_pts_to dst v_dst ;
335- unfold_pts_to src # p v ;
336- AP. memcpy src . elt 0sz dst . elt 0sz src . len ;
337- fold_pts_to src # p v ;
371+ S. pts_to_len src ;
372+ let slen = S. len src ;
373+ let ssrc = S. slice_to_arrayptr_intro src ;
374+ CAP. memcpy ssrc 0sz dst . elt 0sz slen ;
375+ S. slice_to_arrayptr_elim ssrc ;
338376 assert pure ( v ` Seq. equal `
339- Seq. append ( Seq. slice v 0 ( SZ. v src . len ))
340- ( Seq. slice v_dst ( SZ. v src . len ) ( Seq. length v_dst )));
377+ Seq. append ( Seq. slice v 0 ( SZ. v ( S .len src ) ))
378+ ( Seq. slice v_dst ( SZ. v ( S .len src ) ) ( Seq. length v_dst )));
341379 fold_pts_to dst v
342380}
0 commit comments