diff options
Diffstat (limited to 'src/main')
| -rw-r--r-- | src/main/scala/firrtl/passes/Checks.scala | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/main/scala/firrtl/passes/Checks.scala b/src/main/scala/firrtl/passes/Checks.scala index 09c818bd..454cdb90 100644 --- a/src/main/scala/firrtl/passes/Checks.scala +++ b/src/main/scala/firrtl/passes/Checks.scala @@ -49,6 +49,8 @@ object CheckHighForm extends Pass { s"$info: [module $mname] Has instance loop $loop") class NoTopModuleException(info: Info, name: String) extends PassException( s"$info: A single module must be named $name.") + class NegArgException(info: Info, mname: String, op: String, value: Int) extends PassException( + s"$info: [module $mname] Primop $op argument $value < 0.") // TODO FIXME // - Do we need to check for uniquness on port names? @@ -74,8 +76,14 @@ object CheckHighForm extends Pass { correctNum(Option(2), 0) case AsUInt | AsSInt | AsClock | Cvt | Neq | Not => correctNum(Option(1), 0) - case AsFixedPoint | Pad | Shl | Shr | Head | Tail | BPShl | BPShr | BPSet => + case AsFixedPoint | Pad | Head | Tail | BPShl | BPShr | BPSet => correctNum(Option(1), 1) + case Shl | Shr => + correctNum(Option(1), 1) + val amount = e.consts.head.toInt + if (amount < 0) { + errors.append(new NegArgException(info, mname, e.op.toString, amount)) + } case Bits => correctNum(Option(1), 2) case Andr | Orr | Xorr | Neg => |
