1
- indexvar index, i, j, k, l, m, n ::= {{ com subscripts}}
1
+ indexvar index, m, n ::= {{ com subscripts}}
2
2
metavar id ::= {{ com a literal for variable}}
3
3
metavar num ::= {{ com number literal }}
4
4
metavar string,str ::= {{ com quoted string literal }}
@@ -22,29 +22,29 @@ grammar
22
22
| ( exp ) :: S :: paren
23
23
| var :: :: var
24
24
| word :: :: int
25
- | e1 [ e2 , endian ] : size :: :: load
26
- | e1 with [ e2 , endian ] : size <- e3 :: :: store
25
+ | e1 [ e2 , endian ] : nat :: :: load
26
+ | e1 with [ e2 , endian ] : nat <- e3 :: :: store
27
27
| e1 bop e2 :: :: binop
28
28
| uop e1 :: :: unop
29
- | cast : size [ e ] :: :: cast
29
+ | cast : nat [ e ] :: :: cast
30
30
| let var = e1 in e2 :: :: let
31
31
| unknown [ string ] : type :: :: unk
32
32
| if e1 then e2 else e3 :: :: ite
33
- | extract : size1 : size2 [ e ] :: :: ext
33
+ | extract : nat1 : nat2 [ e ] :: :: ext
34
34
| e1 @ e2 :: :: concat
35
35
36
36
var :: var_ ::=
37
37
| id : type :: S :: var
38
38
39
39
val,v :: val_ ::=
40
40
| word :: M :: imm
41
- | v1 with [ v2 , endian ] : size <- v3 :: M :: mem
41
+ | v1 with [ v2 , endian ] : nat <- v3 :: M :: mem
42
42
| unknown [ string ] : type :: M :: bot
43
43
44
44
word,w :: word_ ::=
45
45
| (w) :: S :: paren
46
- | num : size :: S :: word
47
- | 1 : size :: S :: one
46
+ | num : nat :: S :: word
47
+ | 1 : nat :: S :: one
48
48
| true :: S :: true
49
49
| false :: S :: false
50
50
| w1 .+ w2 :: S :: plus
@@ -80,7 +80,7 @@ grammar
80
80
| w1 .@ w2 :: S :: concat
81
81
{{ tex [[w1]] \stackrel{bv} . [[w2]] }}
82
82
| ext word ~hi : sz1 ~lo : sz2 :: S :: extend_extract
83
- | ext_s word ~hi : sz1 ~lo : sz2 :: S :: extend_extract_signed
83
+ | exts word ~hi : sz1 ~lo : sz2 :: S :: extend_extract_signed
84
84
85
85
86
86
@@ -113,13 +113,13 @@ grammar
113
113
| - :: :: neg
114
114
| ~ :: :: not
115
115
116
- size ,sz :: size_ ::=
116
+ nat ,sz :: nat_ ::=
117
117
| 0 :: M :: zero
118
118
| 1 :: M :: one
119
119
| 8 :: M :: byte
120
- | size1 + size2 :: M :: size_plus
121
- | size1 - size2 :: M :: size_minus
122
- | ( size ) :: M :: size_paren
120
+ | nat1 + nat2 :: M :: nat_plus
121
+ | nat1 - nat2 :: M :: nat_minus
122
+ | ( nat ) :: M :: nat_paren
123
123
124
124
endian,ed :: endian_ ::=
125
125
| el :: :: little
@@ -132,19 +132,21 @@ grammar
132
132
| unsigned :: :: unsinged
133
133
134
134
type,t :: type_ ::=
135
- | reg_ size :: :: imm
136
- | t1 ? t2 :: :: mem
135
+ | imm < nat > :: :: imm
136
+ | mem < nat1 , nat2 > :: :: mem
137
137
138
- delta {{ tex \Delta}} :: '' ::=
138
+ delta {{ tex \Delta}} :: delta_ ::=
139
139
| [] :: :: nil
140
140
| delta [ var <- val ] :: :: cons
141
141
142
-
143
142
formula :: formula_ ::=
144
143
| judgement :: :: judgement
145
144
| ( formula ) :: M :: paren {{ coq ([[formula]]) }}
146
145
| not formula :: M :: not {{ coq not [[formula]]}}
147
146
| e1 <> e2 :: M :: exp_neq {{ coq ([[e1]] <> [[e2]]) }}
147
+ | nat1 > nat2 :: M :: nat_gt {{ coq ([[nat1]] > [[nat2]])}}
148
+ | nat1 = nat2 :: M :: nat_eq {{ coq ([[nat1]] = [[nat2]])}}
149
+ | nat1 >= nat2 :: M :: nat_ge {{ coq ([[nat1]] >= [[nat2]])}}
148
150
149
151
terminals :: terminals_ ::=
150
152
| -> :: :: rarrow {{ tex \rightarrow }}
@@ -215,16 +217,16 @@ defns reduce_exp :: '' ::=
215
217
delta |- (v1 with [w,ed]:8 <- num:8)[w,ed]:8 ~> num:8
216
218
217
219
------------------------------------------------------------------------------ :: load_un_addr
218
- delta |- (v1 with [unknown[str]:t,ed]:8 <- v2)[v3,ed]:8 ~> unknown[str]:reg_8
220
+ delta |- (v1 with [unknown[str]:t,ed]:8 <- v2)[v3,ed]:8 ~> unknown[str]:imm<8>
219
221
220
222
221
223
222
224
w1 <> w2
223
225
---------------------------------------------------------- :: load_rec
224
226
delta |- (v1 with [w1,ed]:8 <- v3)[w2,ed]:8 ~> v1[w2,ed]:8
225
227
226
- ----------------------------------------------- :: load_un_mem
227
- delta |- unknown[str]: t1?t2 ~> unknown[str]:t2
228
+ ---------------------------------------------------------- :: load_un_mem
229
+ delta |- unknown[str]: mem<nat,sz> ~> unknown[str]:imm<sz>
228
230
229
231
succ w = w'
230
232
--------------------------------------------------- :: load_word_be
@@ -420,7 +422,7 @@ defns reduce_exp :: '' ::=
420
422
421
423
422
424
-------------------------------------------- :: cast_signed
423
- delta |- signed:sz[w] ~> ext_s w ~hi:(sz-1) ~lo:0
425
+ delta |- signed:sz[w] ~> exts w ~hi:(sz-1) ~lo:0
424
426
425
427
-------------------------------------------- :: cast_unsigned
426
428
delta |- unsigned:sz[w] ~> low:sz[w]
@@ -492,4 +494,81 @@ defns reduce_stmt :: '' ::=
492
494
493
495
494
496
------------------------------------------------------------- :: seq_one
495
- delta,word |- {s1} ~> delta, word, {s1}
497
+ delta,word |- {s1} ~> delta, word, {s1}
498
+
499
+
500
+ defns typing_exp :: '' ::=
501
+ defn exp '::' type :: :: type :: t_ by
502
+
503
+
504
+ ----------------- :: var
505
+ id:t :: t
506
+
507
+ ----------------- :: int
508
+ num:sz :: imm<sz>
509
+
510
+
511
+ ----------------- :: true
512
+ true :: imm<1>
513
+
514
+
515
+ ----------------- :: false
516
+ false :: imm<1>
517
+
518
+
519
+ e1 :: mem<nat,sz>
520
+ e2 :: imm<nat>
521
+ -------------------------- :: load
522
+ e1 [e2, ed] : sz :: imm<sz>
523
+
524
+
525
+ e1 :: mem<nat,sz>
526
+ e2 :: imm<nat>
527
+ e3 :: imm<sz>
528
+ --------------------------------------------- :: store
529
+ e1 with [e2, ed]:sz <- e3 :: mem<nat,sz>
530
+
531
+
532
+ e1 :: imm<sz>
533
+ e2 :: imm<sz>
534
+ --------------------------------- :: bop
535
+ e1 bop e2 :: imm<sz>
536
+
537
+
538
+ e1 :: imm<sz>
539
+ ---------------------------------- :: uop
540
+ uop e1 :: imm<sz>
541
+
542
+
543
+ e :: imm<nat>
544
+ --------------------- :: cast
545
+ cast:sz[e] :: imm<sz>
546
+
547
+
548
+ var :: t
549
+ e1 :: t
550
+ e2 :: t'
551
+ ------------------------ :: let
552
+ let var = e1 in e2 :: t'
553
+
554
+
555
+ ------------------------- :: unknown
556
+ unknown[str]:t :: t
557
+
558
+
559
+ e1 :: imm<1>
560
+ e2 :: t
561
+ e3 :: t
562
+ -------------------------- :: ite
563
+ if e1 then e2 else e3 :: t
564
+
565
+ e :: imm<sz>
566
+ sz1 >= sz2
567
+ ---------------------------------- :: extract
568
+ extract:sz1:sz2[e] :: imm<sz1-sz2+1>
569
+
570
+
571
+ e1 :: imm<sz1>
572
+ e2 :: imm<sz2>
573
+ ---------------------------------- :: concat
574
+ e1 @ e2 :: imm<sz1+sz2>
0 commit comments