@@ -5,23 +5,58 @@ $include <arith.sail>
5
5
6
6
type bits ('n : Int) = bitvector('n, dec)
7
7
8
- val eq_vec = {ocaml: "eq_list", interpreter: "eq_list", lem: "eq_vec", c: "eq_bits", coq: "eq_vec"} : forall 'n. (bits('n), bits('n)) -> bool
9
-
10
- val eq_string = {ocaml: "eq_string", interpreter: "eq_string", lem: "eq", c: "eq_string", coq: "generic_eq"} : (string, string) -> bool
8
+ val eq_vec = {
9
+ ocaml: "eq_list",
10
+ interpreter: "eq_list",
11
+ lem: "eq_vec",
12
+ c: "eq_bits",
13
+ coq: "eq_vec"
14
+ lean: "BEq.beq"} : forall 'n. (bits('n), bits('n)) -> bool
15
+
16
+ val eq_string = {
17
+ ocaml: "eq_string",
18
+ interpreter: "eq_string",
19
+ lem: "eq",
20
+ c: "eq_string",
21
+ coq: "generic_eq",
22
+ lean: "BEq.beq"} : (string, string) -> bool
11
23
12
- val eq_real = {ocaml: "eq_real", interpreter: "eq_real", lem: "eq", c: "eq_real", coq: "Reqb"} : (real, real) -> bool
24
+ val eq_real = {
25
+ ocaml: "eq_real",
26
+ interpreter: "eq_real",
27
+ lem: "eq",
28
+ c: "eq_real",
29
+ coq: "Reqb",
30
+ lean: "BEq.beq"} : (real, real) -> bool
13
31
14
32
val eq_anything = {
15
33
ocaml: "(fun (x, y) -> x = y)",
16
34
interpreter: "eq_anything",
17
35
lem: "eq",
18
36
c: "eq_anything",
19
- coq: "generic_eq"
37
+ coq: "generic_eq",
38
+ lean: "BEq.beq"
20
39
} : forall ('a : Type). ('a, 'a) -> bool
21
40
22
- val bitvector_length = "length" : forall 'n. bits('n) -> atom('n)
23
- val vector_length = {ocaml: "length", interpreter: "length", lem: "length_list", c: "length", coq: "vec_length"} : forall 'n ('a : Type). vector('n, dec, 'a) -> atom('n)
24
- val list_length = {ocaml: "length", interpreter: "length", lem: "length_list", c: "length", coq: "length_list"} : forall ('a : Type). list('a) -> int
41
+ val bitvector_length = {
42
+ lean: "BitVec.length",
43
+ _: "length"} : forall 'n. bits('n) -> atom('n)
44
+
45
+ val vector_length = {
46
+ ocaml: "length",
47
+ interpreter: "length",
48
+ lem: "length_list",
49
+ c: "length",
50
+ coq: "vec_length",
51
+ lean: "Vector.length"} : forall 'n ('a : Type). vector('n, dec, 'a) -> atom('n)
52
+
53
+ val list_length = {
54
+ ocaml: "length",
55
+ interpreter: "length",
56
+ lem: "length_list",
57
+ c: "length",
58
+ coq: "length_list",
59
+ lean: "List.length"} : forall ('a : Type). list('a) -> int
25
60
26
61
overload length = {bitvector_length, vector_length, list_length}
27
62
@@ -32,15 +67,17 @@ val vector_subrange_A = {
32
67
interpreter: "subrange",
33
68
lem: "subrange_vec_dec",
34
69
c: "vector_subrange",
35
- coq: "subrange_vec_dec"
70
+ coq: "subrange_vec_dec",
71
+ lean: "BitVec.extractLsb"
36
72
} : forall ('n : Int) ('m : Int) ('o : Int), 'o <= 'm <= 'n.
37
73
(bits('n), atom('m), atom('o)) -> bits('m - ('o - 1))
38
74
39
75
val vector_subrange_B = {
40
76
ocaml: "subrange",
41
77
interpreter: "subrange",
42
78
lem: "subrange_vec_dec",
43
- c: "vector_subrange"
79
+ c: "vector_subrange",
80
+ lean: "BitVec.extractLsb"
44
81
} : forall ('n : Int) ('m : Int) ('o : Int).
45
82
(bits('n), atom('m), atom('o)) -> bits('m - ('o - 1))
46
83
@@ -51,15 +88,17 @@ val bitvector_access_A = {
51
88
interpreter: "access",
52
89
lem: "access_vec_dec",
53
90
c: "vector_access",
54
- coq: "access_vec_dec"
91
+ coq: "access_vec_dec",
92
+ lean: "BitVec.access"
55
93
} : forall ('n : Int) ('m : Int), 0 <= 'm < 'n. (bits('n), atom('m)) -> bit
56
94
57
95
val bitvector_access_B = {
58
96
ocaml: "access",
59
97
interpreter: "access",
60
98
lem: "access_vec_dec",
61
99
c: "vector_access",
62
- coq: "access_vec_dec"
100
+ coq: "access_vec_dec",
101
+ lean: "BitVec.access"
63
102
} : forall ('n : Int). (bits('n), int) -> bit
64
103
65
104
val vector_access_A = {
@@ -74,12 +113,18 @@ val vector_access_B = {
74
113
ocaml: "access",
75
114
interpreter: "access",
76
115
lem: "access_list_dec",
77
- c: "vector_access"
116
+ c: "vector_access",
117
+ lean: "GetElem?.getElem!"
78
118
} : forall ('n : Int) ('a : Type). (vector('n, dec, 'a), int) -> 'a
79
119
80
120
overload vector_access = {bitvector_access_A, bitvector_access_B, vector_access_A, vector_access_B}
81
121
82
- val bitvector_update_B = {ocaml: "update", interpreter: "update", lem: "update_vec_dec", c: "vector_update", coq: "update_vec_dec"} : forall 'n.
122
+ val bitvector_update_B = {
123
+ ocaml: "update",
124
+ interpreter: "update",
125
+ lem: "update_vec_dec",
126
+ c: "vector_update",
127
+ coq: "update_vec_dec"} : forall 'n.
83
128
(bits('n), int, bit) -> bits('n)
84
129
85
130
val vector_update_B = {ocaml: "update", interpreter: "update", lem: "update_list_dec", c: "vector_update", coq: "vec_update_dec"} : forall 'n ('a : Type).
@@ -98,10 +143,21 @@ val vector_update_subrange = {
98
143
val vcons : forall ('n : Int) ('a : Type).
99
144
('a, vector('n, dec, 'a)) -> vector('n + 1, dec, 'a)
100
145
101
- val bitvector_concat = {ocaml: "append", interpreter: "append", lem: "concat_vec", c: "append", coq: "concat_vec"} : forall ('n : Int) ('m : Int).
146
+ val bitvector_concat = {
147
+ ocaml: "append",
148
+ interpreter: "append",
149
+ lem: "concat_vec",
150
+ c: "append",
151
+ coq: "concat_vec",
152
+ lean: "HAppend.hAppend"} : forall ('n : Int) ('m : Int).
102
153
(bits('n), bits('m)) -> bits('n + 'm)
103
154
104
- val vector_concat = {ocaml: "append", interpreter: "append", lem: "append_list", coq: "append_list"} : forall ('n : Int) ('m : Int) ('a : Type).
155
+ val vector_concat = {
156
+ ocaml: "append",
157
+ interpreter: "append",
158
+ lem: "append_list",
159
+ coq: "append_list",
160
+ lean: "HAppend.hAppend"} : forall ('n : Int) ('m : Int) ('a : Type).
105
161
(vector('n, dec, 'a), vector('m, dec, 'a)) -> vector('n + 'm, dec, 'a)
106
162
107
163
overload append = {bitvector_concat, vector_concat}
@@ -111,7 +167,8 @@ val not_vec = {
111
167
interpreter: "not_vec",
112
168
lem: "not_vec",
113
169
c: "not_bits",
114
- coq: "not_vec"
170
+ coq: "not_vec",
171
+ lean: "Complement.complement"
115
172
} : forall 'n. bits('n) -> bits('n)
116
173
117
174
overload ~ = {not_bool, not_vec}
@@ -147,11 +204,13 @@ val UInt = {
147
204
lem: "uint",
148
205
interpreter: "uint",
149
206
c: "sail_unsigned",
150
- coq: "uint"
207
+ coq: "uint",
208
+ lean: "BitVec.toNat"
151
209
} : forall 'n. bits('n) -> {'m, 0 <= 'm <= 2 ^ 'n - 1. int('m)}
152
210
153
211
val SInt = {
154
212
c: "sail_signed",
213
+ lean: "BitVec.toInt",
155
214
_: "sint"
156
215
} : forall 'n. bits('n) -> {'m, (- (2 ^ ('n - 1))) <= 'm <= 2 ^ ('n - 1) - 1. int('m)}
157
216
@@ -232,58 +291,112 @@ val add_vec = {
232
291
interpreter: "add_vec",
233
292
lem: "add_vec",
234
293
c: "add_bits",
235
- coq: "add_vec"
294
+ coq: "add_vec",
295
+ lean: "HAdd.hAdd"
236
296
} : forall 'n. (bits('n), bits('n)) -> bits('n)
237
297
238
298
val add_vec_int = {
239
299
ocaml: "add_vec_int",
240
300
interpreter: "add_vec_int",
241
301
lem: "add_vec_int",
242
302
c: "add_bits_int",
243
- coq: "add_vec_int"
303
+ coq: "add_vec_int",
304
+ lean: "BitVec.addInt"
244
305
} : forall 'n. (bits('n), int) -> bits('n)
245
306
246
- val add_real = {ocaml: "add_real", interpreter: "add_real", lem: "realAdd", c: "add_real", coq: "Rplus"} : (real, real) -> real
307
+ val add_real = {
308
+ ocaml: "add_real",
309
+ interpreter: "add_real",
310
+ lem: "realAdd",
311
+ c: "add_real",
312
+ coq: "Rplus",
313
+ lean: "HAdd.hAdd"} : (real, real) -> real
247
314
248
315
overload operator + = {add_vec, add_vec_int, add_real}
249
316
250
- val sub_vec = {c: "sub_bits", _: "sub_vec"} : forall 'n. (bits('n), bits('n)) -> bits('n)
317
+ val sub_vec = {
318
+ c: "sub_bits",
319
+ lean: "HSub.hSub",
320
+ _: "sub_vec"} : forall 'n. (bits('n), bits('n)) -> bits('n)
251
321
252
322
val sub_vec_int = {
253
323
ocaml: "sub_vec_int",
254
324
interpreter: "sub_vec_int",
255
325
lem: "sub_vec_int",
256
326
c: "sub_bits_int",
257
- coq: "sub_vec_int"
327
+ coq: "sub_vec_int",
328
+ lean: "BitVec.subInt"
258
329
} : forall 'n. (bits('n), int) -> bits('n)
259
330
260
- val sub_real = {ocaml: "sub_real", interpreter: "sub_real", lem: "realMinus", c: "sub_real", coq: "Rminus"} : (real, real) -> real
261
-
262
- val negate_real = {ocaml: "negate_real", interpreter: "negate_real", lem: "realNegate", c: "neg_real", coq: "Ropp"} : real -> real
331
+ val sub_real = {
332
+ ocaml: "sub_real",
333
+ interpreter: "sub_real",
334
+ lem: "realMinus",
335
+ c: "sub_real",
336
+ lean: "HSub.hSub",
337
+ coq: "Rminus"} : (real, real) -> real
338
+
339
+ val negate_real = {
340
+ ocaml: "negate_real",
341
+ interpreter: "negate_real",
342
+ lem: "realNegate",
343
+ c: "neg_real",
344
+ lean: "Neg.neg",
345
+ coq: "Ropp"} : real -> real
263
346
264
347
overload operator - = {sub_vec, sub_vec_int, sub_real}
265
348
266
349
overload negate = {negate_real}
267
350
268
- val mult_real = {ocaml: "mult_real", interpreter: "mult_real", lem: "realMult", c: "mult_real", coq: "Rmult"} : (real, real) -> real
351
+ val mult_real = {
352
+ ocaml: "mult_real",
353
+ interpreter: "mult_real",
354
+ lem: "realMult",
355
+ c: "mult_real",
356
+ lean: "HMul.hMul",
357
+ coq: "Rmult"} : (real, real) -> real
269
358
270
359
overload operator * = {mult_real}
271
360
272
361
val Sqrt = {ocaml: "sqrt_real", interpreter: "sqrt_real", lem: "realSqrt", c: "sqrt_real", coq: "sqrt"} : real -> real
273
362
274
- val gteq_real = {ocaml: "gteq_real", interpreter: "gteq_real", lem: "gteq", c: "gteq_real", coq: "gteq_real"} : (real, real) -> bool
363
+ val gteq_real = {
364
+ ocaml: "gteq_real",
365
+ interpreter: "gteq_real",
366
+ lem: "gteq",
367
+ c: "gteq_real",
368
+ coq: "gteq_real",
369
+ lean: "_lean_ge"} : (real, real) -> bool
275
370
276
371
overload operator >= = {gteq_real}
277
372
278
- val lteq_real = {ocaml: "lteq_real", interpreter: "lteq_real", lem: "lteq", c: "lteq_real", coq: "lteq_real"} : (real, real) -> bool
373
+ val lteq_real = {
374
+ ocaml: "lteq_real",
375
+ interpreter: "lteq_real",
376
+ lem: "lteq",
377
+ c: "lteq_real",
378
+ coq: "lteq_real",
379
+ lean: "_lean_ge"} : (real, real) -> bool
279
380
280
381
overload operator <= = {lteq_real}
281
382
282
- val gt_real = {ocaml: "gt_real", interpreter: "gt_real", lem: "gt", c: "gt_real", coq: "gt_real"} : (real, real) -> bool
383
+ val gt_real = {
384
+ ocaml: "gt_real",
385
+ interpreter: "gt_real",
386
+ lem: "gt",
387
+ c: "gt_real",
388
+ coq: "gt_real",
389
+ lean: "_lean_gt"} : (real, real) -> bool
283
390
284
391
overload operator > = {gt_real}
285
392
286
- val lt_real = {ocaml: "lt_real", interpreter: "lt_real", lem: "lt", c: "lt_real", coq: "lt_real"} : (real, real) -> bool
393
+ val lt_real = {
394
+ ocaml: "lt_real",
395
+ interpreter: "lt_real",
396
+ lem: "lt",
397
+ c: "lt_real",
398
+ coq: "lt_real",
399
+ lean: "_lean_lt"} : (real, real) -> bool
287
400
288
401
overload operator < = {lt_real}
289
402
0 commit comments