summaryrefslogtreecommitdiff
path: root/tests/coq/hashmap_on_disk
diff options
context:
space:
mode:
authorSon Ho2022-11-16 15:02:40 +0100
committerSon HO2022-11-16 15:45:32 +0100
commit08530a51b8861e3dbb1a409d0c6f0e8c44adec83 (patch)
tree625493f762c4f5f22437f3672880ed83edea4793 /tests/coq/hashmap_on_disk
parenta20819f170acc6aad7b5aca2fbe53c7b3ab7e2b8 (diff)
Do not introduce match on the fuel for non-recursive functions
Diffstat (limited to 'tests/coq/hashmap_on_disk')
-rw-r--r--tests/coq/hashmap_on_disk/HashmapMain_Funs.v383
1 files changed, 158 insertions, 225 deletions
diff --git a/tests/coq/hashmap_on_disk/HashmapMain_Funs.v b/tests/coq/hashmap_on_disk/HashmapMain_Funs.v
index 94a390df..295ec489 100644
--- a/tests/coq/hashmap_on_disk/HashmapMain_Funs.v
+++ b/tests/coq/hashmap_on_disk/HashmapMain_Funs.v
@@ -37,29 +37,20 @@ Definition hashmap_hash_map_new_with_capacity_fwd
(max_load_divisor : usize) :
result (Hashmap_hash_map_t T)
:=
- match n with
- | O => Fail_ OutOfFuel
- | S n0 =>
- let v := vec_new (Hashmap_list_t T) in
- slots <- hashmap_hash_map_allocate_slots_fwd T n0 v capacity;
- i <- usize_mul capacity max_load_dividend;
- i0 <- usize_div i max_load_divisor;
- Return (mkHashmap_hash_map_t (0%usize) (max_load_dividend,
- max_load_divisor) i0 slots)
- end
+ let v := vec_new (Hashmap_list_t T) in
+ slots <- hashmap_hash_map_allocate_slots_fwd T n v capacity;
+ i <- usize_mul capacity max_load_dividend;
+ i0 <- usize_div i max_load_divisor;
+ Return (mkHashmap_hash_map_t (0%usize) (max_load_dividend, max_load_divisor)
+ i0 slots)
.
(** [hashmap_main::hashmap::HashMap::{0}::new] *)
Definition hashmap_hash_map_new_fwd
(T : Type) (n : nat) : result (Hashmap_hash_map_t T) :=
- match n with
- | O => Fail_ OutOfFuel
- | S n0 =>
- hm <-
- hashmap_hash_map_new_with_capacity_fwd T n0 (32%usize) (4%usize)
- (5%usize);
- Return hm
- end
+ hm <-
+ hashmap_hash_map_new_with_capacity_fwd T n (32%usize) (4%usize) (5%usize);
+ Return hm
.
(** [hashmap_main::hashmap::HashMap::{0}::clear_slots] *)
@@ -86,16 +77,11 @@ Definition hashmap_hash_map_clear_fwd_back
(T : Type) (n : nat) (self : Hashmap_hash_map_t T) :
result (Hashmap_hash_map_t T)
:=
- match n with
- | O => Fail_ OutOfFuel
- | S n0 =>
- v <-
- hashmap_hash_map_clear_slots_fwd_back T n0 self.(Hashmap_hash_map_slots)
- (0%usize);
- Return (mkHashmap_hash_map_t (0%usize)
- self.(Hashmap_hash_map_max_load_factor) self.(Hashmap_hash_map_max_load)
- v)
- end
+ v <-
+ hashmap_hash_map_clear_slots_fwd_back T n self.(Hashmap_hash_map_slots)
+ (0%usize);
+ Return (mkHashmap_hash_map_t (0%usize)
+ self.(Hashmap_hash_map_max_load_factor) self.(Hashmap_hash_map_max_load) v)
.
(** [hashmap_main::hashmap::HashMap::{0}::len] *)
@@ -150,34 +136,29 @@ Definition hashmap_hash_map_insert_no_resize_fwd_back
:
result (Hashmap_hash_map_t T)
:=
- match n with
- | O => Fail_ OutOfFuel
- | S n0 =>
- hash <- hashmap_hash_key_fwd key;
- let i := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
- hash_mod <- usize_rem hash i;
- l <-
- vec_index_mut_fwd (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
- hash_mod;
- inserted <- hashmap_hash_map_insert_in_list_fwd T n0 key value l;
- if inserted
- then (
- i0 <- usize_add self.(Hashmap_hash_map_num_entries) 1%usize;
- l0 <- hashmap_hash_map_insert_in_list_back T n0 key value l;
- v <-
- vec_index_mut_back (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
- hash_mod l0;
- Return (mkHashmap_hash_map_t i0 self.(Hashmap_hash_map_max_load_factor)
- self.(Hashmap_hash_map_max_load) v))
- else (
- l0 <- hashmap_hash_map_insert_in_list_back T n0 key value l;
- v <-
- vec_index_mut_back (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
- hash_mod l0;
- Return (mkHashmap_hash_map_t self.(Hashmap_hash_map_num_entries)
- self.(Hashmap_hash_map_max_load_factor)
- self.(Hashmap_hash_map_max_load) v))
- end
+ hash <- hashmap_hash_key_fwd key;
+ let i := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
+ hash_mod <- usize_rem hash i;
+ l <-
+ vec_index_mut_fwd (Hashmap_list_t T) self.(Hashmap_hash_map_slots) hash_mod;
+ inserted <- hashmap_hash_map_insert_in_list_fwd T n key value l;
+ if inserted
+ then (
+ i0 <- usize_add self.(Hashmap_hash_map_num_entries) 1%usize;
+ l0 <- hashmap_hash_map_insert_in_list_back T n key value l;
+ v <-
+ vec_index_mut_back (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
+ hash_mod l0;
+ Return (mkHashmap_hash_map_t i0 self.(Hashmap_hash_map_max_load_factor)
+ self.(Hashmap_hash_map_max_load) v))
+ else (
+ l0 <- hashmap_hash_map_insert_in_list_back T n key value l;
+ v <-
+ vec_index_mut_back (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
+ hash_mod l0;
+ Return (mkHashmap_hash_map_t self.(Hashmap_hash_map_num_entries)
+ self.(Hashmap_hash_map_max_load_factor) self.(Hashmap_hash_map_max_load)
+ v))
.
(** [core::num::u32::{9}::MAX] *)
@@ -235,28 +216,24 @@ Definition hashmap_hash_map_try_resize_fwd_back
(T : Type) (n : nat) (self : Hashmap_hash_map_t T) :
result (Hashmap_hash_map_t T)
:=
- match n with
- | O => Fail_ OutOfFuel
- | S n0 =>
- max_usize <- scalar_cast U32 Usize core_num_u32_max_c;
- let capacity := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
- n1 <- usize_div max_usize 2%usize;
- let (i, i0) := self.(Hashmap_hash_map_max_load_factor) in
- i1 <- usize_div n1 i;
- if capacity s<= i1
- then (
- i2 <- usize_mul capacity 2%usize;
- ntable <- hashmap_hash_map_new_with_capacity_fwd T n0 i2 i i0;
- p <-
- hashmap_hash_map_move_elements_fwd_back T n0 ntable
- self.(Hashmap_hash_map_slots) (0%usize);
- let (ntable0, _) := p in
- Return (mkHashmap_hash_map_t self.(Hashmap_hash_map_num_entries) (i, i0)
- ntable0.(Hashmap_hash_map_max_load) ntable0.(Hashmap_hash_map_slots)))
- else
- Return (mkHashmap_hash_map_t self.(Hashmap_hash_map_num_entries) (i, i0)
- self.(Hashmap_hash_map_max_load) self.(Hashmap_hash_map_slots))
- end
+ max_usize <- scalar_cast U32 Usize core_num_u32_max_c;
+ let capacity := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
+ n1 <- usize_div max_usize 2%usize;
+ let (i, i0) := self.(Hashmap_hash_map_max_load_factor) in
+ i1 <- usize_div n1 i;
+ if capacity s<= i1
+ then (
+ i2 <- usize_mul capacity 2%usize;
+ ntable <- hashmap_hash_map_new_with_capacity_fwd T n i2 i i0;
+ p <-
+ hashmap_hash_map_move_elements_fwd_back T n ntable
+ self.(Hashmap_hash_map_slots) (0%usize);
+ let (ntable0, _) := p in
+ Return (mkHashmap_hash_map_t self.(Hashmap_hash_map_num_entries) (i, i0)
+ ntable0.(Hashmap_hash_map_max_load) ntable0.(Hashmap_hash_map_slots)))
+ else
+ Return (mkHashmap_hash_map_t self.(Hashmap_hash_map_num_entries) (i, i0)
+ self.(Hashmap_hash_map_max_load) self.(Hashmap_hash_map_slots))
.
(** [hashmap_main::hashmap::HashMap::{0}::insert] *)
@@ -265,16 +242,11 @@ Definition hashmap_hash_map_insert_fwd_back
:
result (Hashmap_hash_map_t T)
:=
- match n with
- | O => Fail_ OutOfFuel
- | S n0 =>
- self0 <- hashmap_hash_map_insert_no_resize_fwd_back T n0 self key value;
- i <- hashmap_hash_map_len_fwd T self0;
- if i s> self0.(Hashmap_hash_map_max_load)
- then (
- self1 <- hashmap_hash_map_try_resize_fwd_back T n0 self0; Return self1)
- else Return self0
- end
+ self0 <- hashmap_hash_map_insert_no_resize_fwd_back T n self key value;
+ i <- hashmap_hash_map_len_fwd T self0;
+ if i s> self0.(Hashmap_hash_map_max_load)
+ then (self1 <- hashmap_hash_map_try_resize_fwd_back T n self0; Return self1)
+ else Return self0
.
(** [hashmap_main::hashmap::HashMap::{0}::contains_key_in_list] *)
@@ -299,17 +271,12 @@ Definition hashmap_hash_map_contains_key_fwd
(T : Type) (n : nat) (self : Hashmap_hash_map_t T) (key : usize) :
result bool
:=
- match n with
- | O => Fail_ OutOfFuel
- | S n0 =>
- hash <- hashmap_hash_key_fwd key;
- let i := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
- hash_mod <- usize_rem hash i;
- l <-
- vec_index_fwd (Hashmap_list_t T) self.(Hashmap_hash_map_slots) hash_mod;
- b <- hashmap_hash_map_contains_key_in_list_fwd T n0 key l;
- Return b
- end
+ hash <- hashmap_hash_key_fwd key;
+ let i := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
+ hash_mod <- usize_rem hash i;
+ l <- vec_index_fwd (Hashmap_list_t T) self.(Hashmap_hash_map_slots) hash_mod;
+ b <- hashmap_hash_map_contains_key_in_list_fwd T n key l;
+ Return b
.
(** [hashmap_main::hashmap::HashMap::{0}::get_in_list] *)
@@ -333,17 +300,12 @@ Definition hashmap_hash_map_get_fwd
(T : Type) (n : nat) (self : Hashmap_hash_map_t T) (key : usize) :
result T
:=
- match n with
- | O => Fail_ OutOfFuel
- | S n0 =>
- hash <- hashmap_hash_key_fwd key;
- let i := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
- hash_mod <- usize_rem hash i;
- l <-
- vec_index_fwd (Hashmap_list_t T) self.(Hashmap_hash_map_slots) hash_mod;
- t <- hashmap_hash_map_get_in_list_fwd T n0 key l;
- Return t
- end
+ hash <- hashmap_hash_key_fwd key;
+ let i := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
+ hash_mod <- usize_rem hash i;
+ l <- vec_index_fwd (Hashmap_list_t T) self.(Hashmap_hash_map_slots) hash_mod;
+ t <- hashmap_hash_map_get_in_list_fwd T n key l;
+ Return t
.
(** [hashmap_main::hashmap::HashMap::{0}::get_mut_in_list] *)
@@ -387,18 +349,13 @@ Definition hashmap_hash_map_get_mut_fwd
(T : Type) (n : nat) (self : Hashmap_hash_map_t T) (key : usize) :
result T
:=
- match n with
- | O => Fail_ OutOfFuel
- | S n0 =>
- hash <- hashmap_hash_key_fwd key;
- let i := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
- hash_mod <- usize_rem hash i;
- l <-
- vec_index_mut_fwd (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
- hash_mod;
- t <- hashmap_hash_map_get_mut_in_list_fwd T n0 key l;
- Return t
- end
+ hash <- hashmap_hash_key_fwd key;
+ let i := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
+ hash_mod <- usize_rem hash i;
+ l <-
+ vec_index_mut_fwd (Hashmap_list_t T) self.(Hashmap_hash_map_slots) hash_mod;
+ t <- hashmap_hash_map_get_mut_in_list_fwd T n key l;
+ Return t
.
(** [hashmap_main::hashmap::HashMap::{0}::get_mut] *)
@@ -406,23 +363,17 @@ Definition hashmap_hash_map_get_mut_back
(T : Type) (n : nat) (self : Hashmap_hash_map_t T) (key : usize) (ret : T) :
result (Hashmap_hash_map_t T)
:=
- match n with
- | O => Fail_ OutOfFuel
- | S n0 =>
- hash <- hashmap_hash_key_fwd key;
- let i := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
- hash_mod <- usize_rem hash i;
- l <-
- vec_index_mut_fwd (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
- hash_mod;
- l0 <- hashmap_hash_map_get_mut_in_list_back T n0 key l ret;
- v <-
- vec_index_mut_back (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
- hash_mod l0;
- Return (mkHashmap_hash_map_t self.(Hashmap_hash_map_num_entries)
- self.(Hashmap_hash_map_max_load_factor) self.(Hashmap_hash_map_max_load)
- v)
- end
+ hash <- hashmap_hash_key_fwd key;
+ let i := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
+ hash_mod <- usize_rem hash i;
+ l <-
+ vec_index_mut_fwd (Hashmap_list_t T) self.(Hashmap_hash_map_slots) hash_mod;
+ l0 <- hashmap_hash_map_get_mut_in_list_back T n key l ret;
+ v <-
+ vec_index_mut_back (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
+ hash_mod l0;
+ Return (mkHashmap_hash_map_t self.(Hashmap_hash_map_num_entries)
+ self.(Hashmap_hash_map_max_load_factor) self.(Hashmap_hash_map_max_load) v)
.
(** [hashmap_main::hashmap::HashMap::{0}::remove_from_list] *)
@@ -483,23 +434,18 @@ Definition hashmap_hash_map_remove_fwd
(T : Type) (n : nat) (self : Hashmap_hash_map_t T) (key : usize) :
result (option T)
:=
- match n with
- | O => Fail_ OutOfFuel
- | S n0 =>
- hash <- hashmap_hash_key_fwd key;
- let i := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
- hash_mod <- usize_rem hash i;
- l <-
- vec_index_mut_fwd (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
- hash_mod;
- x <- hashmap_hash_map_remove_from_list_fwd T n0 key l;
- match x with
- | None => Return None
- | Some x0 =>
- i0 <- usize_sub self.(Hashmap_hash_map_num_entries) 1%usize;
- let _ := i0 in
- Return (Some x0)
- end
+ hash <- hashmap_hash_key_fwd key;
+ let i := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
+ hash_mod <- usize_rem hash i;
+ l <-
+ vec_index_mut_fwd (Hashmap_list_t T) self.(Hashmap_hash_map_slots) hash_mod;
+ x <- hashmap_hash_map_remove_from_list_fwd T n key l;
+ match x with
+ | None => Return None
+ | Some x0 =>
+ i0 <- usize_sub self.(Hashmap_hash_map_num_entries) 1%usize;
+ let _ := i0 in
+ Return (Some x0)
end
.
@@ -508,91 +454,78 @@ Definition hashmap_hash_map_remove_back
(T : Type) (n : nat) (self : Hashmap_hash_map_t T) (key : usize) :
result (Hashmap_hash_map_t T)
:=
- match n with
- | O => Fail_ OutOfFuel
- | S n0 =>
- hash <- hashmap_hash_key_fwd key;
- let i := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
- hash_mod <- usize_rem hash i;
- l <-
- vec_index_mut_fwd (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
- hash_mod;
- x <- hashmap_hash_map_remove_from_list_fwd T n0 key l;
- match x with
- | None =>
- l0 <- hashmap_hash_map_remove_from_list_back T n0 key l;
- v <-
- vec_index_mut_back (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
- hash_mod l0;
- Return (mkHashmap_hash_map_t self.(Hashmap_hash_map_num_entries)
- self.(Hashmap_hash_map_max_load_factor)
- self.(Hashmap_hash_map_max_load) v)
- | Some x0 =>
- i0 <- usize_sub self.(Hashmap_hash_map_num_entries) 1%usize;
- l0 <- hashmap_hash_map_remove_from_list_back T n0 key l;
- v <-
- vec_index_mut_back (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
- hash_mod l0;
- Return (mkHashmap_hash_map_t i0 self.(Hashmap_hash_map_max_load_factor)
- self.(Hashmap_hash_map_max_load) v)
- end
+ hash <- hashmap_hash_key_fwd key;
+ let i := vec_len (Hashmap_list_t T) self.(Hashmap_hash_map_slots) in
+ hash_mod <- usize_rem hash i;
+ l <-
+ vec_index_mut_fwd (Hashmap_list_t T) self.(Hashmap_hash_map_slots) hash_mod;
+ x <- hashmap_hash_map_remove_from_list_fwd T n key l;
+ match x with
+ | None =>
+ l0 <- hashmap_hash_map_remove_from_list_back T n key l;
+ v <-
+ vec_index_mut_back (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
+ hash_mod l0;
+ Return (mkHashmap_hash_map_t self.(Hashmap_hash_map_num_entries)
+ self.(Hashmap_hash_map_max_load_factor) self.(Hashmap_hash_map_max_load)
+ v)
+ | Some x0 =>
+ i0 <- usize_sub self.(Hashmap_hash_map_num_entries) 1%usize;
+ l0 <- hashmap_hash_map_remove_from_list_back T n key l;
+ v <-
+ vec_index_mut_back (Hashmap_list_t T) self.(Hashmap_hash_map_slots)
+ hash_mod l0;
+ Return (mkHashmap_hash_map_t i0 self.(Hashmap_hash_map_max_load_factor)
+ self.(Hashmap_hash_map_max_load) v)
end
.
(** [hashmap_main::hashmap::test1] *)
Definition hashmap_test1_fwd (n : nat) : result unit :=
- match n with
- | O => Fail_ OutOfFuel
- | S n0 =>
- hm <- hashmap_hash_map_new_fwd u64 n0;
- hm0 <- hashmap_hash_map_insert_fwd_back u64 n0 hm (0%usize) (42%u64);
- hm1 <- hashmap_hash_map_insert_fwd_back u64 n0 hm0 (128%usize) (18%u64);
- hm2 <- hashmap_hash_map_insert_fwd_back u64 n0 hm1 (1024%usize) (138%u64);
- hm3 <- hashmap_hash_map_insert_fwd_back u64 n0 hm2 (1056%usize) (256%u64);
- i <- hashmap_hash_map_get_fwd u64 n0 hm3 (128%usize);
- if negb (i s= 18%u64)
+ hm <- hashmap_hash_map_new_fwd u64 n;
+ hm0 <- hashmap_hash_map_insert_fwd_back u64 n hm (0%usize) (42%u64);
+ hm1 <- hashmap_hash_map_insert_fwd_back u64 n hm0 (128%usize) (18%u64);
+ hm2 <- hashmap_hash_map_insert_fwd_back u64 n hm1 (1024%usize) (138%u64);
+ hm3 <- hashmap_hash_map_insert_fwd_back u64 n hm2 (1056%usize) (256%u64);
+ i <- hashmap_hash_map_get_fwd u64 n hm3 (128%usize);
+ if negb (i s= 18%u64)
+ then Fail_ Failure
+ else (
+ hm4 <- hashmap_hash_map_get_mut_back u64 n hm3 (1024%usize) (56%u64);
+ i0 <- hashmap_hash_map_get_fwd u64 n hm4 (1024%usize);
+ if negb (i0 s= 56%u64)
then Fail_ Failure
else (
- hm4 <- hashmap_hash_map_get_mut_back u64 n0 hm3 (1024%usize) (56%u64);
- i0 <- hashmap_hash_map_get_fwd u64 n0 hm4 (1024%usize);
- if negb (i0 s= 56%u64)
- then Fail_ Failure
- else (
- x <- hashmap_hash_map_remove_fwd u64 n0 hm4 (1024%usize);
- match x with
- | None => Fail_ Failure
- | Some x0 =>
- if negb (x0 s= 56%u64)
+ x <- hashmap_hash_map_remove_fwd u64 n hm4 (1024%usize);
+ match x with
+ | None => Fail_ Failure
+ | Some x0 =>
+ if negb (x0 s= 56%u64)
+ then Fail_ Failure
+ else (
+ hm5 <- hashmap_hash_map_remove_back u64 n hm4 (1024%usize);
+ i1 <- hashmap_hash_map_get_fwd u64 n hm5 (0%usize);
+ if negb (i1 s= 42%u64)
then Fail_ Failure
else (
- hm5 <- hashmap_hash_map_remove_back u64 n0 hm4 (1024%usize);
- i1 <- hashmap_hash_map_get_fwd u64 n0 hm5 (0%usize);
- if negb (i1 s= 42%u64)
+ i2 <- hashmap_hash_map_get_fwd u64 n hm5 (128%usize);
+ if negb (i2 s= 18%u64)
then Fail_ Failure
else (
- i2 <- hashmap_hash_map_get_fwd u64 n0 hm5 (128%usize);
- if negb (i2 s= 18%u64)
- then Fail_ Failure
- else (
- i3 <- hashmap_hash_map_get_fwd u64 n0 hm5 (1056%usize);
- if negb (i3 s= 256%u64) then Fail_ Failure else Return tt)))
- end))
- end
+ i3 <- hashmap_hash_map_get_fwd u64 n hm5 (1056%usize);
+ if negb (i3 s= 256%u64) then Fail_ Failure else Return tt)))
+ end))
.
(** [hashmap_main::insert_on_disk] *)
Definition insert_on_disk_fwd
(n : nat) (key : usize) (value : u64) (st : state) : result (state * unit) :=
- match n with
- | O => Fail_ OutOfFuel
- | S n0 =>
- p <- hashmap_utils_deserialize_fwd st;
- let (st0, hm) := p in
- hm0 <- hashmap_hash_map_insert_fwd_back u64 n0 hm key value;
- p0 <- hashmap_utils_serialize_fwd hm0 st0;
- let (st1, _) := p0 in
- Return (st1, tt)
- end
+ p <- hashmap_utils_deserialize_fwd st;
+ let (st0, hm) := p in
+ hm0 <- hashmap_hash_map_insert_fwd_back u64 n hm key value;
+ p0 <- hashmap_utils_serialize_fwd hm0 st0;
+ let (st1, _) := p0 in
+ Return (st1, tt)
.
(** [hashmap_main::main] *)