aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorazidar2015-04-29 19:23:03 -0700
committerazidar2015-04-29 19:23:03 -0700
commit0608bfbe363780132c0baf1e7098013ab4352f34 (patch)
tree9924e424c3a3a0f7644720f4bf19a900c3b8c83d
parent7c0d0af5b91fcdc2a0cf9619b76be5529968487d (diff)
Fixed bug where a node's width was not equal to its value's
-rw-r--r--src/main/stanza/passes.stanza7
-rw-r--r--test/passes/jacktest/risc.fir80
2 files changed, 39 insertions, 48 deletions
diff --git a/src/main/stanza/passes.stanza b/src/main/stanza/passes.stanza
index 39795a62..5d2abb81 100644
--- a/src/main/stanza/passes.stanza
+++ b/src/main/stanza/passes.stanza
@@ -1520,7 +1520,12 @@ defn gen-constraints (m:Module, h:HashTable<Symbol,Type>, v:Vector<WGeq>) -> Mod
(s:DefWire) : DefWire(name(s),h[name(s)])
(s:DefInstance) : DefInstance(name(s),gen-constraints(module(s)))
(s:DefMemory) : DefMemory(name(s),h[name(s)] as VectorType)
- (s:DefNode) : DefNode(name(s),gen-constraints(value(s)))
+ (s:DefNode) :
+ val l = h[name(s)]
+ val r = gen-constraints(value(s))
+ add(v,WGeq(width!(l),width!(type(r))))
+ add(v,WGeq(width!(type(r)),width!(l)))
+ DefNode(name(s),r)
(s:Connect) :
val l = gen-constraints(loc(s))
val e = gen-constraints(exp(s))
diff --git a/test/passes/jacktest/risc.fir b/test/passes/jacktest/risc.fir
index bb1512d5..a73d57c4 100644
--- a/test/passes/jacktest/risc.fir
+++ b/test/passes/jacktest/risc.fir
@@ -1,5 +1,5 @@
; RUN: firrtl -i %s -o %s.flo -x X -p cTwd | tee %s.out | FileCheck %s
-; CHECK: Expand Whens
+; CHECK: Done!
circuit Risc :
module Risc :
@@ -12,59 +12,45 @@ circuit Risc :
mem file : UInt<32>[256]
mem code : UInt<32>[256]
- node T_51 = UInt<8>(0)
reg pc : UInt<8>
- on-reset pc := T_51
- node add_op = UInt<1>(0)
- node imm_op = UInt<1>(1)
+ on-reset pc := Pad(UInt<8>(0),?)
accessor inst = code[pc]
node op = bits(inst, 31, 24)
node rci = bits(inst, 23, 16)
node rai = bits(inst, 15, 8)
node rbi = bits(inst, 7, 0)
- node T_52 = UInt<1>(0)
- node T_53 = eq(rai, T_52)
- node T_54 = UInt<1>(0)
- accessor T_55 = file[rai]
- node ra = mux(T_53, T_54, T_55)
- node T_56 = UInt<1>(0)
- node T_57 = eq(rbi, T_56)
- node T_58 = UInt<1>(0)
- accessor T_59 = file[rbi]
- node rb = mux(T_57, T_58, T_59)
+ node T_51 = eq(Pad(rai,?), Pad(UInt<1>(0),?))
+ accessor T_52 = file[rai]
+ node ra = mux(Pad(T_51,?), Pad(UInt<1>(0),?), Pad(T_52,?))
+ node T_53 = eq(Pad(rbi,?), Pad(UInt<1>(0),?))
+ accessor T_54 = file[rbi]
+ node rb = mux(Pad(T_53,?), Pad(UInt<1>(0),?), Pad(T_54,?))
wire rc : UInt<32>
- node T_60 = UInt<1>(0)
- valid := T_60
- node T_61 = UInt<1>(0)
- out := T_61
- node T_62 = UInt<1>(0)
- rc := T_62
+ node T_55 = UInt<1>(0)
+ valid := Pad(T_55,?)
+ out := Pad(UInt<1>(0),?)
+ rc := Pad(UInt<1>(0),?)
when isWr :
- accessor T_63 = code[wrAddr]
- T_63 := wrData
- else : when boot :
- node T_64 = UInt<1>(0)
- pc := T_64
+ accessor T_56 = code[wrAddr]
+ T_56 := Pad(wrData,?)
+ else : when boot : pc := Pad(UInt<1>(0),?)
else :
- node T_65 = eq(add_op, op)
- when T_65 :
- node T_66 = add-wrap(ra, rb)
- rc := T_66
- node T_67 = eq(imm_op, op)
- when T_67 :
- node T_68 = shl(rai, 8)
- node T_69 = bit-or(T_68, rbi)
- rc := T_69
- out := rc
- node T_70 = UInt<8>(255)
- node T_71 = eq(rci, T_70)
- when T_71 :
- node T_72 = UInt<1>(1)
- valid := T_72
+ node T_57 = eq(Pad(UInt<1>(0),?), Pad(op,?))
+ when T_57 :
+ node T_58 = add-wrap(Pad(ra,?), Pad(rb,?))
+ rc := Pad(T_58,?)
+ node T_59 = eq(Pad(UInt<1>(1),?), Pad(op,?))
+ when T_59 :
+ node T_60 = shl(rai, 8)
+ node T_61 = bit-or(Pad(T_60,?), Pad(rbi,?))
+ rc := Pad(T_61,?)
+ out := Pad(rc,?)
+ node T_62 = eq(Pad(rci,?), Pad(UInt<8>(255),?))
+ when T_62 :
+ node T_63 = UInt<1>(1)
+ valid := Pad(T_63,?)
else :
- accessor T_73 = file[rci]
- T_73 := rc
- node T_74 = UInt<1>(1)
- node T_75 = add-wrap(pc, T_74)
- pc := T_75
-; CHECK: Finished Expand Whens
+ accessor T_64 = file[rci]
+ T_64 := Pad(rc,?)
+ node T_65 = add-wrap(Pad(pc,?), Pad(UInt<1>(1),?))
+ pc := Pad(T_65,?)