Port to the latest stable Chisel release (#33)

* modernize build.sbt

* fix some imports

* ignore target directory generated by sbt

* TensorGemm: explicitly define adder interface

* use ChiselStage instead of Driver

* setResource is now addResource

* add toInt in order to fix warning
diff --git a/hardware/chisel/.gitignore b/hardware/chisel/.gitignore
index f65a6ba..2ee056f 100644
--- a/hardware/chisel/.gitignore
+++ b/hardware/chisel/.gitignore
@@ -1 +1,3 @@
 test_run_dir
+/target/
+/project/target/
diff --git a/hardware/chisel/build.sbt b/hardware/chisel/build.sbt
index 851f5ab..49c7951 100644
--- a/hardware/chisel/build.sbt
+++ b/hardware/chisel/build.sbt
@@ -21,60 +21,21 @@
 version := "0.1.0-SNAPSHOT"
 organization := "edu.washington.cs"
 
-def scalacOptionsVersion(scalaVersion: String): Seq[String] = {
-  Seq() ++ {
-    // If we're building with Scala > 2.11, enable the compile option
-    //  switch to support our anonymous Bundle definitions:
-    //  https://github.com/scala/bug/issues/10047
-    CrossVersion.partialVersion(scalaVersion) match {
-      case Some((2, scalaMajor: Long)) if scalaMajor < 12 => Seq()
-      case _ => Seq(
-        "-Xsource:2.11",
-        "-language:reflectiveCalls",
-        "-language:implicitConversions",
-        "-deprecation",
-        "-Xlint",
-        "-Ywarn-unused",
-      )
-    }
-  }
-}
-
-def javacOptionsVersion(scalaVersion: String): Seq[String] = {
-  Seq() ++ {
-    // Scala 2.12 requires Java 8. We continue to generate
-    //  Java 7 compatible code for Scala 2.11
-    //  for compatibility with old clients.
-    CrossVersion.partialVersion(scalaVersion) match {
-      case Some((2, scalaMajor: Long)) if scalaMajor < 12 =>
-        Seq("-source", "1.7", "-target", "1.7")
-      case _ =>
-        Seq("-source", "1.8", "-target", "1.8")
-    }
-  }
-}
-
-scalaVersion := "2.11.12"
-
-resolvers ++= Seq(
-  Resolver.sonatypeRepo("snapshots"),
-  Resolver.sonatypeRepo("releases"))
-
-val defaultVersions = Map(
-  "chisel3" -> "3.1.7",
-  "chisel-iotesters" -> "1.2.4"
-  )
-
-libraryDependencies ++= Seq("chisel3","chisel-iotesters").map {
-  dep: String => "edu.berkeley.cs" %% dep % sys.props.getOrElse(dep + "Version", defaultVersions(dep)) }
-
-libraryDependencies ++= Seq(
-  "com.fasterxml.jackson.core" % "jackson-databind" % "2.10.3",
-  "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.10.3"
+scalaVersion := "2.12.13"
+scalacOptions ++= Seq(
+  "-Xsource:2.11",
+  "-language:reflectiveCalls",
+  "-deprecation",
+  "-feature",
+  "-Xcheckinit",
 )
 
-scalacOptions += "-language:reflectiveCalls"
-scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature", "-Xfatal-warnings")
+resolvers += Resolver.sonatypeRepo("snapshots")
+libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.4.3"
+libraryDependencies += "edu.berkeley.cs" %% "chisel-iotesters" % "1.5.3"
 
-scalacOptions ++= scalacOptionsVersion(scalaVersion.value)
-javacOptions ++= javacOptionsVersion(scalaVersion.value)
+libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.10.3"
+libraryDependencies += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.10.3"
+
+addCompilerPlugin("edu.berkeley.cs" % "chisel3-plugin" % "3.4.3" cross CrossVersion.full)
+addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full)
diff --git a/hardware/chisel/src/main/scala/core/TensorGemm.scala b/hardware/chisel/src/main/scala/core/TensorGemm.scala
index f63de94..8183557 100644
--- a/hardware/chisel/src/main/scala/core/TensorGemm.scala
+++ b/hardware/chisel/src/main/scala/core/TensorGemm.scala
@@ -44,18 +44,22 @@
   io.y := addV
 }
 
