diff --git a/build.sbt b/build.sbt index 2b4333a..1371b1c 100644 --- a/build.sbt +++ b/build.sbt @@ -17,9 +17,9 @@ resolvers ++= Seq( // Managed dependency on latest FIRRTL + chisel3 //libraryDependencies += "edu.berkeley.cs" %% "firrtl" % "1.2.0-RC1" -libraryDependencies += "edu.berkeley.cs" %% "firrtl" % "1.3.2" +libraryDependencies += "edu.berkeley.cs" %% "firrtl" % "1.4.2" //libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.2.0-RC1" -libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.3.2" +libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.4.2" libraryDependencies += "org.json4s" %% "json4s-native" % "3.6.9" diff --git a/src/main/scala/chiselucl/backend/UclidEmitter.scala b/src/main/scala/chiselucl/backend/UclidEmitter.scala index 967209f..a4c1ab9 100644 --- a/src/main/scala/chiselucl/backend/UclidEmitter.scala +++ b/src/main/scala/chiselucl/backend/UclidEmitter.scala @@ -94,11 +94,30 @@ class UclidEmitter extends Transform with DependencyAPIMigration { private def serialize_unop(p: DoPrim, arg0: String): String = p.op match { case Neg => s"-$arg0" - case Not => s"~${arg0}" + case Not => s"~$arg0" // TODO: Handle asUInt operator case AsUInt => arg0 // TODO: Handle asSInt operator case AsSInt => arg0 + case Cvt => + // Converts unsigned to signed + val dstLen = get_width(p.tpe) + val srcLen = get_width(p.args.head.tpe) + val diff = dstLen - srcLen + if (diff == 0) { + arg0 + } else { + s"bv_sign_extend($diff, $arg0)" + } + case Andr | Orr | Xorr => + // Simulate bitwise reduction operators + (0 until get_width(p.args.head.tpe)).map(i => s"$arg0[$i:$i]").mkString( + p.op match { + case Andr => " & " + case Orr => " | " + case Xorr => " ^ " + } + ) case _ => throwInternalError(s"Illegal unary operator: ${p.op}") }