diff options
Diffstat (limited to 'src/main/scala/firrtl/Visitor.scala')
| -rw-r--r-- | src/main/scala/firrtl/Visitor.scala | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/Visitor.scala b/src/main/scala/firrtl/Visitor.scala index 01de8f15..112343d1 100644 --- a/src/main/scala/firrtl/Visitor.scala +++ b/src/main/scala/firrtl/Visitor.scala @@ -30,6 +30,7 @@ class Visitor(infoMode: InfoMode) extends AbstractParseTreeVisitor[FirrtlNode] w private val HexPattern = """\"*h([+\-]?[a-zA-Z0-9]+)\"*""".r private val DecPattern = """([+\-]?[1-9]\d*)""".r private val ZeroPattern = "0".r + private val DecimalPattern = """([+\-]?[0-9]\d*\.[0-9]\d*)""".r private def string2BigInt(s: String): BigInt = { // private define legal patterns @@ -41,6 +42,16 @@ class Visitor(infoMode: InfoMode) extends AbstractParseTreeVisitor[FirrtlNode] w } } + private def string2BigDecimal(s: String): BigDecimal = { + // private define legal patterns + s match { + case ZeroPattern(_*) => BigDecimal(0) + case DecPattern(num) => BigDecimal(num) + case DecimalPattern(num) => BigDecimal(num) + case _ => throw new Exception("Invalid String for conversion to BigDecimal " + s) + } + } + private def string2Int(s: String): Int = string2BigInt(s).toInt private def visitInfo(ctx: Option[InfoContext], parentCtx: ParserRuleContext): Info = { @@ -129,6 +140,30 @@ class Visitor(infoMode: InfoMode) extends AbstractParseTreeVisitor[FirrtlNode] w } case 2 => FixedType(getWidth(ctx.intLit(0)), getWidth(ctx.intLit(1))) } + case "Interval" => ctx.boundValue.size match { + case 0 => + val point = ctx.intLit.size match { + case 0 => UnknownWidth + case 1 => IntWidth(string2BigInt(ctx.intLit(0).getText)) + } + IntervalType(UnknownBound, UnknownBound, point) + case 2 => + val lower = (ctx.lowerBound.getText, ctx.boundValue(0).getText) match { + case (_, "?") => UnknownBound + case ("(", v) => Open(string2BigDecimal(v)) + case ("[", v) => Closed(string2BigDecimal(v)) + } + val upper = (ctx.upperBound.getText, ctx.boundValue(1).getText) match { + case (_, "?") => UnknownBound + case (")", v) => Open(string2BigDecimal(v)) + case ("]", v) => Closed(string2BigDecimal(v)) + } + val point = ctx.intLit.size match { + case 0 => UnknownWidth + case 1 => IntWidth(string2BigInt(ctx.intLit(0).getText)) + } + IntervalType(lower, upper, point) + } case "Clock" => ClockType case "AsyncReset" => AsyncResetType case "Reset" => ResetType |
