26
26
package org .sireum .logika
27
27
28
28
import org .sireum ._
29
- import org .sireum .lang .symbol .Info
29
+ import org .sireum .lang .symbol .{ Info , TypeInfo }
30
30
import org .sireum .lang .{ast => AST }
31
31
import org .sireum .lang .tipe .TypeHierarchy
32
32
@@ -359,7 +359,7 @@ object RewritingSystem {
359
359
}
360
360
case e : AST .Exp .Tuple =>
361
361
return if (e.args.size == 1 ) rec(e.args(0 ), funStack, localMap)
362
- else AST .CoreExp .Tuple ( for (arg <- e.args) yield rec(arg, funStack, localMap))
362
+ else AST .CoreExp .Constructor (e.typedOpt.get, for (arg <- e.args) yield rec(arg, funStack, localMap))
363
363
case e : AST .Exp .Ident =>
364
364
e.resOpt.get match {
365
365
case res : AST .ResolvedInfo .LocalVar =>
@@ -450,27 +450,86 @@ object RewritingSystem {
450
450
return recStmt(e.block, funStack, localMap)._1.get
451
451
case e : AST .Exp .Invoke =>
452
452
val args : ISZ [AST .CoreExp .Base ] = for (arg <- e.args) yield rec(arg, funStack, localMap)
453
+ e.attr.resOpt.get match {
454
+ case res : AST .ResolvedInfo .Method if res.mode == AST .MethodMode .Constructor =>
455
+ res.mode match {
456
+ case AST .MethodMode .Spec =>
457
+ case AST .MethodMode .Method =>
458
+ case AST .MethodMode .Constructor =>
459
+ return AST .CoreExp .Constructor (e.typedOpt.get, args)
460
+ case AST .MethodMode .Select =>
461
+ e.receiverOpt match {
462
+ case Some (receiver) => return AST .CoreExp .Indexing (rec(receiver, funStack, localMap),
463
+ rec(e.args(0 ), funStack, localMap), e.typedOpt.get)
464
+ case _ => return AST .CoreExp .Indexing (rec(e.ident, funStack, localMap),
465
+ rec(e.args(0 ), funStack, localMap), e.typedOpt.get)
466
+ }
467
+ case AST .MethodMode .Store =>
468
+ val ie = rec(e.args(0 ), funStack, localMap)
469
+ val tuple = ie.tipe.asInstanceOf [AST .Typed .Tuple ]
470
+ val index = AST .CoreExp .Select (ie, " _1" , tuple.args(0 ))
471
+ val value = AST .CoreExp .Select (ie, " _2" , tuple.args(1 ))
472
+ e.receiverOpt match {
473
+ case Some (receiver) => return AST .CoreExp .IndexingUpdate (rec(receiver, funStack, localMap),
474
+ index, value, e.typedOpt.get)
475
+ case _ => return AST .CoreExp .IndexingUpdate (rec(e.ident, funStack, localMap),
476
+ index, value, e.typedOpt.get)
477
+ }
478
+ case AST .MethodMode .Extractor => halt(" TODO" )
479
+ case AST .MethodMode .Ext => halt(" TODO" )
480
+ case AST .MethodMode .ObjectConstructor => halt(" TODO" )
481
+ case AST .MethodMode .Just => halt(" Infeasible" )
482
+ case AST .MethodMode .Copy => halt(" Infeasible" )
483
+ }
484
+ case _ =>
485
+ }
453
486
e.receiverOpt match {
454
487
case Some (receiver) =>
455
- return AST .CoreExp .Apply (
456
- AST .CoreExp .Select (rec(receiver, funStack, localMap), e.ident.id.value,
457
- e.ident.typedOpt.get), args, e.typedOpt.get)
458
- case _ => return AST .CoreExp .Apply (rec(e.ident, funStack, localMap),
488
+ return AST .CoreExp .Apply (T , rec(e.ident, funStack, localMap),
489
+ rec(receiver, funStack, localMap) +: args, e.typedOpt.get)
490
+ case _ => return AST .CoreExp .Apply (F , rec(e.ident, funStack, localMap),
459
491
args, e.typedOpt.get)
460
492
}
461
493
case e : AST .Exp .InvokeNamed =>
462
- val args = MS .create[Z , AST .CoreExp .Base ](e.args.size, AST .CoreExp .LitB (F ))
463
- for (arg <- e.args) {
464
- args(arg.index) = rec(arg.arg, funStack, localMap)
494
+ def getArgs : ISZ [AST .CoreExp .Base ] = {
495
+ val args = MS .create[Z , AST .CoreExp .Base ](e.args.size, AST .CoreExp .LitB (F ))
496
+ for (arg <- e.args) {
497
+ args(arg.index) = rec(arg.arg, funStack, localMap)
498
+ }
499
+ return args.toISZ
500
+ }
501
+ e.attr.resOpt.get match {
502
+ case res : AST .ResolvedInfo .Method if res.mode == AST .MethodMode .Constructor =>
503
+ res.mode match {
504
+ case AST .MethodMode .Constructor =>
505
+ return AST .CoreExp .Constructor (e.typedOpt.get, getArgs)
506
+ case AST .MethodMode .Spec =>
507
+ case AST .MethodMode .Method =>
508
+ case AST .MethodMode .Copy =>
509
+ var r : AST .CoreExp .Base = e.receiverOpt match {
510
+ case Some (receiver) => rec(receiver, funStack, localMap)
511
+ case _ => rec(e.ident, funStack, localMap)
512
+ }
513
+ val t = e.typedOpt.get
514
+ for (arg <- e.args) {
515
+ r = AST .CoreExp .Update (r, arg.id.value, r, t)
516
+ }
517
+ return r
518
+ case AST .MethodMode .Ext => halt(" TODO" )
519
+ case AST .MethodMode .Extractor => halt(" TODO" )
520
+ case AST .MethodMode .ObjectConstructor => halt(" TODO" )
521
+ case AST .MethodMode .Just => halt(" Infeasible" )
522
+ case AST .MethodMode .Select => halt(" Infeasible" )
523
+ case AST .MethodMode .Store => halt(" Infeasible" )
524
+ }
525
+ case _ =>
465
526
}
466
527
e.receiverOpt match {
467
528
case Some (receiver) =>
468
- return AST .CoreExp .Apply (
469
- AST .CoreExp .Select (rec(receiver, funStack, localMap), e.ident.id.value,
470
- e.ident.typedOpt.get),
471
- args.toISZ, e.typedOpt.get)
472
- case _ => return AST .CoreExp .Apply (rec(e.ident, funStack, localMap),
473
- args.toISZ, e.typedOpt.get)
529
+ return AST .CoreExp .Apply (T , rec(e.ident, funStack, localMap),
530
+ rec(receiver, funStack, localMap) +: getArgs, e.typedOpt.get)
531
+ case _ => return AST .CoreExp .Apply (F , rec(e.ident, funStack, localMap),
532
+ getArgs, e.typedOpt.get)
474
533
}
475
534
case e => halt(s " TODO: $e" )
476
535
}
@@ -618,8 +677,8 @@ object RewritingSystem {
618
677
} else {
619
678
matchPatternLocals(p.exp, e.exp)
620
679
}
621
- case (p : AST .CoreExp .Tuple , e : AST .CoreExp .Tuple ) =>
622
- if (p.args.size != e.args.size) {
680
+ case (p : AST .CoreExp .Constructor , e : AST .CoreExp .Constructor ) =>
681
+ if (p.args.size != e.args.size || p.tipe != e.tipe ) {
623
682
err(p, e)
624
683
} else {
625
684
for (i <- 0 until p.args.size) {
@@ -691,7 +750,7 @@ object RewritingSystem {
691
750
}
692
751
e match {
693
752
case e : AST .CoreExp .Apply =>
694
- if (p.args.size != e.args.size) {
753
+ if (p.hasReceiver != e.hasReceiver || p. args.size != e.args.size) {
695
754
err(p, e)
696
755
} else {
697
756
matchPatternLocals(p.exp, e.exp)
@@ -740,7 +799,7 @@ object RewritingSystem {
740
799
val (context, id, args, e) = pa
741
800
m.get((context, id)) match {
742
801
case Some (f : AST .CoreExp .Fun ) =>
743
- evalBase(th, EvalConfig .funApplicationOnly, AST .CoreExp .Apply (f, args, e.tipe)) match {
802
+ evalBase(th, EvalConfig .funApplicationOnly, AST .CoreExp .Apply (F , f, args, e.tipe)) match {
744
803
case Some (pattern) =>
745
804
m = unifyExp(silent, th, localPatterns, pattern, e, m, pendingApplications, substMap, errorMessages)
746
805
case _ =>
@@ -1025,10 +1084,66 @@ object RewritingSystem {
1025
1084
}
1026
1085
return if (changed) Some (e(exp = ue)) else None ()
1027
1086
case e : AST .CoreExp .Select =>
1028
- rec(deBruijnMap, e.exp) match {
1029
- case Some (receiver) => return Some (e(exp = receiver))
1030
- case _ => return None ()
1087
+ var changed = F
1088
+ val receiver : AST .CoreExp .Base = rec(deBruijnMap, e.exp) match {
1089
+ case Some (exp2) =>
1090
+ changed = T
1091
+ exp2
1092
+ case _ => e.exp
1031
1093
}
1094
+ if (config.tupleProjection && receiver.tipe.isInstanceOf [AST .Typed .Tuple ]) {
1095
+ receiver match {
1096
+ case receiver : AST .CoreExp .Constructor =>
1097
+ val n = Z (ops.StringOps (e.id).substring(1 , e.id.size)).get - 1
1098
+ return Some (receiver.args(n))
1099
+ case _ =>
1100
+ }
1101
+ }
1102
+ if (config.fieldAccess) {
1103
+ val rt = receiver.tipe.asInstanceOf [AST .Typed .Name ]
1104
+ receiver match {
1105
+ case receiver : AST .CoreExp .Update =>
1106
+ if (receiver.id == e.id) {
1107
+ return Some (receiver.arg)
1108
+ } else {
1109
+ return evalBase(th, config, e(exp = receiver))
1110
+ }
1111
+ case receiver : AST .CoreExp .IndexingUpdate => return evalBase(th, config, e(exp = receiver.exp))
1112
+ case receiver : AST .CoreExp .Constructor =>
1113
+ if (e.id == " size" && (rt.ids == AST .Typed .isName || rt.ids == AST .Typed .msName)) {
1114
+ return Some (AST .CoreExp .LitZ (receiver.args.size))
1115
+ } else {
1116
+ val info = th.typeMap.get(rt.ids).get.asInstanceOf [TypeInfo .Adt ]
1117
+ val paramIndexMap = HashMap .empty[String , Z ] ++ (for (i <- 0 until info.ast.params.size) yield
1118
+ (info.ast.params(i).id.value, i))
1119
+ paramIndexMap.get(e.id) match {
1120
+ case Some (i) => return Some (receiver.args(i))
1121
+ case _ =>
1122
+ }
1123
+ }
1124
+ case _ =>
1125
+ }
1126
+ th.typeMap.get(rt.ids).get match {
1127
+ case info : TypeInfo .SubZ =>
1128
+ e.id match {
1129
+ case " Name" => return Some (AST .CoreExp .LitString (st " ${(rt.ids, " ." )}" .render))
1130
+ case " isBitVector" => return Some (AST .CoreExp .LitB (info.ast.isBitVector))
1131
+ case " hasMin" => return Some (AST .CoreExp .LitB (info.ast.hasMin))
1132
+ case " hasMax" => return Some (AST .CoreExp .LitB (info.ast.hasMax))
1133
+ case " BitWidth" if info.ast.isBitVector => return Some (AST .CoreExp .LitZ (info.ast.bitWidth))
1134
+ case " Min" if info.ast.hasMin => return Some (AST .CoreExp .LitZ (info.ast.min))
1135
+ case " Max" if info.ast.hasMax => return Some (AST .CoreExp .LitZ (info.ast.max))
1136
+ case " isIndex" => return Some (AST .CoreExp .LitB (info.ast.isIndex))
1137
+ case " Index" => return Some (AST .CoreExp .LitZ (info.ast.index))
1138
+ case " isSigned" => return Some (AST .CoreExp .LitB (info.ast.isSigned))
1139
+ case " isZeroIndex" => return Some (AST .CoreExp .LitB (info.ast.isZeroIndex))
1140
+ case _ => halt(s " Infeasible: ${e.id}" )
1141
+ }
1142
+ case info : TypeInfo .Enum => halt(" TODO" )
1143
+ case _ =>
1144
+ }
1145
+ }
1146
+ return if (changed) Some (e(exp = receiver)) else None ()
1032
1147
case e : AST .CoreExp .Update =>
1033
1148
var changed = F
1034
1149
val receiver : AST .CoreExp .Base = rec(deBruijnMap, e.exp) match {
@@ -1043,6 +1158,13 @@ object RewritingSystem {
1043
1158
arg2
1044
1159
case _ => e.arg
1045
1160
}
1161
+ if (config.fieldAccess) {
1162
+ receiver match {
1163
+ case receiver : AST .CoreExp .Update if receiver.id == e.id =>
1164
+ return Some (e(exp = receiver.exp, arg = arg))
1165
+ case _ =>
1166
+ }
1167
+ }
1046
1168
return if (changed) Some (e(exp = receiver, arg = arg)) else None ()
1047
1169
case e : AST .CoreExp .Indexing =>
1048
1170
var changed = F
@@ -1058,6 +1180,13 @@ object RewritingSystem {
1058
1180
index2
1059
1181
case _ => e.index
1060
1182
}
1183
+ if (config.seqIndexing) {
1184
+ receiver match {
1185
+ case receiver : AST .CoreExp .IndexingUpdate if index == receiver.index =>
1186
+ return Some (receiver.arg)
1187
+ case _ =>
1188
+ }
1189
+ }
1061
1190
return if (changed) Some (e(exp = receiver, index = index)) else None ()
1062
1191
case e : AST .CoreExp .IndexingUpdate =>
1063
1192
var changed = F
@@ -1079,8 +1208,15 @@ object RewritingSystem {
1079
1208
arg2
1080
1209
case _ => e.arg
1081
1210
}
1211
+ if (config.seqIndexing) {
1212
+ receiver match {
1213
+ case receiver : AST .CoreExp .IndexingUpdate if index == receiver.index =>
1214
+ return Some (e(exp = receiver.exp, index = index, arg = arg))
1215
+ case _ =>
1216
+ }
1217
+ }
1082
1218
return if (changed) Some (e(exp = receiver, index = index, arg = arg)) else None ()
1083
- case e : AST .CoreExp .Tuple =>
1219
+ case e : AST .CoreExp .Constructor =>
1084
1220
var changed = F
1085
1221
var args = ISZ [AST .CoreExp .Base ]()
1086
1222
for (arg <- e.args) {
@@ -1207,8 +1343,7 @@ object RewritingSystem {
1207
1343
}
1208
1344
case e : AST .CoreExp .Quant if e.kind == AST .CoreExp .Quant .Kind .ForAll =>
1209
1345
return toCondEquivH(evalBase(th, EvalConfig .quantApplicationOnly,
1210
- AST .CoreExp .Apply (
1211
- e,
1346
+ AST .CoreExp .Apply (F , e,
1212
1347
ISZ (AST .CoreExp .LocalVarRef (T , ISZ (), paramId(e.param.id), e.param.tipe)),
1213
1348
AST .Typed .b)).get)
1214
1349
case e : AST .CoreExp .If =>
0 commit comments