aboutsummaryrefslogtreecommitdiff
path: root/src/main/stanza/primop.stanza
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/stanza/primop.stanza')
-rw-r--r--src/main/stanza/primop.stanza36
1 files changed, 20 insertions, 16 deletions
diff --git a/src/main/stanza/primop.stanza b/src/main/stanza/primop.stanza
index 14589135..e88a6b8e 100644
--- a/src/main/stanza/primop.stanza
+++ b/src/main/stanza/primop.stanza
@@ -248,12 +248,12 @@ public defn lower-and-type-primop (e:DoPrim) -> DoPrim :
BIT-XOR-REDUCE-OP: DoPrim(op(e),args(e),consts(e),u())
public defn primop-gen-constraints (e:DoPrim,v:Vector<WGeq>) -> Type :
- defn all-equal (ls:List<Expression>) -> Width :
- if length(ls) == 1 : width!(ls[0])
+ defn all-equal (ls:List<Width>) -> Width :
+ if length(ls) == 1 : (ls[0])
else :
- val m = MaxWidth(map(width!,ls))
+ val m = MaxWidth(ls)
for (l in ls) do :
- add(v,WGeq(width!(l),m))
+ add(v,WGeq(l,m))
m
;defn new-width (w:Width) -> Width:
; val w* = VarWidth(gensym(`w))
@@ -275,9 +275,11 @@ public defn primop-gen-constraints (e:DoPrim,v:Vector<WGeq>) -> Type :
val all-args-not-equal = list(MUX-UU-OP,MUX-SS-OP,CONCAT-OP)
;val consts-gte-args = list(PAD-U-OP,PAD-S-OP)
+
+ val w-var = VarWidth(gensym(`w))
val w* =
if not contains?(all-args-not-equal,op(e)) :
- val max-args-w = all-equal(args(e))
+ val max-args-w = all-equal(map(width!,args(e)))
switch {op(e) == _} :
ADD-UU-OP : PlusWidth(max-args-w,IntWidth(1))
ADD-US-OP : PlusWidth(max-args-w,IntWidth(1))
@@ -327,34 +329,36 @@ public defn primop-gen-constraints (e:DoPrim,v:Vector<WGeq>) -> Type :
PAD-S-OP : IntWidth(consts(e)[0])
NEG-U-OP : IntWidth(1)
NEG-S-OP : IntWidth(1)
- AS-UINT-U-OP : max-args-w
- AS-UINT-S-OP : max-args-w
- AS-SINT-U-OP : max-args-w
- AS-SINT-S-OP : max-args-w
SHIFT-LEFT-U-OP : PlusWidth(max-args-w,IntWidth(consts(e)[0]))
SHIFT-LEFT-S-OP : PlusWidth(max-args-w,IntWidth(consts(e)[0]))
SHIFT-RIGHT-U-OP : MinusWidth(max-args-w,IntWidth(consts(e)[0]))
SHIFT-RIGHT-S-OP : MinusWidth(max-args-w,IntWidth(consts(e)[0]))
CONVERT-U-OP : PlusWidth(max-args-w,IntWidth(1))
CONVERT-S-OP : max-args-w
- BIT-NOT-OP : max-args-w
- BIT-AND-OP : max-args-w
- BIT-OR-OP : max-args-w
- BIT-XOR-OP : max-args-w
BIT-SELECT-OP : IntWidth(1)
BITS-SELECT-OP : IntWidth(consts(e)[0] - consts(e)[1])
else :
switch {op(e) == _} :
MUX-UU-OP :
add(v,WGeq(width!(args(e)[0]),IntWidth(1)))
- all-equal(tail(args(e)))
+ all-equal(List(w-var,tail(map(width!,args(e)))))
MUX-SS-OP :
add(v,WGeq(width!(args(e)[0]),IntWidth(1)))
- all-equal(tail(args(e)))
+ all-equal(List(w-var,tail(map(width!,args(e)))))
CONCAT-OP :
PlusWidth(width!(args(e)[0]),width!(args(e)[1]))
+ BIT-NOT-OP : all-equal(List(w-var,map(width!,args(e))))
+ BIT-AND-OP : all-equal(List(w-var,map(width!,args(e))))
+ BIT-OR-OP : all-equal(List(w-var,map(width!,args(e))))
+ BIT-XOR-OP : all-equal(List(w-var,map(width!,args(e))))
+ BIT-AND-REDUCE-OP : all-equal(List(w-var,map(width!,args(e))))
+ BIT-OR-REDUCE-OP : all-equal(List(w-var,map(width!,args(e))))
+ BIT-XOR-REDUCE-OP : all-equal(List(w-var,map(width!,args(e))))
+ AS-UINT-U-OP : all-equal(List(w-var,map(width!,args(e))))
+ AS-UINT-S-OP : all-equal(List(w-var,map(width!,args(e))))
+ AS-SINT-U-OP : all-equal(List(w-var,map(width!,args(e))))
+ AS-SINT-S-OP : all-equal(List(w-var,map(width!,args(e))))
- val w-var = VarWidth(gensym(`w))
add(v,WGeq(w-var,w*))
match(type(e)) :
(t:UIntType) : UIntType(w-var)