Tapeout (#4)
* remove outdated files * pulled resetinverter from dsptools + setup repo * fix some package names, misc. dsptools dependencies, typo in build.sbt, + circuitstate in resetinverter pass * add more comprehensive gitignore + license back in * create directory structure to match package structure * change package names to barstools.tapeout * settled on barstools.tapeout.transforms package * make directory + build structure more amenable for multiple sub projects
This commit is contained in:
329
.gitignore
vendored
329
.gitignore
vendored
@@ -1,6 +1,317 @@
|
|||||||
|
### local stuff
|
||||||
|
src/main/scala/dsptools/sandbox.sc
|
||||||
|
test_run_dir/
|
||||||
|
*.fir
|
||||||
|
*.anno
|
||||||
|
### XilinxISE template
|
||||||
|
# intermediate build files
|
||||||
|
*.bgn
|
||||||
|
*.bit
|
||||||
|
*.bld
|
||||||
|
*.cmd_log
|
||||||
|
*.drc
|
||||||
|
*.ll
|
||||||
|
*.lso
|
||||||
|
*.msd
|
||||||
|
*.msk
|
||||||
|
*.ncd
|
||||||
|
*.ngc
|
||||||
|
*.ngd
|
||||||
|
*.ngr
|
||||||
|
*.pad
|
||||||
|
*.par
|
||||||
|
*.pcf
|
||||||
|
*.prj
|
||||||
|
*.ptwx
|
||||||
|
*.rbb
|
||||||
|
*.rbd
|
||||||
|
*.stx
|
||||||
|
*.syr
|
||||||
|
*.twr
|
||||||
|
*.twx
|
||||||
|
*.unroutes
|
||||||
|
*.ut
|
||||||
|
*.xpi
|
||||||
|
*.xst
|
||||||
|
*_bitgen.xwbt
|
||||||
|
*_envsettings.html
|
||||||
|
*_map.map
|
||||||
|
*_map.mrp
|
||||||
|
*_map.ngm
|
||||||
|
*_map.xrpt
|
||||||
|
*_ngdbuild.xrpt
|
||||||
|
*_pad.csv
|
||||||
|
*_pad.txt
|
||||||
|
*_par.xrpt
|
||||||
|
*_summary.html
|
||||||
|
*_summary.xml
|
||||||
|
*_usage.xml
|
||||||
|
*_xst.xrpt
|
||||||
|
|
||||||
|
# project-wide generated files
|
||||||
|
*.gise
|
||||||
|
par_usage_statistics.html
|
||||||
|
usage_statistics_webtalk.html
|
||||||
|
webtalk.log
|
||||||
|
webtalk_pn.xml
|
||||||
|
|
||||||
|
# generated folders
|
||||||
|
iseconfig/
|
||||||
|
xlnx_auto_0_xdb/
|
||||||
|
xst/
|
||||||
|
_ngo/
|
||||||
|
_xmsgs/
|
||||||
|
### Eclipse template
|
||||||
|
*.pydevproject
|
||||||
|
.metadata
|
||||||
|
.gradle
|
||||||
|
bin/
|
||||||
|
tmp/
|
||||||
|
*.tmp
|
||||||
|
*.bak
|
||||||
|
*.swp
|
||||||
|
*~.nib
|
||||||
|
local.properties
|
||||||
|
.settings/
|
||||||
|
.loadpath
|
||||||
|
|
||||||
|
# Eclipse Core
|
||||||
|
.project
|
||||||
|
|
||||||
|
# External tool builders
|
||||||
|
.externalToolBuilders/
|
||||||
|
|
||||||
|
# Locally stored "Eclipse launch configurations"
|
||||||
|
*.launch
|
||||||
|
|
||||||
|
# CDT-specific
|
||||||
|
.cproject
|
||||||
|
|
||||||
|
# JDT-specific (Eclipse Java Development Tools)
|
||||||
|
.classpath
|
||||||
|
|
||||||
|
# Java annotation processor (APT)
|
||||||
|
.factorypath
|
||||||
|
|
||||||
|
# PDT-specific
|
||||||
|
.buildpath
|
||||||
|
|
||||||
|
# sbteclipse plugin
|
||||||
|
.target
|
||||||
|
|
||||||
|
# TeXlipse plugin
|
||||||
|
.texlipse
|
||||||
|
### C template
|
||||||
|
# Object files
|
||||||
|
*.o
|
||||||
|
*.ko
|
||||||
|
*.obj
|
||||||
|
*.elf
|
||||||
|
|
||||||
|
# Precompiled Headers
|
||||||
|
*.gch
|
||||||
|
*.pch
|
||||||
|
|
||||||
|
# Libraries
|
||||||
|
*.lib
|
||||||
|
*.a
|
||||||
|
*.la
|
||||||
|
*.lo
|
||||||
|
|
||||||
|
# Shared objects (inc. Windows DLLs)
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.so.*
|
||||||
|
*.dylib
|
||||||
|
|
||||||
|
# Executables
|
||||||
|
*.exe
|
||||||
|
*.out
|
||||||
|
*.app
|
||||||
|
*.i*86
|
||||||
|
*.x86_64
|
||||||
|
*.hex
|
||||||
|
|
||||||
|
# Debug files
|
||||||
|
*.dSYM/
|
||||||
|
### SBT template
|
||||||
|
# Simple Build Tool
|
||||||
|
# http://www.scala-sbt.org/release/docs/Getting-Started/Directories.html#configuring-version-control
|
||||||
|
|
||||||
|
target/
|
||||||
|
lib_managed/
|
||||||
|
src_managed/
|
||||||
|
project/boot/
|
||||||
|
.history
|
||||||
|
.cache
|
||||||
|
### Emacs template
|
||||||
|
# -*- mode: gitignore; -*-
|
||||||
|
*~
|
||||||
|
\#*\#
|
||||||
|
/.emacs.desktop
|
||||||
|
/.emacs.desktop.lock
|
||||||
|
*.elc
|
||||||
|
auto-save-list
|
||||||
|
tramp
|
||||||
|
.\#*
|
||||||
|
|
||||||
|
# Org-mode
|
||||||
|
.org-id-locations
|
||||||
|
*_archive
|
||||||
|
|
||||||
|
# flymake-mode
|
||||||
|
*_flymake.*
|
||||||
|
|
||||||
|
# eshell files
|
||||||
|
/eshell/history
|
||||||
|
/eshell/lastdir
|
||||||
|
|
||||||
|
# elpa packages
|
||||||
|
/elpa/
|
||||||
|
|
||||||
|
# reftex files
|
||||||
|
*.rel
|
||||||
|
|
||||||
|
# AUCTeX auto folder
|
||||||
|
/auto/
|
||||||
|
|
||||||
|
# cask packages
|
||||||
|
.cask/
|
||||||
|
### Vim template
|
||||||
|
[._]*.s[a-w][a-z]
|
||||||
|
[._]s[a-w][a-z]
|
||||||
|
*.un~
|
||||||
|
Session.vim
|
||||||
|
.netrwhist
|
||||||
|
*~
|
||||||
|
### JetBrains template
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio
|
||||||
|
|
||||||
|
*.iml
|
||||||
|
|
||||||
|
## Directory-based project format:
|
||||||
|
.idea/
|
||||||
|
# if you remove the above rule, at least ignore the following:
|
||||||
|
|
||||||
|
# User-specific stuff:
|
||||||
|
# .idea/workspace.xml
|
||||||
|
# .idea/tasks.xml
|
||||||
|
# .idea/dictionaries
|
||||||
|
|
||||||
|
# Sensitive or high-churn files:
|
||||||
|
# .idea/dataSources.ids
|
||||||
|
# .idea/dataSources.xml
|
||||||
|
# .idea/sqlDataSources.xml
|
||||||
|
# .idea/dynamic.xml
|
||||||
|
# .idea/uiDesigner.xml
|
||||||
|
|
||||||
|
# Gradle:
|
||||||
|
# .idea/gradle.xml
|
||||||
|
# .idea/libraries
|
||||||
|
|
||||||
|
# Mongo Explorer plugin:
|
||||||
|
# .idea/mongoSettings.xml
|
||||||
|
|
||||||
|
## File-based project format:
|
||||||
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
## Plugin-specific files:
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
/out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
### C++ template
|
||||||
|
# Compiled Object files
|
||||||
|
*.slo
|
||||||
|
*.lo
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
|
||||||
|
# Precompiled Headers
|
||||||
|
*.gch
|
||||||
|
*.pch
|
||||||
|
|
||||||
|
# Compiled Dynamic libraries
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
*.dll
|
||||||
|
|
||||||
|
# Fortran module files
|
||||||
|
*.mod
|
||||||
|
|
||||||
|
# Compiled Static libraries
|
||||||
|
*.lai
|
||||||
|
*.la
|
||||||
|
*.a
|
||||||
|
*.lib
|
||||||
|
|
||||||
|
# Executables
|
||||||
|
*.exe
|
||||||
|
*.out
|
||||||
|
*.app
|
||||||
|
### OSX template
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
### Xcode template
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
|
||||||
|
|
||||||
|
## Build generated
|
||||||
|
build/
|
||||||
|
DerivedData
|
||||||
|
|
||||||
|
## Various settings
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
|
||||||
|
## Other
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
*.xcuserstate
|
||||||
|
### Scala template
|
||||||
*.class
|
*.class
|
||||||
*.log
|
*.log
|
||||||
*.swp
|
|
||||||
|
|
||||||
# sbt specific
|
# sbt specific
|
||||||
.cache
|
.cache
|
||||||
@@ -16,3 +327,19 @@ project/plugins/project/
|
|||||||
# Scala-IDE specific
|
# Scala-IDE specific
|
||||||
.scala_dependencies
|
.scala_dependencies
|
||||||
.worksheet
|
.worksheet
|
||||||
|
### Java template
|
||||||
|
*.class
|
||||||
|
|
||||||
|
# Mobile Tools for Java (J2ME)
|
||||||
|
.mtj.tmp/
|
||||||
|
|
||||||
|
# Package Files #
|
||||||
|
*.jar
|
||||||
|
*.war
|
||||||
|
*.ear
|
||||||
|
|
||||||
|
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||||
|
hs_err_pid*
|
||||||
|
|
||||||
|
# ignore lib from rocket build
|
||||||
|
lib
|
||||||
|
|||||||
12
build.sbt
12
build.sbt
@@ -6,11 +6,19 @@ lazy val commonSettings = Seq(
|
|||||||
organization := "edu.berkeley.cs",
|
organization := "edu.berkeley.cs",
|
||||||
version := "0.1-SNAPSHOT",
|
version := "0.1-SNAPSHOT",
|
||||||
scalaVersion := "2.11.8",
|
scalaVersion := "2.11.8",
|
||||||
|
scalacOptions := Seq("-deprecation", "-feature"),
|
||||||
libraryDependencies ++= commonDependencies
|
libraryDependencies ++= commonDependencies
|
||||||
)
|
)
|
||||||
|
|
||||||
lazy val executionoptions = (project in file("executionoptions"))
|
val defaultVersions = Map(
|
||||||
|
"chisel3" -> "3.1-SNAPSHOT",
|
||||||
|
"chisel-iotesters" -> "1.2-SNAPSHOT"
|
||||||
|
)
|
||||||
|
|
||||||
|
lazy val tapeout = (project in file("tapeout"))
|
||||||
.settings(commonSettings)
|
.settings(commonSettings)
|
||||||
.settings(
|
.settings(
|
||||||
libraryDependencies ++= executionoptionsDependencies
|
libraryDependencies ++= Seq("chisel3","chisel-iotesters").map {
|
||||||
|
dep: String => "edu.berkeley.cs" %% dep % sys.props.getOrElse(dep + "Version", defaultVersions(dep))
|
||||||
|
}
|
||||||
)
|
)
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
// See LICENSE for license details.
|
|
||||||
|
|
||||||
package bar.executionoptions
|
|
||||||
|
|
||||||
import scopt.OptionParser
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Use this trait to define an options class that can add its private command line options to a externally
|
|
||||||
* declared parser
|
|
||||||
*/
|
|
||||||
trait ComposableOptions
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Most of the chisel toolchain components require a topName which defines a circuit or a device under test.
|
|
||||||
* Much of the work that is done takes place in a directory.
|
|
||||||
* It would be simplest to require topName to be defined but in practice it is preferred to defer this.
|
|
||||||
* For example, in chisel, by deferring this it is possible for the execute there to first elaborate the
|
|
||||||
* circuit and then set the topName from that if it has not already been set.
|
|
||||||
*/
|
|
||||||
case class CommonOptions(topName: String = "", targetDirName: String = "test_run_dir") extends ComposableOptions
|
|
||||||
|
|
||||||
abstract class HasParser(applicationName: String) {
|
|
||||||
final val parser: OptionParser[Unit] = new OptionParser[Unit](applicationName) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
trait HasCommonOptions {
|
|
||||||
self: ExecutionOptionsManager =>
|
|
||||||
var commonOptions = CommonOptions()
|
|
||||||
|
|
||||||
parser.note("common options")
|
|
||||||
|
|
||||||
parser.opt[String]("top-name")
|
|
||||||
.abbr("tn")
|
|
||||||
.valueName("<top-level-circuit-name>")
|
|
||||||
.foreach { x =>
|
|
||||||
commonOptions = commonOptions.copy(topName = x)
|
|
||||||
}
|
|
||||||
.text("This options defines the top level circuit, defaults to dut when possible")
|
|
||||||
|
|
||||||
parser.opt[String]("target-dir")
|
|
||||||
.abbr("td").valueName("<target-directory>")
|
|
||||||
.foreach { x =>
|
|
||||||
commonOptions = commonOptions.copy(targetDirName = x)
|
|
||||||
}
|
|
||||||
.text(s"This options defines a work directory for intermediate files, default is ${commonOptions.targetDirName}")
|
|
||||||
|
|
||||||
parser.help("help").text("prints this usage text")
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param applicationName The name shown in the usage
|
|
||||||
*/
|
|
||||||
class ExecutionOptionsManager(val applicationName: String) extends HasParser(applicationName) with HasCommonOptions {
|
|
||||||
|
|
||||||
def parse(args: Array[String]): Boolean = {
|
|
||||||
parser.parse(args)
|
|
||||||
}
|
|
||||||
|
|
||||||
def showUsageAsError(): Unit = parser.showUsageAsError()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* make sure that all levels of targetDirName exist
|
|
||||||
*
|
|
||||||
* @return true if directory exists
|
|
||||||
*/
|
|
||||||
def makeTargetDir(): Boolean = {
|
|
||||||
(new java.io.File(commonOptions.targetDirName)).mkdirs()
|
|
||||||
}
|
|
||||||
|
|
||||||
def targetDirName: String = commonOptions.targetDirName
|
|
||||||
|
|
||||||
/**
|
|
||||||
* this function sets the topName in the commonOptions.
|
|
||||||
* It would be nicer to not need this but many chisel tools cannot determine
|
|
||||||
* the name of the device under test until other options have been parsed.
|
|
||||||
* Havin this function allows the code to set the TopName after it has been
|
|
||||||
* determined
|
|
||||||
*
|
|
||||||
* @param newTopName the topName to be used
|
|
||||||
*/
|
|
||||||
def setTopName(newTopName: String): Unit = {
|
|
||||||
commonOptions = commonOptions.copy(topName = newTopName)
|
|
||||||
}
|
|
||||||
def setTopNameIfNotSet(newTopName: String): Unit = {
|
|
||||||
if(commonOptions.topName.isEmpty) {
|
|
||||||
setTopName(newTopName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
def topName: String = commonOptions.topName
|
|
||||||
def setTargetDirName(newTargetDirName: String): Unit = {
|
|
||||||
commonOptions = commonOptions.copy(targetDirName = newTargetDirName)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* return a file based on targetDir, topName and suffix
|
|
||||||
* Will not add the suffix if the topName already ends with that suffix
|
|
||||||
*
|
|
||||||
* @param suffix suffix to add, removes . if present
|
|
||||||
* @param fileNameOverride this will override the topName if nonEmpty, when using this targetDir is ignored
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
def getBuildFileName(suffix: String, fileNameOverride: String = ""): String = {
|
|
||||||
makeTargetDir()
|
|
||||||
|
|
||||||
val baseName = if(fileNameOverride.nonEmpty) fileNameOverride else topName
|
|
||||||
val directoryName = {
|
|
||||||
if(fileNameOverride.nonEmpty) {
|
|
||||||
""
|
|
||||||
}
|
|
||||||
else if(baseName.startsWith("./") || baseName.startsWith("/")) {
|
|
||||||
""
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(targetDirName.endsWith("/")) targetDirName else targetDirName + "/"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val normalizedSuffix = {
|
|
||||||
val dottedSuffix = if(suffix.startsWith(".")) suffix else s".$suffix"
|
|
||||||
if(baseName.endsWith(dottedSuffix)) "" else dottedSuffix
|
|
||||||
}
|
|
||||||
|
|
||||||
s"$directoryName$baseName$normalizedSuffix"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
// See LICENSE for license details.
|
|
||||||
|
|
||||||
package bar.executionoptions
|
|
||||||
|
|
||||||
import org.scalatest.{Matchers, FreeSpec}
|
|
||||||
|
|
||||||
class ExecutionOptionsManagerSpec extends FreeSpec with Matchers {
|
|
||||||
"ExecutionOptionsManager is a container for one more more ComposableOptions Block" - {
|
|
||||||
"It has a default CommonOptionsBlock" in {
|
|
||||||
val manager = new ExecutionOptionsManager("test")
|
|
||||||
manager.commonOptions.targetDirName should be ("test_run_dir")
|
|
||||||
}
|
|
||||||
"But can override defaults like this" in {
|
|
||||||
val manager = new ExecutionOptionsManager("test") { commonOptions = CommonOptions(topName = "dog") }
|
|
||||||
manager.commonOptions shouldBe a [CommonOptions]
|
|
||||||
manager.topName should be ("dog")
|
|
||||||
manager.commonOptions.topName should be ("dog")
|
|
||||||
}
|
|
||||||
"The proper way to change an option in is to copy the existing sub-option with the desired new value" in {
|
|
||||||
val manager = new ExecutionOptionsManager("test") {
|
|
||||||
commonOptions = CommonOptions(targetDirName = "fox", topName = "dog")
|
|
||||||
}
|
|
||||||
val initialCommon = manager.commonOptions
|
|
||||||
initialCommon.targetDirName should be ("fox")
|
|
||||||
initialCommon.topName should be ("dog")
|
|
||||||
|
|
||||||
manager.commonOptions = manager.commonOptions.copy(topName = "cat")
|
|
||||||
|
|
||||||
val afterCommon = manager.commonOptions
|
|
||||||
afterCommon.topName should be ("cat")
|
|
||||||
afterCommon.targetDirName should be ("fox")
|
|
||||||
initialCommon.topName should be ("dog")
|
|
||||||
}
|
|
||||||
"The following way of changing a manager should not be used, as it could alter other desired values" - {
|
|
||||||
"Note that the initial setting targetDirName is lost when using this method" in {
|
|
||||||
val manager = new ExecutionOptionsManager("test") {
|
|
||||||
commonOptions = CommonOptions(targetDirName = "fox", topName = "dog")
|
|
||||||
}
|
|
||||||
val initialCommon = manager.commonOptions
|
|
||||||
initialCommon.topName should be("dog")
|
|
||||||
|
|
||||||
manager.commonOptions = CommonOptions(topName = "cat")
|
|
||||||
|
|
||||||
val afterCommon = manager.commonOptions
|
|
||||||
initialCommon.topName should be("dog")
|
|
||||||
afterCommon.topName should be("cat")
|
|
||||||
|
|
||||||
// This is probably bad
|
|
||||||
afterCommon.targetDirName should not be "fox"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,13 +4,12 @@ import Keys._
|
|||||||
object Dependencies {
|
object Dependencies {
|
||||||
val scalatestVersion = "3.0.0"
|
val scalatestVersion = "3.0.0"
|
||||||
val scalatest = "org.scalatest" %% "scalatest" % scalatestVersion % "test"
|
val scalatest = "org.scalatest" %% "scalatest" % scalatestVersion % "test"
|
||||||
val scoptVersion = "3.4.0"
|
val scalacheckVersion = "1.12.4"
|
||||||
val scopt = "com.github.scopt" %% "scopt" % scoptVersion
|
val scalacheck = "org.scalacheck" %% "scalacheck" % scalacheckVersion % "test"
|
||||||
|
|
||||||
val commonDependencies: Seq[ModuleID] = Seq(
|
val commonDependencies: Seq[ModuleID] = Seq(
|
||||||
scalatest
|
scalatest,
|
||||||
)
|
scalacheck
|
||||||
val executionoptionsDependencies: Seq[ModuleID] = Seq(
|
|
||||||
scopt
|
|
||||||
)
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
110
scalastyle-config.xml
Normal file
110
scalastyle-config.xml
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
<scalastyle>
|
||||||
|
<name>Scalastyle standard configuration</name>
|
||||||
|
<check level="warning" class="org.scalastyle.file.FileTabChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.FileLengthChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="maxFileLength"><![CDATA[800]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.HeaderMatchesChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="header"><![CDATA[// See LICENSE for license details.]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.SpacesAfterPlusChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.SpacesBeforePlusChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.FileLineLengthChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="maxLineLength"><![CDATA[120]]></parameter>
|
||||||
|
<parameter name="tabSize"><![CDATA[4]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.ClassNamesChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.ObjectNamesChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.PackageObjectNamesChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.EqualsHashCodeChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.IllegalImportsChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="illegalImports"><![CDATA[sun._,java.awt._]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.ParameterNumberChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="maxParameters"><![CDATA[8]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.MagicNumberChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="ignore"><![CDATA[-1,0,1,2,8,10,16]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.NoWhitespaceBeforeLeftBracketChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.NoWhitespaceAfterLeftBracketChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.ReturnChecker" enabled="false"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.NullChecker" enabled="false"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.NoCloneChecker" enabled="false"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.NoFinalizeChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.CovariantEqualsChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.StructuralTypeChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.RegexChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="regex"><![CDATA[;(\r|)\n]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
<customMessage>No lines ending with a ;</customMessage>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.RegexChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="regex"><![CDATA[println]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.NumberOfTypesChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="maxTypes"><![CDATA[30]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.CyclomaticComplexityChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="maximum"><![CDATA[10]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.UppercaseLChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.SimplifyBooleanExpressionChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.IfBraceChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="singleLineAllowed"><![CDATA[true]]></parameter>
|
||||||
|
<parameter name="doubleLineAllowed"><![CDATA[false]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.MethodLengthChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="maxLength"><![CDATA[50]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.MethodNamesChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="regex"><![CDATA[^[a-z][A-Za-z0-9]*$]]></parameter>
|
||||||
|
<parameter name="ignoreRegex"><![CDATA[^(\+[&%]?|\-[&%]?|\*|/|%|&|\||\^|<|>|\|\||&&|:=|<>|<=|>=|!=|===|<<|>>|##|unary_(~|\-%?|!))$]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.NumberOfMethodsInTypeChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="maxMethods"><![CDATA[30]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.PublicMethodsHaveTypeChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.NewLineAtEofChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.NoNewLineAtEofChecker" enabled="false"></check>
|
||||||
|
</scalastyle>
|
||||||
109
scalastyle-test-config.xml
Normal file
109
scalastyle-test-config.xml
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
<scalastyle>
|
||||||
|
<name>Scalastyle configuration for Chisel3 unit tests</name>
|
||||||
|
<check level="warning" class="org.scalastyle.file.FileTabChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.FileLengthChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="maxFileLength"><![CDATA[800]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.HeaderMatchesChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="header"><![CDATA[// See LICENSE for license details.]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.SpacesAfterPlusChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.SpacesBeforePlusChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.FileLineLengthChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="maxLineLength"><![CDATA[120]]></parameter>
|
||||||
|
<parameter name="tabSize"><![CDATA[4]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.ClassNamesChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.ObjectNamesChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.PackageObjectNamesChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.EqualsHashCodeChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.IllegalImportsChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="illegalImports"><![CDATA[sun._,java.awt._]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.ParameterNumberChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="maxParameters"><![CDATA[8]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<!-- Numerical constants are used a lot in test setups, it would be burdensome to require each one be its own val
|
||||||
|
declaration. -->
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.MagicNumberChecker" enabled="false"></check>
|
||||||
|
<!-- Scalatest's exception checking syntax looks like "a [ChiselException] should be thrownBy". -->
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.NoWhitespaceBeforeLeftBracketChecker" enabled="false"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.NoWhitespaceAfterLeftBracketChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.ReturnChecker" enabled="false"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.NullChecker" enabled="false"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.NoCloneChecker" enabled="false"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.NoFinalizeChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.CovariantEqualsChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.StructuralTypeChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.RegexChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="regex"><![CDATA[^.*;(\r|)\n]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
<customMessage>No lines ending with a ;</customMessage>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.RegexChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="regex"><![CDATA[println]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.NumberOfTypesChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="maxTypes"><![CDATA[30]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.CyclomaticComplexityChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="maximum"><![CDATA[10]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.UppercaseLChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.SimplifyBooleanExpressionChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.IfBraceChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="singleLineAllowed"><![CDATA[true]]></parameter>
|
||||||
|
<parameter name="doubleLineAllowed"><![CDATA[false]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.MethodLengthChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="maxLength"><![CDATA[50]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.MethodNamesChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="regex"><![CDATA[^[a-z][A-Za-z0-9]*$]]></parameter>
|
||||||
|
<parameter name="ignoreRegex"><![CDATA[^(\+[&%]?|\-[&%]?|\*|/|%|&|\||\^|<|>|\|\||&&|:=|<>|<=|>=|!=|===|<<|>>|##|unary_(~|\-%?|!))$]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.NumberOfMethodsInTypeChecker" enabled="true">
|
||||||
|
<parameters>
|
||||||
|
<parameter name="maxMethods"><![CDATA[30]]></parameter>
|
||||||
|
</parameters>
|
||||||
|
</check>
|
||||||
|
<check level="warning" class="org.scalastyle.scalariform.PublicMethodsHaveTypeChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.NewLineAtEofChecker" enabled="true"></check>
|
||||||
|
<check level="warning" class="org.scalastyle.file.NoNewLineAtEofChecker" enabled="false"></check>
|
||||||
|
</scalastyle>
|
||||||
65
tapeout/src/main/scala/transforms/ResetInverter.scala
Normal file
65
tapeout/src/main/scala/transforms/ResetInverter.scala
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
// See LICENSE for license details.
|
||||||
|
|
||||||
|
package barstools.tapeout.transforms
|
||||||
|
|
||||||
|
import chisel3.internal.InstanceId
|
||||||
|
import firrtl.PrimOps.Not
|
||||||
|
import firrtl.annotations.{Annotation, CircuitName, ModuleName, Named}
|
||||||
|
import firrtl.ir.{Input, UIntType, IntWidth, Module, Port, DefNode, NoInfo, Reference, DoPrim, Block, Circuit}
|
||||||
|
import firrtl.passes.Pass
|
||||||
|
import firrtl.{CircuitForm, CircuitState, LowForm, Transform}
|
||||||
|
|
||||||
|
object ResetInverterAnnotation {
|
||||||
|
def apply(target: ModuleName): Annotation = Annotation(target, classOf[ResetInverterTransform], "invert")
|
||||||
|
def unapply(a: Annotation): Option[Named] = a match {
|
||||||
|
case Annotation(m, t, "invert") if t == classOf[ResetInverterTransform] => Some(m)
|
||||||
|
case _ => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object ResetN extends Pass {
|
||||||
|
def name: String = "ResetN"
|
||||||
|
private val Bool = UIntType(IntWidth(1))
|
||||||
|
// Only works on Modules with a Bool port named reset
|
||||||
|
def invertReset(mod: Module): Module = {
|
||||||
|
// Check that it actually has reset
|
||||||
|
require(mod.ports.exists(p => p.name == "reset" && p.tpe == Bool),
|
||||||
|
"Can only invert reset on a module with reset!")
|
||||||
|
// Rename "reset" to "reset_n"
|
||||||
|
val portsx = mod.ports map {
|
||||||
|
case Port(info, "reset", Input, Bool) => Port(info, "reset_n", Input, Bool)
|
||||||
|
case other => other
|
||||||
|
}
|
||||||
|
val newReset = DefNode(NoInfo, "reset", DoPrim(Not, Seq(Reference("reset_n", Bool)), Seq.empty, Bool))
|
||||||
|
val bodyx = Block(Seq(newReset, mod.body))
|
||||||
|
mod.copy(ports = portsx, body = bodyx)
|
||||||
|
}
|
||||||
|
|
||||||
|
def run(c: Circuit): Circuit =
|
||||||
|
c.copy(modules = c.modules map {
|
||||||
|
case mod: Module if mod.name == c.main => invertReset(mod)
|
||||||
|
case other => other
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
class ResetInverterTransform extends Transform {
|
||||||
|
override def inputForm: CircuitForm = LowForm
|
||||||
|
override def outputForm: CircuitForm = LowForm
|
||||||
|
|
||||||
|
override def execute(state: CircuitState): CircuitState = {
|
||||||
|
getMyAnnotations(state) match {
|
||||||
|
case Nil => CircuitState(state.circuit, LowForm)
|
||||||
|
case Seq(ResetInverterAnnotation(ModuleName(state.circuit.main, CircuitName(_)))) =>
|
||||||
|
CircuitState(ResetN.run(state.circuit), LowForm)
|
||||||
|
case annotations =>
|
||||||
|
throw new Exception(s"There should be only one InvertReset annotation: got ${annotations.mkString(" -- ")}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
trait ResetInverter {
|
||||||
|
self: chisel3.Module =>
|
||||||
|
def invert(component: InstanceId): Unit = {
|
||||||
|
annotate(chisel3.experimental.ChiselAnnotation(component, classOf[ResetInverterTransform], "invert"))
|
||||||
|
}
|
||||||
|
}
|
||||||
39
tapeout/src/test/scala/transforms/ResetInverterSpec.scala
Normal file
39
tapeout/src/test/scala/transforms/ResetInverterSpec.scala
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
// See LICENSE for license details.
|
||||||
|
|
||||||
|
package barstools.tapeout.transforms
|
||||||
|
|
||||||
|
import chisel3._
|
||||||
|
import chisel3.util.RegInit
|
||||||
|
import firrtl._
|
||||||
|
import org.scalatest.{FreeSpec, Matchers}
|
||||||
|
|
||||||
|
class ExampleModuleNeedsResetInverted extends Module with ResetInverter {
|
||||||
|
val io = IO(new Bundle {
|
||||||
|
val out = Output(UInt(32.W))
|
||||||
|
})
|
||||||
|
|
||||||
|
val r = RegInit(0.U)
|
||||||
|
|
||||||
|
invert(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
class ResetNSpec extends FreeSpec with Matchers {
|
||||||
|
|
||||||
|
"Inverting reset needs to be done throughout module" in {
|
||||||
|
val optionsManager = new ExecutionOptionsManager("dsptools") with HasChiselExecutionOptions with HasFirrtlOptions {
|
||||||
|
firrtlOptions = firrtlOptions.copy(compilerName = "low")
|
||||||
|
}
|
||||||
|
chisel3.Driver.execute(optionsManager, () => new ExampleModuleNeedsResetInverted) match {
|
||||||
|
case ChiselExecutionSuccess(_, chirrtl, Some(FirrtlExecutionSuccess(_, firrtl))) =>
|
||||||
|
chirrtl should include ("input reset :")
|
||||||
|
chirrtl should not include "input reset_n :"
|
||||||
|
chirrtl should not include "node reset = not(reset_n)"
|
||||||
|
|
||||||
|
firrtl should include ("input reset_n :")
|
||||||
|
firrtl should include ("node reset = not(reset_n)")
|
||||||
|
firrtl should not include "input reset :"
|
||||||
|
case _ =>
|
||||||
|
// bad
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user