+class AdderIO(val aBits: Int, val bBits: Int) extends Bundle {
+  val outBits = Math.max(aBits, bBits) + 1
+  val a = Input(SInt(aBits.W))
+  val b = Input(SInt(bBits.W))
+  val y = Output(SInt(outBits.W))
+}
+
+trait IsAdder { val io: AdderIO }
+
 /** PipeAdder
  *
  * This unit loads input bits into register and performs addition in the next cycle
  */
-class PipeAdder(aBits: Int = 8, bBits: Int = 8) extends Module {
-  val outBits = Math.max(aBits, bBits) + 1
-  val io = IO(new Bundle {
-    val a = Input(SInt(aBits.W))
-    val b = Input(SInt(bBits.W))
-    val y = Output(SInt(outBits.W))
-  })
-  val add = Wire(SInt(outBits.W))
+class PipeAdder(aBits: Int = 8, bBits: Int = 8) extends Module with IsAdder {
+  val io = IO(new AdderIO(aBits, bBits))
+  val add = Wire(chiselTypeOf(io.y))
   val rA = RegNext(io.a)
   val rB = RegNext(io.b)
   add := rA +& rB
@@ -67,14 +71,9 @@
  * This unit wires input bits to an adder directly.
  * The output comes out of combinational logic without waiting for another cycle.
  */
-class Adder(aBits: Int = 8, bBits: Int = 8) extends Module {
-  val outBits = Math.max(aBits, bBits) + 1
-  val io = IO(new Bundle {
-    val a = Input(SInt(aBits.W))
-    val b = Input(SInt(bBits.W))
-    val y = Output(SInt(outBits.W))
-  })
-  val add = Wire(SInt(outBits.W))
+class Adder(aBits: Int = 8, bBits: Int = 8) extends Module with IsAdder {
+  val io = IO(new AdderIO(aBits, bBits))
+  val add = Wire(chiselTypeOf(io.y))
   val rA = Wire(SInt(aBits.W))
   val rB = Wire(SInt(bBits.W))
   rA := io.a
diff --git a/hardware/chisel/src/main/scala/dpi/VTAHostDPI.scala b/hardware/chisel/src/main/scala/dpi/VTAHostDPI.scala
index a428916..73ae935 100644
--- a/hardware/chisel/src/main/scala/dpi/VTAHostDPI.scala
+++ b/hardware/chisel/src/main/scala/dpi/VTAHostDPI.scala
@@ -71,7 +71,7 @@
     val reset = Input(Bool())
     val dpi = new VTAHostDPIMaster
   })
-  setResource("/verilog/VTAHostDPI.v")
+  addResource("/verilog/VTAHostDPI.v")
 }
 
 /** Host DPI to AXI Converter.
diff --git a/hardware/chisel/src/main/scala/dpi/VTAMemDPI.scala b/hardware/chisel/src/main/scala/dpi/VTAMemDPI.scala
index bffbc1c..c77bafd 100644
--- a/hardware/chisel/src/main/scala/dpi/VTAMemDPI.scala
+++ b/hardware/chisel/src/main/scala/dpi/VTAMemDPI.scala
@@ -72,7 +72,7 @@
     val reset = Input(Bool())
     val dpi = new VTAMemDPIClient
   })
-  setResource("/verilog/VTAMemDPI.v")
+  addResource("/verilog/VTAMemDPI.v")
 }
 
 class VTAMemDPIToAXI(debug: Boolean = false)(implicit p: Parameters) extends Module {
diff --git a/hardware/chisel/src/main/scala/dpi/VTASimDPI.scala b/hardware/chisel/src/main/scala/dpi/VTASimDPI.scala
index 2f25328..96654d2 100644
--- a/hardware/chisel/src/main/scala/dpi/VTASimDPI.scala
+++ b/hardware/chisel/src/main/scala/dpi/VTASimDPI.scala
@@ -35,5 +35,5 @@
     val reset = Input(Bool())
     val dpi_wait = Output(Bool())
   })
-  setResource("/verilog/VTASimDPI.v")
+  addResource("/verilog/VTASimDPI.v")
 }
diff --git a/hardware/chisel/src/main/scala/shell/SimShell.scala b/hardware/chisel/src/main/scala/shell/SimShell.scala
index 0909d1b..927f8af 100644
--- a/hardware/chisel/src/main/scala/shell/SimShell.scala
+++ b/hardware/chisel/src/main/scala/shell/SimShell.scala
@@ -20,7 +20,6 @@
 package vta.shell
 
 import chisel3._
-import chisel3.experimental.MultiIOModule
 import vta.util.config._
 import vta.interface.axi._
 import vta.shell._
diff --git a/hardware/chisel/src/main/scala/shell/XilinxShell.scala b/hardware/chisel/src/main/scala/shell/XilinxShell.scala
index 28f95ea..1f49ba4 100644
--- a/hardware/chisel/src/main/scala/shell/XilinxShell.scala
+++ b/hardware/chisel/src/main/scala/shell/XilinxShell.scala
@@ -20,7 +20,6 @@
 package vta.shell
 
 import chisel3._
-import chisel3.experimental.{withClockAndReset, RawModule}
 import vta.util.config._
 import vta.interface.axi._
 
diff --git a/hardware/chisel/src/main/scala/test/Test.scala b/hardware/chisel/src/main/scala/test/Test.scala
index 7749d95..14fe1c2 100644
--- a/hardware/chisel/src/main/scala/test/Test.scala
+++ b/hardware/chisel/src/main/scala/test/Test.scala
@@ -20,7 +20,6 @@
 package vta.test
 
 import chisel3._
-import chisel3.experimental.MultiIOModule
 import vta.util.config._
 import vta.shell._
 
diff --git a/hardware/chisel/src/main/scala/vta/Configs.scala b/hardware/chisel/src/main/scala/vta/Configs.scala
index 350379b..73816c9 100644
--- a/hardware/chisel/src/main/scala/vta/Configs.scala
+++ b/hardware/chisel/src/main/scala/vta/Configs.scala
@@ -37,30 +37,30 @@
 
 object DefaultPynqConfig extends App {
   implicit val p: Parameters = new DefaultPynqConfig
-  chisel3.Driver.execute(args, () => new XilinxShell)
+  (new chisel3.stage.ChiselStage).emitSystemVerilog(new XilinxShell, args)
 }
 
 object DefaultF1Config extends App {
   implicit val p: Parameters = new DefaultF1Config
-  chisel3.Driver.execute(args, () => new XilinxShell)
+  (new chisel3.stage.ChiselStage).emitSystemVerilog(new XilinxShell, args)
 }
 
 object DefaultDe10Config extends App {
   implicit val p: Parameters = new DefaultDe10Config
-  chisel3.Driver.execute(args, () => new IntelShell)
+  (new chisel3.stage.ChiselStage).emitSystemVerilog(new IntelShell, args)
 }
 
 object TestDefaultPynqConfig extends App {
   implicit val p: Parameters = new DefaultPynqConfig
-  chisel3.Driver.execute(args, () => new Test)
+  (new chisel3.stage.ChiselStage).emitSystemVerilog(new Test, args)
 }
 
 object TestDefaultF1Config extends App {
   implicit val p: Parameters = new DefaultF1Config
-  chisel3.Driver.execute(args, () => new Test)
+  (new chisel3.stage.ChiselStage).emitSystemVerilog(new Test, args)
 }
 
 object TestDefaultDe10Config extends App {
   implicit val p: Parameters = new DefaultDe10Config
-  chisel3.Driver.execute(args, () => new Test)
+  (new chisel3.stage.ChiselStage).emitSystemVerilog(new Test, args)
 }
diff --git a/hardware/chisel/src/test/scala/unittest/AluTest.scala b/hardware/chisel/src/test/scala/unittest/AluTest.scala
index c874b01..7c2cb88 100644
--- a/hardware/chisel/src/test/scala/unittest/AluTest.scala
+++ b/hardware/chisel/src/test/scala/unittest/AluTest.scala
@@ -56,7 +56,7 @@
       // HLS shift left by >> negative number
       // b always < 0 when opcode == 4
       for (i <- 0 until size) {
-        res(i) = a(i) << ((-1*b(i)) & mask)
+        res(i) = a(i) << ((-1*b(i)) & mask).toInt
       }
     } else { // default
       for (i <- 0 until size) {