From a077cda01bc53d593c237ccdb208e4036e5763d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20L=C3=A4ufer?= Date: Tue, 17 Aug 2021 17:28:15 -0700 Subject: [PATCH 1/2] port to chisel 3.5 --- build.sbt | 122 +++++++----------- .../lib/bitonicsorter/BitonicSorter.scala | 5 +- .../lib/cordic/iterative/CordicApp.scala | 3 +- src/main/scala/chisel/lib/uart/Uart.scala | 3 +- .../bitonicsorter/ExhaustiveSorterTest.scala | 8 +- .../lib/bitonicsorter/RandomSorterTest.scala | 8 +- .../cordic/iterative/FixedCordicSpec.scala | 20 +-- .../scala/chisel/lib/dclib/CreditTester.scala | 6 +- .../scala/chisel/lib/dclib/testDClib.scala | 8 +- src/test/scala/chisel/lib/ecc/EccTester.scala | 9 +- src/test/scala/chisel/lib/fifo/FifoSpec.scala | 24 ++-- src/test/scala/gcd/GCDUnitTest.scala | 14 -- 12 files changed, 94 insertions(+), 136 deletions(-) diff --git a/build.sbt b/build.sbt index 5cf85f7..2e42e3a 100644 --- a/build.sbt +++ b/build.sbt @@ -1,79 +1,53 @@ // See README.md for license details. -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") - } - } -} - -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") - } - } -} - -name := "ip-contributions" - -version := "0.4.0" - -// groupId, SCM, license information -organization := "edu.berkeley.cs" -homepage := Some(url("https://github.com/freechipsproject/ip-contributions")) -scmInfo := Some(ScmInfo(url("https://github.com/freechipsproject/ip-contributions"), "git@github.com/freechipsproject/ip-contributions")) -developers := List(Developer("schoeberl", "schoeberl", "martin@jopdesign.com", url("https://github.com/schoeberl"))) -licenses += ("Unlicense", url("https://unlicense.org/")) -publishMavenStyle := true - -// disable publishw ith scala version, otherwise artifact name will include scala version -// e.g cassper_2.11 -crossPaths := false - -// add sonatype repository settings -// snapshot versions publish to sonatype snapshot repository -// other versions publish to sonatype staging repository -publishTo := Some( - if (isSnapshot.value) - Opts.resolver.sonatypeSnapshots - else - Opts.resolver.sonatypeStaging -) - -val scala211 = "2.11.12" -val scala212 = "2.12.8" - -scalaVersion := scala212 - -crossScalaVersions := Seq(scala212, scala211) - -resolvers ++= Seq( - Resolver.sonatypeRepo("snapshots"), - Resolver.sonatypeRepo("releases") +ThisBuild / scalaVersion := "2.12.13" +ThisBuild / crossScalaVersions := Seq("2.12.13", "2.13.5") +ThisBuild / version := "0.5-SNAPSHOT" + + +lazy val publishSettings = Seq ( + // groupId, SCM, license information + organization := "edu.berkeley.cs", + homepage := Some(url("https://github.com/freechipsproject/ip-contributions")), + scmInfo := Some(ScmInfo(url("https://github.com/freechipsproject/ip-contributions"), "git@github.com/freechipsproject/ip-contributions")), + developers := List(Developer("schoeberl", "schoeberl", "martin@jopdesign.com", url("https://github.com/schoeberl"))), + licenses += ("Unlicense", url("https://unlicense.org/")), + publishMavenStyle := true, + + // disable publish with scala version, otherwise artifact name will include scala version + // e.g cassper_2.11 + crossPaths := false, + + // add sonatype repository settings + // snapshot versions publish to sonatype snapshot repository + // other versions publish to sonatype staging repository + publishTo := Some( + if (isSnapshot.value) + Opts.resolver.sonatypeSnapshots + else + Opts.resolver.sonatypeStaging + ), ) -// Provide a managed dependency on X if -DXVersion="" is supplied on the command line. -val defaultVersions = Map( - "chisel-iotesters" -> "1.5.0", - "chiseltest" -> "0.3.1", - "dsptools" -> "1.4.1" +lazy val root = (project in file(".")) + .settings( + name := "ip-contributions", + resolvers += Resolver.sonatypeRepo("snapshots"), + libraryDependencies ++= Seq( + "edu.berkeley.cs" %% "chisel3" % "3.5-SNAPSHOT", + "edu.berkeley.cs" %% "dsptools" % "1.5-SNAPSHOT", + "edu.berkeley.cs" %% "chisel-iotesters" % "2.5-SNAPSHOT" % "test", + "edu.berkeley.cs" %% "chiseltest" % "0.5-SNAPSHOT" % "test", + ), + scalacOptions ++= Seq( + "-language:reflectiveCalls", + "-deprecation", + "-feature", + "-Xcheckinit", + // Enables autoclonetype2 in 3.4.x (on by default in 3.5) + "-P:chiselplugin:useBundlePlugin" + ), + addCompilerPlugin("edu.berkeley.cs" % "chisel3-plugin" % "3.4.3" cross CrossVersion.full), + addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full) ) - -libraryDependencies ++= Seq("chiseltest", "chisel-iotesters", "dsptools").map { - dep: String => "edu.berkeley.cs" %% dep % sys.props.getOrElse(dep + "Version", defaultVersions(dep)) } - -scalacOptions ++= scalacOptionsVersion(scalaVersion.value) - -javacOptions ++= javacOptionsVersion(scalaVersion.value) + .settings(publishSettings: _*) diff --git a/src/main/scala/chisel/lib/bitonicsorter/BitonicSorter.scala b/src/main/scala/chisel/lib/bitonicsorter/BitonicSorter.scala index fdf23e5..2523387 100644 --- a/src/main/scala/chisel/lib/bitonicsorter/BitonicSorter.scala +++ b/src/main/scala/chisel/lib/bitonicsorter/BitonicSorter.scala @@ -3,6 +3,7 @@ package chisel.lib.bitonicsorter import chisel3._ +import chisel3.stage.ChiselStage import chisel3.util._ /** @@ -85,10 +86,10 @@ class BitonicSorterModule[T <: Data]( n : Int, proto : T, lt : (T,T) => Bool) ex //scalastyle:off magic.number object BitonicSorterUInt8_64Driver extends App { - Driver.execute( args, () => new BitonicSorterModule( 64, UInt(8.W), (x:UInt,y:UInt)=>xx new BitonicSorterModule( 384, UInt(8.W), (x:UInt,y:UInt)=>xx new IterativeCordic(params)) + (new ChiselStage).emitSystemVerilog(new IterativeCordic(params), chiselArgs.toArray) } diff --git a/src/main/scala/chisel/lib/uart/Uart.scala b/src/main/scala/chisel/lib/uart/Uart.scala index 7b3898e..66cbec6 100644 --- a/src/main/scala/chisel/lib/uart/Uart.scala +++ b/src/main/scala/chisel/lib/uart/Uart.scala @@ -9,6 +9,7 @@ package chisel.lib.uart import chisel3._ +import chisel3.stage.ChiselStage import chisel3.util._ class UartIO extends DecoupledIO(UInt(8.W)) { @@ -209,6 +210,6 @@ class UartMain(frequency: Int, baudRate: Int) extends Module { } object UartMain extends App { - chisel3.Driver.execute(Array("--target-dir", "generated"), () => new UartMain(50000000, 115200)) + (new ChiselStage).emitSystemVerilog(new UartMain(50000000, 115200), Array("--target-dir", "generated")) } diff --git a/src/test/scala/chisel/lib/bitonicsorter/ExhaustiveSorterTest.scala b/src/test/scala/chisel/lib/bitonicsorter/ExhaustiveSorterTest.scala index c6b820f..c47db9f 100644 --- a/src/test/scala/chisel/lib/bitonicsorter/ExhaustiveSorterTest.scala +++ b/src/test/scala/chisel/lib/bitonicsorter/ExhaustiveSorterTest.scala @@ -4,18 +4,18 @@ package chisel.lib.bitonicsorter import chisel3._ import chisel3.iotesters._ -import org.scalatest.{FlatSpec, Matchers} +import org.scalatest.flatspec.AnyFlatSpec /** * Test generator that tests all possible input patterns * @param factory The generator * @tparam T The type of elements */ -class ExhaustiveSorterTest[T <: Bool]( factory : () => SorterModuleIfc[T]) extends FlatSpec with Matchers { +class ExhaustiveSorterTest[T <: Bool]( factory : () => SorterModuleIfc[T]) extends AnyFlatSpec { behavior of "SorterTest" it should "work" in { - chisel3.iotesters.Driver( factory, "treadle") { c => + assert(chisel3.iotesters.Driver( factory, "treadle") { c => new PeekPokeTester( c) { def example( a:IndexedSeq[BigInt]) { poke( c.io.a, a) @@ -33,7 +33,7 @@ class ExhaustiveSorterTest[T <: Bool]( factory : () => SorterModuleIfc[T]) exten } } - } should be (true) + }) } } diff --git a/src/test/scala/chisel/lib/bitonicsorter/RandomSorterTest.scala b/src/test/scala/chisel/lib/bitonicsorter/RandomSorterTest.scala index f5c6f03..9c2bd58 100644 --- a/src/test/scala/chisel/lib/bitonicsorter/RandomSorterTest.scala +++ b/src/test/scala/chisel/lib/bitonicsorter/RandomSorterTest.scala @@ -4,7 +4,7 @@ package chisel.lib.bitonicsorter import chisel3._ import chisel3.iotesters._ -import org.scalatest.{FlatSpec, Matchers} +import org.scalatest.flatspec.AnyFlatSpec //scalastyle:off magic.number @@ -19,12 +19,12 @@ import org.scalatest.{FlatSpec, Matchers} class RandomSorterTest[T <: UInt]( val numExamples : Int, factory : () => SorterModuleIfc[T] -) extends FlatSpec with Matchers { +) extends AnyFlatSpec { behavior of "SorterTest" it should "work" in { - chisel3.iotesters.Driver( factory, "treadle") { c => + assert(chisel3.iotesters.Driver( factory, "treadle") { c => new PeekPokeTester( c) { def example( a:IndexedSeq[BigInt]) { poke( c.io.a, a) @@ -38,7 +38,7 @@ class RandomSorterTest[T <: UInt]( } } - } should be (true) + }) } } diff --git a/src/test/scala/chisel/lib/cordic/iterative/FixedCordicSpec.scala b/src/test/scala/chisel/lib/cordic/iterative/FixedCordicSpec.scala index e63293b..a0954ed 100644 --- a/src/test/scala/chisel/lib/cordic/iterative/FixedCordicSpec.scala +++ b/src/test/scala/chisel/lib/cordic/iterative/FixedCordicSpec.scala @@ -3,11 +3,11 @@ package chisel.lib.cordic.iterative import dsptools.numbers._ -import org.scalatest.{FlatSpec, Matchers} +import org.scalatest.flatspec.AnyFlatSpec import scala.math.{ceil, max} -class FixedCordicSpec extends FlatSpec with Matchers { +class FixedCordicSpec extends AnyFlatSpec { behavior of "FixedIterativeCordic" val params = FixedCordicParams( @@ -20,13 +20,13 @@ class FixedCordicSpec extends FlatSpec with Matchers { val baseTrial = XYZ(xin= 1.0, yin=0.0, zin=0.0, vectoring=false) val angles = Seq(-3, -2, -1, -0.5, 0, 0.25, 0.5, 1, 2, 3) val trials = angles.map { phi => baseTrial.copy(zin = phi, xout = Some(math.cos(phi)), yout = Some(math.sin(phi)), zout = Some(0)) } - FixedCordicTester(params, trials) should be (true) + assert(FixedCordicTester(params, trials)) } it should "vector" in { val baseTrial = XYZ(xin= 1.0, yin=0.0, zin=0.0, vectoring=true) val angles = Seq(-3, -2, -1, -0.5, 0, 0.25, 0.5, 1, 2, 3) val trials = angles.map { phi => baseTrial.copy(xin = math.cos(phi), yin = math.sin(phi), xout = Some(1), yout = Some(0), zout = Some(phi)) } - FixedCordicTester(params, trials) should be (true) + assert(FixedCordicTester(params, trials)) } // No gain tests. @@ -43,13 +43,13 @@ class FixedCordicSpec extends FlatSpec with Matchers { val baseTrial = XYZ(xin= 1.0, yin=0.0, zin=0.0, vectoring=false) val angles = Seq(-3, -2, -1, -0.5, 0, 0.25, 0.5, 1, 2, 3) val trials = angles.map { phi => baseTrial.copy(zin = phi, xout = Some(math.cos(phi)*gainCor), yout = Some(math.sin(phi)*gainCor), zout = Some(0)) } - FixedCordicTester(paramsNoGain, trials) should be (true) + assert(FixedCordicTester(paramsNoGain, trials)) } it should "vector without gain correction" in { val baseTrial = XYZ(xin= 1.0, yin=0.0, zin=0.0, vectoring=true) val angles = Seq(-3, -2, -1, -0.5, 0, 0.25, 0.5, 1, 2, 3) val trials = angles.map { phi => baseTrial.copy(xin = math.cos(phi), yin = math.sin(phi), xout = Some(gainCor), yout = Some(0), zout = Some(phi)) } - FixedCordicTester(paramsNoGain, trials) should be (true) + assert(FixedCordicTester(paramsNoGain, trials)) } @@ -67,13 +67,13 @@ class FixedCordicSpec extends FlatSpec with Matchers { val baseTrial = XYZ(xin= 1.0, yin=0.0, zin=0.0, vectoring=false) val angles = Seq(-3, -2, -1, -0.5, 0, 0.25, 0.5, 1, 2, 3) val trials = angles.map { phi => baseTrial.copy(zin = phi, xout = Some(math.cos(phi)), yout = Some(math.sin(phi)), zout = Some(0)) } - RealCordicTester(realParams, trials) should be (true) + assert(RealCordicTester(realParams, trials)) } it should "vector" in { val baseTrial = XYZ(xin= 1.0, yin=0.0, zin=0.0, vectoring=true) val angles = Seq(-3, -2, -1, -0.5, 0, 0.25, 0.5, 1, 2, 3) val trials = angles.map { phi => baseTrial.copy(xin = math.cos(phi), yin = math.sin(phi), xout = Some(1), yout = Some(0), zout = Some(phi)) } - RealCordicTester(realParams, trials) should be (true) + assert(RealCordicTester(realParams, trials)) } // No gain tests. @@ -91,13 +91,13 @@ class FixedCordicSpec extends FlatSpec with Matchers { val baseTrial = XYZ(xin= 1.0, yin=0.0, zin=0.0, vectoring=false) val angles = Seq(-3, -2, -1, -0.5, 0, 0.25, 0.5, 1, 2, 3) val trials = angles.map { phi => baseTrial.copy(zin = phi, xout = Some(math.cos(phi)*gainCor), yout = Some(math.sin(phi)*gainCor), zout = Some(0)) } - RealCordicTester(realParamsNoGain, trials) should be (true) + assert(RealCordicTester(realParamsNoGain, trials)) } it should "vector without gain correction" in { val baseTrial = XYZ(xin= 1.0, yin=0.0, zin=0.0, vectoring=true) val angles = Seq(-3, -2, -1, -0.5, 0, 0.25, 0.5, 1, 2, 3) val trials = angles.map { phi => baseTrial.copy(xin = math.cos(phi), yin = math.sin(phi), xout = Some(gainCor), yout = Some(0), zout = Some(phi)) } - RealCordicTester(realParamsNoGain, trials) should be (true) + assert(RealCordicTester(realParamsNoGain, trials)) } } diff --git a/src/test/scala/chisel/lib/dclib/CreditTester.scala b/src/test/scala/chisel/lib/dclib/CreditTester.scala index 59866da..4042439 100644 --- a/src/test/scala/chisel/lib/dclib/CreditTester.scala +++ b/src/test/scala/chisel/lib/dclib/CreditTester.scala @@ -3,9 +3,7 @@ package chisel.lib.dclib import chisel3._ import chisel3.util._ import chiseltest._ -import org.scalatest._ -import chiseltest.experimental.TestOptionBuilder._ -import chiseltest.internal.WriteVcdAnnotation +import org.scalatest.flatspec.AnyFlatSpec class CreditHarness(delay : Int, maxCredit : Int) extends Module { val io = IO(new Bundle { @@ -45,7 +43,7 @@ class CreditHarness(delay : Int, maxCredit : Int) extends Module { io.backpressured := backpressured } -class CreditTester extends FlatSpec with ChiselScalatestTester with Matchers { +class CreditTester extends AnyFlatSpec with ChiselScalatestTester { behavior of "Testers2 with Queue" it should "test fixed credit with variable delay" in { diff --git a/src/test/scala/chisel/lib/dclib/testDClib.scala b/src/test/scala/chisel/lib/dclib/testDClib.scala index bce21e3..b5136e6 100644 --- a/src/test/scala/chisel/lib/dclib/testDClib.scala +++ b/src/test/scala/chisel/lib/dclib/testDClib.scala @@ -5,9 +5,7 @@ package chisel.lib.dclib import chisel3._ import chiseltest._ -import org.scalatest._ -import chiseltest.experimental.TestOptionBuilder._ -import chiseltest.internal.WriteVcdAnnotation +import org.scalatest.flatspec.AnyFlatSpec /** * Test behavior of dclib components @@ -17,7 +15,7 @@ import chiseltest.internal.WriteVcdAnnotation * takes a flow control pattern with which to assert either source flow control (Valid) or destination flow * control (ready). */ -class DclibTester extends FlatSpec with ChiselScalatestTester with Matchers { +class DclibTester extends AnyFlatSpec with ChiselScalatestTester { behavior of "Testers2" it should "test input output" in { @@ -95,7 +93,7 @@ class DclibTester extends FlatSpec with ChiselScalatestTester with Matchers { } } -class ReductionTester extends FlatSpec with ChiselScalatestTester with Matchers { +class ReductionTester extends AnyFlatSpec with ChiselScalatestTester { behavior of "Testers2 with Queue" it should "add numbers together" in { diff --git a/src/test/scala/chisel/lib/ecc/EccTester.scala b/src/test/scala/chisel/lib/ecc/EccTester.scala index 87f2ec8..9016f3d 100644 --- a/src/test/scala/chisel/lib/ecc/EccTester.scala +++ b/src/test/scala/chisel/lib/ecc/EccTester.scala @@ -3,14 +3,13 @@ package chisel.lib.ecc import chisel3._ +import chisel3.stage.ChiselStage import chiseltest._ -import org.scalatest._ -import chiseltest.experimental.TestOptionBuilder._ -import chiseltest.internal.WriteVcdAnnotation +import org.scalatest.flatspec.AnyFlatSpec import scala.util.Random -class EccTester extends FlatSpec with ChiselScalatestTester with Matchers { +class EccTester extends AnyFlatSpec with ChiselScalatestTester { behavior of "Testers2" it should "send data without errors" in { @@ -155,5 +154,5 @@ class EccTester extends FlatSpec with ChiselScalatestTester with Matchers { } object EccGenerator extends App { - chisel3.Driver.execute(Array("--target-dir", "generated"), () => new EccCheck(UInt(8.W))) + (new ChiselStage).emitSystemVerilog(new EccCheck(UInt(8.W)), Array("--target-dir", "generated")) } \ No newline at end of file diff --git a/src/test/scala/chisel/lib/fifo/FifoSpec.scala b/src/test/scala/chisel/lib/fifo/FifoSpec.scala index e797462..7a79968 100644 --- a/src/test/scala/chisel/lib/fifo/FifoSpec.scala +++ b/src/test/scala/chisel/lib/fifo/FifoSpec.scala @@ -5,7 +5,7 @@ package chisel.lib.fifo import chisel3._ import chisel3.iotesters.PeekPokeTester -import org.scalatest._ +import org.scalatest.flatspec.AnyFlatSpec object FifoTester { @@ -87,41 +87,41 @@ class FifoTester[T <: Fifo[_ <: Data]](dut: T) extends PeekPokeTester(dut) { assert(cycles >= 0.99, "Cannot be faster than one clock cycle per word") } -class FifoSpec extends FlatSpec with Matchers { +class FifoSpec extends AnyFlatSpec { "BubbleFifo" should "pass" in { - chisel3.iotesters.Driver.execute(FifoTester.param, + assert(chisel3.iotesters.Driver.execute(FifoTester.param, () => new BubbleFifo(UInt(16.W), 4)) { c => new FifoTester(c) - } should be (true) + }) } "DoubleBufferFifo" should "pass" in { - chisel3.iotesters.Driver.execute(FifoTester.param, + assert(chisel3.iotesters.Driver.execute(FifoTester.param, () => new DoubleBufferFifo(UInt(16.W), 4)) { c => new FifoTester(c) - } should be (true) + }) } "RegFifo" should "pass" in { - chisel3.iotesters.Driver.execute(FifoTester.param, + assert(chisel3.iotesters.Driver.execute(FifoTester.param, () => new RegFifo(UInt(16.W), 4)) { c => new FifoTester(c) - } should be (true) + }) } "MemFifo" should "pass" in { - chisel3.iotesters.Driver.execute(FifoTester.param, + assert(chisel3.iotesters.Driver.execute(FifoTester.param, () => new MemFifo(UInt(16.W), 4)) { c => new FifoTester(c) - } should be (true) + }) } "CombFifo" should "pass" in { - chisel3.iotesters.Driver.execute(FifoTester.param, + assert(chisel3.iotesters.Driver.execute(FifoTester.param, () => new CombFifo(UInt(16.W), 4)) { c => new FifoTester(c) - } should be (true) + }) } } diff --git a/src/test/scala/gcd/GCDUnitTest.scala b/src/test/scala/gcd/GCDUnitTest.scala index 657c84d..372100d 100644 --- a/src/test/scala/gcd/GCDUnitTest.scala +++ b/src/test/scala/gcd/GCDUnitTest.scala @@ -114,18 +114,4 @@ class GCDTester extends ChiselFlatSpec { new File("test_run_dir/make_a_vcd/make_a_vcd.vcd").exists should be (true) } - "running with --generate-vcd-output off" should "not create a vcd file from your test" in { - iotesters.Driver.execute( - Array("--generate-vcd-output", "off", "--target-dir", "test_run_dir/make_no_vcd", "--top-name", "make_no_vcd", - "--backend-name", "verilator"), - () => new GCD - ) { - - c => new GCDUnitTester(c) - } should be(true) - - new File("test_run_dir/make_no_vcd/make_a_vcd.vcd").exists should be (false) - - } - } From 95d5daa3bd5147ff8d9a1406ecba38840dd736f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20L=C3=A4ufer?= Date: Tue, 17 Aug 2021 17:51:03 -0700 Subject: [PATCH 2/2] add github action based ci --- .github/workflows/ci.yml | 26 ++++++++++++++++++++++++++ .gitignore | 2 ++ 2 files changed, 28 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..c95811b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,26 @@ +name: Chisel IP Contribution Tests + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Install Verilator + run: | + sudo apt-get install -y verilator + verilator --version + + - name: Setup Scala + uses: olafurpg/setup-scala@v11 + with: + java-version: openjdk@1.11 + + - name: Compile + run: sbt compile + + - name: Unit Tests + run: sbt test diff --git a/.gitignore b/.gitignore index ac04335..6a5f99f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ ### Project Specific stuff test_run_dir/* +/generated/ + ### XilinxISE template # intermediate build files *.bgn