diff --git a/.gitignore b/.gitignore
index 31c614f2..e1b65df5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,5 @@ test-reports/
*.new
*~
/eclipse.bin
+/ucli.key
+/cpp
diff --git a/ChangeLog b/ChangeLog
index 86fa7fb4..291b8fe9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,14 +1,4 @@
-ChangeLog for Chisel v2.2.25 3/25/2015
+ChangeLog for Chisel v2.2.38
-Detect and issue an error for double Module() wrapping - #385
-Fix Data width lost in Vec #384.
-For test, use JUnitSuite over AssertionsForJUnit
-In Verilog, fix bug for similar modules, some not emitted
-Better Namespace conflict resolution for Verilog
-Fix for multiply instantiated modules in Chisel result in redundant (functionally equivalent) module definitions in generated Verilog #374
-In CPP, better detection of signals to randomize
-Disallow comparisons between Nodes and non-Nodes
-Include type of missing Parameter in error message
-Address issue with width-inference of right-shift
-Update emulator_{api,mod}.h to eliminate C++ compiler warnings.
-Update README to reflect current build procedure.
+Move {as,to}{U,S}Int definitions to Node.scala, and add them as Bundle key words.
+Update deprecated Fill() usage in FillApp.scala.
diff --git a/Makefile b/Makefile
index 6485dc12..26fc1af5 100644
--- a/Makefile
+++ b/Makefile
@@ -1,23 +1,34 @@
+# Retain all intermediate files.
+.SECONDARY:
+
SBT ?= sbt
SBT_FLAGS ?= -Dsbt.log.noformat=true
RM_DIRS := test-outputs test-reports
-CLEAN_DIRS := doc
+CLEAN_DIRS :=
SRC_DIR ?= .
-SYSTEMC ?= $(SRC_DIR)/../../systemc/systemc-2.3.1
+#SYSTEMC ?= $(SRC_DIR)/../../systemc/systemc-2.3.1
+SYSCTESTS ?= $(addsuffix .sysctest,$(notdir $(basename $(wildcard $(SRC_DIR)/src/test/scala/SysCTest/*.scala))))
CHISEL_JAR ?= $(SRC_DIR)/target/scala-2.10/chisel_2.10-2.3-SNAPSHOT.jar
-DRIVER ?= $(SRC_DIR)/src/test/resources/AddFilterSysCdriver.cpp
TEST_OUTPUT_DIR ?= ./test-outputs
-.PHONY: smoke publish-local check clean jenkins-build sysctest coverage test
+.PHONY: smoke publish-local check clean jenkins-build sysctest coverage scaladoc test compile style
+
+SMOKE_TESTS ?= StdlibSuite
default: publish-local
-smoke:
+compile:
$(SBT) $(SBT_FLAGS) compile
publish-local:
- $(SBT) $(SBT_FLAGS) publish-local
+ $(SBT) $(SBT_FLAGS) +publish-local
+
+smoke:
+ $(SBT) $(SBT_FLAGS) "test-only $(SMOKE_TESTS) -- -l org.scalatest.tags.Slow"
+
+style:
+ $(SBT) $(SBT_FLAGS) scalastyle test:scalastyle
check test:
$(SBT) $(SBT_FLAGS) test
@@ -31,6 +42,9 @@ clean:
for dir in $(CLEAN_DIRS); do $(MAKE) -C $$dir clean; done
$(RM) -r $(RM_DIRS)
+scaladoc:
+ $(SBT) $(SBT_FLAGS) doc test:doc
+
# Start off clean, then run tests for all supported configurations, and publish those versions of the code.
# Then run coverage and style tests (for developer's use).
# Don't publish the coverage test code since it contains hooks/references to the coverage test package
@@ -42,20 +56,28 @@ jenkins-build: clean
$(SBT) $(SBT_FLAGS) scalastyle coverage test
$(SBT) $(SBT_FLAGS) coverageReport
-sysctest:
- mkdir -p $(TEST_OUTPUT_DIR)
- $(MAKE) -C $(TEST_OUTPUT_DIR) -f ../Makefile SRC_DIR=.. syscbuildandruntest
+.PHONY: SYSCDIR
+
+SYSCDIR:
+ @if [ -z "$(SYSTEMC)" ]; then echo "Please define SYSTEMC (the root of the systemc distribution) in your environment"; exit 1; fi
+ @if [ ! -d "$(SYSTEMC)" ]; then echo "SYSTEMC isn't a valid directory - $(SYSTEMC)"; exit 1; fi
-syscbuildandruntest: AddFilter
- ./AddFilter
+sysctests: $(SYSCTESTS) SYSCDIR
+
+sysctest: $(firstword $(SYSCTESTS)) SYSCDIR
+
+%.sysctest:
+ mkdir -p $(TEST_OUTPUT_DIR)
+ $(MAKE) -C $(TEST_OUTPUT_DIR) -f ../Makefile SRC_DIR=.. $(basename $@).sysc
+ cd $(TEST_OUTPUT_DIR) && ./$(basename $@).sysc
-AddFilter: AddFilter.h AddFilter.cpp $(SYSC_DRIVER)
- $(CXX) AddFilter.cpp $(DRIVER) \
+%.sysc: %.h %.cpp $(SRC_DIR)/src/test/resources/%SysCdriver.cpp
+ $(CXX) -g $(filter-out %.h,$^) \
-I. -I$(SYSTEMC)/include -L$(SYSTEMC)/lib-macosx64 -lsystemc -o $@
-AddFilter.cpp AddFilter.h: AddFilter.class
- scala -cp $(CHISEL_JAR):. AddFilter --targetDir . --genHarness --backend sysc --design AddFilter
+%.h %.cpp: %.class
+ scala -cp $(CHISEL_JAR):. SysCTest.$(basename $@) --targetDir . --genHarness --backend sysc
-AddFilter.class: $(CHISEL_JAR) ../src/test/scala/AddFilter.scala
- scalac -cp $(CHISEL_JAR) ../src/test/scala/AddFilter.scala
+%.class: ../src/test/scala/SysCTest/%.scala $(CHISEL_JAR)
+ scalac -cp $(CHISEL_JAR) $<
diff --git a/README.md b/README.md
index 576d930f..6a37bac0 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,8 @@
+#### NOTE: This README.md describes (and associated repository contains) version 2.x of Chisel, and while we continue to support this version of Chisel, we encourage people to migrate to the new version: [Chisel3](https://github.com/ucb-bar/chisel3)
+
+We've removed the Getting Started section of this document.
+If you're just getting started, you should be using Chisel3.
+
About Chisel
============
@@ -10,119 +15,55 @@ language, which raises the level of hardware design abstraction by providing
concepts including object orientation, functional programming, parameterized
types, and type inference.
-Chisel can generate a high-speed C++-based cycle-accurate software simulator,
-or low-level Verilog designed to pass on to standard ASIC or FPGA tools
-for synthesis and place and route.
-
Visit the [community website](http://chisel.eecs.berkeley.edu/) for more
information.
-Getting started
-===============
-
-Chisel Users
-------------
+Documentation
+-------------
-To start working on a circuit with Chisel, create simple build.sbt
-and scala source file containing your Chisel code as follow.
+Documentation has been moved to a separate [repository](https://github.com/ucb-bar/chisel-doc).
- $ cat build.sbt
- scalaVersion := "2.10.4"
- libraryDependencies += "edu.berkeley.cs" %% "chisel" % "latest.release"
+Chisel3
+=======
-(You want your build.sbt file to contain a reference to Scala version greater
-or equal to 2.10 and a dependency on the Chisel library.)
+We're releasing snapshot versions of Chisel3. To facilitate the
+transition from Chisel2, you should ensure that your designs build and
+test in Chisel3 compatibility mode by passing the following arguments
+to Chisel:
-Edit the source files for your circuit
+ --minimumCompatibility 3.0.0
- $ cat Hello.scala
- import Chisel._
-
- class HelloModule extends Module {
- val io = new Bundle {}
- printf("Hello World!\n")
- }
-
- class HelloModuleTests(c: HelloModule) extends Tester(c) {
- step(1)
- }
+If you invoke chiselMain() or chiselMainTest() directly, you should
+add these arguments to your current argument list:
object hello {
def main(args: Array[String]): Unit = {
- chiselMainTest(Array[String]("--backend", "c", "--compile", "--test", "--genHarness"),
+ chiselMainTest(Array[String]("--backend", "c", "--compile", "--test", "--genHarness", "--minimumCompatibility", "3.0.0"),
() => Module(new HelloModule())){c => new HelloModuleTests(c)}
}
}
-At this point you will need to [download and install sbt](http://www.scala-sbt.org/release/docs/Getting-Started/Setup.html#installing-sbt)
-for your favorite distribution. You will need sbt version 0.13.0 or higher
-because [recent versions of sbt](http://www.scala-sbt.org/0.13.0/docs/Community/Changes.html)
-generate jars without the scala third-point version number
-(i.e. chisel_2.10-2.0.2.jar instead of chisel_2.10*.2*-2.0.2.jar).
-
-Execute sbt run to generate the C++ simulation source for your circuit, and (assuming you have a g++ compiler installed), compile it, and execute it under the tester.
-
- $ sbt run
-
-
-Going further, you should read on the [sbt directory structure](http://www.scala-sbt.org/release/docs/Getting-Started/Directories.html)
-to organize your files for bigger projects. SBT is the "official"
-build system for Scala but you can use any other Java build system you
-like (Maven, etc).
-
-Chisel is implemented 100% in Scala!
-
-
-Chisel developers
------------------
-
-You should have git, make, scala, and sbt installed on your
-development system. First, clone the Chisel repository and change to
-the project directory:
-
- $ git clone https://github.com/ucb-bar/chisel.git
- $ cd chisel
-
-Compile and install your local copy of Chisel:
-
- $ make clean test publish-local
-
-In order to use your local copy of Chisel in your own projects, you
-will need to update your build.sbt files so the Chisel library
-dependency is satisfied by your local copy. Replace
-
- libraryDependencies += "edu.berkeley.cs" %% "chisel" % "latest.release"
-
-with:
-
- libraryDependencies += "edu.berkeley.cs" %% "chisel" % "2.3-SNAPSHOT"
-
-Before you generate a pull request, run the following command
-to insure all unit tests pass.
-
- $ make test
-
-You can follow Chisel metrics on style compliance and code coverage
-on the [website](https://chisel.eecs.berkeley.edu/unit_test_trends.html).
-
-If you are debugging an issue in a third-party project which depends
-on the Chisel jar, first check that the chisel version in your chisel
-code base and in the third-party project library dependency match.
-After editing the chisel code base, delete the local jar cache directory
-to make sure you are not picking up incorrect jar files, then publish
-the Chisel jar locally and remake your third-party project. Example:
-
- $ cat *srcTop*/chisel/project/build.scala
- ...
- version := "2.3-SNAPSHOT"
- ...
-
- $ cat *srcTop*/riscv-sodor/project/build.scala
- ...
- libraryDependencies += "edu.berkeley.cs" %% "chisel" % "2.3-SNAPSHOT"
- ...
-
- $ cd *srcTop*/chisel && make publish-local
- $ cd *srcTop*/riscv-sodor && make run-emulator
-
+This will report errors for the following Chisel3 issues:
+
+ * Vec(Reg) should be replaced with Reg(Vec),
+ * type-only vals (no associated data) must be wrapped in a Wire() if they will be the destination of a wiring operation (":=" or " < >"),
+ * masked bit patterns ('b??') should be created using BitPat(), not UInt() or Bits(),
+ * the "clone" method required for parameterized Bundles has been renamed "cloneType",
+ * the con and alt inputs to a Mux must be type-compatible - both signed or both unsigned,
+ * bulk-connection to a node that has been procedurally assigned-to is illegal,
+ * != is deprecated, use =/= instead,
+ * use SeqMem(...) instead of Mem(..., seqRead),
+ * use SeqMem(n:Int, out: => T) instead of SeqMem(out: => T, n:Int),
+ * use Mem(n:Int, t:T) instead of Mem(out:T, n:Int),
+ * use Vec(n:Int, gen: => T) instead of Vec(gen: => T, n:Int),
+ * Mem(..., orderedWrites) is no longer supported,
+ * masked writes are only supported for Mem[Vec[_]],
+ * connections between UInt and SInt are illegal.
+ * module io's must be wrapped in IO().
+
+In addition, the following incompatibilities require code changes:
+
+ * the Node class and object no longer exist (the class should have been private in Chisel2)
+ * printf() is defined in the Chisel object and produces simulation printf()'s. To use the Scala Predef.printf(), you need to qualify it with Predef.
+ * in Chisel2, bulk-connects <> with unconnected source components do not update connections from the unconnected components. In Chisel3, bulk-connects strictly adhere to last connection semantics and unconnected OUTPUTs will be connected to INPUTs resulting in the assignment of random values to those inputs.
diff --git a/ReleaseNotes b/ReleaseNotes
index 60d1fcde..403fad99 100644
--- a/ReleaseNotes
+++ b/ReleaseNotes
@@ -1,5 +1,8 @@
-ReleaseNotes for Chisel v2.2.25 3/25/2015
+ReleaseNotes for Chisel v2.2.38
-This release of Chisel is largely a maintenance release.
-See the associated Changelog for issues resolved with this release.
+This release of Chisel is a maintenance release, incorporating support for Chisel3's {as,to}{U,S}Int methods in all Chisel Data types.
+
+We will be removing support for Scala 2.10 in future Chisel
+releases. Please verify your code compiles and runs correctly under
+Scala 2.11.
diff --git a/bin/build_graphs.py b/bin/build_graphs.py
index 2a4d116c..b0da26eb 100644
--- a/bin/build_graphs.py
+++ b/bin/build_graphs.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
-import fnmatch, json, os, re, sys, xml.dom.minidom
+import fnmatch, json, os, re, sys, xml.dom.minidom, time
from jinja2 import Environment, FileSystemLoader
@@ -11,62 +11,73 @@ def get_element_text(node):
result += text.data.strip()
return result
+def load_build_info(path):
+ """Load build.xml as output by Jenkins"""
+ doc = xml.dom.minidom.parse(path)
+ timestampElements = doc.documentElement.getElementsByTagName("timestamp")
+ assert timestampElements.length == 1
+ timestampStr = get_element_text(timestampElements[0])
+ localTimestamp = time.localtime(float(timestampStr)/1000)
+ GMTOffset = time.altzone if localTimestamp.tm_isdst else time.timezone
+ # print "timestamp: %s\n" % (timestampStr)
+ sign = ""
+ if GMTOffset < 0:
+ sign = '-'
+ GMTOffset = -GMTOffset
+ else:
+ sign = '+'
+ hourOffset = GMTOffset/3600
+ minOffset = (GMTOffset - (hourOffset * 3600))/60
+ hhmmOffset = '{}{:02d}{:02d}'.format(sign, hourOffset, minOffset)
+ timestamp = time.strftime("%Y-%m-%dT%H:%M:%S", localTimestamp) + hhmmOffset
+ return timestamp
def load_test_results(path):
- """Load junitResult.xml as outputed by Jenkins"""
+ """Load junitResult.xml as output by Jenkins"""
doc = xml.dom.minidom.parse(path)
- timestamp = get_element_text(
- doc.documentElement.getElementsByTagName("timestamp")[0])
nb_tests = len(doc.documentElement.getElementsByTagName("case"))
nb_failures = len(
doc.documentElement.getElementsByTagName("errorStackTrace"))
- return timestamp, nb_tests, nb_failures
+ return nb_tests, nb_failures
def load_checkstyle_violations(path):
- """Load violations.xml as outputed by Jenkins"""
+ """Load violations.xml as output by Jenkins"""
nb_violations = 0
doc = xml.dom.minidom.parse(path)
- look = re.match('.*/(\d\d\d\d-\d\d-\d\d)_(\d\d)-(\d\d)-(\d\d)/.*', path)
- if look:
- timestamp = "%sT%s:%s:%s-0700" % (
- look.group(1), look.group(2), look.group(3), look.group(4))
- for node in doc.documentElement.getElementsByTagName("file"):
- nb_violations += int(node.getAttribute("count"))
- return timestamp, nb_violations
- raise ValueError("cannot extract timestamp for %s" % path)
-
+ for node in doc.documentElement.getElementsByTagName("file"):
+ nb_violations += int(node.getAttribute("count"))
+ return nb_violations
def load_coverage(path):
- """Load coverage.xml as outputed by Jenkins"""
+ """Load coverage.xml as output by Jenkins"""
doc = xml.dom.minidom.parse(path)
- look = re.match('.*/(\d\d\d\d-\d\d-\d\d)_(\d\d)-(\d\d)-(\d\d)/.*', path)
- if look:
- timestamp = "%sT%s:%s:%s-0700" % (
- look.group(1), look.group(2), look.group(3), look.group(4))
- line_coverage = float(doc.documentElement.getAttribute("line-rate"))
- return timestamp, line_coverage
- raise ValueError("cannot extract timestamp for %s" % path)
+ line_coverage = float(doc.documentElement.getAttribute("line-rate"))
+ return line_coverage
def main(args):
failures = []
coverage = []
violations = []
- root_dir = os.getcwd()
+ root_dir = os.path.join(os.getcwd(), 'builds')
for root, dirnames, filenames in os.walk(root_dir):
+ if not ('build.xml' in filenames):
+ continue
+ # General build info
+ timestamp = load_build_info(os.path.join(root, 'build.xml'))
# unit test results
for path in fnmatch.filter(filenames, 'junitResult.xml'):
- timestamp, nb_tests, nb_failures = load_test_results(
+ nb_tests, nb_failures = load_test_results(
os.path.join(root, path))
failures += [ (timestamp, float(nb_failures) / nb_tests) ]
# checkstyle violations
- for path in fnmatch.filter(filenames, 'violations.xml'):
- timestamp, nb_violations = load_checkstyle_violations(
- os.path.join(root, path))
+ for dir in fnmatch.filter(dirnames, 'violations'):
+ path = os.path.join(root, dir, 'violations.xml')
+ nb_violations = load_checkstyle_violations(path)
violations += [ (timestamp, nb_violations) ]
# line coverage
for path in fnmatch.filter(filenames, 'coverage.xml'):
- timestamp, line_coverage = load_coverage(
+ line_coverage = load_coverage(
os.path.join(root, path))
coverage += [ (timestamp, line_coverage) ]
diff --git a/build.sbt b/build.sbt
new file mode 100644
index 00000000..4a399dbc
--- /dev/null
+++ b/build.sbt
@@ -0,0 +1,101 @@
+def versionToArray(v: String): Array[String] = v.split('.')
+
+lazy val chiselBuildSettings = Seq (
+ organization := "edu.berkeley.cs",
+ // version := "2.2.40",
+ version := "2.3-SNAPSHOT",
+ name := "Chisel",
+ scalaVersion := "2.11.11",
+ crossScalaVersions := Seq("2.10.6", "2.11.11"),
+ //sourceDirectory := new File("@srcTop@"),
+ publishMavenStyle := true,
+ publishArtifact in Test := false,
+ pomIncludeRepository := { x => false },
+ pomExtra := (
+ http://chisel.eecs.berkeley.edu/
+
+
+ BSD-style
+ http://www.opensource.org/licenses/bsd-license.php
+ repo
+
+
+
+ https://github.com/ucb-bar/chisel.git
+ scm:git:github.com/ucb-bar/chisel.git
+
+
+
+ jackbackrack
+ Jonathan Bachrach
+ http://people.csail.mit.edu/jrb/
+
+
+ huytbvo
+ Huy Vo
+
+
+ ),
+
+ publishTo <<= version { v: String =>
+ val nexus = "https://oss.sonatype.org/"
+ if (v.trim.endsWith("SNAPSHOT"))
+ Some("snapshots" at nexus + "content/repositories/snapshots")
+ else
+ Some("releases" at nexus + "service/local/staging/deploy/maven2")
+ },
+
+ resolvers ++= Seq(
+ Resolver.sonatypeRepo("snapshots"),
+ Resolver.sonatypeRepo("releases")
+ ),
+
+ /* Bumping "com.novocode" % "junit-interface" % "0.11", causes DelayTest testSeqReadBundle to fail
+ * in subtly disturbing ways on Linux (but not on Mac):
+ * - some fields in the generated .h file are re-named,
+ * - an additional field is added
+ * - the generated .cpp file has additional differences:
+ * - different temps in clock_lo
+ * - missing assignments
+ * - change of assignment order
+ * - use of "Tx" vs. "Tx.values"
+ */
+ libraryDependencies += "com.novocode" % "junit-interface" % "0.10" % "test",
+ // scalatest and scalacheck ordinarily are needed only for testing,
+ // but since ChiselSpec is in main for clients of chisel and their tests,
+ // these are now required for the main build.
+ libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.5",
+ libraryDependencies += "org.scalacheck" %% "scalacheck" % "1.12.5",
+ libraryDependencies <+= (scalaVersion)("org.scala-lang" % "scala-reflect" % _),
+
+ // Execute tests in the current project serially.
+ // Tests from other projects may still run concurrently.
+ parallelExecution in Test := false,
+ scalacOptions ++= Seq("-deprecation", "-feature", "-language:reflectiveCalls", "-language:implicitConversions", "-language:existentials"),
+ javacOptions ++= Seq("-target", "1.7"),
+ scalacOptions in (Compile, doc) <++= (baseDirectory in LocalProject("chisel"), version) map { (bd, v) =>
+ Seq("-diagrams", "-diagrams-max-classes", "25", "-sourcepath", bd.getAbsolutePath, "-doc-source-url", "https://github.com/ucb-bar/chisel/tree/master/€{FILE_PATH}.scala")
+ }
+ )
+
+lazy val chisel = (project in file(".")).
+ enablePlugins(BuildInfoPlugin).
+ settings(
+ // We should really be using name.value, but currently, the package is "Chisel" (uppercase first letter)
+ buildInfoPackage := /* name.value */ "Chisel",
+ buildInfoOptions += BuildInfoOption.BuildTime,
+ buildInfoKeys := Seq[BuildInfoKey](buildInfoPackage, version, scalaVersion, sbtVersion),
+ // Move the managed source directory where git won't complain about it,
+ // and where we can easily package its files as part of the source jar artifact.
+ // We'd like to use versionToArray(), slice(), and mkString() to convert an explicit
+ // Scala version (like 2.10.6), into the leftmost two components (2.10),
+ // but this seems to run afoul of assumptions sbt makes about the inclusion
+ // of Scala-version-specfic code (we get
+ // BuildInfo is already defined as case class BuildInfo
+ // so use the full version spec.
+ //sourceManaged in Compile <<= (sourceDirectory in Compile, scalaVersion){ (s,v) => s / ("scala-" + versionToArray(v).slice(0,2).mkString(".") + "/src_managed") },
+ sourceManaged in Compile <<= (sourceDirectory in Compile, scalaVersion){ (s,v) => s / ("scala-" + v + "/src_managed") },
+ // Add the generated sources to the packagedSrc artifact since they are excluded by default.
+ mappings in (Compile, packageSrc) += { ((sourceManaged in Compile).value / "sbt-buildinfo" / "BuildInfo.scala") -> "BuildInfo.scala" }
+ ).
+ settings(chiselBuildSettings: _*)
diff --git a/doc/manual/chisel.mtt b/chisel.mtt
similarity index 66%
rename from doc/manual/chisel.mtt
rename to chisel.mtt
index dd9eea3e..fbd25786 100644
--- a/doc/manual/chisel.mtt
+++ b/chisel.mtt
@@ -49,14 +49,14 @@ backend.
\section{Options}
%%%%%%%%%%%%%%%%%
-\begin{Description}[\Opt{--allocateOnlyNeededShadowRegisters}]\setlength{\itemsep}{0cm}
-\item[\Opt{--allocateOnlyNeededShadowRegisters}] (C++) Attempt to allocate
+\begin{Description}[\Opt{allocateOnlyNeededShadowRegisters}]\setlength{\itemsep}{0cm}
+\item[--\Opt{allocateOnlyNeededShadowRegisters}] (C++) Attempt to allocate
only those shadow registers actually required. This reduces the size
of the main C++ design object (especially when
\Arg{--shadowRegisterInObject} is enabled), which in turn reduces
compilation time. It should have no execution-time performance impact.
-\item[\Opt{--assert}] Emit assertions.
-\item[\OptArg{--backend}{\ backendname}] Use the specified backend where
+\item[--\Opt{assert}] Emit assertions.
+\item[--\OptArg{backend}{\ backendname}] Use the specified backend where
\Arg{backendname} is one of
\begin{itemize}
\item[\Arg{c}] C++ emulation
@@ -66,27 +66,27 @@ backend.
\item[\Arg{sysc}] SystemC emulation
\item[\Arg{v}] Verilog
\end{itemize}
-\item[\Opt{--checkPorts}] Hmmm
-\item[\Opt{--compile}] Produce backend output
-\item[\Opt{--compileInitializationUnoptimized}] (C++) Compile
+\item[--\Opt{checkPorts}] Hmmm
+\item[--\Opt{compile}] Produce backend output
+\item[--\Opt{compileInitializationUnoptimized}] (C++) Compile
initialization code at -O0, rarely used code at -O1.
-\item[\OptArg{--configCollect}{\ project.class}] Hmmm
-\item[\Opt{--configDump}] Hmmm
-\item[\OptArg{--configInstance}{\ project.class}] Hmmm
-\item[\Opt{--cse}] Do common subexpression elimination
-\item[\Opt{--debug}] Hmmm
-\item[\Opt{--debugMem}] Hmmm
-\item[\Opt{--dumpTestInput}] Hmmm
-\item[\Opt{--emitTempNodes}] Hmmm
-\item[\Opt{--genHarness}] Hmmm
-\item[\OptArg{--include}{\ includefilenames}] (C++) Generate include
+\item[--\OptArg{configCollect}{\ project.class}] Hmmm
+\item[--\Opt{configDump}] Hmmm
+\item[--\OptArg{configInstance}{\ project.class}] Hmmm
+\item[--\Opt{cse}] Do common subexpression elimination
+\item[--\Opt{debug}] Hmmm
+\item[--\Opt{debugMem}] Hmmm
+\item[--\Opt{dumpTestInput}] Hmmm
+\item[--\Opt{emitTempNodes}] Hmmm
+\item[--\Opt{genHarness}] Hmmm
+\item[--\OptArg{include}{\ includefilenames}] (C++) Generate include
file statements for each of the (space-delimited) filenames.
-\item[\Opt{--inlineMem}] Hmmm
-\item[\Opt{--ioDebug}] Hmmm
-\item[\Opt{--isVCDinline}] (C++) Generate VCD dump code without goto
+\item[--\Opt{inlineMem}] Hmmm
+\item[--\Opt{ioDebug}] Hmmm
+\item[--\Opt{isVCDinline}] (C++) Generate VCD dump code without goto
branches. Allows compiling smaller VCD dump functions, reducing C++
compile times. This will have some impact on execution-time performance.
-\item[\OptArg{--lineLimitFunctions}{\ lines}] (C++) Limit the number of
+\item[--\OptArg{lineLimitFunctions}{\ lines}] (C++) Limit the number of
lines in a C++ function/method before splitting it up into multiple
functions to reduce C++ compile times. The \Arg{lines} value
specifies a loose upper limit on the number of lines output to a
@@ -97,45 +97,46 @@ backend.
of calling a single function, calls to multiple functions are
generated. Reasonable values for this argument would be in the range
from 256 to 2048.
-\item[\Opt{--lineNumbers}] Hmmm
-\item[\OptArg{--minimumLinesPerFile}{\ lines}] (C++) Limit the minimum
+\item[--\Opt{lineNumbers}] Hmmm
+\item[--\OptArg{minimumLinesPerFile}{\ lines}] (C++) Limit the minimum
number of lines per file so as not to produce trivial files. This
works in conjunction with \Arg{lineLimitFunctions} to break up a
massive single file into multiple smaller (but not too small)
files. Reasonable values for this argument would be in the range of
1024 to 32768.
-\item[\OptArg{--moduleNamePrefix}{\ }] Hmmm
-\item[\Opt{--noAssert}] Hmmm
-\item[\Opt{--noCombLoop}] Hmmm
-\item[\Opt{--noInlineMem}] Hmmm
-\item[\Opt{--noIoDebug}] Hmmm
-\item[\OptArg{--numCols}{\ columns}] Hmmm
-\item[\OptArg{--numRows}{\ rows}] Hmmm
-\item[\OptArg{--parallelMakeJobs}{\ jobs}] (C++) Generate a
+\item[--\OptArg{moduleNamePrefix}{\ }] Hmmm
+\item[--\Opt{noAssert}] Hmmm
+\item[--\Opt{noCombLoop}] Hmmm
+\item[--\Opt{noInlineMem}] Hmmm
+\item[--\Opt{noIoDebug}] Hmmm
+\item[--\OptArg{numCols}{\ columns}] Hmmm
+\item[--\OptArg{numRows}{\ rows}] Hmmm
+\item[--\OptArg{parallelMakeJobs}{\ jobs}] (C++) Generate a
\File{Makefile} to compile multiple C++ files in parallel. The
\Arg{jobs} argument specifies the amount of parallelism (the
argument to the \Arg{-j} option to \Prog{make}). A value of -1 indicates
that no value will be passed with the \Arg{-j} argument to
\Prog{make}, which in turn should inform \Prog{make} not to limit
the number of jobs that can run simultaneously.
-\item[\Opt{--partitionIslands}] (C++, dot) Partition the graph into islands of
+\item[--\Opt{partitionIslands}] (C++, dot) Partition the graph into islands of
combinatorial logic that may be compiled and executed in parallel.
-\item[\Opt{--reportDims}] Hmmm
-\item[\Opt{--shadowRegisterInObject}] (C++) Allocate shadow registers
+\item[--\Opt{reportDims}] Hmmm
+\item[--\Opt{shadowRegisterInObject}] (C++) Allocate shadow registers
in the global emulation object (as opposed to the local clock
procedures). This is automatically enabled when
\Arg{lineLimitFunctions} is in effect.
-\item[\OptArg{--targetDir}{\ outputdir}] Hmmm
-\item[\Opt{--test}] Hmmm
-\item[\OptArg{--testerSeed}{\ seed}] Hmmm
-\item[\Opt{--v}] Hmmm
-\item[\Opt{--vcd}] Hmmm
-\item[\Opt{--vcdMem}] Hmmm
-\item[\Opt{--Wcomponent}] Hmmm
-\item[\Opt{--Wconnection}] Hmmm
-\item[\Opt{--wi}] Hmmm
-\item[\Opt{--wio}] Hmmm
-\item[\Opt{--wo}] Hmmm
+\item[--\OptArg{targetDir}{\ outputdir}] Directory in which to place
+ generated files.
+\item[--\Opt{test}] Run the tester on the simulation.
+\item[--\OptArg{testerSeed}{\ seed}] Hmmm
+\item[--\Opt{v}] short-cut for "--backend v"
+\item[--\Opt{vcd}] Hmmm
+\item[--\Opt{vcdMem}] Hmmm
+\item[--\Opt{Wcomponent}] Hmmm
+\item[--\Opt{Wconnection}] Hmmm
+\item[--\Opt{wi}] Hmmm
+\item[--\Opt{wio}] Hmmm
+\item[--\Opt{wo}] Hmmm
\end{Description}
\section{Version}
diff --git a/csrc/emulator_api.h b/csrc/emulator_api.h
deleted file mode 120000
index f138c45b..00000000
--- a/csrc/emulator_api.h
+++ /dev/null
@@ -1 +0,0 @@
-../src/main/resources/emulator_api.h
\ No newline at end of file
diff --git a/csrc/emulator_mod.h b/csrc/emulator_mod.h
deleted file mode 120000
index c515a419..00000000
--- a/csrc/emulator_mod.h
+++ /dev/null
@@ -1 +0,0 @@
-../src/main/resources/emulator_mod.h
\ No newline at end of file
diff --git a/csrc/tests.cpp b/csrc/tests.cpp
index 3db9a652..2dafb523 100644
--- a/csrc/tests.cpp
+++ b/csrc/tests.cpp
@@ -4,7 +4,7 @@
template dat_t LITS(const char* str) {
dat_t dat;
- assert(dat_from_str(str, dat));
+ assert(dat_from_hex(str, dat));
return dat;
}
diff --git a/doc/.gitignore b/doc/.gitignore
deleted file mode 100644
index f1cfd767..00000000
--- a/doc/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-*.log
-*.aux
-installation.pdf
-manual.pdf
-tutorial.pdf
-cheatsheet/cheatsheet.pdf
diff --git a/doc/Makefile b/doc/Makefile
deleted file mode 100644
index 57f20ebc..00000000
--- a/doc/Makefile
+++ /dev/null
@@ -1,82 +0,0 @@
-# Building the docs on osx will require to install Jinja2 and BeautifulSoup:
-# $ pip install Jinja2 BeautifulSoup
-# and the different tools for text to pdf:
-# $ port install texlive-latex-extra texlive-latex-recommended \
-# texlive-htmlxml ImageMagick
-
-version := 2.2.0
-
-PDFLATEX := pdflatex
-WWW_PAGES := index.html documentation.html download.html faq.html releases.html
-WWW_EXTRA := manual.html getting-started.html
-
-# The following subdirectories build documentation correctly.
-PDF_DIRS := installation manual tutorial getting-started dac12-talk
-PDFS := $(addsuffix .pdf,$(addprefix chisel-,$(PDF_DIRS)))
-
-LATEX2MAN := latex2man
-MAN_PAGES := chisel.man
-
-srcDir := .
-installTop:= ../www
-
-# Set the current release info
-# RELEASE_TAGTEXT is something like: v2.2.18 125 g3501d7f
-# i.e., the output of git describe with dashes replaced by spaces
-RELEASE_TAGTEXT=$(subst -, ,$(shell git describe --tags release))
-RELEASE_TAG=$(firstword $(RELEASE_TAGTEXT))
-RELEASE_DATETEXT=$(shell git log -1 --format="%ai" $(RELEASE_TAG))
-RELEASE_DATE=$(firstword $(RELEASE_DATETEXT))
-
-vpath %.tex $(srcDir)/bootcamp $(srcDir)/installation $(srcDir)/talks/dac12 $(srcDir)/manual $(srcDir)/tutorial $(srcDir)/getting-started
-
-vpath %.mtt $(srcDir)/bootcamp $(srcDir)/installation $(srcDir)/talks/dac12 $(srcDir)/manual $(srcDir)/tutorial $(srcDir)/getting-started
-
-all: $(WWW_PAGES) $(WWW_EXTRA) $(PDFS)
-
-extra: $(WWW_EXTRA)
-
-html: $(WWW_PAGES)
-
-pdf: $(PDFS)
-
-install: all
- install -d $(installTop)/$(version)/figs
- install -m 644 $(wildcard $(srcDir)/manual/figs/*.png $(srcDir)/tutorial/figs/*.png) $(installTop)/$(version)/figs
- install -m 644 $(WWW_EXTRA) $(PDFS) $(installTop)/$(version)
- install -m 644 $(WWW_PAGES) $(installTop)
-
-
-chisel-%.pdf: %.tex
- cd $(dir $<) && TEXINPUTS=".:$(PWD)/$(srcDir)/manual:${TEXINPUTS}" pdflatex -file-line-error -interaction nonstopmode -output-directory $(PWD) $(notdir $<)
- mv $(subst .tex,.pdf,$(notdir $<)) $@
-
-%.html: %.tex
- cd $(dir $<) && TEXINPUTS=".:$(PWD)/$(srcDir)/manual:${TEXINPUTS}" htlatex $(notdir $<) $(PWD)/$(srcDir)/html.cfg "" -d/$(PWD)/
- mv $(subst .tex,.html,$(notdir $<)) $@~
- $(srcDir)/../bin/tex2html.py $@~ $@
-
-%.man: %.mtt
- # cd into the directory containing the .tex file and massage it
- cd $(dir $<) && \
- sed -e "s/@VERSION@/$(RELEASE_TAG)/" -e "s/@DATE@/$(RELEASE_DATE)/" $(notdir $<) > $(basename $@).ttex ;\
- TEXINPUTS=".:$(PWD)/$(srcDir)/manual:${TEXINPUTS}" latex2man $(basename $@).ttex $@
-
-%.html: $(srcDir)/templates/%.html $(srcDir)/templates/base.html
- $(srcDir)/../bin/jinja2html.py $(notdir $<) $@
-
-releases.html: $(srcDir)/templates/releases.html $(srcDir)/templates/base.html
- sed -e "s/@VERSION@/$(RELEASE_TAG)/" -e "s/@DATE@/$(RELEASE_DATE)/" $< > $(dir $<)/$@.tmp
- $(srcDir)/../bin/jinja2html.py $@.tmp $@ && ${RM} $(dir $<)/$@.tmp
-
-clean:
- -rm -f $(addprefix manual/,*.4ct *.4tc *.css *.dvi *.html *.idv *.lg *.tmp *.xref)
- -rm -f $(addprefix manual/figs/,bits-1.png bits-and.png bits-or-and.png node-hierarchy.png type-hierarchy.png)
- -rm -f $(addprefix tutorial/,*.4ct *.4tc *.css *.dvi *.html *.idv *.lg *.tmp *.xref)
- -rm -f $(addprefix tutorial/figs/,DUT.png DUT.svg condupdates.png)
- -rm -f $(addprefix getting-started/,*.4ct *.4tc *.css *.dvi *.html *.idv *.lg *.tmp *.xref) getting-started?.html
- -rm -f $(WWW_PAGES) $(PDFS) $(WWW_EXTRA) $(addsuffix .1,$(WWW_EXTRA)) $(patsubst %.html,%.css,$(WWW_EXTRA))
- -rm -f *~ *.aux *.log *.nav *.out *.snm *.toc *.vrb
- -rm -f *.jpg *.png
- -rm -f manual/chisel.man manual/chisel.ttex
-
diff --git a/doc/README b/doc/README
new file mode 100644
index 00000000..2af516dc
--- /dev/null
+++ b/doc/README
@@ -0,0 +1,8 @@
+Chisel documentation (non-tutorial) has been moved to the chisel-doc repo:
+
+ https://github.com/ucb-bar/chisel-doc
+
+Tutorial documentation has been moved to the chisel-tutorial repo:
+
+ https://github.com/ucb-bar/chisel-tutorial/doc/tutorial
+
diff --git a/doc/bootcamp/bootcamp-20130930.tex b/doc/bootcamp/bootcamp-20130930.tex
deleted file mode 100644
index ffddba81..00000000
--- a/doc/bootcamp/bootcamp-20130930.tex
+++ /dev/null
@@ -1,2280 +0,0 @@
-\documentclass[xcolor=pdflatex,dvipsnames,table]{beamer}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{relsize}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-\input{../style/talk.tex}
-
-\title{Chisel Bootcamp 3}
-\author{Jonathan Bachrach}
-\date{\today}
-\institute[UC Berkeley]{EECS UC Berkeley}
-
-\begin{document}
-
-\begin{frame}
-\titlepage
-\end{frame}
-\addtocounter{framenumber}{-1}
-
-% \begin{frame}[fragile]{tutorial.scala}
-% \begin{scala}
-% package Tutorial {
-%
-% import Chisel._
-%
-% object Tutorial {
-% def main(args: Array[String]): Unit = {
-% val tut_args = args.slice(1, args.length) ++
-% Array("--targetDir", "../emulator", "--genHarness")
-% args(0) match {
-% case "gcd" =>
-% chiselMain(tut_args, () => new GCD())
-% ...
-% }
-% }
-% }
-%
-% }
-% \end{scala}
-% \end{frame}
-
-\begin{frame}[fragile]{Goals for Bootcamp}
-
-\begin{itemize}
-\item get yout started with Chisel
-\item get a basic working knowledge of Chisel
-\item learn how to think in Chisel
-\item know where to get more information
-\end{itemize}
-
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Logging into EC2}
-
-\begin{scala}
-ssh ubuntu@xxx
-password: bootcamp
-\end{scala}
-\noindent
-where \code{xxx} corresponds to your EC2 instance written on your airbears slip
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Using Screen}
-to prevent lossage of state if disconnected ... when you first log in, type
-\begin{scala}
-screen
-\end{scala}
-
-when you log back into the instance, type
-\begin{scala}
-screen -r
-\end{scala}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Getting the Latest}
-
-\begin{scala}
-cd chisel-tutorial
-git pull
-\end{scala}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{chisel-tutorial repo}
-\begin{FramedSemiVerb}
-chisel-tutorial/
- Makefile
- examples/ \comment{\# Contains chisel examples}
- Makefile
- build.sbt \comment{\# Contains project description}
- FullAdder.scala ...
- problems/ \comment{\# Contains skeletal files for tutorial problems}
- Makefile
- build.sbt \comment{\# Contains project description}
- Accumulator.scala ...
- solutions/ \comment{\# Contains solutions to problems}
- Makefile
- build.sbt \comment{\# Contains project description}
- Counter.scala ...
-\end{FramedSemiVerb}
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Get This}
-
-\begin{center}
-\fbox{
-\url{chisel.eecs.berkeley.edu/bootcamp-20130930.pdf}
-}
-\end{center}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]
-\frametitle{Chisel}
-
-\begin{columns}[c]
-
-\column{0.55\textwidth}
-
-\begin{itemize}
-\item A hardware construction language
-\begin{itemize}
-\item ``synthesizable by construction''
-\end{itemize}
-\item {\color{red}{\bf Not} Scala -> Verilog}
-\item Best of hardware and software design ideas
-\item Embedded within Scala language to leverage mindshare and language design
-\item Multiple targets
-\begin{itemize}
-\item Simulation and synthesis
-\item Memory IP is target-specific
-\end{itemize}
-\end{itemize}
-
-\column{0.40\textwidth}
-
-\begin{center}
-single source \\
-\includegraphics[width=0.99\textwidth]{../talks/retreat-1/figs/graph-and-targets.pdf} \\
-multiple targets \\
-\end{center}
-
-\end{columns}
-\note{single source generates two different verilog outputs, one for fpga and one for asic. surprisingly difficult to generate each. for example, chisel has abstraction for memories.}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{The Scala Programming Language}
-
-\begin{columns}[c]
-
-\column{0.75\textwidth}
-
-\begin{itemize}
-\item Compiled to JVM
-\begin{itemize}
-\item Good performance
-\item Great Java interoperability
-\item Mature debugging, execution environments
-\end{itemize}
-\item Object Oriented
-\begin{itemize}
-\item Factory Objects, Classes
-\item Traits, overloading etc
-\item Strongly typed with type inference
-\end{itemize}
-\item Functional
-\begin{itemize}
-\item Higher order functions
-\item Anonymous functions
-\item Currying etc
-\end{itemize}
-\item Extensible
-\begin{itemize}
-\item Domain Specific Languages (DSLs)
-\end{itemize}
-\item Fairly Popular
-\begin{itemize}
-\item Twitter
-\item many Universities
-\end{itemize}
-\end{itemize}
-
-\column{0.25\textwidth}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{figs/programming-scala.pdf} \\
-\includegraphics[height=0.4\textheight]{figs/programming-in-scala.pdf}
-\end{center}
-
-\end{columns}
-\note{compiles to jvm, includes powerful features to support abstraction, as makes it easy to embed DSLs}
-\end{frame}
-
-\include{scala-intro}
-
-\begin{frame}[fragile]
-\frametitle{Algebraic Graph Construction}
-
-\begin{columns}
-\column{0.35\textwidth}
-{\lstset{basicstyle={\Large\ttfamily}}
-\begin{scala}
-Mux(x > y, x, y)
-\end{scala}
-}
-
-\column{0.6\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/max2.pdf}
-\end{center}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Creating Module}
-
-\begin{columns}
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class Max2 extends Module {
- val io = new Bundle {
- val x = UInt(INPUT, 8)
- val y = UInt(INPUT, 8)
- val z = UInt(OUTPUT, 8) }
- io.z := Mux(io.x > io.y, io.x, io.y)
-}
-\end{scala}
-}
-
-\column{0.45\textwidth}
-\begin{center}
-\includegraphics[width=0.95\textwidth]{figs/Max2c.pdf} \\
-\end{center}
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Connecting Modules}
-
-\begin{columns}
-\column{0.3\textwidth}
-\begin{scala}
-val m1 =
- Module(new Max2())
-m1.io.x := a
-m1.io.y := b
-val m2 =
- Module(new Max2())
-m2.io.x := c
-m2.io.y := d
-val m3 =
- Module(new Max2())
-m3.io.x := m1.io.z
-m3.io.y := m2.io.z
-\end{scala}
-
-\column{0.6\textwidth}
-
-\begin{center}
-\includegraphics[width=0.99\textwidth]{figs/Max4.pdf} \\
-\end{center}
-\end{columns}
-
-\end{frame}
-
-
-\begin{frame}[fragile]
-\frametitle{Defining Construction Functions}
-
-\begin{columns}
-
-\column{0.45\textwidth}
-
-\begin{scala}
-def Max2(x, y) = Mux(x > y, x, y)
-\end{scala}
-\begin{scala}
-Max2(x, y)
-\end{scala}
-
-\column{0.5\textwidth}
-
-\begin{center}
-\includegraphics[width=0.95\textwidth]{figs/Max2.pdf} \\[1cm]
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Functional Construction}
-
-\begin{columns}
-
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class MaxN(n: Int, w: Int) extends Module {
- val io = new Bundle {
- val in = Vec.fill(n){ UInt(INPUT, w) }
- val out = UInt(OUTPUT, w)
- }
- io.out := io.in.reduceLeft(Max2)
-}
-\end{scala}
-}
-
-\column{0.4\textwidth}
-
-\begin{center}
-\includegraphics[width=0.99\textwidth]{figs/reduceMax.pdf} \\
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Example}
-\begin{columns}
-
-\column{0.45\textwidth}
-
-\begin{footnotesize}
-\begin{scala}
-class GCD extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 16)
- val b = UInt(INPUT, 16)
- val z = UInt(OUTPUT, 16)
- val valid = Bool(OUTPUT) }
- val x = Reg(init = io.a)
- val y = Reg(init = io.b)
- when (x > y) {
- x := x - y
- } .otherwise {
- y := y - x
- }
- io.z := x
- io.valid := y === UInt(0)
-}
-\end{scala}
-\end{footnotesize}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/gcd.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Running the Chisel Simulation}
-
-\begin{bash}
-cd ~/chisel-tutorial/examples
-make GCD.out
-\end{bash}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{bash}
-...
-PASSED
-[success] Total time: 2 s, completed Feb 28, 2013 8:14:37 PM
-\end{bash}
-}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Generating Verilog}
-
-\begin{bash}
-cd ~/chisel-tutorial/examples
-make GCD.v
-\end{bash}
-
-The Verilog source is roughly divided into three parts:
-
-\begin{enumerate}
-\item Module declaration with input and outputs
-\item Temporary wire and register declaration used for holding intermediate values
-\item Register assignments in \verb+always @ (posedge clk)+
-\end{enumerate}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{FullAdder -- Type Inference}
-
-\begin{columns}
-\column{0.4\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class FullAdder extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 1)
- val b = UInt(INPUT, 1)
- val cin = UInt(INPUT, 1)
- val sum = UInt(OUTPUT, 1)
- val cout = UInt(OUTPUT, 1)
- }
- // Generate the sum
- val a_xor_b = io.a ^ io.b
- io.sum := a_xor_b ^ io.cin
- // Generate the carry
- val a_and_b = io.a & io.b
- val b_and_cin = io.b & io.cin
- val a_and_cin = io.a & io.cin
- io.cout :=
- a_and_b | b_and_cin | a_and_cin
-}
-\end{scala}
-}
-
-\column{0.55\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../getting-started/figs/Full_Adder.jpg}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{FullAdder Verilog -- Width Inference 1}
-
-\begin{columns}
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class FullAdder extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 1)
- val b = UInt(INPUT, 1)
- val cin = UInt(INPUT, 1)
- val sum = UInt(OUTPUT, 1)
- val cout = UInt(OUTPUT, 1)
- }
- // Generate the sum
- val a_xor_b = io.a ^ io.b
- io.sum := a_xor_b ^ io.cin
- // Generate the carry
- val a_and_b = io.a & io.b
- val b_and_cin = io.b & io.cin
- val a_and_cin = io.a & io.cin
- io.cout :=
- a_and_b | b_and_cin | a_and_cin
-}
-\end{scala}
-}
-
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-module FullAdder(
- input io_a,
- input io_b,
- input io_cin,
- output io_sum,
- output io_cout);
- wire T0;
- wire a_and_cin;
- wire T1;
- wire b_and_cin;
- wire a_and_b;
- wire T2;
- wire a_xor_b;
-
- assign io_cout = T0;
- assign T0 = T1 | a_and_cin;
- assign a_and_cin = io_a & io_cin;
- assign T1 = a_and_b | b_and_cin;
- assign b_and_cin = io_b & io_cin;
- assign a_and_b = io_a & io_b;
- assign io_sum = T2;
- assign T2 = a_xor_b ^ io_cin;
- assign a_xor_b = io_a ^ io_b;
-endmodule
-\end{scala}
-}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{FullAdder2 Verilog -- Width Inference 2}
-
-\begin{columns}
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class FullAdder2 extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 2)
- val b = UInt(INPUT, 2)
- val cin = UInt(INPUT, 2)
- val sum = UInt(OUTPUT, 2)
- val cout = UInt(OUTPUT, 2)
- }
- // Generate the sum
- val a_xor_b = io.a ^ io.b
- io.sum := a_xor_b ^ io.cin
- // Generate the carry
- val a_and_b = io.a & io.b
- val b_and_cin = io.b & io.cin
- val a_and_cin = io.a & io.cin
- io.cout :=
- a_and_b | b_and_cin | a_and_cin
-}
-\end{scala}
-}
-
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-module FullAdder(
- input [1:0] io_a,
- input [1:0] io_b,
- input [1:0] io_cin,
- output[1:0] io_sum,
- output[1:0] io_cout);
- wire[1:0] T0;
- wire[1:0] a_and_cin;
- wire[1:0] T1;
- wire[1:0] b_and_cin;
- wire[1:0] a_and_b;
- wire[1:0] T2;
- wire[1:0] a_xor_b;
-
- assign io_cout = T0;
- assign T0 = T1 | a_and_cin;
- assign a_and_cin = io_a & io_cin;
- assign T1 = a_and_b | b_and_cin;
- assign b_and_cin = io_b & io_cin;
- assign a_and_b = io_a & io_b;
- assign io_sum = T2;
- assign T2 = a_xor_b ^ io_cin;
- assign a_xor_b = io_a ^ io_b;
-endmodule
-\end{scala}
-}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Using Registers}
-\begin{scala}
-// clock the new reg value on every cycle
-val y = io.x
-val z = Reg(next = y)
-\end{scala}
-
-\begin{scala}
-// clock the new reg value when the condition a > b
-val x = Reg(UInt())
-when (a > b) { x := y }
-.elsewhen (b > a) { x := z }
-.otherwise { x := w }
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Unconditional Register Update}
-
-\begin{columns}
-
-\column{0.42\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class ShiftRegister extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val out = UInt(OUTPUT, 1)
- }
- val r0 = Reg(next = io.in)
- val r1 = Reg(next = r0)
- val r2 = Reg(next = r1)
- val r3 = Reg(next = r2)
- io.out := r3
-}
-\end{scala}
-}
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/shift-register.pdf}
-\end{center}
-
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-module ShiftRegister(input clk, input reset,
- input io_in,
- output io_out);
-
- reg[0:0] r3;
- reg[0:0] r2;
- reg[0:0] r1;
- reg[0:0] r0;
-
- assign io_out = r3;
- always @(posedge clk) begin
- r3 <= r2;
- r2 <= r1;
- r1 <= r0;
- r0 <= io_in;
- end
-endmodule
-\end{scala}
-}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Register Update}
-
-\begin{columns}
-
-\column{0.47\textwidth}
-
-\begin{scala}
-class ShiftRegister extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val shift = Bool(INPUT)
- val out = UInt(OUTPUT, 1)
- }
-
- val r0 = Reg(UInt())
- val r1 = Reg(UInt())
- val r2 = Reg(UInt())
- val r3 = Reg(UInt())
-
- when (io.shift) {
- r0 := io.in
- r1 := r0
- r2 := r1
- r3 := r2
- }
- io.out := r3
-}
-\end{scala}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/enable-shift-register.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Register Update with Reset}
-
-\begin{scala}
-class EnableShiftRegister extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val shift = Bool(INPUT)
- val out = UInt(OUTPUT, 1)
- }
- // Register reset to zero
- val r0 = Reg(init = UInt(0, 1))
- val r1 = Reg(init = UInt(0, 1))
- val r2 = Reg(init = UInt(0, 1))
- val r3 = Reg(init = UInt(0, 1))
- when (io.shift) {
- r0 := io.in
- r1 := r0
- r2 := r1
- r3 := r2
- }
- io.out := r3
-}
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{UInt Literals}
-inferred width
-\begin{scala}
-UInt(1) // decimal 1-bit literal from Scala Int.
-UInt("ha") // hexadecimal 4-bit literal from string.
-UInt("o12") // octal 4-bit literal from string.
-UInt("b1010") // binary 4-bit literal from string.
-\end{scala}
-specified widths
-\begin{scala}
-UInt("h_dead_beef") // 32-bit literal of type UInt.
-UInt(1) // decimal 1-bit literal from Scala Int.
-UInt("ha", 8) // hexadecimal 8-bit literal of type UInt.
-UInt("o12", 6) // octal 6-bit literal of type UInt.
-UInt("b1010", 12) // binary 12-bit literal of type UInt.
-UInt(5, 8) // unsigned decimal 8-bit literal of type UInt.
-\end{scala}
-\end{frame}
-
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Sequential Circuit Problem -- \tt Accumulator.scala}
-\begin{itemize}
-\item write sequential circuit that sums \code{in} values
-\item in {\tt chisel-tutorial/problems/Accumulator.scala}
-\item run {\tt make Accumulator.out} until passing
-\end{itemize}
-\begin{scala}
-class Accumulator extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val out = UInt(OUTPUT, 8)
- }
-
- // flush this out ...
-
- io.out := UInt(0)
-}
-\end{scala}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{UInt Operations and Conditional Assignment}
-
-\begin{columns}
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-class BasicALU extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 4)
- val b = UInt(INPUT, 4)
- val opcode = UInt(INPUT, 4)
- val output = UInt(OUTPUT, 4)
- }
- io.output := UInt(0)
- when (io.opcode === UInt(0)) {
- io.output := io.a // pass A
- } .elsewhen (io.opcode === UInt(1)) {
- io.output := io.b // pass B
- } .elsewhen (io.opcode === UInt(2)) {
- io.output := io.a + UInt(1) // inc A by 1
- } .elsewhen (io.opcode === UInt(3)) {
- io.output := io.a - UInt(1) // inc B by 1
- } .elsewhen (io.opcode === UInt(4)) {
- io.output := io.a + UInt(4) // inc A by 4
- } .elsewhen (io.opcode === UInt(5)) {
- io.output := io.a - UInt(4) // dec A by 4
- } .elsewhen (io.opcode === UInt(6)) {
- io.output := io.a + io.b // add A and B
- } .elsewhen (io.opcode === UInt(7)) {
- io.output := io.a - io.b // sub B from A
- } .elsewhen (io.opcode === UInt(8)) {
- io.output := (io.a < io.b) // set on A < B
- } .otherwise {
- io.output := (io.a === io.b) // set on A == B
- }
-}
-\end{scala}
-}
-
-\column{0.4\textwidth}
-\begin{itemize}
-\item wire \code{io.output} defaulted to 0 and then
-\item conditionally reassigned to based on opcode
-\item unlike registers, wires are required to be defaulted
-\item wires also allow forward declarations
-\end{itemize}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{UInt Operations}
-
-\begin{center}
-\begin{tabular}{| c | c | c | }
-\hline
-Symbol & Operation & Output Type \\ \hline
-\verb!+! & Add & UInt \\ \hline
-\verb+-+ & Subtract & UInt \\ \hline
-\verb+*+ & Multiply & UInt \\ \hline
-\verb+/+ & UInt Divide & UInt \\ \hline
-\verb+%+ & Modulo & UInt \\ \hline
-\verb+~+ & Bitwise Negation & UInt \\ \hline
-\verb+^+ & Bitwise XOR & UInt\\ \hline
-\verb+&+ & Bitwise AND & UInt \\ \hline
-\verb+|+ & Bitwise OR & Bool \\ \hline
-\verb+===+ & Equal & Bool \\ \hline
-\verb+!=+ & Not Equal & Bool \\ \hline
-\verb+>+ & Greater & Bool \\ \hline
-\verb+<+ & Less & Bool \\ \hline
-\verb+>=+ & Greater or Equal & Bool \\ \hline
-\verb+<=+ & Less or Equal & Bool \\ \hline
-\end{tabular}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Bit Extraction}
-\begin{scala}
-// extracts the x through y bits of value
-val x_to_y = value(x, y)
-\end{scala}
-
-\begin{scala}
-// extract the x-th bit from value
-val x_of_value = value(x)
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{ByteSelector}
-
-\begin{scala}
-class ByteSelector extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 32)
- val offset = UInt(INPUT, 2)
- val out = UInt(OUTPUT, 8)
- }
- io.out := UInt(0, width = 8)
- when (io.offset === UInt(0)) {
- io.out := io.in(7,0) // pull out lowest byte
- } .elsewhen (io.offset === UInt(1)) {
- io.out := io.in(15,8) // pull out second byte
- } .elsewhen (io.offset === UInt(2)) {
- io.out := io.in(23,16) // pull out third byte
- } .otherwise {
- io.out := io.in(31,24) // pull out highest byte
- }
-}
-\end{scala}
-
-\end{frame}
-
-% \setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-% \begin{frame}[fragile]{Instruction Decoder}
-%
-% {\lstset{basicstyle={\scriptsize\ttfamily}}
-% \begin{scala}
-% class LoadShiftRegister extends Module {
-% val io = new Bundle {
-% val inst = UInt(INPUT, 32)
-% val rs0 = UInt(OUTPUT, 8)
-% val rs1 = UInt(OUTPUT, 8)
-% val rs2 = UInt(OUTPUT, 8)
-% val isAdd = Bool(OUTPUT)
-% val isSub = Bool(OUTPUT)
-% val isMul = Bool(OUTPUT)
-% val isDiv = Bool(OUTPUT)
-% }
-% io.isAdd := ...
-% io.isSub := ...
-% io.isMul := ...
-% io.isDiv := ...
-% io.rs0 := ...
-% io.rs1 := ...
-% io.rs2 := ...
-% }
-% \end{scala}
-% }
-%
-% \end{frame}
-% \setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{Bit Concatenation and Filling}
-You concatenating bits using \verb+Cat+:
-\begin{scala}
-val A = UInt(width = 32)
-val B = UInt(width = 32)
-val bus = Cat(A, B) // concatenate A and B
-\end{scala}
-
-and replicate bits using \verb+Fill+:
-\begin{scala}
-// Replicate a bit string multiple times.
-val usDebt = Fill(3, UInt("hA"))
-\end{scala}
-
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{LFSR16 -- \tt problems/lfsr16.scala}
-
-\begin{scala}
-class LFSR16 extends Module {
- val io = new Bundle {
- val inc = Bool(INPUT)
- val out = UInt(OUTPUT, 16)
- }
- // ...
- io.out := UInt(0)
-}
-\end{scala}
-\begin{itemize}
-\item \verb+reg+, \verb+cat+, \verb+extract+, \verb+^+
-\item init reg to 1
-\item updates when \verb+inc+ asserted
-\end{itemize}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/LFSR16.pdf}
-\end{center}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{UInt Bit Inference}
-\begin{columns}
-\column{0.4\textwidth}
-\begin{scala}
-class HiLoMultiplier()
- extends Module {
- val io = new Bundle {
- val A = UInt(INPUT, 16)
- val B = UInt(INPUT, 16)
- val Hi = UInt(OUTPUT, 16)
- val Lo = UInt(OUTPUT, 16)
- }
- val mult = io.A * io.B
- io.Lo := mult(15, 0)
- io.Hi := mult(31, 16)
-}
-\end{scala}
-
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-module HiLoMultiplier(
- input [15:0] io_A,
- input [15:0] io_B,
- output[15:0] io_Hi,
- output[15:0] io_Lo);
-
- wire[15:0] T0;
- wire[31:0] mult; // inferred as 32 bits
- wire[15:0] T1;
-
- assign io_Lo = T0;
- assign T0 = mult[4'hf/*15*/:1'h0/*0*/];
- assign mult = io_A * io_B;
- assign io_Hi = T1;
- assign T1 = mult[5'h1f/*31*/:5'h10/*16*/];
-endmodule
-\end{scala}
-}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Bit Inference Rules}
-
-\begin{center}
-\begin{tabular}{| l | l | l | }
-\hline
-Operation & Result Bit Width \\ \hline
-\verb!Z = X + Y! & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = X - Y+ & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = X & Y+ & min(Width(X), Width(Y)) \\ \hline
-\verb+Z = X | Y+ & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = X ^ Y+ & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = ~X+ & Width(X) \\ \hline
-\verb+Z = Mux(C, X, Y)+ & max(Width(X), Width (Y)) \\ \hline
-\verb+Z = X * Y+ & Width(X) + Width(Y) \\ \hline
-\verb+Z = X << n+ & Width(X) + n \\ \hline
-\verb+Z = X >> n+ & Width(X) - n \\ \hline
-\verb+Z = Cat(X, Y)+ & Width(X) + Width(Y) \\ \hline
-\verb+Z = Fill(n, x)+ & Width(X) + n \\ \hline
-\end{tabular}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Bool Type}
-The Chisel Bool is used to represent the result of logical expressions:
-\begin{scala}
-val change = io.a === io.b // change gets Bool type
-when (change) { // execute if change is true
- ...
-}
-\end{scala}
-
-You can instantiate a Bool value like this:
-\begin{scala}
-val true_value = Bool(true)
-val false_value = Bool(false)
-\end{scala}
-
-You can cast an UInt to a Bool as follows:
-\begin{scala}
-val bit = UInt(width = 1) ...
-when (bit.toBool) { ... }
-\end{scala}
-
-You can use a Bool as an UInt:
-\begin{scala}
-val bit = UInt(width = 1) ...
-bit := a > b
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Bits Subtype Hierarchy}
-\begin{itemize}
-\item \verb+SInt+ is a signed integer type
-\end{itemize}
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/bits-hierarchy.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]{Bundles}
-
-\begin{columns}
-\column{0.55\textwidth}
-\begin{scala}
-class MyFloat extends Bundle {
- val sign = Bool()
- val exponent = UInt(width = 8)
- val significand = UInt(width = 23)
-}
-
-val x = new MyFloat()
-val xs = x.sign
-\end{scala}
-
-\column{0.35\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{../cs250/figs/myfloat.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Ports}
-
-\begin{columns}
-\column{0.55\textwidth}
-
-\textbf{Data object with directions assigned to its members}
-
-\begin{scala}
-class Decoupled extends Bundle {
- val data = UInt(INPUT, 32)
- val valid = Bool(OUTPUT)
- val ready = Bool(INPUT)
-}
-\end{scala}
-
-\textbf{Direction assigned at instantiation time}
-
-\begin{scala}
-class ScaleIO extends Bundle {
- val in = new MyFloat().asInput
- val scale = new MyFloat().asInput
- val out = new MyFloat().asOutput
-}
-\end{scala}
-
-\column{0.35\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{../cs250/figs/fifoio.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Instantiating Modules}
-
-\begin{columns}
-
-\column{0.4\textwidth}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-// A 4-bit adder with carry in and carry out
-class Adder4 extends Module {
- val io = new Bundle {
- val A = UInt(INPUT, 4)
- val B = UInt(INPUT, 4)
- val Cin = UInt(INPUT, 1)
- val Sum = UInt(OUTPUT, 4)
- val Cout = UInt(OUTPUT, 1)
- }
- // Adder for bit 0
- val Adder0 = Module(new FullAdder())
- Adder0.io.a := io.A(0)
- Adder0.io.b := io.B(0)
- Adder0.io.cin := io.Cin
- val s0 = Adder0.io.sum
- // Adder for bit 1
- val Adder1 = Module(new FullAdder())
- Adder1.io.a := io.A(1)
- Adder1.io.b := io.B(1)
- Adder1.io.cin := Adder0.io.cout
- val s1 = Cat(Adder1.io.sum, s0)
- ...
- // Adder for bit 3
- val Adder3 = Module(new FullAdder())
- Adder3.io.a := io.A(3)
- Adder3.io.b := io.B(3)
- Adder3.io.cin := Adder2.io.cout
- io.Sum := Cat(Adder3.io.sum, s2)
- io.Cout := Adder3.io.cout
-}
-\end{scala}
-}
-
-\column{0.5\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../getting-started/figs/4_Bit_Adder.jpg}
-\end{center}
-
-\begin{itemize}
-\item inherits from \verb+Module+ class,
-\item contains an interface stored in a port field named \verb+io+, and
-\item wires together subcircuits in its constructor.
-\end{itemize}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Vecs}
-constructing vecs
-\begin{scala}
-val myVec1 = Vec.fill( ) { }
-val myVec2 = Vec(, , ...)
-\end{scala}
-
-creating a vec of wires
-\begin{scala}
-val ufix5_vec10 = Vec.fill(10) { UInt(width = 5) }
-\end{scala}
-
-
-creating a vec of regs
-\begin{scala}
-val reg_vec32 = Vec.fill(32){ Reg() }
-\end{scala}
-
-writing
-\begin{scala}
-reg_vec32(1) := UInt(0)
-\end{scala}
-
-reading
-\begin{scala}
-val reg5 = reg_vec(5)
-\end{scala}
-
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Vec Shift Reg -- problems/VecShiftRegister.scala}
-
-\begin{itemize}
-\item add loadability to shift register
-\item change interface to use vec's
-\end{itemize}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class VecShiftRegister extends Module {
- val io = new Bundle {
- val ins = Vec.fill(4){ UInt(INPUT, 1) }
- val load = Bool(INPUT)
- val shift = Bool(INPUT)
- val out = UInt(OUTPUT, 1)
- }
- val delays = Vec.fill(4){ Reg(UInt()) }
- when ( ...) {
- // fill in here ...
- } .elsewhen (io.shift) {
- ...
- }
- io.out := delays(3)
-}
-\end{scala}
-}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-% \begin{frame}[fragile]{Scala Console}
-% \begin{FramedVerb}
-% \end{FramedVerb}
-% \end{frame}
-
-\begin{frame}[fragile]{Defining a Tester}
-
-\begin{columns}
-\column{0.45\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-package Tutorial
-import Chisel._
-import scala.collection.mutable.HashMap
-import scala.util.Random
-
-class ByteSelector extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 32)
- val offset = UInt(INPUT, 2)
- val out = UInt(OUTPUT, 8)
- }
- io.out := UInt(0, width=8)
- ...
-}
-
-class ByteSelectorTests(c: ByteSelector)
- extends Tester(c, Array(c.io)) {
- defTests {
- var allGood = true
- val vars = new HashMap[Node, Node]()
- val test_in = 12345678
- for (t <- 0 until 4) {
- vars(c.io.in) = UInt(test_in)
- vars(c.io.offset) = UInt(t)
- val ref_out =
- UInt((test_in >> (t * 8)) & 0xFF)
- vars(c.io.out) = ref_out
- allGood = step(vars) && allGood
- }
- allGood
- }
-}
-\end{scala}
-}
-\column{0.45\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-class Tester[T <: Module]
- (val c: T, val testNodes: Array[Node])
-
-def defTests(body: => Boolean)
-
-def step(vars: HashMap[Node, Node]): Boolean
-\end{scala}
-}
-\begin{tiny}
-\begin{itemize}
-\item user subclasses \code{Tester} defining DUT and
-\code{testNodes} and tests in \code{defTests} body
-\item \code{vars} is mapping from \code{testNodes} to literals, called bindings
-\item \code{step} runs test with given bindings, where
-var values for input ports are sent to DUT,
-DUT computes next outputs, and
-DUT sends next outputs to Chisel
-\item finally \code{step} compares received values against var values
- for and returns false if any comparisons fail
- output ports
-\end{itemize}
-\end{tiny}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../tutorial/figs/DUT.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Simulation Debug Output}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-> cd chisel-tutorial/examples
-> make ByteSelector.out
-STARTING ../emulator/problems/ByteSelector
----
-INPUTS
- INPUT(ByteSelector__io_in.ByteSelector) = 12345678
- INPUT(ByteSelector__io_offset.ByteSelector) = 0
-OUTPUTS
- READ OUTPUT(ByteSelector__io_out.ByteSelector) = 78
- EXPECTED: OUTPUT(ByteSelector__io_out.ByteSelector) = 78
- SUCCESS
----
-INPUTS
- INPUT(ByteSelector__io_in.ByteSelector) = 12345678
- INPUT(ByteSelector__io_offset.ByteSelector) = 1
-OUTPUTS
- READ OUTPUT(ByteSelector__io_out.ByteSelector) = 97
- EXPECTED: OUTPUT(ByteSelector__io_out.ByteSelector) = 97
- SUCCESS
----
-...
----
-INPUTS
- INPUT(ByteSelector__io_in.ByteSelector) = 12345678
- INPUT(ByteSelector__io_offset.ByteSelector) = 3
-OUTPUTS
- READ OUTPUT(ByteSelector__io_out.ByteSelector) = 0
- EXPECTED: OUTPUT(ByteSelector__io_out.ByteSelector) = 0
- SUCCESS
-PASSED // Final pass assertion
-[success] Total time: 26 s, ...
-\end{scala}
-}
-
-\end{frame}
-
-\begin{frame}{Testbench Ingredients}
-
-\begin{itemize}
-\item Define hash map for I/O and any initializations
-\item Set inputs to device under test in hash map
-\item Determine expected output for simulation advance for hash map
-\item Advance simulation and track success/failure (ex. allGood)
-\item Repeat until all appropriate test cases verified
-\item Assert if test passed or failed (allGood)
-\end{itemize}
-
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Testbench for MaxN -- \tt MaxN.scala}
-\begin{columns}
-\column{0.48\textwidth}
-
-\begin{itemize}
-\item write a testbench for MaxN
-\end{itemize}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class MaxN(val n: Int, val w: Int)
- extends Module {
-
- def Max2(x: UInt, y: UInt) =
- Mux(x > y, x, y)
-
- val io = new Bundle {
- val ins = Vec.fill(n){ UInt(INPUT, w) }
- val out = UInt(OUTPUT, w)
- }
- io.out := io.ins.reduceLeft(Max2)
-}
-\end{scala}
-}
-\begin{scala}
-// returns random int in 0..lim-1
-val x = rnd.nextInt(lim)
-\end{scala}
-
-\column{0.43\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class MaxNTests(c: MaxN)
- extends Tester(c, Array(c.io)) {
- defTests {
- var allGood = true
- val vars =
- new HashMap[Node, Node]()
- val rnd = new Random()
- for (i <- 0 until 10) {
- vars.clear()
- var mx = 0
- for (i <- 0 until c.n) {
- // FILL THIS IN HERE
- vars(c.io.ins(0)) = UInt(0)
- }
- // FILL THIS IN HERE
- vars(c.io.out) = UInt(1)
- allGood = step(vars) && allGood
- }
- allGood
- }
-}
-\end{scala}
-}
-\end{columns}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{Dynamically Accessed Vec}
-\begin{scala}
-class MemorySearch extends Module {
- val io = new Bundle {
- val target = UInt(INPUT, 4)
- val en = Bool(INPUT)
- val address = UInt(OUTPUT, 3)
- val done = Bool(OUTPUT)
- }
- val index = Reg(init = UInt(0, width = 3))
- val list = Vec(UInt(0), UInt(4), UInt(15), UInt(14),
- UInt(2), UInt(5), UInt(13)){ UInt(width = 4) }
- val memVal = list(index)
- val done = !io.en && ((memVal === io.target) || (index === UInt(7)))
- when (io.en) {
- index := UInt(0)
- } .elsewhen (done === Bool(false)) {
- index := index + UInt(1)
- }
- io.done := done
- io.address := index
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{RAM}
-RAM is supported using the \code{Mem} construct
-
-\begin{scala}
-val m = Mem(Bits(width = 32), 32)
-\end{scala}
-
-\noindent
-where
-\begin{itemize}
-\item writes to Mems are positive-edge-triggered
-\item reads are either combinational or positive-edge-triggered
-\item ports are created by applying a \code{UInt} index
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{32-entry Register File}
-
-\begin{scala}
-val regs = Mem(Bits(width = 32), 32)
-when (wrEn) {
- regs(wrAddr) := wrData
-}
-val iDat = regs(iAddr)
-val mDat = regs(mAddr)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.55\textheight]{../cs250/figs/mem.pdf}
-\end{center}
-
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Load/Search Mem -- \tt DynamicMemorySearch.scala}
-\begin{scala}
-class DynamicMemorySearch extends Module {
- val io = new Bundle {
- val isWr = Bool(INPUT)
- val wrAddr = UInt(INPUT, 3)
- val data = UInt(INPUT, 4)
- val en = Bool(INPUT)
- val target = UInt(OUTPUT, 3)
- val done = Bool(OUTPUT)
- }
- val index = Reg(init = UInt(0, width = 3))
- val memVal = ...
- val done = !io.en && ((memVal === io.target) || (index === UInt(7)))
- // ...
- when (io.en) {
- index := UInt(0)
- } .elsewhen (done === Bool(false)) {
- index := index + UInt(1)
- }
- io.done := done
- io.target := index
-}
-\end{scala}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{Sequential Read Ports}
-Sequential read ports are inferred when:
-\begin{itemize}
-\item optional parameter \code{seqRead} is set and
-\item read address is a reg
-\end{itemize}
-
-\begin{scala}
-al ram1r1w =
- Mem(UInt(width = 32), 1024, seqRead = true)
-val reg_raddr = Reg(UInt())
-when (wen) { ram1r1w(waddr) := wdata }
-when (ren) { reg_raddr := raddr }
-val rdata = ram1r1w(reg_raddr)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../cs250/figs/mem-seq-read.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Stack}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-class Stack(depth: Int) extends Module {
- val io = new Bundle {
- val dataIn = UInt(INPUT, 32)
- val dataOut = UInt(OUTPUT, 32)
- val push = Bool(INPUT)
- val pop = Bool(INPUT)
- val en = Bool(INPUT)
- }
- // declare the memory for the stack
- val stack_mem = Mem(UInt(width = 32), depth, seqRead = false)
- val sp = Reg(init = UInt(0, width = log2Up(depth)))
- val dataOut = Reg(init = UInt(0, width = 32))
- // Push condition - make sure stack isn't full
- when(io.en && io.push && (sp != UInt(depth-1))) {
- stack_mem(sp + UInt(1)) := io.dataIn
- sp := sp + UInt(1)
- }
- // Pop condition - make sure the stack isn't empty
- .elsewhen(io.en && io.pop && (sp > UInt(0))) {
- sp := sp - UInt(1)
- }
- when(io.en) {
- dataOut := stack_mem(sp)
- }
- io.dataOut := dataOut
-}
-\end{scala}
-}
-
-\end{frame}
-
-\begin{frame}[fragile]{Scripting Hardware Generation}
-
-\begin{columns}
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-// A n-bit adder with carry in and carry out
-class Adder(n: Int) extends Module {
- val io = new Bundle {
- val A = UInt(INPUT, n)
- val B = UInt(INPUT, n)
- val Cin = UInt(INPUT, 1)
- val Sum = UInt(OUTPUT, n)
- val Cout = UInt(OUTPUT, 1)
- }
- // create a vector of FullAdders
- val FAs = Vec.fill(n){ Module(new FullAdder()).io }
- val carry = Vec.fill(n+1){ UInt(width = 1) }
- val sum = Vec.fill(n){ Bool() }
-
- // first carry is the top level carry in
- carry(0) := io.Cin
-
- // wire up the ports of the full adders
- for(i <- 0 until n) {
- FAs(i).a := io.A(i)
- FAs(i).b := io.B(i)
- FAs(i).cin := carry(i)
- carry(i+1) := FAs(i).cout
- sum(i) := FAs(i).sum.toBool()
- }
- io.Sum := sum.toBits().toUInt()
- io.Cout := carry(n)
-}
-\end{scala}
-}
-
-\column{0.4\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../getting-started/figs/4_Bit_Adder.jpg}
-\end{center}
-\end{columns}
-
-\end{frame}
-
-\input{../talks/microsoft/libs-to-langs-guts.tex}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Mul Lookup Table Problem -- \tt Mul.scala}
-\begin{itemize}
-\item write 16x16 multiplication table using \code{Vec}
-\end{itemize}
-\begin{scala}
-class Mul extends Module {
- val io = new Bundle {
- val x = UInt(INPUT, 4)
- val y = UInt(INPUT, 4)
- val z = UInt(OUTPUT, 8)
- }
- val muls = new ArrayBuffer[UInt]()
-
- // flush this out ...
-
- io.z := UInt(0)
-}
-\end{scala}
-
-hint:
-\begin{scala}
-val tab = Vec(muls)
-io.z := tab(Cat(io.x, io.y))
-\end{scala}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]
-\frametitle{Valid Wrapper}
-
-\begin{columns}
-
-\column{0.65\textwidth}
-
-\begin{footnotesize}
-\begin{scala}
-class Valid[T <: Data](dtype: T) extends Bundle {
- val data = dtype.clone.asOutput
- val valid = Bool(OUTPUT)
- override def clone = new Valid(dtype)
-}
-
-class GCD extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 16)
- val b = UInt(INPUT, 16)
- val out = new Valid(UInt(OUTPUT, 16))
- } }
- ...
- io.out.data := x
- io.out.valid := y === UInt(0)
-}
-
-\end{scala}
-\end{footnotesize}
-
-\column{0.3\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../talks/retreat-1/figs/valid.pdf}
-\end{center}
-
-\end{columns}
-\note{now gcd had a valid signal on its output. \\[1cm]
-we can generalize this idea by defining a wrapper class that bundles a valid with a data signal. \\[1cm]
-now we can rewrite GCD using an interface using this valid wrapper for its output. }
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Function Filters}
-
-\begin{footnotesize}
-\begin{scala}
-abstract class Filter[T <: Data](dtype: T) extends Module {
- val io = new Bundle {
- val in = Valid(dtype).asInput
- val out = Valid(dtype).asOutput
-} }
-
-class FunctionFilter[T <: Data](dtype: T, f: T => T) extends Filter(dtype) {
- io.out.valid := io.in.valid
- io.out.bits := f(io.in)
-}
-\end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/sketching13/figs/function-filter.pdf}
-\end{center}
-
-\note{suppose we want to write hardware filters. \\[1cm]
-one way to create a reusable filter would be \\[1cm]
-to create a filter class that takes a function as argument that definines its filter operation.}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Clipping Filter}
-
-\begin{footnotesize}
-\begin{scala}
-def clippingFilter[T <: Bits](limit: Int, dtype: T) =
- new FunctionFilter(dtype, x => min(limit, max(-limit, x)))
-\end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/retreat-1/figs/clipping-filter.pdf}
-\end{center}
-\note{using this reusable substrate then it is easy to create an instance of a filter.}
-\end{frame}
-
-
-\begin{frame}[fragile]
-\frametitle{Shifting Filter}
-
-\begin{footnotesize}
-\begin{scala}
-def shiftingFilter[T <: Bits](shift: Int, dtype: T) =
- new FunctionFilter(dtype, x => x >> shift)
-\end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/retreat-1/figs/shifting-filter.pdf}
-\end{center}
-\note{and reuse it for shift filter}
-\end{frame}
-
-\begin{frame}[fragile]{Testing Decoupled Circuits}
-
-\begin{itemize}
-\item using ovars for outputs
-\item need to check outputs directly using \verb+litValue+
-\end{itemize}
-\begin{scala}
-class GCDTests(c: GCD) extends Tester(c, Array(c.io)) {
- defTests {
- val (a, b, z) = (64, 48, 16)
- val svars = new HashMap[Node, Node]()
- val ovars = new HashMap[Node, Node]()
- var t = 0
- do {
- svars(c.io.a) = UInt(a)
- svars(c.io.b) = UInt(b)
- step(svars, ovars)
- t += 1
- } while (t <= 1 || ovars(c.io.v).litValue() == 0)
- ovars(c.io.z).litValue() == z
- }
-}
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Chained Filter}
-
-\begin{footnotesize}
-\begin{scala}
-class ChainedFilter[T <: Num](dtype: T) extends Filter(dtype) = {
- val shift = Module(new ShiftFilter(2, dtype))
- val clipper = Module(new ClippingFilter(1 << 7, dtype))
- io.in <> shift.io.in
- shift.io.out <> clipper.io.in
- clipper.io.out <> io.out
-}
-\end{scala}
-% \begin{scala}
-% class ChainedFilter[T <: Num](dtype: T) extends Filter(dtype) = {
-% val fir = new TstFIR(dtype)
-% val shift = new ShiftFilter(2, dtype)
-% val clipper = new ClippingFilter(1 << 7, dtype)
-% io.in <> fir.io.in
-% fir.io.out <> shift.io.in
-% shift.io.out <> clipper.io.in
-% clipper.io.out <> io.out
-% }
-% \end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/sketching13/figs/chained-filter2.pdf}
-\end{center}
-\note{and chain together...}
-\end{frame}
-
-\begin{frame}[fragile]{Predicate Filter}
-\begin{scala}
-class PredicateFilter[T <: Data](dtype: T, f: T => Bool)
- extends Filter(dtype) {
- io.out.valid := io.in.valid && f(io.in.bits)
- io.out.bits := io.in.bits
-}
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{figs/predicate-filter.pdf}
-\end{center}
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Predicate Filtering -- \tt SingleEvenFilter.scala}
-\begin{itemize}
-\item write filter that lets only even single digit numbers through
-\end{itemize}
-\begin{scala}
-object SingleFilter {
- def apply[T <: UInt](dtype: T) = // FILL IN FUNCTION BELOW
- Module(new PredicateFilter(dtype, (x: T) => Bool(false)))
-}
-
-object EvenFilter {
- def apply[T <: UInt](dtype: T) = // FILL IN FUNCTION BELOW
- Module(new PredicateFilter(dtype, (x: T) => Bool(false)))
-}
-
-class SingleEvenFilter[T <: UInt](dtype: T) extends Filter(dtype) {
- // FILL IN CONSTRUCTION AND WIRING
- io.out := UInt(0)
-}
-\end{scala}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile, shrink]
-\frametitle{Functional Composition}
-
-% \begin{itemize}
-% \item natural
-% \item reusable
-% \item composable
-% \end{itemize}
-% \vskip1cm
-
-\begin{Large}
-\begin{columns}
-
-\column{0.45\textwidth}
-\verb+Map(ins, x => x * y)+ \\
-\begin{center}
-\includegraphics[height=0.6\textheight]{../bootcamp/figs/map.pdf} \\[2cm]
-\end{center}
-
-\column{0.45\textwidth}
-\vskip2mm
-\verb+Chain(n, in, x => f(x))+ \\
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../bootcamp/figs/chain.pdf} \\
-\end{center}
-
-\verb+Reduce(ins, Max)+ \\
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../bootcamp/figs/reduce.pdf} \\
-\end{center}
-
-\end{columns}
-
-\end{Large}
-\note{the previous example showed a simple use of functional programming. \\[1cm]
-Scala provides strong support for functional programming and
-it turns out that functional programming is a powerful way to define hardware. \\[1cm]
-for example, you can create a parallel set of blocks using map and reduce to creation reduction trees and chain to create a pipeline.}
-\end{frame}
-
-\begin{frame}[fragile]{Map / Reduce Generator}
-\begin{footnotesize}
-\begin{scala}
-def delays[T <: Data](x: T, n: Int): List[T] =
- if (n <= 1) List(x) else x :: taps(Reg(next = x), n-1)
-
-def FIR[T <: Num](hs: Seq[T], x: T): T =
- (hs, delays(x, hs.length)).zipped.map( _ * _ ).reduce( _ + _ )
-
-class TstFIR extends Module {
- val io = new Bundle{ val x = SInt(INPUT, 8); val y = SInt(OUTPUT, 8) }
- val h = Array(SInt(1), SInt(2), SInt(4))
- io.y := FIR(h, io.x)
-}
-\end{scala}
-\end{footnotesize}
-\begin{center}
-\includegraphics[height=0.35\textheight]{../cs294-88/lectures/advanced-chisel/figs/inner-product-fir.png}
-\end{center}
-\note{as an advanced example, consider writing an FIR filter which is defined by the equation below. \\[1cm]
-essentially it's a sum of products of coefficients and delayed versions of input.\\[1cm]
-we can write this quite simply using map and reduce as above.}
-\end{frame}
-
-\begin{frame}[fragile]{Chisel Standard Library -- \tt ChiselUtil.scala}
-\begin{center}
-\begin{tabular}{rl}
-{\bf Bits Properities} & \code{log2Up}, \code{log2Down}, \code{isPow2}, \code{PopCount}\\
-{\bf Numeric Utilities} & \code{LFSR16}, \code{Reverse}, \code{FillInterleaved} \\
-{\bf Stateful Functions} & \code{ShiftRegister}, \code{Counter} \\
-{\bf Priority Encoding Functions} & \code{UIntToOH}, \code{OHToUInt}, \code{Mux1H} \\
-{\bf Priority Encoders} & \code{PriorityEncoder}, \code{PriorityEncoderOH} \\
-{\bf Vec Construction} & \code{Vec.fill}, \code{Vec.tabulate} \\
-{\bf Vec Functional} & \code{forall}, \code{exists}, \code{contains}, ... \\
-{\bf Queues and Pipes} & \code{Decoupled}, \code{Queue}, \code{Valid}, \code{Pipe} \\
-{\bf Arbiters} & \code{ArbiterIO}, \code{Arbiter}, \code{RRArbiter} \\
-\end{tabular}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Queues}
-\begin{itemize}
-\item Required parameter \verb+entries+ controls depth
-\item The width is determined from the inputs.
-\end{itemize}
-\begin{scala}
-class QueueIO[T <: Data](type: T, entries: Int) extends Bundle {
- val enq = Decoupled(data.clone).flip
- val deq = Decoupled(data.clone)
- val count = UFix(OUTPUT, log2Up(entries+1))
-}
-
-class Queue[T <: Data]
- (type: T, entries: Int,
- pipe: Boolean = false,
- flow: Boolean = false
- flushable: Boolean = false)
- extends Module
-\end{scala}
-\begin{scala}
-val q = new Queue(UInt(), 16)
-q.io.enq <> producer.io.out
-consumer.io.in <> q.io.deq
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Multiple Clock Domains}
-Clocks are first class and take an optional reset signal:
-\begin{scala}
-class Clock (reset: Bool) extends Node {
- def reset: Bool // returns reset pin
-}
-\end{scala}
-
-There is a builtin implicit clock that state elements use by default:
-\begin{scala}
-var implicitClock = new Clock( implicitReset )
-\end{scala}
-
-Clocks can be defined from other clocks:
-\begin{scala}
-val clock2 = clock1 * 2
-val clock3 = clock1 / 2
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Specifying a Clock Domain}
-The clock for state elements and modules can be specified:
-\begin{scala}
-Reg(... clock: Clock = implicitClock)
-Mem(... clock: Clock = implicitClock)
-Module(... clock: Clock = implicitClock)
-\end{scala}
-
-For example, a register can be created in a different clock domain as follows:
-\begin{scala}
-val reg = Reg(UInt(), clock = clock2)
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Crossing Clock Domains}
-The most general technique to send data between domains is using an asynchronous queue:
-
-\begin{scala}
-class AsyncQueue[T <: Data]
- (dataType: T, depth: Int, enq_clk: Clock, deq_clock: Clock) extends Module
-\end{scala}
-
-Using these queues, we can then move a signalA from clock domains clockA to signalB in clockB:
-
-\begin{scala}
-val queue = new AsyncQueue(Uint(width = 32), 2, clockA, clockB)
-fifo.enq.bits := signalA
-signalB := fifo.deq.bits
-fifo.valid := condA
-fifo.ready := condB
-...
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Multiple Clocks -- \tt MultipleClockDomains.scala}
-\begin{scala}
-class MultiClockDomain extends Module {
- val io = new Bundle {
- val start = Bool(INPUT)
- val sum = Decoupled(UInt(OUTPUT))
- }
- val fastClock = new Clock()
- val slowClock = new Clock()
- ...
-}
-
-class MultiClockDomainTests(c: MultiClockDomain)
- extends Tester(c, Array(c.io)) {
- defTests {
- val clocks = new HashMap[Clock, Int]
- clocks(Module.implicitClock) = 2
- clocks(c.fastClock) = 4
- clocks(c.slowClock) = 6
- setClocks(clocks)
- ...
- }
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Creating Your Own Project}
-directory structure
-\begin{bash}
-Hello/
- build.sbt # scala configuration file
- Hello.scala # your source file
-\end{bash}
-
-\end{frame}
-
-\begin{frame}[fragile]{Writing Your Source File}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-package Hello
-import Chisel._
-import scala.collection.mutable.HashMap
-
-class Hello extends Module {
- val io = new Bundle {
- val out = UInt(OUTPUT, 8) }
- io.out := UInt(33)
-}
-
-class HelloTests(c: Hello) extends Tester(c, Array(c.io)) {
- defTests {
- val vars = new HashMap[Node, Node]()
- vars(c.io.out) = UInt(33)
- step(vars)
- }
-}
-
-object Hello {
- def main(args: Array[String]): Unit = {
- val args = Array("--backend", "c", "--genHarness", "--compile", "--test")
- chiselMainTest(args, () => Module(new Hello())) {
- c => new HelloTests(c) }
-} }
-\end{scala}
-}
-
-\end{frame}
-
-\begin{frame}[fragile]{Setting Up Your SBT Configuration File}
-\begin{scala}
-scalaVersion := "2.10.2"
-
-addSbtPlugin("com.github.scct" % "sbt-scct" % "0.2")
-
-libraryDependencies +=
- "edu.berkeley.cs" %% "chisel" % "latest.release"
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Compiling and Running}
-Producing C++
-\begin{bash}
-sbt run --backend c
-\end{bash}
-
-Producing Verilog
-\begin{bash}
-sbt run --backend v
-\end{bash}
-
-Running the Chisel Tests
-\begin{bash}
-sbt run --backend c --compile --test --genHarness
-\end{bash}
-
-\end{frame}
-
-\begin{frame}[fragile]{chiselMain(Test) Command Line Arguments}
-\begin{scala}
-sbt
-sbt> compile // compiles Chisel Scala code
-sbt> run // compile and run Chisel Scala Code
-sbt> run --backend c // produces C++ files
-sbt> exit
-\end{scala}
-
-with a complete set of command line arguments being:\\[2mm]
-
-\begin{tabular}{lll}
-\verb+--backend v+ & generate verilog \\
-\verb+--backend c+ & generate C++ (default)\\
-\verb+--vcd+ & enable vcd dumping \\
-\verb+--targetDir+ & target pathname prefix \\
-\verb+--genHarness+ & generate harness file for C++ \\
-\verb+--debug+ & put all wires in C++ class file \\
-\verb+--compile+ & compiles generated C++ \\
-\verb+--test+ & runs tests using C++ app \\
-\end{tabular}
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Make Your Own Project}
-set hello project up
-\begin{bash}
-cd ~
-mkdir hello
-cp ~/chisel-tutorial/hello/* hello
-cd hello
-sbt run
-\end{bash}
-make a change
-\begin{itemize}
-\item make output a function of an new input
-\end{itemize}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}{Chisel Workflow}
-\begin{center}
-\includegraphics[height=0.9\textheight]{../bootcamp/figs/chisel-workflow.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]{printf / sprintf}
-\begin{itemize}
-\item during simulation
-\begin{itemize}
-\item \verb+printf+ prings the formatted string to the console on rising clock edges
-\item \verb+sprintf+ returns the formatted string as a bit vector
-\end{itemize}
-\item format specifiers are
-\begin{itemize}
-\item \verb+%b+ -- binary number
-\item \verb+%d+ -- decimal number
-\item \verb+%x+ -- hexidecimal number
-\item \verb+%s+ -- string consisting of a sequence of 8-bit extended ASCII chars
-\item \verb+%%+ -- specifies a literal %.
-\end{itemize}
-\end{itemize}
-the following prints the line \verb+"0x4142 16706 AB"+ on cycles when \verb+c+ is true:
-\begin{scala}
-val x = Bits(0x4142)
-val s1 = sprintf("%x %s", x, x);
-when (c) { printf("%d %s\n", x, s1); }
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{assert}
-\begin{itemize}
-\item simulation time assertions are provided by \verb+assert+ construct
-\item if assert arguments false on rising edge then
-\begin{itemize}
-\item an error is printed and
-\item simulation terminates
-\end{itemize}
-\end{itemize}
-the following will terminate after 10 clock cycles:
-\begin{scala}
-val x = Reg(init = UInt(0, 4))
-x := x + UInt(1)
-assert(x < UInt(10))
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Installation}
-\begin{itemize}
-\item on mac install:
-\begin{itemize}
-\item XCODE console tools
-\end{itemize}
-\item on windows install:
-\begin{itemize}
-\item cygwin
-\end{itemize}
-\item everywhere install:
-\begin{itemize}
-\item git
-\item g++ version 4.0 or later
-\item java
-\end{itemize}
-\item everywhere
-\begin{itemize}
-\item git clone https://github.com/ucb-bar/chisel-tutorial.git
-\end{itemize}
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]{Chisel Resources}
-\begin{center}
-\url{https://chisel.eecs.berkeley.edu/documentation.html} \\[0.25cm]
-\begin{tabular}{rl}
-\textbf{manual} & \code{manual.pdf} \\
-\textbf{bootcamp2012} & \code{bootcamp-20121026.pdf} \\
-\textbf{bootcamp2013} & \code{bootcamp-20130930.pdf} \\
-\textbf{tutorial} & \code{tutorial.pdf} \\
-\textbf{getting started} & \code{getting-started.pdf} \\
-\textbf{cs250 lectures} & \code{cs250-1.pdf}, \code{cs250-2.pdf}, \code{cs250-3.pdf} \\[0.5cm]
-\end{tabular}
-\url{https://github.com/ucb-bar/chisel/} \\[0.25cm]
-\begin{tabular}{rl}
-\textbf{setup} & \code{readme.md} \\
-\textbf{utils} & \code{src/main/scala/ChiselUtils.scala} \\[0.5cm]
-\end{tabular}
-\url{https://chisel.eecs.berkeley.edu/download.html} \\[0.25cm]
-\begin{tabular}{rl}
-\textbf{sodor} & \url{https://github.com/ucb-bar/sodor/} \\
-\textbf{virtualbox} & \url{https://chisel.eecs.berkeley.edu/chisel-riscv.box} \\
-\end{tabular}
-\end{center}
-\end{frame}
-
-\begin{frame}{Scala Resources}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../bootcamp/figs/programming-scala.pdf} \\
-\includegraphics[height=0.4\textheight]{../bootcamp/figs/programming-in-scala.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Projects Ideas}
-
-\begin{center}
-\begin{tabular}{rl}
-\textbf{audio processing} & \code{Echo.scala} \\
-\textbf{image processing} & \code{Darken.scala} \\
-\textbf{risc processor} & \code{Risc.scala} \\
-\textbf{game of life} & \code{Life.scala} \\
-\textbf{router} & \code{Router.scala} \\
-\textbf{map/reduce} & \code{FIR.scala}\\
-\textbf{network} & \\
-\textbf{decoupled filter} & \\
-\textbf{cryptography} & \\
-\textbf{serial multiplier} & \\
-\textbf{pong} & \\
-\end{tabular}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Keep in Touch}
-\begin{center}
-\begin{tabular}{rl}
-\textbf{website} & \url{chisel.eecs.berkeley.edu} \\
-\textbf{mailing list} & \url{groups.google.com/group/chisel-users} \\
-\textbf{github} & \url{https://github.com/ucb-bar/chisel/} \\
-\textbf{features + bugs} & \url{https://github.com/ucb-bar/chisel/issues} \\
-\textbf{more questions} & \url{stackoverflow.com/quesions/tagged/chisel} \\
-\textbf{twitter} & {\tt \#chiselhdl} \\
-\textbf{me} & \url{jrb@eecs.berkeley.edu} \\
-\end{tabular}
-\end{center}
-\end{frame}
-
-\begin{frame}{Thanks}
-\begin{itemize}
-\item \textbf{Arrangements} -- Roxana and Kostas
-\item \textbf{EC2 configuration} -- Sebastien Mirolo
-\item \textbf{Bootcamp Materials} -- Vincent Lee, Stephen Twigg, Huy Vo
-\item \textbf{Funding} -- Department of Energy, Department of Defense
-\end{itemize}
-\end{frame}
-
-\end{document}
diff --git a/doc/bootcamp/bootcamp-20140206.tex b/doc/bootcamp/bootcamp-20140206.tex
deleted file mode 100644
index 0f44891c..00000000
--- a/doc/bootcamp/bootcamp-20140206.tex
+++ /dev/null
@@ -1,2339 +0,0 @@
-\documentclass[xcolor=pdflatex,dvipsnames,table]{beamer}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{relsize}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-\input{../style/talk.tex}
-
-\title{Chisel Bootcamp 4}
-\author{Jonathan Bachrach}
-\date{\today}
-\institute[UC Berkeley]{EECS UC Berkeley}
-
-\begin{document}
-
-\begin{frame}
-\titlepage
-\end{frame}
-\addtocounter{framenumber}{-1}
-
-% \begin{frame}[fragile]{tutorial.scala}
-% \begin{scala}
-% package Tutorial {
-%
-% import Chisel._
-%
-% object Tutorial {
-% def main(args: Array[String]): Unit = {
-% val tut_args = args.slice(1, args.length) ++
-% Array("--targetDir", "../emulator", "--genHarness")
-% args(0) match {
-% case "gcd" =>
-% chiselMain(tut_args, () => new GCD())
-% ...
-% }
-% }
-% }
-%
-% }
-% \end{scala}
-% \end{frame}
-
-\begin{frame}[fragile]{Goals for Bootcamp}
-
-\begin{itemize}
-\item get you started with Chisel
-\item get a basic working knowledge of Chisel
-\item learn how to think in Chisel
-\item know where to get more information
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]{CS291C Specific Notes for Bootcamp}
-
-\begin{itemize}
-\item teaching digital circuit design in chisel
-\item will later teach
-\begin{itemize}
-\item floating point
-\item fixed point
-\item complex numbers
-\item integration with matlab
-\end{itemize}
-\item new chisel release with DSP support coming soon
-\end{itemize}
-
-\end{frame}
-
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Logging into EC2}
-
-\begin{scala}
-ssh ubuntu@xxx
-password: bootcamp
-\end{scala}
-\noindent
-where \code{xxx} corresponds to your EC2 instance written on your airbears slip
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Using Screen}
-to prevent lossage of state if disconnected ... when you first log in, type
-\begin{scala}
-screen
-\end{scala}
-
-when you log back into the instance, type
-\begin{scala}
-screen -r
-\end{scala}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Getting the Latest}
-
-if you don't have chisel-tutorial already
-\begin{scala}
-git clone https://github.com/ucb-bar/chisel-tutorial.git
-cd chisel-tutorial
-\end{scala}
-
-else, get the latest
-\begin{scala}
-cd chisel-tutorial
-git pull
-\end{scala}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{chisel-tutorial repo}
-\begin{FramedSemiVerb}
-chisel-tutorial/
- Makefile
- examples/ \comment{\# Contains chisel examples}
- Makefile
- build.sbt \comment{\# Contains project description}
- FullAdder.scala ...
- problems/ \comment{\# Contains skeletal files for tutorial problems}
- Makefile
- build.sbt \comment{\# Contains project description}
- Accumulator.scala ...
- solutions/ \comment{\# Contains solutions to problems}
- Makefile
- build.sbt \comment{\# Contains project description}
- Counter.scala ...
-\end{FramedSemiVerb}
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Get This}
-
-\begin{center}
-\fbox{
-\url{chisel.eecs.berkeley.edu/2.0.6/chisel-bootcamp-20140206.pdf}
-}
-\end{center}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]
-\frametitle{Chisel}
-
-\begin{columns}[c]
-
-\column{0.55\textwidth}
-
-\begin{itemize}
-\item A hardware construction language
-\begin{itemize}
-\item ``synthesizable by construction''
-\item creates graph representing hardware
-\end{itemize}
-\item Embedded within Scala language to leverage mindshare and language design
-\item Best of hardware and software design ideas
-\item Multiple targets
-\begin{itemize}
-\item Simulation and synthesis
-\item Memory IP is target-specific \\[0.5cm]
-\end{itemize}
-\item {\color{red}{\bf Not} Scala app -> Verilog arch}
-\end{itemize}
-
-\column{0.40\textwidth}
-
-\begin{center}
-single source \\
-\includegraphics[width=0.99\textwidth]{../talks/retreat-1/figs/graph-and-targets.pdf} \\
-multiple targets \\
-\end{center}
-
-\end{columns}
-\note{creates a graph if successfully created will correctly synthesize \\[1cm]
-single source generates two different verilog outputs, one for fpga and one for asic. \\[1cm]
-surprisingly difficult to generate each. for example, chisel has abstraction for memories.}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{The Scala Programming Language}
-
-\begin{columns}[c]
-
-\column{0.75\textwidth}
-
-\begin{itemize}
-\item Object Oriented
-\begin{itemize}
-\item Factory Objects, Classes
-\item Traits, overloading etc
-\item Strongly typed with type inference
-\end{itemize}
-\item Functional
-\begin{itemize}
-\item Higher order functions
-\item Anonymous functions
-\item Currying etc
-\end{itemize}
-\item Extensible
-\begin{itemize}
-\item Domain Specific Languages (DSLs)
-\end{itemize}
-\item Compiled to JVM
-\begin{itemize}
-\item Good performance
-\item Great Java interoperability
-\item Mature debugging, execution environments
-\end{itemize}
-\item Growing Popularity
-\begin{itemize}
-\item Twitter
-\item many Universities
-\end{itemize}
-\end{itemize}
-
-\column{0.25\textwidth}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{figs/programming-scala.pdf} \\
-\includegraphics[height=0.4\textheight]{figs/programming-in-scala.pdf}
-\end{center}
-
-\end{columns}
-\note{powerful combination of scipting and type safety, \\[1cm]
-includes powerful features to support abstraction, \\[1cm]
-as makes it easy to embed DSLs, compiles to jvm}
-\end{frame}
-
-\include{scala-intro}
-
-\begin{frame}[fragile]
-\frametitle{Algebraic Graph Construction}
-
-\begin{columns}
-\column{0.35\textwidth}
-{\lstset{basicstyle={\Large\ttfamily}}
-\begin{scala}
-Mux(x > y, x, y)
-\end{scala}
-}
-
-\column{0.6\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/max2.pdf}
-\end{center}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Creating Module}
-
-\begin{columns}
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class Max2 extends Module {
- val io = new Bundle {
- val x = UInt(INPUT, 8)
- val y = UInt(INPUT, 8)
- val z = UInt(OUTPUT, 8) }
- io.z := Mux(io.x > io.y, io.x, io.y)
-}
-\end{scala}
-}
-
-\column{0.45\textwidth}
-\begin{center}
-\includegraphics[width=0.95\textwidth]{figs/Max2c.pdf} \\
-\end{center}
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Connecting Modules}
-
-\begin{columns}
-\column{0.3\textwidth}
-\begin{scala}
-val m1 =
- Module(new Max2())
-m1.io.x := a
-m1.io.y := b
-val m2 =
- Module(new Max2())
-m2.io.x := c
-m2.io.y := d
-val m3 =
- Module(new Max2())
-m3.io.x := m1.io.z
-m3.io.y := m2.io.z
-\end{scala}
-
-\column{0.6\textwidth}
-
-\begin{center}
-\includegraphics[width=0.99\textwidth]{figs/Max4.pdf} \\
-\end{center}
-\end{columns}
-
-\end{frame}
-
-
-\begin{frame}[fragile]
-\frametitle{Defining Construction Functions}
-
-\begin{columns}
-
-\column{0.45\textwidth}
-
-\begin{scala}
-def Max2(x, y) = Mux(x > y, x, y)
-\end{scala}
-\begin{scala}
-Max2(x, y)
-\end{scala}
-
-\column{0.5\textwidth}
-
-\begin{center}
-\includegraphics[width=0.95\textwidth]{figs/Max2.pdf} \\[1cm]
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Functional Construction}
-
-\begin{columns}
-
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class MaxN(n: Int, w: Int) extends Module {
- val io = new Bundle {
- val in = Vec.fill(n){ UInt(INPUT, w) }
- val out = UInt(OUTPUT, w)
- }
- io.out := io.in.reduceLeft(Max2)
-}
-\end{scala}
-}
-
-\column{0.4\textwidth}
-
-\begin{center}
-\includegraphics[width=0.99\textwidth]{figs/reduceMax.pdf} \\
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Example}
-\begin{columns}
-
-\column{0.45\textwidth}
-
-\begin{footnotesize}
-\begin{scala}
-class GCD extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 16)
- val b = UInt(INPUT, 16)
- val z = UInt(OUTPUT, 16)
- val valid = Bool(OUTPUT) }
- val x = Reg(init = io.a)
- val y = Reg(init = io.b)
- when (x > y) {
- x := x - y
- } .otherwise {
- y := y - x
- }
- io.z := x
- io.valid := y === UInt(0)
-}
-\end{scala}
-\end{footnotesize}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/gcd.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Running the Chisel Simulation}
-
-\begin{bash}
-cd ~/chisel-tutorial/examples
-make GCD.out
-\end{bash}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{bash}
-...
-PASSED
-[success] Total time: 2 s, completed Feb 28, 2013 8:14:37 PM
-\end{bash}
-}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Generating Verilog}
-
-\begin{bash}
-cd ~/chisel-tutorial/examples
-make GCD.v
-\end{bash}
-
-The Verilog source is roughly divided into three parts:
-
-\begin{enumerate}
-\item Module declaration with input and outputs
-\item Temporary wire and register declaration used for holding intermediate values
-\item Register assignments in \verb+always @ (posedge clk)+
-\end{enumerate}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{FullAdder -- Type Inference}
-
-\begin{columns}
-\column{0.4\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class FullAdder extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 1)
- val b = UInt(INPUT, 1)
- val cin = UInt(INPUT, 1)
- val sum = UInt(OUTPUT, 1)
- val cout = UInt(OUTPUT, 1)
- }
- // Generate the sum
- val a_xor_b = io.a ^ io.b
- io.sum := a_xor_b ^ io.cin
- // Generate the carry
- val a_and_b = io.a & io.b
- val b_and_cin = io.b & io.cin
- val a_and_cin = io.a & io.cin
- io.cout :=
- a_and_b | b_and_cin | a_and_cin
-}
-\end{scala}
-}
-
-\column{0.55\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../getting-started/figs/Full_Adder.jpg}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{FullAdder Verilog -- Width Inference 1}
-
-\begin{columns}
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class FullAdder extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 1)
- val b = UInt(INPUT, 1)
- val cin = UInt(INPUT, 1)
- val sum = UInt(OUTPUT, 1)
- val cout = UInt(OUTPUT, 1)
- }
- // Generate the sum
- val a_xor_b = io.a ^ io.b
- io.sum := a_xor_b ^ io.cin
- // Generate the carry
- val a_and_b = io.a & io.b
- val b_and_cin = io.b & io.cin
- val a_and_cin = io.a & io.cin
- io.cout :=
- a_and_b | b_and_cin | a_and_cin
-}
-\end{scala}
-}
-
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-module FullAdder(
- input io_a,
- input io_b,
- input io_cin,
- output io_sum,
- output io_cout);
- wire T0;
- wire a_and_cin;
- wire T1;
- wire b_and_cin;
- wire a_and_b;
- wire T2;
- wire a_xor_b;
-
- assign io_cout = T0;
- assign T0 = T1 | a_and_cin;
- assign a_and_cin = io_a & io_cin;
- assign T1 = a_and_b | b_and_cin;
- assign b_and_cin = io_b & io_cin;
- assign a_and_b = io_a & io_b;
- assign io_sum = T2;
- assign T2 = a_xor_b ^ io_cin;
- assign a_xor_b = io_a ^ io_b;
-endmodule
-\end{scala}
-}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{FullAdder2 Verilog -- Width Inference 2}
-
-\begin{columns}
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class FullAdder2 extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 2)
- val b = UInt(INPUT, 2)
- val cin = UInt(INPUT, 2)
- val sum = UInt(OUTPUT, 2)
- val cout = UInt(OUTPUT, 2)
- }
- // Generate the sum
- val a_xor_b = io.a ^ io.b
- io.sum := a_xor_b ^ io.cin
- // Generate the carry
- val a_and_b = io.a & io.b
- val b_and_cin = io.b & io.cin
- val a_and_cin = io.a & io.cin
- io.cout :=
- a_and_b | b_and_cin | a_and_cin
-}
-\end{scala}
-}
-
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-module FullAdder(
- input [1:0] io_a,
- input [1:0] io_b,
- input [1:0] io_cin,
- output[1:0] io_sum,
- output[1:0] io_cout);
- wire[1:0] T0;
- wire[1:0] a_and_cin;
- wire[1:0] T1;
- wire[1:0] b_and_cin;
- wire[1:0] a_and_b;
- wire[1:0] T2;
- wire[1:0] a_xor_b;
-
- assign io_cout = T0;
- assign T0 = T1 | a_and_cin;
- assign a_and_cin = io_a & io_cin;
- assign T1 = a_and_b | b_and_cin;
- assign b_and_cin = io_b & io_cin;
- assign a_and_b = io_a & io_b;
- assign io_sum = T2;
- assign T2 = a_xor_b ^ io_cin;
- assign a_xor_b = io_a ^ io_b;
-endmodule
-\end{scala}
-}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Using Registers}
-\begin{scala}
-// clock the new reg value on every cycle
-val y = io.x
-val z = Reg(next = y)
-\end{scala}
-
-\begin{scala}
-// clock the new reg value when the condition a > b
-val x = Reg(UInt())
-when (a > b) { x := y }
-.elsewhen (b > a) { x := z }
-.otherwise { x := w }
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Unconditional Register Update}
-
-\begin{columns}
-
-\column{0.42\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class ShiftRegister extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val out = UInt(OUTPUT, 1)
- }
- val r0 = Reg(next = io.in)
- val r1 = Reg(next = r0)
- val r2 = Reg(next = r1)
- val r3 = Reg(next = r2)
- io.out := r3
-}
-\end{scala}
-}
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/shift-register.pdf}
-\end{center}
-
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-module ShiftRegister(input clk, input reset,
- input io_in,
- output io_out);
-
- reg[0:0] r3;
- reg[0:0] r2;
- reg[0:0] r1;
- reg[0:0] r0;
-
- assign io_out = r3;
- always @(posedge clk) begin
- r3 <= r2;
- r2 <= r1;
- r1 <= r0;
- r0 <= io_in;
- end
-endmodule
-\end{scala}
-}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Register Update}
-
-\begin{columns}
-
-\column{0.47\textwidth}
-
-\begin{scala}
-class ShiftRegister extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val shift = Bool(INPUT)
- val out = UInt(OUTPUT, 1)
- }
-
- val r0 = Reg(UInt())
- val r1 = Reg(UInt())
- val r2 = Reg(UInt())
- val r3 = Reg(UInt())
-
- when (io.shift) {
- r0 := io.in
- r1 := r0
- r2 := r1
- r3 := r2
- }
- io.out := r3
-}
-\end{scala}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/enable-shift-register.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Register Update with Reset}
-
-\begin{scala}
-class EnableShiftRegister extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val shift = Bool(INPUT)
- val out = UInt(OUTPUT, 1)
- }
- // Register reset to zero
- val r0 = Reg(init = UInt(0, 1))
- val r1 = Reg(init = UInt(0, 1))
- val r2 = Reg(init = UInt(0, 1))
- val r3 = Reg(init = UInt(0, 1))
- when (io.shift) {
- r0 := io.in
- r1 := r0
- r2 := r1
- r3 := r2
- }
- io.out := r3
-}
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{UInt Literals}
-inferred width
-\begin{scala}
-UInt(1) // decimal 1-bit literal from Scala Int.
-UInt("ha") // hexadecimal 4-bit literal from string.
-UInt("o12") // octal 4-bit literal from string.
-UInt("b1010") // binary 4-bit literal from string.
-\end{scala}
-specified widths
-\begin{scala}
-UInt("h_dead_beef") // 32-bit literal of type UInt.
-UInt(1) // decimal 1-bit literal from Scala Int.
-UInt("ha", 8) // hexadecimal 8-bit literal of type UInt.
-UInt("o12", 6) // octal 6-bit literal of type UInt.
-UInt("b1010", 12) // binary 12-bit literal of type UInt.
-UInt(5, 8) // unsigned decimal 8-bit literal of type UInt.
-\end{scala}
-\end{frame}
-
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Sequential Circuit Problem -- \tt Accumulator.scala}
-\begin{itemize}
-\item write sequential circuit that sums \code{in} values
-\item in {\tt chisel-tutorial/problems/Accumulator.scala}
-\item run {\tt make Accumulator.out} until passing
-\end{itemize}
-\begin{scala}
-class Accumulator extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val out = UInt(OUTPUT, 8)
- }
-
- // flush this out ...
-
- io.out := UInt(0)
-}
-\end{scala}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{UInt Operations and Conditional Assignment}
-
-\begin{columns}
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-class BasicALU extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 4)
- val b = UInt(INPUT, 4)
- val opcode = UInt(INPUT, 4)
- val output = UInt(OUTPUT, 4)
- }
- io.output := UInt(0)
- when (io.opcode === UInt(0)) {
- io.output := io.a // pass A
- } .elsewhen (io.opcode === UInt(1)) {
- io.output := io.b // pass B
- } .elsewhen (io.opcode === UInt(2)) {
- io.output := io.a + UInt(1) // inc A by 1
- } .elsewhen (io.opcode === UInt(3)) {
- io.output := io.a - UInt(1) // dec B by 1
- } .elsewhen (io.opcode === UInt(4)) {
- io.output := io.a + UInt(4) // inc A by 4
- } .elsewhen (io.opcode === UInt(5)) {
- io.output := io.a - UInt(4) // dec A by 4
- } .elsewhen (io.opcode === UInt(6)) {
- io.output := io.a + io.b // add A and B
- } .elsewhen (io.opcode === UInt(7)) {
- io.output := io.a - io.b // sub B from A
- } .elsewhen (io.opcode === UInt(8)) {
- io.output := (io.a < io.b) // set on A < B
- } .otherwise {
- io.output := (io.a === io.b) // set on A == B
- }
-}
-\end{scala}
-}
-
-\column{0.4\textwidth}
-\begin{itemize}
-\item wire \code{io.output} defaulted to 0 and then
-\item conditionally reassigned to based on opcode
-\item unlike registers, wires are required to be defaulted
-\item wires also allow forward declarations
-\end{itemize}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{UInt Operations}
-
-\begin{center}
-\begin{tabular}{| c | c | c | }
-\hline
-Symbol & Operation & Output Type \\ \hline
-\verb!+! & Add & UInt \\ \hline
-\verb+-+ & Subtract & UInt \\ \hline
-\verb+*+ & Multiply & UInt \\ \hline
-\verb+/+ & UInt Divide & UInt \\ \hline
-\verb+%+ & Modulo & UInt \\ \hline
-\verb+~+ & Bitwise Negation & UInt \\ \hline
-\verb+^+ & Bitwise XOR & UInt\\ \hline
-\verb+&+ & Bitwise AND & UInt \\ \hline
-\verb+|+ & Bitwise OR & Bool \\ \hline
-{\color{red}\verb+===+} & Equal & Bool \\ \hline
-\verb+!=+ & Not Equal & Bool \\ \hline
-\verb+>+ & Greater & Bool \\ \hline
-\verb+<+ & Less & Bool \\ \hline
-\verb+>=+ & Greater or Equal & Bool \\ \hline
-\verb+<=+ & Less or Equal & Bool \\ \hline
-\end{tabular}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Bit Extraction}
-\begin{scala}
-// extracts the x through y bits of value
-val x_to_y = value(x, y)
-\end{scala}
-
-\begin{scala}
-// extract the x-th bit from value
-val x_of_value = value(x)
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{ByteSelector}
-
-\begin{scala}
-class ByteSelector extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 32)
- val offset = UInt(INPUT, 2)
- val out = UInt(OUTPUT, 8)
- }
- io.out := UInt(0, width = 8)
- when (io.offset === UInt(0)) {
- io.out := io.in(7,0) // pull out lowest byte
- } .elsewhen (io.offset === UInt(1)) {
- io.out := io.in(15,8) // pull out second byte
- } .elsewhen (io.offset === UInt(2)) {
- io.out := io.in(23,16) // pull out third byte
- } .otherwise {
- io.out := io.in(31,24) // pull out highest byte
- }
-}
-\end{scala}
-
-\end{frame}
-
-% \setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-% \begin{frame}[fragile]{Instruction Decoder}
-%
-% {\lstset{basicstyle={\scriptsize\ttfamily}}
-% \begin{scala}
-% class LoadShiftRegister extends Module {
-% val io = new Bundle {
-% val inst = UInt(INPUT, 32)
-% val rs0 = UInt(OUTPUT, 8)
-% val rs1 = UInt(OUTPUT, 8)
-% val rs2 = UInt(OUTPUT, 8)
-% val isAdd = Bool(OUTPUT)
-% val isSub = Bool(OUTPUT)
-% val isMul = Bool(OUTPUT)
-% val isDiv = Bool(OUTPUT)
-% }
-% io.isAdd := ...
-% io.isSub := ...
-% io.isMul := ...
-% io.isDiv := ...
-% io.rs0 := ...
-% io.rs1 := ...
-% io.rs2 := ...
-% }
-% \end{scala}
-% }
-%
-% \end{frame}
-% \setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{Bit Concatenation and Filling}
-You concatenating bits using \verb+Cat+:
-\begin{scala}
-val A = UInt(width = 32)
-val B = UInt(width = 32)
-val bus = Cat(A, B) // concatenate A and B
-\end{scala}
-
-and replicate bits using \verb+Fill+:
-\begin{scala}
-// Replicate a bit string multiple times.
-val usDebt = Fill(3, UInt("hA"))
-\end{scala}
-
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{LFSR16 -- \tt problems/lfsr16.scala}
-
-\begin{scala}
-class LFSR16 extends Module {
- val io = new Bundle {
- val inc = Bool(INPUT)
- val out = UInt(OUTPUT, 16)
- }
- // ...
- io.out := UInt(0)
-}
-\end{scala}
-\begin{itemize}
-\item \verb+reg+, \verb+cat+, \verb+extract+, \verb+^+
-\item init reg to 1
-\item updates when \verb+inc+ asserted
-\end{itemize}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/LFSR16.pdf}
-\end{center}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{UInt Bit Inference}
-\begin{columns}
-\column{0.4\textwidth}
-\begin{scala}
-class HiLoMultiplier()
- extends Module {
- val io = new Bundle {
- val A = UInt(INPUT, 16)
- val B = UInt(INPUT, 16)
- val Hi = UInt(OUTPUT, 16)
- val Lo = UInt(OUTPUT, 16)
- }
- val mult = io.A * io.B
- io.Lo := mult(15, 0)
- io.Hi := mult(31, 16)
-}
-\end{scala}
-
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-module HiLoMultiplier(
- input [15:0] io_A,
- input [15:0] io_B,
- output[15:0] io_Hi,
- output[15:0] io_Lo);
-
- wire[15:0] T0;
- wire[31:0] mult; // inferred as 32 bits
- wire[15:0] T1;
-
- assign io_Lo = T0;
- assign T0 = mult[4'hf:1'h0];
- assign mult = io_A * io_B;
- assign io_Hi = T1;
- assign T1 = mult[5'h1f:5'h10];
-endmodule
-\end{scala}
-}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Bit Inference Rules}
-
-\begin{center}
-\begin{tabular}{| l | l | l | }
-\hline
-Operation & Result Bit Width \\ \hline
-\verb!Z = X + Y! & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = X - Y+ & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = X & Y+ & min(Width(X), Width(Y)) \\ \hline
-\verb+Z = X | Y+ & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = X ^ Y+ & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = ~X+ & Width(X) \\ \hline
-\verb+Z = Mux(C, X, Y)+ & max(Width(X), Width (Y)) \\ \hline
-\verb+Z = X * Y+ & Width(X) + Width(Y) \\ \hline
-\verb+Z = X << n+ & Width(X) + n \\ \hline
-\verb+Z = X >> n+ & Width(X) - n \\ \hline
-\verb+Z = Cat(X, Y)+ & Width(X) + Width(Y) \\ \hline
-\verb+Z = Fill(n, x)+ & Width(X) + n \\ \hline
-\end{tabular}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Bool Type}
-The Chisel Bool is used to represent the result of logical expressions:
-\begin{scala}
-val change = io.a === io.b // change gets Bool type
-when (change) { // execute if change is true
- ...
-}
-\end{scala}
-
-You can instantiate a Bool value like this:
-\begin{scala}
-val true_value = Bool(true)
-val false_value = Bool(false)
-\end{scala}
-
-You can cast an UInt to a Bool as follows:
-\begin{scala}
-val bit = UInt(width = 1) ...
-when (bit.toBool) { ... }
-\end{scala}
-
-You can use a Bool as an UInt:
-\begin{scala}
-val bit = UInt(width = 1) ...
-bit := a > b
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Bits Subtype Hierarchy}
-\begin{itemize}
-\item \verb+SInt+ is a signed integer type
-\end{itemize}
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/bits-hierarchy.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]{Bundles}
-
-\begin{columns}
-\column{0.55\textwidth}
-\begin{scala}
-class MyFloat extends Bundle {
- val sign = Bool()
- val exponent = UInt(width = 8)
- val significand = UInt(width = 23)
-}
-
-val x = new MyFloat()
-val xs = x.sign
-\end{scala}
-
-\column{0.35\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{../cs250/figs/myfloat.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Ports}
-
-\begin{columns}
-\column{0.55\textwidth}
-
-\textbf{Data object with directions assigned to its members}
-
-\begin{scala}
-class Decoupled extends Bundle {
- val data = UInt(INPUT, 32)
- val valid = Bool(OUTPUT)
- val ready = Bool(INPUT)
-}
-\end{scala}
-
-\textbf{Direction assigned at instantiation time}
-
-\begin{scala}
-class ScaleIO extends Bundle {
- val in = new MyFloat().asInput
- val scale = new MyFloat().asInput
- val out = new MyFloat().asOutput
-}
-\end{scala}
-
-\column{0.35\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{../cs250/figs/fifoio.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Instantiating Modules}
-
-\begin{columns}
-
-\column{0.4\textwidth}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-// A 4-bit adder with carry in and carry out
-class Adder4 extends Module {
- val io = new Bundle {
- val A = UInt(INPUT, 4)
- val B = UInt(INPUT, 4)
- val Cin = UInt(INPUT, 1)
- val Sum = UInt(OUTPUT, 4)
- val Cout = UInt(OUTPUT, 1)
- }
- // Adder for bit 0
- val Adder0 = Module(new FullAdder())
- Adder0.io.a := io.A(0)
- Adder0.io.b := io.B(0)
- Adder0.io.cin := io.Cin
- val s0 = Adder0.io.sum
- // Adder for bit 1
- val Adder1 = Module(new FullAdder())
- Adder1.io.a := io.A(1)
- Adder1.io.b := io.B(1)
- Adder1.io.cin := Adder0.io.cout
- val s1 = Cat(Adder1.io.sum, s0)
- ...
- // Adder for bit 3
- val Adder3 = Module(new FullAdder())
- Adder3.io.a := io.A(3)
- Adder3.io.b := io.B(3)
- Adder3.io.cin := Adder2.io.cout
- io.Sum := Cat(Adder3.io.sum, s2)
- io.Cout := Adder3.io.cout
-}
-\end{scala}
-}
-
-\column{0.5\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../getting-started/figs/4_Bit_Adder.jpg}
-\end{center}
-
-\begin{itemize}
-\item inherits from \verb+Module+ class,
-\item contains an interface stored in a port field named \verb+io+, and
-\item wires together subcircuits in its constructor.
-\end{itemize}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Vecs}
-constructing vecs
-\begin{scala}
-val myVec1 = Vec.fill( ) { }
-val myVec2 = Vec(, , ...)
-\end{scala}
-
-creating a vec of wires
-\begin{scala}
-val ufix5_vec10 = Vec.fill(10) { UInt(width = 5) }
-\end{scala}
-
-
-creating a vec of regs
-\begin{scala}
-val reg_vec32 = Vec.fill(32){ Reg() }
-\end{scala}
-
-writing
-\begin{scala}
-reg_vec32(1) := UInt(0)
-\end{scala}
-
-reading
-\begin{scala}
-val reg5 = reg_vec(5)
-\end{scala}
-
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Vec Shift Reg -- problems/VecShiftRegister.scala}
-
-\begin{itemize}
-\item add loadability to shift register
-\item change interface to use vec's
-\end{itemize}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class VecShiftRegister extends Module {
- val io = new Bundle {
- val ins = Vec.fill(4){ UInt(INPUT, 1) }
- val load = Bool(INPUT)
- val shift = Bool(INPUT)
- val out = UInt(OUTPUT, 1)
- }
- val delays = Vec.fill(4){ Reg(UInt()) }
- when ( ... ) {
- // fill in here ...
- } .elsewhen (io.shift) {
- ...
- }
- io.out := delays(3)
-}
-\end{scala}
-}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-% \begin{frame}[fragile]{Scala Console}
-% \begin{FramedVerb}
-% \end{FramedVerb}
-% \end{frame}
-
-\begin{frame}[fragile]{Defining a Tester}
-
-\begin{columns}
-\column{0.45\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-package Tutorial
-import Chisel._
-import scala.collection.mutable.HashMap
-import scala.util.Random
-
-class ByteSelector extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 32)
- val offset = UInt(INPUT, 2)
- val out = UInt(OUTPUT, 8)
- }
- io.out := UInt(0, width=8)
- ...
-}
-
-class ByteSelectorTests(c: ByteSelector)
- extends Tester(c, Array(c.io)) {
- defTests {
- var allGood = true
- val vars = new HashMap[Node, Node]()
- val test_in = 12345678
- for (t <- 0 until 4) {
- vars(c.io.in) = UInt(test_in)
- vars(c.io.offset) = UInt(t)
- val ref_out =
- UInt((test_in >> (t * 8)) & 0xFF)
- vars(c.io.out) = ref_out
- allGood = step(vars) && allGood
- }
- allGood
- }
-}
-\end{scala}
-}
-\column{0.45\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-class Tester[T <: Module]
- (val c: T, val testNodes: Array[Node])
-
-def defTests(body: => Boolean)
-
-def step(vars: HashMap[Node, Node]): Boolean
-\end{scala}
-}
-\begin{tiny}
-\begin{itemize}
-\item user subclasses \code{Tester} defining DUT and
-\code{testNodes} and tests in \code{defTests} body
-\item \code{vars} is mapping from \code{testNodes} to literals, called bindings
-\item \code{step} runs test with given bindings, where
-var values for input ports are sent to DUT,
-DUT computes next outputs, and
-DUT sends next outputs to Chisel
-\item finally \code{step} compares received values against var values
- for and returns false if any comparisons fail
- output ports
-\end{itemize}
-\end{tiny}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../tutorial/figs/DUT.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Simulation Debug Output}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-> cd chisel-tutorial/examples
-> make ByteSelector.out
-STARTING ../emulator/problems/ByteSelector
----
-INPUTS
- INPUT(ByteSelector__io_in.ByteSelector) = 12345678
- INPUT(ByteSelector__io_offset.ByteSelector) = 0
-OUTPUTS
- READ OUTPUT(ByteSelector__io_out.ByteSelector) = 78
- EXPECTED: OUTPUT(ByteSelector__io_out.ByteSelector) = 78
- SUCCESS
----
-INPUTS
- INPUT(ByteSelector__io_in.ByteSelector) = 12345678
- INPUT(ByteSelector__io_offset.ByteSelector) = 1
-OUTPUTS
- READ OUTPUT(ByteSelector__io_out.ByteSelector) = 97
- EXPECTED: OUTPUT(ByteSelector__io_out.ByteSelector) = 97
- SUCCESS
----
-...
----
-INPUTS
- INPUT(ByteSelector__io_in.ByteSelector) = 12345678
- INPUT(ByteSelector__io_offset.ByteSelector) = 3
-OUTPUTS
- READ OUTPUT(ByteSelector__io_out.ByteSelector) = 0
- EXPECTED: OUTPUT(ByteSelector__io_out.ByteSelector) = 0
- SUCCESS
-PASSED // Final pass assertion
-[success] Total time: 26 s, ...
-\end{scala}
-}
-
-\end{frame}
-
-\begin{frame}{Testbench Ingredients}
-
-\begin{itemize}
-\item Define hash map for I/O and any initializations
-\item Set inputs to device under test in hash map
-\item Determine expected output for simulation advance for hash map
-\item Advance simulation and track success/failure (ex. allGood)
-\item Repeat until all appropriate test cases verified
-\item Assert if test passed or failed (allGood)
-\end{itemize}
-
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Testbench for MaxN -- \tt MaxN.scala}
-\begin{columns}
-\column{0.49\textwidth}
-
-\begin{itemize}
-\item write a testbench for MaxN
-\end{itemize}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class MaxN(val n: Int, val w: Int)
- extends Module {
-
- def Max2(x: UInt, y: UInt) =
- Mux(x > y, x, y)
-
- val io = new Bundle {
- val ins = Vec.fill(n){ UInt(INPUT, w) }
- val out = UInt(OUTPUT, w)
- }
- io.out := io.ins.reduceLeft(Max2)
-}
-\end{scala}
-}
-\begin{scala}
-// returns random int in 0..lim-1
-val x = rnd.nextInt(lim)
-\end{scala}
-
-\column{0.42\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class MaxNTests(c: MaxN)
- extends Tester(c, Array(c.io)) {
- defTests {
- var allGood = true
- val vars =
- new HashMap[Node, Node]()
- val rnd = new Random()
- for (i <- 0 until 10) {
- vars.clear()
- var mx = 0
- for (i <- 0 until c.n) {
- // FILL THIS IN HERE
- vars(c.io.ins(0)) = UInt(0)
- }
- // FILL THIS IN HERE
- vars(c.io.out) = UInt(1)
- allGood = step(vars) && allGood
- }
- allGood
- }
-}
-\end{scala}
-}
-\end{columns}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{Dynamically Accessed Vec}
-\begin{scala}
-class MemorySearch extends Module {
- val io = new Bundle {
- val target = UInt(INPUT, 4)
- val en = Bool(INPUT)
- val address = UInt(OUTPUT, 3)
- val done = Bool(OUTPUT)
- }
- val index = Reg(init = UInt(0, width = 3))
- val list = Vec(UInt(0), UInt(4), UInt(15), UInt(14),
- UInt(2), UInt(5), UInt(13)){ UInt(width = 4) }
- val memVal = list(index)
- val done = !io.en && ((memVal === io.target) || (index === UInt(7)))
- when (io.en) {
- index := UInt(0)
- } .elsewhen (done === Bool(false)) {
- index := index + UInt(1)
- }
- io.done := done
- io.address := index
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{RAM}
-RAM is supported using the \code{Mem} construct
-
-\begin{scala}
-val m = Mem(Bits(width = 32), 32)
-\end{scala}
-
-\noindent
-where
-\begin{itemize}
-\item writes to Mems are positive-edge-triggered
-\item reads are either combinational or positive-edge-triggered
-\item ports are created by applying a \code{UInt} index
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{32-entry Register File}
-
-\begin{scala}
-val regs = Mem(Bits(width = 32), 32)
-when (wrEn) {
- regs(wrAddr) := wrData
-}
-val iDat = regs(iAddr)
-val mDat = regs(mAddr)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.55\textheight]{../cs250/figs/mem.pdf}
-\end{center}
-
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Load/Search Mem -- \tt DynamicMemorySearch.scala}
-\begin{scala}
-class DynamicMemorySearch extends Module {
- val io = new Bundle {
- val isWr = Bool(INPUT)
- val wrAddr = UInt(INPUT, 3)
- val data = UInt(INPUT, 4)
- val en = Bool(INPUT)
- val target = UInt(OUTPUT, 3)
- val done = Bool(OUTPUT)
- }
- val index = Reg(init = UInt(0, width = 3))
- val memVal = ...
- val done = !io.en && ((memVal === io.target) || (index === UInt(7)))
- // ...
- when (io.en) {
- index := UInt(0)
- } .elsewhen (done === Bool(false)) {
- index := index + UInt(1)
- }
- io.done := done
- io.target := index
-}
-\end{scala}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{Sequential Read Ports}
-Sequential read ports are inferred when:
-\begin{itemize}
-\item optional parameter \code{seqRead} is set and
-\item read address is a reg
-\end{itemize}
-
-\begin{scala}
-val ram1r1w = Mem(UInt(width = 32), 1024, seqRead = true)
-val reg_raddr = Reg(UInt())
-when (wen) { ram1r1w(waddr) := wdata }
-when (ren) { reg_raddr := raddr }
-val rdata = ram1r1w(reg_raddr)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../cs250/figs/mem-seq-read.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Stack}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-class Stack(depth: Int) extends Module {
- val io = new Bundle {
- val dataIn = UInt(INPUT, 32)
- val dataOut = UInt(OUTPUT, 32)
- val push = Bool(INPUT)
- val pop = Bool(INPUT)
- val en = Bool(INPUT)
- }
- // declare the memory for the stack
- val stack_mem = Mem(UInt(width = 32), depth, seqRead = false)
- val sp = Reg(init = UInt(0, width = log2Up(depth)))
- val dataOut = Reg(init = UInt(0, width = 32))
- // Push condition - make sure stack isn't full
- when(io.en && io.push && (sp != UInt(depth-1))) {
- stack_mem(sp + UInt(1)) := io.dataIn
- sp := sp + UInt(1)
- }
- // Pop condition - make sure the stack isn't empty
- .elsewhen(io.en && io.pop && (sp > UInt(0))) {
- sp := sp - UInt(1)
- }
- when(io.en) {
- dataOut := stack_mem(sp)
- }
- io.dataOut := dataOut
-}
-\end{scala}
-}
-
-\end{frame}
-
-\begin{frame}[fragile]{Scripting Hardware Generation}
-
-\begin{columns}
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-// A n-bit adder with carry in and carry out
-class Adder(n: Int) extends Module {
- val io = new Bundle {
- val A = UInt(INPUT, n)
- val B = UInt(INPUT, n)
- val Cin = UInt(INPUT, 1)
- val Sum = UInt(OUTPUT, n)
- val Cout = UInt(OUTPUT, 1)
- }
- // create a vector of FullAdders
- val FAs = Vec.fill(n){ Module(new FullAdder()).io }
- val carry = Vec.fill(n+1){ UInt(width = 1) }
- val sum = Vec.fill(n){ Bool() }
-
- // first carry is the top level carry in
- carry(0) := io.Cin
-
- // wire up the ports of the full adders
- for(i <- 0 until n) {
- FAs(i).a := io.A(i)
- FAs(i).b := io.B(i)
- FAs(i).cin := carry(i)
- carry(i+1) := FAs(i).cout
- sum(i) := FAs(i).sum.toBool()
- }
- io.Sum := sum.toBits().toUInt()
- io.Cout := carry(n)
-}
-\end{scala}
-}
-
-\column{0.4\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../getting-started/figs/4_Bit_Adder.jpg}
-\end{center}
-\end{columns}
-
-\end{frame}
-
-\input{../talks/microsoft/libs-to-langs-guts-in-scala.tex}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Mul Lookup Table Problem -- \tt Mul.scala}
-\begin{itemize}
-\item write 16x16 multiplication table using \code{Vec}
-\end{itemize}
-\begin{scala}
-class Mul extends Module {
- val io = new Bundle {
- val x = UInt(INPUT, 4)
- val y = UInt(INPUT, 4)
- val z = UInt(OUTPUT, 8)
- }
- val muls = new ArrayBuffer[UInt]()
-
- // flush this out ...
-
- io.z := UInt(0)
-}
-\end{scala}
-
-hint:
-\begin{scala}
-val tab = Vec(muls)
-io.z := tab(Cat(io.x, io.y))
-\end{scala}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]
-\frametitle{Valid Wrapper}
-
-\begin{columns}
-
-\column{0.65\textwidth}
-
-\begin{footnotesize}
-\begin{scala}
-class Valid[T <: Data](dtype: T) extends Bundle {
- val data = dtype.clone.asOutput
- val valid = Bool(OUTPUT)
- override def clone = new Valid(dtype)
-}
-
-class GCD extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 16)
- val b = UInt(INPUT, 16)
- val out = new Valid(UInt(OUTPUT, 16))
- } }
- ...
- io.out.data := x
- io.out.valid := y === UInt(0)
-}
-
-\end{scala}
-\end{footnotesize}
-
-\column{0.3\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../talks/retreat-1/figs/valid.pdf}
-\end{center}
-
-\end{columns}
-\note{now gcd had a valid signal on its output. \\[1cm]
-we can generalize this idea by defining a wrapper class that bundles a valid with a data signal. \\[1cm]
-now we can rewrite GCD using an interface using this valid wrapper for its output. }
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Function Filters}
-
-\begin{footnotesize}
-\begin{scala}
-abstract class Filter[T <: Data](dtype: T) extends Module {
- val io = new Bundle {
- val in = Valid(dtype).asInput
- val out = Valid(dtype).asOutput
-} }
-
-class FunctionFilter[T <: Data](dtype: T, f: T => T) extends Filter(dtype) {
- io.out.valid := io.in.valid
- io.out.bits := f(io.in)
-}
-\end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/sketching13/figs/function-filter.pdf}
-\end{center}
-
-\note{suppose we want to write hardware filters. \\[1cm]
-one way to create a reusable filter would be \\[1cm]
-to create a filter class that takes a function as argument that definines its filter operation.}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Clipping Filter}
-
-\begin{footnotesize}
-\begin{scala}
-def clippingFilter[T <: Bits](limit: Int, dtype: T) =
- new FunctionFilter(dtype, x => min(limit, max(-limit, x)))
-\end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/retreat-1/figs/clipping-filter.pdf}
-\end{center}
-\note{using this reusable substrate then it is easy to create an instance of a filter.}
-\end{frame}
-
-
-\begin{frame}[fragile]
-\frametitle{Shifting Filter}
-
-\begin{footnotesize}
-\begin{scala}
-def shiftingFilter[T <: Bits](shift: Int, dtype: T) =
- new FunctionFilter(dtype, x => x >> shift)
-\end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/retreat-1/figs/shifting-filter.pdf}
-\end{center}
-\note{and reuse it for shift filter}
-\end{frame}
-
-\begin{frame}[fragile]{Testing Decoupled Circuits}
-
-\begin{itemize}
-\item using ovars for outputs
-\item need to check outputs directly using \verb+litValue+
-\end{itemize}
-\begin{scala}
-class GCDTests(c: GCD) extends Tester(c, Array(c.io)) {
- defTests {
- val (a, b, z) = (64, 48, 16)
- val svars = new HashMap[Node, Node]()
- val ovars = new HashMap[Node, Node]()
- var t = 0
- do {
- svars(c.io.a) = UInt(a)
- svars(c.io.b) = UInt(b)
- step(svars, ovars)
- t += 1
- } while (t <= 1 || ovars(c.io.v).litValue() == 0)
- ovars(c.io.z).litValue() == z
- }
-}
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Chained Filter}
-
-\begin{footnotesize}
-\begin{scala}
-class ChainedFilter[T <: Num](dtype: T) extends Filter(dtype) = {
- val shift = Module(new ShiftFilter(2, dtype))
- val clipper = Module(new ClippingFilter(1 << 7, dtype))
- io.in <> shift.io.in
- shift.io.out <> clipper.io.in
- clipper.io.out <> io.out
-}
-\end{scala}
-% \begin{scala}
-% class ChainedFilter[T <: Num](dtype: T) extends Filter(dtype) = {
-% val fir = new TstFIR(dtype)
-% val shift = new ShiftFilter(2, dtype)
-% val clipper = new ClippingFilter(1 << 7, dtype)
-% io.in <> fir.io.in
-% fir.io.out <> shift.io.in
-% shift.io.out <> clipper.io.in
-% clipper.io.out <> io.out
-% }
-% \end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/sketching13/figs/chained-filter2.pdf}
-\end{center}
-\note{and chain together...}
-\end{frame}
-
-\begin{frame}[fragile]{Predicate Filter}
-\begin{scala}
-class PredicateFilter[T <: Data](dtype: T, f: T => Bool)
- extends Filter(dtype) {
- io.out.valid := io.in.valid && f(io.in.bits)
- io.out.bits := io.in.bits
-}
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{figs/predicate-filter.pdf}
-\end{center}
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Predicate Filtering -- \tt SingleEvenFilter.scala}
-\begin{itemize}
-\item write filter that lets only even single digit numbers through
-\end{itemize}
-\begin{scala}
-object SingleFilter {
- def apply[T <: UInt](dtype: T) = // FILL IN FUNCTION BELOW
- Module(new PredicateFilter(dtype, (x: T) => Bool(false)))
-}
-
-object EvenFilter {
- def apply[T <: UInt](dtype: T) = // FILL IN FUNCTION BELOW
- Module(new PredicateFilter(dtype, (x: T) => Bool(false)))
-}
-
-class SingleEvenFilter[T <: UInt](dtype: T) extends Filter(dtype) {
- // FILL IN CONSTRUCTION AND WIRING
- io.out := UInt(0)
-}
-\end{scala}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile, shrink]
-\frametitle{Functional Composition}
-
-% \begin{itemize}
-% \item natural
-% \item reusable
-% \item composable
-% \end{itemize}
-% \vskip1cm
-
-\begin{Large}
-\begin{columns}
-
-\column{0.45\textwidth}
-\verb+Map(ins, x => x * y)+ \\
-\begin{center}
-\includegraphics[height=0.6\textheight]{../bootcamp/figs/map.pdf} \\[2cm]
-\end{center}
-
-\column{0.45\textwidth}
-\vskip2mm
-\verb+Chain(n, in, x => f(x))+ \\
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../bootcamp/figs/chain.pdf} \\
-\end{center}
-
-\verb+Reduce(ins, Max)+ \\
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../bootcamp/figs/reduce.pdf} \\
-\end{center}
-
-\end{columns}
-
-\end{Large}
-\note{the previous example showed a simple use of functional programming. \\[1cm]
-Scala provides strong support for functional programming and
-it turns out that functional programming is a powerful way to define hardware. \\[1cm]
-for example, you can create a parallel set of blocks using map and reduce to creation reduction trees and chain to create a pipeline.}
-\end{frame}
-
-\begin{frame}[fragile]{Flo Map / Reduce Generator}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-object FloDelays {
- def apply(x: Flo, n: Int): List[Flo] =
- if (n <= 1) List(x) else x :: FloDelays(RegNext(x), n-1)
-}
-object FloFIR {
- def apply(ws: Seq[Flo], x: T): T =
- (ws, FloDelays(x, ws.length)).zipped.map( _ * _ ).reduce( _ + _ )
-}
-class FIR extends Module {
- val io = new Bundle { val x = Flo(INPUT); val z = Flo(OUTPUT) }
- val ws = Array(Flo(0.25), Flo(0.75))
- io.z := FloFIR(ws, io.x)
-}
-\end{scala}
-}
-\begin{center}
-\includegraphics[height=0.35\textheight]{../cs294-88/lectures/advanced-chisel/figs/inner-product-fir.png}
-\end{center}
-\note{as an advanced example, consider writing an FIR filter which is defined by the equation below. \\[1cm]
-essentially it's a sum of products of coefficients and delayed versions of input.\\[1cm]
-we can write this quite simply using map and reduce as above.}
-\end{frame}
-
-\begin{frame}[fragile]{Generic Map / Reduce Generator}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-object Delays {
- def apply[U <: Data](x: U, n: Int): List[U] =
- if (n <= 1) List(x) else x :: Delays(RegNext(x), n-1)
-}
-object GenFIR {
- def apply[T <: Data with Num[T]](ws: Seq[T], x: T): T =
- (ws, Delays(x, ws.length)).zipped.map( _ * _ ).reduce( _ + _ )
-}
-class FIR extends Module {
- val io = new Bundle { val x = Flo(INPUT); val z = Flo(OUTPUT) }
- val ws = Array(Flo(0.25), Flo(0.75))
- io.z := GenFIR(ws, io.x)
-}
-\end{scala}
-}
-\begin{center}
-\includegraphics[height=0.35\textheight]{../cs294-88/lectures/advanced-chisel/figs/inner-product-fir.png}
-\end{center}
-\note{as an advanced example, consider writing an FIR filter which is defined by the equation below. \\[1cm]
-essentially it's a sum of products of coefficients and delayed versions of input.\\[1cm]
-we can write this quite simply using map and reduce as above.}
-\end{frame}
-
-\begin{frame}[fragile]{Chisel Standard Library -- \tt ChiselUtil.scala}
-\begin{center}
-\begin{tabular}{rl}
-{\bf Bits Properities} & \code{log2Up}, \code{log2Down}, \code{isPow2}, \code{PopCount}\\
-{\bf Numeric Utilities} & \code{LFSR16}, \code{Reverse}, \code{FillInterleaved} \\
-{\bf Stateful Functions} & \code{ShiftRegister}, \code{Counter} \\
-{\bf Priority Encoding Functions} & \code{UIntToOH}, \code{OHToUInt}, \code{Mux1H} \\
-{\bf Priority Encoders} & \code{PriorityEncoder}, \code{PriorityEncoderOH} \\
-{\bf Vec Construction} & \code{Vec.fill}, \code{Vec.tabulate} \\
-{\bf Vec Functional} & \code{forall}, \code{exists}, \code{contains}, ... \\
-{\bf Queues and Pipes} & \code{Decoupled}, \code{Queue}, \code{Valid}, \code{Pipe} \\
-{\bf Arbiters} & \code{ArbiterIO}, \code{Arbiter}, \code{RRArbiter} \\
-\end{tabular}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Queues}
-\begin{itemize}
-\item Required parameter \verb+entries+ controls depth
-\item The width is determined from the inputs.
-\end{itemize}
-\begin{scala}
-class QueueIO[T <: Data](type: T, entries: Int) extends Bundle {
- val enq = Decoupled(data.clone).flip
- val deq = Decoupled(data.clone)
- val count = UFix(OUTPUT, log2Up(entries+1))
-}
-
-class Queue[T <: Data]
- (type: T, entries: Int,
- pipe: Boolean = false,
- flow: Boolean = false
- flushable: Boolean = false)
- extends Module
-\end{scala}
-\begin{scala}
-val q = new Queue(UInt(), 16)
-q.io.enq <> producer.io.out
-consumer.io.in <> q.io.deq
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Multiple Clock Domains}
-Clocks are first class and take an optional reset signal:
-\begin{scala}
-class Clock (reset: Bool) extends Node {
- def reset: Bool // returns reset pin
-}
-\end{scala}
-
-There is a builtin implicit clock that state elements use by default:
-\begin{scala}
-var implicitClock = new Clock( implicitReset )
-\end{scala}
-
-Clocks can be defined from other clocks:
-\begin{scala}
-val clock2 = clock1 * 2
-val clock3 = clock1 / 2
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Specifying a Clock Domain}
-The clock for state elements and modules can be specified:
-\begin{scala}
-Reg(... clock: Clock = implicitClock)
-Mem(... clock: Clock = implicitClock)
-Module(... clock: Clock = implicitClock)
-\end{scala}
-
-For example, a register can be created in a different clock domain as follows:
-\begin{scala}
-val reg = Reg(UInt(), clock = clock2)
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Crossing Clock Domains}
-The most general technique to send data between domains is using an asynchronous queue:
-
-\begin{scala}
-class AsyncQueue[T <: Data]
- (dataType: T, depth: Int, enq_clk: Clock, deq_clock: Clock) extends Module
-\end{scala}
-
-Using these queues, we can then move a signalA from clock domains clockA to signalB in clockB:
-
-\begin{scala}
-val queue = new AsyncQueue(Uint(width = 32), 2, clockA, clockB)
-fifo.enq.bits := signalA
-signalB := fifo.deq.bits
-fifo.valid := condA
-fifo.ready := condB
-...
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Multiple Clocks -- \tt MultipleClockDomains.scala}
-\begin{scala}
-class MultiClockDomain extends Module {
- val io = new Bundle {
- val start = Bool(INPUT)
- val sum = Decoupled(UInt(OUTPUT))
- }
- val fastClock = new Clock()
- val slowClock = new Clock()
- ...
-}
-
-class MultiClockDomainTests(c: MultiClockDomain)
- extends Tester(c, Array(c.io)) {
- defTests {
- val clocks = new HashMap[Clock, Int]
- clocks(Module.implicitClock) = 2
- clocks(c.fastClock) = 4
- clocks(c.slowClock) = 6
- setClocks(clocks)
- ...
- }
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Creating Your Own Project}
-directory structure
-\begin{bash}
-Hello/
- build.sbt # scala configuration file
- Hello.scala # your source file
-\end{bash}
-
-\end{frame}
-
-\begin{frame}[fragile]{Writing Your Source File}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-package Hello
-import Chisel._
-import scala.collection.mutable.HashMap
-
-class Hello extends Module {
- val io = new Bundle {
- val out = UInt(OUTPUT, 8) }
- io.out := UInt(33)
-}
-
-class HelloTests(c: Hello) extends Tester(c, Array(c.io)) {
- defTests {
- val vars = new HashMap[Node, Node]()
- vars(c.io.out) = UInt(33)
- step(vars)
- }
-}
-
-object Hello {
- def main(args: Array[String]): Unit = {
- val args = Array("--backend", "c", "--genHarness", "--compile", "--test")
- chiselMainTest(args, () => Module(new Hello())) {
- c => new HelloTests(c) }
-} }
-\end{scala}
-}
-
-\end{frame}
-
-\begin{frame}[fragile]{Setting Up Your SBT Configuration File}
-\begin{scala}
-scalaVersion := "2.10.2"
-
-addSbtPlugin("com.github.scct" % "sbt-scct" % "0.2")
-
-libraryDependencies +=
- "edu.berkeley.cs" %% "chisel" % "latest.release"
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Compiling and Running}
-Producing C++
-\begin{bash}
-sbt run --backend c
-\end{bash}
-
-Producing Verilog
-\begin{bash}
-sbt run --backend v
-\end{bash}
-
-Running the Chisel Tests
-\begin{bash}
-sbt run --backend c --compile --test --genHarness
-\end{bash}
-
-\end{frame}
-
-\begin{frame}[fragile]{chiselMain(Test) Command Line Arguments}
-\begin{scala}
-sbt
-sbt> compile // compiles Chisel Scala code
-sbt> run // compile and run Chisel Scala Code
-sbt> run --backend c // produces C++ files
-sbt> exit
-\end{scala}
-
-with a complete set of command line arguments being:\\[2mm]
-
-\begin{tabular}{lll}
-\verb+--backend v+ & generate verilog \\
-\verb+--backend c+ & generate C++ (default)\\
-\verb+--vcd+ & enable vcd dumping \\
-\verb+--targetDir+ & target pathname prefix \\
-\verb+--genHarness+ & generate harness file for C++ \\
-\verb+--debug+ & put all wires in C++ class file \\
-\verb+--compile+ & compiles generated C++ \\
-\verb+--test+ & runs tests using C++ app \\
-\end{tabular}
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Make Your Own Project}
-set hello project up
-\begin{bash}
-cd ~
-mkdir hello
-cp ~/chisel-tutorial/hello/* hello
-cd hello
-sbt run
-\end{bash}
-make a change
-\begin{itemize}
-\item make output a function of an new input
-\end{itemize}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}{Chisel Workflow}
-\begin{center}
-\includegraphics[height=0.9\textheight]{../bootcamp/figs/chisel-workflow.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]{printf / sprintf}
-\begin{itemize}
-\item during simulation
-\begin{itemize}
-\item \verb+printf+ prings the formatted string to the console on rising clock edges
-\item \verb+sprintf+ returns the formatted string as a bit vector
-\end{itemize}
-\item format specifiers are
-\begin{itemize}
-\item \verb+%b+ -- binary number
-\item \verb+%d+ -- decimal number
-\item \verb+%x+ -- hexidecimal number
-\item \verb+%e+ -- floating point number in scientific notation
-\item \verb+%s+ -- string consisting of a sequence of 8-bit extended ASCII chars
-\item \verb+%%+ -- specifies a literal %.
-\end{itemize}
-\end{itemize}
-the following prints the line \verb+"0x4142 16706 AB"+ on cycles when \verb+c+ is true:
-\begin{scala}
-val x = Bits(0x4142)
-val s1 = sprintf("%x %s", x, x);
-when (c) { printf("%d %s\n", x, s1); }
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{assert}
-\begin{itemize}
-\item simulation time assertions are provided by \verb+assert+ construct
-\item if assert arguments false on rising edge then
-\begin{itemize}
-\item an error is printed and
-\item simulation terminates
-\end{itemize}
-\end{itemize}
-the following will terminate after 10 clock cycles:
-\begin{scala}
-val x = Reg(init = UInt(0, 4))
-x := x + UInt(1)
-assert(x < UInt(10))
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Installation}
-\begin{itemize}
-\item on mac install:
-\begin{itemize}
-\item XCODE console tools
-\end{itemize}
-\item on windows install:
-\begin{itemize}
-\item cygwin
-\end{itemize}
-\item everywhere install:
-\begin{itemize}
-\item git
-\item g++ version 4.0 or later
-\item java
-\end{itemize}
-\item everywhere
-\begin{itemize}
-\item git clone https://github.com/ucb-bar/chisel-tutorial.git
-\end{itemize}
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]{Chisel Resources}
-\begin{center}
-\url{https://chisel.eecs.berkeley.edu/documentation.html} \\[0.25cm]
-\begin{tabular}{rl}
-\textbf{manual} & \code{manual.pdf} \\
-\textbf{bootcamp2014} & \code{bootcamp-20140206.pdf} \\
-\textbf{bootcamp2012} & \code{bootcamp-20121026.pdf} \\
-\textbf{tutorial} & \code{tutorial.pdf} \\
-\textbf{getting started} & \code{getting-started.pdf} \\
-\textbf{cs250 lectures} & \code{cs250-1.pdf}, \code{cs250-2.pdf}, \code{cs250-3.pdf} \\[0.5cm]
-\end{tabular}
-\url{https://github.com/ucb-bar/chisel/} \\[0.25cm]
-\begin{tabular}{rl}
-\textbf{setup} & \code{readme.md} \\
-\textbf{utils} & \code{src/main/scala/ChiselUtils.scala} \\[0.5cm]
-\end{tabular}
-\url{https://chisel.eecs.berkeley.edu/download.html} \\[0.25cm]
-\begin{tabular}{rl}
-\textbf{sodor} & \url{https://github.com/ucb-bar/sodor/} \\
-% \textbf{virtualbox} & \url{https://chisel.eecs.berkeley.edu/chisel-riscv.box} \\
-\end{tabular}
-\end{center}
-\end{frame}
-
-\begin{frame}{Scala Resources}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../bootcamp/figs/programming-scala.pdf} \\
-\includegraphics[height=0.4\textheight]{../bootcamp/figs/programming-in-scala.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Projects Ideas}
-
-\begin{center}
-\begin{tabular}{rl}
-\textbf{audio processing} & \code{Echo.scala} \\
-\textbf{image processing} & \code{Darken.scala} \\
-\textbf{risc processor} & \code{Risc.scala} \\
-\textbf{game of life} & \code{Life.scala} \\
-\textbf{router} & \code{Router.scala} \\
-\textbf{map/reduce} & \code{FIR.scala}\\
-\textbf{network} & \\
-\textbf{decoupled filter} & \\
-\textbf{cryptography} & \\
-\textbf{serial multiplier} & \\
-\textbf{pong} & \\
-\end{tabular}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Keep in Touch}
-\begin{center}
-\begin{tabular}{rl}
-\textbf{website} & \url{chisel.eecs.berkeley.edu} \\
-\textbf{mailing list} & \url{groups.google.com/group/chisel-users} \\
-\textbf{github} & \url{https://github.com/ucb-bar/chisel/} \\
-\textbf{features + bugs} & \url{https://github.com/ucb-bar/chisel/issues} \\
-\textbf{more questions} & \url{stackoverflow.com/quesions/tagged/chisel} \\
-\textbf{twitter} & {\tt \#chiselhdl} \\
-\textbf{me} & \url{jrb@eecs.berkeley.edu} \\
-\end{tabular}
-\end{center}
-\end{frame}
-
-\begin{frame}{Thanks}
-\begin{itemize}
-\item \textbf{Arrangements} -- Borivoje Nikolic
-\item \textbf{Educational Machines} -- Michael Zimmer
-\item \textbf{Bootcamp Materials} -- Vincent Lee, Stephen Twigg, Huy Vo
-\item \textbf{Funding} -- Department of Energy, Department of Defense
-\end{itemize}
-\end{frame}
-
-\end{document}
diff --git a/doc/bootcamp/bootcamp.tex b/doc/bootcamp/bootcamp.tex
deleted file mode 100644
index 6844a678..00000000
--- a/doc/bootcamp/bootcamp.tex
+++ /dev/null
@@ -1,2333 +0,0 @@
-\documentclass[xcolor=pdflatex,dvipsnames,table]{beamer}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{relsize}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-\input{../style/talk.tex}
-
-\title{Chisel Bootcamp}
-\author{Jonathan Bachrach}
-\date{\today}
-\institute[UC Berkeley]{EECS UC Berkeley}
-
-\begin{document}
-
-\begin{frame}
-\titlepage
-\end{frame}
-\addtocounter{framenumber}{-1}
-
-% \begin{frame}[fragile]{tutorial.scala}
-% \begin{scala}
-% package Tutorial {
-%
-% import Chisel._
-%
-% object Tutorial {
-% def main(args: Array[String]): Unit = {
-% val tut_args = args.slice(1, args.length) ++
-% Array("--targetDir", "../emulator", "--genHarness")
-% args(0) match {
-% case "gcd" =>
-% chiselMain(tut_args, () => new GCD())
-% ...
-% }
-% }
-% }
-%
-% }
-% \end{scala}
-% \end{frame}
-
-\begin{frame}[fragile]{Goals for Bootcamp}
-
-\begin{itemize}
-\item get you started with Chisel
-\item get a basic working knowledge of Chisel
-\item learn how to think in Chisel
-\item know where to get more information
-\end{itemize}
-
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Bootcamp Chisel Installation}
-\begin{scala}
--Install VirtualBox
--File->Import appliance, chisel-vm.ova
--Start
--Login (username: chisel-bootcamp, password: chisel)
--GTKWave, Emacs, etc. all installed
-\end{scala}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Development Tool Installation}
-
-\begin{itemize}
-\item {\bf MacOSX}:
-
-\begin{itemize}
-\item Install XCODE, including console tools.
-\end{itemize}
-
-\item {\bf Linux}:
-
-\begin{itemize}
-\item To prepare your Linux platform for Chisel, you will need to install the following packages:
-\begin{itemize}
-\item \verb|g++|
-\item \verb+openjdk-7-jre+
-\end{itemize}
-\item using
-\begin{itemize}
-\item \verb+sudo apt-get install+
-\end{itemize}
-\end{itemize}
-
-\end{itemize}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Getting the Chisel Tutorial}
-
-\begin{scala}
-git clone https://github.com/ucb-bar/chisel-tutorial.git
-cd chisel-tutorial
-\end{scala}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Chisel Tutorial Contents}
-\begin{FramedSemiVerb}
-chisel-tutorial/
- Makefile
- examples/ \comment{\# Contains chisel examples}
- Makefile
- build.sbt \comment{\# Contains project description}
- FullAdder.scala ...
- problems/ \comment{\# Contains skeletal files for tutorial problems}
- Makefile
- build.sbt \comment{\# Contains project description}
- Accumulator.scala ...
- solutions/ \comment{\# Contains solutions to problems}
- Makefile
- build.sbt \comment{\# Contains project description}
- Counter.scala ...
-\end{FramedSemiVerb}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Test It}
-
-\begin{bash}
-cd $TUT_DIR
-make
-\end{bash}
-
-% \begin{bash}
-% cd $TUT_DIR/examples
-% make check Parity.out
-% \end{bash}
-
-\vspace{1cm}
-\noindent
-If your system is set up correctly, you should see a messsage \verb+[success]+ followed by the total time of the run, and date and time of completion.
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Get This}
-
-\begin{center}
-\fbox{
-\url{chisel.eecs.berkeley.edu/chisel-bootcamp.pdf}
-}
-\end{center}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]
-\frametitle{Chisel}
-
-\begin{columns}[c]
-
-\column{0.55\textwidth}
-
-\begin{itemize}
-\item A hardware construction language
-\begin{itemize}
-\item ``synthesizable by construction''
-\item creates graph representing hardware
-\end{itemize}
-\item Embedded within Scala language to leverage mindshare and language design
-\item Best of hardware and software design ideas
-\item Multiple targets
-\begin{itemize}
-\item Simulation and synthesis
-\item Memory IP is target-specific \\[0.5cm]
-\end{itemize}
-\item {\color{red}{\bf Not} Scala app -> Verilog arch}
-\end{itemize}
-
-\column{0.40\textwidth}
-
-\begin{center}
-single source \\
-\includegraphics[width=0.99\textwidth]{../talks/retreat-1/figs/graph-and-targets.pdf} \\
-multiple targets \\
-\end{center}
-
-\end{columns}
-\note{creates a graph if successfully created will correctly synthesize \\[1cm]
-single source generates two different verilog outputs, one for fpga and one for asic. \\[1cm]
-surprisingly difficult to generate each. for example, chisel has abstraction for memories.}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{The Scala Programming Language}
-
-\begin{columns}[c]
-
-\column{0.75\textwidth}
-
-\begin{itemize}
-\item Object Oriented
-\begin{itemize}
-\item Factory Objects, Classes
-\item Traits, overloading etc
-\item Strongly typed with type inference
-\end{itemize}
-\item Functional
-\begin{itemize}
-\item Higher order functions
-\item Anonymous functions
-\item Currying etc
-\end{itemize}
-\item Extensible
-\begin{itemize}
-\item Domain Specific Languages (DSLs)
-\end{itemize}
-\item Compiled to JVM
-\begin{itemize}
-\item Good performance
-\item Great Java interoperability
-\item Mature debugging, execution environments
-\end{itemize}
-\item Growing Popularity
-\begin{itemize}
-\item Twitter
-\item many Universities
-\end{itemize}
-\end{itemize}
-
-\column{0.25\textwidth}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{figs/programming-scala.pdf} \\
-\includegraphics[height=0.4\textheight]{figs/programming-in-scala.pdf}
-\end{center}
-
-\end{columns}
-\note{powerful combination of scipting and type safety, \\[1cm]
-includes powerful features to support abstraction, \\[1cm]
-as makes it easy to embed DSLs, compiles to jvm}
-\end{frame}
-
-\include{scala-intro}
-
-\begin{frame}[fragile]
-\frametitle{Algebraic Graph Construction}
-
-\begin{columns}
-\column{0.35\textwidth}
-{\lstset{basicstyle={\Large\ttfamily}}
-\begin{scala}
-Mux(x > y, x, y)
-\end{scala}
-}
-
-\column{0.6\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/max2.pdf}
-\end{center}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Creating Module}
-
-\begin{columns}
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class Max2 extends Module {
- val io = new Bundle {
- val x = UInt(INPUT, 8)
- val y = UInt(INPUT, 8)
- val z = UInt(OUTPUT, 8) }
- io.z := Mux(io.x > io.y, io.x, io.y)
-}
-\end{scala}
-}
-
-\column{0.45\textwidth}
-\begin{center}
-\includegraphics[width=0.95\textwidth]{figs/Max2c.pdf} \\
-\end{center}
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Connecting Modules}
-
-\begin{columns}
-\column{0.3\textwidth}
-\begin{scala}
-val m1 =
- Module(new Max2())
-m1.io.x := a
-m1.io.y := b
-val m2 =
- Module(new Max2())
-m2.io.x := c
-m2.io.y := d
-val m3 =
- Module(new Max2())
-m3.io.x := m1.io.z
-m3.io.y := m2.io.z
-\end{scala}
-
-\column{0.6\textwidth}
-
-\begin{center}
-\includegraphics[width=0.99\textwidth]{figs/Max4.pdf} \\
-\end{center}
-\end{columns}
-
-\end{frame}
-
-
-\begin{frame}[fragile]
-\frametitle{Defining Construction Functions}
-
-\begin{columns}
-
-\column{0.45\textwidth}
-
-\begin{scala}
-def Max2(x, y) = Mux(x > y, x, y)
-\end{scala}
-\begin{scala}
-Max2(x, y)
-\end{scala}
-
-\column{0.5\textwidth}
-
-\begin{center}
-\includegraphics[width=0.95\textwidth]{figs/Max2.pdf} \\[1cm]
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Functional Construction}
-
-\begin{columns}
-
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class MaxN(n: Int, w: Int) extends Module {
- val io = new Bundle {
- val in = Vec.fill(n){ UInt(INPUT, w) }
- val out = UInt(OUTPUT, w)
- }
- io.out := io.in.reduceLeft(Max2)
-}
-\end{scala}
-}
-
-\column{0.4\textwidth}
-
-\begin{center}
-\includegraphics[width=0.99\textwidth]{figs/reduceMax.pdf} \\
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Example}
-\begin{columns}
-
-\column{0.45\textwidth}
-
-\begin{footnotesize}
-\begin{scala}
-class GCD extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 16)
- val b = UInt(INPUT, 16)
- val z = UInt(OUTPUT, 16)
- val valid = Bool(OUTPUT) }
- val x = Reg(init = io.a)
- val y = Reg(init = io.b)
- when (x > y) {
- x := x - y
- } .otherwise {
- y := y - x
- }
- io.z := x
- io.valid := y === UInt(0)
-}
-\end{scala}
-\end{footnotesize}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/gcd.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Running the Chisel Simulation}
-
-\begin{bash}
-cd ~/chisel-tutorial/examples
-make GCD.out
-\end{bash}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{bash}
-...
-PASSED
-[success] Total time: 2 s, completed Feb 28, 2013 8:14:37 PM
-\end{bash}
-}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Generating Verilog}
-
-\begin{bash}
-cd ~/chisel-tutorial/examples
-make GCD.v
-\end{bash}
-
-The Verilog source is roughly divided into three parts:
-
-\begin{enumerate}
-\item Module declaration with input and outputs
-\item Temporary wire and register declaration used for holding intermediate values
-\item Register assignments in \verb+always @ (posedge clk)+
-\end{enumerate}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{FullAdder -- Type Inference}
-
-\begin{columns}
-\column{0.4\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class FullAdder extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 1)
- val b = UInt(INPUT, 1)
- val cin = UInt(INPUT, 1)
- val sum = UInt(OUTPUT, 1)
- val cout = UInt(OUTPUT, 1)
- }
- // Generate the sum
- val a_xor_b = io.a ^ io.b
- io.sum := a_xor_b ^ io.cin
- // Generate the carry
- val a_and_b = io.a & io.b
- val b_and_cin = io.b & io.cin
- val a_and_cin = io.a & io.cin
- io.cout :=
- a_and_b | b_and_cin | a_and_cin
-}
-\end{scala}
-}
-
-\column{0.55\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../getting-started/figs/Full_Adder.jpg}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{FullAdder Verilog -- Width Inference 1}
-
-\begin{columns}
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class FullAdder extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 1)
- val b = UInt(INPUT, 1)
- val cin = UInt(INPUT, 1)
- val sum = UInt(OUTPUT, 1)
- val cout = UInt(OUTPUT, 1)
- }
- // Generate the sum
- val a_xor_b = io.a ^ io.b
- io.sum := a_xor_b ^ io.cin
- // Generate the carry
- val a_and_b = io.a & io.b
- val b_and_cin = io.b & io.cin
- val a_and_cin = io.a & io.cin
- io.cout :=
- a_and_b | b_and_cin | a_and_cin
-}
-\end{scala}
-}
-
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-module FullAdder(
- input io_a,
- input io_b,
- input io_cin,
- output io_sum,
- output io_cout);
- wire T0;
- wire a_and_cin;
- wire T1;
- wire b_and_cin;
- wire a_and_b;
- wire T2;
- wire a_xor_b;
-
- assign io_cout = T0;
- assign T0 = T1 | a_and_cin;
- assign a_and_cin = io_a & io_cin;
- assign T1 = a_and_b | b_and_cin;
- assign b_and_cin = io_b & io_cin;
- assign a_and_b = io_a & io_b;
- assign io_sum = T2;
- assign T2 = a_xor_b ^ io_cin;
- assign a_xor_b = io_a ^ io_b;
-endmodule
-\end{scala}
-}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{FullAdder2 Verilog -- Width Inference 2}
-
-\begin{columns}
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class FullAdder2 extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 2)
- val b = UInt(INPUT, 2)
- val cin = UInt(INPUT, 2)
- val sum = UInt(OUTPUT, 2)
- val cout = UInt(OUTPUT, 2)
- }
- // Generate the sum
- val a_xor_b = io.a ^ io.b
- io.sum := a_xor_b ^ io.cin
- // Generate the carry
- val a_and_b = io.a & io.b
- val b_and_cin = io.b & io.cin
- val a_and_cin = io.a & io.cin
- io.cout :=
- a_and_b | b_and_cin | a_and_cin
-}
-\end{scala}
-}
-
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-module FullAdder(
- input [1:0] io_a,
- input [1:0] io_b,
- input [1:0] io_cin,
- output[1:0] io_sum,
- output[1:0] io_cout);
- wire[1:0] T0;
- wire[1:0] a_and_cin;
- wire[1:0] T1;
- wire[1:0] b_and_cin;
- wire[1:0] a_and_b;
- wire[1:0] T2;
- wire[1:0] a_xor_b;
-
- assign io_cout = T0;
- assign T0 = T1 | a_and_cin;
- assign a_and_cin = io_a & io_cin;
- assign T1 = a_and_b | b_and_cin;
- assign b_and_cin = io_b & io_cin;
- assign a_and_b = io_a & io_b;
- assign io_sum = T2;
- assign T2 = a_xor_b ^ io_cin;
- assign a_xor_b = io_a ^ io_b;
-endmodule
-\end{scala}
-}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Using Registers}
-\begin{scala}
-// clock the new reg value on every cycle
-val y = io.x
-val z = Reg(next = y)
-\end{scala}
-
-\begin{scala}
-// clock the new reg value when the condition a > b
-val x = Reg(UInt())
-when (a > b) { x := y }
-.elsewhen (b > a) { x := z }
-.otherwise { x := w }
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Unconditional Register Update}
-
-\begin{columns}
-
-\column{0.42\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class ShiftRegister extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val out = UInt(OUTPUT, 1)
- }
- val r0 = Reg(next = io.in)
- val r1 = Reg(next = r0)
- val r2 = Reg(next = r1)
- val r3 = Reg(next = r2)
- io.out := r3
-}
-\end{scala}
-}
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/shift-register.pdf}
-\end{center}
-
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-module ShiftRegister(input clk, input reset,
- input io_in,
- output io_out);
-
- reg[0:0] r3;
- reg[0:0] r2;
- reg[0:0] r1;
- reg[0:0] r0;
-
- assign io_out = r3;
- always @(posedge clk) begin
- r3 <= r2;
- r2 <= r1;
- r1 <= r0;
- r0 <= io_in;
- end
-endmodule
-\end{scala}
-}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Register Update}
-
-\begin{columns}
-
-\column{0.47\textwidth}
-
-\begin{scala}
-class ShiftRegister extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val shift = Bool(INPUT)
- val out = UInt(OUTPUT, 1)
- }
-
- val r0 = Reg(UInt())
- val r1 = Reg(UInt())
- val r2 = Reg(UInt())
- val r3 = Reg(UInt())
-
- when (io.shift) {
- r0 := io.in
- r1 := r0
- r2 := r1
- r3 := r2
- }
- io.out := r3
-}
-\end{scala}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/enable-shift-register.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Register Update with Reset}
-
-\begin{scala}
-class EnableShiftRegister extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val shift = Bool(INPUT)
- val out = UInt(OUTPUT, 1)
- }
- // Register reset to zero
- val r0 = Reg(init = UInt(0, 1))
- val r1 = Reg(init = UInt(0, 1))
- val r2 = Reg(init = UInt(0, 1))
- val r3 = Reg(init = UInt(0, 1))
- when (io.shift) {
- r0 := io.in
- r1 := r0
- r2 := r1
- r3 := r2
- }
- io.out := r3
-}
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{UInt Literals}
-inferred width
-\begin{scala}
-UInt(1) // decimal 1-bit literal from Scala Int.
-UInt("ha") // hexadecimal 4-bit literal from string.
-UInt("o12") // octal 4-bit literal from string.
-UInt("b1010") // binary 4-bit literal from string.
-\end{scala}
-specified widths
-\begin{scala}
-UInt("h_dead_beef") // 32-bit literal of type UInt.
-UInt(1) // decimal 1-bit literal from Scala Int.
-UInt("ha", 8) // hexadecimal 8-bit literal of type UInt.
-UInt("o12", 6) // octal 6-bit literal of type UInt.
-UInt("b1010", 12) // binary 12-bit literal of type UInt.
-UInt(5, 8) // unsigned decimal 8-bit literal of type UInt.
-\end{scala}
-\end{frame}
-
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Sequential Circuit Problem -- \tt Accumulator.scala}
-\begin{itemize}
-\item write sequential circuit that sums \code{in} values
-\item in {\tt chisel-tutorial/problems/Accumulator.scala}
-\item run {\tt make Accumulator.out} until passing
-\end{itemize}
-\begin{scala}
-class Accumulator extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val out = UInt(OUTPUT, 8)
- }
-
- // flush this out ...
-
- io.out := UInt(0)
-}
-\end{scala}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{UInt Operations and Conditional Assignment}
-
-\begin{columns}
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-class BasicALU extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 4)
- val b = UInt(INPUT, 4)
- val opcode = UInt(INPUT, 4)
- val output = UInt(OUTPUT, 4)
- }
- io.output := UInt(0)
- when (io.opcode === UInt(0)) {
- io.output := io.a // pass A
- } .elsewhen (io.opcode === UInt(1)) {
- io.output := io.b // pass B
- } .elsewhen (io.opcode === UInt(2)) {
- io.output := io.a + UInt(1) // inc A by 1
- } .elsewhen (io.opcode === UInt(3)) {
- io.output := io.a - UInt(1) // dec B by 1
- } .elsewhen (io.opcode === UInt(4)) {
- io.output := io.a + UInt(4) // inc A by 4
- } .elsewhen (io.opcode === UInt(5)) {
- io.output := io.a - UInt(4) // dec A by 4
- } .elsewhen (io.opcode === UInt(6)) {
- io.output := io.a + io.b // add A and B
- } .elsewhen (io.opcode === UInt(7)) {
- io.output := io.a - io.b // sub B from A
- } .elsewhen (io.opcode === UInt(8)) {
- io.output := (io.a < io.b) // set on A < B
- } .otherwise {
- io.output := (io.a === io.b) // set on A == B
- }
-}
-\end{scala}
-}
-
-\column{0.4\textwidth}
-\begin{itemize}
-\item wire \code{io.output} defaulted to 0 and then
-\item conditionally reassigned to based on opcode
-\item unlike registers, wires are required to be defaulted
-\item wires also allow forward declarations
-\end{itemize}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{UInt Operations}
-
-\begin{center}
-\begin{tabular}{| c | c | c | }
-\hline
-Symbol & Operation & Output Type \\ \hline
-\verb!+! & Add & UInt \\ \hline
-\verb+-+ & Subtract & UInt \\ \hline
-\verb+*+ & Multiply & UInt \\ \hline
-\verb+/+ & UInt Divide & UInt \\ \hline
-\verb+%+ & Modulo & UInt \\ \hline
-\verb+~+ & Bitwise Negation & UInt \\ \hline
-\verb+^+ & Bitwise XOR & UInt\\ \hline
-\verb+&+ & Bitwise AND & UInt \\ \hline
-\verb+|+ & Bitwise OR & Bool \\ \hline
-{\color{red}\verb+===+} & Equal & Bool \\ \hline
-\verb+!=+ & Not Equal & Bool \\ \hline
-\verb+>+ & Greater & Bool \\ \hline
-\verb+<+ & Less & Bool \\ \hline
-\verb+>=+ & Greater or Equal & Bool \\ \hline
-\verb+<=+ & Less or Equal & Bool \\ \hline
-\end{tabular}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Bit Extraction}
-\begin{scala}
-// extracts the x through y bits of value
-val x_to_y = value(x, y)
-\end{scala}
-
-\begin{scala}
-// extract the x-th bit from value
-val x_of_value = value(x)
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{ByteSelector}
-
-\begin{scala}
-class ByteSelector extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 32)
- val offset = UInt(INPUT, 2)
- val out = UInt(OUTPUT, 8)
- }
- io.out := UInt(0, width = 8)
- when (io.offset === UInt(0)) {
- io.out := io.in(7,0) // pull out lowest byte
- } .elsewhen (io.offset === UInt(1)) {
- io.out := io.in(15,8) // pull out second byte
- } .elsewhen (io.offset === UInt(2)) {
- io.out := io.in(23,16) // pull out third byte
- } .otherwise {
- io.out := io.in(31,24) // pull out highest byte
- }
-}
-\end{scala}
-
-\end{frame}
-
-% \setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-% \begin{frame}[fragile]{Instruction Decoder}
-%
-% {\lstset{basicstyle={\scriptsize\ttfamily}}
-% \begin{scala}
-% class LoadShiftRegister extends Module {
-% val io = new Bundle {
-% val inst = UInt(INPUT, 32)
-% val rs0 = UInt(OUTPUT, 8)
-% val rs1 = UInt(OUTPUT, 8)
-% val rs2 = UInt(OUTPUT, 8)
-% val isAdd = Bool(OUTPUT)
-% val isSub = Bool(OUTPUT)
-% val isMul = Bool(OUTPUT)
-% val isDiv = Bool(OUTPUT)
-% }
-% io.isAdd := ...
-% io.isSub := ...
-% io.isMul := ...
-% io.isDiv := ...
-% io.rs0 := ...
-% io.rs1 := ...
-% io.rs2 := ...
-% }
-% \end{scala}
-% }
-%
-% \end{frame}
-% \setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{Bit Concatenation and Filling}
-You concatenating bits using \verb+Cat+:
-\begin{scala}
-val A = UInt(width = 32)
-val B = UInt(width = 32)
-val bus = Cat(A, B) // concatenate A and B
-\end{scala}
-
-and replicate bits using \verb+Fill+:
-\begin{scala}
-// Replicate a bit string multiple times.
-val usDebt = Fill(3, UInt("hA"))
-\end{scala}
-
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{LFSR16 -- \tt problems/lfsr16.scala}
-
-\begin{scala}
-class LFSR16 extends Module {
- val io = new Bundle {
- val inc = Bool(INPUT)
- val out = UInt(OUTPUT, 16)
- }
- // ...
- io.out := UInt(0)
-}
-\end{scala}
-\begin{itemize}
-\item \verb+reg+, \verb+cat+, \verb+extract+, \verb+^+
-\item init reg to 1
-\item updates when \verb+inc+ asserted
-\end{itemize}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/LFSR16.pdf}
-\end{center}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{UInt Bit Inference}
-\begin{columns}
-\column{0.4\textwidth}
-\begin{scala}
-class HiLoMultiplier()
- extends Module {
- val io = new Bundle {
- val A = UInt(INPUT, 16)
- val B = UInt(INPUT, 16)
- val Hi = UInt(OUTPUT, 16)
- val Lo = UInt(OUTPUT, 16)
- }
- val mult = io.A * io.B
- io.Lo := mult(15, 0)
- io.Hi := mult(31, 16)
-}
-\end{scala}
-
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-module HiLoMultiplier(
- input [15:0] io_A,
- input [15:0] io_B,
- output[15:0] io_Hi,
- output[15:0] io_Lo);
-
- wire[15:0] T0;
- wire[31:0] mult; // inferred as 32 bits
- wire[15:0] T1;
-
- assign io_Lo = T0;
- assign T0 = mult[4'hf:1'h0];
- assign mult = io_A * io_B;
- assign io_Hi = T1;
- assign T1 = mult[5'h1f:5'h10];
-endmodule
-\end{scala}
-}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Bit Inference Rules}
-
-\begin{center}
-\begin{tabular}{| l | l | l | }
-\hline
-Operation & Result Bit Width \\ \hline
-\verb!Z = X + Y! & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = X - Y+ & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = X & Y+ & min(Width(X), Width(Y)) \\ \hline
-\verb+Z = X | Y+ & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = X ^ Y+ & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = ~X+ & Width(X) \\ \hline
-\verb+Z = Mux(C, X, Y)+ & max(Width(X), Width (Y)) \\ \hline
-\verb+Z = X * Y+ & Width(X) + Width(Y) \\ \hline
-\verb+Z = X << n+ & Width(X) + n \\ \hline
-\verb+Z = X >> n+ & Width(X) - n \\ \hline
-\verb+Z = Cat(X, Y)+ & Width(X) + Width(Y) \\ \hline
-\verb+Z = Fill(n, x)+ & Width(X) + n \\ \hline
-\end{tabular}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Bool Type}
-The Chisel Bool is used to represent the result of logical expressions:
-\begin{scala}
-val change = io.a === io.b // change gets Bool type
-when (change) { // execute if change is true
- ...
-}
-\end{scala}
-
-You can instantiate a Bool value like this:
-\begin{scala}
-val true_value = Bool(true)
-val false_value = Bool(false)
-\end{scala}
-
-You can cast an UInt to a Bool as follows:
-\begin{scala}
-val bit = UInt(width = 1) ...
-when (bit.toBool) { ... }
-\end{scala}
-
-You can use a Bool as an UInt:
-\begin{scala}
-val bit = UInt(width = 1) ...
-bit := a > b
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Bits Subtype Hierarchy}
-\begin{itemize}
-\item \verb+SInt+ is a signed integer type
-\end{itemize}
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/bits-hierarchy.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]{Bundles}
-
-\begin{columns}
-\column{0.55\textwidth}
-\begin{scala}
-class MyFloat extends Bundle {
- val sign = Bool()
- val exponent = UInt(width = 8)
- val significand = UInt(width = 23)
-}
-
-val x = new MyFloat()
-val xs = x.sign
-\end{scala}
-
-\column{0.35\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{../cs250/figs/myfloat.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Ports}
-
-\begin{columns}
-\column{0.55\textwidth}
-
-\textbf{Data object with directions assigned to its members}
-
-\begin{scala}
-class Decoupled extends Bundle {
- val data = UInt(INPUT, 32)
- val valid = Bool(OUTPUT)
- val ready = Bool(INPUT)
-}
-\end{scala}
-
-\textbf{Direction assigned at instantiation time}
-
-\begin{scala}
-class ScaleIO extends Bundle {
- val in = new MyFloat().asInput
- val scale = new MyFloat().asInput
- val out = new MyFloat().asOutput
-}
-\end{scala}
-
-\column{0.35\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{../cs250/figs/fifoio.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Instantiating Modules}
-
-\begin{columns}
-
-\column{0.4\textwidth}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-// A 4-bit adder with carry in and carry out
-class Adder4 extends Module {
- val io = new Bundle {
- val A = UInt(INPUT, 4)
- val B = UInt(INPUT, 4)
- val Cin = UInt(INPUT, 1)
- val Sum = UInt(OUTPUT, 4)
- val Cout = UInt(OUTPUT, 1)
- }
- // Adder for bit 0
- val Adder0 = Module(new FullAdder())
- Adder0.io.a := io.A(0)
- Adder0.io.b := io.B(0)
- Adder0.io.cin := io.Cin
- val s0 = Adder0.io.sum
- // Adder for bit 1
- val Adder1 = Module(new FullAdder())
- Adder1.io.a := io.A(1)
- Adder1.io.b := io.B(1)
- Adder1.io.cin := Adder0.io.cout
- val s1 = Cat(Adder1.io.sum, s0)
- ...
- // Adder for bit 3
- val Adder3 = Module(new FullAdder())
- Adder3.io.a := io.A(3)
- Adder3.io.b := io.B(3)
- Adder3.io.cin := Adder2.io.cout
- io.Sum := Cat(Adder3.io.sum, s2)
- io.Cout := Adder3.io.cout
-}
-\end{scala}
-}
-
-\column{0.5\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../getting-started/figs/4_Bit_Adder.jpg}
-\end{center}
-
-\begin{itemize}
-\item inherits from \verb+Module+ class,
-\item contains an interface stored in a port field named \verb+io+, and
-\item wires together subcircuits in its constructor.
-\end{itemize}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Vecs}
-constructing vecs
-\begin{scala}
-val myVec1 = Vec.fill( ) { }
-val myVec2 = Vec(, , ...)
-\end{scala}
-
-creating a vec of wires
-\begin{scala}
-val ufix5_vec10 = Vec.fill(10) { UInt(width = 5) }
-\end{scala}
-
-
-creating a vec of regs
-\begin{scala}
-val reg_vec32 = Vec.fill(32){ Reg() }
-\end{scala}
-
-writing
-\begin{scala}
-reg_vec32(1) := UInt(0)
-\end{scala}
-
-reading
-\begin{scala}
-val reg5 = reg_vec(5)
-\end{scala}
-
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Vec Shift Reg -- problems/VecShiftRegister.scala}
-
-\begin{itemize}
-\item add loadability to shift register
-\item change interface to use vec's
-\end{itemize}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class VecShiftRegister extends Module {
- val io = new Bundle {
- val ins = Vec.fill(4){ UInt(INPUT, 1) }
- val load = Bool(INPUT)
- val shift = Bool(INPUT)
- val out = UInt(OUTPUT, 4)
- }
- val delays = Vec.fill(4){ Reg(UInt(width = 4)) }
- when ( ... ) {
- // fill in here ...
- } .elsewhen (io.shift) {
- ...
- }
- io.out := delays(3)
-}
-\end{scala}
-}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-% \begin{frame}[fragile]{Scala Console}
-% \begin{FramedVerb}
-% \end{FramedVerb}
-% \end{frame}
-
-\begin{frame}[fragile]{Defining a Tester}
-
-\begin{columns}
-\column{0.45\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-package Tutorial
-import Chisel._
-
-class ByteSelector extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 32)
- val offset = UInt(INPUT, 2)
- val out = UInt(OUTPUT, 8)
- }
- io.out := UInt(0, width=8)
- ...
-}
-
-class BSTests(c: ByteSelector) extends Tester(c) {
- val test_in = 12345678
- for (t <- 0 until 4) {
- poke(c.io.in, test_in)
- poke(c.io.offset, t)
- step(1)
- val ref_out = (test_in >> (t * 8)) & 0xFF
- expect(c.io.out, ref_out)
- }
-}
-\end{scala}
-}
-\begin{center}
-\includegraphics[width=0.8\textwidth]{../tutorial/figs/DUT.pdf}
-\end{center}
-
-\column{0.45\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-class Tester[T <: Module]
- (val c: T, val isTrace: Boolean = true) {
- var t: Int
- var ok: Boolean
- val rnd: Random
- def reset(n: Int = 1)
- def step(n: Int): Int
- def peek(data: Aggregate): Array[BigInt]
- def peekAt(data: Mem[T], index: Int)
- def peek(data: Bits): BigInt
- def int(x: Boolean): BigInt
- def int(x: Int): BigInt
- def int(x: Bits): BigInt
- def poke(data: Aggregate, x: Array[BigInt])
- def pokeAt(data: Mem[T], index: Int, x: BigInt)
- def poke(data: Bits, x: BigInt)
- def expect (good: Boolean, msg: String): Boolean
- def expect (data: Bits, target: BigInt): Boolean
-}
-\end{scala}
-}
-\begin{tiny}
-\noindent
-which binds a tester to a module
-and allows users to write tests using the given debug protocol. In particular, users utilize:
-\begin{itemize}
-\item \code{poke} to set input port and state values,
-\item \code{step} to execute the circuit one time unit,
-\item \code{peek} to read port and state values, and
-\item \code{expect} to compare peeked circuit values to expected arguments.
-\end{itemize}
-\end{tiny}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Simulation Debug Output}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-> cd chisel-tutorial/examples
-> make ByteSelector.out
-STARTING ../emulator/problems/ByteSelector
----
-INPUTS
- INPUT(ByteSelector__io_in.ByteSelector) = 12345678
- INPUT(ByteSelector__io_offset.ByteSelector) = 0
-OUTPUTS
- READ OUTPUT(ByteSelector__io_out.ByteSelector) = 78
- EXPECTED: OUTPUT(ByteSelector__io_out.ByteSelector) = 78
- SUCCESS
----
-INPUTS
- INPUT(ByteSelector__io_in.ByteSelector) = 12345678
- INPUT(ByteSelector__io_offset.ByteSelector) = 1
-OUTPUTS
- READ OUTPUT(ByteSelector__io_out.ByteSelector) = 97
- EXPECTED: OUTPUT(ByteSelector__io_out.ByteSelector) = 97
- SUCCESS
----
-...
----
-INPUTS
- INPUT(ByteSelector__io_in.ByteSelector) = 12345678
- INPUT(ByteSelector__io_offset.ByteSelector) = 3
-OUTPUTS
- READ OUTPUT(ByteSelector__io_out.ByteSelector) = 0
- EXPECTED: OUTPUT(ByteSelector__io_out.ByteSelector) = 0
- SUCCESS
-PASSED // Final pass assertion
-[success] Total time: 26 s, ...
-\end{scala}
-}
-
-\end{frame}
-
-\begin{frame}{Testbench Ingredients}
-
-In particular, users utilize:
-\begin{itemize}
-\item \code{poke} to set input port and state values,
-\item \code{step} to execute the circuit one time unit,
-\item \code{peek} to read port and state values, and
-\item \code{expect} to compare peeked circuit values to expected arguments.
-\end{itemize}
-
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Testbench for MaxN -- \tt MaxN.scala}
-\begin{columns}
-\column{0.49\textwidth}
-
-\begin{itemize}
-\item write a testbench for MaxN
-\end{itemize}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class MaxN(val n: Int, val w: Int)
- extends Module {
-
- def Max2(x: UInt, y: UInt) =
- Mux(x > y, x, y)
-
- val io = new Bundle {
- val ins = Vec.fill(n){ UInt(INPUT, w) }
- val out = UInt(OUTPUT, w)
- }
- io.out := io.ins.reduceLeft(Max2)
-}
-\end{scala}
-}
-\begin{scala}
-// returns random int in 0..lim-1
-val x = rnd.nextInt(lim)
-\end{scala}
-
-\column{0.42\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class MaxNTests(c: MaxN) extends Tester(c) {
- for (i <- 0 until 10) {
- for (j <- 0 until c.n) {
- // FILL THIS IN HERE
- poke(c.io.ins(0), 0)
- }
- // FILL THIS IN HERE
- step(1)
- expect(c.io.out, 1)
- }
-}
-\end{scala}
-}
-\end{columns}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{Dynamically Accessed Vec}
-\begin{scala}
-class MemorySearch extends Module {
- val io = new Bundle {
- val target = UInt(INPUT, 4)
- val en = Bool(INPUT)
- val address = UInt(OUTPUT, 3)
- val done = Bool(OUTPUT)
- }
- val index = Reg(init = UInt(0, width = 3))
- val list = Vec(UInt(0), UInt(4), UInt(15), UInt(14),
- UInt(2), UInt(5), UInt(13)){ UInt(width = 4) }
- val memVal = list(index)
- val done = !io.en && ((memVal === io.target) || (index === UInt(7)))
- when (io.en) {
- index := UInt(0)
- } .elsewhen (done === Bool(false)) {
- index := index + UInt(1)
- }
- io.done := done
- io.address := index
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{RAM}
-RAM is supported using the \code{Mem} construct
-
-\begin{scala}
-val m = Mem(Bits(width = 32), 32)
-\end{scala}
-
-\noindent
-where
-\begin{itemize}
-\item writes to Mems are positive-edge-triggered
-\item reads are either combinational or positive-edge-triggered
-\item ports are created by applying a \code{UInt} index
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{32-entry Register File}
-
-\begin{scala}
-val regs = Mem(Bits(width = 32), 32)
-when (wrEn) {
- regs(wrAddr) := wrData
-}
-val iDat = regs(iAddr)
-val mDat = regs(mAddr)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.55\textheight]{../cs250/figs/mem.pdf}
-\end{center}
-
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Load/Search Mem -- \tt DynamicMemorySearch.scala}
-\begin{scala}
-class DynamicMemorySearch extends Module {
- val io = new Bundle {
- val isWr = Bool(INPUT)
- val wrAddr = UInt(INPUT, 3)
- val data = UInt(INPUT, 4)
- val en = Bool(INPUT)
- val target = UInt(OUTPUT, 3)
- val done = Bool(OUTPUT)
- }
- val index = Reg(init = UInt(0, width = 3))
- val memVal = ...
- val done = !io.en && ((memVal === io.data) || (index === UInt(7)))
- // ...
- when (io.en) {
- index := UInt(0)
- } .elsewhen (done === Bool(false)) {
- index := index + UInt(1)
- }
- io.done := done
- io.target := index
-}
-\end{scala}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]{Sequential Read Ports}
-Sequential read ports are inferred when:
-\begin{itemize}
-\item optional parameter \code{seqRead} is set and
-\item read address is a reg
-\end{itemize}
-
-\begin{scala}
-val ram1r1w = Mem(UInt(width = 32), 1024, seqRead = true)
-val reg_raddr = Reg(UInt())
-when (wen) { ram1r1w(waddr) := wdata }
-when (ren) { reg_raddr := raddr }
-val rdata = ram1r1w(reg_raddr)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../cs250/figs/mem-seq-read.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Stack}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-class Stack(depth: Int) extends Module {
- val io = new Bundle {
- val dataIn = UInt(INPUT, 32)
- val dataOut = UInt(OUTPUT, 32)
- val push = Bool(INPUT)
- val pop = Bool(INPUT)
- val en = Bool(INPUT)
- }
- // declare the memory for the stack
- val stack_mem = Mem(UInt(width = 32), depth, seqRead = false)
- val sp = Reg(init = UInt(0, width = log2Up(depth)))
- val dataOut = Reg(init = UInt(0, width = 32))
- // Push condition - make sure stack isn't full
- when(io.en && io.push && (sp != UInt(depth-1))) {
- stack_mem(sp + UInt(1)) := io.dataIn
- sp := sp + UInt(1)
- }
- // Pop condition - make sure the stack isn't empty
- .elsewhen(io.en && io.pop && (sp > UInt(0))) {
- sp := sp - UInt(1)
- }
- when(io.en) {
- dataOut := stack_mem(sp)
- }
- io.dataOut := dataOut
-}
-\end{scala}
-}
-
-\end{frame}
-
-\begin{frame}[fragile]{Scripting Hardware Generation}
-
-\begin{columns}
-\column{0.5\textwidth}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-// A n-bit adder with carry in and carry out
-class Adder(n: Int) extends Module {
- val io = new Bundle {
- val A = UInt(INPUT, n)
- val B = UInt(INPUT, n)
- val Cin = UInt(INPUT, 1)
- val Sum = UInt(OUTPUT, n)
- val Cout = UInt(OUTPUT, 1)
- }
- // create a vector of FullAdders
- val FAs = Vec.fill(n){ Module(new FullAdder()).io }
- val carry = Vec.fill(n+1){ UInt(width = 1) }
- val sum = Vec.fill(n){ Bool() }
-
- // first carry is the top level carry in
- carry(0) := io.Cin
-
- // wire up the ports of the full adders
- for(i <- 0 until n) {
- FAs(i).a := io.A(i)
- FAs(i).b := io.B(i)
- FAs(i).cin := carry(i)
- carry(i+1) := FAs(i).cout
- sum(i) := FAs(i).sum.toBool()
- }
- io.Sum := sum.toBits().toUInt()
- io.Cout := carry(n)
-}
-\end{scala}
-}
-
-\column{0.4\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../getting-started/figs/4_Bit_Adder.jpg}
-\end{center}
-\end{columns}
-
-\end{frame}
-
-\input{../talks/microsoft/libs-to-langs-guts-in-scala.tex}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Mul Lookup Table Problem -- \tt Mul.scala}
-\begin{itemize}
-\item write 16x16 multiplication table using \code{Vec}
-\end{itemize}
-\begin{scala}
-class Mul extends Module {
- val io = new Bundle {
- val x = UInt(INPUT, 4)
- val y = UInt(INPUT, 4)
- val z = UInt(OUTPUT, 8)
- }
- val muls = new ArrayBuffer[UInt]()
-
- // flush this out ...
-
- io.z := UInt(0)
-}
-\end{scala}
-
-hint:
-\begin{scala}
-val tab = Vec(muls)
-io.z := tab(Cat(io.x, io.y))
-\end{scala}
-
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile]
-\frametitle{Valid Wrapper}
-
-\begin{columns}
-
-\column{0.65\textwidth}
-
-\begin{footnotesize}
-\begin{scala}
-class Valid[T <: Data](dtype: T) extends Bundle {
- val data = dtype.clone.asOutput
- val valid = Bool(OUTPUT)
- override def clone = new Valid(dtype)
-}
-
-class GCD extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 16)
- val b = UInt(INPUT, 16)
- val out = new Valid(UInt(OUTPUT, 16))
- } }
- ...
- io.out.data := x
- io.out.valid := y === UInt(0)
-}
-
-\end{scala}
-\end{footnotesize}
-
-\column{0.3\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../talks/retreat-1/figs/valid.pdf}
-\end{center}
-
-\end{columns}
-\note{now gcd had a valid signal on its output. \\[1cm]
-we can generalize this idea by defining a wrapper class that bundles a valid with a data signal. \\[1cm]
-now we can rewrite GCD using an interface using this valid wrapper for its output. }
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Function Filters}
-
-\begin{footnotesize}
-\begin{scala}
-abstract class Filter[T <: Data](dtype: T) extends Module {
- val io = new Bundle {
- val in = Valid(dtype).asInput
- val out = Valid(dtype).asOutput
-} }
-
-class FunctionFilter[T <: Data](dtype: T, f: T => T) extends Filter(dtype) {
- io.out.valid := io.in.valid
- io.out.bits := f(io.in)
-}
-\end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/sketching13/figs/function-filter.pdf}
-\end{center}
-
-\note{suppose we want to write hardware filters. \\[1cm]
-one way to create a reusable filter would be \\[1cm]
-to create a filter class that takes a function as argument that definines its filter operation.}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Clipping Filter}
-
-\begin{footnotesize}
-\begin{scala}
-def clippingFilter[T <: Bits](limit: Int, dtype: T) =
- new FunctionFilter(dtype, x => min(limit, max(-limit, x)))
-\end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/retreat-1/figs/clipping-filter.pdf}
-\end{center}
-\note{using this reusable substrate then it is easy to create an instance of a filter.}
-\end{frame}
-
-
-\begin{frame}[fragile]
-\frametitle{Shifting Filter}
-
-\begin{footnotesize}
-\begin{scala}
-def shiftingFilter[T <: Bits](shift: Int, dtype: T) =
- new FunctionFilter(dtype, x => x >> shift)
-\end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/retreat-1/figs/shifting-filter.pdf}
-\end{center}
-\note{and reuse it for shift filter}
-\end{frame}
-
-\begin{frame}[fragile]{Testing Decoupled Circuits}
-
-\begin{itemize}
-\item using ovars for outputs
-\item need to check outputs directly using \verb+litValue+
-\end{itemize}
-\begin{scala}
-class GCDTests(c: GCD) extends Tester(c) {
- val (a, b, z) = (64, 48, 16)
- do {
- poke(c.io.a, a)
- poke(c.io.b, b)
- step(1)
- } while (t <= 1 || peek(c.io.v) == 0)
- expect(c.io.z, z)
-}
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Chained Filter}
-
-\begin{footnotesize}
-\begin{scala}
-class ChainedFilter[T <: Num](dtype: T) extends Filter(dtype) = {
- val shift = Module(new ShiftFilter(2, dtype))
- val clipper = Module(new ClippingFilter(1 << 7, dtype))
- io.in <> shift.io.in
- shift.io.out <> clipper.io.in
- clipper.io.out <> io.out
-}
-\end{scala}
-% \begin{scala}
-% class ChainedFilter[T <: Num](dtype: T) extends Filter(dtype) = {
-% val fir = new TstFIR(dtype)
-% val shift = new ShiftFilter(2, dtype)
-% val clipper = new ClippingFilter(1 << 7, dtype)
-% io.in <> fir.io.in
-% fir.io.out <> shift.io.in
-% shift.io.out <> clipper.io.in
-% clipper.io.out <> io.out
-% }
-% \end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/sketching13/figs/chained-filter2.pdf}
-\end{center}
-\note{and chain together...}
-\end{frame}
-
-\begin{frame}[fragile]{Predicate Filter}
-\begin{scala}
-class PredicateFilter[T <: Data](dtype: T, f: T => Bool)
- extends Filter(dtype) {
- io.out.valid := io.in.valid && f(io.in.bits)
- io.out.bits := io.in.bits
-}
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{figs/predicate-filter.pdf}
-\end{center}
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Predicate Filtering -- \tt SingleEvenFilter.scala}
-\begin{itemize}
-\item write filter that lets only even single digit numbers through
-\end{itemize}
-\begin{scala}
-object SingleFilter {
- def apply[T <: UInt](dtype: T) = // FILL IN FUNCTION BELOW
- Module(new PredicateFilter(dtype, (x: T) => Bool(false)))
-}
-
-object EvenFilter {
- def apply[T <: UInt](dtype: T) = // FILL IN FUNCTION BELOW
- Module(new PredicateFilter(dtype, (x: T) => Bool(false)))
-}
-
-class SingleEvenFilter[T <: UInt](dtype: T) extends Filter(dtype) {
- // FILL IN CONSTRUCTION AND WIRING
- io.out := UInt(0)
-}
-\end{scala}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}[fragile, shrink]
-\frametitle{Functional Composition}
-
-% \begin{itemize}
-% \item natural
-% \item reusable
-% \item composable
-% \end{itemize}
-% \vskip1cm
-
-\begin{Large}
-\begin{columns}
-
-\column{0.45\textwidth}
-\verb+Map(ins, x => x * y)+ \\
-\begin{center}
-\includegraphics[height=0.6\textheight]{../bootcamp/figs/map.pdf} \\[2cm]
-\end{center}
-
-\column{0.45\textwidth}
-\vskip2mm
-\verb+Chain(n, in, x => f(x))+ \\
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../bootcamp/figs/chain.pdf} \\
-\end{center}
-
-\verb+Reduce(ins, Max)+ \\
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../bootcamp/figs/reduce.pdf} \\
-\end{center}
-
-\end{columns}
-
-\end{Large}
-\note{the previous example showed a simple use of functional programming. \\[1cm]
-Scala provides strong support for functional programming and
-it turns out that functional programming is a powerful way to define hardware. \\[1cm]
-for example, you can create a parallel set of blocks using map and reduce to creation reduction trees and chain to create a pipeline.}
-\end{frame}
-
-\begin{frame}[fragile]{Flo Map / Reduce Generator}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-object FloDelays {
- def apply(x: Flo, n: Int): List[Flo] =
- if (n <= 1) List(x) else x :: FloDelays(RegNext(x), n-1)
-}
-object FloFIR {
- def apply(ws: Seq[Flo], x: T): T =
- (ws, FloDelays(x, ws.length)).zipped.map( _ * _ ).reduce( _ + _ )
-}
-class FIR extends Module {
- val io = new Bundle { val x = Flo(INPUT); val z = Flo(OUTPUT) }
- val ws = Array(Flo(0.25), Flo(0.75))
- io.z := FloFIR(ws, io.x)
-}
-\end{scala}
-}
-\begin{center}
-\includegraphics[height=0.35\textheight]{../cs294-88/lectures/advanced-chisel/figs/inner-product-fir.png}
-\end{center}
-\note{as an advanced example, consider writing an FIR filter which is defined by the equation below. \\[1cm]
-essentially it's a sum of products of coefficients and delayed versions of input.\\[1cm]
-we can write this quite simply using map and reduce as above.}
-\end{frame}
-
-\begin{frame}[fragile]{Generic Map / Reduce Generator}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-object Delays {
- def apply[U <: Data](x: U, n: Int): List[U] =
- if (n <= 1) List(x) else x :: Delays(RegNext(x), n-1)
-}
-object GenFIR {
- def apply[T <: Data with Num[T]](ws: Seq[T], x: T): T =
- (ws, Delays(x, ws.length)).zipped.map( _ * _ ).reduce( _ + _ )
-}
-class FIR extends Module {
- val io = new Bundle { val x = Flo(INPUT); val z = Flo(OUTPUT) }
- val ws = Array(Flo(0.25), Flo(0.75))
- io.z := GenFIR(ws, io.x)
-}
-\end{scala}
-}
-\begin{center}
-\includegraphics[height=0.35\textheight]{../cs294-88/lectures/advanced-chisel/figs/inner-product-fir.png}
-\end{center}
-\note{as an advanced example, consider writing an FIR filter which is defined by the equation below. \\[1cm]
-essentially it's a sum of products of coefficients and delayed versions of input.\\[1cm]
-we can write this quite simply using map and reduce as above.}
-\end{frame}
-
-\begin{frame}[fragile]{Chisel Standard Library -- \tt ChiselUtil.scala}
-\begin{center}
-\begin{tabular}{rl}
-{\bf Bits Properities} & \code{log2Up}, \code{log2Down}, \code{isPow2}, \code{PopCount}\\
-{\bf Numeric Utilities} & \code{LFSR16}, \code{Reverse}, \code{FillInterleaved} \\
-{\bf Stateful Functions} & \code{ShiftRegister}, \code{Counter} \\
-{\bf Priority Encoding Functions} & \code{UIntToOH}, \code{OHToUInt}, \code{Mux1H} \\
-{\bf Priority Encoders} & \code{PriorityEncoder}, \code{PriorityEncoderOH} \\
-{\bf Vec Construction} & \code{Vec.fill}, \code{Vec.tabulate} \\
-{\bf Vec Functional} & \code{forall}, \code{exists}, \code{contains}, ... \\
-{\bf Queues and Pipes} & \code{Decoupled}, \code{Queue}, \code{Valid}, \code{Pipe} \\
-{\bf Arbiters} & \code{ArbiterIO}, \code{Arbiter}, \code{RRArbiter} \\
-\end{tabular}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Queues}
-\begin{itemize}
-\item Required parameter \verb+entries+ controls depth
-\item The width is determined from the inputs.
-\end{itemize}
-\begin{scala}
-class QueueIO[T <: Data](type: T, entries: Int) extends Bundle {
- val enq = Decoupled(data.clone).flip
- val deq = Decoupled(data.clone)
- val count = UFix(OUTPUT, log2Up(entries+1))
-}
-
-class Queue[T <: Data]
- (type: T, entries: Int,
- pipe: Boolean = false,
- flow: Boolean = false
- flushable: Boolean = false)
- extends Module
-\end{scala}
-\begin{scala}
-val q = new Queue(UInt(), 16)
-q.io.enq <> producer.io.out
-consumer.io.in <> q.io.deq
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Multiple Clock Domains}
-Clocks are first class and take a name argument:
-\begin{scala}
-class Clock (val name: String) extends Node {
-}
-\end{scala}
-\noindent
-and when constructed define a clock at top-level with the given name:
-\begin{scala}
-val clkA = new Clock("A")
-\end{scala}
-
-There is a builtin implicit clock that state elements use by default:
-\begin{scala}
-class Module {
- def clock(): Clock
- def reset(): Bool
- ...
-}
-\end{scala}
-
-% Clocks can be defined from other clocks:
-% \begin{scala}
-% val clock2 = clock1 * 2
-% val clock3 = clock1 / 2
-% \end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Specifying a Clock Domain}
-The clock for state elements and modules can be specified:
-\begin{scala}
-Reg(... explClock: Clock = clock())
-Mem(... explClock: Clock = clock())
-Module(... explClock: Clock = clock())
-\end{scala}
-
-For example, a register can be created in a different clock domain as follows:
-\begin{scala}
-val reg = Reg(UInt(), explClock = clock2)
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Crossing Clock Domains}
-The most general technique to send data between domains is using an asynchronous queue:
-
-\begin{scala}
-class AsyncQueue[T <: Data]
- (dataType: T, depth: Int, enq_clk: Clock, deq_clock: Clock) extends Module
-\end{scala}
-
-Using these queues, we can then move a signalA from clock domains clockA to signalB in clockB:
-
-\begin{scala}
-val queue = new AsyncQueue(Uint(width = 32), 2, clockA, clockB)
-fifo.enq.bits := signalA
-signalB := fifo.deq.bits
-fifo.valid := condA
-fifo.ready := condB
-...
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Multiple Clocks -- \tt MultipleClockDomains.scala}
-\begin{scala}
-class MultiClockDomain extends Module {
- val io = new Bundle {
- val start = Bool(INPUT)
- val sum = Decoupled(UInt(OUTPUT))
- }
- val fastClock = new Clock()
- val slowClock = new Clock()
- ...
-}
-
-class MultiClockDomainTests(c: MultiClockDomain)
- extends Tester(c, Array(c.io)) {
- val clocks = new HashMap[Clock, Int]
- clocks(Module.implicitClock) = 2
- clocks(c.fastClock) = 4
- clocks(c.slowClock) = 6
- setClocks(clocks)
- ...
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Creating Your Own Project}
-directory structure
-\begin{bash}
-Hello/
- build.sbt # scala configuration file
- Hello.scala # your source file
-\end{bash}
-
-\end{frame}
-
-\begin{frame}[fragile]{Writing Your Source File}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-package Hello
-import Chisel._
-
-class Hello extends Module {
- val io = new Bundle {
- val out = UInt(OUTPUT, 8) }
- io.out := UInt(33)
-}
-
-class HelloTests(c: Hello) extends Tester(c) {
- step(1)
- expect(c.io.out, 33)
-}
-
-object Hello {
- def main(args: Array[String]): Unit = {
- val args = Array("--backend", "c", "--genHarness", "--compile", "--test")
- chiselMainTest(args, () => Module(new Hello())) {
- c => new HelloTests(c) }
-} }
-\end{scala}
-}
-
-\end{frame}
-
-\begin{frame}[fragile]{Setting Up Your SBT Configuration File}
-\begin{scala}
-scalaVersion := "2.10.2"
-
-addSbtPlugin("com.github.scct" % "sbt-scct" % "0.2")
-
-libraryDependencies +=
- "edu.berkeley.cs" %% "chisel" % "latest.release"
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Compiling and Running}
-Producing C++
-\begin{bash}
-sbt run "--backend c"
-\end{bash}
-
-Producing Verilog
-\begin{bash}
-sbt run "--backend v"
-\end{bash}
-
-Running the Chisel Tests
-\begin{bash}
-sbt run "--backend c --compile --test --genHarness"
-\end{bash}
-
-\end{frame}
-
-\begin{frame}[fragile]{chiselMain(Test) Command Line Arguments}
-\begin{scala}
-sbt
-sbt> compile // compiles Chisel Scala code
-sbt> run // compile and run Chisel Scala Code
-sbt> run --backend c // produces C++ files
-sbt> exit
-\end{scala}
-
-with a complete set of command line arguments being:\\[2mm]
-
-\begin{tabular}{lll}
-\verb+--backend v+ & generate verilog \\
-\verb+--backend c+ & generate C++ (default)\\
-\verb+--vcd+ & enable vcd dumping \\
-\verb+--targetDir+ & target pathname prefix \\
-\verb+--genHarness+ & generate harness file for C++ \\
-\verb+--debug+ & put all wires in C++ class file \\
-\verb+--compile+ & compiles generated C++ \\
-\verb+--test+ & runs tests using C++ app \\
-\end{tabular}
-\end{frame}
-
-\setbeamercolor{frametitle}{bg=\frametitleproblemcolor}
-\begin{frame}[fragile]{Make Your Own Project}
-set hello project up
-\begin{bash}
-cd ~
-mkdir hello
-cp -r ~/chisel-tutorial/hello/* hello
-cd hello
-sbt run
-\end{bash}
-make a change
-\begin{itemize}
-\item make output a function of an new input
-\end{itemize}
-\end{frame}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\begin{frame}{Chisel Workflow}
-\begin{center}
-\includegraphics[height=0.9\textheight]{../bootcamp/figs/chisel-workflow.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]{printf / sprintf}
-\begin{itemize}
-\item during simulation
-\begin{itemize}
-\item \verb+printf+ prings the formatted string to the console on rising clock edges
-\item \verb+sprintf+ returns the formatted string as a bit vector
-\end{itemize}
-\item format specifiers are
-\begin{itemize}
-\item \verb+%b+ -- binary number
-\item \verb+%d+ -- decimal number
-\item \verb+%x+ -- hexidecimal number
-\item \verb+%e+ -- floating point number in scientific notation
-\item \verb+%s+ -- string consisting of a sequence of 8-bit extended ASCII chars
-\item \verb+%%+ -- specifies a literal %.
-\end{itemize}
-\end{itemize}
-the following prints the line \verb+"0x4142 16706 AB"+ on cycles when \verb+c+ is true:
-\begin{scala}
-val x = Bits(0x4142)
-val s1 = sprintf("%x %s", x, x);
-when (c) { printf("%d %s\n", x, s1); }
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{assert}
-\begin{itemize}
-\item simulation time assertions are provided by \verb+assert+ construct
-\item if assert arguments false on rising edge then
-\begin{itemize}
-\item an error is printed and
-\item simulation terminates
-\end{itemize}
-\end{itemize}
-the following will terminate after 10 clock cycles:
-\begin{scala}
-val x = Reg(init = UInt(0, 4))
-x := x + UInt(1)
-assert(x < UInt(10))
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Installation}
-\begin{itemize}
-\item on mac install:
-\begin{itemize}
-\item XCODE console tools
-\end{itemize}
-\item on windows install:
-\begin{itemize}
-\item cygwin
-\end{itemize}
-\item everywhere install:
-\begin{itemize}
-\item git
-\item g++ version 4.0 or later
-\item java
-\end{itemize}
-\item everywhere
-\begin{itemize}
-\item git clone https://github.com/ucb-bar/chisel-tutorial.git
-\end{itemize}
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]{Chisel Resources}
-\begin{center}
-\url{https://chisel.eecs.berkeley.edu/documentation.html} \\[0.25cm]
-\begin{tabular}{rl}
-\textbf{getting started} & \code{getting-started.pdf} \\
-\textbf{tutorial} & \code{tutorial.pdf} \\
-\textbf{manual} & \code{manual.pdf} \\
-% \textbf{bootcamp} & \code{bootcamp.pdf} \\
-\end{tabular}
-\url{https://github.com/ucb-bar/chisel/} \\[0.25cm]
-\begin{tabular}{rl}
-\textbf{setup} & \code{readme.md} \\
-\textbf{utils} & \code{src/main/scala/ChiselUtils.scala} \\[0.5cm]
-\end{tabular}
-\url{https://chisel.eecs.berkeley.edu/download.html} \\[0.25cm]
-\begin{tabular}{rl}
-\textbf{sodor} & \url{https://github.com/ucb-bar/riscv-sodor/} \\
-% \textbf{virtualbox} & \url{https://chisel.eecs.berkeley.edu/chisel-riscv.box} \\
-\end{tabular}
-\end{center}
-\end{frame}
-
-\begin{frame}{Scala Resources}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../bootcamp/figs/programming-scala.pdf} \\
-\includegraphics[height=0.4\textheight]{../bootcamp/figs/programming-in-scala.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Projects Ideas}
-
-\begin{center}
-\begin{tabular}{rl}
-\textbf{audio processing} & \code{Echo.scala} \\
-\textbf{image processing} & \code{Darken.scala} \\
-\textbf{risc processor} & \code{Risc.scala} \\
-\textbf{game of life} & \code{Life.scala} \\
-\textbf{router} & \code{Router.scala} \\
-\textbf{map/reduce} & \code{FIR.scala}\\
-\textbf{network} & \\
-\textbf{decoupled filter} & \\
-\textbf{cryptography} & \\
-\textbf{serial multiplier} & \\
-\textbf{pong} & \\
-\end{tabular}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Keep in Touch}
-\begin{center}
-\begin{tabular}{rl}
-\textbf{website} & \url{chisel.eecs.berkeley.edu} \\
-\textbf{mailing list} & \url{groups.google.com/group/chisel-users} \\
-\textbf{github} & \url{https://github.com/ucb-bar/chisel/} \\
-\textbf{features + bugs} & \url{https://github.com/ucb-bar/chisel/issues} \\
-\textbf{more questions} & \url{stackoverflow.com/quesions/tagged/chisel} \\
-\textbf{twitter} & {\tt \#chiselhdl} \\
-\textbf{me} & \url{jrb@eecs.berkeley.edu} \\
-\end{tabular}
-\end{center}
-\end{frame}
-
-\begin{frame}{Thanks}
-\begin{itemize}
-\item \textbf{Arrangements} -- HPCA folks
-\item \textbf{USB Sticks} -- Albert Magyar + Jim Lawson
-\item \textbf{Bootcamp Materials} -- JB, Vincent Lee, Stephen Twigg, Huy Vo
-\item \textbf{Funding} -- Department of Energy, Department of Defense, StarNet, C-Far, LBNL, Intel, Google, LG, Nvidia, Samsung, Oracle, Huawei
-\end{itemize}
-\end{frame}
-
-\end{document}
diff --git a/doc/bootcamp/figs/LFSR16.graffle b/doc/bootcamp/figs/LFSR16.graffle
deleted file mode 100644
index 56a82fdb..00000000
Binary files a/doc/bootcamp/figs/LFSR16.graffle and /dev/null differ
diff --git a/doc/bootcamp/figs/LFSR16.pdf b/doc/bootcamp/figs/LFSR16.pdf
deleted file mode 100644
index 5da4c908..00000000
Binary files a/doc/bootcamp/figs/LFSR16.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/bits-hierarchy.graffle b/doc/bootcamp/figs/bits-hierarchy.graffle
deleted file mode 100644
index 844b0031..00000000
Binary files a/doc/bootcamp/figs/bits-hierarchy.graffle and /dev/null differ
diff --git a/doc/bootcamp/figs/bits-hierarchy.pdf b/doc/bootcamp/figs/bits-hierarchy.pdf
deleted file mode 100644
index 27cc2191..00000000
Binary files a/doc/bootcamp/figs/bits-hierarchy.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/chain.graffle b/doc/bootcamp/figs/chain.graffle
deleted file mode 100644
index 242c1684..00000000
--- a/doc/bootcamp/figs/chain.graffle
+++ /dev/null
@@ -1,533 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.16.0.171715
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {576, 733}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-29 16:36:31 +0000
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{80, 162}, {19, 29}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 12
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs48 \cf0 in}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 49
-
- ID
- 10
- Points
-
- {415, 180}
- {450, 180}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 5
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 49
-
- Head
-
- ID
- 5
-
- ID
- 8
- Points
-
- {316, 180}
- {341, 180}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 4
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 49
-
- Head
-
- ID
- 4
-
- ID
- 7
- Points
-
- {217, 180}
- {242, 180}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 3
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 49
-
- Head
-
- ID
- 3
-
- ID
- 6
- Points
-
- {108, 180}
- {143, 180}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{342, 144}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 49
-
- ID
- 5
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs100 \cf0 f}
-
-
-
- Bounds
- {{243, 144}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 49
-
- ID
- 4
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs100 \cf0 f}
-
-
-
- Bounds
- {{144, 144}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 49
-
- ID
- 3
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs100 \cf0 f}
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2012-10-30 15:36:12 +0000
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSHorizonalPagination
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- size
- {612, 792}
-
- NSPrintReverseOrientation
-
- int
- 0
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{48, 116}, {710, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{0, -1}, {575, 735}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 1
- 1
-
-
-
-
-
diff --git a/doc/bootcamp/figs/chain.pdf b/doc/bootcamp/figs/chain.pdf
deleted file mode 100644
index f9a35a2f..00000000
Binary files a/doc/bootcamp/figs/chain.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/chisel-workflow.graffle b/doc/bootcamp/figs/chisel-workflow.graffle
deleted file mode 100644
index 7c9c5c07..00000000
Binary files a/doc/bootcamp/figs/chisel-workflow.graffle and /dev/null differ
diff --git a/doc/bootcamp/figs/chisel-workflow.pdf b/doc/bootcamp/figs/chisel-workflow.pdf
deleted file mode 100644
index d35e7982..00000000
Binary files a/doc/bootcamp/figs/chisel-workflow.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/condupdates.graffle b/doc/bootcamp/figs/condupdates.graffle
deleted file mode 100644
index 71d93992..00000000
--- a/doc/bootcamp/figs/condupdates.graffle
+++ /dev/null
@@ -1,2822 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 138.33.0.157554
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {576, 733}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2011-09-12 23:56:23 -0700
- Creator
- Krste Asanovic
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{302, 209}, {100, 22}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 155
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs36 \cf0 Initial values}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{394, 237}, {11, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 296
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 0}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{313, 237}, {11, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 295
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 0}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 294
- Points
-
- {432, 318}
- {432, 369}
- {396, 369}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 290
- Info
- 1
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- Head
-
- ID
- 274
- Info
- 1
-
- ID
- 293
- Points
-
- {324, 381}
- {324, 387}
- {315, 387}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 288
- Info
- 1
-
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{387, 286}, {11, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 278
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 f}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{459, 286}, {11, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 279
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 t}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 280
- Points
-
- {468, 282}
- {468, 255}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 281
- Points
-
- {396, 282}
- {396, 261}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{462, 234}, {22, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 282
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 e1}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{257, 286}, {22, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 283
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 c1}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{330.639, 295.502}, {8.99658, 8.99658}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 284
- Line
-
- ID
- 292
- Position
- 0.4762515127658844
- RotationType
- 0
-
- Shape
- Circle
- Style
-
- fill
-
- Color
-
- b
- 0
- g
- 0
- r
- 0
-
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 285
- Points
-
- {432, 380}
- {432, 381}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- HeadScale
- 1.5000001192092896
- LineType
- 1
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- Group
- Graphics
-
-
- AllowLabelDrop
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- Head
-
- ID
- 289
-
- ID
- 287
- Points
-
- {333, 300}
- {333.154, 320.917}
-
- Style
-
- stroke
-
- Cap
- 0
- HeadArrow
- 0
- Join
- 0
- LineType
- 1
- TailArrow
- 0
- Width
- 2
-
-
-
-
- AllowLabelDrop
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 288
- Points
-
- {324, 363}
- {324, 381}
-
- Style
-
- stroke
-
- Cap
- 0
- HeadArrow
- 0
- Join
- 0
- LineType
- 1
- TailArrow
- 0
- TailScale
- 1.8571430444717407
- Width
- 2
-
-
- Tail
-
- ID
- 289
-
-
-
- AllowConnections
- NO
- Bounds
- {{301.5, 322.5}, {45, 36}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 289
- Magnets
-
- {1, 0}
- {-0.460092, -0.26062}
- {-0.475541, 0.277852}
-
- Rotation
- 90
- Shape
- OrGate
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Width
- 2
-
-
- Text
-
- VerticalPad
- 0
-
- VFlip
- YES
-
-
- ID
- 286
- Rotation
- 90
- VFlip
- YES
-
-
- Bounds
- {{360, 282}, {144, 36}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 290
- Magnets
-
- {0, 1}
- {0, -1}
-
- Shape
- Trapazoid
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 291
- Points
-
- {315, 327.101}
- {315, 261}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- AllowConnections
- NO
- AllowLabelDrop
-
- AllowToConnect
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 292
- Points
-
- {378, 300}
- {333, 300}
- {288, 300}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- ID
- 277
- VFlip
- YES
-
-
- Bounds
- {{389, 507}, {11, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 276
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 r}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{401, 471}, {22, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 259
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 in}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{252, 471}, {65, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 260
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 enable}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{387, 400}, {11, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 261
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 f}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{459, 400}, {11, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 262
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 t}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 263
- Points
-
- {468, 396}
- {468, 369}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 264
- Points
-
- {396, 396}
- {396, 369}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{462, 348}, {22, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 265
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 e2}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{257, 400}, {22, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 266
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 c2}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{330.639, 409.502}, {8.99658, 8.99658}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 267
- Line
-
- ID
- 275
- Position
- 0.4762515127658844
- RotationType
- 0
-
- Shape
- Circle
- Style
-
- fill
-
- Color
-
- b
- 0
- g
- 0
- r
- 0
-
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 268
- Points
-
- {432, 433}
- {432, 495}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- HeadScale
- 1.5000001192092896
- LineType
- 1
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 273
- Info
- 1
-
-
-
- Class
- Group
- Graphics
-
-
- AllowLabelDrop
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- Head
-
- ID
- 272
-
- ID
- 270
- Points
-
- {333, 414}
- {333.154, 434.917}
-
- Style
-
- stroke
-
- Cap
- 0
- HeadArrow
- 0
- Join
- 0
- LineType
- 1
- TailArrow
- 0
- Width
- 2
-
-
-
-
- AllowLabelDrop
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 271
- Points
-
- {324, 477}
- {324, 495}
-
- Style
-
- stroke
-
- Cap
- 0
- HeadArrow
- FilledArrow
- Join
- 0
- LineType
- 1
- TailArrow
- 0
- TailScale
- 1.8571430444717407
- Width
- 2
-
-
- Tail
-
- ID
- 272
-
-
-
- AllowConnections
- NO
- Bounds
- {{301.5, 436.5}, {45, 36}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 272
- Magnets
-
- {1, 0}
- {-0.460092, -0.26062}
- {-0.475541, 0.277852}
-
- Rotation
- 90
- Shape
- OrGate
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Width
- 2
-
-
- Text
-
- VerticalPad
- 0
-
- VFlip
- YES
-
-
- ID
- 269
- Rotation
- 90
- VFlip
- YES
-
-
- Bounds
- {{360, 396}, {144, 36}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 273
- Magnets
-
- {0, 1}
- {0, -1}
-
- Shape
- Trapazoid
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 274
- Points
-
- {315, 441}
- {315, 387}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- AllowConnections
- NO
- AllowLabelDrop
-
- AllowToConnect
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 275
- Points
-
- {378, 414}
- {333, 414}
- {288, 414}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{351, 534}, {33, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 257
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 out}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 256
- Points
-
- {396, 531}
- {396, 558}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- HeadScale
- 1.5000001192092896
- LineType
- 1
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{210, 507}, {55, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 255
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 clock}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 252
- Points
-
- {288, 513}
- {270, 513}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 253
- Points
-
- {288, 495}
- {306, 513}
- {288, 531}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- AllowConnections
- NO
- Bounds
- {{288, 495}, {216, 36}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 254
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Width
- 2
-
-
- VFlip
- YES
-
-
- ID
- 251
- VFlip
- YES
-
-
- Bounds
- {{100.5, 423}, {141, 40}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 88
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Align
- 0
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
-
-\f0\b\fs36 \cf0 when (c2)\
- \{ r := e2 \}}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{100.5, 318}, {141, 40}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 68
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Align
- 0
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
-
-\f0\b\fs36 \cf0 when (c1)\
- \{ r := e1 \}}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2012-05-30 10:27:26 -0700
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAx7X05TU2l6ZT1mZn2WgWQCgRgDhg==
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- QuickLookPreview
-
- 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
- 4/NDyqTL1e+Uv+qLny/xZdPpC5APfB3F4n1dfLpUhxvv6pu7utDl8J+nrz5XGZAlAquL
- 50v9m968zt9C3/wDhSFj7AplbmRzdHJlYW0KZW5kb2JqCjYgMCBvYmoKMTcyMwplbmRv
- YmoKMyAwIG9iago8PCAvVHlwZSAvUGFnZSAvUGFyZW50IDQgMCBSIC9SZXNvdXJjZXMg
- NyAwIFIgL0NvbnRlbnRzIDUgMCBSIC9NZWRpYUJveCBbMCAwIDU3NiA3MzNdCj4+CmVu
- ZG9iago3IDAgb2JqCjw8IC9Qcm9jU2V0IFsgL1BERiAvVGV4dCBdIC9Db2xvclNwYWNl
- IDw8IC9DczIgOSAwIFIgL0NzMSA4IDAgUiA+PiAvRm9udCA8PAovRjIuMCAxMSAwIFIg
- L0YxLjAgMTAgMCBSID4+ID4+CmVuZG9iagoxMiAwIG9iago8PCAvTGVuZ3RoIDEzIDAg
- UiAvTiAxIC9BbHRlcm5hdGUgL0RldmljZUdyYXkgL0ZpbHRlciAvRmxhdGVEZWNvZGUg
- Pj4Kc3RyZWFtCngBhVJPSBRRHP7NNhKEiEGFeIh3CgmVKaysoNp2dVmVbVuV0qIYZ9+6
- o7Mz05vZNcWTBF2iPHUPomN07NChm5eiwKxL1yCpIAg8dej7zezqKIRveTvf+/39ft97
- RG2dpu87KUFUc0OVK6Wnbk5Ni4MfKUUd1E5YphX46WJxjLHruZK/u9fWZ9LYst7HtXb7
- 9j21lWVgIeottrcQ+iGRZgAfmZ8oZYCzwB2Wr9g+ATxYDqwa8COiAw+auTDT0Zx0pbIt
- kVPmoigqr2I7Sa77+bnGvou1iYP+XI9m1o69s+qq0UzUtPdEobwPrkQZz19U9mw1FKcN
- 45xIQxop8q7V3ytMxxGRKxBKBlI1ZLmfak6ddeB1GLtdupPj+PYQpT7JYKiJtemymR2F
- fQB2KsvsEPAF6PGyYg/ngXth/1tRw5PAJ2E/ZId51q0f9heuU+B7hD014M4UrsXx2oof
- Xi0BQ/dUI2iMc03E09c5c6SI7zHUGZj3RjmmCzF3lqoTN4A7YR9ZqmYKsV37ruol7nsC
- d9PjO9GbOQtcoBxJcrEV2RTQPAlYFH2LsEkOPD7OHlXgd6iYwBy5idzNKPce1REbZ6NS
- gVZ6jVfGT+O58cX4ZWwYz4B+rHbXe3z/6eMVdde2Pjz5jXrcOa69nRtVYVZxZQvd/8cy
- hI/ZJzmmwdOhWVhr2HbkD5rMTLAMKMR/BT6X+pITVdzV7u24RRLMUD4sbCW6S1RuKdTq
- PYNKrBwr2AB2cJLELFocuFNrujl4d9giem35TVey64b++vZ6+9ryHm3KqCkoE82zRGaU
- sVuj5N142/1mkRGfODq+572KWsn+SUUQP4U5WiryFFX0VlDWxG9nDn4btn5cP6Xn9UH9
- PAk9rZ/Rr+ijEb4MdEnPwnNRH6NJ8LBpIeISoIqDM9ROVGONA+Ip8fK0W2SR/Q9AGf1m
- CmVuZHN0cmVhbQplbmRvYmoKMTMgMCBvYmoKNzA0CmVuZG9iago5IDAgb2JqClsgL0lD
- Q0Jhc2VkIDEyIDAgUiBdCmVuZG9iagoxNCAwIG9iago8PCAvTGVuZ3RoIDE1IDAgUiAv
- TiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+Pgpz
- dHJlYW0KeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZu
- NuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731v
- dt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7
- d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFki
- fEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d
- 9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZ
- Lg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8w
- Dh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+
- KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNX
- R5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7P
- LrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwvi
- YG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8
- F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEc
- dod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfE
- p0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UUKZW5kc3RyZWFtCmVuZG9iagoxNSAw
- IG9iago3MzcKZW5kb2JqCjggMCBvYmoKWyAvSUNDQmFzZWQgMTQgMCBSIF0KZW5kb2Jq
- CjQgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdIC9D
- b3VudCAxIC9LaWRzIFsgMyAwIFIgXSA+PgplbmRvYmoKMTYgMCBvYmoKPDwgL1R5cGUg
- L0NhdGFsb2cgL091dGxpbmVzIDIgMCBSIC9QYWdlcyA0IDAgUiA+PgplbmRvYmoKMiAw
- IG9iago8PCAvTGFzdCAxNyAwIFIgL0ZpcnN0IDE4IDAgUiA+PgplbmRvYmoKMTggMCBv
- YmoKPDwgL1BhcmVudCAxOSAwIFIgL0NvdW50IDAgL0Rlc3QgWyAzIDAgUiAvWFlaIDAg
- NzMzIDAgXSAvVGl0bGUgKENhbnZhcyAxKQo+PgplbmRvYmoKMTkgMCBvYmoKPDwgPj4K
- ZW5kb2JqCjE3IDAgb2JqCjw8IC9QYXJlbnQgMTkgMCBSIC9Db3VudCAwIC9EZXN0IFsg
- MyAwIFIgL1hZWiAwIDczMyAwIF0gL1RpdGxlIChDYW52YXMgMSkKPj4KZW5kb2JqCjIw
- IDAgb2JqCjw8IC9MZW5ndGggMjEgMCBSIC9MZW5ndGgxIDc3OTYgL0ZpbHRlciAvRmxh
- dGVEZWNvZGUgPj4Kc3RyZWFtCngBvVkLVJNXtt7nfyaERxIS8iAhCT9JCG98IBGUiAmi
- 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
- 1GaTw1zukLdmUuP++n9l4q+988y0jPl7ajYxH5rpMxzfidivuVzAuOLLKSVnCQPLoY1p
- Y5cLP+Me41+G/YwCT2mZADeHf5TbxJ/jzvOK2emr00VFmCj7HcvXIbT4t0A40jmAgdjO
- hckjx1i2Q8sQBv8recSXIggdWpyJFziWEJ5hBRbwzC5GQY11mDlBaLTb0E8OCyZT1VVj
- 5dCnnw6ZZPsYAYOZoVjrpY9krVeszMlUV12uFKNF5tx5a31OxqNlWQ48WkHA58A44QzH
- HubhO7le75DXe5NkXlRn4i8/j4b8hvsSlWQixuRPSArJPDu88vTwGi73+m627do7iNDI
- O12kFc+i/9kVi40snqb78Uy7Au7AE/WF+G5ZB0G5M8GT9uh7poD/PYK/tmZRzYLM8taV
- 3a1d7UubsE+USzsXYvJjmo+pBRP9bxNRgqcwvYQJ/2bCU2OA9zBdjoxcSMMYTcB+Ux0D
- 4Dg+nfHG/vKabhjffhOfntPe2P+em+qrb6pTnW/sv+amejet/x9hv9JhCmVuZHN0cmVh
- bQplbmRvYmoKMjEgMCBvYmoKNDc2NgplbmRvYmoKMjIgMCBvYmoKPDwgL1R5cGUgL0Zv
- bnREZXNjcmlwdG9yIC9Bc2NlbnQgNzcwIC9DYXBIZWlnaHQgNjg0IC9EZXNjZW50IC0y
- MzAgL0ZsYWdzIDMyCi9Gb250QkJveCBbLTk1MSAtNDgxIDE0NDUgMTEyMl0gL0ZvbnRO
- YW1lIC9EU1JXUlUrSGVsdmV0aWNhIC9JdGFsaWNBbmdsZSAwCi9TdGVtViAwIC9NYXhX
- aWR0aCAxNTAwIC9YSGVpZ2h0IDUxMyAvRm9udEZpbGUyIDIwIDAgUiA+PgplbmRvYmoK
- MjMgMCBvYmoKWyAyNzggMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
- MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAyNzggMCAw
- IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDU1NiAwIDAg
- MCA1NTYKMCAwIDAgMjIyIDAgMCAyMjIgMCA1NTYgMCAwIDAgMCA1MDAgMjc4IDU1NiA1
- MDAgXQplbmRvYmoKMTEgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVU
- eXBlIC9CYXNlRm9udCAvRFNSV1JVK0hlbHZldGljYSAvRm9udERlc2NyaXB0b3IKMjIg
- MCBSIC9XaWR0aHMgMjMgMCBSIC9GaXJzdENoYXIgMzIgL0xhc3RDaGFyIDExOCAvRW5j
- b2RpbmcgL01hY1JvbWFuRW5jb2RpbmcKPj4KZW5kb2JqCjI0IDAgb2JqCjw8IC9MZW5n
- dGggMjUgMCBSIC9MZW5ndGgxIDIwMjQwIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0
- cmVhbQp4Aa18C1xUx/X/zNy7Txa4+4QF2Se7PBbYRQEF0b2ISAQVfEUwEvBB1NQEXzFv
- Jc3bpJUkNc/2J2nzbNJkAZOgTStt0jRJa+OvsUlM22D6S/O2mvzUNlF2/9+ZXXw0/T0+
- n/9vlzNnZu7cc2bOnDNz5ty7bN54RTcxkV4iEXXlZcvXE/EJqkAHV27Z7BFF4lhHiD7j
- kvWrL0uWXdcRomtfve7qS5LlgjmEFKhrupevSpbJaeCqNahIlmkFcP6ayzZflSwH3gFe
- s65nZep6gQ3lqsuWX5XiT/6Esufy5Zd1J9vP+wC4ZH3Pps2p8p3Abes3dqfa0zZC7Jbz
- yxmEULTKIV+SWnIT0RBGFBIm7RjJOs2bREaZX9cQwn7y4eLOzNoTeoNekP/R4p46nvlV
- 2p6V8Su/nq/5geFXaGsQ7fkF3Kd9cuwBQuT98SsTEc0PzlzhV/knZ2CJu26aTEkYEAFI
- IhdFrgXQCegCvAEYBRwF6IkHKW+7A7ALwK9oiFtKkDAgApBIFGknYPRMaQdyuwD9gGMA
- DVGl+FBaxkR3XaMUx61xsh6wCyDj1rOlo6JmR+paP7BEMmUNxhJGGgXsABwFyMQjnUa9
- Ip0iPYB+lA4DZFD/Gl3icIq0AHcJOAV8muxD3QHAMYAxMSL9Y2j+womkrlb6CoS+Qi+/
- Iq2A9YBeQAxwGAA5IA1LYxjxVyA8Jlp1Id8H2IfyCPABAG+dBjq8xRhYjpFnAZzOeCve
- 4hjAAPZfDU69d+IekUk3i8yJoZraiQfqbNIJjK1PpJlIw4AooAWwA/AsQAs2xwcNJnHf
- 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
- BPMdhGXemNLqbqy1j6MkYa4s2AGikPgczMkynKwkWoCd9mXydOJhaTFoDAiTeZy9QT3x
- H5ECrDKXY39qJv9Bp5NP8d1Ndo89CG5PaB8H1z3aJ8kJ7Q/wxG8nSnewBo1ZDkPnx1gP
- /U7iovhFWNOuJXvkv+JRD1HntC25cPGihQvmt7bMa5odnT6tdmpN9ZTJlRWTJpZHwmWl
- JaHiosKCYCDf7/N63K68Cbk5zuwsh91mtZiVzIx0U5rRoNdpNbLEKClp8M/q8sSCXTE5
- 6L/gglJe9i9HxfJzKrpiHlTNOr9NzMPvW45L57VU0fKSf2qpJluqZ1pSxVNLaktLPA1+
- T2z/TL9nmC6d34b8d2b62z2xIyI/V+TloCiko+D14g5PQ/aamZ4Y7fI0xGZtWbO9oWtm
- aQkdSDPW++u7jaUlZMCYhmwacrEs//oBmjWdigzLaqgZYESfjjHGcvwzG2JOP24FGSnQ
- sHxVrHV+W8PMXK+3vbQkRutX+lfECHekQ6IJqRdsYtr6mE6w8ayNYTjkDs9Aycj2O4cV
- sqIrZFrlX7V8WVtMWg4aDTFzCHxnxrKu+SD7bBHE4bLfeu7VXGl7Q/ZaD2+8ffutnlj/
- /LZz7s31cgrt7aCBe1lgVtf2WWB9J6aKZofROd59PpTkoJJHoUDXpZ6YwT/Dv2b7pV2Y
- kJztMbLgau9gTo66J3GY5DR4ti9q83tj0Vx/+/KZEwZsZPuCq4ecqsd5/pXSkgHFnJTm
- QEZmKmNKPzfTDUknr4mcaM5zzQvOiJPyPvpnx1To0UoPetLmx0Cm8KR7Ctm+cgqkjk87
- xV2xVZiGtTFDfdd2pYbXQ5Q0pgkofs/2EwTT7j/y+fk1y1M12oACS8ZFrhxnFCxGl4/n
- YzglFBdzvdDVYyLRx+miXFlasmWY7fevVzxAOEmS1jbc1l4Thsy9Xj6rdwyrZAUKsd75
- bcmyh6zIHSRqGOct1sWvjIxfsS/mV3rHr5y5vcsP9d2NXRMvXcT0wTN/mYrD2rCmJkYd
- /83l7uT15oX+ZgRhPA3bu1Kq2rzovFLyOhco5IZrqVzMWt8m5TKu2sixXElchSYuW3qm
- CQptppgcwJ9WaPKqYZ0eqihqqGdWTOm6IJm2G73elKH8TzcNJ47xuwQ6e1tqGLGaUKqj
- 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
- M5JUM29eDWCsIJXBSlFEPfLjUg92kFwy9Xl9KdGVEjrMjqgOe0apI7PUYU8jTurMyZMt
- zglXDycXdK6+JFw7l6vwSa7IkFtKW718mdVK55Vk1+nvcY2V1vH0nDz74bjixrdOKSuD
- CpdNQZ/aE+/J90uPIxI5mU5TK4s1NFJGNVWOKn9VtDgaipZMK70s47oMg8Zj99ynf0n7
- mueg9gPtySrsq2fO0uP2aoO9WiPFk32E3lJEi4onV5gsRq7FYZenQjG2Gplq7DUyo7ez
- hLaU0JKSIptaCovutihel67I2FtBK7xyWjqUb8lub6eP+vjNBkta1JdTnXVrZJgtVi06
- NSsj6tZ5dBGdpHNOiT6f3IVCc8e4OoY6+A6I+doQjR7hjzQyFbV0aVRRM108sUWhpe1H
- Qpbq8IaNR6CbaCIMdgiNeFeH0E5gJTeF7QIPJm/FzdWW6mpztfI5NSODP76UdGyAKnsr
- U9tLPjaVlBon1WV8SxxfbKTk0itW3qrJknvu3jmP/o7qPu64pqXnoruqXEXVtvzqOf+m
- 7nvTzyfx2LVrrl86JXfikqafzo4UFT176Q1/tpWX1eSnTy3LCWYpduejO+JL+eTSnuxp
- BYV5Fm/NRLzz+FliVL5XY8a+Xkz71HINMxiMJul5/Sv6j/RfG2Q3U0zufCUYZh5TON8T
- /Cz4WfFp7WlPIj89XzVkRoNC9sjkq8a0ClHKRiZXlX25aqExqCd8AbdYbXZH1rgC8GWc
- nImrjNc6XbPTPemFmb0I2ssu4vPKukxjodeY5uYTaiM6RcymqmvVaWM6elhHdYK32RjV
- 5ZSQQAbUQbVlEYfHEXG84Rh1HHUkHLpdDuoYb+ZwhlZeJ/QAizpXAO4DhTo2dMwVmyms
- 11y9AfM1ZXwtei5dTVMqKO4fBMZuidWo/mo1p6jY49UYvBq3mxYZkHi0Pjct1he6Cdpg
- P73hhhvI7EVXq0qwIM0UNBX65YK0gJ+Y0nHwwaY7ftWfz6R85vNr/DjeY+k5cxXaF+qg
- WPWoma9sxG4jUJECe2pZmWROZShfBbV2G7bmKrqq+aGWP9DC+IcfLbi/8VhTVJ3tF3oh
- LR68oXew/+67H9aY4xXl5fF3D/w6fqK4aKLYna7k6ekHt8Vi12246y6sbBth6XfA0kPk
- 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
- OLJxdLYkfhOZtJHniGrIqxBKAcyVZBCYO+vcF+JLPP+I7d2RjROONTvdHMVPT1/HMzRX
- 1FqFBKX31IxSXPMhcfDjBCZyZAgYE/neC5bsKMtGkiTF0/aNeDK+kZ8uz37E0449xA7t
- BRuhvcCiY1i1hPYCizJ6IMrAooy4uSgDizL6JMrAKPcOoVcoCyzKODmKMrBobxXlkSFg
- UUZfxf3AvDyYVs2LA2l8V/3Gp51i491I+U8tzh5F8JaF1TrJahWPXfDahfAidZKfrfnu
- L56eUh1t2tcUzc9tmbft+d7WOdmRaNMvmqKTq574Ob0mfgvbJ1WHuBtY5smO/5TOjQ/R
- hlQcsKhaHqvD2kLb8E7TlZpMvOd/vVocNoTzv02+IHJRBn3MdtLJdM4gkqBBJlnBJV5F
- V2+y5P/Gm3CRYfrsYFYxonRLnzcbfmNKmF176RpipmtUgycrksWynGUf7cGPF5Ixu7mI
- UI8hUIDANLB4UOUM82cP1QiM8GcL+OOxUZsLL0JpcQLh62lFGeO+HaK2Zv72EY+a4uUG
- NNKyvvwc96KqaeH668ryJiwrL+8wmvvXRqZVXZhmyaVfFM29ML63yK+rKS6pbWytaKBr
- Q560qpLSqrR0WzG98PKHa0uKavQZ9qL43oZmLoP5kMF6IYOtavixnBN2prUH7EVuyWfw
- 5t+JF/+/ztDogsUGuxM+LOSgW2JSvP+TIIaycsJnRHDynyUQReSEiyD5mA5S4I86Oygm
- PjVuDJgfGpISSY07eTRLSYRN8ef+V0JwciHU01lFfn1NkRDCzPiPQ15jVWmJEEL8vp4z
- QqCzLpyD04H4xP34nQL3jf75g6g9osRpeKfPihCtHU/qPGQmYqSz8HuP2fgdxBz8+qSF
- zMfvXhaTJfhlxFK8idgliFCsYUl6Wh77b25dMHtea6i+54qNa7s3zuu+snVh6Yyedavm
- Lvp/6hp0XgplbmRzdHJlYW0KZW5kb2JqCjI1IDAgb2JqCjEzNDY2CmVuZG9iagoyNiAw
- IG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0FzY2VudCA4MzMgL0NhcEhlaWdo
- dCA2MjUgL0Rlc2NlbnQgLTMwMCAvRmxhZ3MgMzIKL0ZvbnRCQm94IFstMTkyIC03MTAg
- NzAyIDEyMjJdIC9Gb250TmFtZSAvS1BSSU5QK0NvdXJpZXJOZXdQUy1Cb2xkTVQgL0l0
- YWxpY0FuZ2xlCjAgL1N0ZW1WIDAgL01heFdpZHRoIDYwMCAvWEhlaWdodCA1NDkgL0Zv
- bnRGaWxlMiAyNCAwIFIgPj4KZW5kb2JqCjI3IDAgb2JqClsgNjAwIDAgMCAwIDAgMCAw
- IDAgNjAwIDYwMCAwIDAgMCAwIDAgMCA2MDAgNjAwIDYwMCAwIDAgMCAwIDAgMCAwIDYw
- MCAwIDAKNjAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
- IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAo2MDAgNjAwIDYwMCAwIDYwMCA2MDAg
- MCA2MDAgNjAwIDAgNjAwIDYwMCAwIDYwMCA2MDAgMCAwIDYwMCAwIDYwMCA2MDAgMCA2
- MDAKMCAwIDAgNjAwIDAgNjAwIF0KZW5kb2JqCjEwIDAgb2JqCjw8IC9UeXBlIC9Gb250
- IC9TdWJ0eXBlIC9UcnVlVHlwZSAvQmFzZUZvbnQgL0tQUklOUCtDb3VyaWVyTmV3UFMt
- Qm9sZE1UIC9Gb250RGVzY3JpcHRvcgoyNiAwIFIgL1dpZHRocyAyNyAwIFIgL0ZpcnN0
- Q2hhciAzMiAvTGFzdENoYXIgMTI1IC9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZwo+
- PgplbmRvYmoKMjggMCBvYmoKKE1hYyBPUyBYIDEwLjYuOCBRdWFydHogUERGQ29udGV4
- dCkKZW5kb2JqCjI5IDAgb2JqCihEOjIwMTIwNTMwMTcyNzQ0WjAwJzAwJykKZW5kb2Jq
- CjEgMCBvYmoKPDwgL1Byb2R1Y2VyIDI4IDAgUiAvQ3JlYXRpb25EYXRlIDI5IDAgUiAv
- TW9kRGF0ZSAyOSAwIFIgPj4KZW5kb2JqCnhyZWYKMCAzMAowMDAwMDAwMDAwIDY1NTM1
- IGYgCjAwMDAwMjQwNzMgMDAwMDAgbiAKMDAwMDAwMzk3NSAwMDAwMCBuIAowMDAwMDAx
- ODM5IDAwMDAwIG4gCjAwMDAwMDM4MjYgMDAwMDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBu
- IAowMDAwMDAxODE5IDAwMDAwIG4gCjAwMDAwMDE5NDMgMDAwMDAgbiAKMDAwMDAwMzc5
- MCAwMDAwMCBuIAowMDAwMDAyODk0IDAwMDAwIG4gCjAwMDAwMjM3OTQgMDAwMDAgbiAK
- MDAwMDAwOTU0OSAwMDAwMCBuIAowMDAwMDAyMDY2IDAwMDAwIG4gCjAwMDAwMDI4NzQg
- MDAwMDAgbiAKMDAwMDAwMjkzMCAwMDAwMCBuIAowMDAwMDAzNzcwIDAwMDAwIG4gCjAw
- MDAwMDM5MDkgMDAwMDAgbiAKMDAwMDAwNDEzOCAwMDAwMCBuIAowMDAwMDA0MDIzIDAw
- MDAwIG4gCjAwMDAwMDQxMTYgMDAwMDAgbiAKMDAwMDAwNDIzMSAwMDAwMCBuIAowMDAw
- MDA5MDg3IDAwMDAwIG4gCjAwMDAwMDkxMDggMDAwMDAgbiAKMDAwMDAwOTMzMyAwMDAw
- MCBuIAowMDAwMDA5NzI0IDAwMDAwIG4gCjAwMDAwMjMyODEgMDAwMDAgbiAKMDAwMDAy
- MzMwMyAwMDAwMCBuIAowMDAwMDIzNTM2IDAwMDAwIG4gCjAwMDAwMjM5NzkgMDAwMDAg
- biAKMDAwMDAyNDAzMSAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDMwIC9Sb290IDE2
- IDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8ZWFkZDM3NTdlMzUyZGMyMDc3NjU1NDZhMzVj
- N2E2NmY+CjxlYWRkMzc1N2UzNTJkYzIwNzc2NTU0NmEzNWM3YTY2Zj4gXSA+PgpzdGFy
- dHhyZWYKMjQxNDgKJSVFT0YKMSAwIG9iago8PC9BdXRob3IgKEtyc3RlIEFzYW5vdmlj
- XG5Kb25hdGhhbiBCYWNocmFjaCkvQ3JlYXRpb25EYXRlIChEOjIwMTEwOTEzMDY1NjAw
- WikvQ3JlYXRvciAoT21uaUdyYWZmbGUgUHJvZmVzc2lvbmFsIDUuMy42KS9Nb2REYXRl
- IChEOjIwMTIwNTMwMTcyNzAwWikvUHJvZHVjZXIgMjggMCBSIC9UaXRsZSAoY29uZHVw
- ZGF0ZXMuZ3JhZmZsZSk+PgplbmRvYmoKeHJlZgoxIDEKMDAwMDAyNDkwNiAwMDAwMCBu
- IAp0cmFpbGVyCjw8L0lEIFs8ZWFkZDM3NTdlMzUyZGMyMDc3NjU1NDZhMzVjN2E2NmY+
- IDxlYWRkMzc1N2UzNTJkYzIwNzc2NTU0NmEzNWM3YTY2Zj5dIC9JbmZvIDEgMCBSIC9Q
- cmV2IDI0MTQ4IC9Sb290IDE2IDAgUiAvU2l6ZSAzMD4+CnN0YXJ0eHJlZgoyNTExNgol
- JUVPRgo=
-
- QuickLookThumbnail
-
- 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
- AAEAAQ==
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{72, 4}, {1368, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{-16, 224.5}, {609.5, 360}}
- Zoom
- 2
- ZoomValues
-
-
- Canvas 1
- 2
- 1
-
-
-
- saveQuickLookFiles
- YES
-
-
diff --git a/doc/bootcamp/figs/condupdates.pdf b/doc/bootcamp/figs/condupdates.pdf
deleted file mode 100644
index 8ba9abb9..00000000
Binary files a/doc/bootcamp/figs/condupdates.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/enable-shift-register.graffle b/doc/bootcamp/figs/enable-shift-register.graffle
deleted file mode 100644
index 7423c4f1..00000000
Binary files a/doc/bootcamp/figs/enable-shift-register.graffle and /dev/null differ
diff --git a/doc/bootcamp/figs/enable-shift-register.pdf b/doc/bootcamp/figs/enable-shift-register.pdf
deleted file mode 100644
index d38dc0d8..00000000
Binary files a/doc/bootcamp/figs/enable-shift-register.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/gcd.graffle b/doc/bootcamp/figs/gcd.graffle
deleted file mode 100644
index d4262f11..00000000
--- a/doc/bootcamp/figs/gcd.graffle
+++ /dev/null
@@ -1,783 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.18.0.187838
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {576, 733}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-29 20:39:35 +0000
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Class
- LineGraphic
- Head
-
- ID
- 25
-
- ID
- 27
- Points
-
- {439.99998203088444, 441.00000952613516}
- {388.0000179691142, 441.00000952613516}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- StickArrow
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 16
-
- ID
- 22
- Points
-
- {439.99998203088728, 557.99998657131084}
- {388.00001796911465, 557.99998657131084}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- StickArrow
- Width
- 2
-
-
-
-
- Bounds
- {{155.5, 369}, {15, 29}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- ID
- 49
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 Menlo-Italic;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\i\fs48 \cf0 a}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{155.5, 486}, {15, 29}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- ID
- 48
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 Menlo-Italic;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\i\fs48 \cf0 b}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- Head
-
- ID
- 45
-
- ID
- 46
- Points
-
- {72, 441}
- {124.99998198012071, 441}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{126, 405}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Menlo-Regular
- Size
- 24
-
- ID
- 45
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 Menlo-Regular;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs36 \cf0 UFix}
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 42
-
- ID
- 43
- Points
-
- {72, 558}
- {124.99998198012071, 558}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{126, 522}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Menlo-Regular
- Size
- 24
-
- ID
- 42
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 Menlo-Regular;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs36 \cf0 UFix}
-
-
-
- Bounds
- {{108, 360}, {108, 252}}
- Class
- ShapedGraphic
- ID
- 41
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
-
- stroke
-
- Width
- 2
-
-
-
-
- Bounds
- {{344.5, 369}, {15, 29}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- ID
- 40
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 Menlo-Italic;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\i\fs48 \cf0 z}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{315.5, 486}, {73, 29}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- ID
- 39
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 Menlo-Italic;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\i\fs48 \cf0 valid}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{315, 405}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Menlo-Regular
- Size
- 24
-
- ID
- 25
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 Menlo-Regular;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs36 \cf0 UFix}
-
-
-
- Bounds
- {{315, 522}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Menlo-Regular
- Size
- 24
-
- ID
- 16
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 Menlo-Regular;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs36 \cf0 Bool}
-
-
-
- Bounds
- {{297, 360}, {108, 252}}
- Class
- ShapedGraphic
- ID
- 14
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
-
- stroke
-
- Width
- 2
-
-
-
-
- Bounds
- {{162, 324}, {189, 324}}
- Class
- ShapedGraphic
- ID
- 13
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
- MiddleColor
-
- b
- 0.588235
- g
- 0.917647
- r
- 0.568627
-
- TrippleBlend
- YES
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs48 \cf0 GCD}
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2013-09-30 17:46:58 +0000
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSHorizonalPagination
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- size
- {612, 792}
-
- NSPrintReverseOrientation
-
- int
- 0
-
- NSPrinter
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAlOU1ByaW50ZXIAhIQITlNPYmplY3QAhZKEhIQITlNTdHJpbmcBlIQBKxdFUFNPTiBTdHlsdXMgUGhvdG8gUjIwMIaG
-
- NSPrinterName
-
- string
- EPSON Stylus Photo R200
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{526, 4}, {710, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{0, -1}, {575, 735}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 1
- 1
-
-
-
-
-
diff --git a/doc/bootcamp/figs/gcd.pdf b/doc/bootcamp/figs/gcd.pdf
deleted file mode 100644
index 7eb7e390..00000000
Binary files a/doc/bootcamp/figs/gcd.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/hdls.pdf b/doc/bootcamp/figs/hdls.pdf
deleted file mode 100644
index eaf8a454..00000000
Binary files a/doc/bootcamp/figs/hdls.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/map.graffle b/doc/bootcamp/figs/map.graffle
deleted file mode 100644
index 71d6ece3..00000000
--- a/doc/bootcamp/figs/map.graffle
+++ /dev/null
@@ -1,705 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.16.0.171715
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {576, 733}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-29 16:34:49 +0000
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{116, 291.5}, {58, 29}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 14
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs48 \cf0 ins[2]}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{116, 192.5}, {58, 29}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 13
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs48 \cf0 ins[1]}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{116, 93.5}, {58, 29}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 12
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs48 \cf0 ins[0]}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 35
-
- ID
- 11
- Points
-
- {289, 306}
- {324, 306}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 9
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 35
-
- Head
-
- ID
- 9
-
- ID
- 10
- Points
-
- {180, 306}
- {215, 306}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{216, 270}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 35
-
- ID
- 9
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs72 \cf0 * y}
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 35
-
- ID
- 8
- Points
-
- {289, 207}
- {324, 207}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 6
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 35
-
- Head
-
- ID
- 6
-
- ID
- 7
- Points
-
- {180, 207}
- {215, 207}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{216, 171}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 35
-
- ID
- 6
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs72 \cf0 * y}
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 35
-
- ID
- 5
- Points
-
- {289, 108}
- {324, 108}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 3
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 35
-
- Head
-
- ID
- 3
-
- ID
- 4
- Points
-
- {180, 108}
- {215, 108}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{216, 72}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 35
-
- ID
- 3
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs72 \cf0 * y}
-
-
-
- GridInfo
-
- ShowsGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2012-10-30 15:33:04 +0000
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSHorizonalPagination
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- size
- {612, 792}
-
- NSPrintReverseOrientation
-
- int
- 0
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{485, 154}, {710, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{0, -1}, {575, 735}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 1
- 1
-
-
-
-
-
diff --git a/doc/bootcamp/figs/map.pdf b/doc/bootcamp/figs/map.pdf
deleted file mode 100644
index da498099..00000000
Binary files a/doc/bootcamp/figs/map.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/max2.graffle b/doc/bootcamp/figs/max2.graffle
deleted file mode 100644
index 6598f707..00000000
--- a/doc/bootcamp/figs/max2.graffle
+++ /dev/null
@@ -1,614 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.18.0.187838
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {576, 733}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-30 02:58:18 +0000
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 5
-
- ID
- 15
- Points
-
- {145.00001797461832, 324}
- {252, 324}
- {362.89746405004939, 268.5512679749753}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 7
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 5
-
- ID
- 14
- Points
-
- {145.00001797461832, 180}
- {252, 180}
- {362.89746652335219, 235.4487332616761}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 6
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 12
- Points
-
- {433.00001796192754, 252}
- {504, 252}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 5
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 5
-
- ID
- 11
- Points
-
- {289.00001802980552, 252}
- {358.99998196922479, 252}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 3
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 3
-
- ID
- 9
- Points
-
- {141.10253666727107, 307.44873334626055}
- {218.89746625667584, 268.55127249951522}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 7
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 3
-
- ID
- 8
- Points
-
- {141.10253354110631, 196.55126662087338}
- {218.89746671941913, 235.44873285826435}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 6
-
-
-
- Bounds
- {{72, 288}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 7
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 y}
-
-
-
- Bounds
- {{72, 144}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 6
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 x}
-
-
-
- Bounds
- {{360, 216}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 5
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs50 \cf0 Mux}
-
-
-
- Bounds
- {{216, 216}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 3
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 >}
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2013-09-28 18:15:53 +0000
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSHorizonalPagination
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- size
- {612, 792}
-
- NSPrintReverseOrientation
-
- int
- 0
-
- NSPrinter
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAlOU1ByaW50ZXIAhIQITlNPYmplY3QAhZKEhIQITlNTdHJpbmcBlIQBKx9IUCBDb2xvciBMYXNlckpldCBDUDQ1MjAgU2VyaWVzhoY=
-
- NSPrinterName
-
- string
- HP Color LaserJet CP4520 Series
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{610, 4}, {710, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{0, -1}, {575, 735}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 1
- 1
-
-
-
-
-
diff --git a/doc/bootcamp/figs/max2.pdf b/doc/bootcamp/figs/max2.pdf
deleted file mode 100644
index e54872cd..00000000
Binary files a/doc/bootcamp/figs/max2.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/max2c.graffle b/doc/bootcamp/figs/max2c.graffle
deleted file mode 100644
index 11b85c4e..00000000
--- a/doc/bootcamp/figs/max2c.graffle
+++ /dev/null
@@ -1,751 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.18.0.187838
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {2556, 2101}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-30 02:58:18 +0000
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{474, 348}, {59, 37}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- Helvetica
- Size
- 30
-
- ID
- 98
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs62 \cf0 Max}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 30
-
- Head
-
- ID
- 16
-
- ID
- 17
- Points
-
- {433.0000180298054, 252}
- {502.99998196921723, 252}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 5
-
-
-
- Bounds
- {{504, 216}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 16
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 z}
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 30
-
- Head
-
- ID
- 5
-
- ID
- 15
- Points
-
- {145.00001797461832, 324}
- {252, 324}
- {362.89746405004939, 268.5512679749753}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 7
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 30
-
- Head
-
- ID
- 5
-
- ID
- 14
- Points
-
- {145.00001797461832, 180}
- {252, 180}
- {362.89746652335219, 235.4487332616761}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 6
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 30
-
- Head
-
- ID
- 5
-
- ID
- 11
- Points
-
- {289.0000180298054, 252}
- {358.99998196921723, 252}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 3
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 30
-
- Head
-
- ID
- 3
-
- ID
- 9
- Points
-
- {141.10254253215234, 307.44874507178935}
- {218.8974859048902, 268.55131178136298}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 7
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 30
-
- Head
-
- ID
- 3
-
- ID
- 8
- Points
-
- {141.10254001824799, 196.55125367126297}
- {218.89748841844431, 235.44868947542366}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 6
-
-
-
- Bounds
- {{72, 288}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 7
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 y}
-
-
-
- Bounds
- {{72, 144}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 6
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 x}
-
-
-
- Bounds
- {{360, 216}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 5
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs50 \cf0 Mux}
-
-
-
- Bounds
- {{216, 216}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 3
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 >}
-
-
-
- Bounds
- {{108, 108}, {432, 288}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 30
-
- ID
- 18
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
-
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2013-09-28 18:16:37 +0000
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSHorizonalPagination
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
-
- NSLeftMargin
-
- float
- 18
-
- NSOrientation
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwGG
-
- NSPaperName
-
- string
- C19E5E39-BA28-49BB-B976-F8C173C8B751
-
- NSPaperSize
-
- size
- {2592, 2160}
-
- NSPrintReverseOrientation
-
- int
- 0
-
- NSPrinter
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAlOU1ByaW50ZXIAhIQITlNPYmplY3QAhZKEhIQITlNTdHJpbmcBlIQBKx9IUCBDb2xvciBMYXNlckpldCBDUDQ1MjAgU2VyaWVzhoY=
-
- NSPrinterName
-
- string
- HP Color LaserJet CP4520 Series
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{0, 4}, {1440, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{0, 0}, {1305, 735}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 1
- 1
-
-
-
-
-
diff --git a/doc/bootcamp/figs/max2c.pdf b/doc/bootcamp/figs/max2c.pdf
deleted file mode 100644
index d5c66bd0..00000000
Binary files a/doc/bootcamp/figs/max2c.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/max4.graffle b/doc/bootcamp/figs/max4.graffle
deleted file mode 100644
index bbeb2d1b..00000000
--- a/doc/bootcamp/figs/max4.graffle
+++ /dev/null
@@ -1,2253 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.18.0.187838
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {2556, 2101}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-30 02:58:18 +0000
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{765, 110}, {2, 12}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- ID
- 99
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{1147.5, 486}, {62, 53}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- Helvetica
- Size
- 44
-
- ID
- 98
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs88 \cf0 m3}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{571.5, 641}, {62, 53}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- Helvetica
- Size
- 44
-
- ID
- 97
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs88 \cf0 m2}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{571.5, 335}, {62, 53}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- Helvetica
- Size
- 44
-
- ID
- 96
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs88 \cf0 m1}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 94
- Points
-
- {1261.0000179619276, 405}
- {1332, 405}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 72
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 78
-
- ID
- 93
- Points
-
- {680.25627334806234, 539.85584624025762}
- {759.74372664930786, 495.1441537547156}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 59
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 79
-
- ID
- 92
- Points
-
- {680.25627055292478, 270.14415218747757}
- {759.74372944409049, 314.85584781734963}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 46
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 65
-
- ID
- 91
- Points
-
- {109.00001802980542, 630}
- {178.99998196921726, 630}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 85
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 66
-
- ID
- 90
- Points
-
- {109.00001802980542, 486}
- {178.99998196921726, 486}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 84
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 52
-
- ID
- 89
- Points
-
- {109.00001802980542, 324}
- {178.99998196921726, 324}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 86
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 53
-
- ID
- 88
- Points
-
- {109.00001802980542, 180}
- {178.99998196921726, 180}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 87
-
-
-
- Bounds
- {{36, 144}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 87
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 a}
-
-
-
- Bounds
- {{36, 288}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 86
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 b}
-
-
-
- Bounds
- {{36, 594}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 85
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 d}
-
-
-
- Bounds
- {{36, 450}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 84
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 c}
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 72
-
- ID
- 71
- Points
-
- {1117.000018029805, 404.99999199527002}
- {1186.9999819692187, 404.99999199527002}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 80
-
-
-
- Bounds
- {{1188, 369}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 72
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 z}
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 80
-
- ID
- 73
- Points
-
- {829.00001797461834, 477}
- {936, 477}
- {1046.8974640500494, 421.5512679749753}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 78
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 80
-
- ID
- 74
- Points
-
- {829.00001797461834, 333}
- {936, 333}
- {1046.8974665233523, 388.44873326167607}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 79
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 80
-
- ID
- 75
- Points
-
- {973.00001802980512, 404.99999199527002}
- {1042.9999819692187, 404.99999199527002}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 81
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 81
-
- ID
- 76
- Points
-
- {825.10253596595578, 460.44873194415652}
- {902.89746390650521, 421.5512678026389}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 78
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 81
-
- ID
- 77
- Points
-
- {825.10253350995174, 349.55126668314847}
- {902.8974666146579, 388.44873306669837}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 79
-
-
-
- Bounds
- {{756, 441}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 78
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 y}
-
-
-
- Bounds
- {{756, 297}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 79
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 x}
-
-
-
- Bounds
- {{1044, 369}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 80
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs50 \cf0 Mux}
-
-
-
- Bounds
- {{900, 369}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 81
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 >}
-
-
-
- Bounds
- {{792, 261}, {432, 288}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 82
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 59
-
- ID
- 58
- Points
-
- {541.00001802980546, 558}
- {610.99998196921717, 558}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 67
-
-
-
- Bounds
- {{612, 522}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 59
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 z}
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 67
-
- ID
- 60
- Points
-
- {253.00001797461834, 630}
- {360, 630}
- {470.89746405004945, 574.5512679749753}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 65
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 67
-
- ID
- 61
- Points
-
- {253.00001797461834, 486}
- {360, 486}
- {470.89746652335214, 541.44873326167613}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 66
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 67
-
- ID
- 62
- Points
-
- {397.0000180298054, 558}
- {466.99998196921723, 558}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 68
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 68
-
- ID
- 63
- Points
-
- {249.10253599511935, 613.44873200244035}
- {326.89746400495943, 574.55126799752031}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 65
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 68
-
- ID
- 64
- Points
-
- {249.10253348121392, 502.55126674060699}
- {326.89746651850771, 541.44873325925391}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 66
-
-
-
- Bounds
- {{180, 594}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 65
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 y}
-
-
-
- Bounds
- {{180, 450}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 66
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 x}
-
-
-
- Bounds
- {{468, 522}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 67
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs50 \cf0 Mux}
-
-
-
- Bounds
- {{324, 522}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 68
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 >}
-
-
-
- Bounds
- {{216, 414}, {432, 288}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 69
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 46
-
- ID
- 45
- Points
-
- {541.00001802980546, 252}
- {610.99998196921717, 252}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 54
-
-
-
- Bounds
- {{612, 216}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 46
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 z}
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 54
-
- ID
- 47
- Points
-
- {253.00001797461834, 324}
- {360, 324}
- {470.89746405004939, 268.5512679749753}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 52
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 54
-
- ID
- 48
- Points
-
- {253.00001797461834, 180}
- {360, 180}
- {470.89746652335214, 235.44873326167607}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 53
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 54
-
- ID
- 49
- Points
-
- {397.0000180298054, 252}
- {466.99998196921723, 252}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 55
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 55
-
- ID
- 50
- Points
-
- {249.10253599511935, 307.44873200244029}
- {326.89746400495949, 268.55126799752026}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 52
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 55
-
- ID
- 51
- Points
-
- {249.10253348121395, 196.55126674060699}
- {326.89746651850771, 235.44873325925386}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 53
-
-
-
- Bounds
- {{180, 288}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 52
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 y}
-
-
-
- Bounds
- {{180, 144}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 53
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 x}
-
-
-
- Bounds
- {{468, 216}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 54
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs50 \cf0 Mux}
-
-
-
- Bounds
- {{324, 216}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 55
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 >}
-
-
-
- Bounds
- {{216, 108}, {432, 288}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 56
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
-
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2013-09-28 18:18:01 +0000
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSHorizonalPagination
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
-
- NSLeftMargin
-
- float
- 18
-
- NSOrientation
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwGG
-
- NSPaperName
-
- string
- 093B99D8-5836-409F-8C84-37C9552186E7
-
- NSPaperSize
-
- size
- {2592, 2160}
-
- NSPrintReverseOrientation
-
- int
- 0
-
- NSPrinter
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAlOU1ByaW50ZXIAhIQITlNPYmplY3QAhZKEhIQITlNTdHJpbmcBlIQBKx9IUCBDb2xvciBMYXNlckpldCBDUDQ1MjAgU2VyaWVzhoY=
-
- NSPrinterName
-
- string
- HP Color LaserJet CP4520 Series
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{0, 4}, {1440, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{0, 0}, {1305, 735}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 1
- 1
-
-
-
-
-
diff --git a/doc/bootcamp/figs/max4.pdf b/doc/bootcamp/figs/max4.pdf
deleted file mode 100644
index 428c62da..00000000
Binary files a/doc/bootcamp/figs/max4.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/predicate-filter.graffle b/doc/bootcamp/figs/predicate-filter.graffle
deleted file mode 100644
index 76d21463..00000000
Binary files a/doc/bootcamp/figs/predicate-filter.graffle and /dev/null differ
diff --git a/doc/bootcamp/figs/predicate-filter.pdf b/doc/bootcamp/figs/predicate-filter.pdf
deleted file mode 100644
index bbc42e5d..00000000
Binary files a/doc/bootcamp/figs/predicate-filter.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/programming-in-scala.pdf b/doc/bootcamp/figs/programming-in-scala.pdf
deleted file mode 100644
index b89bad06..00000000
Binary files a/doc/bootcamp/figs/programming-in-scala.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/programming-scala.pdf b/doc/bootcamp/figs/programming-scala.pdf
deleted file mode 100644
index 4e7f9e7f..00000000
Binary files a/doc/bootcamp/figs/programming-scala.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/reduce.graffle b/doc/bootcamp/figs/reduce.graffle
deleted file mode 100644
index 519f8343..00000000
--- a/doc/bootcamp/figs/reduce.graffle
+++ /dev/null
@@ -1,809 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.16.0.171715
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {576, 733}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-29 16:38:27 +0000
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{45, 227}, {58, 29}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 20
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs48 \cf0 ins[3]}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{45, 180}, {58, 29}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 19
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs48 \cf0 ins[2]}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{45, 115}, {58, 29}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 18
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs48 \cf0 ins[1]}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{45, 72}, {58, 29}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 17
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs48 \cf0 ins[0]}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- ID
- 16
- Points
-
- {325, 162}
- {360, 162}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 7
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- Head
-
- ID
- 7
-
- ID
- 15
- Points
-
- {216.89442723080541, 197.55278638459728}
- {251.10557276741244, 180.44721361629377}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 4
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- Head
-
- ID
- 7
-
- ID
- 14
- Points
-
- {216.89442723080541, 126.4472136154027}
- {251.10557276741244, 143.55278638370623}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 3
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- Head
-
- ID
- 4
-
- ID
- 13
- Points
-
- {108, 243}
- {143.06367082891941, 229.85112343915523}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- Head
-
- ID
- 4
-
- ID
- 12
- Points
-
- {108, 198}
- {143.02985753873992, 206.75746438468499}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- Head
-
- ID
- 3
-
- ID
- 11
- Points
-
- {108, 126}
- {143.02985753873992, 117.24253561531502}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- Head
-
- ID
- 3
-
- ID
- 10
- Points
-
- {108, 90}
- {143.02985753873992, 98.75746438468498}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{252, 126}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- ID
- 7
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs52 \cf0 Max}
-
-
-
- Bounds
- {{144, 180}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- ID
- 4
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs52 \cf0 Max}
-
-
-
- Bounds
- {{144, 72}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- ID
- 3
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs52 \cf0 Max}
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2012-10-30 15:35:30 +0000
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSHorizonalPagination
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- size
- {612, 792}
-
- NSPrintReverseOrientation
-
- int
- 0
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{28, 136}, {710, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{0, -1}, {575, 735}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 1
- 1
-
-
-
-
-
diff --git a/doc/bootcamp/figs/reduce.pdf b/doc/bootcamp/figs/reduce.pdf
deleted file mode 100644
index 56b0bd94..00000000
Binary files a/doc/bootcamp/figs/reduce.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/reduceMax.graffle b/doc/bootcamp/figs/reduceMax.graffle
deleted file mode 100644
index cc5078ae..00000000
--- a/doc/bootcamp/figs/reduceMax.graffle
+++ /dev/null
@@ -1,1259 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.18.0.187838
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {2556, 2101}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-30 02:58:18 +0000
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Class
- LineGraphic
- ID
- 112
- Points
-
- {865.0000179619276, 396}
- {936, 396}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 80
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 80
-
- ID
- 109
- Points
-
- {577.00001797461834, 243}
- {684, 243}
- {802.64131128491238, 369.05639324021945}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 54
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 80
-
- ID
- 108
- Points
-
- {577.00001797461834, 549}
- {684, 549}
- {802.64131548861667, 422.94360229334484}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 67
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 81
-
- ID
- 106
- Points
-
- {565.35868150189742, 522.05639476411602}
- {658.6413011055273, 422.94358884866341}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 67
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 81
-
- ID
- 105
- Points
-
- {565.35869176768369, 269.9436037970541}
- {658.64132581171339, 369.05637963949295}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 54
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 80
-
- ID
- 75
- Points
-
- {721.00001802980023, 395.99997527931413}
- {790.99998196928038, 395.99992851049581}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 81
-
-
-
- Bounds
- {{792, 360}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 80
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs50 \cf0 Mux}
-
-
-
- Bounds
- {{648, 360}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 81
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 >}
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 67
-
- ID
- 60
- Points
-
- {289.00001797461829, 621}
- {396, 621}
- {506.89746405004945, 565.5512679749753}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 65
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 67
-
- ID
- 61
- Points
-
- {289.00001797461829, 477}
- {396, 477}
- {506.89746652335214, 532.44873326167613}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 66
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 67
-
- ID
- 62
- Points
-
- {433.0000180298054, 549}
- {502.99998196921723, 549}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 68
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 68
-
- ID
- 63
- Points
-
- {285.10253599511935, 604.44873200244035}
- {362.89746400495943, 565.55126799752031}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 65
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 68
-
- ID
- 64
- Points
-
- {285.10253348121392, 493.55126674060699}
- {362.89746651850771, 532.44873325925391}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 66
-
-
-
- Bounds
- {{216, 585}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 65
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 c}
-
-
-
- Bounds
- {{216, 441}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 66
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 b}
-
-
-
- Bounds
- {{504, 513}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 67
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs50 \cf0 Mux}
-
-
-
- Bounds
- {{360, 513}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 68
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 >}
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 54
-
- ID
- 47
- Points
-
- {289.00001797461829, 315}
- {396, 315}
- {506.89746405004939, 259.5512679749753}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 52
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 54
-
- ID
- 104
- Points
-
- {289.00001797461829, 171}
- {396, 171}
- {506.89746652335214, 226.44873326167607}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 101
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 54
-
- ID
- 49
- Points
-
- {433.0000180298054, 243}
- {502.99998196921723, 243}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 55
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 55
-
- ID
- 50
- Points
-
- {285.10253599511935, 298.44873200244029}
- {362.89746400495943, 259.55126799752026}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 52
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- Head
-
- ID
- 55
-
- ID
- 103
- Points
-
- {285.10253348121398, 187.55126674060699}
- {362.89746651850771, 226.44873325925386}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 101
-
-
-
- Bounds
- {{216, 279}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 52
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 b}
-
-
-
- Bounds
- {{216, 135}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 101
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 a}
-
-
-
- Bounds
- {{504, 207}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 54
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs50 \cf0 Mux}
-
-
-
- Bounds
- {{360, 207}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 31
-
- ID
- 55
- Shape
- Circle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs64 \cf0 >}
-
-
-
- Bounds
- {{198, 117}, {108, 558}}
- Class
- ShapedGraphic
- ID
- 110
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
- MiddleColor
-
- b
- 0.588235
- g
- 0.917647
- r
- 0.568627
-
- TrippleBlend
- YES
-
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2013-09-28 18:19:08 +0000
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSHorizonalPagination
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
-
- NSLeftMargin
-
- float
- 18
-
- NSOrientation
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwGG
-
- NSPaperName
-
- string
- 18BA442E-9CCD-43C3-85D0-3F632324736D
-
- NSPaperSize
-
- size
- {2592, 2160}
-
- NSPrintReverseOrientation
-
- int
- 0
-
- NSPrinter
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAlOU1ByaW50ZXIAhIQITlNPYmplY3QAhZKEhIQITlNTdHJpbmcBlIQBKx9IUCBDb2xvciBMYXNlckpldCBDUDQ1MjAgU2VyaWVzhoY=
-
- NSPrinterName
-
- string
- HP Color LaserJet CP4520 Series
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{0, 4}, {1440, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{0, 0}, {1305, 735}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 1
- 1
-
-
-
-
-
diff --git a/doc/bootcamp/figs/reduceMax.pdf b/doc/bootcamp/figs/reduceMax.pdf
deleted file mode 100644
index 17fafa41..00000000
Binary files a/doc/bootcamp/figs/reduceMax.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/shift-register.graffle b/doc/bootcamp/figs/shift-register.graffle
deleted file mode 100644
index 6885978c..00000000
Binary files a/doc/bootcamp/figs/shift-register.graffle and /dev/null differ
diff --git a/doc/bootcamp/figs/shift-register.pdf b/doc/bootcamp/figs/shift-register.pdf
deleted file mode 100644
index 236f2433..00000000
Binary files a/doc/bootcamp/figs/shift-register.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/simple-counter.pdf b/doc/bootcamp/figs/simple-counter.pdf
deleted file mode 100644
index 9b0aa493..00000000
Binary files a/doc/bootcamp/figs/simple-counter.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/synthesizable.pdf b/doc/bootcamp/figs/synthesizable.pdf
deleted file mode 100644
index 1408886c..00000000
Binary files a/doc/bootcamp/figs/synthesizable.pdf and /dev/null differ
diff --git a/doc/bootcamp/figs/trouter.graffle b/doc/bootcamp/figs/trouter.graffle
deleted file mode 100644
index 1d7b8c15..00000000
--- a/doc/bootcamp/figs/trouter.graffle
+++ /dev/null
@@ -1,2541 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 138.33.0.157554
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {576, 733}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-29 16:31:24 -0700
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 68
- Points
-
- {486, 294}
- {522, 294}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 69
- Points
-
- {486, 276}
- {522, 276}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 70
- Points
-
- {513, 276}
- {513, 294}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 71
- Points
-
- {504, 276}
- {504, 294}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 72
- Points
-
- {495, 276}
- {495, 294}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 67
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 62
- Points
-
- {486, 259}
- {522, 259}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 63
- Points
-
- {486, 241}
- {522, 241}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 64
- Points
-
- {513, 241}
- {513, 259}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 65
- Points
-
- {504, 241}
- {504, 259}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 66
- Points
-
- {495, 241}
- {495, 259}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 61
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 56
- Points
-
- {486, 224}
- {522, 224}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 57
- Points
-
- {486, 206}
- {522, 206}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 58
- Points
-
- {513, 206}
- {513, 224}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 59
- Points
-
- {504, 206}
- {504, 224}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 60
- Points
-
- {495, 206}
- {495, 224}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 55
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 50
- Points
-
- {486, 189}
- {522, 189}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 51
- Points
-
- {486, 171}
- {522, 171}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 52
- Points
-
- {513, 171}
- {513, 189}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 53
- Points
-
- {504, 171}
- {504, 189}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 54
- Points
-
- {495, 171}
- {495, 189}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 49
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 44
- Points
-
- {486, 153}
- {522, 153}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 45
- Points
-
- {486, 135}
- {522, 135}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 46
- Points
-
- {513, 135}
- {513, 153}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 47
- Points
-
- {504, 135}
- {504, 153}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 48
- Points
-
- {495, 135}
- {495, 153}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 43
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 38
- Points
-
- {36, 278}
- {72, 278}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 39
- Points
-
- {36, 260}
- {72, 260}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 40
- Points
-
- {63, 260}
- {63, 278}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 41
- Points
-
- {54, 260}
- {54, 278}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 42
- Points
-
- {45, 260}
- {45, 278}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 37
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 32
- Points
-
- {36, 224}
- {72, 224}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 33
- Points
-
- {36, 206}
- {72, 206}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 34
- Points
-
- {63, 206}
- {63, 224}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 35
- Points
-
- {54, 206}
- {54, 224}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 36
- Points
-
- {45, 206}
- {45, 224}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 31
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 26
- Points
-
- {36, 170}
- {72, 170}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 27
- Points
-
- {36, 152}
- {72, 152}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 28
- Points
-
- {63, 152}
- {63, 170}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 29
- Points
-
- {54, 152}
- {54, 170}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 30
- Points
-
- {45, 152}
- {45, 170}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 25
-
-
- Bounds
- {{393, 126.5}, {72, 35}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 21
-
- ID
- 20
- Line
-
- ID
- 19
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 3
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs42 \cf0 replies}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 19
- Points
-
- {378, 144}
- {486, 144}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Bounds
- {{109.5, 252.5}, {27, 35}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 21
-
- ID
- 18
- Line
-
- ID
- 17
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 3
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs42 \cf0 in}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 17
- Points
-
- {72, 270}
- {180, 270}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Bounds
- {{91.5, 144.5}, {63, 35}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 21
-
- ID
- 16
- Line
-
- ID
- 15
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 3
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs42 \cf0 reads}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 15
- Points
-
- {72, 162}
- {180, 162}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Bounds
- {{394, 271.5}, {70, 33}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 19
-
- ID
- 14
- Line
-
- ID
- 13
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 3
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs38 \cf0 outs(3)}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 18
-
- ID
- 13
- Points
-
- {378, 288}
- {486, 288}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Bounds
- {{394, 235.5}, {70, 33}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 19
-
- ID
- 12
- Line
-
- ID
- 11
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 3
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs38 \cf0 outs(2)}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 18
-
- ID
- 11
- Points
-
- {378, 252}
- {486, 252}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Bounds
- {{394, 199.5}, {70, 33}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 19
-
- ID
- 10
- Line
-
- ID
- 9
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 3
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs38 \cf0 outs(1)}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 18
-
- ID
- 9
- Points
-
- {378, 216}
- {486, 216}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Bounds
- {{394, 163.5}, {70, 33}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 19
-
- ID
- 8
- Line
-
- ID
- 7
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 3
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs38 \cf0 outs(0)}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 18
-
- ID
- 7
- Points
-
- {378, 180}
- {486, 180}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Bounds
- {{90.5, 198.5}, {65, 35}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 21
-
- ID
- 6
- Line
-
- ID
- 5
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 3
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs42 \cf0 writes}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 5
- Points
-
- {72, 216}
- {180, 216}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Bounds
- {{180, 117}, {198, 198}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 3
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs70 \cf0 Router}
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2012-05-30 10:32:19 -0700
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAx7X05TU2l6ZT1mZn2WgWQCgRgDhg==
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- QuickLookPreview
-
- JVBERi0xLjMKJcTl8uXrp/Og0MTGCjUgMCBvYmoKPDwgL0xlbmd0aCA2IDAgUiAvRmls
- dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGtWE1vGzkMvetX8GgfPNXnfFw32B56
- y8bAHto9LLIJkCJpt3GL/v0+ktJ4nI5mpkVgGKY9jxT5+CQq+ULX9IUsXqlrqQuBnu/o
- b/pEb65Ojm5P5OR1uqWDbRLxewK8J9dbiq4nN8jbwPuePH2H1zu8P2qcqxtZwtLNFVZz
- 8uXAH7zg7ZNEca4rUTiHG3PNvp5zsIT1J36+GygBDs8/jsjJWuvpeEsBCeJ1wOch+Sb5
- 1AZywRyf6M1b11isfLyn3V+fv329e97T8SP9eUT9AelOoo9ZdZ68awnptbFxbJtHuoGD
- RW0Wtc05uS414aUfPY4xXNNzREYZjj4+8bbx+Mbxf+J+QHuspTZxiULxJTVmpNT5MKHG
- 59/xefBdg0YNiTr08JKR97T7vucGe9o9P+yNWl/3oBa/3JVHpz39Q8d3Slrp7xwHoYMY
- IIwnEzsL5theZy72DsyJH039xDbMGDN3Rj2OqFhnLgyBJRs66iyJus19VVfRQ1dJFAld
- uUHVhM+DH5rUtv1wQR5Yh5xA3ufC0LdiFO5OH3a2/PZhv4U/A1Ezf6o85UF1sqY8ZWbi
- l/VVYqjyzqjCn19SXubPOuVP9/el+M77Wfgb9+Ur8ed+k7/kWS2iPw97q/4Ym/2M+uUY
- sZvo7+JJatf0F7FzRX/r/KE/+Vx7Jf78b/LXy25T/mBv5u/sZ7z4Zf76MOVv+mTwq/xh
- Y27lL6bX5S/8On8YHK5lGengYHudPh0cEz+jfjlGUvmdUWVwuHZBfoPDgRYJYzCkZe3J
- 4OiK9i4GB+K3KfTzZ9/zOB7+LUT9V4xNA4MPPJ606G8hjO2thE38jPrlad3qvFDCLp50
- C/PC2YFibJHOJsYimH15C5ly1zeu8wEgDN2X15CHT+cryOo0jbGcSuRi3HAPyXPy0g+s
- 6m50YTjvRoOI5yexX9qNuFXhAui5Y3NXETO5Dsg0wMhUfqasBNsMwUKbs1eRoiiz+78I
- 6bEYD8UYVbdZYzgXnJ7tMEaBTfId733YMIpko4pk3fL1UmKyUUUyA6HNSD4bxnH0cnUZ
- /kAilGyK5ZioyFu+n7LhuYV8RZiLiUIUyUYVyXmiEEWyUUXmPBXJmxdpzK+ea+dQus0X
- Y3IhLdfOBi5B9ZhciCDZqCJzjxTJFVWRJU+JyRXBmF+91I5Q+eBayjPiwu2wU1ASW7hc
- 1qMmC70JVqwqlnNNjv+y4bhiVbGcbewhKcV6qA/WfA4cV7CIhriMXY7LFWFk5Nqw1etx
- pSLBilXFcr5SkWK5yip2zFexnC+s+RxGHhAt17YcF7WpvLlvyzuBK1KsWFWFl75lLGpb
- jsu9yFjUxtZ8bYUH3WTct5W4XFEsffNprW+Kldqq2NK3jOXaqtgxX8lB8oU1X1vpG0fT
- vq3E5drwnwzVpB8WT0Xum2Cltip27JtiubYqdsxXsdwLWPO1jTwgWq5tjHv9A8F6m+wK
- ZW5kc3RyZWFtCmVuZG9iago2IDAgb2JqCjEwOTQKZW5kb2JqCjMgMCBvYmoKPDwgL1R5
- cGUgL1BhZ2UgL1BhcmVudCA0IDAgUiAvUmVzb3VyY2VzIDcgMCBSIC9Db250ZW50cyA1
- IDAgUiAvTWVkaWFCb3ggWzAgMCA1NzYgNzMzXQo+PgplbmRvYmoKNyAwIG9iago8PCAv
- UHJvY1NldCBbIC9QREYgL1RleHQgXSAvQ29sb3JTcGFjZSA8PCAvQ3MyIDkgMCBSIC9D
- czEgOCAwIFIgPj4gL0ZvbnQgPDwKL0YxLjAgMTAgMCBSID4+ID4+CmVuZG9iagoxMSAw
- IG9iago8PCAvTGVuZ3RoIDEyIDAgUiAvTiAxIC9BbHRlcm5hdGUgL0RldmljZUdyYXkg
- L0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBhVJPSBRRHP7NNhKEiEGFeIh3
- CgmVKaysoNp2dVmVbVuV0qIYZ9+6o7Mz05vZNcWTBF2iPHUPomN07NChm5eiwKxL1yCp
- IAg8dej7zezqKIRveTvf+/39ft97RG2dpu87KUFUc0OVK6Wnbk5Ni4MfKUUd1E5YphX4
- 6WJxjLHruZK/u9fWZ9LYst7HtXb79j21lWVgIeottrcQ+iGRZgAfmZ8oZYCzwB2Wr9g+
- ATxYDqwa8COiAw+auTDT0Zx0pbItkVPmoigqr2I7Sa77+bnGvou1iYP+XI9m1o69s+qq
- 0UzUtPdEobwPrkQZz19U9mw1FKcN45xIQxop8q7V3ytMxxGRKxBKBlI1ZLmfak6ddeB1
- GLtdupPj+PYQpT7JYKiJtemymR2FfQB2KsvsEPAF6PGyYg/ngXth/1tRw5PAJ2E/ZId5
- 1q0f9heuU+B7hD014M4UrsXx2oofXi0BQ/dUI2iMc03E09c5c6SI7zHUGZj3RjmmCzF3
- lqoTN4A7YR9ZqmYKsV37ruol7nsCd9PjO9GbOQtcoBxJcrEV2RTQPAlYFH2LsEkOPD7O
- HlXgd6iYwBy5idzNKPce1REbZ6NSgVZ6jVfGT+O58cX4ZWwYz4B+rHbXe3z/6eMVdde2
- Pjz5jXrcOa69nRtVYVZxZQvd/8cyhI/ZJzmmwdOhWVhr2HbkD5rMTLAMKMR/BT6X+pIT
- VdzV7u24RRLMUD4sbCW6S1RuKdTqPYNKrBwr2AB2cJLELFocuFNrujl4d9giem35TVey
- 64b++vZ6+9ryHm3KqCkoE82zRGaUsVuj5N142/1mkRGfODq+572KWsn+SUUQP4U5Wiry
- FFX0VlDWxG9nDn4btn5cP6Xn9UH9PAk9rZ/Rr+ijEb4MdEnPwnNRH6NJ8LBpIeISoIqD
- M9ROVGONA+Ip8fK0W2SR/Q9AGf1mCmVuZHN0cmVhbQplbmRvYmoKMTIgMCBvYmoKNzA0
- CmVuZG9iago5IDAgb2JqClsgL0lDQ0Jhc2VkIDExIDAgUiBdCmVuZG9iagoxMyAwIG9i
- ago8PCAvTGVuZ3RoIDE0IDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmls
- dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJ
- WatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6r
- KGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQl
- VdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Ep
- x3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2lu
- ZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0c
- GDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m
- 1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuT
- ezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry
- 4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymM
- FMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfN
- xGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVR
- lBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F9
- 8LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl
- 12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UUK
- ZW5kc3RyZWFtCmVuZG9iagoxNCAwIG9iago3MzcKZW5kb2JqCjggMCBvYmoKWyAvSUND
- QmFzZWQgMTMgMCBSIF0KZW5kb2JqCjQgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9NZWRp
- YUJveCBbMCAwIDYxMiA3OTJdIC9Db3VudCAxIC9LaWRzIFsgMyAwIFIgXSA+PgplbmRv
- YmoKMTUgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL091dGxpbmVzIDIgMCBSIC9QYWdl
- cyA0IDAgUiA+PgplbmRvYmoKMiAwIG9iago8PCAvTGFzdCAxNiAwIFIgL0ZpcnN0IDE3
- IDAgUiA+PgplbmRvYmoKMTcgMCBvYmoKPDwgL1BhcmVudCAxOCAwIFIgL0NvdW50IDAg
- L0Rlc3QgWyAzIDAgUiAvWFlaIDAgNzMzIDAgXSAvVGl0bGUgKENhbnZhcyAxKQo+Pgpl
- bmRvYmoKMTggMCBvYmoKPDwgPj4KZW5kb2JqCjE2IDAgb2JqCjw8IC9QYXJlbnQgMTgg
- MCBSIC9Db3VudCAwIC9EZXN0IFsgMyAwIFIgL1hZWiAwIDczMyAwIF0gL1RpdGxlIChD
- YW52YXMgMSkKPj4KZW5kb2JqCjE5IDAgb2JqCjw8IC9MZW5ndGggMjAgMCBSIC9MZW5n
- dGgxIDEwMzI0IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ab16CXhU1dn/
- e+4y986Syez7ZOZmMlv2hWwmkEvIBgQMCUKCBBMgkLDIYoiECg0tfEhUXICI2NaiLbJo
- GUKUAdSP2ijaTbTu21crtH59mr/994/WKpn53nsnSSHPVx+f5+/Te+c957xnfc/vvOc9
- y53ujZs6IAn6gIaGRe3rV4D8BJ4AIEeWrW1fn+CNPPrRZT3d3gTPhgDoNSvWr1yb4Pl9
- ACr3yjW9Y+WNfwEwNHR2tC9PpMNV9Is6MSLBkynop3Wu7d6c4A1D6M9fs27ZWLrxPPKZ
- a9s3j7UP7yPvvbV9bQf6+ATuRCdt/brbumUWAuXo16/f2DGWnzSjfK8AwVgzrAMlrAYO
- KNDh2wrAfaJyA4OpUjo+yzPVe29JLv8M9FI3AW6Zc6/svyg88+YXHVeD6vv5f2CEcjy/
- 5CvCsTCAhmD6iPr+iRS5HDrmKDRlRGEmUgVSIVJGxnQb9JHDcB/Sj5Fo6CJ3QS/SbqSH
- kJiJ0FHkzpC7BhlePEt6wUFmiWrGM99k99hUas9rUaIY+pHnHdvH54gdR+8jYh9MAuV0
- FfkxeQSWg4f8FPxkC9RBiBw8FV7jacOko7AeqQ+Jll1Cjg6m5HueI5ngZwiWCUAKQ572
- /Ckvy3M5L0qRQc/zwSiD3s9TkBOTPefdP/L8p3ul5zmk44mkY2HM8bTnqHuNZ29KlBwc
- 9DzgjhIsc3/C2+TGok971oYHPMvz5PT6gSh1fNBTiukLRLWnqETwFLoveXKCUZ4gn+Wu
- 96Tn/caThgUxmxcr9Yt6j8u913MDJqW4q4M3IJ0jx8jDkE4eHvTP8pzFIHb31MxwyUCU
- fOdUXSjPHyVbxKK60EC4LugP13v84ZpgEMMLXuJ2cDdz07l8LoMLcQFO4JyciTfwOl7L
- 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
- JvHy/+2uaX/TpPTbJf5/AO1vi8oKZW5kc3RyZWFtCmVuZG9iagoyMCAwIG9iago2NzYy
- CmVuZG9iagoyMSAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0FzY2VudCA3
- NzAgL0NhcEhlaWdodCA3MTcgL0Rlc2NlbnQgLTIzMCAvRmxhZ3MgMzIKL0ZvbnRCQm94
- IFstOTUxIC00ODEgMTQ0NSAxMTIyXSAvRm9udE5hbWUgL0VTWUxQQytIZWx2ZXRpY2Eg
- L0l0YWxpY0FuZ2xlIDAKL1N0ZW1WIDAgL01heFdpZHRoIDE1MDAgL1hIZWlnaHQgNjM3
- IC9Gb250RmlsZTIgMTkgMCBSID4+CmVuZG9iagoyMiAwIG9iagpbIDMzMyAzMzMgMCAw
- IDAgMCAwIDAgNTU2IDU1NiA1NTYgNTU2IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
- MCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDcyMiAwIDAgMCAwIDAgMCAw
- IDAgMCAwIDAgMCAwIDAgNTU2IDAgMCA1NTYgNTU2IDAKMCAwIDIyMiAwIDAgMjIyIDAg
- NTU2IDU1NiA1NTYgMCAzMzMgNTAwIDI3OCA1NTYgMCA3MjIgXQplbmRvYmoKMTAgMCBv
- YmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNlRm9udCAvRVNZ
- TFBDK0hlbHZldGljYSAvRm9udERlc2NyaXB0b3IKMjEgMCBSIC9XaWR0aHMgMjIgMCBS
- IC9GaXJzdENoYXIgNDAgL0xhc3RDaGFyIDExOSAvRW5jb2RpbmcgL01hY1JvbWFuRW5j
- b2RpbmcKPj4KZW5kb2JqCjIzIDAgb2JqCihNYWMgT1MgWCAxMC42LjggUXVhcnR6IFBE
- RkNvbnRleHQpCmVuZG9iagoyNCAwIG9iagooRDoyMDEyMDUzMDE3MzIyN1owMCcwMCcp
- CmVuZG9iagoxIDAgb2JqCjw8IC9Qcm9kdWNlciAyMyAwIFIgL0NyZWF0aW9uRGF0ZSAy
- NCAwIFIgL01vZERhdGUgMjQgMCBSID4+CmVuZG9iagp4cmVmCjAgMjUKMDAwMDAwMDAw
- MCA2NTUzNSBmIAowMDAwMDExMTc3IDAwMDAwIG4gCjAwMDAwMDMzMzMgMDAwMDAgbiAK
- MDAwMDAwMTIxMCAwMDAwMCBuIAowMDAwMDAzMTg0IDAwMDAwIG4gCjAwMDAwMDAwMjIg
- MDAwMDAgbiAKMDAwMDAwMTE5MCAwMDAwMCBuIAowMDAwMDAxMzE0IDAwMDAwIG4gCjAw
- MDAwMDMxNDggMDAwMDAgbiAKMDAwMDAwMjI1MiAwMDAwMCBuIAowMDAwMDEwOTA4IDAw
- MDAwIG4gCjAwMDAwMDE0MjQgMDAwMDAgbiAKMDAwMDAwMjIzMiAwMDAwMCBuIAowMDAw
- MDAyMjg4IDAwMDAwIG4gCjAwMDAwMDMxMjggMDAwMDAgbiAKMDAwMDAwMzI2NyAwMDAw
- MCBuIAowMDAwMDAzNDk2IDAwMDAwIG4gCjAwMDAwMDMzODEgMDAwMDAgbiAKMDAwMDAw
- MzQ3NCAwMDAwMCBuIAowMDAwMDAzNTg5IDAwMDAwIG4gCjAwMDAwMTA0NDIgMDAwMDAg
- biAKMDAwMDAxMDQ2MyAwMDAwMCBuIAowMDAwMDEwNjg4IDAwMDAwIG4gCjAwMDAwMTEw
- ODMgMDAwMDAgbiAKMDAwMDAxMTEzNSAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDI1
- IC9Sb290IDE1IDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8MzU3YTQ4YzdlOTc3NmVhYzUz
- OWZlZDJmYzQ3MjUzZjY+CjwzNTdhNDhjN2U5Nzc2ZWFjNTM5ZmVkMmZjNDcyNTNmNj4g
- XSA+PgpzdGFydHhyZWYKMTEyNTIKJSVFT0YKMSAwIG9iago8PC9BdXRob3IgKEpvbmF0
- aGFuIEJhY2hyYWNoKS9DcmVhdGlvbkRhdGUgKEQ6MjAxMjA1MjkyMzMxMDBaKS9DcmVh
- dG9yIChPbW5pR3JhZmZsZSBQcm9mZXNzaW9uYWwgNS4zLjYpL01vZERhdGUgKEQ6MjAx
- MjA1MzAxNzMyMDBaKS9Qcm9kdWNlciAyMyAwIFIgL1RpdGxlICh0cm91dGVyKT4+CmVu
- ZG9iagp4cmVmCjEgMQowMDAwMDExOTEwIDAwMDAwIG4gCnRyYWlsZXIKPDwvSUQgWzwz
- NTdhNDhjN2U5Nzc2ZWFjNTM5ZmVkMmZjNDcyNTNmNj4gPDM1N2E0OGM3ZTk3NzZlYWM1
- MzlmZWQyZmM0NzI1M2Y2Pl0gL0luZm8gMSAwIFIgL1ByZXYgMTEyNTIgL1Jvb3QgMTUg
- MCBSIC9TaXplIDI1Pj4Kc3RhcnR4cmVmCjEyMDkyCiUlRU9GCg==
-
- QuickLookThumbnail
-
- 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
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{146, 4}, {1160, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{70.5, 0}, {505.5, 352.5}}
- Zoom
- 2
- ZoomValues
-
-
- Canvas 1
- 2
- 1
-
-
-
- saveQuickLookFiles
- YES
-
-
diff --git a/doc/bootcamp/figs/trouter.pdf b/doc/bootcamp/figs/trouter.pdf
deleted file mode 100644
index 72cb59dd..00000000
Binary files a/doc/bootcamp/figs/trouter.pdf and /dev/null differ
diff --git a/doc/bootcamp/scala-intro.tex b/doc/bootcamp/scala-intro.tex
deleted file mode 100644
index c54e6f70..00000000
--- a/doc/bootcamp/scala-intro.tex
+++ /dev/null
@@ -1,198 +0,0 @@
-\begin{frame}[fragile]{Scala Bindings}
-\begin{scala}
-// constant
-val x = 1
-val (x, y) = (1, 2)
-
-// variable
-var y = 2
-y = 3
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Scala Collections}
-\begin{scala}
-// Array's
-val tbl = new Array[Int](256)
-tbl(0) = 32
-val y = tbl(0)
-val n = tbl.length
-
-// ArrayBuffer's
-import scala.collection.mutable.ArrayBuffer
-val buf = new ArrayBuffer[Int]()
-buf += 12
-val z = buf(0)
-val l = buf.length
-
-// List's
-val els = List(1, 2, 3)
-val els2 = x :: y :: y :: Nil
-val a :: b :: c :: Nil = els
-val m = els.length
-
-// Tuple's
-val (x, y, z) = (1, 2, 3)
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Scala Maps and Sets}
-\begin{scala}
-import scala.collection.mutable.HashMap
-
-val vars = new HashMap[String, Int]()
-vars("a") = 1
-vars("b") = 2
-vars.size
-vars.contains("c")
-vars.getOrElse("c", -1)
-vars.keys
-vars.values
-\end{scala}
-
-\begin{scala}
-import scala.collection.mutable.HashSet
-
-val keys = new HashSet[Int]()
-keys += 1
-keys += 5
-keys.size -> 2
-keys.contains(2) -> false
-\end{scala}
-\end{frame}
-
-
-
-\begin{frame}[fragile]{Scala Iteration}
-\begin{scala}
-val tbl = new Array[Int](256)
-
-// loop over all indices
-for (i <- 0 until tbl.length)
- tbl(i) = i
-
-// loop of each sequence element
-val tbl2 = new ArrayBuffer[Int]
-for (e <- tbl)
- tbl2 += 2*e
-
-// loop over hashmap key / values
-for ((x, y) <- vars)
- println("K " + x + " V " + y)
-\end{scala}
-
-% // create second table with doubled elements
-% val tbl2 = for (i <- 0 until 16) yield tbl(i)*2
-% // nested loop
-% for (i <- 0 until 16; j <- 0 until 16)
-% tbl(j*16 + i) = i
-
-\end{frame}
-
-\begin{frame}[fragile]{Scala Functions}
-\begin{scala}
-// simple scaling function, e.g., x2(3) => 6
-def x2 (x: Int) = 2 * x
-\end{scala}
-
-\begin{scala}
-// more complicated function with statements
-def f (x: Int, y: Int) = {
- val xy = x + y;
- if (x < y) xy else -xy
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Scala Functional}
-\begin{scala}
-// simple scaling function, e.g., x2(3) => 6
-def x2 (x: Int) = 2 * x
-\end{scala}
-
-\begin{scala}
-// produce list of 2 * elements, e.g., x2list(List(1, 2, 3)) => List(2, 4, 6)
-def x2list (xs: List[Int]) = xs.map(x2)
-\end{scala}
-
-\begin{scala}
-// simple addition function, e.g., add(1, 2) => 3
-def add (x: Int, y: Int) = x + y
-\end{scala}
-
-\begin{scala}
-// sum all elements using pairwise reduction, e.g., sum(List(1, 2, 3)) => 6
-def sum (xs: List[Int]) = xs.foldLeft(0)(add)
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Scala Object Oriented}
-
-\begin{scala}
-class Blimp(r: Double) {
- val rad = r
- println("Another Blimp")
-}
-
-new Blimp(10.0)
-\end{scala}
-
-\begin{scala}
-class Zep(h: Boolean, r: Double) extends Blimp(r) {
- val isHydrogen = h
-}
-
-new Zep(true, 100.0)
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Scala Singleton Objects}
-
-\begin{itemize}
-\item like Java class methods
-\item for top level methods
-\end{itemize}
-\begin{scala}
-object Blimp {
- var numBlimps = 0
- def apply(r: Double) = {
- numBlimps += 1
- new Blimp(r)
- }
-}
-
-Blimp.numBlimps
-Blimp(10.0)
-\end{scala}
-
-\end{frame}
-
-% \begin{frame}[fragile]{Cloning}
-% \begin{itemize}
-% \item shallow copy of object
-% \item user can override method to incorporate parameters
-% \item \verb+this.type+ allows precise return types
-% \end{itemize}
-% \begin{scala}
-% class Blimp(r: Double) {
-% val rad = r
-% override def clone(): this.type = new Blimp(r)
-% }
-%
-% val b1 = new Blimp(10)
-% val b2 = b1.clone()
-% \end{scala}
-% \end{frame}
-% \begin{frame}[fragile]{Scala Console}
-% \begin{scala}
-% > scala
-% scala> 1 + 2
-% => 3
-% scala> def f (x: Int) = 2 * x
-% => (Int) => Int
-% scala> f(4)
-% => 8
-% \end{scala}
-% \end{frame}
-%
diff --git a/doc/cheatsheet/bigduck.png b/doc/cheatsheet/bigduck.png
deleted file mode 100644
index 82ee0d7f..00000000
Binary files a/doc/cheatsheet/bigduck.png and /dev/null differ
diff --git a/doc/cheatsheet/cheatsheet.tex b/doc/cheatsheet/cheatsheet.tex
deleted file mode 100644
index 023007fe..00000000
--- a/doc/cheatsheet/cheatsheet.tex
+++ /dev/null
@@ -1,464 +0,0 @@
-\documentclass[10pt,landscape]{article}
-\usepackage{multicol}
-\usepackage[landscape]{geometry}
-\usepackage[procnames]{listings}
-\usepackage[parfill]{parskip}
-\usepackage{fixltx2e}
-\usepackage[T1]{fontenc}
-\usepackage{lmodern}
-\usepackage{graphicx}
-
-\input{scala.tex}
-
-% Remove section numbering
-\setcounter{secnumdepth}{0}
-
-\geometry{top=.75cm,left=.75cm,right=.75cm,bottom=.75cm}
-
-
-\pagestyle{empty}
-\setlength{\parskip}{0cm}
-
-\makeatletter
-\renewcommand{\section}{\@startsection{section}{1}{0mm}%
- {-0.5ex plus 4ex}%
- {-0.01ex plus .01ex}%x
- {\normalfont\large\bfseries}}
-\renewcommand{\subsection}{\@startsection{subsection}{2}{0mm}%
- {-0.5ex plus 4ex}%
- {-0.01ex plus .01ex}%
- {\normalfont\normalsize\bfseries}}
-\renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{0mm}%
- {-0.01ex plus 0.01ex}%
- {-0.01ex plus .01ex}%
- {\normalfont\small\bfseries}}
-\makeatother
-
-\begin{document}
-\begin{multicols}{3}
-
-\newcommand*\ruleline[1]{\par\noindent\raisebox{.8ex}{\makebox[\linewidth]{\hrulefill\hspace{1ex}\raisebox{-.8ex}{#1}\hspace{1ex}\hrulefill}}}
-\renewcommand{\tabcolsep}{.5mm}
-
-\ruleline{\Large{\textbf{Chisel Cheat Sheet}}}
-\begin{center}
-\includegraphics[scale=0.02]{bigduck} Version 0.5 (beta): \today
-\end{center}
-
-\fbox{ \parbox{0.95\columnwidth} {
-\subsection{Notation In This Document}:
-\subsubsection{For Functions and Constructors}: \newline
-Arguments given as \texttt{kwd:type} (name and type(s)) \newline
-Arguments in brackets (\texttt{[...]}) are optional.
-\subsubsection{For Operators}: \newline
-\texttt{c}, \texttt{x}, \texttt{y} are Chisel \texttt{Data};
-\texttt{n}, \texttt{m} are Scala \texttt{Int} \newline
-\texttt{w(x)}, \texttt{w(y)} are the widths of \texttt{x}, \texttt{y} (respectively) \newline
-\texttt{minVal(x)}, \texttt{maxVal(x)} are the minimum or \newline
-\phantom{x} maximum possible values of \texttt{x}
-} }
-
-\section{Basic Chisel Constructs } \hrulefill
-\subsection{Chisel Wire Operators}: \newline
-\begin{tabular}{l l}
-\verb$val x = UInt()$ & Allocate \verb$a$ as wire of type \verb$UInt()$ \\
-\verb$x := y$ & Assign (connect) wire \verb$y$ to wire \verb$x$ \\
-\verb$x <> y$ & Connect \verb$x$ and \verb$y$, wire directionality \\
- & is automatically inferred \\
-\end{tabular}
-
-\subsection{When } executes blocks conditionally by \verb$Bool$, \newline
-\phantom{x} and is equivalent to Verilog \verb$if$
-\begin{scala}
-when(condition1) {
- // run if condition1 true and skip rest
-} .elsewhen(condition2) {
- // run if condition2 true and skip rest
-} .unless(condition3) {
- // run if condition3 false and skip rest
-} .otherwise {
- // run if none of the above ran
-}
-\end{scala}
-
-\subsection{Switch } executes blocks conditionally by data
-\begin{scala}
-switch(x) {
- is(value1) {
- // run if x === value1
- } is(value2) {
- // run if x === value2
- }
-}
-\end{scala}
-
-\subsection{Enum } generates value literals for enumerations \newline
-\verb$val s1::s2::$ ... \verb$::sn::Nil$ \newline
-\verb$ = Enum(nodeType:UInt, n:Int)$ \newline
-\begin{tabular}{l l l}
-& \verb$s1$, \verb$s2$, ..., \verb$sn$ & will be created as \verb$nodeType$ literals \\
-& & with distinct values \\
-& \verb$nodeType$ & type of \verb$s1$, \verb$s2$, ..., \verb$sn$ \\
-& \verb$n$ & element count \\
-\end{tabular}
-
-\subsection{Math Helpers}: \newline
-\begin{tabular}{l l}
-\verb$log2Up(in:Int): Int$ & $log_2(\texttt{in})$ rounded up \\
-\verb$log2Down(in:Int): Int$ & $log_2(\texttt{in})$ rounded down \\
-\verb$isPow2(in:Int): Boolean$ & \verb$True$ if \verb$in$ is a power of 2 \\
-\end{tabular}
-
-\columnbreak
-
-\section{Basic Data Types } \hrulefill
-\subsubsection{Constructors}: \newline
-\verb$Bool([x:Boolean])$ \newline
-\verb$Bits/UInt/SInt([x:Int/String], [width:Int])$ \newline
-\begin{tabular}{l l l}
-& \verb$x$ & {\em (optional)} create a literal from Scala type/ \\
-& & pased \verb$String$, or declare unassigned if missing \\
-& \verb$width$ & {\em (optional)} bit width (inferred if missing) \\
-\end{tabular}
-
-\subsubsection{Bits, UInt, SInt Casts}: reinterpret cast except for:\newline
-\begin{tabular*}{\columnwidth}{@{\extracolsep{\fill} } l l l}
-\verb$UInt$ $\rightarrow$ \verb$SInt$ & Zero-extend to SInt & \\
-\end{tabular*}
-
-\subsubsection{Bool Operators}: \newline
-\begin{tabular*}{\columnwidth}{@{\extracolsep{\fill} } l l l}
-Chisel & Explanation & Width \\
-\hline
-\hline
-\verb$!x$ & Logical NOT & \verb$1$ \\
-\verb$x && y$ & Logical AND & \verb$1$ \\
-\verb$x || y$ & Logical OR & \verb$1$ \\
-\end{tabular*}
-
-\subsubsection{Bits Operators}: \newline
-\begin{tabular*}{\columnwidth}{@{\extracolsep{\fill} } l l l}
-Chisel & Explanation & Width \\
-\hline
-\hline
-\verb$x(n)$ & Extract bit, \verb$0$ is LSB & \verb$1$ \\
-\verb$x(n, m)$ & Extract bitfield & \verb$n - m + 1$ \\
-\verb$x << y$ & Dynamic left shift & \verb$w(x) + maxVal(y)$ \\
-\verb$x >> y$ & Dynamic right shift & \verb$w(x) - minVal(y)$ \\
-\verb$x << n$ & Static left shift & \verb$w(x) + n$ \\
-\verb$x >> n$ & Static right shift & \verb$w(x) - n$ \\
-\verb$Fill(n, x)$ & Replicate \verb$x$, \verb$n$ times & \verb$n * w(x)$ \\
-\verb$Cat(x, y)$ & Concatenate bits & \verb$w(x) + w(y)$ \\
-\verb$Mux(c, x, y)$ & If \verb$c$, then \verb$x$; else \verb$y$ & \verb$max(w(x), w(y))$ \\
-\hline
-\verb$~x$ & Bitwise NOT & \verb$w(x)$ \\
-\verb$x & y$ & Bitwise AND & \verb$max(w(x), w(y))$ \\
-\verb$x | y$ & Bitwise OR & \verb$max(w(x), w(y))$ \\
-\verb$x ^ y$ & Bitwise XOR & \verb$max(w(x), w(y))$ \\
-\hline
-\verb$x === y$ & Equality{\small\textcolor{red}{(triple equals)}} & \verb$1$ \\
-\verb$x != y$ & Inequality & \verb$1$ \\
-\hline
-\verb$andR(x)$ & AND-reduce & \verb$1$ \\
-\verb$orR(x)$ & OR-reduce & \verb$1$ \\
-\verb$xorR(x)$ & XOR-reduce & \verb$1$ \\
-\end{tabular*}
-
-\subsubsection{UInt, SInt Operators}: (bitwdths given for \verb$UInt$s) \newline
-\begin{tabular*}{\columnwidth}{@{\extracolsep{\fill} } l l l}
-Chisel & Explanation & Width \\
-\hline
-\hline
-\verb$x + y$ & Addition & \verb$max(w(x), w(y))$ \\
-\verb$x - y$ & Subtraction & \verb$max(w(x), w(y))$ \\
-\verb$x * y$ & Multiplication & \verb$w(x) + w(y)$ \\
-\verb$x / y$ & Division & \verb$w(x)$ \\
-\verb$x % y$ & Modulus & \verb$bits(maxVal(y) - 1)$ \\
-\hline
-\verb$x > y$ & Greater than & \verb$1$ \\
-\verb$x >= y$ & Greater than or equal & \verb$1$ \\
-\verb$x < y$ & Less than & \verb$1$ \\
-\verb$x <= y$ & Less than or equal & \verb$1$ \\
-\hline
-\verb$x >> y$ & Arithmetic right shift & \verb$w(x) - minVal(y)$ \\
-\verb$x >> n$ & Arithmetic right shift & \verb$w(x) - n$ \\
-\end{tabular*}
-
-\columnbreak
-
-\section{State Elements } \hrulefill\
-\subsection{Registers } retain state until updated \newline
-\verb$val my_reg = Reg([outType:Data], [next:Data],$ \newline
-\verb$ [init:Data])$ \newline
-\begin{tabular}{l l l}
-& \verb$outType$ & {\em (optional)} register type (or inferred) \\
-& \verb$next$ & {\em (optional)} update value every clock \\
-& \verb$init$ & {\em (optional)} initialization value on reset \\
-\end{tabular}
-\subsubsection{Updating}: assign to latch new value on next clock: \newline
-\verb$my_reg := next_val$ \newline
-The last update (lexically, per clock) runs
-
-\subsection{Read-Write Memory } provide addressable memories \newline
-\verb$val my_mem = Mem(out:Data, n:Int,$ \newline
-\verb$ seqRead:Boolean)$ \newline
-\begin{tabular}{l l l}
-& \verb$out$ & memory element type \\
-& \verb$n$ & memory depth (elements) \\
-& \verb$seqRead$ & only update reads on clock edge \\
-\end{tabular}
-\subsubsection{Using}: access elements by indexing: \newline
-\verb$val readVal = my_mem(addr:UInt/Int)$ \newline
-\phantom{x} for synchronous read: assign output to \verb$Reg$ \newline
-\verb$mu_mem(addr:UInt/Int) := y$
-
-\section{Modules } \hrulefill
-\subsubsection{Defining}: subclass \verb$Module$ with elements, code:
-\begin{scala}
-class Accum(width:Int) extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, width)
- val out = UInt(OUTPUT, width)
- }
- val sum = new Reg(UInt())
- sum := sum + io.in
- io.out := sum
-}
-\end{scala}
-\subsubsection{Usage}: access elements using dot notation: \newline
-\phantom{x} (code inside a \verb$Module$ is always running)
-\begin{scala}
-val my_module = Module(new Accum(32))
-my_module.io.in := some_data
-val sum := my_module.io.out
-\end{scala}
-
-\section{Hardware Generation } \hrulefill
-\subsection{Functions } provide block abstractions for code
-\subsubsection{Defining}: write Scala functions with Chisel code:
-\begin{scala}
-def Adder(op_a:UInt, op_b:UInt): UInt = {
- op_a + op_b
-}
-\end{scala}
-\subsubsection{Usage}: hardware is instantiated when called:
-\begin{scala}
-sum := Adder(UInt(1), some_data)
-\end{scala}
-
-\subsection{If/For } can be used to control hardware generation \newline
-\phantom{x} and is equivalent to Verilog \verb$generate if$/\verb$for$
-
-\columnbreak
-
-\section{Aggregate Types } \hrulefill
-\subsection{Bundle } contains \verb$Data$ types indexed by name
-\subsubsection{Defining}: subclass \verb$Bundle$, define components:
-\begin{scala}
-class MyBundle extends Bundle {
- val a = Bool()
- val b = UInt(width = 32)
-}
-\end{scala}
-\subsubsection{Constructor}: instantiate \verb$Bundle$ subclass: \newline
-\verb$val my_bundle = new MyBundle()$
-\subsubsection{Inline defining}: define a \verb$Bundle$ type:
-\begin{scala}
-val my_bundle = new Bundle {
- val a = Bool()
- val b = UInt(width = 32)
-}
-\end{scala}
-\subsubsection{Using}: access elements through dot notation: \newline
-\verb$val bundleVal = my_bundle.a$ \newline
-\verb$my_bundle.a := Bool(true)$
-
-\subsection{Vec } is an indexable vector of \verb$Data$ types \newline
-\verb$val myVec = Vec(elts:Iterable[Data])$ \newline
-\begin{tabular}{l l l}
-& \verb$elts$ & initial element \verb$Data$ (vector depth inferred) \\
-\end{tabular}
-
-\verb$val myVec = Vec.fill(n:Int) {gen:Data}$ \newline
-\begin{tabular}{l l l}
-& \verb$n$ & vector depth (elements) \\
-& \verb$gen$ & initial element \verb$Data$, called once per element \\
-\end{tabular}
-\subsubsection{Using}: access elements by dynamic or static indexing: \newline
-\verb$readVal := myVec(ind:Data/idx:Int)$ \newline
-\verb$myVec(ind:Data/idx:Int) := writeVal$
-\subsubsection{Functions}: (\verb$T$ is the \verb$Vec$ element's type) \newline
-\begin{tabular}{l l l}
-& \verb$.forall(p:T=>Bool): Bool$ & AND-reduce \verb$p$ on all elts \\
-& \verb$.exists(p:T=>Bool): Bool$ & OR-reduce \verb$p$ on all elts \\
-& \verb$.contains(x:T): Bool$ & \verb$True$ if this contains \verb$x$ \\
-& \verb$.count(p:T=>Bool): UInt$ & count elts where \verb$p$ is \verb$True$ \\
-\end{tabular}
-\begin{tabular}{l l l}
-& \verb$.indexWhere(p:T=>Bool): UInt$ & \\
-& \verb$.lastIndexWhere(p:T=>Bool): UInt$ & \\
-& \verb$.onlyIndexWhere(p:T=>Bool): UInt$ & \\
-\end{tabular}
-
-\section{Standard Library: Function Blocks } \hrulefill
-\subsection{Stateless}: \newline
-\verb$PopCount(in:Bits/Seq[Bool]): UInt$ \newline
-\phantom{x} Returns number of hot (= 1) bits in \verb$in$
-
-\verb$Reverse(in:UInt): UInt$ \newline
-\phantom{x} Reverses the bit order of \verb$in$
-
-\verb$UIntToOH(in:UInt, [width:Int]): Bits$ \newline
-\begin{tabular}{l l l}
-& \multicolumn{2}{l}{Returns the one-hot encoding of \texttt{in}} \\
-& \verb$width$ & {\em(optional, else inferred)} output width \\
-\end{tabular}
-
-\verb$OHToUInt(in:Bits/Seq[Bool]): UInt$ \newline
-\phantom{x} Returns the \verb$UInt$ representation of one-hot \verb$in$
-
-\columnbreak
-
-\verb$PriorityEncoder(in:Bits/Iterable[Bool]): UInt$ \newline
-\phantom{x} Returns the position the least significant \verb$1$ in \verb$in$
-
-\verb$PriorityEncoderOH(in:Bits): UInt$ \newline
-\phantom{x} Returns the position of the hot bit in \verb$in$
-
-\verb$Mux1H(in:Iterable[(Data, Bool]): Data$ \newline
-\verb$Mux1H(sel:Bits/Iterable[Bool],$ \newline
-\verb$ in:Iterable[Data]): Data$ \newline
-\verb$PriorityMux(in:Iterable[(Bool, Bits]): Bits$ \newline
-\verb$PriorityMux(sel:Bits/Iterable[Bool],$ \newline
-\verb$ in:Iterable[Bits]): Bits$ \newline
-\begin{tabular}{l l l}
-& \multicolumn{2}{l}{A mux tree with either a one-hot select or multiple} \\
-& \multicolumn{2}{l}{\phantom{x} selects (where the first inputs are prioritized)} \\
-& \verb$in$ & iterable of combined input and select \verb$(Bool, Bits)$ \\
-& & tuples or just mux input \verb$Bits$ \\
-& \verb$sel$ & select signals or bitvector, one per input \\
-\end{tabular}
-
-\subsection{Stateful}: \newline
-\verb$LFSR16([increment:Bool]): UInt$ \newline
-\begin{tabular}{l l l}
-& \multicolumn{2}{l}{16-bit LFSR (to generate pseudorandom numbers)} \\
-& \verb$increment$ & {\em(optional, default True)} shift on next clock \\
-\end{tabular}
-
-\verb$ShiftRegister(in:Data, n:Int, [en:Bool]): Data$ \newline
-\begin{tabular}{l l l}
-& \multicolumn{2}{l}{Shift register, returns \texttt{n}-cycle delayed input \texttt{in}} \\
-& \verb$en$ & {\em(optional, default True)} enable \\
-\end{tabular}
-
-\section{Standard Library: Interfaces } \hrulefill
-\subsection{DecoupledIO } \mbox{is a \texttt{Bundle} with a ready-valid interface}
-\subsubsection{Constructor}: \newline
-\verb$Decoupled(gen:Data)$ \newline
-\begin{tabular}{l l l}
-& \verb$gen$ & Chisel \verb$Data$ to wrap ready-valid protocol around \\
-\end{tabular}
-\subsubsection{Interface}: \newline
-\begin{tabular}{c c l l}
-& (in) & \verb$.ready$ & ready \verb$Bool$ \\
-& (out) & \verb$.valid$ & valid \verb$Bool$ \\
-& (out) & \verb$.bits$ & data \\
-\end{tabular}
-
-\subsection{ValidIO } is a \verb$Bundle$ with a valid interface
-\subsubsection{Constructor}: \newline
-\verb$Valid(gen:Data)$ \newline
-\begin{tabular}{l l l}
-& \verb$gen$ & Chisel \verb$Data$ to wrap valid protocol around \\
-\end{tabular}
-\subsubsection{Interface}: \newline
-\begin{tabular}{c c l l}
-& (out) & \verb$.valid$ & valid \verb$Bool$ \\
-& (out) & \verb$.bits$ & data \\
-\end{tabular}
-
-\subsection{Queue } is a \verb$Module$ providing a hardware queue
-\subsubsection{Constructor}: \newline
-\verb$Queue(enq:DecoupledIO, entries:Int)$ \newline
-\begin{tabular}{l l l}
-& \verb$enq$ & \verb$DecoupledIO$ source for the queue \\
-& \verb$entries$ & size of queue \\
-\end{tabular}
-\subsubsection{Interface}: \newline
-\begin{tabular}{l l l}
-& \verb$.io.enq$ & \verb$DecoupledIO$ source (flipped) \\
-& \verb$.io.deq$ & \verb$DecoupledIO$ sink \\
-& \verb$.io.count$ & \verb$UInt$ count of elements in the queue \\
-\end{tabular}
-
-\columnbreak
-
-\subsection{Pipe } is a \verb$Module$ delaying input data
-\subsubsection{Constructor}: \newline
-\verb$Pipe(enqValid:Bool, enqBits:Data, [latency:Int])$ \newline
-\verb$Pipe(enq:ValidIO, [latency:Int])$ \newline
-\begin{tabular}{l l l}
-& \verb$enqValid$ & input data, valid component \\
-& \verb$enqBits$ & input data, data component \\
-& \verb$enq$ & input data as \verb$ValidIO$ \\
-& \verb$latency$ & {\em(optional, default 1)} cycles to delay data by \\
-\end{tabular}
-\subsubsection{Interface}: \newline
-\begin{tabular}{l l l}
-& \verb$.io.enq$ & \verb$ValidIO$ source (flipped) \\
-& \verb$.io.deq$ & \verb$ValidIO$ sink \\
-\end{tabular}
-
-\subsection{Arbiters } are \verb$Module$s connecting multiple producers\newline
-\phantom{x} to one consumer \newline
-\verb$Arbiter$ prioritizes lower producers \newline
-\verb$RRArbiter$ runs in round-robin order
-\subsubsection{Constructor}: \newline
-\verb$Arbiter(gen:Data, n:Int)$ \newline
-\begin{tabular}{l l l}
-& \verb$gen$ & data type \\
-& \verb$n$ & number of producers \\
-\end{tabular}
-\subsubsection{Interface}: \newline
-\begin{tabular}{l l l}
-& \verb$.io.in$ & \verb$Vec$ of \verb$DecoupledIO$ inputs (flipped) \\
-& \verb$.io.out$ & \verb$DecoupledIO$ output \\
-& \verb$.io.chosen$ & \verb$UInt$ input index on \verb$.io.out$, \\
-& & does not imply output is valid \\
-\end{tabular}
-
-\section{Tester } \hrulefill
-
-\verb$Tester$ is a class with functions for testing \verb$Module$s, connecting and communicating with a simulator: \newline
-\begin{tabular*}{\columnwidth}{@{\extracolsep{\fill} } l l}
-\verb$reset([n:Int])$ & reset the DUT for \verb$n$ (default 1) clocks \\
-\verb$step(n:Int$) & steps the DUT for \verb$n$ clocks \\
-\hline \end{tabular*} \begin{tabular*}{\columnwidth}{@{\extracolsep{\fill} } l l l}
-\verb$poke(data:Bits, x:BigInt)$ & writes \verb$x$ to wire \verb$data$ \\
-\multicolumn{2}{l}{\texttt{poke(data:Aggregate, x:Array[BigInt])}} \\
-\multicolumn{2}{l}{\phantom{x} writes values from \texttt{x} to corresponding wires in \texttt{data}} \\
-\verb$peek(data:Bits): BigInt$ & reads from wire \verb$data$ \\
-\multicolumn{2}{l}{\texttt{peek(data:Aggregate): Array[BigInt]}} \\
-\multicolumn{2}{l}{\phantom{x} reads multiple values from source wires in \texttt{data}} \\
-\hline \end{tabular*} \begin{tabular*}{\columnwidth}{@{\extracolsep{\fill} } l l l}
-\multicolumn{2}{l}{\texttt{expect(good:Boolean, msg:String): Boolean}} \\
-\multicolumn{2}{l}{\phantom{x} fails unless \texttt{good} is \texttt{True}, \texttt{msg} should describe the test} \\
-\multicolumn{2}{l}{\texttt{expect(data:Bits, target:BigInt): Boolean}} \\
-\multicolumn{2}{l}{\phantom{x} fails unless the value in wire \texttt{data} equals \texttt{target}} \\
-\end{tabular*}
-\subsubsection{Defining}:\newline
-Subclass \verb$Tester$ with testing code:
-\begin{scala}
-class MuxTester(c:Mux) extends Tester(c) {
- for (sel <- 0 until 2) {
- poke(c.io.sel, sel)
- poke(c.io.in0, 0); poke(c.io.in1, 1)
- step(1)
- expect(c.io.out, sel)
- }
-}
-\end{scala}
-
-\end{multicols}
-\end{document}
diff --git a/doc/cheatsheet/scala.tex b/doc/cheatsheet/scala.tex
deleted file mode 100644
index bd00539a..00000000
--- a/doc/cheatsheet/scala.tex
+++ /dev/null
@@ -1,63 +0,0 @@
-% "define" Scala
-\usepackage[T1]{fontenc}
-\usepackage{microtype}
-
-\sbox0{\small\ttfamily A}
-\edef\mybasewidth{\the\wd0 }
-
-\lstdefinelanguage{scala}{
- morekeywords={abstract,case,catch,class,def,%
- do,else,extends,false,final,finally,%
- for,if,implicit,import,match,mixin,%
- new,null,object,override,package,%
- private,protected,requires,return,sealed,%
- super,this,throw,trait,true,try,%
- type,val,var,while,with,yield},
- sensitive=true,
- morecomment=[l]{//},
- morecomment=[n]{/*}{*/},
- morestring=[b]",
- morestring=[b]',
- morestring=[b]"""
-}
-
-\usepackage{color}
-\definecolor{dkgreen}{rgb}{0,0.6,0}
-\definecolor{gray}{rgb}{0.5,0.5,0.5}
-\definecolor{mauve}{rgb}{0.58,0,0.82}
-\definecolor{light-gray}{gray}{0.75}
-
-% Default settings for code listings
-\lstset{language=scala,
- showstringspaces=false,
- columns=fixed, % basewidth=\mybasewidth,
- basicstyle={\small\ttfamily},
- numbers=none,
- numberstyle=\footnotesize\color{gray},
- % identifierstyle=\color{red},
- keywordstyle=\color{blue},
- commentstyle=\color{dkgreen},
- stringstyle=\color{mauve},
- breakatwhitespace=true,
- procnamekeys={def, val, var, class, trait, object, extends},
- procnamestyle=\ttfamily\color{red},
- frame=leftline,
- rulecolor=\color{light-gray},
- xleftmargin=2mm,
- aboveskip=2pt,
- belowskip=2pt,
-}
-
-\lstnewenvironment{scala}
-{\lstset{language=scala}}
-{}
-\lstnewenvironment{cpp}
-{\lstset{language=C++}}
-{}
-\lstnewenvironment{bash}
-{\lstset{language=bash}}
-{}
-\lstnewenvironment{verilog}
-{\lstset{language=verilog}}
-{}
-
diff --git a/doc/cs250/cs250-1.tex b/doc/cs250/cs250-1.tex
deleted file mode 100644
index 5b015706..00000000
--- a/doc/cs250/cs250-1.tex
+++ /dev/null
@@ -1,790 +0,0 @@
-% NOTES:
-% enum slide
-% difference between := and =
-% link and plink pic
-% filter pic
-% examples of running chisel
-
-\documentclass[xcolor=pdflatex,dvipsnames,table]{beamer}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{relsize}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-\input{../style/talk.tex}
-
-\title{Chisel @ CS250 -- Part I -- Lecture 02}
-\author{Jonathan Bachrach}
-\date{\today}
-\institute[UC Berkeley]{EECS UC Berkeley}
-
-\begin{document}
-
-\begin{frame}
-\titlepage
-\end{frame}
-\addtocounter{framenumber}{-1}
-
-% \begin{frame}[fragile]{tutorial.scala}
-% \begin{scala}
-% package Tutorial {
-%
-% import Chisel._
-%
-% object Tutorial {
-% def main(args: Array[String]): Unit = {
-% val tut_args = args.slice(1, args.length) ++
-% Array("--targetDir", "../emulator", "--genHarness")
-% args(0) match {
-% case "gcd" =>
-% chiselMain(tut_args, () => new GCD())
-% ...
-% }
-% }
-% }
-%
-% }
-% \end{scala}
-% \end{frame}
-
-\begin{frame}
-\frametitle{Standard Design Methodology}
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/design.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}
-\frametitle{Design Entry}
-\begin{columns}[c]
-\column{0.5\textwidth}
-\begin{itemize}
-\item Design circuits graphically
-\item Used commonly until approximately 2002
-\item Schematics are intuitive
-\item Labor intensive to produce (especially readable ones).
-\item Requires a special editor tool
-\item Unless hierarchy is carefully designed, schematics can be confusing and difficult to follow on large designs
-\end{itemize}
-\column{0.5\textwidth}
-\begin{center}
-\includegraphics[height=0.4\textheight]{figs/schematic-capture.pdf}
-\end{center}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Hardware Description Languages}
-\begin{columns}[c]
-\column{0.45\textwidth}
-\textbf{Structural Description}: connections of components with a nearly one-to-one correspondence to schematic diagram.
-\begin{scala}
-Decoder(output x0,x1,x2,x3;
- input a,b) {
- wire abar, bbar;
- inv(bbar, b);
- inv(abar, a);
- and(x0, abar, bbar);
- and(x1, abar, b );
- and(x2, a, bbar);
- and(x3, a, b );
-}
-\end{scala}
-\column{0.45\textwidth}
-\textbf{Behavioral Description}: use high-level constructs (similar to convential programming) to describe the circuit function.
-\begin{scala}
-Decoder(output x0,x1,x2,x3;
- input a,b) {
- case [a b]
- 00: [x0 x1 x2 x3] = 0x1;
- 01: [x0 x1 x2 x3] = 0x2;
- 10: [x0 x1 x2 x3] = 0x4;
- 11: [x0 x1 x2 x3] = 0x8;
- endcase;
-}
-\end{scala}
-\end{columns}
-\end{frame}
-
-\begin{frame}
-
-\frametitle{Verilog Issues}
-\begin{itemize}
-\item Originally invented for simulation
-\item Many constructs don't synthesize: ex: deassign, timing constructs
-\item Others lead to mysterious results: for-loops
-\item Difficult to understand synthesis implications of procedural assignments (always blocks), and blocking versus non-blocking assignments
-\item In common use, most users ignore much of the language and stick to a very strict style
-\item Very weak meta programming support for creating circuit generators
-\item Various hacks around this over the years, ex: embedded TCL scripting
-\item VHDL has much the same issues
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}
-
-\frametitle{Traditional Hardware Design Process}
-
-\begin{columns}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/traditional-static-design-process.pdf}
-\end{center}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/traditional-generator-design-process.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}
-
-\frametitle{Chisel}
-
-\textbf{Constructing Hardware In Scala Embedded Language}
-\begin{itemize}
-\item Embed a hardware-description language in Scala, using Scala's extension facilities
-\item Chisel is just a set of class definitions in Scala and when you write a Chisel program you are actually writing a Scala program
-\item A hardware module is just a data structure in Scala
-\item Clean simple set of design construction primitives for RTL design
-\item Full power of Scala for writing hardware generators
-\item Different output routines can generate different types of output (C, FPGA-Verilog, ASIC-Verilog) from same hardware representation
-\item Can be extended above with domain specific languages (such as declarative cache coherence specifications)
-\item Can be extended below with new backends (such as quantum)
-\item Open source with lots of libraries
-\item Only 5200 lines of code in current version!
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}
-\frametitle{Chisel Workflow}
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/workflow.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{The Scala Programming Language}
-
-\begin{columns}[c]
-
-\column{0.75\textwidth}
-
-\begin{itemize}
-\item Compiled to JVM
-\begin{itemize}
-\item Good performance
-\item Great Java interoperability
-\item Mature debugging, execution environments
-\end{itemize}
-\item Object Oriented
-\begin{itemize}
-\item Factory Objects, Classes
-\item Traits, overloading etc
-\end{itemize}
-\item Functional
-\begin{itemize}
-\item Higher order functions
-\item Anonymous functions
-\item Currying etc
-\end{itemize}
-\item Extensible
-\begin{itemize}
-\item Domain Specific Languages (DSLs)
-\end{itemize}
-\end{itemize}
-
-\column{0.25\textwidth}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../bootcamp/figs/programming-scala.pdf} \\
-\includegraphics[height=0.4\textheight]{../bootcamp/figs/programming-in-scala.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}
-
-\frametitle{Chisel Hardware Design Process}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/chisel-design-process.pdf}
-\end{center}
-
-\end{frame}
-
-\include{../bootcamp/scala-intro.tex}
-
-% \begin{frame}[fragile]
-% \frametitle{Example}
-% \begin{columns}
-%
-% \column{0.45\textwidth}
-%
-% \begin{footnotesize}
-% \begin{scala}
-% class GCD extends Module {
-% val io = new Bundle {
-% val a = UInt(INPUT, 16)
-% val b = UInt(INPUT, 16)
-% val z = UInt(OUTPUT, 16)
-% val valid = Bool(OUTPUT) }
-% val x = Reg(init = io.a)
-% val y = Reg(init = io.b)
-% when (x > y) {
-% x := x - y
-% } .otherwise {
-% y := y - x
-% }
-% io.z := x
-% io.valid := y === UInt(0)
-% }
-% \end{scala}
-% \end{footnotesize}
-%
-% \column{0.45\textwidth}
-%
-% \begin{center}
-% \includegraphics[width=0.9\textwidth]{figs/gcd.pdf}
-% \end{center}
-%
-% \end{columns}
-% \end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Chisel Example}
-\begin{columns}
-
-\column{0.40\textwidth}
-
-\begin{footnotesize}
-\begin{scala}
-class Mux2 extends Module {
- val io = new Bundle{
- val sel = UInt(INPUT, 1)
- val in0 = UInt(INPUT, 1)
- val in1 = UInt(INPUT, 1)
- val out = UInt(OUTPUT, 1)
- }
- io.out := (io.sel & io.in1) |
- (~io.sel & io.in0)
-}
-\end{scala}
-\end{footnotesize}
-
-\column{0.50\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/mux2-component.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-% \begin{frame}[fragile]{Scala Console}
-% \begin{FramedVerb}
-% \end{FramedVerb}
-% \end{frame}
-
-\begin{frame}[fragile]{Literals}
-\begin{scala}
-UInt(1) // decimal 1-bit literal from Scala Int.
-UInt("ha") // hexadecimal 4-bit literal from string.
-UInt("o12") // octal 4-bit literal from string.
-UInt("b1010") // binary 4-bit literal from string.
-
-SInt(5) // signed decimal 4-bit literal from Scala Int.
-SInt(-8) // negative decimal 4-bit literal from Scala Int.
-UInt(5) // unsigned decimal 3-bit literal from Scala Int.
-
-Bool(true) // Bool literals from Scala literals.
-Bool(false)
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Literals}
-\begin{scala}
-UInt("h_dead_beef") // 32-bit literal of type UInt.
-UInt(1) // decimal 1-bit literal from Scala Int.
-UInt("ha", 8) // hexadecimal 8-bit literal of type UInt.
-UInt("o12", 6) // octal 6-bit literal of type UInt.
-UInt("b1010", 12) // binary 12-bit literal of type UInt.
-
-SInt(5, 7) // signed decimal 7-bit literal of type SInt.
-UInt(5, 8) // unsigned decimal 8-bit literal of type UInt.
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Literal Node Construction}
-
-\begin{scala}
-UInt(1)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/ufix.pdf}
-\end{center}
-
-\end{frame}
-
-
-\begin{frame}[fragile]{Algebraic Construction}
-
-\begin{scala}
-UInt(1) + UInt(2)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/add.pdf}
-\end{center}
-
-\end{frame}
-
-
-\begin{frame}[fragile]{Combinational Circuits}
-
-\begin{scala}
-(sel & in1) | (~sel & in0)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/mux2-circuit.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Fan Out}
-
-\begin{scala}
-val sel = a | b
-val out = (sel & in1) | (~sel & in0)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/mux2-named-sel.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Wires}
-
-\begin{scala}
-val sel = UInt()
-val out = (sel & in1) | (~sel & in0)
-sel := a | b
-\end{scala}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/mux2-forward-sel.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Bitwise operators}
-\textbf{Valid on UInt, SInt, Bool.}
-\begin{scala}
-// Bitwise-NOT
-val invertedX = ~x
-// Bitwise-AND
-val hiBits = x & UInt("h_ffff_0000")
-// Bitwise-OR
-val flagsOut = flagsIn | overflow
-// Bitwise-XOR
-val flagsOut = flagsIn ^ toggle
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Bitwise reductions}
-\textbf{Valid on UInt and SInt. Returns Bool.}
-\begin{scala}
-// AND-reduction
-val allSet = andR(x)
-// OR-reduction
-val anySet = orR(x)
-// XOR-reduction
-val parity = xorR(x)
-\end{scala}
-\noindent
-where reduction applies the operation to all the bits.
-\end{frame}
-
-\begin{frame}[fragile]{Equality comparison}
-\textbf{Valid on UInt, SInt, and Bool. Returns Bool.}
-\begin{scala}
-// Equality
-val equ = x === y
-// Inequality
-val neq = x != y
-\end{scala}
-\noindent
-where \verb+===+ is used instead of \verb+==+ to avoid collision with Scala.
-\end{frame}
-
-\begin{frame}[fragile]{Shifts}
-\textbf{Valid on SInt and UInt.}
-\begin{scala}
-// Logical left shift.
-val twoToTheX = SInt(1) << x
-// Right shift (logical on UInt & UInt, arithmetic on SInt).
-val hiBits = x >> UInt(16)
-\end{scala}
-\noindent
-where logical is a raw shift and arithmetic performs top bit sign extension.
-\end{frame}
-
-\begin{frame}[fragile]{Bitfield manipulation}
-\textbf{Valid on SInt, UInt, and Bool.}
-\begin{scala}
-// Extract single bit, LSB has index 0.
-val xLSB = x(0)
-// Extract bit field from end to start bit pos.
-val xTopNibble = x(15,12)
-// Replicate a bit string multiple times.
-val usDebt = Fill(3, UInt("hA"))
-// Concatenates bit fields, w/ first arg on left
-val float = Cat(sgn,exp,man)
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Logical Operations}
-\textbf{Valid on Bools. }
-\begin{scala}
-// Logical NOT.
-val sleep = !busy
-// Logical AND.
-val hit = tagMatch && valid
-// Logical OR.
-val stall = src1busy || src2busy
-// Two-input mux where sel is a Bool.
-val out = Mux(sel, inTrue, inFalse)
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Arithmetic operations}
-\textbf{Valid on Nums: SInt and UInt. }
-\begin{scala}
-// Addition.
-val sum = a + b
-// Subtraction.
-val diff = a - b
-// Multiplication.
-val prod = a * b
-// Division.
-val div = a / b
-// Modulus
-val mod = a % b
-\end{scala}
-\noindent
-where \verb+SInt+ is a signed fixed-point number represented in two's complement and \verb+UInt+ is an unsigned fixed-point number.
-\end{frame}
-
-\begin{frame}[fragile]{Arithmetic comparisons}
-\textbf{Valid on Nums: SInt and UInt. Returns Bool.}
-\begin{scala}
-// Greater than.
-val gt = a > b
-// Greater than or equal.
-val gte = a >= b
-// Less than.
-val lt = a < b
-// Less than or equal.
-val lte = a <= b
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Bitwidth Inference}
-\begin{center}
-\begin{tabular}{ll}
-{\bf operation} & {\bf bit width} \\
-\verb|z = x + y| & \verb+wz = max(wx, wy)+ \\
-\verb+z = x - y+ & \verb+wz = max(wx, wy)+\\
-\verb+z = x & y+ & \verb+wz = min(wx, wy)+ \\
-\verb+z = x | y+ & \verb+wz = max(wx, wy)+ \\
-\verb+z = Mux(c, x, y)+ & \verb+wz = max(wx, wy)+ \\
-\verb+z = w * y+ & \verb!wz = wx + wy! \\
-\verb+z = x << n+ & \verb!wz = wx + maxNum(n)! \\
-\verb+z = x >> n+ & \verb+wz = wx - minNum(n)+ \\
-\verb+z = Cat(x, y)+ & \verb!wz = wx + wy! \\
-\verb+z = Fill(n, x)+ & \verb+wz = wx * maxNum(n)+ \\
-% \verb+z = x < y+ & \verb+<= > >= && || != ===+ & \verb+wz = 1+ \\
-\end{tabular}
-\end{center}
-\end{frame}
-
-% \begin{frame}[fragile]{Node Class Hierarchy}
-%
-% \begin{center}
-% \includegraphics[height=0.9\textheight]{../manual/figs/node-hierarchy.pdf}
-% \end{center}
-%
-% \end{frame}
-
-\begin{frame}[fragile]{Functional Abstraction}
-\begin{scala}
-def mux2 (sel: UInt, in0: UInt, in1: UInt) =
- (sel & in1) | (~sel & in0)
-
-val out = mux2(k,a,b)
-\end{scala}
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/mux2-function.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]{Bundles}
-
-\begin{columns}
-\column{0.55\textwidth}
-\begin{scala}
-class MyFloat extends Bundle {
- val sign = Bool()
- val exponent = UInt(width = 8)
- val significand = UInt(width = 23)
-}
-
-val x = new MyFloat()
-val xs = x.sign
-\end{scala}
-
-\column{0.35\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/myfloat.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Vecs}
-\begin{columns}
-\column{0.6\textwidth}
-
-\begin{scala}
-// Vector of 3 23-bit signed integers.
-val myVec = Vec.fill(3) { SInt(width = 23) }
-\end{scala}
-
-\begin{itemize}
-\item can be used as Scala sequences
-\item can also be nested into Chisel Bundles
-\end{itemize}
-
-\column{0.3\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/vec-3-fix.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Static Vec Element Access}
-\begin{scala}
-val myVec = Vec.fill(3) { SInt(width = 23) }
-
-// Connect to one vector element chosen at elaboration time.
-val sint0 = myVec(0)
-val sint1 = myVec(1)
-fix1 := data1
-myVec(2) := data2
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.5\textheight]{figs/vec-3-static.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]{Dynamic Vec Element Access}
-\begin{scala}
-val myVec = Vec.fill(3) { SInt(width = 23) }
-
-// Connect to one vector element chosen at runtime.
-val out0 = myVec(addr0)
-val out1 = myVec(addr1)
-myVec(addr2) := data2
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.6\textheight]{figs/vec-3-dynamic.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]{Ports}
-
-\begin{columns}
-\column{0.55\textwidth}
-
-\textbf{Data object with directions assigned to its members}
-
-\begin{scala}
-class Decoupled extends Bundle {
- val data = UInt(INPUT, 32)
- val valid = Bool(OUTPUT)
- val ready = Bool(INPUT)
-}
-\end{scala}
-
-\textbf{Direction assigned at instantiation time}
-
-\begin{scala}
-class ScaleIO extends Bundle {
- val in = new MyFloat().asInput
- val scale = new MyFloat().asInput
- val out = new MyFloat().asOutput
-}
-\end{scala}
-
-\column{0.35\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/fifoio.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Module}
-
-\begin{columns}
-\column{0.45\textwidth}
-
-\begin{itemize}
-\item inherits from \verb+Module+ class,
-\item contains an interface stored in a port field named \verb+io+, and
-\item wires together subcircuits in its constructor.
-\end{itemize}
-
-\begin{scala}
-class Mux2 extends Module {
- val io = new Bundle{
- val sel = UInt(INPUT, 1)
- val in0 = UInt(INPUT, 1)
- val in1 = UInt(INPUT, 1)
- val out = UInt(OUTPUT, 1)
- }
- io.out := (io.sel & io.in1) |
- (~io.sel & io.in0)
-}
-\end{scala}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/mux2-component.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}{Chisel Workflow}
-\begin{center}
-\includegraphics[height=0.9\textheight]{../bootcamp/figs/chisel-workflow.pdf}
-\end{center}
-\end{frame}
-
-
-
-\begin{frame}[fragile]{State Elements}
-
-\begin{scala}
-Reg(next = in)
-\end{scala}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/reg-in.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Rising Edge}
-
-\begin{scala}
-def risingEdge(x: Bool) = x && !Reg(next = x)
-\end{scala}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/rising-edge.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Counter}
-
-\begin{columns}
-\column{0.6\textwidth}
-
-\begin{scala}
-def counter(max: UInt) = {
- val x = Reg(init = UInt(0, max.getWidth))
- x := Mux(x === max, UInt(0), x + UInt(1))
- x
-}
-\end{scala}
-
-\column{0.3\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/counter.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Sequential Circuits}
-
-\begin{scala}
-// Produce pulse every n cycles.
-def pulse(n: UInt) = counter(n - UInt(1)) === UInt(0)
-\end{scala}
-
-\begin{scala}
-// Flip internal state when input true.
-def toggle(p: Bool) = {
- val x = Reg(init = Bool(false))
- x := Mux(p, !x, x)
- x
-}
-\end{scala}
-
-\begin{scala}
-// Square wave where each half cycle has given period.
-def squareWave(period: UInt) = toggle(pulse(period))
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Simple Two Step RTL Semantics}
-
-\begin{scala}
-// reset
-eval_combinational(true);
-assign_next_state(true);
-// execution
-loop {
- eval_combinational(false);
- assign_next_state(false);
-}
-\end{scala}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/two-phase-rtl-semantics.pdf}
-\end{center}
-
-\end{frame}
-
-\end{document}
diff --git a/doc/cs250/cs250-2.tex b/doc/cs250/cs250-2.tex
deleted file mode 100644
index f42867d7..00000000
--- a/doc/cs250/cs250-2.tex
+++ /dev/null
@@ -1,1252 +0,0 @@
-% NOTES:
-% enum slide
-% difference between := and =
-% link and plink pic
-% filter pic
-% examples of running chisel
-
-\documentclass[xcolor=pdflatex,dvipsnames,table]{beamer}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{relsize}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-\input{../style/talk.tex}
-
-\title{Chisel @ CS250 -- Part II -- Lecture 07}
-\author{Jonathan Bachrach}
-\date{\today}
-\institute[UC Berkeley]{EECS UC Berkeley}
-
-\begin{document}
-
-\begin{frame}
-\titlepage
-\end{frame}
-\addtocounter{framenumber}{-1}
-
-% \begin{frame}[fragile]{Forward Declarations using Wires}
-%
-% \begin{scala}
-% val pcPlus4 = UInt()
-% val branchTarget = UInt()
-% val pcNext = Mux(pcSel, branchTarget, pcPlus4)
-% val pcReg = Reg(data = pcNext, resetVal = UInt(0, 32))
-% pcPlus4 := pcReg + UInt(4)
-% ...
-% branchTarget := addOut
-% \end{scala}
-%
-% \begin{center}
-% \includegraphics[height=0.5\textheight]{figs/forward.pdf}
-% \end{center}
-%
-% \end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Accelerator Chisel Interface}
-\begin{columns}
-\column{0.45\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def class MemReq extends Bundle {
- val cmd = UInt(width = 2)
- val mtype = UInt(width = 2)
- val tag = UInt(width = 9)
- val addr = UInt(width = 64)
- val data = UInt(width = 64)
-}
-
-def class MemResp extends Bundle {
- val cmd = UInt(width = 2)
- val tag = UInt(width = 9)
- val mtype = UInt(width = 2)
- val data = UInt(width = 64)
-}
-\end{scala}
-\begin{scala}
-def class OpReq extends Bundle {
- val code = new RoccInst()
- val a = UInt(width = 64)
- val b = UInt(width = 64)
-}
-
-def class OpResp extends Bundle {
- val idx = UInt(width = 5)
- val data = UInt(width = 64)
-}
-\end{scala}
-
-}
-
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def class RoccIO extends Bundle {
- val busy = Bool(OUTPUT)
- val isIntr = Bool(OUTPUT)
- val memReq = Decoupled(new MemReq).flip
- val memResp = Decoupled(new MemResp)
- val opReq = Decoupled(new OpReq)
- val opResp = Decoupled(new OpResp).flip
-}
-\end{scala}
-}
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/rocket-coprocessor.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Accelerator Clarifications}
-\begin{columns}
-\column{0.45\textwidth}
-\begin{itemize}
-\item tags on write commands,
-\item responses to write commands,
-\item must keep busy asserted until all reads and writes have completed, and
-\item memory system has single port with accelerator having priority
-\end{itemize}
-\column{0.45\textwidth}
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/rocket-coprocessor.pdf}
-\end{center}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{What is Chisel?}
-\begin{itemize}
-\item Chisel is just a set of class definitions in Scala and
- when you write a Chisel program you are actually writing a Scala program,
-\item Chisel programs produce and manipulate a data structure in Scala using a convenient textural language layered on top of Scala,
-\item Chisel makes it possible to create powerful and reusable hardware modules using modern programming language concepts, and
-\item the same Chisel description can generate different types of output
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{Today}
-\begin{itemize}
-\item conditional updates on wires, registers, and memories,
-\item give you perspective,
-\item roms and rams,
-\item abstraction through object orientation and functional programming,
-\item present how to make hierarchical modules,
-\item teach you how to make reusable modules,
-\item show you to even more powerful construction techniques.
-\item introduce you to the standard library
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Updates}
-When describing state operations, we could simply wire register inputs to combinational logic blocks, but it is often more convenient:
-\begin{itemize}
-\item to specify when updates to registers will occur and
-\item to specify these updates spread across several separate statements
-\end{itemize}
-
-\begin{columns}
-\column{0.45\textwidth}
-\begin{scala}
-val r = Reg( UInt(width = 16) )
-when (c === UInt(0) ) {
- r := r + UInt(1)
-}
-\end{scala}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/conditional-increment.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Updates Priority}
-
-\begin{scala}
-when (c1) { r := Bits(1) }
-when (c2) { r := Bits(2) }
-\end{scala}
-
-\textbf{Conditional Update Order:}
-
-\begin{center}
-\begin{tabular}{|c|c|c|l|}
-\hline
-\code{c1} & \code{c2} & \code{r} & \\
-\hline
-0 & 0 & r & \code{r} unchanged \\
-0 & 1 & 2 & \\
-1 & 0 & 1 & \\
-1 & 1 & 2 & \code{c2} takes precedence over \code{c1} \\
-\hline
-\end{tabular}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Update Synthesized Hardware}
-
-\begin{center}
-\includegraphics[height=2in]{figs/conditional-updates.pdf}
-\end{center}
-
-\begin{itemize}
-\item Each \code{when} statement adds another level of data mux and ORs
- the predicate into the enable chain and
-\item the compiler effectively adds
- the termination values to the end of the chain automatically.
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]{Targetting Multiple Registers}
-
-\begin{scala}
-r := Reg( init = UInt(3) )
-s := Reg( init = UInt(3) )
-when (c1) { r := UInt(1); s := UInt(1) }
-when (c2) { r := UInt(2) }
-\end{scala}
-
-leads to \code{r} and \code{s} being updated according to the
-following truth table:
-
-{\footnotesize
-\begin{center}
-\begin{tabular}{|c|c|c|c|l|}
-\hline
-\code{c1} & \code{c2} & \code{r} & \code{s} & \\
-\hline
-0 & 0 & 3 & 3 & \\
-0 & 1 & 2 & 3 & \\
-1 & 0 & 1 & 1 & \code{r} updated in \code{c2} block, \code{s} updated using default \\
-1 & 1 & 2 & 1 & \\
-\hline
-\end{tabular}
-\end{center}
-}
-
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Update Nesting}
-
-\begin{scala}
-when (a) { when (b) { body } }
-\end{scala}
-
-which is the same as:
-
-\begin{scala}
-when (a && b) { body }
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Update Chaining}
-
-\begin{scala}
-when (c1) { u1 }
-.elsewhen (c2) { u2 }
-.otherwise { ud }
-\end{scala}
-
-which is the same as:
-
-\begin{scala}
-when (c1) { u1 }
-when (!c1 && c2) { u2 }
-when (!(c1 || c2)) { ud }
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Switch Statement}
-
-\begin{scala}
-switch(idx) {
- is(v1) { u1 }
- is(v2) { u2 }
-}
-\end{scala}
-
-which is the same as:
-
-\begin{scala}
-when (idx === v1) { u1 }
-when (idx === v2) { u2 }
-\end{scala}
-
-\end{frame}
-
-% \begin{frame}[fragile]{Enums}
-% \begin{scala}
-% val s_even :: s_odd :: Nil = Enum(2){ UInt() }
-% \end{scala}
-% \end{frame}
-
-
-\begin{frame}[fragile]{Conditional Updates Everywhere}
-Conditional updates also work for
-\begin{itemize}
-\item wires but must have defaults and
-\item for memory reads and writes as we'll see soon...
-\end{itemize}
-
-For wires, we can do conditional updates as follows:
-
-\begin{scala}
-val w = Bits(width = 32)
-w := Bits(0) // default value
-when (c1) { w := Bits(1) }
-when (c2) { w := Bits(2) }
-\end{scala}
-
-\noindent
-which is the same as
-
-\begin{scala}
-val w = Bits(width = 32)
-when (Bool(true)) { w := Bits(0) } // default value
-when (c1) { w := Bits(1) }
-when (c2) { w := Bits(2) }
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Enums}
-Enums can be defined to create a list of increasing nums.
-
-\begin{scala}
-object Enum {
- def apply[T <: UInt](type: T, n: Int): List[T] = ...
-}
-\end{scala}
-
-\begin{scala}
-val s_even :: s_odd :: Nil = Enum(UInt(), 2)
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Finite State Machines}
-
-\begin{columns}
-\column{0.65\textwidth}
-
-Finite state machines can now be readily defined as follows:
-
-\begin{scala}
-class Parity extends Module {
- val io = new Bundle {
- val in = Bool(INPUT)
- val out = Bool(OUTPUT) }
- val s_even :: s_odd :: Nil = Enum(UInt(), 2)
- val state = Reg(resetVal = s_even)
- when (io.in) {
- when (state === s_even) { state := s_odd }
- .otherwise { state := s_even }
- }
- io.out := (state === s_odd)
-}
-\end{scala}
-
-\column{0.25\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/parity.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\input{../talks/microsoft/libs-to-langs-guts.tex}
-
-
-\begin{frame}[fragile]{ROM}
-
-\begin{scala}
-val d = Array(UInt(1), UInt(2), UInt(4), UInt(8))
-val m = ROM(UInt(width = 32), d)
-val r = m(counter(UInt(3)))
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/rom.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Mul Lookup Table}
-\begin{columns}
-\column{0.52\textwidth}
-
-\begin{scala}
-class Mul extends Module {
- val io = new Bundle {
- val x = UInt(INPUT, 4)
- val y = UInt(INPUT, 4)
- val z = UInt(OUTPUT, 8) }
-
- val muls = new Array[UInt](256)
- for (x <- 0 until 16; y <- 0 until 16)
- muls((x << 4) | y) = UInt(x * y)
-
- val tbl = ROM(UInt(8), muls)
-
- io.z := tbl((io.x << 4) | io.y)
-}
-\end{scala}
-
-\column{0.38\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/muls.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{RAM}
-RAM is supported using the \code{Mem} construct
-
-\begin{scala}
-val m = Mem(Bits(width = 32), 32)
-\end{scala}
-
-\noindent
-where
-\begin{itemize}
-\item writes to Mems are positive-edge-triggered
-\item reads are either combinational or positive-edge-triggered
-\item ports are created by applying a \code{UInt} index
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{32-entry Register File}
-
-\begin{scala}
-val regs = Mem(Bits(width = 32), 32)
-when (wrEn) {
- regs(wrAddr) := wrData
-}
-val iDat = regs(iAddr)
-val mDat = regs(mAddr)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.55\textheight]{figs/mem.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Sequential Read Ports}
-Sequential read ports are inferred when:
-\begin{itemize}
-\item optional parameter \code{seqRead} is set and
-\item read address is a reg
-\end{itemize}
-
-\begin{scala}
-al ram1r1w =
- Mem(UInt(width = 32), 1024, seqRead = true)
-val reg_raddr = Reg(UInt())
-when (wen) { ram1r1w(waddr) := wdata }
-when (ren) { reg_raddr := raddr }
-val rdata = ram1r1w(reg_raddr)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{figs/mem-seq-read.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Single-ported SRAM}
-Single-ported SRAMs can be inferred when the read and write conditions are
-mutually exclusive in the same \code{when} chain
-
-\begin{scala}
-al ram1p =
- Mem(UInt(width = 32), 1024, seqRead = true)
-val reg_raddr = Reg(UInt())
-when (wen) { ram1p(waddr) := wdata }
-.elsewhen (ren) { reg_raddr := raddr }
-val rdata = ram1p(reg_raddr)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.5\textheight]{figs/mem-single-ported.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Mem Write Masks }
-Mem also supports write masks for subword writes.
-\begin{itemize}
-\item A given bit is written if the corresponding mask bit is set.
-\end{itemize}
-
-\begin{scala}
-val ram = Mem(UInt(width = 32), 256)
-when (wen) { ram.write(waddr, wdata, wmask) }
-\end{scala}
-
-\end{frame}
-
-\begin{frame}{Prepare for Warp Speed and Be Happy}
-Congratulations, you have all that you need at this point to write Chisel programs!
-You can write RTL, define modules (even with recursive data types), and wire them together.
-\vspace{5mm}
-\begin{itemize}
-\item In order to attain true hardware description power though, you need to be able to write reusable RTL, modules and interfaces.
-\item This will allow you to both use and write generic module libraries and more quickly explore design space.
-\item To do this, we will use modern programming techniques such as:
-\begin{itemize}
-\item object orientation,
-\item functional programming,
-\item parameterized types
-\end{itemize}
-\item You will be greatly rewarded for your efforts!
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]{Parameterized Types in Scala}
-First we need to learn about parameterized types in Scala.
-We can define a generic \code{Mux} function as taking a boolean condition and \code{con} and \code{alt} arguments (corresponding to then and else expressions) of type \code{T} as follows:
-
-\begin{scala}
-def Mux[T <: Data](c: Bool, con: T, alt: T): T = ...
-\end{scala}
-
-\noindent
-where
-\begin{itemize}
-\item \code{T} is required to be a subclass of \code{Data} and
-\item the type of \code{con} and \code{alt} are required to match.
-\end{itemize}
-
-\noindent
-You can think of the type parameter as a way of just constraining the types of the allowable arguments.
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Revisiting GCD}
-\begin{columns}
-
-\column{0.45\textwidth}
-
-\begin{footnotesize}
-\begin{scala}
-class GCD extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 16)
- val b = UInt(INPUT, 16)
- val z = UInt(OUTPUT, 16)
- val valid = Bool(OUTPUT) }
- val x = Reg(init = io.a)
- val y = Reg(init = io.b)
- when (x > y) {
- x := x - y
- } .otherwise {
- y := y - x
- }
- io.z := x
- io.valid := y === UInt(0)
-}
-\end{scala}
-\end{footnotesize}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../talks/retreat-1/figs/gcd.pdf}
-\end{center}
-
-\end{columns}
-\note{defining modules is a matter of \\[1cm]
-defining its interface and then \\[1cm]
-wiring outputs to compute logic and state defined in terms of inputs. \\[1cm]
-here we're defining registers and conditional updates on them. \\[1cm]
-this module outputs valid true when an answer is ready.}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Valid Wrapper}
-
-\begin{columns}
-
-\column{0.65\textwidth}
-
-\begin{footnotesize}
-\begin{scala}
-class Valid[T <: Data](dtype: T) extends Bundle {
- val data = dtype.clone
- val valid = Bool()
- override def clone = new Valid(dtype)
-}
-
-class GCD extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 16)
- val b = UInt(INPUT, 16)
- val out = new Valid(UInt(OUTPUT, 16))
- } }
- ...
- io.out.data := x
- io.out.valid := y === UInt(0)
-}
-
-\end{scala}
-\end{footnotesize}
-
-\column{0.3\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../talks/retreat-1/figs/valid.pdf}
-\end{center}
-
-\end{columns}
-\note{now gcd had a valid signal on its output. \\[1cm]
-we can generalize this idea by defining a wrapper class that bundles a valid with a data signal. \\[1cm]
-now we can rewrite GCD using an interface using this valid wrapper for its output. }
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Function Filters}
-
-\begin{footnotesize}
-\begin{scala}
-abstract class Filter[T <: Data](dtype: T) extends Module {
- val io = new Bundle {
- val in = new Valid(dtype).asInput
- val out = new Valid(dtype).asOutput
-} }
-
-class FunctionFilter[T <: Data](f: T => T, dtype: T) extends Filter(dtype) {
- io.out.valid := io.in.valid
- io.out := f(io.in)
-}
-\end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/sketching13/figs/function-filter.pdf}
-\end{center}
-
-\note{suppose we want to write hardware filters. \\[1cm]
-one way to create a reusable filter would be \\[1cm]
-to create a filter class that takes a function as argument that definines its filter operation.}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Clipping Filter}
-
-\begin{footnotesize}
-\begin{scala}
-def clippingFilter[T <: Num](limit: Int, dtype: T) =
- new FunctionFilter(min(limit, max(-limit, _)), dtype)
-\end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/retreat-1/figs/clipping-filter.pdf}
-\end{center}
-\note{using this reusable substrate then it is easy to create an instance of a filter.}
-\end{frame}
-
-
-\begin{frame}[fragile]
-\frametitle{Shifting Filter}
-
-\begin{footnotesize}
-\begin{scala}
-def shiftingFilter[T <: Num](shift: Int, dtype: T) =
- new FunctionFilter(_ >> shift, dtype)
-\end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/retreat-1/figs/shifting-filter.pdf}
-\end{center}
-\note{and reuse it for shift filter}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Chained Filter}
-
-\begin{footnotesize}
-\begin{scala}
-class ChainedFilter[T <: Num](dtype: T) extends Filter(dtype) = {
- val shift = new ShiftFilter(2, dtype)
- val clipper = new ClippingFilter(1 << 7, dtype)
- io.in <> shift.io.in
- shift.io.out <> clipper.io.in
- clipper.io.out <> io.out
-}
-\end{scala}
-% \begin{scala}
-% class ChainedFilter[T <: Num](dtype: T) extends Filter(dtype) = {
-% val fir = new TstFIR(dtype)
-% val shift = new ShiftFilter(2, dtype)
-% val clipper = new ClippingFilter(1 << 7, dtype)
-% io.in <> fir.io.in
-% fir.io.out <> shift.io.in
-% shift.io.out <> clipper.io.in
-% clipper.io.out <> io.out
-% }
-% \end{scala}
-\end{footnotesize}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../talks/sketching13/figs/chained-filter2.pdf}
-\end{center}
-\note{and chain together...}
-\end{frame}
-
-\begin{frame}[fragile, shrink]
-\frametitle{Functional Composition}
-
-% \begin{itemize}
-% \item natural
-% \item reusable
-% \item composable
-% \end{itemize}
-% \vskip1cm
-
-\begin{Large}
-\begin{columns}
-
-\column{0.45\textwidth}
-\verb+Map(ins, x => x * y)+ \\
-\begin{center}
-\includegraphics[height=0.6\textheight]{../bootcamp/figs/map.pdf} \\[2cm]
-\end{center}
-
-\column{0.45\textwidth}
-\vskip2mm
-\verb+Chain(n, in, x => f(x))+ \\
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../bootcamp/figs/chain.pdf} \\
-\end{center}
-
-\verb+Reduce(ins, Max)+ \\
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../bootcamp/figs/reduce.pdf} \\
-\end{center}
-
-\end{columns}
-
-\end{Large}
-\note{the previous example showed a simple use of functional programming. \\[1cm]
-Scala provides strong support for functional programming and
-it turns out that functional programming is a powerful way to define hardware. \\[1cm]
-for example, you can create a parallel set of blocks using map and reduce to creation reduction trees and chain to create a pipeline.}
-\end{frame}
-
-\begin{frame}[fragile]{Generator}
-\begin{footnotesize}
-\begin{scala}
-def delays[T <: Data](x: T, n: Int): List[T] =
- if (n <= 1) List(x) else x :: taps(Reg(next = x), n-1)
-
-def FIR[T <: Num](hs: Seq[T], x: T): T =
- (hs, delays(x, hs.length)).zipped.map( _ * _ ).reduce( _ + _ )
-
-class TstFIR extends Module {
- val io = new Bundle{ val x = SInt(INPUT, 8); val y = SInt(OUTPUT, 8) }
- val h = Array(SInt(1), SInt(2), SInt(4))
- io.y := FIR(h, io.x)
-}
-\end{scala}
-\end{footnotesize}
-\begin{center}
-\includegraphics[height=0.35\textheight]{../cs294-88/lectures/advanced-chisel/figs/inner-product-fir.png}
-\end{center}
-\note{as an advanced example, consider writing an FIR filter which is defined by the equation below. \\[1cm]
-essentially it's a sum of products of coefficients and delayed versions of input.\\[1cm]
-we can write this quite simply using map and reduce as above.}
-\end{frame}
-
-\begin{frame}[fragile]{Interface Views}
-\begin{columns}
-\column{0.40\textwidth}
-
-\begin{scala}
-class Cpu extends Module {
- val io = new CpuIo()
- val c = new CtlPath()
- val d = new DatPath()
- c.io.ctl <> d.io.ctl
- c.io.dat <> d.io.dat
- c.io.imem <> io.imem
- d.io.imem <> io.imem
- c.io.dmem <> io.dmem
- d.io.dmem <> io.dmem
- d.io.host <> io.host
-}
-\end{scala}
-
-\column{0.50\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../tutorial/figs/cpu.png}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{CPU Interfaces}
-\begin{columns}
-\column{0.40\textwidth}
-
-\begin{scala}
-class RomIo extends Bundle {
- val isVal = Bool(INPUT)
- val raddr = UInt(INPUT, 32)
- val rdata = Bits(OUTPUT, 32)
-}
-
-class RamIo extends RomIo {
- val isWr = Bool(INPUT)
- val wdata = Bits(INPUT, 32)
-}
-
-class CpathIo extends Bundle {
- val imem = RomIo().flip()
- val dmem = RamIo().flip()
- ... }
-
-class DpathIo extends Bundle {
- val imem = RomIo().flip()
- val dmem = RamIo().flip()
- ... }
-\end{scala}
-
-\column{0.50\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../tutorial/figs/cpu.png}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Partial Interface Fulfillment}
-\begin{columns}
-\column{0.40\textwidth}
-
-\begin{scala}
-class Cpath extends Module {
- val io = new CpathIo();
- ...
- io.imem.isVal := ...;
- io.dmem.isVal := ...;
- io.dmem.isWr := ...;
- ...
-}
-
-class Dpath extends Module {
- val io = new DpathIo();
- ...
- io.imem.raddr := ...;
- io.dmem.raddr := ...;
- io.dmem.wdata := ...;
- ...
-}
-\end{scala}
-
-\column{0.50\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../tutorial/figs/cpu.png}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Multiple Partial Bulk Connections}
-\begin{columns}
-\column{0.40\textwidth}
-
-\begin{scala}
-class Cpu extends Module {
- val io = new CpuIo()
- val c = new CtlPath()
- val d = new DatPath()
- c.io.ctl <> d.io.ctl
- c.io.dat <> d.io.dat
- c.io.imem <> io.imem
- d.io.imem <> io.imem
- c.io.dmem <> io.dmem
- d.io.dmem <> io.dmem
- d.io.host <> io.host
-}
-\end{scala}
-
-\column{0.50\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../tutorial/figs/cpu.png}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}
-\begin{columns}
-
-\column{0.65\textwidth}
-
-\frametitle{Resources}
-\begin{itemize}
-\item Scala books
-\item \url{chisel.eecs.berkeley.edu}
-\item Chisel writings
-\begin{itemize}
-\item Chisel tutorial
-\item Chisel manual
-\item Chisel DAC-2012 paper
-\end{itemize}
-\item Chisel examples on github
-\begin{itemize}
-\item Sodor Processors
-\item Floating Point Unit
-\item Rocket Processor
-\item Hwacha Vector Unit
-\end{itemize}
-\end{itemize}
-
-\column{0.25\textwidth}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../bootcamp/figs/programming-scala.pdf} \\
-\includegraphics[height=0.4\textheight]{../bootcamp/figs/programming-in-scala.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}
-\frametitle{Standard Library in ChiselUtil.scala}
-\begin{itemize}
-\item Basic Utils
-\item Vecs
-\item Queues
-\item Arbiters
-% \item Crossbars
-\item Structural Memory
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Bits Properties}
-\begin{scala}
-object log2Up {
- def apply(in: Int): Int = if(in == 1) 1 else ceil(log(in)/log(2)).toInt
-}
-
-object log2Down {
- def apply(x : Int): Int = if (x == 1) 1 else floor(log(x)/log(2.0)).toInt
-}
-
-object isPow2 {
- def apply(in: Int): Boolean = in > 0 && ((in & (in-1)) == 0)
-}
-
-object PopCount {
- def apply(in: Seq[Bool]): UInt = ...
- def apply(in: Bits): UInt = ...
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Bits Functions}
-\begin{itemize}
-\item LFSR16 -- random number generator
-\item Reverse -- reverse order of bits
-\item FillInterleaved -- space out booleans into uint
-\end{itemize}
-\begin{scala}
-object LFSR16 {
- def apply(increment: Bool = Bool(true)): UInt = ...
-}
-object Reverse {
- def apply(in: UInt): UInt = ...
-}
-object FillInterleaved {
- def apply(n: Int, in: Bits): UInt = ...
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Stateful Functions}
-\begin{itemize}
-\item n cycle delayed version of input signal
-\end{itemize}
-\begin{scala}
-object ShiftRegister {
- def apply[T <: Data](in: T, n: Int, en: Bool = Bool(true)): T = ...
-}
-\end{scala}
-\begin{itemize}
-\item enable driven counter with parameterized wrapping
-\end{itemize}
-\begin{scala}
-object Counter {
- def apply(cond: Bool, n: Int): (UInt, Bool) = ...
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Priority Encoding Functions}
-\begin{itemize}
-\item UIntToOH -- returns one hot encoding of input int
-\item OHToUInt -- returns int version of one hot encoding input
-\item Mux1H -- builds mux tree of input vector using a one hot encoded select signal
-\end{itemize}
-\begin{scala}
-object UIntToOH {
- def apply(in: UInt, width: Int = -1): Bits = ...
-}
-
-object OHToUInt {
- def apply(in: Seq[Bool]): UInt = ...
-}
-
-object Mux1H {
- def apply[T <: Data](sel: Vec[Bool], in: Vec[T]): T = ...
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Priority Mux Function}
-\begin{itemize}
-\item PriorityMux -- build mux tree allow multiple select signals with priority given to first select signal
-\end{itemize}
-\begin{scala}
-object PriorityMux {
- def apply[T <: Bits](in: Seq[(Bool, T)]): T = ...
- def apply[T <: Bits](sel: Seq[Bool], in: Seq[T]): T = ...
- def apply[T <: Bits](sel: Bits, in: Seq[T]): T = ...
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Priority Encoding Functions}
-\begin{itemize}
-\item PriorityEncoder -- returns the bit position of the trailing 1 in the input vector
- with the assumption that multiple bits of the input bit vector can be set
-\item PriorityEncoderOH -- returns the bit position of the trailing 1 in the input vector
- with the assumption that only one bit in the input vector can be set.
-\end{itemize}
-\begin{scala}
-object PriorityEncoder {
- def apply(in: Seq[Bool]): UInt = ...
- def apply(in: Bits): UInt = ...
-}
-
-object PriorityEncoderOH {
- def apply(in: Bits): UInt = ...
- def apply(in: Seq[Bool]): Seq[UInt] = ...
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Vec Construction}
-\begin{scala}
-object Vec {
- def apply[T <: Data](elts: Seq[T]): Vec[T]
- def apply[T <: Data](elts: Vec[T]): Vec[T]
- def apply[T <: Data](elt0: T, elts: T*): Vec[T]
-
- def fill[T <: Data](n: Int)(f: => T): Vec[T]
- def tabulate[T <: Data](n: Int)(f: Int => T): Vec[T]
- def tabulate[T <: Data](n1: Int, n2: Int)(f: (Int, Int) => T): Vec[Vec[T]]
-}
-\end{scala}
-\begin{scala}
-Vec(A, L, M)
-Vec.fill(3){ UInt(width = 8) } ====
- Vec(UInt(width = 8), UInt(width = 8), UInt(width = 8))
-Vec.tabulate(3){ UInt(_) } ====
- Vec(UInt(0), UInt(1), UInt(2))
-val v = Vec.fill(0){ UInt(width = 8) }
-for ...
- v += UInt(width = 8)
-\end{scala}
-\end{frame}
-
-
-\begin{frame}[fragile]{Functional Vec}
-\begin{scala}
-class Vec[T <: Data](val gen: () => T)
- extends Data with Cloneable with BufferProxy[T] {
- ...
- def forall(p: T => Bool): Bool
- def exists(p: T => Bool): Bool
- def contains(x: T): Bool
- def count(p: T => Bool): UInt
-
- def indexWhere(p: T => Bool): UInt
- def lastIndexWhere(p: T => Bool): UInt
-}
-\end{scala}
-\begin{scala}
-Vec(K, L, M).contains(x) ==== ( x === K || x === L || x === M )
-\end{scala}
-\end{frame}
-
-
-\begin{frame}[fragile]
-\frametitle{Queues}
-\begin{itemize}
-\item Required parameter \verb+entries+ controls depth
-\item The width is determined from the inputs.
-\end{itemize}
-\begin{scala}
-class QueueIO[T <: Data](type: T, entries: Int) extends Bundle {
- val enq = Decoupled(data.clone).flip
- val deq = Decoupled(data.clone)
- val count = UFix(OUTPUT, log2Up(entries+1))
-}
-
-class Queue[T <: Data]
- (type: T, entries: Int,
- pipe: Boolean = false,
- flow: Boolean = false
- flushable: Boolean = false)
- extends Module
-\end{scala}
-\begin{scala}
-val q = new Queue(UInt(), 16)
-q.io.enq <> producer.io.out
-consumer.io.in <> q.io.deq
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Pipes}
-\begin{itemize}
-\item delays data coming down pipeline by \verb+latency+ cycles
-\item similar to \verb+ShiftRegister+ but exposes Pipe interface
-\end{itemize}
-\begin{scala}
-class PipeIO[+T <: Data](data: T) extends Bundle {
- val valid = Bool(OUTPUT)
- val bits = data.clone.asOutput
-}
-
-class Pipe[T <: Data](type: T, latency: Int = 1) extends Module
-\end{scala}
-\begin{scala}
-val pipe = new Pipe(UInt())
-pipe.io.enq <> produce.io.out
-consumer.io.in <> pipe.io.deq
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Fixed Priority Arbiter}
-\begin{itemize}
-\item sequences \verb+n+ producers into 1 consumer
-\item priority is given to lower producer
-\end{itemize}
-\begin{scala}
-class ArbiterIO[T <: Data](data: T, n: Int) extends Bundle {
- val in = Vec.fill(n) { Decoupled(data) }.flip
- val out = Decoupled( data.clone )
- val chosen = Bits(OUTPUT, log2Up(n))
-}
-
-class Arbiter[T <: Data](type: T, n: Int) extends Module
-\end{scala}
-\begin{scala}
-val arb = new Arbiter(UInt(), 2)
-arb.io.in(0) <> producer0.io.out
-arb.io.in(1) <> producer1.io.out
-consumer.io.in <> arb.io.out
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Round Robin Arbiter}
-\begin{itemize}
-\item sequences \verb+n+ producers into 1 consumer
-\item producers are chosen in round robin order
-\end{itemize}
-\begin{scala}
-class ArbiterIO[T <: Data](data: T, n: Int) extends Bundle {
- val in = Vec.fill(n) { Decoupled(data) }.flip
- val out = Decoupled( data.clone )
- val chosen = Bits(OUTPUT, log2Up(n))
-}
-
-class RRArbiter[T <: Data](type: T, n: Int) extends Module
-\end{scala}
-\begin{scala}
-val arb = new RRArbiter(UInt(), 2)
-arb.io.in(0) <> producer0.io.out
-arb.io.in(1) <> producer1.io.out
-consumer.io.in <> arb.io.out
-\end{scala}
-\end{frame}
-
-% \begin{frame}[fragile]
-% \frametitle{Crossbar}
-% \begin{itemize}
-% \item Priority
-% \item Round Robin
-% \end{itemize}
-% \end{frame}
-
-
-\begin{frame}[fragile]
-\frametitle{Structural Memory}
-\begin{itemize}
-\item Defined number of ports
-\item Port specific accesses
-\end{itemize}
-\begin{scala}
-class FunMem[T <: Data]
- (data: T, depth: Int, numReads: Int, numWrites: Int) {
- ...
- def read(addr: UInt, idx: Int = 0): T = ...
- def write(addr: UInt, data: T, idx: Int = 0) = ...
- ...
-}
-\end{scala}
-\begin{scala}
-val cellDats = new FunMem(Bits(width = DATA_WIDTH), NUM_CELLS, 1, 1)
-when (isWrite0) {
- cellDats.write(ca0, dat0, 0)
-}
-when (isWrite1) {
- cellDats.write(ca1, dat1, 1)
-}
-... cellDats.read(ca, 0) ...
-... cellDats.read(ca, 1) ...
-\end{scala}
-\end{frame}
-
-\begin{frame}{Acknowledgements}
-\begin{itemize}
-\item ``What is Chisel?'' based on slides from Patrick Li
-\end{itemize}
-\end{frame}
-
-\end{document}
diff --git a/doc/cs250/cs250-3.tex b/doc/cs250/cs250-3.tex
deleted file mode 100644
index 478d394b..00000000
--- a/doc/cs250/cs250-3.tex
+++ /dev/null
@@ -1,603 +0,0 @@
-\documentclass[xcolor=pdflatex,dvipsnames,table]{beamer}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{relsize}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-\input{../style/talk.tex}
-
-\title{Chisel @ CS250 -- Part III -- Lecture 8}
-\author{Jonathan Bachrach}
-\date{\today}
-\institute[UC Berkeley]{EECS UC Berkeley}
-
-\begin{document}
-
-\begin{frame}
-\titlepage
-\end{frame}
-\addtocounter{framenumber}{-1}
-
-\begin{frame}{Options for Testing Chisel Designs}
-\begin{itemize}
-\item testing using assert and printf in Chisel
-\item testing Verilog using VCS
-\item testing from within Scala
-\begin{itemize}
-\item test C++ executable
-\item test Verilog using VCS
-\end{itemize}
-\item testing inside C++ simulator
-\begin{itemize}
-\item VCD debugging
-\item manual testing from within C++
-\end{itemize}
-\end{itemize}
-\end{frame}
-
-\begin{frame}{Simulation Options}
-\begin{center}
-\includegraphics[height=0.9\textheight]{../talks/dac12/figs/perf.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}{Chisel Workflow}
-\begin{center}
-\includegraphics[height=0.9\textheight]{../bootcamp/figs/chisel-workflow.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]{printf / sprintf}
-\begin{itemize}
-\item during simulation
-\begin{itemize}
-\item \verb+printf+ prings the formatted string to the console on rising clock edges
-\item \verb+sprintf+ returns the formatted string as a bit vector
-\end{itemize}
-\item format specifiers are
-\begin{itemize}
-\item \verb+%b+ -- binary number
-\item \verb+%d+ -- decimal number
-\item \verb+%x+ -- hexidecimal number
-\item \verb+%s+ -- string consisting of a sequence of 8-bit extended ASCII chars
-\item \verb+%%+ -- specifies a literal %.
-\end{itemize}
-\end{itemize}
-the following prints the line \verb+"0x4142 16706 AB"+ on cycles when \verb+c+ is true:
-\begin{scala}
-val x = Bits(0x4142)
-val s1 = sprintf("%x %s", x, x);
-when (c) { printf("%d %s\n", x, s1); }
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{assert}
-\begin{itemize}
-\item simulation time assertions are provided by \verb+assert+ construct
-\item if assert arguments false on rising edge then
-\begin{itemize}
-\item an error is printed and
-\item simulation terminates
-\end{itemize}
-\end{itemize}
-the following will terminate after 10 clock cycles:
-\begin{scala}
-val x = Reg(init = UInt(0, 4))
-x := x + UInt(1)
-assert(x < UInt(10))
-\end{scala}
-\end{frame}
-
-\begin{frame}{Verilog Debugging}
-% \begin{columns}
-% \column{0.35\textwidth}
-\begin{itemize}
-\item produce Verilog from Chisel
-\item write tests in Verilog harness
-\item use waveform debugger
-\end{itemize}
-% \column{0.55\textwidth}
-% \begin{center}
-% \includegraphics[height=0.7\textheight]{figs/modelsim.png}
-% \end{center}
-% \end{columns}
-\end{frame}
-
-\begin{frame}{Chisel Based Testing Overview}
-\begin{columns}
-\column{0.55\textwidth}
-\begin{itemize}
-\item tests written in Chisel
-\item Chisel
-\begin{itemize}
-\item compiles,
-\item runs, and
-\item talks to DUT using pipes
-\end{itemize}
-\item User
-\begin{itemize}
-\item sets inputs + get outputs using
-\begin{itemize}
-\item Chisel data to get nodes and
-\item tables from nodes to values
-\end{itemize}
-\item specifies nodes to trace
-\end{itemize}
-\end{itemize}
-
-\column{0.35\textwidth}
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/chisel-testing.pdf}
-\end{center}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Chisel Based Testing Details}
-
-\begin{columns}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-package Tutorial
-import Chisel._
-
-class Combinational extends Module {
- val io = new Bundle {
- val x = UInt(INPUT, 16)
- val y = UInt(INPUT, 16)
- val z = UInt(OUTPUT, 16) }
- io.z := io.x + io.y
-}
-
-class CombinationalTests(c: Combinational)
- extends Tester(c) {
- val maxInt = 1 << 16
- for (i <- 0 until 10) {
- val x = rnd.nextInt(maxInt)
- val y = rnd.nextInt(maxInt)
- poke(c.io.x, x)
- poke(c.io.y, y)
- step(1)
- expect(c.io.z, (x + y)&(maxInt-1))
- }
-}
-\end{scala}
-}
-\column{0.5\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-class Tester[T <: Module]
- (val c: T, val isTrace: Boolean = true) {
- var ok: Boolean
- val rnd: Random
- def reset(n: Int = 1)
- def poke(data: Bits, x: BigInt)
- def step(n: Int): Int
- def peek(data: Bits): BigInt
- def expect (data: Bits, target: BigInt): Boolean
-}
-\end{scala}
-}
-\begin{scriptsize}
-users utilize:
-\begin{itemize}
-\item \code{poke} to set input port and state values,
-\item \code{step} to execute the circuit one time unit,
-\item \code{peek} to read port and state values, and
-\item \code{expect} to compare peeked circuit values to expected arguments.
-\end{itemize}
-\end{scriptsize}
-
-\begin{center}
-\includegraphics[width=0.8\textwidth]{../tutorial/figs/DUT.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Binding Tester to Module}
-
-\begin{scala}
-object chiselMainTest {
- def apply[T <: Module]
- (args: Array[String], comp: () => T)(
- tester: T => Tester[T]): T
-}
-\end{scala}
-
-\noindent and used as follows:
-
-\begin{scala}
-chiselMainTest(args ++ Array("--compile", "--test", "--genHarness"),
- () => new Combinational()){
- c => new CombinationalTests(c)
-}
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{\code{ChiselMain*} Arguments}
-
-\begin{tabular}{ll}
-\verb+--targetDir+ & target pathname prefix \\
-\verb+--genHarness+ & generate harness file for C++ \\
-\verb+--backend v+ & generate verilog \\
-\verb+--backend c+ & generate C++ (default)\\
-\verb+--compile+ & compiles generated C++ \\
-\verb+--test+ & generates C++ with test plumbing \\
-\verb+--vcd+ & enable vcd dumping \\
-\verb+--debug+ & put all wires in C++ class file \\
-\end{tabular}
-
-\end{frame}
-
-\begin{frame}[fragile]{Running Tests Examples}
-
-\begin{scala}
-sbt "project tutorial" "run Combinational ... --compile --test --genHarness"
-...
-PASSED
-\end{scala}
-
-or through makefile
-
-\begin{scala}
-cd CHISEL/tutorial/emulator
-make combinational
-...
-PASSED
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Simple Decoupled Circuits Testing}
-\begin{scala}
-class GCDTests(c: GCD) extends Tester(c) {
- val (a, b, z) = (64, 48, 16)
- var t = 0
- do {
- val first = if (t == 0) 1 else 0;
- poke(c.io.a, a)
- poke(c.io.b, b)
- poke(c.io.e, first)
- step(1)
- t += 1
- } while (t <= 1 || peek(c.io.v) == 0)
- expect(c.io.z, z)
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Testing Coprocessor}
-\begin{center}
-\includegraphics[width=0.8\textwidth]{figs/rocket-coprocessor.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]{More Powerful Decoupled Circuits}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class AdvTester[+T <: Module](val dut: T, val ios: Array[Node])
- extends Tester[T](dut, ios) {
-
- val preprocessors = new ArrayBuffer[Processable]()
-
- val postprocessors = new ArrayBuffer[Processable]()
-
- // like step but does pre and post processing and work
- def takestep(work: => Unit = {}) = ...
-
- def until(pred: => Boolean, maxCycles: Int = ...)(work: => Unit): Boolean = ...
-
- def do_until(pred: => Boolean, maxCycles: Int = ...)(work: => Unit): Boolean = ...
-
- def eventually(pred: => Boolean, maxCycles: Int = ...) =
- until(pred, maxCycles){ }
-}
-\end{scala}
-}
-\vfill
-{\tiny by Stephen Twigg and Eric Love}
-\end{frame}
-
-\begin{frame}[fragile]{Sources + Sinks for Testing Decoupled Circuits}
-\verb+DecoupledSource+
-\begin{itemize}
-\item queue from tester to DUT
-\item tester enqueues data onto queue
-\item handlers moving data from queue to decoupled interface
-\item can use \verb+until+ to wait until data shows up on queue
-\end{itemize}
-\verb+DecoupledSink+
-\begin{itemize}
-\item queue from DUT to tester
-\item tester sees data on queue
-\item handlers moving data from decoupled interface to queue
-\item can use \verb+until+ to wait until data shows up on queue
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{Decoupled Testing Coprocessor}
-Imagine testing your coprocessor with AdvTester (instead of rocket core):
-\begin{scala}
-val commands = new DecoupledSource(dut.io.cmd, ...)
-val responses = new DecoupledSink(dut.io.resp, ...)
-...
-defTests {
- ...
- commands.inputs.enqueue(TestCmd.setup(0, 1, 10))
- until(!responses.outputs.isEmpty) { }
- val resp = response.outputs.dequeue()
- assert(resp.data == ..., "test 1 failed: bad response")
- assert(resp.rd == 10, "test 1 failed: bad rd returned")
- ...
-}
-\end{scala}
-\begin{itemize}
-\item memory can also be handled in tester using Scala queues and Scala memory and a process that gets stepped to handle mem requests.
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{C++ Simulator}
-\begin{itemize}
-\item cycle accurate simulator
-\begin{itemize}
-\item easy way to debug designs
-\end{itemize}
-\item compile chisel to one C++ class
-\begin{itemize}
-\item topologically sorts nodes based on dependencies
-\end{itemize}
-\item simulates using two phases
-\begin{itemize}
-\item \code{clock\_lo} for combinational
-\item \code{clock\_hi} for state updates
-\end{itemize}
-\item using fast multiword c++ template library
-\begin{itemize}
-\item now though expand in chisel backend
-\item use same representation
-\end{itemize}
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{Creating C++ Output}
-In order to construct a circuit,
-the user calls \code{chiselMain} from their top level \code{main} function:
-
-\begin{scala}
-object chiselMain {
- def apply[T <: Module]
- (args: Array[String], comp: () => T): T
-}
-\end{scala}
-
-\noindent
-which when run creates C++ files named
-\code{{\it module\_name}.cpp} and \code{{\it module\_name}.h} in
-the directory specified with
-\code{--targetDir {\it dir\_name}} argument.
-
-\begin{scala}
-chiselMain(Array("--backend", "c", "--targetDir", "../emulator"),
- () => new GCD())
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{{\tt dat\_t}}
-\begin{scala}
-template
-class dat_t {
- public:
- const static int n_words = ((w - 1) / 64) + 1;
- val_t values[n_words];
- inline val_t lo_word ( void ) { return values[0]; }
- ...
-}
-
-template dat_t DAT(val_t value);
-template dat_t LIT(val_t value);
-
-template std::string dat_to_str (dat_t val);
-
-std::string read_tok(FILE* f);
-
-template void str_to_dat(std::string str, dat_t& res);
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{{\tt mod\_t}}
-\begin{scala}
-class mod_t {
- public:
- std::vector< mod_t* > children;
- virtual void init ( void ) { };
- virtual void clock_lo ( dat_t<1> reset ) { };
- virtual void clock_hi ( dat_t<1> reset ) { };
- virtual void print ( FILE* f ) { };
- virtual bool scan ( FILE* f ) { return true; };
- virtual void dump ( FILE* f, int t ) { };
-};
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{C++ Simulator Outputs}
-\begin{itemize}
-\item \code{GCD.h} -- the header for the single class
-\item \code{GCD.cpp} -- the implementation of the single class
-\item \code{GCD-emulator.cpp} -- the harness which cycles the design
-\item \code{GCD.vcd} -- produced when running design with vcd output
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{GCD.h}
-\begin{scala}
-#include "emulator.h"
-
-class GCD_t : public mod_t {
- public:
- dat_t<1> GCD__io_v;
- dat_t<16> GCD__io_b;
- dat_t<1> GCD__io_e;
- dat_t<16> GCD__y;
- dat_t<16> GCD__y_shadow;
- dat_t<16> GCD__io_a;
- dat_t<16> GCD__x;
- dat_t<16> GCD__x_shadow;
- dat_t<16> GCD__io_z;
-
- void init ( val_t rand_init = 0 );
- void clock_lo ( dat_t<1> reset );
- void clock_hi ( dat_t<1> reset );
- void print ( FILE* f );
- bool scan ( FILE* f );
- void dump ( FILE* f, int t );
-};
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Name Mangling Scheme}
-\begin{itemize}
-\item chisel object names are mangled to
-\begin{itemize}
-\item maintain uniqueness and avoid name conflicts
-\item maintain hierarchical membership
-\item avoid problems with C++ naming convention
-\end{itemize}
-\item basic scheme is pathname consisting of
-\begin{itemize}
-\item Module name first followed by \code{\_\_}
-\item hierarchy elements separated with \code{\_}'s in order with
-\begin{itemize}
-\item numbers for vector elements
-\item names for bundle fields
-\end{itemize}
-\item actual object name last
-\end{itemize}
-\item examples
-\begin{itemize}
-\item \code{val io = Bundle\{ val x = UInt(width = 32) \}} produces
-\begin{itemize}
-\item \code{A\_\_io\_x}
-\end{itemize}
-\item \code{... Vec.fill(2)\{ Decoupled( Bool() ) \}} produces
-\begin{itemize}
-\item \code{B\_\_io\_ports\_0\_ready}
-\end{itemize}
-\end{itemize}
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{GCD.cpp}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-#include "GCD.h"
-
-void GCD_t::init ( val_t rand_init ) {
- { GCD__y.values[0] = rand_init ? rand_val() & 65535 : 0; }
- { GCD__x.values[0] = rand_init ? rand_val() & 65535 : 0; }
-}
-void GCD_t::clock_lo ( dat_t<1> reset ) {
- val_t T0__w0;
- ...
-};
-void GCD_t::clock_hi ( dat_t<1> reset ) {
- GCD__y = GCD__y_shadow;
- GCD__x = GCD__x_shadow;
-}
-void GCD_t::print ( FILE* f ) {
- fprintf(f, "%s", TO_CSTR(GCD__io_z));
- fprintf(f, "%s", " ");
- fprintf(f, "%s", TO_CSTR(GCD__io_v));
- fprintf(f, "\n");
- fflush(f);
-}
-bool GCD_t::scan ( FILE* f ) {
- str_to_dat(read_tok(f), GCD__io_a);
- str_to_dat(read_tok(f), GCD__io_b);
- str_to_dat(read_tok(f), GCD__io_e);
- return(!feof(f));
-}
-void GCD_t::dump(FILE *f, int t) {
-}
-\end{scala}
-}
-\end{frame}
-
-\begin{frame}[fragile]{GCD-emulator.cpp}
-\begin{scala}
-#include "GCD.h"
-int main (int argc, char* argv[]) {
- GCD_t* c = new GCD_t();
- int lim = (argc > 1) ? atoi(argv[1]) : -1;
- c->init();
- for (int i = 0; i < 5; i++) {
- dat_t<1> reset = LIT<1>(1);
- c->clock_lo(reset);
- c->clock_hi(reset);
- }
- for (int t = 0; lim < 0 || t < lim; t++) {
- dat_t<1> reset = LIT<1>(0);
- if (!c->scan(stdin)) break;
- c->clock_lo(reset);
- c->print(stdout);
- c->clock_hi(reset);
- }
-}
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{VCD Debugging}
-\begin{itemize}
-\item use \code{--vcd} arg to have simulation produce VCD output
-\item run your compiled C++ emulation app for a number of cycles
-\begin{itemize}
-\item specifying the number of cycles as a first argument
-\end{itemize}
-\item can view waveforms with
-\begin{itemize}
-\item \code{vcs} -- commercial
-\item GTKWave -- open source
-\end{itemize}
-\item can hierarchically focus on particular signals
-\item can view in a variety of formats
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{Manual C++ Testing}
-\begin{itemize}
-\item test Chisel code by manually
-\begin{itemize}
-\item setting circuit inputs directly in your C++ code
-\item inserting \code{printf}'s in your C++ code
-\end{itemize}
-\item in your c++ harness insert calls to
-\begin{itemize}
-\item \code{str\_to\_dat(read\_tok(f), GCD\_\_io\_a)} to set values
-\item \code{TO\_CSTR(GCD\_\_io\_z)} to create string for printing
-\end{itemize}
-\item in your chisel code
-\begin{itemize}
-\item wrap nodes with \code{debug} as in \code{debug(io.z)}
-\end{itemize}
-\item in your \code{chiselMain}
-\begin{itemize}
-\item you can add \code{---debug} arg to get everything available in object
-\end{itemize}
-\end{itemize}
-\end{frame}
-
-
-
-\begin{frame}[fragile]{Onwards}
-\begin{itemize}
-\item for simple tests can write test vector files
-\item check out Chisel tutorial code
-\end{itemize}
-\end{frame}
-
-\end{document}
diff --git a/doc/cs250/cs250.tex b/doc/cs250/cs250.tex
deleted file mode 100644
index 220f909b..00000000
--- a/doc/cs250/cs250.tex
+++ /dev/null
@@ -1,1297 +0,0 @@
-% NOTES:
-% enum slide
-% difference between := and =
-% link and plink pic
-% filter pic
-% examples of running chisel
-
-\documentclass[xcolor=pdflatex,dvipsnames,table]{beamer}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{relsize}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-\input{../style/talk.tex}
-
-\title{Chisel @ CS250}
-\author{Jonathan Bachrach}
-\date{\today}
-\institute[UC Berkeley]{EECS UC Berkeley}
-
-\begin{document}
-
-\begin{frame}
-\titlepage
-\end{frame}
-\addtocounter{framenumber}{-1}
-
-% \begin{frame}[fragile]{tutorial.scala}
-% \begin{scala}
-% package Tutorial {
-%
-% import Chisel._
-%
-% object Tutorial {
-% def main(args: Array[String]): Unit = {
-% val tut_args = args.slice(1, args.length) ++
-% Array("--targetDir", "../emulator", "--genHarness")
-% args(0) match {
-% case "gcd" =>
-% chiselMain(tut_args, () => new GCD())
-% ...
-% }
-% }
-% }
-%
-% }
-% \end{scala}
-% \end{frame}
-
-\begin{frame}
-\frametitle{Standard Design Methodology}
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/design.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}
-\frametitle{Design Entry}
-\begin{columns}[c]
-\column{0.5\textwidth}
-\begin{itemize}
-\item Design circuits graphically
-\item Used commonly until approximately 2002
-\item Schematics are intuitive
-\item Labor intensive to produce (especially readable ones).
-\item Requires a special editor tool
-\item Unless hierarchy is carefully designed, schematics can be confusing and difficult to follow on large designs
-\end{itemize}
-\column{0.5\textwidth}
-\begin{center}
-\includegraphics[height=0.4\textheight]{figs/schematic-capture.pdf}
-\end{center}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Hardware Description Languages}
-\begin{columns}[c]
-\column{0.45\textwidth}
-\textbf{Structural Description}: connections of components with a nearly one-to-one correspondence to schematic diagram.
-\begin{scala}
-Decoder(output x0,x1,x2,x3;
- input a,b) {
- wire abar, bbar;
- inv(bbar, b);
- inv(abar, a);
- and(x0, abar, bbar);
- and(x1, abar, b );
- and(x2, a, bbar);
- and(x3, a, b );
-}
-\end{scala}
-\column{0.45\textwidth}
-\textbf{Behavioral Description}: use high-level constructs (similar to convential programming) to describe the circuit function.
-\begin{scala}
-Decoder(output x0,x1,x2,x3;
- input a,b) {
- case [a b]
- 00: [x0 x1 x2 x3] = 0x1;
- 01: [x0 x1 x2 x3] = 0x2;
- 10: [x0 x1 x2 x3] = 0x4;
- 11: [x0 x1 x2 x3] = 0x8;
- endcase;
-}
-\end{scala}
-\end{columns}
-\end{frame}
-
-\begin{frame}
-
-\frametitle{Verilog Issues}
-\begin{itemize}
-\item Originally invented for simulation
-\item Many constructs don't synthesize: ex: deassign, timing constructs
-\item Others lead to mysterious results: for-loops
-\item Difficult to understand synthesis implications of procedural assignments (always blocks), and blocking versus non-blocking assignments
-\item In common use, most users ignore much of the language and stick to a very strict style
-\item Very weak meta programming support for creating circuit generators
-\item Various hacks around this over the years, ex: embedded TCL scripting
-\item VHDL has much the same issues
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}
-
-\frametitle{Chisel}
-
-\textbf{Constructing Hardware In Scala Embedded Language}
-\begin{itemize}
-\item Embed a hardware-description language in Scala, using Scala's extension facilities
-\item Chisel is just a set of class definitions in Scala and when you write a Chisel program you are actually writing a Scala program
-\item A hardware module is just a data structure in Scala
-\item Clean simple set of design construction primitives for RTL design
-\item Full power of Scala for writing hardware generators
-\item Different output routines can generate different types of output (C, FPGA-Verilog, ASIC-Verilog) from same hardware representation
-\item Can be extended above with domain specific languages (such as declarative cache coherence specifications)
-\item Can be extended below with new backends (such as quantum)
-\item Open source with lots of libraries
-\item Only 5200 lines of code in current version!
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}
-\frametitle{Chisel Workflow}
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/workflow.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{The Scala Programming Language}
-
-\begin{columns}[c]
-
-\column{0.75\textwidth}
-
-\begin{itemize}
-\item Compiled to JVM
-\begin{itemize}
-\item Good performance
-\item Great Java interoperability
-\item Mature debugging, execution environments
-\end{itemize}
-\item Object Oriented
-\begin{itemize}
-\item Factory Objects, Classes
-\item Traits, overloading etc
-\end{itemize}
-\item Functional
-\begin{itemize}
-\item Higher order functions
-\item Anonymous functions
-\item Currying etc
-\end{itemize}
-\item Extensible
-\begin{itemize}
-\item Domain Specific Languages (DSLs)
-\end{itemize}
-\end{itemize}
-
-\column{0.25\textwidth}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{figs/programming-scala.pdf} \\
-\includegraphics[height=0.4\textheight]{figs/programming-in-scala.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Scala Collections}
-\begin{scala}
-// Array's
-val tbl = new Array[Int](256)
-tbl(0) = 32
-val y = tbl(0)
-val n = tbl.length
-
-// ArrayBuffer's
-val buf = new ArrayBuffer[Int]()
-buf += 12
-val z = buf(0)
-val l = buf.length
-
-// List's
-val els = List(1, 2, 3)
-val a :: b :: c :: Nil = els
-val m = els.length
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Scala Iteration}
-\begin{scala}
-val tbl = new Array[Int](256)
-
-// loop over all indices
-for (i <- 0 until tbl.length)
- tbl(i) = i
-
-// loop of each sequence element
-for (e <- tbl)
- tbl(i) += e
-
-// nested loop
-for (i <- 0 until 16; j <- 0 until 16)
- tbl(j*16 + i) = i
-
-// create second table with doubled elements
-val tbl2 = for (i <- 0 until 16) yield tbl(i)*2
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Scala Functional}
-\begin{scala}
-// simple scaling function, e.g., x2(3) => 6
-def x2 (x: Int) = 2 * x
-\end{scala}
-
-\begin{scala}
-// produce list of 2 * elements, e.g., x2list(List(1, 2, 3)) => List(2, 4, 6)
-def x2list (xs: List[Int]) = xs.map(x2)
-\end{scala}
-
-\begin{scala}
-// simple addition function, e.g., add(1, 2) => 3
-def add (x: Int, y: Int) = x + y
-\end{scala}
-
-\begin{scala}
-// sum all elements using pairwise reduction, e.g., sum(List(1, 2, 3)) => 6
-def sum (xs: List[Int]) = xs.foldLeft(0)(add)
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Scala Object Oriented}
-
-\begin{scala}
-object Blimp {
- var numBlimps = 0
- def apply(r: Double) = {
- numBlimps += 1
- new Blimp(r)
- }
-}
-
-Blimp.numBlimps
-Blimp(10.0)
-
-class Blimp(r: Double) {
- val rad = r
- println("Another Blimp")
-}
-
-class Zep(r: Double) extends Blimp(r)
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Scala Console}
-\begin{scala}
-> scala
-scala> 1 + 2
-=> 3
-scala> def f (x: Int) = 2 * x
-=> (Int) => Int
-scala> f(4)
-=> 8
-\end{scala}
-\end{frame}
-
-% \begin{frame}[fragile]
-% \frametitle{Example}
-% \begin{columns}
-%
-% \column{0.45\textwidth}
-%
-% \begin{footnotesize}
-% \begin{scala}
-% class GCD extends Component {
-% val io = new Bundle {
-% val a = UFix(INPUT, 16)
-% val b = UFix(INPUT, 16)
-% val z = UFix(OUTPUT, 16)
-% val valid = Bool(OUTPUT) }
-% val x = Reg(resetVal = io.a)
-% val y = Reg(resetVal = io.b)
-% when (x > y) {
-% x := x - y
-% } .otherwise {
-% y := y - x
-% }
-% io.z := x
-% io.valid := y === UFix(0)
-% }
-% \end{scala}
-% \end{footnotesize}
-%
-% \column{0.45\textwidth}
-%
-% \begin{center}
-% \includegraphics[width=0.9\textwidth]{figs/gcd.pdf}
-% \end{center}
-%
-% \end{columns}
-% \end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Chisel Example}
-\begin{columns}
-
-\column{0.40\textwidth}
-
-\begin{footnotesize}
-\begin{scala}
-class Mux2 extends Component {
- val io = new Bundle{
- val sel = Bits(INPUT, 1)
- val in0 = Bits(INPUT, 1)
- val in1 = Bits(INPUT, 1)
- val out = Bits(OUTPUT, 1)
- }
- io.out := (io.sel & io.in1) |
- (~io.sel & io.in0)
-}
-\end{scala}
-\end{footnotesize}
-
-\column{0.50\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/mux2-component.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-% \begin{frame}[fragile]{Scala Console}
-% \begin{FramedVerb}
-% \end{FramedVerb}
-% \end{frame}
-
-\begin{frame}[fragile]{Literals}
-\begin{scala}
-Bits(1) // decimal 1-bit literal from Scala Int.
-Bits("ha") // hexadecimal 4-bit literal from string.
-Bits("o12") // octal 4-bit literal from string.
-Bits("b1010") // binary 4-bit literal from string.
-
-Fix(5) // signed decimal 4-bit literal from Scala Int.
-Fix(-8) // negative decimal 4-bit literal from Scala Int.
-UFix(5) // unsigned decimal 3-bit literal from Scala Int.
-
-Bool(true) // Bool literals from Scala literals.
-Bool(false)
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Literals}
-\begin{scala}
-Bits("h_dead_beef") // 32-bit literal of type Bits.
-Bits(1) // decimal 1-bit literal from Scala Int.
-Bits("ha", 8) // hexadecimal 8-bit literal of type Bits.
-Bits("o12", 6) // octal 6-bit literal of type Bits.
-Bits("b1010", 12) // binary 12-bit literal of type Bits.
-
-Fix(5, 7) // signed decimal 7-bit literal of type Fix.
-UFix(5, 8) // unsigned decimal 8-bit literal of type UFix.
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Literal Node Construction}
-
-\begin{scala}
-UFix(1)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/ufix.pdf}
-\end{center}
-
-\end{frame}
-
-
-\begin{frame}[fragile]{Algebraic Construction}
-
-\begin{scala}
-UFix(1) + UFix(1)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/add.pdf}
-\end{center}
-
-\end{frame}
-
-
-\begin{frame}[fragile]{Combinational Circuits}
-
-\begin{scala}
-(sel & in1) | (~sel & in0)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/mux2-circuit.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Fan Out}
-
-\begin{scala}
-val sel = a | b
-val out = (sel & in1) | (~sel & in0)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/mux2-named-sel.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Wires}
-
-\begin{scala}
-val sel = Bits()
-val out = (sel & in1) | (~sel & in0)
-sel := a | b
-\end{scala}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/mux2-forward-sel.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Bitwise operators}
-\textbf{Valid on Bits, Fix, UFix, Bool.}
-\begin{scala}
-// Bitwise-NOT
-val invertedX = ~x
-// Bitwise-AND
-val hiBits = x & Bits("h_ffff_0000")
-// Bitwise-OR
-val flagsOut = flagsIn | overflow
-// Bitwise-XOR
-val flagsOut = flagsIn ^ toggle
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Bitwise reductions}
-\textbf{Valid on Bits, Fix, and UFix. Returns Bool.}
-\begin{scala}
-// AND-reduction
-val allSet = andR(x)
-// OR-reduction
-val anySet = orR(x)
-// XOR-reduction
-val parity = xorR(x)
-\end{scala}
-\noindent
-where reduction applies the operation to all the bits.
-\end{frame}
-
-\begin{frame}[fragile]{Equality comparison}
-\textbf{Valid on Bits, Fix, UFix, and Bool. Returns Bool.}
-\begin{scala}
-// Equality
-val equ = x === y
-// Inequality
-val neq = x != y
-\end{scala}
-\noindent
-where \verb+===+ is used instead of \verb+==+ to avoid collision with Scala.
-\end{frame}
-
-\begin{frame}[fragile]{Shifts}
-\textbf{Valid on Bits, Fix, and UFix.}
-\begin{scala}
-// Logical left shift.
-val twoToTheX = Fix(1) << x
-// Right shift (logical on Bits & UFix, arithmetic on Fix).
-val hiBits = x >> UFix(16)
-\end{scala}
-\noindent
-where logical is a raw shift and arithmetic performs top bit sign extension.
-\end{frame}
-
-\begin{frame}[fragile]{Bitfield manipulation}
-\textbf{Valid on Bits, Fix, UFix, and Bool.}
-\begin{scala}
-// Extract single bit, LSB has index 0.
-val xLSB = x(0)
-// Extract bit field from end to start bit pos.
-val xTopNibble = x(15,12)
-// Replicate a bit string multiple times.
-val usDebt = Fill(3, Bits("hA"))
-// Concatenates bit fields, w/ first arg on left
-val float = Cat(sgn,exp,man)
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Logical Operations}
-\textbf{Valid on Bools. }
-\begin{scala}
-// Logical NOT.
-val sleep = !busy
-// Logical AND.
-val hit = tagMatch && valid
-// Logical OR.
-val stall = src1busy || src2busy
-// Two-input mux where sel is a Bool.
-val out = Mux(sel, inTrue, inFalse)
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Arithmetic operations}
-\textbf{Valid on Nums: Fix and UFix. }
-\begin{scala}
-// Addition.
-val sum = a + b
-// Subtraction.
-val diff = a - b
-// Multiplication.
-val prod = a * b
-// Division.
-val div = a / b
-// Modulus
-val mod = a % b
-\end{scala}
-\noindent
-where \verb+Fix+ is a signed fixed-point number represented in two's complement and \verb+UFix+ is an unsigned fixed-point number.
-\end{frame}
-
-\begin{frame}[fragile]{Arithmetic comparisons}
-\textbf{Valid on Nums: Fix and UFix. Returns Bool.}
-\begin{scala}
-// Greater than.
-val gt = a > b
-// Greater than or equal.
-val gte = a >= b
-// Less than.
-val lt = a < b
-// Less than or equal.
-val lte = a <= b
-\end{scala}
-\end{frame}
-
-\begin{frame}[fragile]{Bitwidth Inference}
-\begin{center}
-\begin{tabular}{ll}
-{\bf operation} & {\bf bit width} \\
-\verb|z = x + y| & \verb+wz = max(wx, wy)+ \\
-\verb+z = x - y+ & \verb+wz = max(wx, wy)+\\
-\verb+z = x & y+ & \verb+wz = min(wx, wy)+ \\
-\verb+z = x | y+ & \verb+wz = max(wx, wy)+ \\
-\verb+z = Mux(c, x, y)+ & \verb+wz = max(wx, wy)+ \\
-\verb+z = w * y+ & \verb!wz = wx + wy! \\
-\verb+z = x << n+ & \verb!wz = wx + maxNum(n)! \\
-\verb+z = x >> n+ & \verb+wz = wx - minNum(n)+ \\
-\verb+z = Cat(x, y)+ & \verb!wz = wx + wy! \\
-\verb+z = Fill(n, x)+ & \verb+wz = wx * maxNum(n)+ \\
-% \verb+z = x < y+ & \verb+<= > >= && || != ===+ & \verb+wz = 1+ \\
-\end{tabular}
-\end{center}
-\end{frame}
-
-% \begin{frame}[fragile]{Node Class Hierarchy}
-%
-% \begin{center}
-% \includegraphics[height=0.9\textheight]{../manual/figs/node-hierarchy.pdf}
-% \end{center}
-%
-% \end{frame}
-
-\begin{frame}[fragile]{Functional Abstraction}
-\begin{scala}
-def mux2 (sel: Bits, in0: Bits, in1: Bits) =
- (sel & in1) | (~sel & in0)
-
-val out = mux2(k,a,b)
-\end{scala}
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/mux2-function.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]{Bundles}
-
-\begin{columns}
-\column{0.55\textwidth}
-\begin{scala}
-class MyFloat extends Bundle {
- val sign = Bool()
- val exponent = UFix(width = 8)
- val significand = UFix(width = 23)
-}
-
-val x = new MyFloat()
-val xs = x.sign
-\end{scala}
-
-\column{0.35\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/myfloat.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Vecs}
-\begin{columns}
-\column{0.55\textwidth}
-
-\begin{scala}
-// Vector of 3 23-bit signed integers.
-val myVec = Vec(3) { Fix(width = 23) }
-\end{scala}
-
-\begin{itemize}
-\item can be used as Scala sequences
-\item can be nested into Chisel Bundles
-\end{itemize}
-
-\column{0.35\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/vec-3-fix.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Vec Static Element Access}
-\begin{scala}
-val myVec = Vec(3) { Fix(width = 23) }
-
-// Connect to one vector element chosen at elaboration time.
-val r0 = Reg(){ Fix(width = 23) }
-r0 := myVec(0)
-val fix1 = myVec(1)
-fix1 := data1
-myVec(2) := data2
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.5\textheight]{figs/vec-3-static.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]{Vec Dynamic Element Access}
-\begin{scala}
-val myVec = Vec(3) { Fix(width = 23) }
-
-// Connect to one vector element chosen dynamically.
-val out = myVec(addr1)
-myVec(addr2) := data2
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.6\textheight]{figs/vec-3-dynamic.pdf}
-\end{center}
-\end{frame}
-
-\begin{frame}[fragile]{Ports}
-
-\begin{columns}
-\column{0.55\textwidth}
-
-\textbf{Data object with directions assigned to its members}
-
-\begin{scala}
-class FIFOIO extends Bundle {
- val bits = Bits(INPUT, 32)
- val valid = Bool(OUTPUT)
- val ready = Bool(INPUT)
-}
-\end{scala}
-
-\textbf{Direction assigned at instantiation time}
-
-\begin{scala}
-class ScaleIO extends Bundle {
- val in = new MyFloat().asInput
- val scale = new MyFloat().asInput
- val out = new MyFloat().asOutput
-}
-\end{scala}
-
-\column{0.35\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/fifoio.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Component}
-
-\begin{columns}
-\column{0.45\textwidth}
-
-\begin{itemize}
-\item inherits from \verb+Component+,
-\item contains an interface stored in a port field named \verb+io+, and
-\item wires together subcircuits in its constructor.
-\end{itemize}
-
-\begin{scala}
-class Mux2 extends Component {
- val io = new Bundle{
- val sel = Bits(INPUT, 1)
- val in0 = Bits(INPUT, 1)
- val in1 = Bits(INPUT, 1)
- val out = Bits(OUTPUT, 1)
- }
- io.out := (io.sel & io.in1) |
- (~io.sel & io.in0)
-}
-\end{scala}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/mux2-component.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}{Chisel Workflow}
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/chisel-workflow.pdf}
-\end{center}
-\end{frame}
-
-
-
-\begin{frame}[fragile]{State Elements}
-
-\begin{scala}
-Reg(in)
-\end{scala}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/reg-in.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Rising Edge}
-
-\begin{scala}
-def risingEdge(x: Bool) = x && !Reg(x)
-\end{scala}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/rising-edge.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Counter}
-
-\begin{columns}
-\column{0.6\textwidth}
-
-\begin{scala}
-def counter(max: UFix) = {
- val x = Reg(resetVal = UFix(0, max.getWidth))
- x := Mux(x == max, UFix(0), x + UFix(1))
- x
-}
-\end{scala}
-
-\column{0.3\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/counter.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Sequential Circuits}
-
-\begin{scala}
-// Produce pulse every n cycles.
-def pulse(n: UFix) = counter(n - UFix(1)) === UFix(0)
-\end{scala}
-
-\begin{scala}
-// Flip internal state when input true.
-def toggle(p: Bool) = {
- val x = Reg(resetVal = Bool(false))
- x := Mux(p, !x, x)
- x
-}
-\end{scala}
-
-\begin{scala}
-// Square wave where each half cycle has given period.
-def squareWave(period: UFix) = toggle(pulse(period))
-\end{scala}
-
-\end{frame}
-
-% \begin{frame}[fragile]{Forward Declarations using Wires}
-%
-% \begin{scala}
-% val pcPlus4 = UFix()
-% val branchTarget = UFix()
-% val pcNext = Mux(pcSel, branchTarget, pcPlus4)
-% val pcReg = Reg(data = pcNext, resetVal = UFix(0, 32))
-% pcPlus4 := pcReg + UFix(4)
-% ...
-% branchTarget := addOut
-% \end{scala}
-%
-% \begin{center}
-% \includegraphics[height=0.5\textheight]{figs/forward.pdf}
-% \end{center}
-%
-% \end{frame}
-
-\begin{frame}[fragile]{Conditional Updates}
-
-\begin{columns}
-\column{0.45\textwidth}
-
-\begin{scala}
-val r = Reg() { UFix(16) }
-when (c === UFix(0) ) {
- r := r + UFix(1)
-}
-\end{scala}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/conditional-increment.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Updates Priority}
-
-\begin{scala}
-when (c1) { r := Bits(1) }
-when (c2) { r := Bits(2) }
-\end{scala}
-
-\textbf{Conditional Update Order:}
-
-\begin{center}
-\begin{tabular}{|c|c|c|l|}
-\hline
-\code{c1} & \code{c2} & \code{r} & \\
-\hline
-0 & 0 & r & \code{r} unchanged \\
-0 & 1 & 2 & \\
-1 & 0 & 1 & \\
-1 & 1 & 2& \code{c2} takes precedence over \code{c1} \\
-\hline
-\end{tabular}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Update Synthesized Hardware}
-
-\begin{center}
-\includegraphics[height=2in]{figs/conditional-updates.pdf}
-\end{center}
-
-\begin{itemize}
-\item Each \code{when} statement adds another level of data mux and ORs
- the predicate into the enable chain and
-\item the compiler effectively adds
- the termination values to the end of the chain automatically.
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]{Targetting Multiple Registers}
-
-\begin{scala}
-r := Fix(3)
-s := Fix(3)
-when (c1) { r := Fix(1); s := Fix(1) }
-when (c2) { r := Fix(2) }
-\end{scala}
-
-leads to \code{r} and \code{s} being updated according to the
-following truth table:
-
-{\footnotesize
-\begin{center}
-\begin{tabular}{|c|c|c|c|l|}
-\hline
-\code{c1} & \code{c2} & \code{r} & \code{s} & \\
-\hline
-0 & 0 & 3 & 3 & \\
-0 & 1 & 2 & 3 & \\
-1 & 0 & 1 & 1 & \code{r} updated in \code{c2} block, \code{s} updated using default \\
-1 & 1 & 2 & 1 & \\
-\hline
-\end{tabular}
-\end{center}
-}
-
-
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Update Nesting}
-
-\begin{scala}
-when (a) { when (b) { body } }
-\end{scala}
-
-which is the same as:
-
-\begin{scala}
-when (a && b) { body }
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Conditional Update Chaining}
-
-\begin{scala}
-when (c1) { u1 }
-.elsewhen (c2) { u2 }
-.otherwise { ud }
-\end{scala}
-
-which is the same as:
-
-\begin{scala}
-when (c1) { u1 }
-when (!c1 && c2) { u2 }
-when (!(c1 || c2)) { ud }
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Switch Statement}
-
-\begin{scala}
-switch(idx) {
- is(v1) { u1 }
- is(v2) { u2 }
-}
-\end{scala}
-
-which is the same as:
-
-\begin{scala}
-when (idx === v1) { u1 }
-when (idx === v2) { u2 }
-\end{scala}
-
-\end{frame}
-
-% \begin{frame}[fragile]{Enums}
-% \begin{scala}
-% val s_even :: s_odd :: Nil = Enum(2){ UFix() }
-% \end{scala}
-% \end{frame}
-
-
-\begin{frame}[fragile]{Finite State Machines}
-
-\begin{columns}
-\column{0.65\textwidth}
-
-\begin{scala}
-class Parity extends Component {
- val io = new Bundle {
- val in = Bool(INPUT)
- val out = Bool(OUTPUT) }
- val s_even :: s_odd :: Nil = Enum(2){ UFix() }
- val state = Reg(resetVal = s_even)
- when (io.in) {
- when (state === s_even) { state := s_odd }
- .otherwise { state := s_even }
- }
- io.out := (state === s_odd)
-}
-\end{scala}
-
-\column{0.25\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/parity.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{ROM}
-
-\begin{scala}
-val i = Array(UFix(1), UFix(2), UFix(4), UFix(8))
-val m = ROM(i){ UFix(width = 32) }
-val r = m(counter(UFix(3)))
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.7\textheight]{figs/rom.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Mul Lookup Table Problem}
-\begin{scala}
-class Mul extends Component {
- val io = new Bundle {
- val x = UFix(INPUT, 4)
- val y = UFix(INPUT, 4)
- val z = UFix(OUTPUT, 8) }
-
- val muls = new Array[UFix](256)
- for (x <- 0 until 16; y <- 0 until 16)
- muls((x << 4) | y) = x * y
-
- val tbl = ROM(muls){ UFix(8) }
-
- io.z := tbl((io.x << 4) | io.y)
-}
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]{Memories}
-
-\begin{scala}
-val regs = Mem(32){ Bits(width = 32) }
-when (wrEn) {
- regs(wrAddr) := wrData
-}
-val iDat = regs(iAddr)
-val mDat = regs(mAddr)
-\end{scala}
-
-\begin{center}
-\includegraphics[height=0.6\textheight]{figs/mem.pdf}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Port Classes, Subclasses, and Nesting}
-
-\begin{columns}
-\column{0.55\textwidth}
-
-\begin{scala}
-class LinkIO extends Bundle {
- val data = Bits(OUTPUT, 16)
- val valid = Bool(OUTPUT)
-}
-\end{scala}
-
-\column{0.35\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/link-io.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Bundle Subclassing}
-
-\begin{columns}
-\column{0.55\textwidth}
-
-We can then extend \verb+SimpleLink+ by adding parity bits using
-bundle inheritance:
-
-\begin{scala}
-class PLinkIO extends LinkIO {
- val parity = Bits(OUTPUT, 5)
-}
-\end{scala}
-
-\noindent
-In general, users can organize their interfaces into hierarchies using inheritance in order to promote reuse.
-
-\column{0.35\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/plink-io.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]{Filter IO}
-
-\begin{columns}
-\column{0.55\textwidth}
-
-From there we can define a filter interface by nesting two
-\verb+LinkIO+s into a new \verb+FilterIO+ bundle:
-
-\begin{scala}
-class FilterIO extends Bundle {
- val in = new LinkIO().flip
- val out = new LinkIO()
-}
-\end{scala}
-
-\noindent
-where \verb+flip+ recursively changes the ``gender'' of a bundle,
-changing input to output and output to input.
-
-\column{0.35\textwidth}
-
-\begin{center}
-\includegraphics[height=0.9\textheight]{figs/filter-io.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Filter}
-
-We can now define a filter by defining a filter class extending component:
-
-\begin{columns}
-\column{0.45\textwidth}
-
-\begin{scala}
-class Filter extends Component {
- val io = new FilterIO()
- io.out.valid := io.in.valid
- io.out.data := io.in.data
-}
-\end{scala}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/pass-through-filter.pdf}
-\end{center}
-\end{columns}
-
-\noindent
-where the \verb+io+ field contains \verb+FilterIO+.
-
-\end{frame}
-
-\begin{frame}[fragile]{Bulk Connections}
-We can now compose two filters into a filter block as follows:
-
-\begin{columns}
-\column{0.40\textwidth}
-
-\begin{scala}
-class Block extends Component {
- val io = new FilterIO()
- val f1 = new Filter()
- val f2 = new Filter()
-
- f1.io.in <> io.in
- f1.io.out <> f2.io.in
- f2.io.out <> io.out
-}
-\end{scala}
-
-\column{0.50\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/block.pdf}
-\end{center}
-
-\end{columns}
-
-\noindent
-where \verb+<>+ bulk connects interfaces.
-\begin{itemize}
-\item Bulk connections connect leaf ports of the same name to each other.
-\item After all connections are made and the circuit is being elaborated,
-Chisel warns users if ports have other than exactly one connection to them.
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]{Router Interface}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class ReadCmd extends Bundle {
- val addr = UFix(width = 32)
-}
-
-class WriteCmd extends ReadCmd {
- val data = UFix(width = 32)
-}
-
-class Packet extends Bundle {
- val header = UFix(width = 8)
- val body = Bits(width = 64)
-}
-
-class RouterIO(n: Int) extends Bundle {
- override def clone = new RouterIO(n).asInstanceOf[this.type]
- val reads = new DeqIO(){ new ReadCmd() }
- val replies = new EnqIO(){ UFix(width = 8) }
- val writes = new DeqIO(){ new WriteCmd() }
- val in = new DeqIO(){ new Packet() }
- val outs = Vec(n){ new EnqIO(){ new Packet() } }
-}
-\end{scala}
-}
-
-\end{frame}
-
-
-\begin{frame}
-\begin{columns}
-
-\column{0.65\textwidth}
-
-\frametitle{Resources}
-\begin{itemize}
-\item Scala books
-\item \url{chisel.eecs.berkeley.edu}
-\item Chisel writings
-\begin{itemize}
-\item Chisel tutorial
-\item Chisel manual
-\item Chisel DAC-2012 paper
-\end{itemize}
-\item Chisel examples on github
-\begin{itemize}
-\item Sodor Processors
-\item Floating Point Unit
-\item Rocket Processor
-\item Hwacha Vector Unit
-\end{itemize}
-\end{itemize}
-
-\column{0.25\textwidth}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{figs/programming-scala.pdf} \\
-\includegraphics[height=0.4\textheight]{figs/programming-in-scala.pdf}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}
-\frametitle{Advanced Topics}
-\begin{itemize}
-\item Library Interfaces and Data Structures
-\item Polymorphism and Parameterization
-\item Higher-order Functions
-\item Layering Domain Specific Languages on Top
-\end{itemize}
-\end{frame}
-
-\end{document}
diff --git a/doc/cs250/figs/FIFOIO.graffle b/doc/cs250/figs/FIFOIO.graffle
deleted file mode 100644
index 3b93b177..00000000
Binary files a/doc/cs250/figs/FIFOIO.graffle and /dev/null differ
diff --git a/doc/cs250/figs/FIFOIO.pdf b/doc/cs250/figs/FIFOIO.pdf
deleted file mode 100644
index bac09da8..00000000
Binary files a/doc/cs250/figs/FIFOIO.pdf and /dev/null differ
diff --git a/doc/cs250/figs/abcd.graffle b/doc/cs250/figs/abcd.graffle
deleted file mode 100644
index 3ae90706..00000000
Binary files a/doc/cs250/figs/abcd.graffle and /dev/null differ
diff --git a/doc/cs250/figs/abcd.pdf b/doc/cs250/figs/abcd.pdf
deleted file mode 100644
index b2ad00f3..00000000
Binary files a/doc/cs250/figs/abcd.pdf and /dev/null differ
diff --git a/doc/cs250/figs/add.graffle b/doc/cs250/figs/add.graffle
deleted file mode 100644
index 930e02fd..00000000
Binary files a/doc/cs250/figs/add.graffle and /dev/null differ
diff --git a/doc/cs250/figs/add.pdf b/doc/cs250/figs/add.pdf
deleted file mode 100644
index 5b4f0b6d..00000000
Binary files a/doc/cs250/figs/add.pdf and /dev/null differ
diff --git a/doc/cs250/figs/block.graffle b/doc/cs250/figs/block.graffle
deleted file mode 100644
index 5919cce2..00000000
Binary files a/doc/cs250/figs/block.graffle and /dev/null differ
diff --git a/doc/cs250/figs/block.pdf b/doc/cs250/figs/block.pdf
deleted file mode 100644
index acbb674a..00000000
Binary files a/doc/cs250/figs/block.pdf and /dev/null differ
diff --git a/doc/cs250/figs/chisel-design-process.graffle b/doc/cs250/figs/chisel-design-process.graffle
deleted file mode 100644
index bfed2540..00000000
Binary files a/doc/cs250/figs/chisel-design-process.graffle and /dev/null differ
diff --git a/doc/cs250/figs/chisel-design-process.pdf b/doc/cs250/figs/chisel-design-process.pdf
deleted file mode 100644
index 5194b0bc..00000000
Binary files a/doc/cs250/figs/chisel-design-process.pdf and /dev/null differ
diff --git a/doc/cs250/figs/chisel-testing.graffle b/doc/cs250/figs/chisel-testing.graffle
deleted file mode 100644
index a0b3dac5..00000000
Binary files a/doc/cs250/figs/chisel-testing.graffle and /dev/null differ
diff --git a/doc/cs250/figs/chisel-testing.pdf b/doc/cs250/figs/chisel-testing.pdf
deleted file mode 100644
index 81dc05a2..00000000
Binary files a/doc/cs250/figs/chisel-testing.pdf and /dev/null differ
diff --git a/doc/cs250/figs/chiseler.pdf b/doc/cs250/figs/chiseler.pdf
deleted file mode 100644
index 2b6614c8..00000000
Binary files a/doc/cs250/figs/chiseler.pdf and /dev/null differ
diff --git a/doc/cs250/figs/conditional-increment.graffle b/doc/cs250/figs/conditional-increment.graffle
deleted file mode 100644
index f45b615c..00000000
Binary files a/doc/cs250/figs/conditional-increment.graffle and /dev/null differ
diff --git a/doc/cs250/figs/conditional-increment.pdf b/doc/cs250/figs/conditional-increment.pdf
deleted file mode 100644
index 77717065..00000000
Binary files a/doc/cs250/figs/conditional-increment.pdf and /dev/null differ
diff --git a/doc/cs250/figs/conditional-updates.graffle b/doc/cs250/figs/conditional-updates.graffle
deleted file mode 100644
index 405294b3..00000000
Binary files a/doc/cs250/figs/conditional-updates.graffle and /dev/null differ
diff --git a/doc/cs250/figs/conditional-updates.pdf b/doc/cs250/figs/conditional-updates.pdf
deleted file mode 100644
index bab0b336..00000000
Binary files a/doc/cs250/figs/conditional-updates.pdf and /dev/null differ
diff --git a/doc/cs250/figs/counter.graffle b/doc/cs250/figs/counter.graffle
deleted file mode 100644
index fc693c93..00000000
Binary files a/doc/cs250/figs/counter.graffle and /dev/null differ
diff --git a/doc/cs250/figs/counter.pdf b/doc/cs250/figs/counter.pdf
deleted file mode 100644
index a48daa58..00000000
Binary files a/doc/cs250/figs/counter.pdf and /dev/null differ
diff --git a/doc/cs250/figs/decoupled-block.graffle b/doc/cs250/figs/decoupled-block.graffle
deleted file mode 100644
index ca1635fb..00000000
Binary files a/doc/cs250/figs/decoupled-block.graffle and /dev/null differ
diff --git a/doc/cs250/figs/decoupled-block.pdf b/doc/cs250/figs/decoupled-block.pdf
deleted file mode 100644
index 655a711c..00000000
Binary files a/doc/cs250/figs/decoupled-block.pdf and /dev/null differ
diff --git a/doc/cs250/figs/decoupled-filter-io.graffle b/doc/cs250/figs/decoupled-filter-io.graffle
deleted file mode 100644
index ef5a757f..00000000
Binary files a/doc/cs250/figs/decoupled-filter-io.graffle and /dev/null differ
diff --git a/doc/cs250/figs/decoupled-filter-io.pdf b/doc/cs250/figs/decoupled-filter-io.pdf
deleted file mode 100644
index 6a71655b..00000000
Binary files a/doc/cs250/figs/decoupled-filter-io.pdf and /dev/null differ
diff --git a/doc/cs250/figs/design-loop-compile-test-debug-eval.pdf b/doc/cs250/figs/design-loop-compile-test-debug-eval.pdf
deleted file mode 100644
index b5501b26..00000000
Binary files a/doc/cs250/figs/design-loop-compile-test-debug-eval.pdf and /dev/null differ
diff --git a/doc/cs250/figs/design-loop-debug.graffle b/doc/cs250/figs/design-loop-debug.graffle
deleted file mode 100644
index c1dc927a..00000000
Binary files a/doc/cs250/figs/design-loop-debug.graffle and /dev/null differ
diff --git a/doc/cs250/figs/design-loop-debug.pdf b/doc/cs250/figs/design-loop-debug.pdf
deleted file mode 100644
index a438f224..00000000
Binary files a/doc/cs250/figs/design-loop-debug.pdf and /dev/null differ
diff --git a/doc/cs250/figs/design-loop-program-compile-test-debug-eval.graffle b/doc/cs250/figs/design-loop-program-compile-test-debug-eval.graffle
deleted file mode 100644
index 1f40bee1..00000000
Binary files a/doc/cs250/figs/design-loop-program-compile-test-debug-eval.graffle and /dev/null differ
diff --git a/doc/cs250/figs/design-loop-program-compile-test-debug-eval.pdf b/doc/cs250/figs/design-loop-program-compile-test-debug-eval.pdf
deleted file mode 100644
index fac9140e..00000000
Binary files a/doc/cs250/figs/design-loop-program-compile-test-debug-eval.pdf and /dev/null differ
diff --git a/doc/cs250/figs/design-loop-program-eval.graffle b/doc/cs250/figs/design-loop-program-eval.graffle
deleted file mode 100644
index 3772a375..00000000
Binary files a/doc/cs250/figs/design-loop-program-eval.graffle and /dev/null differ
diff --git a/doc/cs250/figs/design-loop-program-eval.pdf b/doc/cs250/figs/design-loop-program-eval.pdf
deleted file mode 100644
index 996c66ee..00000000
Binary files a/doc/cs250/figs/design-loop-program-eval.pdf and /dev/null differ
diff --git a/doc/cs250/figs/design-loop-programming.graffle b/doc/cs250/figs/design-loop-programming.graffle
deleted file mode 100644
index a6019efa..00000000
Binary files a/doc/cs250/figs/design-loop-programming.graffle and /dev/null differ
diff --git a/doc/cs250/figs/design-loop-programming.pdf b/doc/cs250/figs/design-loop-programming.pdf
deleted file mode 100644
index 7b4e497e..00000000
Binary files a/doc/cs250/figs/design-loop-programming.pdf and /dev/null differ
diff --git a/doc/cs250/figs/design-loop-test-debug-eval.graffle b/doc/cs250/figs/design-loop-test-debug-eval.graffle
deleted file mode 100644
index 68054330..00000000
Binary files a/doc/cs250/figs/design-loop-test-debug-eval.graffle and /dev/null differ
diff --git a/doc/cs250/figs/design-loop-test-debug-eval.pdf b/doc/cs250/figs/design-loop-test-debug-eval.pdf
deleted file mode 100644
index fcf33206..00000000
Binary files a/doc/cs250/figs/design-loop-test-debug-eval.pdf and /dev/null differ
diff --git a/doc/cs250/figs/design-loop-test.graffle b/doc/cs250/figs/design-loop-test.graffle
deleted file mode 100644
index cd53f6b3..00000000
Binary files a/doc/cs250/figs/design-loop-test.graffle and /dev/null differ
diff --git a/doc/cs250/figs/design-loop-test.pdf b/doc/cs250/figs/design-loop-test.pdf
deleted file mode 100644
index ed85b178..00000000
Binary files a/doc/cs250/figs/design-loop-test.pdf and /dev/null differ
diff --git a/doc/cs250/figs/design-loop.graffle b/doc/cs250/figs/design-loop.graffle
deleted file mode 100644
index 4f0b4748..00000000
Binary files a/doc/cs250/figs/design-loop.graffle and /dev/null differ
diff --git a/doc/cs250/figs/design-loop.pdf b/doc/cs250/figs/design-loop.pdf
deleted file mode 100644
index 01c18086..00000000
Binary files a/doc/cs250/figs/design-loop.pdf and /dev/null differ
diff --git a/doc/cs250/figs/design.graffle b/doc/cs250/figs/design.graffle
deleted file mode 100644
index a3f86254..00000000
Binary files a/doc/cs250/figs/design.graffle and /dev/null differ
diff --git a/doc/cs250/figs/design.pdf b/doc/cs250/figs/design.pdf
deleted file mode 100644
index e5d8d417..00000000
Binary files a/doc/cs250/figs/design.pdf and /dev/null differ
diff --git a/doc/cs250/figs/filter-io.graffle b/doc/cs250/figs/filter-io.graffle
deleted file mode 100644
index d826175c..00000000
Binary files a/doc/cs250/figs/filter-io.graffle and /dev/null differ
diff --git a/doc/cs250/figs/filter-io.pdf b/doc/cs250/figs/filter-io.pdf
deleted file mode 100644
index b6cf1186..00000000
Binary files a/doc/cs250/figs/filter-io.pdf and /dev/null differ
diff --git a/doc/cs250/figs/filter.graffle b/doc/cs250/figs/filter.graffle
deleted file mode 100644
index a0c7778f..00000000
--- a/doc/cs250/figs/filter.graffle
+++ /dev/null
@@ -1,1274 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 138.33.0.157554
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {576, 733}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-29 16:25:21 -0700
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1 0/72 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- ID
- 53
- Points
-
- {468, 333}
- {540, 333}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- ID
- 54
- Points
-
- {522, 243}
- {522, 333}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- ID
- 55
- Points
-
- {504, 243}
- {504, 333}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- ID
- 56
- Points
-
- {468, 243}
- {540, 243}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- ID
- 57
- Points
-
- {486, 243}
- {486, 333}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 52
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- ID
- 47
- Points
-
- {36, 333}
- {108, 333}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- ID
- 48
- Points
-
- {90, 243}
- {90, 333}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- ID
- 49
- Points
-
- {72, 243}
- {72, 333}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- ID
- 50
- Points
-
- {36, 243}
- {108, 243}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- ID
- 51
- Points
-
- {54, 243}
- {54, 333}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 46
-
-
- Bounds
- {{379.5, 297.5}, {63, 35}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 21
-
- ID
- 16
- Line
-
- ID
- 15
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs42 \cf0 ready}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 15
- Points
-
- {360, 315}
- {468, 315}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- StickArrow
- Width
- 2
-
-
-
-
- Bounds
- {{385.5, 270.5}, {51, 35}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 21
-
- ID
- 14
- Line
-
- ID
- 13
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs42 \cf0 data}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 13
- Points
-
- {360, 288}
- {468, 288}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{133.5, 270.5}, {51, 35}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 21
-
- ID
- 12
- Line
-
- ID
- 11
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs42 \cf0 data}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 11
- Points
-
- {108, 288}
- {216, 288}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{127.5, 297.5}, {63, 35}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 21
-
- ID
- 10
- Line
-
- ID
- 9
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs42 \cf0 ready}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 9
- Points
-
- {108, 315}
- {216, 315}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- StickArrow
- Width
- 2
-
-
-
-
- Bounds
- {{384, 243.5}, {54, 35}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 21
-
- ID
- 8
- Line
-
- ID
- 7
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs42 \cf0 valid}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 7
- Points
-
- {360, 261}
- {468, 261}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{132, 243.5}, {54, 35}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 21
-
- ID
- 6
- Line
-
- ID
- 5
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs42 \cf0 valid}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 5
- Points
-
- {108, 261}
- {216, 261}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{216, 216}, {144, 144}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 22
-
- ID
- 3
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs78 \cf0 Filter}
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2012-05-30 10:08:02 -0700
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAx7X05TU2l6ZT1mZn2WgWQCgRgDhg==
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- QuickLookPreview
-
- JVBERi0xLjMKJcTl8uXrp/Og0MTGCjUgMCBvYmoKPDwgL0xlbmd0aCA2IDAgUiAvRmls
- dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGlVctu20AMvO9X8KgcvNmntLo2aA65
- BRbQQ9FD4MRAArlAHmjRv++Qu5Ilx1acFoIg2iJnyRGHfKZbeiaDKzY1Nd7TywN9o590
- efVqafNKVq7XDa2MjsT3xHFLztbkG082BL4VovEn/UbUDe6njHO1liMMra9wmpUfK37w
- gZudoDBSQeEc1uqWYx3nYAjnT+JcShRC5MgvHSdmjHHUbci3GRrPVfDae+cSQHVU3Y4u
- r602OLzbUnX92L89vFxQ90RfO6HgfVLWJHK1JaRnvLZi95KXQW0GtU1SmpTidHMkrmDE
- RgdGtPBSjN6P6EHX+LVGNu+4t96C+BBBfiAfmZ/tjB01ScXGlkID4oQdVwrDc+WA0gZ8
- rQZoc0a+U/Xr7oK5dKrqs0HV42DcX9AP6m4yWcOnnZw5lu9rU4pHttqWErmoJdJCHUbS
- JK6QXWwmTe1o79UzF/JJFkjzyR8nTR1pqWDtP5CmRtLof0izzuhWeRulMyAoWLkTlkiz
- 1movvjsShBI3oCX0E96MXv3oZdGDpzrNNRSMpRrIuc/UKRVKn9l0rM9q7ero00GfKSgP
- ffbyMHRVaTiq0F7ceVT9ObPPlIgTY2AUJ+yPKRPZEY+PSZwaJZjCXpziNb5p7ZI4PQXM
- mWhBWR6Ai5SNg2s/t2YiNTpARYHJOxxb93dv4GwYWh/qUOosSkkJdZ6pw3kceB0wMj+i
- Q8Usjm+W+PEJo2vg5/3oomc1zl5R4Sf4ORhilfCjzuKncbot4gl1OkNyCvPU11gqJcqP
- CD02YEbLktt77d/MJccTyMqFxeYbzOuZ5GajfbplhJ8PJXfQNZ+RnJ9s7sPxzgRg/bjg
- oR7eQ9jduaUOPXkk+Lp4ilIRc9yVQbGrMiiMZdAWy0WOh3HaM38pccD8wxY/7cqZhjSk
- ytZpX4blVhkIyLkcL4txIzRcfGEt40Y3cMDWaV/Jl9sV3PNHmNJw+xf6Sgd1CmVuZHN0
- cmVhbQplbmRvYmoKNiAwIG9iago3MzIKZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1Bh
- Z2UgL1BhcmVudCA0IDAgUiAvUmVzb3VyY2VzIDcgMCBSIC9Db250ZW50cyA1IDAgUiAv
- TWVkaWFCb3ggWzAgMCA1NzYgNzMzXQo+PgplbmRvYmoKNyAwIG9iago8PCAvUHJvY1Nl
- dCBbIC9QREYgL1RleHQgXSAvQ29sb3JTcGFjZSA8PCAvQ3MxIDggMCBSIC9DczIgOSAw
- IFIgPj4gL0ZvbnQgPDwKL0YxLjAgMTAgMCBSID4+ID4+CmVuZG9iagoxMSAwIG9iago8
- PCAvTGVuZ3RoIDEyIDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVy
- IC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWato
- RdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKh
- Fy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvs
- TiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI
- 3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbI
- EL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0
- +GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv
- 4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1
- JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF
- 5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXj
- VfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPi
- KTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM
- 0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZu
- a6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VL
- FrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UUKZW5k
- c3RyZWFtCmVuZG9iagoxMiAwIG9iago3MzcKZW5kb2JqCjggMCBvYmoKWyAvSUNDQmFz
- ZWQgMTEgMCBSIF0KZW5kb2JqCjEzIDAgb2JqCjw8IC9MZW5ndGggMTQgMCBSIC9OIDEg
- L0FsdGVybmF0ZSAvRGV2aWNlR3JheSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJl
- YW0KeAGFUk9IFFEc/s02EoSIQYV4iHcKCZUprKyg2nZ1WZVtW5XSohhn37qjszPTm9k1
- xZMEXaI8dQ+iY3Ts0KGbl6LArEvXIKkgCDx16PvN7OoohG95O9/7/f1+33tEbZ2m7zsp
- QVRzQ5UrpaduTk2Lgx8pRR3UTlimFfjpYnGMseu5kr+719Zn0tiy3se1dvv2PbWVZWAh
- 6i22txD6IZFmAB+ZnyhlgLPAHZav2D4BPFgOrBrwI6IDD5q5MNPRnHSlsi2RU+aiKCqv
- YjtJrvv5uca+i7WJg/5cj2bWjr2z6qrRTNS090ShvA+uRBnPX1T2bDUUpw3jnEhDGiny
- rtXfK0zHEZErEEoGUjVkuZ9qTp114HUYu126k+P49hClPslgqIm16bKZHYV9AHYqy+wQ
- 8AXo8bJiD+eBe2H/W1HDk8AnYT9kh3nWrR/2F65T4HuEPTXgzhSuxfHaih9eLQFD91Qj
- aIxzTcTT1zlzpIjvMdQZmPdGOaYLMXeWqhM3gDthH1mqZgqxXfuu6iXuewJ30+M70Zs5
- C1ygHElysRXZFNA8CVgUfYuwSQ48Ps4eVeB3qJjAHLmJ3M0o9x7VERtno1KBVnqNV8ZP
- 47nxxfhlbBjPgH6sdtd7fP/p4xV117Y+PPmNetw5rr2dG1VhVnFlC93/xzKEj9knOabB
- 06FZWGvYduQPmsxMsAwoxH8FPpf6khNV3NXu7bhFEsxQPixsJbpLVG4p1Oo9g0qsHCvY
- AHZwksQsWhy4U2u6OXh32CJ6bflNV7Lrhv769nr72vIebcqoKSgTzbNEZpSxW6Pk3Xjb
- /WaREZ84Or7nvYpayf5JRRA/hTlaKvIUVfRWUNbEb2cOfhu2flw/pef1Qf08CT2tn9Gv
- 6KMRvgx0Sc/Cc1Efo0nwsGkh4hKgioMz1E5UY40D4inx8rRbZJH9D0AZ/WYKZW5kc3Ry
- ZWFtCmVuZG9iagoxNCAwIG9iago3MDQKZW5kb2JqCjkgMCBvYmoKWyAvSUNDQmFzZWQg
- MTMgMCBSIF0KZW5kb2JqCjQgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9NZWRpYUJveCBb
- MCAwIDYxMiA3OTJdIC9Db3VudCAxIC9LaWRzIFsgMyAwIFIgXSA+PgplbmRvYmoKMTUg
- MCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL091dGxpbmVzIDIgMCBSIC9QYWdlcyA0IDAg
- UiA+PgplbmRvYmoKMiAwIG9iago8PCAvTGFzdCAxNiAwIFIgL0ZpcnN0IDE3IDAgUiA+
- PgplbmRvYmoKMTcgMCBvYmoKPDwgL1BhcmVudCAxOCAwIFIgL0NvdW50IDAgL0Rlc3Qg
- WyAzIDAgUiAvWFlaIDAgNzMzIDAgXSAvVGl0bGUgKENhbnZhcyAxKQo+PgplbmRvYmoK
- MTggMCBvYmoKPDwgPj4KZW5kb2JqCjE2IDAgb2JqCjw8IC9QYXJlbnQgMTggMCBSIC9D
- b3VudCAwIC9EZXN0IFsgMyAwIFIgL1hZWiAwIDczMyAwIF0gL1RpdGxlIChDYW52YXMg
- MSkKPj4KZW5kb2JqCjE5IDAgb2JqCjw8IC9MZW5ndGggMjAgMCBSIC9MZW5ndGgxIDc1
- ODggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBvVkNdFRFlr71/jsdku5O
- Ov2T7nQ3ne7O/y8kaRPJI3SHhJAQCGAaiaQDCQkSjRiiMAMTFRQCMiLyo3gcUZffwTyS
- DDYwsNEF0RlHcUbxZ9kdVHQ8HnOY3VXXEZLe+16HSDijh7PHY1VuVd26VbdufXXf7fcq
- nStWNsME6AYaahcEO1pASZbTWF1c3B7siPC6i1h3L+7qtEd4NgWAXt7SsbQ9wgtPAERZ
- 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
- jHS+QWyEyV46snXkyxdHWgY44YUJnMMoPJHM1CBcD8oxQknhZrzT/WcJvQ7vhn3K3fBM
- mIV3v7dBABZiL8Hb6sj7Gof/v4PK+gXz/NPTK5qXdzV3ti0OKiOuaZT/rygi1SI1InUg
- dSM9hvQskoQ0iHQuPJqwDWNtgu+G43lZ+/XyJTfwyl6um992g1y+57x+vvz+eT2v/P/y
- uvldN8hXyfz/AQXRxFEKZW5kc3RyZWFtCmVuZG9iagoyMCAwIG9iago0NjcyCmVuZG9i
- agoyMSAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0FzY2VudCA3NzAgL0Nh
- cEhlaWdodCA2ODQgL0Rlc2NlbnQgLTIzMCAvRmxhZ3MgMzIKL0ZvbnRCQm94IFstOTUx
- IC00ODEgMTQ0NSAxMTIyXSAvRm9udE5hbWUgL0lYWlVFRytIZWx2ZXRpY2EgL0l0YWxp
- Y0FuZ2xlIDAKL1N0ZW1WIDAgL01heFdpZHRoIDE1MDAgL1hIZWlnaHQgNTEzIC9Gb250
- RmlsZTIgMTkgMCBSID4+CmVuZG9iagoyMiAwIG9iagpbIDYxMSAwIDAgMCAwIDAgMCAw
- IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNTU2IDAgMCA1NTYg
- NTU2CjAgMCAwIDIyMiAwIDAgMjIyIDAgMCAwIDAgMCAzMzMgMCAyNzggMCA1MDAgMCAw
- IDUwMCBdCmVuZG9iagoxMCAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1
- ZVR5cGUgL0Jhc2VGb250IC9JWFpVRUcrSGVsdmV0aWNhIC9Gb250RGVzY3JpcHRvcgoy
- MSAwIFIgL1dpZHRocyAyMiAwIFIgL0ZpcnN0Q2hhciA3MCAvTGFzdENoYXIgMTIxIC9F
- bmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZwo+PgplbmRvYmoKMjMgMCBvYmoKKE1hYyBP
- UyBYIDEwLjYuOCBRdWFydHogUERGQ29udGV4dCkKZW5kb2JqCjI0IDAgb2JqCihEOjIw
- MTIwNTMwMTcwODEzWjAwJzAwJykKZW5kb2JqCjEgMCBvYmoKPDwgL1Byb2R1Y2VyIDIz
- IDAgUiAvQ3JlYXRpb25EYXRlIDI0IDAgUiAvTW9kRGF0ZSAyNCAwIFIgPj4KZW5kb2Jq
- CnhyZWYKMCAyNQowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDg2NDcgMDAwMDAgbiAK
- MDAwMDAwMjk3MCAwMDAwMCBuIAowMDAwMDAwODQ3IDAwMDAwIG4gCjAwMDAwMDI4MjEg
- MDAwMDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBuIAowMDAwMDAwODI4IDAwMDAwIG4gCjAw
- MDAwMDA5NTEgMDAwMDAgbiAKMDAwMDAwMTkyMSAwMDAwMCBuIAowMDAwMDAyNzg1IDAw
- MDAwIG4gCjAwMDAwMDgzNzggMDAwMDAgbiAKMDAwMDAwMTA2MSAwMDAwMCBuIAowMDAw
- MDAxOTAxIDAwMDAwIG4gCjAwMDAwMDE5NTcgMDAwMDAgbiAKMDAwMDAwMjc2NSAwMDAw
- MCBuIAowMDAwMDAyOTA0IDAwMDAwIG4gCjAwMDAwMDMxMzMgMDAwMDAgbiAKMDAwMDAw
- MzAxOCAwMDAwMCBuIAowMDAwMDAzMTExIDAwMDAwIG4gCjAwMDAwMDMyMjYgMDAwMDAg
- biAKMDAwMDAwNzk4OCAwMDAwMCBuIAowMDAwMDA4MDA5IDAwMDAwIG4gCjAwMDAwMDgy
- MzQgMDAwMDAgbiAKMDAwMDAwODU1MyAwMDAwMCBuIAowMDAwMDA4NjA1IDAwMDAwIG4g
- CnRyYWlsZXIKPDwgL1NpemUgMjUgL1Jvb3QgMTUgMCBSIC9JbmZvIDEgMCBSIC9JRCBb
- IDxhMWZhNmQ4NWVmYmIxZmRhNzA4YzNjYjIyZGE5MWZlYj4KPGExZmE2ZDg1ZWZiYjFm
- ZGE3MDhjM2NiMjJkYTkxZmViPiBdID4+CnN0YXJ0eHJlZgo4NzIyCiUlRU9GCjEgMCBv
- YmoKPDwvQXV0aG9yIChKb25hdGhhbiBCYWNocmFjaCkvQ3JlYXRpb25EYXRlIChEOjIw
- MTIwNTI5MjMyNTAwWikvQ3JlYXRvciAoT21uaUdyYWZmbGUgUHJvZmVzc2lvbmFsIDUu
- My42KS9Nb2REYXRlIChEOjIwMTIwNTMwMTcwODAwWikvUHJvZHVjZXIgMjMgMCBSIC9U
- aXRsZSAoZmlsdGVyKT4+CmVuZG9iagp4cmVmCjEgMQowMDAwMDA5Mzc5IDAwMDAwIG4g
- CnRyYWlsZXIKPDwvSUQgWzxhMWZhNmQ4NWVmYmIxZmRhNzA4YzNjYjIyZGE5MWZlYj4g
- PGExZmE2ZDg1ZWZiYjFmZGE3MDhjM2NiMjJkYTkxZmViPl0gL0luZm8gMSAwIFIgL1By
- ZXYgODcyMiAvUm9vdCAxNSAwIFIgL1NpemUgMjU+PgpzdGFydHhyZWYKOTU2MAolJUVP
- Rgo=
-
- QuickLookThumbnail
-
- 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
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{512, 4}, {710, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{0, 0}, {561, 705}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 1
- 1
-
-
-
- saveQuickLookFiles
- YES
-
-
diff --git a/doc/cs250/figs/filter.pdf b/doc/cs250/figs/filter.pdf
deleted file mode 100644
index 2f7a5433..00000000
Binary files a/doc/cs250/figs/filter.pdf and /dev/null differ
diff --git a/doc/cs250/figs/filtering.graffle b/doc/cs250/figs/filtering.graffle
deleted file mode 100644
index b19cf31e..00000000
Binary files a/doc/cs250/figs/filtering.graffle and /dev/null differ
diff --git a/doc/cs250/figs/filtering.pdf b/doc/cs250/figs/filtering.pdf
deleted file mode 100644
index 8a444715..00000000
Binary files a/doc/cs250/figs/filtering.pdf and /dev/null differ
diff --git a/doc/cs250/figs/forward.graffle b/doc/cs250/figs/forward.graffle
deleted file mode 100644
index 0aef9ed6..00000000
Binary files a/doc/cs250/figs/forward.graffle and /dev/null differ
diff --git a/doc/cs250/figs/forward.pdf b/doc/cs250/figs/forward.pdf
deleted file mode 100644
index 7df01517..00000000
Binary files a/doc/cs250/figs/forward.pdf and /dev/null differ
diff --git a/doc/cs250/figs/lines-pie.py b/doc/cs250/figs/lines-pie.py
deleted file mode 100755
index ef45290c..00000000
--- a/doc/cs250/figs/lines-pie.py
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/env python
-
-from pylab import *
-
-# create figure
-figwidth = 10 # inches
-figheight = 10 # inches
-figure(1, figsize=(figwidth, figheight))
-rcParams['font.size'] = 40.0
-rcParams['axes.titlesize'] = 24.0
-rcParams['xtick.labelsize'] = 24.0
-rcParams['legend.fontsize'] = 28.0
-# 568 aggregates
-# 464 state
-explode=(0.03, 0.06, 0.04, 0.05, 0.0)
-colors=('r','b','y','m','g')
-Ncols = 1
-plotheight = figwidth/Ncols
-H = plotheight/figheight
-W = 1.0 / Ncols
-margin = 0.05
-left = [W*margin, W*(1+margin), W*(2+margin)]
-bottom = H*2*margin
-width = W*(1-2*margin)
-height = H*(1-2*margin)
-
-tot = 5200.0
-ops = (1329.0 / tot)*100.0
-state = (464.0 / tot)*100.0
-aggregates = (568.0 / tot)*100.0
-backends = (1442.0 / tot)*100.0
-core = 100.0 - (backends + ops + aggregates + state)
-fracs = [ops, state, aggregates, backends, core]
-axes([left[0], bottom, width, height])
-patches = pie(fracs, colors=colors, explode=explode, autopct='%1.f%%', shadow=True)
-# title('')
-legend((patches[0], patches[0], patches[0], patches[0], patches[0], patches[0]),
- ('ops', 'state', 'aggregates', 'backends', 'etc'), loc=(0,-.05))
-
-savefig('linecount')
-show()
diff --git a/doc/cs250/figs/link-io.graffle b/doc/cs250/figs/link-io.graffle
deleted file mode 100644
index 9824abba..00000000
Binary files a/doc/cs250/figs/link-io.graffle and /dev/null differ
diff --git a/doc/cs250/figs/link-io.pdf b/doc/cs250/figs/link-io.pdf
deleted file mode 100644
index 7e413c41..00000000
Binary files a/doc/cs250/figs/link-io.pdf and /dev/null differ
diff --git a/doc/cs250/figs/max.png b/doc/cs250/figs/max.png
deleted file mode 100644
index 377232bc..00000000
Binary files a/doc/cs250/figs/max.png and /dev/null differ
diff --git a/doc/cs250/figs/mem-seq-read.graffle b/doc/cs250/figs/mem-seq-read.graffle
deleted file mode 100644
index 393f889a..00000000
Binary files a/doc/cs250/figs/mem-seq-read.graffle and /dev/null differ
diff --git a/doc/cs250/figs/mem-seq-read.pdf b/doc/cs250/figs/mem-seq-read.pdf
deleted file mode 100644
index a5f7beb3..00000000
Binary files a/doc/cs250/figs/mem-seq-read.pdf and /dev/null differ
diff --git a/doc/cs250/figs/mem-single-ported.graffle b/doc/cs250/figs/mem-single-ported.graffle
deleted file mode 100644
index a00d180a..00000000
Binary files a/doc/cs250/figs/mem-single-ported.graffle and /dev/null differ
diff --git a/doc/cs250/figs/mem-single-ported.pdf b/doc/cs250/figs/mem-single-ported.pdf
deleted file mode 100644
index 31b70972..00000000
Binary files a/doc/cs250/figs/mem-single-ported.pdf and /dev/null differ
diff --git a/doc/cs250/figs/mem.graffle b/doc/cs250/figs/mem.graffle
deleted file mode 100644
index 9a85e811..00000000
Binary files a/doc/cs250/figs/mem.graffle and /dev/null differ
diff --git a/doc/cs250/figs/mem.pdf b/doc/cs250/figs/mem.pdf
deleted file mode 100644
index 931b55a4..00000000
Binary files a/doc/cs250/figs/mem.pdf and /dev/null differ
diff --git a/doc/cs250/figs/milky-mist.jpg b/doc/cs250/figs/milky-mist.jpg
deleted file mode 100644
index 9c13c0da..00000000
Binary files a/doc/cs250/figs/milky-mist.jpg and /dev/null differ
diff --git a/doc/cs250/figs/modelsim.png b/doc/cs250/figs/modelsim.png
deleted file mode 100644
index b9f72793..00000000
Binary files a/doc/cs250/figs/modelsim.png and /dev/null differ
diff --git a/doc/cs250/figs/muls.graffle b/doc/cs250/figs/muls.graffle
deleted file mode 100644
index ead37682..00000000
Binary files a/doc/cs250/figs/muls.graffle and /dev/null differ
diff --git a/doc/cs250/figs/muls.pdf b/doc/cs250/figs/muls.pdf
deleted file mode 100644
index 8498a587..00000000
Binary files a/doc/cs250/figs/muls.pdf and /dev/null differ
diff --git a/doc/cs250/figs/mux2-circuit.graffle b/doc/cs250/figs/mux2-circuit.graffle
deleted file mode 100644
index d5563315..00000000
Binary files a/doc/cs250/figs/mux2-circuit.graffle and /dev/null differ
diff --git a/doc/cs250/figs/mux2-circuit.pdf b/doc/cs250/figs/mux2-circuit.pdf
deleted file mode 100644
index 4cd85529..00000000
Binary files a/doc/cs250/figs/mux2-circuit.pdf and /dev/null differ
diff --git a/doc/cs250/figs/mux2-component.graffle b/doc/cs250/figs/mux2-component.graffle
deleted file mode 100644
index d0c9d87c..00000000
Binary files a/doc/cs250/figs/mux2-component.graffle and /dev/null differ
diff --git a/doc/cs250/figs/mux2-component.pdf b/doc/cs250/figs/mux2-component.pdf
deleted file mode 100644
index 3c88fba7..00000000
Binary files a/doc/cs250/figs/mux2-component.pdf and /dev/null differ
diff --git a/doc/cs250/figs/mux2-forward-sel.graffle b/doc/cs250/figs/mux2-forward-sel.graffle
deleted file mode 100644
index 30c482df..00000000
Binary files a/doc/cs250/figs/mux2-forward-sel.graffle and /dev/null differ
diff --git a/doc/cs250/figs/mux2-forward-sel.pdf b/doc/cs250/figs/mux2-forward-sel.pdf
deleted file mode 100644
index 41f83166..00000000
Binary files a/doc/cs250/figs/mux2-forward-sel.pdf and /dev/null differ
diff --git a/doc/cs250/figs/mux2-function.graffle b/doc/cs250/figs/mux2-function.graffle
deleted file mode 100644
index a11b1789..00000000
Binary files a/doc/cs250/figs/mux2-function.graffle and /dev/null differ
diff --git a/doc/cs250/figs/mux2-function.pdf b/doc/cs250/figs/mux2-function.pdf
deleted file mode 100644
index fe8c253f..00000000
Binary files a/doc/cs250/figs/mux2-function.pdf and /dev/null differ
diff --git a/doc/cs250/figs/mux2-named-sel.graffle b/doc/cs250/figs/mux2-named-sel.graffle
deleted file mode 100644
index 36bd3959..00000000
Binary files a/doc/cs250/figs/mux2-named-sel.graffle and /dev/null differ
diff --git a/doc/cs250/figs/mux2-named-sel.pdf b/doc/cs250/figs/mux2-named-sel.pdf
deleted file mode 100644
index 57c8b506..00000000
Binary files a/doc/cs250/figs/mux2-named-sel.pdf and /dev/null differ
diff --git a/doc/cs250/figs/mux2.graffle b/doc/cs250/figs/mux2.graffle
deleted file mode 100644
index 97a40326..00000000
--- a/doc/cs250/figs/mux2.graffle
+++ /dev/null
@@ -1,835 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 138.33.0.157554
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {576, 733}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-29 13:39:35 -0700
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1 0/72 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{151.75, 230.5}, {43, 39}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 14
- Line
-
- ID
- 13
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs48 \cf0 in1}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 23
-
- ID
- 13
- Points
-
- {135, 250}
- {216, 250}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{376.25, 196.5}, {44, 39}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 10
- Line
-
- ID
- 9
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs48 \cf0 out}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 23
-
- ID
- 9
- Points
-
- {360, 216}
- {441, 216}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{151.75, 196.5}, {43, 39}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 8
- Line
-
- ID
- 7
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs48 \cf0 in0}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 23
-
- ID
- 7
- Points
-
- {135, 216}
- {216, 216}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{152.75, 160.5}, {41, 39}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 24
-
- ID
- 6
- Line
-
- ID
- 5
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs48 \cf0 sel}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 23
-
- ID
- 5
- Points
-
- {135, 180}
- {216, 180}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{216, 144}, {144, 144}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 23
-
- ID
- 3
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs48 \cf0 Mux2}
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2012-05-29 22:35:58 -0700
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAx7X05TU2l6ZT1mZn2WgWQCgRgDhg==
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- QuickLookPreview
-
- JVBERi0xLjMKJcTl8uXrp/Og0MTGCjUgMCBvYmoKPDwgL0xlbmd0aCA2IDAgUiAvRmls
- dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGNlE1v2zAMhu/6Fe8xOUQV9WHL1wXr
- ocAOQQzsMOwUNMAKt0OWFe3PLyn5Q6njbDAMKwlJiY8f5oQdTjB8hbpC7Rz+POI7XnC3
- PRMOZ1C6zgdsjA6Quwg8wlIF7wPIe7kVZ/OXeOOsB76fcp3tPm1hsN/ybpQ+bOQhGx6e
- U5W+QqrEVfZqJ7lWzmDA+xd5NkYEqiXzSwvrcz1+bmyjnXd1QOSDts+4uydtFKE94gdW
- 317X0obF6t2u8RPtA762CcD8SOS4qWjAhzNOMwVed2rP0YY7M9xZcaCiEavred5Qo660
- l4rEUSpVHH6JTlfoIPVn5ClYbZm78/AE18grOl7AUcVZqHYpOiSyn/hQ0M410V/w4ReS
- +Zwf1yrz6Uo8w6ssNhkbFkziwIBJ1rkNo/6FaZ6XUQueEZNUV12PyVJzCxNJ476J8O4q
- JpxYBXGd3RswjRoZbYyxaA8XQlGlDbmqngNTq18vZo32KTt0C5KrTA/J28guFZDEJXXd
- JfaYXcqQyrxhnSFNUR3SL+omJJ4NzeORIPkFSNOAsirJJapVnrVFSFWk6ppVq9+vfz9B
- Wmg3mRSmgbO87k1aHjhuVgZOYkcDU15vki8GLkWNJoXZwLEbcvFfDYVsEne0aNIEqTfJ
- x2HgMiT13yaBTaIJ0u4D9tkpvwplbmRzdHJlYW0KZW5kb2JqCjYgMCBvYmoKNTAyCmVu
- ZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlIC9QYXJlbnQgNCAwIFIgL1Jlc291cmNl
- cyA3IDAgUiAvQ29udGVudHMgNSAwIFIgL01lZGlhQm94IFswIDAgNTc2IDczM10KPj4K
- ZW5kb2JqCjcgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERGIC9UZXh0IF0gL0NvbG9yU3Bh
- Y2UgPDwgL0NzMiA5IDAgUiAvQ3MxIDggMCBSID4+IC9Gb250IDw8Ci9GMS4wIDEwIDAg
- UiA+PiA+PgplbmRvYmoKMTEgMCBvYmoKPDwgL0xlbmd0aCAxMiAwIFIgL04gMSAvQWx0
- ZXJuYXRlIC9EZXZpY2VHcmF5IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4
- AYVST0gUURz+zTYShIhBhXiIdwoJlSmsrKDadnVZlW1bldKiGGffuqOzM9Ob2TXFkwRd
- ojx1D6JjdOzQoZuXosCsS9cgqSAIPHXo+83s6iiEb3k73/v9/X7fe0RtnabvOylBVHND
- lSulp25OTYuDHylFHdROWKYV+OlicYyx67mSv7vX1mfS2LLex7V2+/Y9tZVlYCHqLba3
- EPohkWYAH5mfKGWAs8Adlq/YPgE8WA6sGvAjogMPmrkw09GcdKWyLZFT5qIoKq9iO0mu
- +/m5xr6LtYmD/lyPZtaOvbPqqtFM1LT3RKG8D65EGc9fVPZsNRSnDeOcSEMaKfKu1d8r
- TMcRkSsQSgZSNWS5n2pOnXXgdRi7XbqT4/j2EKU+yWCoibXpspkdhX0AdirL7BDwBejx
- smIP54F7Yf9bUcOTwCdhP2SHedatH/YXrlPge4Q9NeDOFK7F8dqKH14tAUP3VCNojHNN
- xNPXOXOkiO8x1BmY90Y5pgsxd5aqEzeAO2EfWapmCrFd+67qJe57AnfT4zvRmzkLXKAc
- SXKxFdkU0DwJWBR9i7BJDjw+zh5V4HeomMAcuYnczSj3HtURG2ejUoFWeo1Xxk/jufHF
- +GVsGM+Afqx213t8/+njFXXXtj48+Y163DmuvZ0bVWFWcWUL3f/HMoSP2Sc5psHToVlY
- a9h25A+azEywDCjEfwU+l/qSE1Xc1e7tuEUSzFA+LGwluktUbinU6j2DSqwcK9gAdnCS
- xCxaHLhTa7o5eHfYInpt+U1XsuuG/vr2evva8h5tyqgpKBPNs0RmlLFbo+TdeNv9ZpER
- nzg6vue9ilrJ/klFED+FOVoq8hRV9FZQ1sRvZw5+G7Z+XD+l5/VB/TwJPa2f0a/ooxG+
- DHRJz8JzUR+jSfCwaSHiEqCKgzPUTlRjjQPiKfHytFtkkf0PQBn9ZgplbmRzdHJlYW0K
- ZW5kb2JqCjEyIDAgb2JqCjcwNAplbmRvYmoKOSAwIG9iagpbIC9JQ0NCYXNlZCAxMSAw
- IFIgXQplbmRvYmoKMTMgMCBvYmoKPDwgL0xlbmd0aCAxNCAwIFIgL04gMyAvQWx0ZXJu
- YXRlIC9EZXZpY2VSR0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBhVTP
- axNBFP42bqnQIghaaw6yeJAiSVmraEXUNv0RYmsM2x+2RZBkM0nWbjbr7ia1pYjk4tEq
- 3kXtoQf/gB568GQvSoVaRSjeqyhioRct8c1uTLal6sDOfvPeN+99b3bfAA1y0jT1gATk
- DcdSohFpbHxCavyIAI6iCUE0JVXb7E4kBkGDc/l759h6D4FbVsN7+3eyd62a0raaB4T9
- QOBHmtkqsO8XcQpZEgKIPN+hKcd0CN/j2PLsjzlOeXjBtQ8rPcRZInxANS3Of024U80l
- 00CDSDiU9XFSPpzXi5TXHQdpbmbGyBC9T5Cmu8zuq2KhnE72DpC9nfR+TrPePsIhwgsZ
- rT9GuI2e9YzVP+Jh4aTmxIY9HBg19PhgFbcaqfg1whRfEE0nolRx2S4N8Ziu/VbySoJw
- kDjKZGGAc1pIT9dMbvi6hwV9JtcTr+J3VlHheY8TZ97U3e9F2gKvMA4dDBoMmg1IUBBF
- BGGYsFBAhjwaMTSycj8jqwYbk3sydSRqu3RiRLFBezbcPbdRpN08/igicZRDtQiS/EH+
- Kq/JT+V5+ctcsNhW95Stm5q68uA7xeWZuRoe19PI43NNXnyV1HaTV0eWrHl6vJrsGj/s
- V5cx5oI1j8RzsPvxLV+VzJcpjBTF41Xz6kuEdVoxN9+fbH87PeIuzy611nOtiYs3VpuX
- Z/1qSPvuqryT5lX5T1718fxnzcRj4ikxJnaK5yGJl8Uu8ZLYS6sL4mBtxwidlYYp0m2R
- +iTVYGCavPUvXT9beL1Gfwz1UZQZzNJUifd/wipkNJ25Dm/6j9vH/Bfk94rnnygCL2zg
- yJm6bVNx7xChZaVuc64CF7/RffC2bmujfjj8BFg8qxatUjWfILwBHHaHeh7oKZjTlpbN
- OVKHLJ+TuunKYlLMUNtDUlLXJddlSxazmVVi6XbYmdMdbhyhOUL3xKdKZZP6r/ERsP2w
- Uvn5rFLZfk4a1oGX+m/AvP1FCmVuZHN0cmVhbQplbmRvYmoKMTQgMCBvYmoKNzM3CmVu
- ZG9iago4IDAgb2JqClsgL0lDQ0Jhc2VkIDEzIDAgUiBdCmVuZG9iago0IDAgb2JqCjw8
- IC9UeXBlIC9QYWdlcyAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXSAvQ291bnQgMSAvS2lk
- cyBbIDMgMCBSIF0gPj4KZW5kb2JqCjE1IDAgb2JqCjw8IC9UeXBlIC9DYXRhbG9nIC9P
- dXRsaW5lcyAyIDAgUiAvUGFnZXMgNCAwIFIgPj4KZW5kb2JqCjIgMCBvYmoKPDwgL0xh
- c3QgMTYgMCBSIC9GaXJzdCAxNyAwIFIgPj4KZW5kb2JqCjE3IDAgb2JqCjw8IC9QYXJl
- bnQgMTggMCBSIC9Db3VudCAwIC9EZXN0IFsgMyAwIFIgL1hZWiAwIDczMyAwIF0gL1Rp
- dGxlIChDYW52YXMgMSkKPj4KZW5kb2JqCjE4IDAgb2JqCjw8ID4+CmVuZG9iagoxNiAw
- IG9iago8PCAvUGFyZW50IDE4IDAgUiAvQ291bnQgMCAvRGVzdCBbIDMgMCBSIC9YWVog
- MCA3MzMgMCBdIC9UaXRsZSAoQ2FudmFzIDEpCj4+CmVuZG9iagoxOSAwIG9iago8PCAv
- TGVuZ3RoIDIwIDAgUiAvTGVuZ3RoMSA4Mjg0IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+
- CnN0cmVhbQp4Ab1ZC3hU1bVe6zzmzCuTeSYzk5nMTCYzkydJyIOERHIIMwnPGBKEBAkm
- gUDCQx6GaKjQaKGWiKhFefmqeosYigyBwgBq0YvFfrUttgoqttUK9vGZy729yFUhM3ed
- MyFCvtaPfp9fz5m191r7ufa/1157zz5dq9e0QwL0Agt1c1tXLgL5cYkA6FiwvHVlXDZ+
- RnH/gu4ud1zmMwDYZYtWLl4el5WPAaidi5f1DNc3RQA06R3trQvj+XCV4pIOSojLWERx
- esfyrnvisvEQxaXLViwYzjftIDl1ees9w/3DhyS772xd3h4v73JQnL5yxV1dcTlVyhdX
- rm4fLo+NpN9vAClVBytABUtBAAb09DYDCH9RO4GjXCmfnoU5mq13JFZ8DgalLN8x42E5
- /rnn5TNftF8NaB5VfkkJqmvlpViRGc0E0CLlD2oeHcmR61Ggi0BDdgSmEFUSFRNlZ0+0
- Qi/uhkeIfkTEQic+CD1Em4h2EnEj3IskHcUHBzileAx7wI5TRQ3nmmW2uaxqjeu3EVQc
- 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
- 3bA3bS47KTvN+FrOo/U1Y6hiUD90Xl7U5B/kA8zYknEWHdI4ig3e4sI9h/fu9VsKElLN
- rkmB9XMffZSfG31361Co1KRBZotKed9i5o2tsh/ojX3C/oGWVjJpOF8cHzG/aWZUJqXZ
- ZrKZMxR3s2cFQQm8Tg2KBDVPa8kqWK2aJBpJplZjt2OmpOxvrzmCGdJikrZHmn7JEwyS
- spJBxP0AxhWlc4KBPNs42Q/TrBh8WGrP/97LQd+hfsZbtHjrhYZc3M/lDZXVF7XsmfsU
- o7vy9tO3ZM3aWb+Jec8unbXo/M1+zOVRXCydVumbh3Q8ZYkU0jE1TzqN0smYOj5GX0Su
- ccphLr/AVJiCySr00g9T/3r5y3PR7djzafRyNHoee7i86APYww9dGTqHP4zeyfgIJmpP
- fmLt9B3hHz06SjTRqdRC/wMm0xeHW+l7SD3MhjnQSN8LpAfpSwnKnIK+HUN1/ezqOQ3Z
- k9uXdbd3dS5olUvI2RSIRNOJ5hFJ99v3Em0mkv5n/IToZaK3iD4k+ozoKjWvjQ0/JMMI
- j6TPjXLBKHnsKHnGKFke73XtdY7KXzZKvnOUvGKUfNcoWf7ufl37a0bl3yPJ/w+Th3v+
- CmVuZHN0cmVhbQplbmRvYmoKMjAgMCBvYmoKNTE5NAplbmRvYmoKMjEgMCBvYmoKPDwg
- L1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9Bc2NlbnQgNzcwIC9DYXBIZWlnaHQgNzE3IC9E
- ZXNjZW50IC0yMzAgL0ZsYWdzIDMyCi9Gb250QkJveCBbLTk1MSAtNDgxIDE0NDUgMTEy
- Ml0gL0ZvbnROYW1lIC9GUlZGV1MrSGVsdmV0aWNhIC9JdGFsaWNBbmdsZSAwCi9TdGVt
- ViAwIC9NYXhXaWR0aCAxNTAwIC9YSGVpZ2h0IDU0MCAvRm9udEZpbGUyIDE5IDAgUiA+
- PgplbmRvYmoKMjIgMCBvYmoKWyA1NTYgNTU2IDU1NiAwIDAgMCAwIDAgMCAwIDAgMCAw
- IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgODMzIDAgMAowIDAgMCAwIDAg
- MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1NTYgMCAwIDAgMjIyIDAgMCAy
- MjIgMCA1NTYgNTU2CjAgMCAwIDUwMCAyNzggNTU2IDAgMCA1MDAgXQplbmRvYmoKMTAg
- MCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNlRm9udCAv
- RlJWRldTK0hlbHZldGljYSAvRm9udERlc2NyaXB0b3IKMjEgMCBSIC9XaWR0aHMgMjIg
- MCBSIC9GaXJzdENoYXIgNDggL0xhc3RDaGFyIDEyMCAvRW5jb2RpbmcgL01hY1JvbWFu
- RW5jb2RpbmcKPj4KZW5kb2JqCjIzIDAgb2JqCihNYWMgT1MgWCAxMC42LjggUXVhcnR6
- IFBERkNvbnRleHQpCmVuZG9iagoyNCAwIG9iagooRDoyMDEyMDUzMDA1MzYwMVowMCcw
- MCcpCmVuZG9iagoxIDAgb2JqCjw8IC9Qcm9kdWNlciAyMyAwIFIgL0NyZWF0aW9uRGF0
- ZSAyNCAwIFIgL01vZERhdGUgMjQgMCBSID4+CmVuZG9iagp4cmVmCjAgMjUKMDAwMDAw
- MDAwMCA2NTUzNSBmIAowMDAwMDA4OTg3IDAwMDAwIG4gCjAwMDAwMDI3NDAgMDAwMDAg
- biAKMDAwMDAwMDYxNyAwMDAwMCBuIAowMDAwMDAyNTkxIDAwMDAwIG4gCjAwMDAwMDAw
- MjIgMDAwMDAgbiAKMDAwMDAwMDU5OCAwMDAwMCBuIAowMDAwMDAwNzIxIDAwMDAwIG4g
- CjAwMDAwMDI1NTUgMDAwMDAgbiAKMDAwMDAwMTY1OSAwMDAwMCBuIAowMDAwMDA4NzE4
- IDAwMDAwIG4gCjAwMDAwMDA4MzEgMDAwMDAgbiAKMDAwMDAwMTYzOSAwMDAwMCBuIAow
- MDAwMDAxNjk1IDAwMDAwIG4gCjAwMDAwMDI1MzUgMDAwMDAgbiAKMDAwMDAwMjY3NCAw
- MDAwMCBuIAowMDAwMDAyOTAzIDAwMDAwIG4gCjAwMDAwMDI3ODggMDAwMDAgbiAKMDAw
- MDAwMjg4MSAwMDAwMCBuIAowMDAwMDAyOTk2IDAwMDAwIG4gCjAwMDAwMDgyODAgMDAw
- MDAgbiAKMDAwMDAwODMwMSAwMDAwMCBuIAowMDAwMDA4NTI2IDAwMDAwIG4gCjAwMDAw
- MDg4OTMgMDAwMDAgbiAKMDAwMDAwODk0NSAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXpl
- IDI1IC9Sb290IDE1IDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8NDUzMjA5MGYxZWY3MWJm
- YjYyZTBlZDY0M2M0ZTgwZmM+Cjw0NTMyMDkwZjFlZjcxYmZiNjJlMGVkNjQzYzRlODBm
- Yz4gXSA+PgpzdGFydHhyZWYKOTA2MgolJUVPRgoxIDAgb2JqCjw8L0F1dGhvciAoSm9u
- YXRoYW4gQmFjaHJhY2gpL0NyZWF0aW9uRGF0ZSAoRDoyMDEyMDUyOTIwMzkwMFopL0Ny
- ZWF0b3IgKE9tbmlHcmFmZmxlIFByb2Zlc3Npb25hbCA1LjMuNikvTW9kRGF0ZSAoRDoy
- MDEyMDUzMDA1MzUwMFopL1Byb2R1Y2VyIDIzIDAgUiAvVGl0bGUgKG11eDIpPj4KZW5k
- b2JqCnhyZWYKMSAxCjAwMDAwMDk3MTkgMDAwMDAgbiAKdHJhaWxlcgo8PC9JRCBbPDQ1
- MzIwOTBmMWVmNzFiZmI2MmUwZWQ2NDNjNGU4MGZjPiA8NDUzMjA5MGYxZWY3MWJmYjYy
- ZTBlZDY0M2M0ZTgwZmM+XSAvSW5mbyAxIDAgUiAvUHJldiA5MDYyIC9Sb290IDE1IDAg
- UiAvU2l6ZSAyNT4+CnN0YXJ0eHJlZgo5ODk4CiUlRU9GCg==
-
- QuickLookThumbnail
-
- TU0AKgAAA6qAP+BP8AQWDQeEQmFQuGQpvw8AMGJAASRWGxeMRmNRuNQ9vgAaSEACmSRy
- TRyBwSTyuNNeXAB8zEADCaSybTecQaXNeYTKaDCc0GU0GiACdz18zOa0WmU2D0eY0mf0
- 6V0OqSyoT6l1euTes1Kt12MVaxRuv0qgWW1WaX1G0WuL2SmtG6AAX3eEOi9AAEX0AObA
- AB9YO33DDQyz1PDwpnY1/tjIQgQ5MAA3LUaXjvNABe50ABXQAB06MAErTABd6kAOXWAA
- Ba8ACjZAANbXC4vcQXE2HcgC5QtrcEAMbibTbNrkAAI8sAAHnAAvdGENvqQh8dcAP3tb
- fe4fd2nu76Bxhw+UAMz0AAf+sAL73AARfEAAX6Xa8Rjv+HF/n9b/wv4/S4QA7r/O7AcA
- rLA7cwKhBuwcAAPwiAACQohBmwu+D5OWCKMwUjZVxAAAqRGABiRMAASxSAAMRYjJxRez
- CeCPGagw8k5yRwAAOR2k0GIOY8gNW1p6yIAARyOAB+SUADkG0AAzSghCJGCABsytFEVQ
- 27iTD5LoACTMAAFfMYACRMzjA0v7AnpNj5vqBc4ABHByAAJs7AAB88ptA7ynDEsThjQI
- AL0dDmueYtEAANFFgAClHAAdVIgAV1KTQADGmcx7IoOqZq08AB3VDMszl1UoAUCGIAGf
- VYADBVwARAVYAHhWkjSQB1cL4vzFJWTtfAAeVgqQAAWWKAFcAdGIAHHZgACNZ9hucAIA
- CJaqgmFbAAUQYoABBbwAA9cIAHBcgAC1c4AFNdQAH3dthr6BAAC/ec/mJZQLXxHUeR8g
- zgmsAB7YDLASgAduDAAuhogAGuGX0DkOrarTwJPVZn1BUUU4I14BABbBhAACeQ5BkS3T
- mAB/ZROs7gZlk94isGJgAdmZva94e5vS7GgBNh6JGkoM6Az7QrG8cEWUt1eaMsUbMPfj
- 95fLelKvpjDacAEHG7CEJQoAiEG9r9LXhiCeaQ3mpKpqi4atIBjyEcoASIetRiQABEbs
- AA9bzoQKoQYG/ABTxqgAE/CUbR+k7PtGocQ3NMU0bCEU7T9QnduerwfYJ5AAHXOOU5lY
- 2BYTZBQAAFdNNwC6jxKmbSterX9gGBYyAB39rYYO9x0vTvxxezdWovWrVqzDeD36V+Ks
- XhwF3uY+MonkK75S1+h5yW+ZAPpLUo/MgADfveqpuZnZyPfMX7KysGfVtUS+nU/AouUH
- 8kCRdMBXsaL9/8/0m3z/3/z+iAgADgEAAAMAAAABADYAAAEBAAMAAAABABwAAAECAAMA
- AAAEAAAEWAEDAAMAAAABAAUAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAESAAMAAAAB
- AAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABwAAAEXAAQAAAABAAADogEcAAMAAAABAAEA
- AAE9AAMAAAABAAIAAAFSAAMAAAABAAEAAAFTAAMAAAAEAAAEYAAAAAAACAAIAAgACAAB
- AAEAAQAB
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{446, 4}, {710, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{0, 0}, {561, 705}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 1
- 1
-
-
-
- saveQuickLookFiles
- YES
-
-
diff --git a/doc/cs250/figs/mux2.pdf b/doc/cs250/figs/mux2.pdf
deleted file mode 100644
index 8db530fc..00000000
Binary files a/doc/cs250/figs/mux2.pdf and /dev/null differ
diff --git a/doc/cs250/figs/myfloat.graffle b/doc/cs250/figs/myfloat.graffle
deleted file mode 100644
index b9ad6373..00000000
Binary files a/doc/cs250/figs/myfloat.graffle and /dev/null differ
diff --git a/doc/cs250/figs/myfloat.pdf b/doc/cs250/figs/myfloat.pdf
deleted file mode 100644
index 314d0cc7..00000000
Binary files a/doc/cs250/figs/myfloat.pdf and /dev/null differ
diff --git a/doc/cs250/figs/odd-filter.graffle b/doc/cs250/figs/odd-filter.graffle
deleted file mode 100644
index 4a8fce22..00000000
Binary files a/doc/cs250/figs/odd-filter.graffle and /dev/null differ
diff --git a/doc/cs250/figs/odd-filter.pdf b/doc/cs250/figs/odd-filter.pdf
deleted file mode 100644
index c4102359..00000000
Binary files a/doc/cs250/figs/odd-filter.pdf and /dev/null differ
diff --git a/doc/cs250/figs/parameterized-filter.graffle b/doc/cs250/figs/parameterized-filter.graffle
deleted file mode 100644
index 4d726c6c..00000000
Binary files a/doc/cs250/figs/parameterized-filter.graffle and /dev/null differ
diff --git a/doc/cs250/figs/parameterized-filter.pdf b/doc/cs250/figs/parameterized-filter.pdf
deleted file mode 100644
index 9d2882ed..00000000
Binary files a/doc/cs250/figs/parameterized-filter.pdf and /dev/null differ
diff --git a/doc/cs250/figs/parity.graffle b/doc/cs250/figs/parity.graffle
deleted file mode 100644
index 84c9d908..00000000
Binary files a/doc/cs250/figs/parity.graffle and /dev/null differ
diff --git a/doc/cs250/figs/parity.pdf b/doc/cs250/figs/parity.pdf
deleted file mode 100644
index 80ef3fb2..00000000
Binary files a/doc/cs250/figs/parity.pdf and /dev/null differ
diff --git a/doc/cs250/figs/pass-through-filter.graffle b/doc/cs250/figs/pass-through-filter.graffle
deleted file mode 100644
index 16a065b1..00000000
Binary files a/doc/cs250/figs/pass-through-filter.graffle and /dev/null differ
diff --git a/doc/cs250/figs/pass-through-filter.pdf b/doc/cs250/figs/pass-through-filter.pdf
deleted file mode 100644
index 8bcc04c7..00000000
Binary files a/doc/cs250/figs/pass-through-filter.pdf and /dev/null differ
diff --git a/doc/cs250/figs/plink-io.graffle b/doc/cs250/figs/plink-io.graffle
deleted file mode 100644
index 3f271bdf..00000000
Binary files a/doc/cs250/figs/plink-io.graffle and /dev/null differ
diff --git a/doc/cs250/figs/plink-io.pdf b/doc/cs250/figs/plink-io.pdf
deleted file mode 100644
index 96610593..00000000
Binary files a/doc/cs250/figs/plink-io.pdf and /dev/null differ
diff --git a/doc/cs250/figs/process.graffle b/doc/cs250/figs/process.graffle
deleted file mode 100644
index 015465da..00000000
--- a/doc/cs250/figs/process.graffle
+++ /dev/null
@@ -1,653 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 138.33.0.157554
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {576, 733}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-28 16:29:50 -0700
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1 0/72 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{299.773, 166.5}, {43, 27}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 14
-
- ID
- 11
- Line
-
- ID
- 9
- Position
- 0.45454546809196472
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs28 \cf0 finish}
-
- Wrap
- NO
-
-
- Bounds
- {{160.748, 166.5}, {38, 27}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 14
-
- ID
- 10
- Line
-
- ID
- 8
- Position
- 0.50349652767181396
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs28 \cf0 start}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 13
-
- ID
- 9
- Points
-
- {289, 180}
- {360, 180}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 7
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 13
-
- Head
-
- ID
- 7
-
- ID
- 8
- Points
-
- {144, 180}
- {215, 180}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{216, 144}, {72, 72}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 13
-
- ID
- 7
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs28 \cf0 Process}
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2012-05-28 16:35:30 -0700
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAx7X05TU2l6ZT1mZn2WgWQCgRgDhg==
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- QuickLookPreview
-
- JVBERi0xLjMKJcTl8uXrp/Og0MTGCjUgMCBvYmoKPDwgL0xlbmd0aCA2IDAgUiAvRmls
- dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGNUstOwzAQvPsr5tgc6nr9TK5UcOiJ
- qpE4IA6oagVVW9QGib/lW1g7ThMpQSDHysbZnZn1zgVrXKB4ueARjMF1hyecsVg2hG0D
- SqvZYq6kQ9yDxD00eTgKCJofwbV8hC+uWfE+tCjLTSJQ2CyZi9LHPL4i3faUMMjaFiPy
- b7AWzK8jvwJzD6q003Au1d3VIJvRLObaSV16MnAssj5h8UBSgUS9xzNmj9ePIvagMdvu
- uqhpCrygXuG+Tvcw1hZ1UanAKpWWJGJ8jAKZd8X7MNQ26IhkGNal+NhigIKXVsS+u6zb
- n9JIn/G7Kxz03uOXVUY3NvxblXH+pirVZVU5zqr6rCO6rF7VyBbk+U5tybduFUwJHeIE
- 93HyWkzMj0IlQ8qfHCIxFZkQpofYfBZsQR7hazfBK5/0Exyp01UldWBNUZ01rK716G/u
- Mppy/rQ6L40lQ1mdyBYDW2z2XaA+jIz0B2CV8FQVAUXv2QjInj13Xb53QfM2bHf9A4Vl
- yK4KZW5kc3RyZWFtCmVuZG9iago2IDAgb2JqCjM4MwplbmRvYmoKMyAwIG9iago8PCAv
- VHlwZSAvUGFnZSAvUGFyZW50IDQgMCBSIC9SZXNvdXJjZXMgNyAwIFIgL0NvbnRlbnRz
- IDUgMCBSIC9NZWRpYUJveCBbMCAwIDU3NiA3MzNdCj4+CmVuZG9iago3IDAgb2JqCjw8
- IC9Qcm9jU2V0IFsgL1BERiAvVGV4dCBdIC9Db2xvclNwYWNlIDw8IC9DczIgOSAwIFIg
- L0NzMSA4IDAgUiA+PiAvRm9udCA8PAovRjEuMCAxMCAwIFIgPj4gPj4KZW5kb2JqCjEx
- IDAgb2JqCjw8IC9MZW5ndGggMTIgMCBSIC9OIDEgL0FsdGVybmF0ZSAvRGV2aWNlR3Jh
- eSAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGFUk9IFFEc/s02EoSIQYV4
- iHcKCZUprKyg2nZ1WZVtW5XSohhn37qjszPTm9k1xZMEXaI8dQ+iY3Ts0KGbl6LArEvX
- IKkgCDx16PvN7OoohG95O9/7/f1+33tEbZ2m7zspQVRzQ5UrpaduTk2Lgx8pRR3UTlim
- FfjpYnGMseu5kr+719Zn0tiy3se1dvv2PbWVZWAh6i22txD6IZFmAB+ZnyhlgLPAHZav
- 2D4BPFgOrBrwI6IDD5q5MNPRnHSlsi2RU+aiKCqvYjtJrvv5uca+i7WJg/5cj2bWjr2z
- 6qrRTNS090ShvA+uRBnPX1T2bDUUpw3jnEhDGinyrtXfK0zHEZErEEoGUjVkuZ9qTp11
- 4HUYu126k+P49hClPslgqIm16bKZHYV9AHYqy+wQ8AXo8bJiD+eBe2H/W1HDk8AnYT9k
- h3nWrR/2F65T4HuEPTXgzhSuxfHaih9eLQFD91QjaIxzTcTT1zlzpIjvMdQZmPdGOaYL
- MXeWqhM3gDthH1mqZgqxXfuu6iXuewJ30+M70Zs5C1ygHElysRXZFNA8CVgUfYuwSQ48
- Ps4eVeB3qJjAHLmJ3M0o9x7VERtno1KBVnqNV8ZP47nxxfhlbBjPgH6sdtd7fP/p4xV1
- 17Y+PPmNetw5rr2dG1VhVnFlC93/xzKEj9knOabB06FZWGvYduQPmsxMsAwoxH8FPpf6
- khNV3NXu7bhFEsxQPixsJbpLVG4p1Oo9g0qsHCvYAHZwksQsWhy4U2u6OXh32CJ6bflN
- V7Lrhv769nr72vIebcqoKSgTzbNEZpSxW6Pk3Xjb/WaREZ84Or7nvYpayf5JRRA/hTla
- KvIUVfRWUNbEb2cOfhu2flw/pef1Qf08CT2tn9Gv6KMRvgx0Sc/Cc1Efo0nwsGkh4hKg
- ioMz1E5UY40D4inx8rRbZJH9D0AZ/WYKZW5kc3RyZWFtCmVuZG9iagoxMiAwIG9iago3
- MDQKZW5kb2JqCjkgMCBvYmoKWyAvSUNDQmFzZWQgMTEgMCBSIF0KZW5kb2JqCjEzIDAg
- b2JqCjw8IC9MZW5ndGggMTQgMCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9G
- aWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AYVUz2sTQRT+Nm6p0CIIWmsOsniQ
- IklZq2hF1Db9EWJrDNsftkWQZDNJ1m426+4mtaWI5OLRKt5F7aEH/4AeevBkL0qFWkUo
- 3qsoYqEXLfHNbky2perAzn7z3jfvfW923wANctI09YAE5A3HUqIRaWx8Qmr8iACOoglB
- NCVV2+xOJAZBg3P5e+fYeg+BW1bDe/t3snetmtK2mgeE/UDgR5rZKrDvF3EKWRICiDzf
- oSnHdAjf49jy7I85Tnl4wbUPKz3EWSJ8QDUtzn9NuFPNJdNAg0g4lPVxUj6c14uU1x0H
- aW5mxsgQvU+QprvM7qtioZxO9g6QvZ30fk6z3j7CIcILGa0/RriNnvWM1T/iYeGk5sSG
- PRwYNfT4YBW3Gqn4NcIUXxBNJ6JUcdkuDfGYrv1W8kqCcJA4ymRhgHNaSE/XTG74uocF
- fSbXE6/id1ZR4XmPE2fe1N3vRdoCrzAOHQwaDJoNSFAQRQRhmLBQQIY8GjE0snI/I6sG
- G5N7MnUkart0YkSxQXs23D23UaTdPP4oInGUQ7UIkvxB/iqvyU/lefnLXLDYVveUrZua
- uvLgO8XlmbkaHtfTyONzTV58ldR2k1dHlqx5erya7Bo/7FeXMeaCNY/Ec7D78S1flcyX
- KYwUxeNV8+pLhHVaMTffn2x/Oz3iLs8utdZzrYmLN1abl2f9akj77qq8k+ZV+U9e9fH8
- Z83EY+IpMSZ2iuchiZfFLvGS2EurC+JgbccInZWGKdJtkfok1WBgmrz1L10/W3i9Rn8M
- 9VGUGczSVIn3f8IqZDSduQ5v+o/bx/wX5PeK558oAi9s4MiZum1Tce8QoWWlbnOuAhe/
- 0X3wtm5ro344/ARYPKsWrVI1nyC8ARx2h3oe6CmY05aWzTlShyyfk7rpymJSzFDbQ1JS
- 1yXXZUsWs5lVYul22JnTHW4coTlC98SnSmWT+q/xEbD9sFL5+axS2X5OGtaBl/pvwLz9
- RQplbmRzdHJlYW0KZW5kb2JqCjE0IDAgb2JqCjczNwplbmRvYmoKOCAwIG9iagpbIC9J
- Q0NCYXNlZCAxMyAwIFIgXQplbmRvYmoKNCAwIG9iago8PCAvVHlwZSAvUGFnZXMgL01l
- ZGlhQm94IFswIDAgNjEyIDc5Ml0gL0NvdW50IDEgL0tpZHMgWyAzIDAgUiBdID4+CmVu
- ZG9iagoxNSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvT3V0bGluZXMgMiAwIFIgL1Bh
- Z2VzIDQgMCBSID4+CmVuZG9iagoyIDAgb2JqCjw8IC9MYXN0IDE2IDAgUiAvRmlyc3Qg
- MTcgMCBSID4+CmVuZG9iagoxNyAwIG9iago8PCAvUGFyZW50IDE4IDAgUiAvQ291bnQg
- MCAvRGVzdCBbIDMgMCBSIC9YWVogMCA3MzMgMCBdIC9UaXRsZSAoQ2FudmFzIDEpCj4+
- CmVuZG9iagoxOCAwIG9iago8PCA+PgplbmRvYmoKMTYgMCBvYmoKPDwgL1BhcmVudCAx
- OCAwIFIgL0NvdW50IDAgL0Rlc3QgWyAzIDAgUiAvWFlaIDAgNzMzIDAgXSAvVGl0bGUg
- KENhbnZhcyAxKQo+PgplbmRvYmoKMTkgMCBvYmoKPDwgL0xlbmd0aCAyMCAwIFIgL0xl
- bmd0aDEgODUwNCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHdWnt4VNW1
- X/s85px5ZDIzmfcjMycnM5PJ+0FChkQyhJkQXjEkCBkkmgQCCUKNEFKhlUaFViKiiASE
- flarBYQqQ0hhAsVL+VDovbZSq/iofVjR2n7Nh7dXW1tI5q5zJomEr/Xyh1//uGd/e++1
- 9tqPtX977bXn7DPda9e3Qwr0Ag31S1q7VoD8eAoBCL9sTWtXkjd8jHzZsp5uT5JnswDo
- 1Su6Vq5J8vwTACrXytUbxtobKwHUT3S0ty5PyuEa5mUdWJDkyRTMMzvWdN+b5A2DmE9Z
- ffeyMbnRg7xzTeu9Y+PDe8h7vta6ph1zidRgktl197pumQX3Rcwru9a2j9UnTajfa0Cw
- NAXuBiXcBRxQoMPQDMB9rHIBg1JJjs/yXPXOO1MrPwM9L/N3zn9Uzl8Rfnzp8/ZrfvUO
- /u9YoByvL+WKwGgAQENQPqzeMSGR22GSEofGnDjMxliFsRRjTs4MK/SS/fAYxqcx0tBJ
- HoYNGLdifBIjM0E9j9wQeXiA4UMnyQawkzkhNeNeaLS5rSq1+/U4UQw+5X7H+sEpYsMZ
- vk9sAymgnKEiT5PvwXJwkx+Al2yEWsgie48FVrtbUPQ8dGHsxUjLKSHPD6QXu18iueBl
- CLbxQTpDjrv/UJTn/rAoTpEB91l/nMHsJ+nIhVLdZ1xPuf/DtdL9EsbDSdGhANY47n7e
- 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
- Tam0m6boa2abzX5NWDl2+o40B8/Jh0PSyRSgl0HvN6wbuSx7GvQzepzIxO8NX6leLC05
- ePzwYZ+pKCXd6J7p37Rkxw52yeibO0ci5WlqQm1X8vevpF7eiT6Jlt4T6HvZ1/GLgQO/
- bLSGyhwf2oBzKVQumqQagy5zisKtVwmopSM9YHVrU/QBi4EzpGrdWkp7zWjzCK8LK5Ne
- ef6EqpfwMBvziZVVlZK+VcNvoCGQokKD5J4n7F/SHkNpSam3tMTEoeP8kVg1qM+0OG3q
- Bs/A4MCuXVTaID5s9ZSlFPUcRW57cfu15fR3tx90v/rq+auXZL+KCX6VasdvJ//sScHC
- EghDDX6Dkb6yLJC/syyCxXjXL51IBozSo8Bv5bAgUt20cEZObfvqnvbuzmWtcg1ZjEkl
- xlqMTRg7MN6L8SGMuFHxaxfgNy2ACxjfxvgxxs8TYw/SMEETfA+bzEujXC9fdgMvz+u6
- 9h03yDtv4L92A3/3DfzaG/h1N/Dyfwy+GO+qjM//AsN/drYKZW5kc3RyZWFtCmVuZG9i
- agoyMCAwIG9iago1MjQ2CmVuZG9iagoyMSAwIG9iago8PCAvVHlwZSAvRm9udERlc2Ny
- aXB0b3IgL0FzY2VudCA3NzAgL0NhcEhlaWdodCA3MTcgL0Rlc2NlbnQgLTIzMCAvRmxh
- Z3MgMzIKL0ZvbnRCQm94IFstOTUxIC00ODEgMTQ0NSAxMTIyXSAvRm9udE5hbWUgL1FF
- QlhUQStIZWx2ZXRpY2EgL0l0YWxpY0FuZ2xlIDAKL1N0ZW1WIDAgL01heFdpZHRoIDE1
- MDAgL1hIZWlnaHQgNjM3IC9Gb250RmlsZTIgMTkgMCBSID4+CmVuZG9iagoyMiAwIG9i
- agpbIDY2NyAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDU1NiAwIDUwMCAw
- IDU1NiAwIDAgNTU2IDIyMiAwIDAgMCAwCjU1NiA1NTYgMCAwIDMzMyA1MDAgMjc4IDAg
- MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAw
- IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
- MCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
- IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAg
- MCAwIDUwMCBdCmVuZG9iagoxMCAwIG9iago8PCAvVHlwZSAvRm9udCAvU3VidHlwZSAv
- VHJ1ZVR5cGUgL0Jhc2VGb250IC9RRUJYVEErSGVsdmV0aWNhIC9Gb250RGVzY3JpcHRv
- cgoyMSAwIFIgL1dpZHRocyAyMiAwIFIgL0ZpcnN0Q2hhciA4MCAvTGFzdENoYXIgMjIy
- IC9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZwo+PgplbmRvYmoKMjMgMCBvYmoKKE1h
- YyBPUyBYIDEwLjYuOCBRdWFydHogUERGQ29udGV4dCkKZW5kb2JqCjI0IDAgb2JqCihE
- OjIwMTIwNTI4MjMzNTUzWjAwJzAwJykKZW5kb2JqCjEgMCBvYmoKPDwgL1Byb2R1Y2Vy
- IDIzIDAgUiAvQ3JlYXRpb25EYXRlIDI0IDAgUiAvTW9kRGF0ZSAyNCAwIFIgPj4KZW5k
- b2JqCnhyZWYKMCAyNQowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDkwNTggMDAwMDAg
- biAKMDAwMDAwMjYyMSAwMDAwMCBuIAowMDAwMDAwNDk4IDAwMDAwIG4gCjAwMDAwMDI0
- NzIgMDAwMDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBuIAowMDAwMDAwNDc5IDAwMDAwIG4g
- CjAwMDAwMDA2MDIgMDAwMDAgbiAKMDAwMDAwMjQzNiAwMDAwMCBuIAowMDAwMDAxNTQw
- IDAwMDAwIG4gCjAwMDAwMDg3ODkgMDAwMDAgbiAKMDAwMDAwMDcxMiAwMDAwMCBuIAow
- MDAwMDAxNTIwIDAwMDAwIG4gCjAwMDAwMDE1NzYgMDAwMDAgbiAKMDAwMDAwMjQxNiAw
- MDAwMCBuIAowMDAwMDAyNTU1IDAwMDAwIG4gCjAwMDAwMDI3ODQgMDAwMDAgbiAKMDAw
- MDAwMjY2OSAwMDAwMCBuIAowMDAwMDAyNzYyIDAwMDAwIG4gCjAwMDAwMDI4NzcgMDAw
- MDAgbiAKMDAwMDAwODIxMyAwMDAwMCBuIAowMDAwMDA4MjM0IDAwMDAwIG4gCjAwMDAw
- MDg0NTkgMDAwMDAgbiAKMDAwMDAwODk2NCAwMDAwMCBuIAowMDAwMDA5MDE2IDAwMDAw
- IG4gCnRyYWlsZXIKPDwgL1NpemUgMjUgL1Jvb3QgMTUgMCBSIC9JbmZvIDEgMCBSIC9J
- RCBbIDw0ZGUwM2RhNTBjOGJiODUxYWYwOTc2NWI2MWY1YTk2Yz4KPDRkZTAzZGE1MGM4
- YmI4NTFhZjA5NzY1YjYxZjVhOTZjPiBdID4+CnN0YXJ0eHJlZgo5MTMzCiUlRU9GCjEg
- MCBvYmoKPDwvQXV0aG9yIChKb25hdGhhbiBCYWNocmFjaCkvQ3JlYXRpb25EYXRlIChE
- OjIwMTIwNTI4MjMyOTAwWikvQ3JlYXRvciAoT21uaUdyYWZmbGUgUHJvZmVzc2lvbmFs
- IDUuMy42KS9Nb2REYXRlIChEOjIwMTIwNTI4MjMzNTAwWikvUHJvZHVjZXIgMjMgMCBS
- ID4+CmVuZG9iagp4cmVmCjEgMQowMDAwMDA5NzkwIDAwMDAwIG4gCnRyYWlsZXIKPDwv
- SUQgWzw0ZGUwM2RhNTBjOGJiODUxYWYwOTc2NWI2MWY1YTk2Yz4gPDRkZTAzZGE1MGM4
- YmI4NTFhZjA5NzY1YjYxZjVhOTZjPl0gL0luZm8gMSAwIFIgL1ByZXYgOTEzMyAvUm9v
- dCAxNSAwIFIgL1NpemUgMjU+PgpzdGFydHhyZWYKOTk1NgolJUVPRgo=
-
- QuickLookThumbnail
-
- TU0AKgAAAfiAP+BP8AQWDQeEQmFQuGQZkQ8APWJQ2KRWFg+MAAaRuLR2PQaBwSPyOOqe
- TAAhymSSuBgBfS8AFmZSuaQmQzWcQhVTsAFafTmOv6hABWUWez+gTSb0mcTtVUcrUyKU
- J/USjT6o1KR0utSSnVCuwuqVZWWCwx2uWeO1+sWqEWOi2W226KM67P9s3mEDC+AATX8A
- O7BAAHYUAAXEAB04sABjHABS5EABXKAAQZcANDNWBdZ0AC7QAAL6MAS2WgHUQjUAGES1
- Pa8AAzZaLSC3bAB7bkABveRGJgfgAB38PG49eccAXlsgAT83Sy2KLbpAB5dUAAnsABxd
- sABrvAAp+EAOfyABa+fJ5V8+uwJz3ACMA/0hUANz7AAU/kALn+AAav+AB7wEAAOQKAAc
- QQsizIMZUGsUxhqQiAASQoADVgAbEMgAPkOIQN0PgAA0ROegSKnHE7ruydkVsOxIIReA
- AJRlCzUoWtifnjHIAAFHgAH5H4AHpIUSSDIYGyOACxgXJcYxmuMFoLIR6AAfcqgA9Z8x
- o1kBHuADgAOAAMzEiy0rohsbqzMy4KupEzIXMs3IVNE4zWuU2zi1roTxGyeLnNShyfP0
- 9pBPVBp1Ps7rdOsoUNOFDAATtIsszFBnJSwAC/TNH0JEtN09T6PUdUFR1IgIAA4BAAAD
- AAAAAQAmAAABAQADAAAAAQAQAAABAgADAAAABAAAAqYBAwADAAAAAQAFAAABBgADAAAA
- AQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAAAQAQ
- AAABFwAEAAAAAQAAAfABHAADAAAAAQABAAABPQADAAAAAQACAAABUgADAAAAAQABAAAB
- UwADAAAABAAAAq4AAAAAAAgACAAIAAgAAQABAAEAAQ==
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{365, 4}, {710, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{0, 0}, {561, 705}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 1
- 1
-
-
-
- saveQuickLookFiles
- YES
-
-
diff --git a/doc/cs250/figs/process.pdf b/doc/cs250/figs/process.pdf
deleted file mode 100644
index 2a1cdbed..00000000
Binary files a/doc/cs250/figs/process.pdf and /dev/null differ
diff --git a/doc/cs250/figs/rd.pdf b/doc/cs250/figs/rd.pdf
deleted file mode 100644
index 70788541..00000000
Binary files a/doc/cs250/figs/rd.pdf and /dev/null differ
diff --git a/doc/cs250/figs/reg-in.graffle b/doc/cs250/figs/reg-in.graffle
deleted file mode 100644
index 6687aac4..00000000
Binary files a/doc/cs250/figs/reg-in.graffle and /dev/null differ
diff --git a/doc/cs250/figs/reg-in.pdf b/doc/cs250/figs/reg-in.pdf
deleted file mode 100644
index 97662909..00000000
Binary files a/doc/cs250/figs/reg-in.pdf and /dev/null differ
diff --git a/doc/cs250/figs/rising-edge.graffle b/doc/cs250/figs/rising-edge.graffle
deleted file mode 100644
index 83fc445e..00000000
Binary files a/doc/cs250/figs/rising-edge.graffle and /dev/null differ
diff --git a/doc/cs250/figs/rising-edge.pdf b/doc/cs250/figs/rising-edge.pdf
deleted file mode 100644
index ba6a64c6..00000000
Binary files a/doc/cs250/figs/rising-edge.pdf and /dev/null differ
diff --git a/doc/cs250/figs/rocket-coprocessor.graffle b/doc/cs250/figs/rocket-coprocessor.graffle
deleted file mode 100644
index 69a1c046..00000000
Binary files a/doc/cs250/figs/rocket-coprocessor.graffle and /dev/null differ
diff --git a/doc/cs250/figs/rocket-coprocessor.pdf b/doc/cs250/figs/rocket-coprocessor.pdf
deleted file mode 100644
index ecd330b8..00000000
Binary files a/doc/cs250/figs/rocket-coprocessor.pdf and /dev/null differ
diff --git a/doc/cs250/figs/rom.graffle b/doc/cs250/figs/rom.graffle
deleted file mode 100644
index 90d45dff..00000000
Binary files a/doc/cs250/figs/rom.graffle and /dev/null differ
diff --git a/doc/cs250/figs/rom.pdf b/doc/cs250/figs/rom.pdf
deleted file mode 100644
index 0a7acbfb..00000000
Binary files a/doc/cs250/figs/rom.pdf and /dev/null differ
diff --git a/doc/cs250/figs/router.graffle b/doc/cs250/figs/router.graffle
deleted file mode 100644
index 4734cc7c..00000000
--- a/doc/cs250/figs/router.graffle
+++ /dev/null
@@ -1,1888 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 138.33.0.157554
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {576, 733}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-29 16:31:24 -0700
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 50
- Points
-
- {72, 225}
- {108, 225}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 51
- Points
-
- {72, 207}
- {108, 207}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 52
- Points
-
- {99, 207}
- {99, 225}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 53
- Points
-
- {90, 207}
- {90, 225}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 54
- Points
-
- {81, 207}
- {81, 225}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 49
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 44
- Points
-
- {486, 281}
- {522, 281}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 45
- Points
-
- {486, 263}
- {522, 263}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 46
- Points
-
- {513, 263}
- {513, 281}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 47
- Points
-
- {504, 263}
- {504, 281}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 48
- Points
-
- {495, 263}
- {495, 281}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 43
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 38
- Points
-
- {486, 244}
- {522, 244}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 39
- Points
-
- {486, 226}
- {522, 226}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 40
- Points
-
- {513, 226}
- {513, 244}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 41
- Points
-
- {504, 226}
- {504, 244}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 42
- Points
-
- {495, 226}
- {495, 244}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 37
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 32
- Points
-
- {486, 207}
- {522, 207}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 33
- Points
-
- {486, 189}
- {522, 189}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 34
- Points
-
- {513, 189}
- {513, 207}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 35
- Points
-
- {504, 189}
- {504, 207}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 36
- Points
-
- {495, 189}
- {495, 207}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 31
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 26
- Points
-
- {486, 170}
- {522, 170}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 27
- Points
-
- {486, 152}
- {522, 152}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 28
- Points
-
- {513, 152}
- {513, 170}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 29
- Points
-
- {504, 152}
- {504, 170}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 27
-
- ID
- 30
- Points
-
- {495, 152}
- {495, 170}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 3
-
-
-
-
- ID
- 25
-
-
- Bounds
- {{395.5, 254}, {67, 32}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 18
-
- ID
- 14
- Line
-
- ID
- 13
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 3
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs36 \cf0 outs(3)}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 17
-
- ID
- 13
- Points
-
- {378, 270}
- {486, 270}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Bounds
- {{395.5, 218}, {67, 32}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 18
-
- ID
- 12
- Line
-
- ID
- 11
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 3
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs36 \cf0 outs(2)}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 17
-
- ID
- 11
- Points
-
- {378, 234}
- {486, 234}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Bounds
- {{395.5, 182}, {67, 32}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 18
-
- ID
- 10
- Line
-
- ID
- 9
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 3
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs36 \cf0 outs(1)}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 17
-
- ID
- 9
- Points
-
- {378, 198}
- {486, 198}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Bounds
- {{395.5, 146}, {67, 32}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 18
-
- ID
- 8
- Line
-
- ID
- 7
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 3
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs36 \cf0 outs(0)}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 17
-
- ID
- 7
- Points
-
- {378, 162}
- {486, 162}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Bounds
- {{146, 199}, {26, 34}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 20
-
- ID
- 6
- Line
-
- ID
- 5
- Position
- 0.47222220897674561
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
- Width
- 3
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs40 \cf0 in}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 19
-
- ID
- 5
- Points
-
- {108, 216}
- {216, 216}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- TailArrow
- 0
- Width
- 3
-
-
-
-
- Bounds
- {{216, 135}, {162, 162}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 19
-
- ID
- 3
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs56 \cf0 Router}
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2012-05-30 10:12:30 -0700
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAx7X05TU2l6ZT1mZn2WgWQCgRgDhg==
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- QuickLookPreview
-
- JVBERi0xLjMKJcTl8uXrp/Og0MTGCjUgMCBvYmoKPDwgL0xlbmd0aCA2IDAgUiAvRmls
- dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGtlsFu2zAMhu96Ch6TQ1yKkizrumI7
- 9JbFwA7rTkELrGhatGmx1x9JybHb2E5TFIFhJv75i/wkS3mCNTwB8ifEGqJz8HwDv+AB
- Li73FrZ7sPrZb2GFVQC5BsJbIFuDdzXYmuQynM0/wj/OuuLrLvtcbnQIhM0lj2b1y0pu
- MuB2py7Whc5FatiYteSS1IDA4w/yKEUINkrmt5ZrQkSCdgvUZGe+rzxVSBi4fGvaHVz8
- sBXyyO0tLH4+vr7cPC+hvYPvLffvuNyB+6Eqi41WxvUhVlZicw8bzkBuDrm5sSyytnLv
- 8+D+4GGrBqRjVhmhd3hCWBF/E/8j+NYHIc9lBKAanBdEtz0g8xaQDWkckEw0wor4ilVs
- HKGDCMqHeSkfs/j70LPppnGsUxcbnbEd+Ch8ZA284WPGsnwjfET7Nq94hKh8etV9dje2
- rqf5uMR0gjCqIzh6R+fd8vHEdKI1efnYsmj4vqKmQovRd0xct2Z+w+JxKa8AweK1C16W
- vPb4h/31ApcmP7xeLuEPtFd5ZZ2kl2QtlM45VnpmbnUVLkd5nYcb0ksNr9f8hJBO0LPp
- DHoufCU9+zl6xK9BR0/ij9I7ziuMKA3osaqn55p5er5xH6fnU/pKevRJehF7ehx/mN5R
- XqFXhyG9iD296E/Q8/EMerX7SnrufHqeNxsbdP+SqGMHT+b4ZAvoi1ajXjtyCgbL+6L6
- cmQGviNa3/CZm7XEJy9Heecd2XGNanXWgmhna9DemiQrg3sjjBO+MgXakWolmtbKOa29
- ZS13Oa0VX603a6VejiZ7U6248QisPeErHfHpWXrzZccYPcW1I9VqNKlVDtJR1ko0qRUO
- 0lvRSr2cNd5bx0HcSm/zvtJb7breGjvjqx2pVqNJbTdv2VdmkCa1h3qzr/TG0XhvBw7s
- Vnqb9eWHeYoloDDjmrAoJZhUSq0pdUoOJpVSaczLagf6d3D2hRApexXpwXX9H3XWVxQK
- ZW5kc3RyZWFtCmVuZG9iago2IDAgb2JqCjczNwplbmRvYmoKMyAwIG9iago8PCAvVHlw
- ZSAvUGFnZSAvUGFyZW50IDQgMCBSIC9SZXNvdXJjZXMgNyAwIFIgL0NvbnRlbnRzIDUg
- MCBSIC9NZWRpYUJveCBbMCAwIDU3NiA3MzNdCj4+CmVuZG9iago3IDAgb2JqCjw8IC9Q
- cm9jU2V0IFsgL1BERiAvVGV4dCBdIC9Db2xvclNwYWNlIDw8IC9DczIgOSAwIFIgL0Nz
- MSA4IDAgUiA+PiAvRm9udCA8PAovRjEuMCAxMCAwIFIgL0YzLjAgMTIgMCBSIC9GMi4w
- IDExIDAgUiA+PiA+PgplbmRvYmoKMTMgMCBvYmoKPDwgL0xlbmd0aCAxNCAwIFIgL04g
- MSAvQWx0ZXJuYXRlIC9EZXZpY2VHcmF5IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0
- cmVhbQp4AYVST0gUURz+zTYShIhBhXiIdwoJlSmsrKDadnVZlW1bldKiGGffuqOzM9Ob
- 2TXFkwRdojx1D6JjdOzQoZuXosCsS9cgqSAIPHXo+83s6iiEb3k73/v9/X7fe0Rtnabv
- OylBVHNDlSulp25OTYuDHylFHdROWKYV+OlicYyx67mSv7vX1mfS2LLex7V2+/Y9tZVl
- YCHqLba3EPohkWYAH5mfKGWAs8Adlq/YPgE8WA6sGvAjogMPmrkw09GcdKWyLZFT5qIo
- Kq9iO0mu+/m5xr6LtYmD/lyPZtaOvbPqqtFM1LT3RKG8D65EGc9fVPZsNRSnDeOcSEMa
- KfKu1d8rTMcRkSsQSgZSNWS5n2pOnXXgdRi7XbqT4/j2EKU+yWCoibXpspkdhX0AdirL
- 7BDwBejxsmIP54F7Yf9bUcOTwCdhP2SHedatH/YXrlPge4Q9NeDOFK7F8dqKH14tAUP3
- VCNojHNNxNPXOXOkiO8x1BmY90Y5pgsxd5aqEzeAO2EfWapmCrFd+67qJe57AnfT4zvR
- mzkLXKAcSXKxFdkU0DwJWBR9i7BJDjw+zh5V4HeomMAcuYnczSj3HtURG2ejUoFWeo1X
- xk/jufHF+GVsGM+Afqx213t8/+njFXXXtj48+Y163DmuvZ0bVWFWcWUL3f/HMoSP2Sc5
- psHToVlYa9h25A+azEywDCjEfwU+l/qSE1Xc1e7tuEUSzFA+LGwluktUbinU6j2DSqwc
- K9gAdnCSxCxaHLhTa7o5eHfYInpt+U1XsuuG/vr2evva8h5tyqgpKBPNs0RmlLFbo+Td
- eNv9ZpERnzg6vue9ilrJ/klFED+FOVoq8hRV9FZQ1sRvZw5+G7Z+XD+l5/VB/TwJPa2f
- 0a/ooxG+DHRJz8JzUR+jSfCwaSHiEqCKgzPUTlRjjQPiKfHytFtkkf0PQBn9ZgplbmRz
- dHJlYW0KZW5kb2JqCjE0IDAgb2JqCjcwNAplbmRvYmoKOSAwIG9iagpbIC9JQ0NCYXNl
- ZCAxMyAwIFIgXQplbmRvYmoKMTUgMCBvYmoKPDwgL0xlbmd0aCAxNiAwIFIgL04gMyAv
- QWx0ZXJuYXRlIC9EZXZpY2VSR0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFt
- CngBhVTPaxNBFP42bqnQIghaaw6yeJAiSVmraEXUNv0RYmsM2x+2RZBkM0nWbjbr7ia1
- pYjk4tEq3kXtoQf/gB568GQvSoVaRSjeqyhioRct8c1uTLal6sDOfvPeN+99b3bfAA1y
- 0jT1gATkDcdSohFpbHxCavyIAI6iCUE0JVXb7E4kBkGDc/l759h6D4FbVsN7+3eyd62a
- 0raaB4T9QOBHmtkqsO8XcQpZEgKIPN+hKcd0CN/j2PLsjzlOeXjBtQ8rPcRZInxANS3O
- f024U80l00CDSDiU9XFSPpzXi5TXHQdpbmbGyBC9T5Cmu8zuq2KhnE72DpC9nfR+TrPe
- PsIhwgsZrT9GuI2e9YzVP+Jh4aTmxIY9HBg19PhgFbcaqfg1whRfEE0nolRx2S4N8Ziu
- /VbySoJwkDjKZGGAc1pIT9dMbvi6hwV9JtcTr+J3VlHheY8TZ97U3e9F2gKvMA4dDBoM
- mg1IUBBFBGGYsFBAhjwaMTSycj8jqwYbk3sydSRqu3RiRLFBezbcPbdRpN08/igicZRD
- tQiS/EH+Kq/JT+V5+ctcsNhW95Stm5q68uA7xeWZuRoe19PI43NNXnyV1HaTV0eWrHl6
- vJrsGj/sV5cx5oI1j8RzsPvxLV+VzJcpjBTF41Xz6kuEdVoxN9+fbH87PeIuzy611nOt
- iYs3VpuXZ/1qSPvuqryT5lX5T1718fxnzcRj4ikxJnaK5yGJl8Uu8ZLYS6sL4mBtxwid
- lYYp0m2R+iTVYGCavPUvXT9beL1Gfwz1UZQZzNJUifd/wipkNJ25Dm/6j9vH/Bfk94rn
- nygCL2zgyJm6bVNx7xChZaVuc64CF7/RffC2bmujfjj8BFg8qxatUjWfILwBHHaHeh7o
- KZjTlpbNOVKHLJ+TuunKYlLMUNtDUlLXJddlSxazmVVi6XbYmdMdbhyhOUL3xKdKZZP6
- r/ERsP2wUvn5rFLZfk4a1oGX+m/AvP1FCmVuZHN0cmVhbQplbmRvYmoKMTYgMCBvYmoK
- NzM3CmVuZG9iago4IDAgb2JqClsgL0lDQ0Jhc2VkIDE1IDAgUiBdCmVuZG9iago0IDAg
- b2JqCjw8IC9UeXBlIC9QYWdlcyAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXSAvQ291bnQg
- MSAvS2lkcyBbIDMgMCBSIF0gPj4KZW5kb2JqCjE3IDAgb2JqCjw8IC9UeXBlIC9DYXRh
- bG9nIC9PdXRsaW5lcyAyIDAgUiAvUGFnZXMgNCAwIFIgPj4KZW5kb2JqCjIgMCBvYmoK
- PDwgL0xhc3QgMTggMCBSIC9GaXJzdCAxOSAwIFIgPj4KZW5kb2JqCjE5IDAgb2JqCjw8
- IC9QYXJlbnQgMjAgMCBSIC9Db3VudCAwIC9EZXN0IFsgMyAwIFIgL1hZWiAwIDczMyAw
- IF0gL1RpdGxlIChDYW52YXMgMSkKPj4KZW5kb2JqCjIwIDAgb2JqCjw8ID4+CmVuZG9i
- agoxOCAwIG9iago8PCAvUGFyZW50IDIwIDAgUiAvQ291bnQgMCAvRGVzdCBbIDMgMCBS
- IC9YWVogMCA3MzMgMCBdIC9UaXRsZSAoQ2FudmFzIDEpCj4+CmVuZG9iagoyMSAwIG9i
- ago8PCAvTGVuZ3RoIDIyIDAgUiAvTGVuZ3RoMSA2NjYwIC9GaWx0ZXIgL0ZsYXRlRGVj
- b2RlID4+CnN0cmVhbQp4Ab1Ze3QT15n/7jw0I8sPSZZsSbYsibEkP/ELjI2deDCSMW9j
- A5EIJpKxjU1wcRzjAl1YJ4VuMISFEJwAbVqahgBewmB7qQwN6+RAIWe3DUkT8tjsNmkg
- yfbEh+4udNOCpf1mZLuYk+TwBydz/c39Xvfe7/7uN3c0150dG5ogDrqBhpoVwfZmUC5z
- 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
- WbUp2qeeGWTyhooPUfQ5mjrZMfq8vPMlR65TanYFIl/7z3FTY4bjSYhUiE4mqTSZVsXH
- 6CzJyRY8+cgEY7wxgbbRFH07yWy23Has2TKWwfWl5+UHXLvI2+T5DPIqKuRNYEQ7erUg
- P7FIV2QUdIbkpKLC4hnGeIzJNV0nTC86erqvz2UsiEsz2Ga7t67Yu5ddEX5336i3JFFD
- qN1q/ok11IV9yh7WHfmU/k98XpMxwlXizJDhkoFSJ/IGc6LZkKH6Pv0ex/HAxseAKi6G
- xbwwcSaTJglnkhmrsVhIphzs246GymiwcmJgeFcRrmhuVODGFIUOd6NooDOKp+uKdMIM
- JffdGK+TlFjyf/grj3PwOCVMW7PvWl0uOcnkjZbWTgscXfETKv7WWy88kLX0QO0O6n2L
- vO8qV6QJz6K+7pJ38Ol4niWfVj0EPpQInq5F3zcq/H8D1C14qG6pP7u6aV1XU2fr6qDi
- Md5TOjL5SCJSDVIAqR2pOzJ2IQ8TPFHeZ3fKSkx32Nff5d9xl6z8v+QO/w2y/f8Bhv3i
- DAplbmRzdHJlYW0KZW5kb2JqCjIyIDAgb2JqCjQwMTYKZW5kb2JqCjIzIDAgb2JqCjw8
- IC9UeXBlIC9Gb250RGVzY3JpcHRvciAvQXNjZW50IDc3MCAvQ2FwSGVpZ2h0IDcxNyAv
- RGVzY2VudCAtMjMwIC9GbGFncyAzMgovRm9udEJCb3ggWy05NTEgLTQ4MSAxNDQ1IDEx
- MjJdIC9Gb250TmFtZSAvU0xXU1RZK0hlbHZldGljYSAvSXRhbGljQW5nbGUgMAovU3Rl
- bVYgMCAvTWF4V2lkdGggMTUwMCAvWEhlaWdodCA2MzcgL0ZvbnRGaWxlMiAyMSAwIFIg
- Pj4KZW5kb2JqCjI0IDAgb2JqClsgNzIyIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
- MCAwIDAgMCAwIDU1NiAwIDAgMCAwIDAgMCAwIDAgMCA1NTYgMCAwIDMzMwowIDI3OCA1
- NTYgXQplbmRvYmoKMTAgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVU
- eXBlIC9CYXNlRm9udCAvU0xXU1RZK0hlbHZldGljYSAvRm9udERlc2NyaXB0b3IKMjMg
- MCBSIC9XaWR0aHMgMjQgMCBSIC9GaXJzdENoYXIgODIgL0xhc3RDaGFyIDExNyAvRW5j
- b2RpbmcgL01hY1JvbWFuRW5jb2RpbmcKPj4KZW5kb2JqCjI1IDAgb2JqCjw8IC9MZW5n
- dGggMjYgMCBSIC9MZW5ndGgxIDc2ODAgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3Ry
- ZWFtCngBxVl5eFRFtj91l77d6Sy9b0mn+6bTSzayh4QguYTuBEiIIUFIR8F0oCFhkQgh
- AiMYHBiHgBEN5gVceT55LCJNQOyAOtHBEb8ZR3TEXQcVdN585uHzAW6k+53bHSLhG/34
- w89X9Z2qc+rUcupX51bdW7d9xSo/xEEn0FDb6GtbCJFgtmJ2Zv4yX1tUVp3B/Mj8jnZr
- VGZdAPTShW2LlkVl6XaAGPOipWtG2qufApAZWvy+BVE9XMa8qAULojIpwDy1ZVn76qis
- OoJ55tLl80f0auwPDMt8q0fGhw9Rtt7mW+aP1k8S+0ttW76yfUQ+gXlx2wr/SH3SgPa9
- DgRL5bAcZLAEOKBAgXEuAPePGDMwqBX1GBZkyntuTZh4EZTSiHzrjPsi+Z/4597+1n/Z
- Kb9f+h0WyK7UF3NJWigNIJagfkh+/6gm0g4TeRDqM4IwDakMqRApI2OyATrJbtiG9DgS
- Da1kC6xB2oy0A4kZ5faiNEC29DNS4RhZAyYyXZAzllkao8UQI7e8GSSSI49a3jN8dpwY
- cfU+Icb+OJBNjiGPk8dgAVjIk2Ana2EquMjOw2lLLU2o2gttSJ1IdCQlZG9/cp7lBZIJ
- doZgGwckM+So5YvcLMu53CBF+i0vOYMMZi8moyQkWAbNj1r+YF5keQFpf1S1Lw1rHLXs
- NS+19CQHyc5+ywPmIME290ezVWZsetSyLK3XsiA3oq/uDVL7+y0lqJ8tyC1Fxbyl0HzW
- ku0MSgnKWeZqS3rua5ZUbIjVrNipXVBaksw9lgmoSjZ7nBOQjpN95CFIJw/126dbjiGL
- 0z08La24N0h+c3iqK9ceJGuFoqmu3rSpTntatcWeVuF0Ij/7JLeRu5mbzOVxGZyLc3A8
- l8hppCqpQhovjZXGSKVSLkie6i+zSI6T/VCGsOw/LJVI2SB5GguZ4+RApPDAs1JGSklB
- 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
- TuqM4YnDLoshWQyP/2EwSVYm8cSowyTiqoqJ6KiRZMwOij6Lx1jUYZ2ObCKeRgVF+Xl6
- HWdDPrJCep2FYB2tRmJLcTjJeandvWdB3w3Olfdtntz+wcDXS6ZQ+1jHpB0LWz2umjte
- Km997+Pzr3DkWVLbmDNnzs2eVJ05NSV92oa+57obW27Iq6wRKtKNanN2pmf7fafee5z6
- Dvdaffg8JWMb0VvrnokbFzMYj/ttmWBndCV6WhIfozTh0Ya3k2mgjdcm0BY8/S/rjEbT
- ZX7Ruqh/Ds8tOZGNm58iesxml5VNnDE8cUgxfBa35nxlvtYWORTyisZr4wnOo1BpK8zf
- c3T/foc2Ny5ZY5niXN94//1sY+h0z7CnWC0nVLdMumER9XIPPk8UdIY/oz/GW0M9WjhP
- mBDUnNRQMrVUY1QbNS7JHfQ7HCcFNj4GJHExLD5LBs5gkOtwJmmxcpOJpInGvsk3l//4
- MKF5Z3H5o89T2UTRIXJzxD2ERA3FTUOJx8l43GxtKbgqSjspNuX89jm3/cg+ylawqOdc
- fRY5yGQPl9QVNO1pfISK/+GNR29In7WjbjP1rkm0ORLCfrwv/ldBjoVy3B/UePJqQYc3
- y7NhDuA/QlwNFZIYJPhvEG6sqqyfNS1jqn9ph7+9db4vUiOixqQASUCqRWpCakPqRNqG
- 9DhSAGkQ6VR4JCAPozzB986xMv4/HKPPuUbOvUbOu0bOv0Zefo288ho58q/0KntWifr/
- A9iD96AKZW5kc3RyZWFtCmVuZG9iagoyNiAwIG9iago0NzQ0CmVuZG9iagoyNyAwIG9i
- ago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0FzY2VudCA3NzAgL0NhcEhlaWdodCA3
- MTcgL0Rlc2NlbnQgLTIzMCAvRmxhZ3MgMzIKL0ZvbnRCQm94IFstOTUxIC00ODEgMTQ0
- NSAxMTIyXSAvRm9udE5hbWUgL09LR1NUSStIZWx2ZXRpY2EgL0l0YWxpY0FuZ2xlIDAK
- L1N0ZW1WIDAgL01heFdpZHRoIDE1MDAgL1hIZWlnaHQgNjM3IC9Gb250RmlsZTIgMjUg
- MCBSID4+CmVuZG9iagoyOCAwIG9iagpbIDMzMyAzMzMgMCAwIDAgMCAwIDAgNTU2IDU1
- NiA1NTYgNTU2IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAw
- IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
- MCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCA1NTYgMCAwIDAgNTAwIDI3OCA1NTYgXQpl
- bmRvYmoKMTIgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9C
- YXNlRm9udCAvT0tHU1RJK0hlbHZldGljYSAvRm9udERlc2NyaXB0b3IKMjcgMCBSIC9X
- aWR0aHMgMjggMCBSIC9GaXJzdENoYXIgNDAgL0xhc3RDaGFyIDExNyAvRW5jb2Rpbmcg
- L01hY1JvbWFuRW5jb2RpbmcKPj4KZW5kb2JqCjI5IDAgb2JqCjw8IC9MZW5ndGggMzAg
- MCBSIC9MZW5ndGgxIDUzNjQgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB
- vVh/cBNVHv++/ZGkPzjTUmj6I+zGJW3Tprbl17W0R5eQlJb+sFDABCkkaVPTSqUHJSd6
- cBkPPAnI6SGcgqOidyrtIUvagS0cXGXw0Dl/oI7c6TmjnKA3N3a8H+KoSPe+u0kjZZTp
- H4z75u3353vv8z7v5e1uetdtCMAkCAMNzSt8PR2gXRmDKMS2bl9PzE4fRjm9LdTLx2y2
- AIBe09FzR3fMNjwCkGy+Y83GePv0TwHIz4MBX3ssDt+gnBNER8wms1BOD3b33h2z09Xx
- UtesbYvH0y+gbej23R0fH95Hm7/L1x2I5Wc8hHJ6z9r1vXE7iLKgZ10gnk/ciO8NIOil
- YS0kwZ2gBwqMWFoB9P9MNgODUTWOV7s9Zdfqm6ouQZpBs1c3/lqTf7b88dyXgW/yUx42
- fIWOpLF8VepsozaETDA+kvJwIqK1wxstQ0uRDHVYq7HOxlpUNN8EYfIsPIT1Kaw0dJLt
- sBHrNqyPYWUS2gG0hsj2KGMQj5GNkE0WiSkMtzQjizMlp3BvyUQ3+AT3rumj4yQLV+88
- yYpOgqT5yeQp8iS0A0d+D1ZyD9RCAdk7YFvDeTF0AHqwhrHS2p2QA9FpM7iTxA5WhmCb
- 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
- aHQgNjg0IC9EZXNjZW50IC0yMzAgL0ZsYWdzIDMyCi9Gb250QkJveCBbLTk1MSAtNDgx
- IDE0NDUgMTEyMl0gL0ZvbnROYW1lIC9CRUJWQlYrSGVsdmV0aWNhIC9JdGFsaWNBbmds
- ZSAwCi9TdGVtViAwIC9NYXhXaWR0aCAxNTAwIC9YSGVpZ2h0IDUxMyAvRm9udEZpbGUy
- IDI5IDAgUiA+PgplbmRvYmoKMzIgMCBvYmoKWyAyMjIgMCAwIDAgMCA1NTYgXQplbmRv
- YmoKMTEgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNl
- Rm9udCAvQkVCVkJWK0hlbHZldGljYSAvRm9udERlc2NyaXB0b3IKMzEgMCBSIC9XaWR0
- aHMgMzIgMCBSIC9GaXJzdENoYXIgMTA1IC9MYXN0Q2hhciAxMTAgL0VuY29kaW5nIC9N
- YWNSb21hbkVuY29kaW5nCj4+CmVuZG9iagozMyAwIG9iagooTWFjIE9TIFggMTAuNi44
- IFF1YXJ0eiBQREZDb250ZXh0KQplbmRvYmoKMzQgMCBvYmoKKEQ6MjAxMjA1MzAxNzEy
- MzRaMDAnMDAnKQplbmRvYmoKMSAwIG9iago8PCAvUHJvZHVjZXIgMzMgMCBSIC9DcmVh
- dGlvbkRhdGUgMzQgMCBSIC9Nb2REYXRlIDM0IDAgUiA+PgplbmRvYmoKeHJlZgowIDM1
- CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAxNjk1MCAwMDAwMCBuIAowMDAwMDAzMDAx
- IDAwMDAwIG4gCjAwMDAwMDA4NTIgMDAwMDAgbiAKMDAwMDAwMjg1MiAwMDAwMCBuIAow
- MDAwMDAwMDIyIDAwMDAwIG4gCjAwMDAwMDA4MzMgMDAwMDAgbiAKMDAwMDAwMDk1NiAw
- MDAwMCBuIAowMDAwMDAyODE2IDAwMDAwIG4gCjAwMDAwMDE5MjAgMDAwMDAgbiAKMDAw
- MDAwNzcxMyAwMDAwMCBuIAowMDAwMDE2NjgwIDAwMDAwIG4gCjAwMDAwMTMxNjQgMDAw
- MDAgbiAKMDAwMDAwMTA5MiAwMDAwMCBuIAowMDAwMDAxOTAwIDAwMDAwIG4gCjAwMDAw
- MDE5NTYgMDAwMDAgbiAKMDAwMDAwMjc5NiAwMDAwMCBuIAowMDAwMDAyOTM1IDAwMDAw
- IG4gCjAwMDAwMDMxNjQgMDAwMDAgbiAKMDAwMDAwMzA0OSAwMDAwMCBuIAowMDAwMDAz
- MTQyIDAwMDAwIG4gCjAwMDAwMDMyNTcgMDAwMDAgbiAKMDAwMDAwNzM2MyAwMDAwMCBu
- IAowMDAwMDA3Mzg0IDAwMDAwIG4gCjAwMDAwMDc2MDkgMDAwMDAgbiAKMDAwMDAwNzg4
- OCAwMDAwMCBuIAowMDAwMDEyNzIyIDAwMDAwIG4gCjAwMDAwMTI3NDMgMDAwMDAgbiAK
- MDAwMDAxMjk2OCAwMDAwMCBuIAowMDAwMDEzMzM5IDAwMDAwIG4gCjAwMDAwMTYzOTgg
- MDAwMDAgbiAKMDAwMDAxNjQxOSAwMDAwMCBuIAowMDAwMDE2NjQ0IDAwMDAwIG4gCjAw
- MDAwMTY4NTYgMDAwMDAgbiAKMDAwMDAxNjkwOCAwMDAwMCBuIAp0cmFpbGVyCjw8IC9T
- aXplIDM1IC9Sb290IDE3IDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8ZDVjZDdhYmY5Y2Y1
- MmI4M2U5MzNiM2E0YjVhMjc4MjM+CjxkNWNkN2FiZjljZjUyYjgzZTkzM2IzYTRiNWEy
- NzgyMz4gXSA+PgpzdGFydHhyZWYKMTcwMjUKJSVFT0YKMSAwIG9iago8PC9BdXRob3Ig
- KEpvbmF0aGFuIEJhY2hyYWNoKS9DcmVhdGlvbkRhdGUgKEQ6MjAxMjA1MjkyMzMxMDBa
- KS9DcmVhdG9yIChPbW5pR3JhZmZsZSBQcm9mZXNzaW9uYWwgNS4zLjYpL01vZERhdGUg
- KEQ6MjAxMjA1MzAxNzEyMDBaKS9Qcm9kdWNlciAzMyAwIFIgL1RpdGxlIChyb3V0ZXIp
- Pj4KZW5kb2JqCnhyZWYKMSAxCjAwMDAwMTc4ODMgMDAwMDAgbiAKdHJhaWxlcgo8PC9J
- RCBbPGQ1Y2Q3YWJmOWNmNTJiODNlOTMzYjNhNGI1YTI3ODIzPiA8ZDVjZDdhYmY5Y2Y1
- MmI4M2U5MzNiM2E0YjVhMjc4MjM+XSAvSW5mbyAxIDAgUiAvUHJldiAxNzAyNSAvUm9v
- dCAxNyAwIFIgL1NpemUgMzU+PgpzdGFydHhyZWYKMTgwNjQKJSVFT0YK
-
- QuickLookThumbnail
-
- TU0AKgAABf6AP+BP8AQWDQeEQmFQuGQ2HQ+IRGJROKRWLReMRmNRuHwOCRyQSGMKmSAA
- DyeRSmVRF7y0ADCYAAUzOVzWVR6bTmbL+eAAcT+dUGVO6iABuUcAD+lUKmRWcU2oRdg1
- Ok0uo1eKOetABtV2qj+sSCBgB6WUAAy0WSzWgGWp6ACn2G5QypsGv3O8QutOeuV6lWC8
- wty4MABnDAB14kAIzGABmY8ADTJY7IZIaZRmXCx4HOXW75zOOPRAA86UAB/UQg16sAPP
- XAAIbEAAHaUakQcJ7kAO3eAB7b8AAvhQgVcUAIrkABvcsAA3nAAt9EADPqABJ9cAG3td
- bsdo29xJ5qBaDA56/+TA3u+trPwpd++EPr5AD1bkJ7Pagb9eKEbQAgAJUAoQQ0COa54i
- QQAAOwW8Dsu267wu9Bq4vQsLzKtCq5PUrr2POhZqRAAAKRGABuxMAAORSACiHcAACReA
- B4RkAALRrGkbGzHKfKAh50x8ABHyCADRHHBUGSJIwOyG0cKQyqMLsBJysQ2v0MSkm0my
- uoUoS0q8qQ7K0upTLMxJtLkyqZL72zLHx0gAR04OU5gRTpORvABOgRTs8SPzQnUzz8nU
- 1Q8hUcmy2DZP82xuIQ+zdt7FgABlSYAHDSwABzTKEMYRgAAjT4ACDUUbgtBsJQhBzv1R
- MlApFQFWprJDSjy07UoO1Y1gAatdvi+b6t1RT9ANFEVAlYwAGlZIAB3ZjjuSo9GWMCQA
- CjaoAB1bFTQe7ttvCYFvn+W9xAAwZygADd0SXIoBXYAAPXeAAs3kAAWXrWCC1eijNoNR
- V70HMKDxAakRRJExu2IDkVqLF4CRjGYXYhF0YGnikdhwhDlzvBclUjTjMMiybHsyy2Po
- 8sq31RCWPJOA7SNMkVDMKw6WnuAAL5ujBI50AAW57a9smToM1ooKmigAIukAAfmlgBXD
- fOABWogA+R9AAAer6VphWa26DpN+ewAATsQAHzsuJYbhisq3Dmh3ui+TLNlLt5WlAwbs
- ABKbyjFJhls4AHfwCEbsMEgSEdnDogXXFJkmhA8cABxcjtqJCrytQ1G3h25tnAC87d14
- Yoad6XtYQAFj08kgAevVgAI/XAASHYgASvaAAB/b7Uvm2UJtyMW+YB/lp4WP5IZHjb9b
- AdXjed6hYjBl+g/D/rGGvqowZvsAAE/trOtN8omQ/wgAO/yAAPvz5kDIADJ9gAFJ97Wt
- ew31Bf+oAcUXQAdDSVKJgGAABvwBa6FsjC/0opsR+zoSLT2wNRAVAwAEDoIEeLG4Ad6n
- lQKRUUtJ3pCnvkSGJCEAAPISAAF7CeDAEX9MVWqFEAAxYYLkMIFCGgABhQ3hSosAAWIe
- AAHBD9njPiLwGIwPGIxCHbgPRKidGQ8GwtjARFFPCdSDv4VI4wFIAB9xbW0qpbkXjwqs
- g6RiD8YyMqyNMagD5qjWQwGK7Z3CiloAAdK50AoAAMR5YIBR+I83VOsWYDtZwigADKkM
- ACKICAAOVCqAAKUj4uyRVWvuMxG4yyVItEQhcJxex7AAzFRw/ZREILG5l/jfRzSpAAEK
- VhCIQjEc2BeKaemaSSi+hOSkmIyFUd5LqAra0qwHJTE1RAEAAD+mQW4AADpmEQTa4UR5
- 9CtvzmkXyah6oxS+IjJebREZNTdI7LmcBEpuTjIbN+cxC5szpg9LxgE7CHToIpKIfpCG
- rgDABEYeMx5kulmQP5AwDSEDYoI6lk6b04sxe2CeT6OqF0NUPOueBB5y0TIPGhWkao2K
- 5jnEkAC7ABAAGvSMhAJKTMOidPSfMRznUCJ+xc5EhKCDYABHaAblwgy2Qit1PlFiIUVp
- 9NU9bkyCioqMACDjMS2R0P24cdgAAS1Ras1h1Y9XultCNVkhDeRKSxWWs2ZgDqdKplwe
- OoJDagU+nkQef9H12ljUUWOtrGQAAjrsQiH44JZzOR+x4Z9fwAAxsEACv4z7A2DsLT2s
- 5dJ3TCsWQitdFqJU+rTRayNE7J0WE5ZuT1jyFtLH458DwAAbWls9Zmz1qbVETtRau11r
- yEkBAAAOAQAAAwAAAAEATwAAAQEAAwAAAAEAIAAAAQIAAwAAAAQAAAasAQMAAwAAAAEA
- BQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEABAAA
- ARYAAwAAAAEAIAAAARcABAAAAAEAAAX1ARwAAwAAAAEAAQAAAT0AAwAAAAEAAgAAAVIA
- AwAAAAEAAQAAAVMAAwAAAAQAAAa0AAAAAAAIAAgACAAIAAEAAQABAAE=
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
- Frame
- {{77, 4}, {1160, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{63, 0}, {505.5, 352.5}}
- Zoom
- 2
- ZoomValues
-
-
- Canvas 1
- 2
- 1
-
-
-
- saveQuickLookFiles
- YES
-
-
diff --git a/doc/cs250/figs/router.pdf b/doc/cs250/figs/router.pdf
deleted file mode 100644
index 273be523..00000000
Binary files a/doc/cs250/figs/router.pdf and /dev/null differ
diff --git a/doc/cs250/figs/schematic-capture.graffle/data.plist b/doc/cs250/figs/schematic-capture.graffle/data.plist
deleted file mode 100644
index 268ccc6f..00000000
Binary files a/doc/cs250/figs/schematic-capture.graffle/data.plist and /dev/null differ
diff --git a/doc/cs250/figs/schematic-capture.graffle/image1.pdf b/doc/cs250/figs/schematic-capture.graffle/image1.pdf
deleted file mode 100644
index ce233477..00000000
Binary files a/doc/cs250/figs/schematic-capture.graffle/image1.pdf and /dev/null differ
diff --git a/doc/cs250/figs/schematic-capture.pdf b/doc/cs250/figs/schematic-capture.pdf
deleted file mode 100644
index df5d1110..00000000
Binary files a/doc/cs250/figs/schematic-capture.pdf and /dev/null differ
diff --git a/doc/cs250/figs/sel.graffle b/doc/cs250/figs/sel.graffle
deleted file mode 100644
index 608e3705..00000000
Binary files a/doc/cs250/figs/sel.graffle and /dev/null differ
diff --git a/doc/cs250/figs/sel.pdf b/doc/cs250/figs/sel.pdf
deleted file mode 100644
index 324ef5c0..00000000
Binary files a/doc/cs250/figs/sel.pdf and /dev/null differ
diff --git a/doc/cs250/figs/skin-sim.png b/doc/cs250/figs/skin-sim.png
deleted file mode 100644
index 40d31b02..00000000
Binary files a/doc/cs250/figs/skin-sim.png and /dev/null differ
diff --git a/doc/cs250/figs/small-odds.graffle b/doc/cs250/figs/small-odds.graffle
deleted file mode 100644
index 58b1e696..00000000
Binary files a/doc/cs250/figs/small-odds.graffle and /dev/null differ
diff --git a/doc/cs250/figs/small-odds.pdf b/doc/cs250/figs/small-odds.pdf
deleted file mode 100644
index 364d1f5d..00000000
Binary files a/doc/cs250/figs/small-odds.pdf and /dev/null differ
diff --git a/doc/cs250/figs/testing.graffle b/doc/cs250/figs/testing.graffle
deleted file mode 100644
index 63a9554d..00000000
--- a/doc/cs250/figs/testing.graffle
+++ /dev/null
@@ -1,464 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.7.0.167456
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {756, 553}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-06-05 23:04:25 -0700
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1 0/72 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{240, 231.5}, {96, 41}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 26
-
- ID
- 10
- Line
-
- ID
- 6
- Position
- 0.5
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs52 \cf0 outputs}
-
- Wrap
- NO
-
-
- Bounds
- {{248, 159.5}, {80, 41}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 26
-
- ID
- 9
- Line
-
- ID
- 5
- Position
- 0.5
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs52 \cf0 inputs}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- ID
- 6
- Points
-
- {216, 252}
- {360, 252}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- StickArrow
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- ID
- 5
- Points
-
- {216, 180}
- {360, 180}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{360, 144}, {144, 144}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- ID
- 4
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs52 \cf0 CUT}
-
-
-
- Bounds
- {{72, 144}, {144, 144}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- ID
- 3
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs52 \cf0 Chisel}
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2012-06-05 23:07:13 -0700
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSLeftMargin
-
- float
- 18
-
- NSOrientation
-
- int
- 1
-
- NSPaperSize
-
- size
- {792, 612}
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{1005, 627}, {710, 871}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{0, -82}, {575, 718}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 1
- 1
-
-
-
-
-
diff --git a/doc/cs250/figs/traditional-generator-design-process.graffle b/doc/cs250/figs/traditional-generator-design-process.graffle
deleted file mode 100644
index 2da6f3e7..00000000
Binary files a/doc/cs250/figs/traditional-generator-design-process.graffle and /dev/null differ
diff --git a/doc/cs250/figs/traditional-generator-design-process.pdf b/doc/cs250/figs/traditional-generator-design-process.pdf
deleted file mode 100644
index fbd52035..00000000
Binary files a/doc/cs250/figs/traditional-generator-design-process.pdf and /dev/null differ
diff --git a/doc/cs250/figs/traditional-static-design-process.graffle b/doc/cs250/figs/traditional-static-design-process.graffle
deleted file mode 100644
index 340543fe..00000000
Binary files a/doc/cs250/figs/traditional-static-design-process.graffle and /dev/null differ
diff --git a/doc/cs250/figs/traditional-static-design-process.pdf b/doc/cs250/figs/traditional-static-design-process.pdf
deleted file mode 100644
index 586e45c0..00000000
Binary files a/doc/cs250/figs/traditional-static-design-process.pdf and /dev/null differ
diff --git a/doc/cs250/figs/transactors-network.graffle b/doc/cs250/figs/transactors-network.graffle
deleted file mode 100644
index af8bf7a2..00000000
Binary files a/doc/cs250/figs/transactors-network.graffle and /dev/null differ
diff --git a/doc/cs250/figs/transactors-network.pdf b/doc/cs250/figs/transactors-network.pdf
deleted file mode 100644
index 8f447b9d..00000000
Binary files a/doc/cs250/figs/transactors-network.pdf and /dev/null differ
diff --git a/doc/cs250/figs/transactors.graffle b/doc/cs250/figs/transactors.graffle
deleted file mode 100644
index 129d6f5f..00000000
--- a/doc/cs250/figs/transactors.graffle
+++ /dev/null
@@ -1,1321 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.16.0.171715
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {756, 553}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-03 17:47:55 +0000
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Class
- LineGraphic
- Head
-
- ID
- 4
-
- ID
- 75
- Points
-
- {378, 215.5}
- {378, 261.5}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 20
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 4
-
- ID
- 73
- Points
-
- {144, 324}
- {205.40437779812248, 307.59925806674079}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- TailArrow
- 0
-
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 4
-
- ID
- 72
- Points
-
- {144, 225}
- {199.37403229929427, 233.63740247403521}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 47
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 4
-
- ID
- 71
- Points
-
- {594, 324}
- {549.10408093522597, 311.00928267801675}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- FilledArrow
-
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 4
-
- ID
- 70
- Points
-
- {594, 225}
- {556.05865005510407, 231.41138552309584}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- FilledArrow
-
-
-
-
- Bounds
- {{589.5, 157}, {82, 14}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- ID
- 68
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Output Queues}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{54.5, 164}, {73, 14}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- ID
- 67
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Input Queues}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- Head
-
- ID
- 66
- Position
- 0.5
-
- ID
- 61
- Points
-
- {675, 324}
- {648, 324}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- FilledArrow
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- ID
- 62
- Points
-
- {612, 306}
- {612, 342}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- ID
- 63
- Points
-
- {621, 306}
- {621, 342}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- ID
- 64
- Points
-
- {630.00000040233135, 306}
- {630, 342}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 66
- Position
- 0.21428573131561279
-
-
-
- Class
- LineGraphic
- ID
- 65
- Points
-
- {639.00000187754631, 306}
- {639, 342}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 66
- Position
- 0.28571432828903198
-
-
-
- Class
- LineGraphic
- ID
- 66
- Points
-
- {603, 306}
- {648, 306}
- {648, 342}
- {603, 342}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- ID
- 60
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- Head
-
- ID
- 59
- Position
- 0.5
-
- ID
- 54
- Points
-
- {675, 225}
- {648, 225}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- FilledArrow
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- ID
- 55
- Points
-
- {612, 207}
- {612, 243}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- ID
- 56
- Points
-
- {621, 207}
- {621, 243}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- ID
- 57
- Points
-
- {630.00000040233135, 207}
- {630, 243}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 59
- Position
- 0.21428573131561279
-
-
-
- Class
- LineGraphic
- ID
- 58
- Points
-
- {639.00000187754631, 207}
- {639, 243}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 59
- Position
- 0.28571432828903198
-
-
-
- Class
- LineGraphic
- ID
- 59
- Points
-
- {603, 207}
- {648, 207}
- {648, 243}
- {603, 243}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- ID
- 53
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- Head
-
- ID
- 52
- Position
- 0.5
-
- ID
- 47
- Points
-
- {144, 225}
- {117, 225}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- FilledArrow
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- ID
- 48
- Points
-
- {81, 207}
- {81, 243}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- ID
- 49
- Points
-
- {90, 207}
- {90, 243}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- ID
- 50
- Points
-
- {99.000000402331352, 207}
- {99, 243}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 52
- Position
- 0.21428573131561279
-
-
-
- Class
- LineGraphic
- ID
- 51
- Points
-
- {108.00000187754631, 207}
- {108, 243}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 52
- Position
- 0.28571432828903198
-
-
-
- Class
- LineGraphic
- ID
- 52
- Points
-
- {72, 207}
- {117, 207}
- {117, 243}
- {72, 243}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- ID
- 46
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- Head
-
- ID
- 45
- Position
- 0.5
-
- ID
- 40
- Points
-
- {144, 324}
- {117, 324}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- FilledArrow
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- ID
- 41
- Points
-
- {81, 306}
- {81, 342}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- ID
- 42
- Points
-
- {90, 306}
- {90, 342}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- ID
- 43
- Points
-
- {99.000000402331352, 306}
- {99, 342}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 45
- Position
- 0.21428573131561279
-
-
-
- Class
- LineGraphic
- ID
- 44
- Points
-
- {108.00000187754631, 306}
- {108, 342}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 45
- Position
- 0.28571432828903198
-
-
-
- Class
- LineGraphic
- ID
- 45
- Points
-
- {72, 306}
- {117, 306}
- {117, 342}
- {72, 342}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- ID
- 39
-
-
- Bounds
- {{306, 179}, {144, 36}}
- Class
- ShapedGraphic
- ID
- 20
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Transactions}
-
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- ID
- 24
- Points
-
- {459, 333}
- {450, 351}
- {459, 369}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
-
-
- Bounds
- {{315, 333}, {144, 36}}
- Class
- ShapedGraphic
- ID
- 25
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Architectural State}
-
-
-
- ID
- 23
-
-
- Bounds
- {{261, 243}, {144, 54}}
- Class
- ShapedGraphic
- ID
- 18
- Shape
- Circle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf340
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Scheduler}
-
-
-
- Bounds
- {{315, 170}, {144, 36}}
- Class
- ShapedGraphic
- ID
- 22
- Shape
- Rectangle
-
-
- Bounds
- {{324, 162}, {144, 36}}
- Class
- ShapedGraphic
- ID
- 21
- Shape
- Rectangle
-
-
- Bounds
- {{196.5, 117}, {363, 289}}
- Class
- ShapedGraphic
- ID
- 4
- Shape
- Circle
- Style
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2012-05-03 18:11:11 +0000
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSHorizonalPagination
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
-
- NSLeftMargin
-
- float
- 18
-
- NSOrientation
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwGG
-
- NSPaperSize
-
- size
- {792, 612}
-
- NSPrintReverseOrientation
-
- int
- 0
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{28, 316}, {1153, 549}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{-131, 0}, {1018, 410}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 1
- 1
-
-
-
-
-
diff --git a/doc/cs250/figs/transactors.pdf b/doc/cs250/figs/transactors.pdf
deleted file mode 100644
index 5a2e036f..00000000
Binary files a/doc/cs250/figs/transactors.pdf and /dev/null differ
diff --git a/doc/cs250/figs/two-phase-rtl-semantics.graffle b/doc/cs250/figs/two-phase-rtl-semantics.graffle
deleted file mode 100644
index 5564b833..00000000
Binary files a/doc/cs250/figs/two-phase-rtl-semantics.graffle and /dev/null differ
diff --git a/doc/cs250/figs/two-phase-rtl-semantics.pdf b/doc/cs250/figs/two-phase-rtl-semantics.pdf
deleted file mode 100644
index 9a646d12..00000000
Binary files a/doc/cs250/figs/two-phase-rtl-semantics.pdf and /dev/null differ
diff --git a/doc/cs250/figs/ufix.graffle b/doc/cs250/figs/ufix.graffle
deleted file mode 100644
index 74bef829..00000000
Binary files a/doc/cs250/figs/ufix.graffle and /dev/null differ
diff --git a/doc/cs250/figs/ufix.pdf b/doc/cs250/figs/ufix.pdf
deleted file mode 100644
index 5e9b5ed6..00000000
Binary files a/doc/cs250/figs/ufix.pdf and /dev/null differ
diff --git a/doc/cs250/figs/vec-3-dynamic.graffle b/doc/cs250/figs/vec-3-dynamic.graffle
deleted file mode 100644
index 09ccc2dc..00000000
Binary files a/doc/cs250/figs/vec-3-dynamic.graffle and /dev/null differ
diff --git a/doc/cs250/figs/vec-3-dynamic.pdf b/doc/cs250/figs/vec-3-dynamic.pdf
deleted file mode 100644
index 92fa5199..00000000
Binary files a/doc/cs250/figs/vec-3-dynamic.pdf and /dev/null differ
diff --git a/doc/cs250/figs/vec-3-fix.graffle b/doc/cs250/figs/vec-3-fix.graffle
deleted file mode 100644
index 19823295..00000000
Binary files a/doc/cs250/figs/vec-3-fix.graffle and /dev/null differ
diff --git a/doc/cs250/figs/vec-3-fix.pdf b/doc/cs250/figs/vec-3-fix.pdf
deleted file mode 100644
index 73d43cbf..00000000
Binary files a/doc/cs250/figs/vec-3-fix.pdf and /dev/null differ
diff --git a/doc/cs250/figs/vec-3-static.graffle b/doc/cs250/figs/vec-3-static.graffle
deleted file mode 100644
index 7dca4543..00000000
Binary files a/doc/cs250/figs/vec-3-static.graffle and /dev/null differ
diff --git a/doc/cs250/figs/vec-3-static.pdf b/doc/cs250/figs/vec-3-static.pdf
deleted file mode 100644
index 6049cda9..00000000
Binary files a/doc/cs250/figs/vec-3-static.pdf and /dev/null differ
diff --git a/doc/cs250/figs/workflow.graffle b/doc/cs250/figs/workflow.graffle
deleted file mode 100644
index bdfa7602..00000000
Binary files a/doc/cs250/figs/workflow.graffle and /dev/null differ
diff --git a/doc/cs250/figs/workflow.pdf b/doc/cs250/figs/workflow.pdf
deleted file mode 100644
index 25c8501e..00000000
Binary files a/doc/cs250/figs/workflow.pdf and /dev/null differ
diff --git a/doc/cs250/figs/wr.pdf b/doc/cs250/figs/wr.pdf
deleted file mode 100644
index d5d62a93..00000000
Binary files a/doc/cs250/figs/wr.pdf and /dev/null differ
diff --git a/doc/cs250/figs/zedboardfuns.jpg b/doc/cs250/figs/zedboardfuns.jpg
deleted file mode 100644
index c6867927..00000000
Binary files a/doc/cs250/figs/zedboardfuns.jpg and /dev/null differ
diff --git a/doc/getting-started/basics-guts.tex b/doc/getting-started/basics-guts.tex
deleted file mode 100644
index 7bccb920..00000000
--- a/doc/getting-started/basics-guts.tex
+++ /dev/null
@@ -1,440 +0,0 @@
-\subsection{The Chisel Directory Structure}
-
-Once you have acquired the tutorial files you should see the following Chisel tutorial directory structure under \verb+$TUT_DIR+:
-
-\begin{bash}
-chisel-tutorial/
- Makefile
- examples/ # chisel examples
- Makefile # for running examples
- build.sbt # project description
- Accumulator.scala ...
- problems/ # skeletal files for tutorial problems
- Makefile # for running / testing problems
- build.sbt # project description
- Counter.scala ...
- solutions/ # solutions to problems
- Makefile # for running solutions
- build.sbt # project description
- Counter.scala ...
-\end{bash}
-
-Chisel source files are distributed between \verb+examples+, \verb+problems+, and \verb+solutions+ directories.
-The tutorial contains the files that you will be modifying under \verb+problems/+ while the \verb+solutions/+ folder contains the reference implementations for each of the problems. Finally, \verb+examples/+ contains source to the complete examples given in this tutorial.
-
-Finally, the \verb+build.sbt+ files contain the build configuration information used to specify what version of Chisel to make your project with.
-
-\section{Running Your First Chisel Build}
-
-In this section, we explain how to run your first build to explore what Chisel has to offer. We will go through a simple example for a GCD module and familiarize ourselves with the source files, simulation, and Verilog generation. More comprehensive details will follow in subsequent sections of the tutorial.
-
-\subsection{The Chisel Source Code}
-
-Now that you are more familiar with what your Chisel directory structure contains, let's start by exploring one of the Chisel files. Change directory into the \verb+examples/+ directory and open up the \verb+GCD.scala+ file with your favorite text editor.
-
-You will notice that file is already filled out for you to perform the well known GCD algorithm and should look like:
-
-\begin{scala}
-package TutorialExamples
-
-import Chisel._
-
-class GCD extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 16)
- val b = UInt(INPUT, 16)
- val e = Bool(INPUT)
- val z = UInt(OUTPUT, 16)
- val v = Bool(OUTPUT)
- }
- val x = Reg(UInt())
- val y = Reg(UInt())
- when (x > y) { x := x - y }
- unless (x > y) { y := y - x }
- when (io.e) { x := io.a; y := io.b }
- io.z := x
- io.v := y === UInt(0)
-} ...
-\end{scala}
-
-The first thing you will notice is the \verb+import Chisel._+ declaration; this imports the Chisel library files that allow us to leverage Scala as a hardware construction language. After the import declarations you will see the Scala class definition for the Chisel component you are implementing. You can think of this as almost the same thing as a module declaration in Verilog.
-
-Next we see the I/O specification for this component in the \verb+val io = new Bundle{...}+ definition. You will notice that the bundle takes several arguments as part of its construction, each with a specified type (UInt, Bool, etc.), a direction (either INPUT or OUTPUT), and a bit width. If a bit width is not specified, Chisel will infer the appropriate bit width for you (in this case default to 1). The \verb+io+ Bundle is essentially a constructor for the component that we are constructing.
-
-The next section of code performs the actual GCD computation for the module. The register declarations for \verb+x+ and \verb+y+ tell Chisel to treat \verb+x+ and \verb+y+ as a register of type UInt().
-
-\begin{scala}
-val x = Reg(UInt()) // declares x as UInt register
-val y = Reg(UInt()) // declares y as UInt register
-\end{scala}
-
-The \verb+when+ statement tells Chisel to perform the operation on a positive clock edge if the condition is true, treating the left hand assignments as synchronous. This is similar to how Verilog uses \verb+always @ (posedge clk)+ to specify synchronous logic.
-
-Finally we see the output assignments for the computation for \verb+io.z+ and \verb+io.v+. One particular thing to notice is that, we do not have to specify the width of \verb+x+ and \verb+y+ in this example. This is because Chisel does the bit width inference for you and sets these values to their appropriate widths based on the computation they are storing.
-
-\subsection{Running the Chisel Simulation}
-
-Now that we are familiar with the Chisel code for the \verb+GCD.scala+ file, let's try to simulate it by generating the C++ models. Change directory into the \verb+$DIR/examples/+ directory. Here you will see one lonely Makefile which we will call with:
-
-\begin{bash}
-make GCD.out
-\end{bash}
-
-\noindent
-This will fire off the Chisel emulator that will run the simulation for the component defined in \verb+GCD.scala+. If the simulation succeeds, you should see some debug output followed by:
-\begin{footnotesize}
-\begin{bash}
-PASSED
-[success] Total time: 2 s, completed Feb 28, 2013 \
- 8:14:37 PM
-\end{bash}
-\end{footnotesize}
-
-The debug output is generated by the test harness which composes the second half of the GCD.scala file. We will talk about this more later. In addition to the debug output, the build also creates C++ models which can be used to simulate and debug more complicated designs.
-
-\subsection{Generating the Verilog}
-
-One of the most powerful features of Chisel is its ability to generate FPGA and ASIC Verilog from the Scala sources that you construct. To do this, change directory into the \verb+$DIR/examples/verilog/+ directory and again run:
-\begin{bash}
-make GCD.v
-\end{bash}
-This will start the Verilog generation for the GCD Chisel file. When the Verilog generation finishes, you should see a [success] message similar to the one you saw in the emulator and a new \verb+GCD.v+ file. If you open up \verb+GCD.v+, you will find that Chisel has compiled \verb+GCD.scala+ into its equivalent Verilog source.
-
-You will find that the Chisel compiler has generated an equivalent Verilog module that performs the GCD computation.
-
-The Verilog source is roughly divided into three parts:
-\begin{enumerate}
-\item Module declaration with input and outputs
-\item Temporary wire and register declaration used for holding intermediate values
-\item Register assignments in \verb+always @ (posedge clk)+
-\end{enumerate}
-
-\section{Combinational Logic}
-
-\subsection{The Scala Node: Declaring Wires}
-
-Constructing combinational logic blocks in Chisel is fairly straightforward; when you declare a \verb+val+ in Scala, it creates a node that represents the data that it is assigned to. As long as the value is not assigned to be a register type (explained later), this tells the Chisel compiler to treat the value as wire. Thus any number of these values can be connected and manipulated to produce the value that we want.
-
-Suppose we want to construct a single full adder. A full adder takes two inputs \verb+a+ and \verb+b+, and a carry in \verb+cin+ and produces a \verb+sum+ and carry out \verb+cout+. The Chisel source code for our full adder will look something like:
-
-\begin{scala}
-class FullAdder extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 1)
- val b = UInt(INPUT, 1)
- val cin = UInt(INPUT, 1)
- val sum = UInt(OUTPUT, 1)
- val cout = UInt(OUTPUT, 1)
- }
- // Generate the sum
- val a_xor_b = io.a ^ io.b
- io.sum := a_xor_b ^ io.cin
- // Generate the carry
- val a_and_b = io.a & io.b
- val b_and_cin = io.b & io.cin
- val a_and_cin = io.a & io.cin
- io.cout := a_and_b | b_and_cin | a_and_cin
-}
-\end{scala}
-
-\noindent
-where \verb+cout+ is defined as a combinational function of inputs \verb+a+, \verb+b+, and \verb+cin+.
-
-You will notice that in order to access the input values from the \verb+io+ bundle, you need to first reference \verb+io+ since the input and output values belong to the \verb+io+ bundle. The |, \&, and \^\ operators correspond to bitwise OR, AND, and XOR operations respectively.
-
-The corresponding wires for each of these values is shown below in Figure~\ref{fig:full-adder}. You will notice that each \verb+val+ corresponds to exactly one of the wires.
-
-\begin{figure}[ht!]
-\centering
-\includegraphics[width=80mm]{figs/Full_Adder.jpg}
-\caption{Full Adder Circuit}
-\label{fig:full-adder}
-\end{figure}
-
-
-\subsection{Bit Width Inference}
-
-If you don't explicitly specify the width of a value in Chisel, the Chisel compiler will infer the bit width for you based on the inputs that define the value. Notice in the \verb+FullAdder+ definition, the widths for \verb+a_xor_b, a_and_b, b_and_cin,+ and \verb+a_and_cin+ are never specified anywhere. However, based on how the input is computed, Chisel will correctly infer each of these values are one bit wide since each of their inputs are the results of bitwise operations applied to one bit operands.
-
-A quick inspection of the generated Verilog shows these values are indeed one bit wide:
-
-\begin{bash}
-module FullAdder(
- input io_a,
- input io_b,
- input io_cin,
- output io_sum,
- output io_cout);
-
- wire T0;
- wire a_and_cin;
- wire T1;
- wire b_and_cin;
- wire a_and_b;
- wire T2;
- wire a_xor_b;
-
- assign io_cout = T0;
- assign T0 = T1 | a_and_cin;
- assign a_and_cin = io_a & io_cin;
- assign T1 = a_and_b | b_and_cin;
- assign b_and_cin = io_b & io_cin;
- assign a_and_b = io_a & io_b;
- assign io_sum = T2;
- assign T2 = a_xor_b ^ io_cin;
- assign a_xor_b = io_a ^ io_b;
-endmodule
-\end{bash}
-
-Suppose we change the widths of the \verb+FullAdder+ to be 2 bits wide each instead such that the Chisel source now looks like:
-
-\begin{scala}
-class FullAdder extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 2)
- val b = UInt(INPUT, 2)
- val cin = UInt(INPUT, 2)
- val sum = UInt(OUTPUT, 2)
- val cout = UInt(OUTPUT, 2)
- }
- // Generate the sum
- val a_xor_b = io.a ^ io.b
- io.sum := a_xor_b ^ io.cin
- // Generate the carry
- val a_and_b = io.a & io.b
- val b_and_cin = io.b & io.cin
- val a_and_cin = io.a & io.cin
- io.cout := a_and_b | b_and_cin | a_and_cin
-}
-\end{scala}
-
-As a result, the Chisel compiler should infer each of the intermediate values \verb+a_xor_b, a_and_b, b_and_cin,+ and \verb+a_and_cin+ are two bits wide. An inspection of the Verilog code correctly shows that Chisel inferred each of the intermediate wires in the calculation to be 2 bits wide.
-
-\begin{bash}
-module FullAdder(
- input [1:0] io_a,
- input [1:0] io_b,
- input [1:0] io_cin,
- output[1:0] io_sum,
- output[1:0] io_cout);
-
- wire[1:0] T0;
- wire[1:0] a_and_cin;
- wire[1:0] T1;
- wire[1:0] b_and_cin;
- wire[1:0] a_and_b;
- wire[1:0] T2;
- wire[1:0] a_xor_b;
-
- assign io_cout = T0;
- assign T0 = T1 | a_and_cin;
- assign a_and_cin = io_a & io_cin;
- assign T1 = a_and_b | b_and_cin;
- assign b_and_cin = io_b & io_cin;
- assign a_and_b = io_a & io_b;
- assign io_sum = T2;
- assign T2 = a_xor_b ^ io_cin;
- assign a_xor_b = io_a ^ io_b;
-endmodule
-\end{bash}
-
-\section{Using Registers}
-
-Unlike Verilog, specifying a register in Chisel tells the compiler to actually generate a positive edge triggered register. In this section we explore how to instantiate registers in Chisel by constructing a shift register.
-
-In Chisel, when you instantiate a register there are several ways to specify the connection of the input to a register. As shown in the GCD example, you can "declare" the register and assign what it's input is connected to in a \verb+when...+ block or you can simply pass the value that the register is clocking as a parameter to the register.
-
-If you choose to pass a next value to the register on construction using the \verb+next+ named parameter, it will clock the new value every cycle unconditionally:
-
-\begin{scala}
-// Clock the new register value on every cycle
-val y = io.x
-val z = Reg(next = y)
-\end{scala}
-
-If we only want to update if certain conditions are met we use a \verb+when+ block to indicate that the registers are only updated when the condition is satisfied:
-
-\begin{scala}
-// Clock the new register value when the condition a > b
-val x = Reg(UInt())
-when (a > b) { x := y }
-.elsewhen ( b > a) {x := z}
-.otherwise { x := w}
-\end{scala}
-
-It is important to note that when using the conditional method, the values getting assigned to the input of the register match the type and bitwidth of the register you declared. In the unconditional register assignment, you do not need to do this as Chisel will infer the type and width from the type and width of the input value.
-
-The following sections show how these can be used to construct a shift register.
-
-\subsection{Unconditional Register Update}
-
-Suppose we want to construct a basic 4 bit shift register that takes a serial input \verb+in+ and generates a serial output \verb+out+. For this first example we won't worry about a parallel load signal and will assume the shift register is always enabled. We also will forget about the register reset signal.
-
-If we instantiate and connect each of these 4 registers explicitly, our Chisel code will look something like:
-
-\begin{scala}
-class ShiftRegister extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val out = UInt(OUTPUT, 1)
- }
- val r0 = Reg(next = io.in)
- val r1 = Reg(next = r0)
- val r2 = Reg(next = r1)
- val r3 = Reg(next = r2)
- io.out := r3
-}
-\end{scala}
-
-If we take a look at the generated Verilog, we will see that Chisel did indeed map our design to a shift register. One thing to notice is that the clock signal and reset signals are implicitly attached to our design.
-
-\begin{bash}
-module ShiftRegister(input clk, input reset,
- input io_in,
- output io_out);
-
- reg[0:0] r3;
- reg[0:0] r2;
- reg[0:0] r1;
- reg[0:0] r0;
-
- assign io_out = r3;
- always @(posedge clk) begin
- r3 <= r2;
- r2 <= r1;
- r1 <= r0;
- r0 <= io_in;
- end
-endmodule
-\end{bash}
-
-\subsection{Conditional Register Update}
-
-As mentioned earlier, Chisel allows you to conditionally update a register (use an enable signal) using the \verb+when+, \verb+.elsewhen+, \verb+.otherwise+ block. Suppose we add an enable signal to our shift register, that allows us to control whether data is shift in and out on a given cycle depending on an \verb+enable+ input signal. The new shift register now looks like:
-
-\begin{scala}
-class ShiftRegister extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val enable = Bool(INPUT)
- val out = UInt(OUTPUT, 1)
- }
-
- val r0 = Reg(UInt())
- val r1 = Reg(UInt())
- val r2 = Reg(UInt())
- val r3 = Reg(UInt())
-
- when (io.enable) {
- r0 := io.in
- r1 := r0
- r2 := r1
- r3 := r2
- }
- io.out := r3
-}
-\end{scala}
-
-Notice that it is not necessary to specify an \verb+.otherwise+ condition as Chisel will correctly infer that the old register value should be preserved otherwise.
-
-\subsection{Register Reset}
-
-Chisel allows you to specify a synchronous reset to a certain value by specifying an additional parameter when you first declare them. In our shift register, let's add a reset capability that resets all the register values to zero synchronously. To do this we need to provide our register declarations a little more information using the \verb+init+ parameter with what value we want on a synchronous reset:
-
-\begin{scala}
-class ShiftRegister extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val enable = Bool(INPUT)
- val out = UInt(OUTPUT, 1)
- }
- // Register reset to zero
- val r0 = Reg(init = UInt(0, width = 1))
- val r1 = Reg(init = UInt(0, width = 1))
- val r2 = Reg(init = UInt(0, width = 1))
- val r3 = Reg(init = UInt(0, width = 1))
- when (io.enable) {
- r0 := io.in
- r1 := r0
- r2 := r1
- r3 := r2
- }
- io.out := r3
-}
-\end{scala}
-
-Notice that reset value can actually be any value, simply replace the zeros and width to appropriate values.
-
-Chisel also has an implict global \verb+reset+ signal that you can use in a \verb+when+ block. The reset signal is conveniently called \verb+reset+ and does not have to be declared. The shift register using this implict global reset now looks like:
-
-\begin{scala}
-class ShiftRegister extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val enable = Bool(INPUT)
- val out = UInt(OUTPUT, 1)
- }
- val r0 = Reg(UInt())
- val r1 = Reg(UInt())
- val r2 = Reg(UInt())
- val r3 = Reg(UInt())
- when(reset) {
- r0 := UInt(0)
- r1 := UInt(0)
- r2 := UInt(0)
- r3 := UInt(0)
- } .elsewhen(io.enable) {
- r0 := io.in
- r1 := r0
- r2 := r1
- r3 := r2
- }
- io.out := r3
-}
-\end{scala}
-
-This will generate slightly different looking Verilog source code but will still function the same as the previous implementation of the shift register with reset.
-
-\subsection{\problem{Sequential Circuit}}
-
-The following exercises can be found in your
-\verb+$TUT_DIR/problems/+ folder. You will find that some parts of
-the tutorial files have been completed for you and the section that
-you need to will need to complete is indicated in the file. The
-solutions to each of these exercises can be found in the
-\verb+$TUT_DIR/solutions/+ folder.
-
-The first tutorial problem is to write write a sequential circuit that sums \verb+in+ values.
-You can find the template in \verb+$TUT_DIR/problems/Accumulator.scala+ including a stubbed out version of the circuit:
-\begin{scala}
-class Accumulator extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 1)
- val out = UInt(OUTPUT, 8)
- }
-
- // flush this out ...
-
- io.out := UInt(0)
-}
-\end{scala}
-
-\noindent
-and a complete tester that confirms that you have successfully designed the circuit. Run
-
-\begin{bash}
-make Accumulator.out
-\end{bash}
-
-\noindent
-until your circuit passes the tests.
-
-
-%\subsection{Creating a Two Input Multiplexor}
-%
-%
-%
-%\subsection{Creating a Simple FIFO}
-%
-%
-%
diff --git a/doc/getting-started/basics.tex b/doc/getting-started/basics.tex
deleted file mode 100644
index 7c129bec..00000000
--- a/doc/getting-started/basics.tex
+++ /dev/null
@@ -1,58 +0,0 @@
-\documentclass[twocolumn, 10pt]{article}
-\setlength\textwidth{6.875in}
-\setlength\textheight{8.875in}
-% set both margins to 2.5 pc
-\setlength{\oddsidemargin}{-0.1875in}% 1 - (8.5 - 6.875)/2
-\setlength{\evensidemargin}{-0.1875in}
-\setlength{\marginparwidth}{0pc}
-\setlength{\marginparsep}{0pc}%
-\setlength{\topmargin}{0in} \setlength{\headheight}{0pt}
-\setlength{\headsep}{0pt}
-\setlength{\footskip}{37pt}%
-%\setlength{\columnsep}{0.3125in}
-%\setlength{\columnwidth}{3.28125in}% (6.875 - 0.3125)/2 = 3.28125in
-\setlength{\parindent}{1pc}
-\newcommand{\myMargin}{1.00in}
-\usepackage[top=\myMargin, left=\myMargin, right=\myMargin, bottom=\myMargin, nohead]{geometry}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{hyperref}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-
-\lstset{basicstyle={\footnotesize\ttfamily}}
-
-\newenvironment{commentary}
-{ \vspace{-0.1in}
- \begin{quotation}
- \noindent
- \small \em
- \rule{\linewidth}{1pt}\\
-}
-{
- \end{quotation}
-}
-
-\title{Getting Started: Tutorial 01 - The Basics}
-\author{Jonathan Bachrach, Vincent Lee \\
-EECS Department, UC Berkeley\\
-{\tt \{jrb\}@eecs.berkeley.edu}
-}
-\date{\today}
-
-\newenvironment{example}{\VerbatimEnvironment\begin{footnotesize}\begin{Verbatim}}{\end{Verbatim}\end{footnotesize}}
-\newcommand{\kode}[1]{\begin{footnotesize}{\tt #1}\end{footnotesize}}
-
-\def\code#1{{\tt #1}}
-
-\def\note#1{\noindent{\bf [Note: #1]}}
-%\def\note#1{}
-
-\begin{document}
-\maketitle{}
-
-\input{basics-guts}
-
-\end{document}
diff --git a/doc/getting-started/bits-guts.tex b/doc/getting-started/bits-guts.tex
deleted file mode 100644
index 1bfb26d9..00000000
--- a/doc/getting-started/bits-guts.tex
+++ /dev/null
@@ -1,320 +0,0 @@
-\section{Chisel Assignments and Reassignments}
-
-When you first define a value in Chisel, we use the \verb+=+ operator in order to tell Chisel to allocate the value for the first time. On every subsequent reassignment to the value, we must use a \verb+:=+ when reassigning the value.
-
-Since we are constructing a digital circuit, the notion of reassignment does not make much sense since connections between circuit nodes only need to be specified once. However, there are some cases when we will need to perform reassignment to a value in Chisel since it is compiled sequentially unlike Verilog. Thus it may be necessary to perform reassignment when a value or connection is not known until later in the Chisel source.
-
-A simple example of when reassignment is necessary is in the construction of the top level I/O for your module; the values of the output are not immediately known at the time of declaration.
-
-Consider the simple \verb+FullAdder+ circuit from previous tutorial that determines the sum \verb+sum+ and carry out \verb+cout+ given two values \verb+a+ and \verb+b+, and a carry in \verb+cin+.
-
-\begin{scala}
-class FullAdder extends Module {
- val io = new Bundle {
- // first definition of io values so use =
- val a = UInt(INPUT, 1)
- val b = UInt(INPUT, 1)
- val cin = UInt(INPUT, 1)
- val sum = UInt(OUTPUT, 1)
- val cout = UInt(OUTPUT, 1)
- }
- // Generate the sum
- val a_xor_b = io.a ^ io.b
- // Reassignment to io.sum so use :=
- io.sum := a_xor_b ^ io.cin
- // Generate the carry
- val a_and_b = io.a & io.b
- val b_and_cin = io.b & io.cin
- val a_and_cin = io.a & io.cin
- // reassignment to io.cout so use :=
- io.cout := a_and_b | b_and_cin | a_and_cin
-}
-\end{scala}
-
-In this example we make sure to use the \verb+:=+ reassignment for the \verb+io.sum+ and \verb+io.cout+ output values because we only know what they're values are later in the code and not at the time of construction of the \verb+io+ Bundle. All other values in this example use the \verb+=+ assignment operator since they need to be created.
-
-In general, the rule of thumb is to use the reassignment operator \verb+:=+ if the value already has been assigned by the \verb+=+ operator, otherwise the \verb+=+ operator should be used. Note that if you do not use the \verb+=+ or \verb+:=+ operators correctly you will get an error when you try and compile your design.
-
-\section{The Chisel UInt Class}
-
-In the previous examples we have been using the UInt type which is an unsigned integer as the type for all of our values. For many of the basic computations in Chisel the UInt class is sufficient.\footnote{The UInt class definition for Chisel can be found in the /chisel/src/main folder in the compiler source repository, not the chisel-tutorial. You can obtain the Chisel source by cloning https://github.com/ucb-bar/chisel.git} The following example shows some of the commonly used UInt operations in the context of a simple \verb+ALU+\footnote{We ignore overflow and underflow in this example.}:
-
-\begin{scala}
-class BasicALU extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 4)
- val b = UInt(INPUT, 4)
- val opcode = UInt(INPUT, 4)
- val output = UInt(OUTPUT, 4)
- }
- io.output := UInt(0)
- when (io.opcode === UInt(0)) {
- io.output := io.a // pass A
- } .elsewhen (io.opcode === UInt(1)) {
- io.output := io.b // pass B
- } .elsewhen (io.opcode === UInt(2)) {
- io.output := io.a + UInt(1) // inc A by 1
- } .elsewhen (io.opcode === UInt(3)) {
- io.output := io.a - UInt(1) // inc B by 1
- } .elsewhen (io.opcode === UInt(4)) {
- io.output := io.a + UInt(4) // inc A by 4
- } .elsewhen (io.opcode === UInt(5)) {
- io.output := io.a - UInt(4) // dec A by 4
- } .elsewhen (io.opcode === UInt(6)) {
- io.output := io.a + io.b // add A and B
- } .elsewhen (io.opcode === UInt(7)) {
- io.output := io.a - io.b // sub B from A
- } .elsewhen (io.opcode === UInt(8)) {
- io.output := (io.a < io.b) // set on A < B
- } .otherwise {
- io.output := (io.a === io.b) // set on A == B
- }
-}
-\end{scala}
-
-You will notice that there are multiple reassignments to \verb+io.output+ inside a \verb+when+ block which indicates that the value of \verb+io.output+ can take many different values depending on the \verb+io.opcode+ in this example. Also notice that in order to specify constants to add to our operands, we must also specify them as a UInt type as UInt operations on different type operands is not allowed.
-
-\begin{scala}
-// Specify that 1 is a UInt type
-io.output := io.a + UInt(1)
-\end{scala}
-
-A list of commonly used UInt operations is given in the table below:
-
-\begin{center}
-\begin{tabular}{| l | l | l | }
-\hline
-{\bf Operand} & {\bf Operation} & {\bf Output Type} \\ \hline
-+ & Add & UInt \\ \hline
-- & Subtract & UInt \\ \hline
-$\ast$ & Multiply & UInt \\ \hline
-/ & UInt Divide & UInt \\ \hline
-% & Modulo & UInt \\ \hline
-\~\ & Bitwise Negation & UInt \\ \hline
-\^\ & Bitwise XOR & UInt\\ \hline
-\& & Bitwise AND & UInt \\ \hline
- | & Bitwise OR & Bool \\ \hline
-=== & Equal & Bool \\ \hline
-!= & Not Equal & Bool \\ \hline
-> & Greater & Bool \\ \hline
-< & Less & Bool \\ \hline
->= & Greater or Equal & Bool \\ \hline
-<= & Less or Equal & Bool \\ \hline
-\end{tabular}
-\end{center}
-
-% Notice that the comparisons for the UInt type give you a Bool type back. In order to be able to assign the output of a comparison to a UInt type, we will need to cast the Bool to a UInt before the assignment. This is shown in the \verb+BasicALU+ example in the \verb+.otherwise+ block:
-%
-% \begin{scala}
-% io.output := (io.a === io.b).toUInt() // set on A == B
-% \end{scala}
-%
-% If we you do not cast the resulting Bool to a UInt the Chisel compiler will return an error.
-
-\subsection{Bit Extraction}
-
-The UInt class allows you to extract bits based on their index of their representation. Given an \verb+n+ bit wide value \verb+value+ we can extract the bits \verb+x+ through \verb+y+ (n > x > y >= 0) by simply doing the following:
-
-\begin{scala}
-// extracts the x through y bits of value
-val x_to_y = value(x, y)
-\end{scala}
-
-Note that the higher index is specified first in the argument list when extraction the bits. Also notice that the bits in the UInt are zero indexed so the highest bit that can be extracted from an \verb+n+ bit wide value is \verb+n-1+.
-
-If you just want to extract a single bit from the value, say bit \verb+x+ we simply need to specify a single index instead as follows:
-\begin{scala}
-// extract the x-th bit from value
-val x_of_value = value(x)
-\end{scala}
-
-A more concrete example of bit extraction in action is shown below. In this example, based on the value of the offset, we would like to select a byte from a word which is a common operation when loading a byte from word addressed memories:
-
-\begin{scala}
-class ByteSelector extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 32)
- val offset = UInt(INPUT, 2)
- val out = UInt(OUTPUT, 8)
- }
- io.out := UInt(0, width = 8)
- when (io.offset === UInt(0)) {
- io.out := io.in(7,0) // pull out lowest byte
- } .elsewhen (io.offset === UInt(1)) {
- io.out := io.in(15,8) // pull out second byte
- } .elsewhen (io.offset === UInt(2)) {
- io.out := io.in(23,16) // pull out third byte
- } .otherwise {
- io.out := io.in(31,24) // pull out highest byte
- }
-}
-\end{scala}
-
-\subsection{Bit Concatenation}
-
-Chisel also allows you to easily concatenate bits together using \verb+Cat+. Suppose you have a data bus that you would like to drive with two seperate words \verb+A+ and \verb+B+. In order to concatenate these two values together we simply say:
-
-\begin{scala}
-val A = UInt(width = 32)
-val B = UInt(width = 32)
-val bus = Cat(A, B) // concatenate A and B
-\end{scala}
-
-Again, the first argument to \verb+Cat+ will be placed in the high part while the second argument gets the low part of \verb+bus+. Thus for this example bits 0 to 31 of \verb+bus+ correspond to \verb+B+, while bits 32 to 63 correspond to \verb+A+.
-
-\subsection{\problem{LFSR16}}
-
-In this assignment, write the \verb+LFSR16+ circuit as shown below:
-
-\begin{center}
-\includegraphics[width=0.9\columnwidth]{../bootcamp/figs/LFSR16.pdf}
-\end{center}
-
-\noindent
-by filling in the following module:
-
-\begin{scala}
-class LFSR16 extends Module {
- val io = new Bundle {
- val inc = Bool(INPUT)
- val out = UInt(OUTPUT, 16)
- }
- // ...
- io.out := UInt(0)
-}
-\end{scala}
-
-\noindent
-found in \verb+$TUT_DIR/problems/LFSR16.scala+.
-Make sure to define and initialize an internal register to one and
-update it when \verb+inc+ is asserted.
-Use bit concatentation and bit extraction
-in conjunction with the xor operator \verb+^+. Run
-
-\begin{bash}
-make LFSR16.out
-\end{bash}
-
-\noindent
-until your circuit passes the tests.
-
-\subsection{UInt Operation Bit Inference}
-
-Note that for some operations such as addition and multiplication, that number of resulting bits of the computation can be greater than the number of bits for the operands.
-
-Consider the following example where we multiply two 16 bit numbers \verb+A+ and \verb+B+ together. Note that the product of two 16 bit numbers is at worst 32 bits wide.
-
-\begin{scala}
-class HiLoMultiplier() extends Module {
- val io = new Bundle {
- val A = UInt(INPUT, 16)
- val B = UInt(INPUT, 16)
- val Hi = UInt(OUTPUT, 16)
- val Lo = UInt(OUTPUT, 16)
- }
- val mult = io.A * io.B
- io.Lo := mult(15, 0)
- io.Hi := mult(31, 16)
-}
-
-\end{scala}
-
-Notice that we never specify the width of the value \verb+mult+ anywhere in the Chisel source. Normally if we performed this in Verilog we would have had to specify the width beforehand. But a look at the generated Verilog for this example shows that Chisel correctly inferred the \verb+mult+ value to be 32 bits wide:
-
-\begin{scala}
-module HiLoMultiplier(
- input [15:0] io_A,
- input [15:0] io_B,
- output[15:0] io_Hi,
- output[15:0] io_Lo);
-
- wire[15:0] T0;
- wire[31:0] mult; // Chisel infers this to be 32 bits
- wire[15:0] T1;
-
- assign io_Lo = T0;
- assign T0 = mult[4'hf:1'h0];
- assign mult = io_A * io_B;
- assign io_Hi = T1;
- assign T1 = mult[5'h1f:5'h10];
-endmodule
-
-\end{scala}
-
-As we get to more complicate designs, it will become more clear that bit inference in Chisel is a very powerful feature that makes constructing hardware more efficient. A list of common bit inferences is shown below for commonly used operations:
-
-\begin{center}
-\begin{tabular}{| l | l | l | }
-\hline
-{\bf Operation} & {\bf Result Bit Width} \\ \hline
-\verb!Z = X + Y! & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = X - Y+ & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = X & Y+ & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = X | Y+ & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = X ^ Y+ & max(Width(X), Width(Y)) \\ \hline
-\verb+Z = ~X+ & Width(X) \\ \hline
-\verb+Z = Mux(C, X, Y)+ & max(Width(X), Width (Y)) \\ \hline
-\verb+Z = X * Y+ & Width(X) + Width(Y) \\ \hline
-\verb+Z = X << n+ & Width(X) + n \\ \hline
-\verb+Z = X >> n+ & Width(X) - n \\ \hline
-\verb+Z = Cat(X, Y)+ & Width(X) + Width(Y) \\ \hline
-\verb+Z = Fill(n, x)+ & Width(X) + n \\ \hline
-\end{tabular}
-\end{center}
-
-\section{The Chisel Bool Class}
-
-The Bool class in Chisel is used to represent the result of logical expressions and takes either the values \verb+true+ or \verb+false+. These can be used in conditional statements such as \verb+when+ blocks.
-
-\begin{scala}
-val change = io.a === io.b // change gets Bool type
-when (change) { // exec if change is true
- ...
-} .otherwise {
- ...
-}
-\end{scala}
-
-You can instantiate a Bool value like this:
-
-\begin{scala}
-val true_value = Bool(true)
-val false_value = Bool(false)
-\end{scala}
-
-% As shown in the \verb+BasicALU+ example, in order to use a Bool value as a UInt type and assign it to an output, a cast to UInt is required.
-
-\section{Casting Between Types}
-
-When assigning values, it is required that you assign a value of the same type. For instance, if you try to assign a Bool type to an output value that is expecting a UInt type, you will get an error.
-
-\begin{scala}
- ...
- val io = new Bundle {
- val in = UInt(INPUT, 2)
- val out = UInt(OUTPUT, 1)
- }
- // attempted Bool assignment to UInt
- io.out := (in === UInt(0))
- ...
-\end{scala}
-
-The correct way to perform the intended operation is to cast the resulting Bool type to a UInt using the \verb+toUInt()+ cast. The correct Chisel code will look like:
-
-\begin{scala}
- ...
- val io = new Bundle {
- val in = UInt(INPUT, 2)
- val out = UInt(OUTPUT, 1)
- }
- io.out := (in === UInt(0)).toUInt() // UInt cast
- ...
-\end{scala}
-
-Some of the common casts that you may use are:
-
-\begin{itemize}
-\item toUInt()
-\item toSInt()
-\item toBool()
-\end{itemize}
diff --git a/doc/getting-started/bits.tex b/doc/getting-started/bits.tex
deleted file mode 100644
index f6e04ffd..00000000
--- a/doc/getting-started/bits.tex
+++ /dev/null
@@ -1,60 +0,0 @@
-\documentclass[twocolumn, 10pt]{article}
-\setlength\textwidth{6.875in}
-\setlength\textheight{8.875in}
-% set both margins to 2.5 pc
-\setlength{\oddsidemargin}{-0.1875in}% 1 - (8.5 - 6.875)/2
-\setlength{\evensidemargin}{-0.1875in}
-\setlength{\marginparwidth}{0pc}
-\setlength{\marginparsep}{0pc}%
-\setlength{\topmargin}{0in} \setlength{\headheight}{0pt}
-\setlength{\headsep}{0pt}
-\setlength{\footskip}{37pt}%
-%\setlength{\columnsep}{0.3125in}
-%\setlength{\columnwidth}{3.28125in}% (6.875 - 0.3125)/2 = 3.28125in
-\setlength{\parindent}{1pc}
-\newcommand{\myMargin}{1.00in}
-\usepackage[top=\myMargin, left=\myMargin, right=\myMargin, bottom=\myMargin, nohead]{geometry}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{hyperref}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-
-\lstset{basicstyle={\footnotesize\ttfamily}}
-
-\newenvironment{commentary}
-{ \vspace{-0.1in}
- \begin{quotation}
- \noindent
- \small \em
- \rule{\linewidth}{1pt}\\
-}
-{
- \end{quotation}
-}
-
-\title{Getting Started - Tutorial 02: Basic Types and Operations}
-\author{Jonathan Bachrach, Vincent Lee \\
-EECS Department, UC Berkeley\\
-{\tt \{jrb\}@eecs.berkeley.edu}
-}
-\date{\today}
-
-\newenvironment{example}{\VerbatimEnvironment\begin{footnotesize}\begin{Verbatim}}{\end{Verbatim}\end{footnotesize}}
-\newcommand{\kode}[1]{\begin{footnotesize}{\tt #1}\end{footnotesize}}
-
-\def\code#1{{\tt #1}}
-
-\def\note#1{\noindent{\bf [Note: #1]}}
-%\def\note#1{}
-
-\begin{document}
-\maketitle{}
-
-% Bits has been deprecated and therefore section has been removed from this document. Older commits may have Bits section somewhere.
-
-\input{bits-guts}
-
-\end{document}
diff --git a/doc/getting-started/debugging-guts.tex b/doc/getting-started/debugging-guts.tex
deleted file mode 100644
index a22f30fe..00000000
--- a/doc/getting-started/debugging-guts.tex
+++ /dev/null
@@ -1,82 +0,0 @@
-\section{Debugging Designs}
-
-Chisel provides a number of mechanisms for debugging your designs.
-A designer can format and print out strings to display signals over time.
-Runtime assertions can be declared with the \verb+assert+ construct.
-Circuits can be displayed with the dot backend.
-Complete signal values can be dumped over time in VCD format.
-Finally, circuits can be interacted with the debug API.
-
-\section{Printf and Sprintf}
-
-Chisel provides the ability to format and print strings for debugging
-purposes. The \code{printf} and \code{sprintf} construct are similar to their
-C namesakes: they take a format string and a variable number of arguments,
-then print or return a string, respectively. During simulation, \code{printf}
-prints the formatted string to the console on rising clock edges.
-\code{sprintf}, on the other hand, returns the formatted string as a bit
-vector.
-
-Supported format specifiers are \code{\%b} (binary number), \code{\%d}
-(decimal number), \code{\%x} (hexadecimal number), and \code{\%s} (string
-consisting of a sequence of 8-bit extended ASCII characters). (\code{\%\%}
-specifies a literal \code{\%}.) Unlike in C, there are no width modifiers: the
-bit width of the corresponding argument determines the width in the string
-representation.
-
-The following example prints the line \code{"0x4142 16706 AB"} on cycles when
-\code{c} is true:
-
-\begin{scala}
-val x = Bits(0x4142)
-val s1 = sprintf("%x %s", x, x);
-when (c) { printf("%d %s\n", x, s1); }
-\end{scala}
-
-\section{Assert}
-
-Runtime assertions are provided by the \code{assert} construct. During
-simulation, if an assertion's argument is false on a rising clock edge,
-an error is printed and simulation terminates. For example, the following
-will terminate simulation after ten clock cycles:
-
-\begin{scala}
-val x = Reg(init = UInt(0, 4))
-x := x + UInt(1)
-assert(x < UInt(10))
-\end{scala}
-
-\section{Circuit Graph Visualization}
-
-In Chisel, circuits are constructed using a textual program.
-Sometimes it is useful to see the constructed circuit graph.
-Users can produce at dot graph file viewable by vizgraph using the dot backend.
-
-\todo{finish examples below}
-
-\begin{scala}
-chiselMain ... --backend dot ...
-\end{scala}
-
-\begin{bash}
-vizgraph -pdf test.dot
-\end{bash}
-
-\section{VCD Dumps}
-
-One powerfully way of debugging is by saved the values of all signals and state over time.
-Chisel supports this by running circuits under test while
-dumping \verb+VCD+ (Value Change Dump) files using the \verb+--vcd+ option:
-
-\begin{bash}
-chiselMainTest ... --vcd ...
-\end{bash}
-
-These VCD files can then viewed using either commercial waveform viewers like \verb+VCS+ or open source ones like \verb+gtkwave+.
-
-\todo{picture of waveform}
-
-% \section{Debug API}
-%
-% For those that want lower level control over their designs,
-% they can drive their circuits through a low level debug API.
diff --git a/doc/getting-started/figs/4_Bit_Adder.jpg b/doc/getting-started/figs/4_Bit_Adder.jpg
deleted file mode 100644
index 547960ef..00000000
Binary files a/doc/getting-started/figs/4_Bit_Adder.jpg and /dev/null differ
diff --git a/doc/getting-started/figs/Full_Adder.jpg b/doc/getting-started/figs/Full_Adder.jpg
deleted file mode 100644
index 146b565c..00000000
Binary files a/doc/getting-started/figs/Full_Adder.jpg and /dev/null differ
diff --git a/doc/getting-started/getting-started.tex b/doc/getting-started/getting-started.tex
deleted file mode 100644
index 18cb457d..00000000
--- a/doc/getting-started/getting-started.tex
+++ /dev/null
@@ -1,85 +0,0 @@
-\documentclass[twocolumn, 10pt]{book}
-\setlength\textwidth{6.875in}
-\setlength\textheight{8.5in}
-% set both margins to 2.5 pc
-\setlength{\oddsidemargin}{-0.1875in}% 1 - (8.5 - 6.875)/2
-\setlength{\evensidemargin}{-0.1875in}
-\setlength{\marginparwidth}{0pc}
-\setlength{\marginparsep}{0pc}%
-\setlength{\footskip}{37pt}%
-\setlength{\columnsep}{0.25in}
-%\setlength{\columnwidth}{3.28125in}% (6.875 - 0.3125)/2 = 3.28125in
-\setlength{\parindent}{1pc}
-\newcommand{\myMargin}{1.00in}
-\setlength{\topmargin}{0pt}
-\setlength{\headheight}{22pt}
-\setlength{\headsep}{20pt}
-\usepackage[top=\myMargin, left=\myMargin, right=\myMargin, bottom=\myMargin]{geometry}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{hyperref}
-\usepackage[svgnames]{xcolor}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-
-\lstset{basicstyle={\footnotesize\ttfamily}}
-
-\newenvironment{commentary}
-{ \vspace{-0.1in}
- \begin{quotation}
- \noindent
- \small \em
- \rule{\linewidth}{1pt}\\
-}
-{
- \end{quotation}
-}
-
-\title{Getting Started with Chisel}
-\author{Jonathan Bachrach, Vincent Lee \\
-EECS Department, UC Berkeley\\
-{\tt \{jrb\}@eecs.berkeley.edu}
-}
-\date{\today}
-
-\newenvironment{example}{\VerbatimEnvironment\begin{footnotesize}\begin{Verbatim}}{\end{Verbatim}\end{footnotesize}}
-\newcommand{\kode}[1]{\begin{footnotesize}{\tt #1}\end{footnotesize}}
-
-\definecolor{RED}{rgb}{1,0,0}
-\def\red#1{{\color{red}#1}}
-\def\problem#1{{\red{#1 Problem}}}
-\def\code#1{{\tt #1}}
-
-\def\note#1{\noindent{\bf [Note: #1]}}
-%\def\note#1{}
-
-\begin{document}
-\maketitle{}
-
-\chapter{Chisel Installation}
-\input{installation-guts}
-
-\chapter{The Basics}
-\input{basics-guts}
-
-\chapter{Basic Types and Operations}
-\input{bits-guts}
-
-\chapter{Instantiating Modules}
-\input{modules-guts}
-
-\chapter{Writing Scala Testbenches}
-\input{testing-guts}
-
-\chapter{Creating Your Own Project}
-\input{projects-guts}
-
-\chapter{Conditional Assignments and Memories}
-\input{state-guts}
-
-\chapter{Scripting Hardware Generation}
-\input{scripting-guts}
-
-\end{document}
diff --git a/doc/getting-started/installation-guts.tex b/doc/getting-started/installation-guts.tex
deleted file mode 100644
index bc96261a..00000000
--- a/doc/getting-started/installation-guts.tex
+++ /dev/null
@@ -1,101 +0,0 @@
-\section{Introduction}
-
-This chapter is an installation guide for {\em Chisel} (Constructing
-Hardware In a Scala Embedded Language) and is intended to prepare your system for subsequent tutorials. Chisel is a hardware
-construction language embedded in the high-level programming language
-Scala.
-
-\subsection{Development Tool Installation}
-
-If you are running Mac or a variant of Linux, you will need to install the appropriate tools for your OS, which are described in the following sections:
-
-\subsubsection{MacOSX}
-
-\begin{enumerate}
-\item Install XCODE, including console tools.
-\end{enumerate}
-
-\subsubsection{Linux}
-
-Install the following packages:
-
-\begin{enumerate}
-\item \verb|g++-4.8|
-\item \verb+openjdk-7-jre+
-\end{enumerate}
-
-\noindent
-using
-
-\begin{bash}
-sudo apt-get install
-\end{bash}
-
-\section{Setting Up the Tutorial}
-
-In subsequent tutorials, you will be using the files distributed in the chisel-tutorial repository. To obtain these tutorials files, \verb+cd+ to the directory = \verb+$DIR+ where you want to place the Chisel tutorial and type:
-
-\begin{bash}
-cd $DIR
-git clone https://github.com/ucb-bar/chisel-tutorial.git
-\end{bash}
-
-\noindent
-Your copy of the Chisel Tutorial repository will then be in \verb+$DIR/chisel-tutorial+. Define this as a variable in your bash environment named \verb+$TUT_DIR+.
-
-This is the Chisel tutorial directory structure you should see, which is explained more in the next tutorial:
-
-\begin{bash}
-chisel-tutorial/
- Makefile
- examples/
- Makefile
- build.sbt
- Accumulator.scala ...
- problems/
- Makefile
- build.sbt
- Counter.scala ...
- solutions/
- Makefile
- build.sbt
- Counter.scala ...
-\end{bash}
-
-\noindent
-
-The following tutorials will explain features of Chisel by presenting source code examples. The repository is split into examples, problems, and solutions, where the problems have some piece of the design for you to fill out and where the examples and solutions are meant to be complete designs that should pass the given tests. In order to run either, you simply need to change directory into the appropriate subdirectory and type \verb+make+ of the particular lesson name. We will use the repository to first test out if your machine is set up to use Chisel.
-
-To test your Chisel distribution and verify that your system contains all the correct tools, run the following commands:
-
-\begin{bash}
-cd $TUT_DIR/examples
-make Parity.out
-\end{bash}
-
-This will run a test build and will take a minute before it completes. If your system is set up correctly, you should see a messsage \verb+[success]+ followed by the total time of the run, and date and time of completion. If you see a success than your system has been set up correctly and you can continute to the next tutorial where we will explain more about the basics of Chisel.
-
-\section{The Tutorials}
-
-For these tutorials, we assume basic knowledge of digital circuits and blocks.
-Tutorial 1 will guide you through a quick compilation of the emulator and Verilog generation, and explain some basic constructs such as register and combinational logic.
-Tutorial 2 will explain the basics of Chisel.
-Tutorial 3 will explain how to use basic primitive types and logical operations that are used in Chisel and how to use them in context of several examples.
-Tutorial 4 will explain how to instantiate components and apply parametrization.
-Tutorial 5 will explain how to use the Chisel test harness.
-Tutorial 6 will explain how to set up your own Chisel project and how to build it.
-Tutorial 7 will revisit conditional register updates and explain how to construct memories.
-Finally, tutorial 8 will introduce how to use Scala constructs such as \verb+if...else+ and \verb+for+ loops.
-
-Along the way there are assignments highlighted with \red{red} titles.
-These assignments are built around files in the tutorial problems directory.
-In order to check successful completion of the entire set of getting started assignments run:
-\begin{bash}
-cd $TUT_DIR/problems
-make getting-started
-\end{bash}
-
-\noindent
-until no error appears.
-
-The following set of tutorials were written using the build settings Scala version 2.11 and Chisel version 2.2.
diff --git a/doc/getting-started/installation.tex b/doc/getting-started/installation.tex
deleted file mode 100644
index 3b936401..00000000
--- a/doc/getting-started/installation.tex
+++ /dev/null
@@ -1,89 +0,0 @@
-\documentclass[twocolumn, 10pt]{article}
-\setlength\textwidth{6.875in}
-\setlength\textheight{8.875in}
-% set both margins to 2.5 pc
-\setlength{\oddsidemargin}{-0.1875in}% 1 - (8.5 - 6.875)/2
-\setlength{\evensidemargin}{-0.1875in}
-\setlength{\marginparwidth}{0pc}
-\setlength{\marginparsep}{0pc}%
-\setlength{\topmargin}{0in} \setlength{\headheight}{0pt}
-\setlength{\headsep}{0pt}
-\setlength{\footskip}{37pt}%
-%\setlength{\columnsep}{0.3125in}
-%\setlength{\columnwidth}{3.28125in}% (6.875 - 0.3125)/2 = 3.28125in
-\setlength{\parindent}{1pc}
-\newcommand{\myMargin}{1.00in}
-\usepackage[top=\myMargin, left=\myMargin, right=\myMargin, bottom=\myMargin, nohead]{geometry}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{hyperref}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-
-\lstset{basicstyle={\footnotesize\ttfamily}}
-
-\newenvironment{commentary}
-{ \vspace{-0.1in}
- \begin{quotation}
- \noindent
- \small \em
- \rule{\linewidth}{1pt}\\
-}
-{
- \end{quotation}
-}
-
-% \newenvironment{kode}%
-% {\footnotesize
-% %\setlength{\parskip}{0pt}
-% %\setlength{\topsep}{0pt}
-% %\setlength{\partopsep}{0pt}
-% \verbatim}
-% {\endverbatim
-% %\vspace*{-0.1in}
-% }
-
-% \newenvironment{kode}%
-% {\VerbatimEnvironment
-% \footnotesize\begin{Sbox}\begin{minipage}{6in}\begin{Verbatim}}%
-% {\end{Verbatim}\end{minipage}\end{Sbox}
-% \setlength{\fboxsep}{8pt}\fbox{\TheSbox}}
-
-% \newenvironment{kode}
-% {\begin{Sbox}
-% \footnotesize
-% \begin{minipage}{6in}
-% %\setlength{\parskip}{0pt}
-% %\setlength{\topsep}{0pt}
-% %\setlength{\partopsep}{0pt}
-% \verbatim}
-% {\endverbatim
-% \end{minipage}
-% \end{Sbox}
-% \fbox{\TheSbox}
-% %\vspace*{-0.1in}
-% }
-
-\title{Getting Started: Tutorial 0 - Chisel Installation}
-\author{Jonathan Bachrach, Vincent Lee \\
-EECS Department, UC Berkeley\\
-{\tt \{jrb\}@eecs.berkeley.edu}
-}
-\date{\today}
-
-\newenvironment{example}{\VerbatimEnvironment\begin{footnotesize}\begin{Verbatim}}{\end{Verbatim}\end{footnotesize}}
-\newcommand{\kode}[1]{\begin{footnotesize}{\tt #1}\end{footnotesize}}
-
-\def\code#1{{\tt #1}}
-
-\def\note#1{\noindent{\bf [Note: #1]}}
-%\def\note#1{}
-
-\begin{document}
-\maketitle{}
-
-\input{installation-guts}
-
-\end{document}
diff --git a/doc/getting-started/makem.bash b/doc/getting-started/makem.bash
deleted file mode 100755
index a81d3f9d..00000000
--- a/doc/getting-started/makem.bash
+++ /dev/null
@@ -1,6 +0,0 @@
-#/bin/bash -f
-
-for i in 00_installation 01_the_basics 02_bits_and_uint 03_module_instantiation 04_writing_chisel_testcases 05_creating_projects 06_registers_memories 07_scripting_construction
-do
- (cd $i; pdflatex $i.tex)
-done
diff --git a/doc/getting-started/modules-guts.tex b/doc/getting-started/modules-guts.tex
deleted file mode 100644
index b9ee1b53..00000000
--- a/doc/getting-started/modules-guts.tex
+++ /dev/null
@@ -1,326 +0,0 @@
-\section{Module Instantiation}
-
-Like other hardware description languages, Chisel allows fairly straightforward module instantiation to enable modularity and hierarchy. In Chisel, instantiating a Module class is the equivalent to instantiating a module in Verilog. To do this, we simply use a call to \verb+Module+ with module created with the Scala \verb+new+ keyword in order to indicate that we are instantiation a new module. We want to make sure we assign this to a value so that we can reference its input and outputs which we also need to connect.
-
-For example, suppose we would like to construct a 4-bit adder using multiple copies of the \verb+FullAdder+ module. as shown in the Figure 1. The Chisel source code is shown below.
-
-\begin{figure}[ht!]
-\centering
-\includegraphics[width=80mm]{figs/4_Bit_Adder.jpg}
-\caption{Block Diagram of 4-Bit Adder}
-\label{overflow}
-\end{figure}
-
-\begin{scala}
-// A 4-bit adder with carry in and carry out
-class Adder4 extends Module {
- val io = new Bundle {
- val A = UInt(INPUT, 4)
- val B = UInt(INPUT, 4)
- val Cin = UInt(INPUT, 1)
- val Sum = UInt(OUTPUT, 4)
- val Cout = UInt(OUTPUT, 1)
- }
- // Adder for bit 0
- val Adder0 = Module(new FullAdder())
- Adder0.io.a := io.A(0)
- Adder0.io.b := io.B(0)
- Adder0.io.cin := io.Cin
- val s0 = Adder0.io.sum
- // Adder for bit 1
- val Adder1 = Module(new FullAdder())
- Adder1.io.a := io.A(1)
- Adder1.io.b := io.B(1)
- Adder1.io.cin := Adder0.io.cout
- val s1 = Cat(Adder1.io.sum, s0)
- // Adder for bit 2
- val Adder2 = Module(new FullAdder())
- Adder2.io.a := io.A(2)
- Adder2.io.b := io.B(2)
- Adder2.io.cin := Adder1.io.cout
- val s2 = Cat(Adder2.io.sum, s1)
- // Adder for bit 3
- val Adder3 = Module(new FullAdder())
- Adder3.io.a := io.A(3)
- Adder3.io.b := io.B(3)
- Adder3.io.cin := Adder2.io.cout
- io.Sum := Cat(Adder3.io.sum, s2).toUInt()
- io.Cout := Adder3.io.cout
-}
-\end{scala}
-
-In this example, notice how when referencing each module I/O we must first reference the \verb+io+ that contains the ports for the I/Os. Again, note how all assignments to the module I/Os use a reassignment operator \verb+:=+. When instantiating modules, it is important to make sure that you connect all the input and output ports. If a port is not connected, the Chisel compiler may optimize away portions of your design that it find unecessary due to the unconnected ports and throw errors or warnings.
-
-\section{The Vec Class}
-
-The \verb+Vec+ class allows you to create an indexable vector in Chisel which can be filled with any expression that returns a chisel data type. The general syntax for a \verb+Vec+ declaration is given by:
-\begin{scala}
-val myVec =
- Vec.fill( ) { }
-\end{scala}
-Where \verb++ corresponds to how long the vector is and \verb++ corresponds to what type of class the vector contains.
-
-For instance, if we wanted to instantiate a 10 entry vector of 5 bit UInt values, we would use:
-
-\begin{scala}
-val ufix5_vec10 := Vec.fill(10) { UInt(width = 5) }
-\end{scala}
-
-If we want to define a vector of registers...
-
-\begin{scala}
-val reg_vec32 := Vec.fill(32){ Reg() }
-\end{scala}
-
-In order to assign to a particular value of the \verb+Vec+, we simply assign the target value to the vector at a specified index. For instance, if we wanted to assign a UInt value of zero to the first register in the above example, the assignment would look like:
-
-\begin{scala}
-reg_vec32(1) := UInt(0)
-\end{scala}
-
-To access a particular element in the vector at some index, we specify the index of the vector. For example, to extract the 5th element of the register vector in the above example and assign it to some value \verb+reg5+, the assignment would look like:
-
-\begin{scala}
-val reg5 = reg_vec(5)
-\end{scala}
-
-The syntax for the \verb+Vec+ class is slightly different when instantiating a vector of modules. When instantiating a vector of modules the data type that is specified in the {} braces is slightly different than the usualy primitive types. To specify a vector of modules, we use the \verb+io+ bundle when specifying the type of the vector. For example, in order to specify a \verb+Vec+ with 16 modules , say \verb+FullAdder+s in this case, we would use the following declaration:
-
-\begin{scala}
-val FullAdders =
- Vec.fill(16){ Module(new FullAdder()).io }
-\end{scala}
-
-Notice we use the keyword \verb+new+ in the vector definition before the module name \verb+FullAdder+. For how to actually access the \verb+io+ on the vector modules, refer to the next section.
-
-\subsection{\problem{Vec Shift Reg}}
-
-The next assignment is to construct a simple bit shift register.
-The following is a the template from \verb+$TUT_DIR/problems/VecShiftRegisterSimple.scala+:
-
-\begin{scala}
-class VecShiftRegisterSimple extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 8)
- val out = UInt(OUTPUT, 8)
- }
- val delays = Vec.fill(4){ Reg(UInt(width = 8)) }
- ...
- io.out := UInt(0)
-}
-\end{scala}
-
-\noindent
-where \verb+out+ is a four cycle delayed copy of values on \verb+in+.
-
-\section{Parametrization}
-
-In the previous Adder example, we explicitly instantiated four different copies of a \verb+FullAdder+ and wired up the ports. But suppose we want to generalize this structure to an n-bit adder. Like Verilog, Chisel allows you to pass parameters to specify certain aspects of your design. In order to do this, we add a parameter in the Module declaration to our Chisel definition.
-For a carry ripple adder, we would like to parametrize the width to some integer value \verb+n+ as shown in the following example:
-
-\begin{scala}
-
-// A n-bit adder with carry in and carry out
-class Adder(n: Int) extends Module {
- val io = new Bundle {
- val A = UInt(INPUT, n)
- val B = UInt(INPUT, n)
- val Cin = UInt(INPUT, 1)
- val Sum = UInt(OUTPUT, n)
- val Cout = UInt(OUTPUT, 1)
- }
- // create a vector of FullAdders
- val FAs = Vec.fill(n){ Module(new FullAdder()).io }
-
- // define carry and sum wires
- val carry = Vec.fill(n+1){ UInt(width = 1) }
- val sum = Vec.fill(n){ Bool() }
-
- // first carry is the top level carry in
- carry(0) := io.Cin
-
- // wire up the ports of the full adders
- for(i <- 0 until n) {
- FAs(i).a := io.A(i)
- FAs(i).b := io.B(i)
- FAs(i).cin := carry(i)
- carry(i+1) := FAs(i).cout
- sum(i) := FAs(i).sum.toBool()
- }
- io.Sum := sum.toBits().toUInt()
- io.Cout := carry(n)
-}
-
-\end{scala}
-
-Note that in this example, we keep track of the sum output in a \verb+Vec+ of \verb+Bool+s. This is because Chisel does not support bit assignment directly. Thus in order to get the n-bit wide \verb+sum+ in the above example, we use an n-bit wide \verb+Vec+ of \verb+Bool+s and then cast it to a UInt(). Note that it must first be casted to the \verb+Bits()+ type before casting it to \verb+UInt()+.
-
-You will notice that modules are instantiated in a Vec class which allows us to iterate through each module when assigning the ports connections to each \verb+FullAdder+. This is similar to the generate statement in Verilog. However, you will see in more advanced tutorials that Chisel can offer more powerful variations.
-
-Instantiating a parametrized module is very similar to instantiating an unparametrized module except that we must provide arguments for the parameter values. For instance, if we wanted to instantiate a 4-bit version of the \verb+Adder+ module we defined above, it would look like:
-
-\begin{scala}
-val adder4 = Module(new Adder(4))
-\end{scala}
-
-We can also instantiate the \verb+Adder+ by explicitly specifying the value of it parameter \verb+n+ like the this:
-
-\begin{scala}
-val adder4 = Module(new Adder(n = 4))
-\end{scala}
-
-Explicitly specifying the parameter is useful when you have a module with multiple parameters. Suppose you have a parametrized FIFO module with the following module definition:
-
-\begin{scala}
-class FIFO(width: Int, depth: Int) extends Module {...}
-\end{scala}
-
-You can explicitly specify the parameter values in any order:
-
-\begin{scala}
-val fifo1 = Module(new FIFO(16, 32))
-val fifo2 = Module(new FIFO(width = 16, depth = 32))
-val fifo3 = Module(new FIFO(depth = 32, width = 16))
-\end{scala}
-
-All of the above definitions pass the same parameters to the FIFO module. Notice that when you explicitly assign the parameter values, they can occur in any order you want such as the definition for fifo3.
-
-\section{Advanced Parametrization}
-
-Although parameters can be passed explicitly through a Module's constructor, this technique does not scale when parameterizing large designs with many generic components. For a more detailed explanation of why a better parameterization method is needed, please see XXXX. In addition, XXXX explains heuristics for how to organize and parameterize large designs, which we highly recommend one reads prior to using this functionality in a design. The following, however, is a basic introduction.
-
-Every Module has its own \verb+params+ object, which acts as a dictionary. Querying this object is shown below.
-
-\begin{scala}
-val width = params[Int]('width')
-\end{scala}
-
-If \verb+params+ is queried and no parameter matches the query, Chisel throws a \verb+ParameterUndefinedException+. Notice the query return type must be provided.
-
-When a parent Module creates a child Module, the parent's \verb+params+ object is automatically cloned and passed to the child. In the following example, suppose the parent's params object returns \verb+10+ when queried for width. Because the \verb+Parent+ \verb+params+ object is automatically cloned for \verb+Child+, the \verb+Child+ query also returns \verb+10+.
-
-\begin{scala}
-class Parent extends Module {
- val io = new Bundle { ... }
- val width = params[Int]('width') // returns 10
- // create child Module implicitly passing params
- val child = Module(new Child)
-}
-class Child extends Module {
- val io = new Bundle { ... }
- val width = params[Int]('width') // returns 10
-}
-\end{scala}
-
-Suppose a parent Module wants to override or add parameters to its child's \verb+params+ object. This case requires adding a partial function (a Scala way of defining key-value mappings) to the \verb+Child+ Module constructor:
-
-\begin{scala}
-class Parent extends Module {
- val io = new Bundle { ... }
- val width = params[Int]('width') // returns 10
- val n = params[Int]('n') // returns 20
- // Partial function is added to Module constructor
- val child = Module(new Child,{'n' => 40})
-}
-class Child extends Module {
- val io = new Bundle { ... }
- val width = params[Int]('width') // returns 10
- val n = params[Int]('n') // returns 40
-}
-\end{scala}
-
-An example which is impossible to do with simple parameterization, but simple with the advanced parameterization, is when using a generic \verb+Mesh+ generator with a custom \verb+MyRouter+ Module. The existing source code might look like:
-
-\begin{scala}
-class Mesh(routerConstructor: () => Router, n:Int) extends Module {
- val io = new Bundle { ... }
- val routers = Vec.fill(n){Module(routerConstructor())}
- hookUpRouters(routers)
-}
-\end{scala}
-
-However, our custom \verb+MyRouter+ Module requires a parameter, \verb+RoutingFunction+ that we want to sweep for a design space evaluation. Using the simple parameterization method would require a change to the \verb+Mesh+ Module's constructor to include \verb+RoutingFunction+.
-
-Alternatively, one can use the \verb+params+ object to implicitly pass the \verb+RoutingFunction+:
-
-\begin{scala}
-class MyRouter extends Module {
- val io = new Bundle { ... }
- val myRoutingFunction = params[RoutingFunction]('r')
- ...
-}
-class Top extends Module {
- val io = new Bundle { ... }
- val mesh = Module(new Mesh(() => new MyRouter),{'r' => new RoutingFunction})
-}
-\end{scala}
-
-For more advanced uses, tips, and tricks, please see XXXX.
-
-\section{Built In Primitives}
-
-Like other HDL, Chisel provides some very basic primitives. These are constructs that are built in to the Chisel compiler and come for free. The Reg, UInt, and Bundle classes are such primitives that has already been covered. Unlike Module instantiations, primitive do not require explicit connections of their io ports to use. Other useful primitive types include the Mem and Vec classes which will be discussed in a more advanced tutorial. In this tutorial we explore the use of the \verb+Mux+ primitive
-
-\subsection{The Mux Class}
-
-The \verb+Mux+ primitive is a two input multiplexer. In order to use the \verb+Mux+ we first need to define the expected syntax of the \verb+Mux+ class. As with any two input multiplexer, it takes three inputs and one output. Two of the inputs correspond to the data values \verb+A+ and \verb+B+ that we would like to select which can be any width and data type as long as they are the same. The third input \verb+select+ which is a Bool type determines which one to output.
-A \verb+select+ value of \verb+true+ will output the first value \verb+A+, while a \verb+select+ value of \verb+false+ will pass \verb+B+.
-
-\begin{scala}
-val out = Mux(select, A, B)
-\end{scala}
-
-Thus if \verb+A=10+, \verb+B=14+, and \verb+select+ was \verb+true+, the value of \verb+out+ would be assigned 10. Notice how using the \verb+Mux+ primitive type abstracts away the logic structures required if we had wanted to implement the multiplexer explicitly.
-
-\subsection{\problem{Parameterized Width Adder}}
-
-The next assignment is to construct an adder with a parameterized width and using the built in addition operator \verb!+!.
-The following is a the template from \verb+$TUT_DIR/problems/Adder.scala+:
-
-\begin{scala}
-class Adder(val w: Int) extends Module {
- val io = new Bundle {
- val in0 = UInt(INPUT, 1)
- val in1 = UInt(INPUT, 1)
- val out = UInt(OUTPUT, 1)
- }
- ...
- io.out := UInt(0)
-}
-\end{scala}
-
-\noindent
-where \verb+out+ is sum of \verb+w+ width unsigned inputs \verb+in0+ and \verb+in1+.
-Notice how \verb+val+ is added to the width parameter value to
-allow the width to be accessible from the tester as a field of the adder module object. Run
-
-\begin{bash}
-make Adder.out
-\end{bash}
-
-\noindent
-until your circuit passes the tests.
-
-% Martin: I would drop the following as it is just confusing in a tutorial
-% state simple that there is a Mux primitive and that is fine.
-
-%The instantiation would look something like this:
-%
-%\begin{scala}
-%// where n is the width of A and m is the width of B
-%val mux = Module(new Mux(n, m))
-%mux.io.select := select
-%mux.io.A := A
-%mux.io.B := B
-%val out = mux.io.out
-%\end{scala}
-%
-%We see that clearly it is much cleaner to use the primitive \verb+Mux+ type instead of trying to write and implement our own general multiplexer since the \verb+Mux+ type does all the wiring for you.
-
-
-%\section{Exercises}
-%
-%\subsection{n-bit Subtractor}
-%
-%Earlier in this tutorial we demonstarted how to parametrize and instantiate an n-bit ripple adder.
-%
diff --git a/doc/getting-started/modules.tex b/doc/getting-started/modules.tex
deleted file mode 100644
index 81f44c97..00000000
--- a/doc/getting-started/modules.tex
+++ /dev/null
@@ -1,58 +0,0 @@
-\documentclass[twocolumn, 10pt]{article}
-\setlength\textwidth{6.875in}
-\setlength\textheight{8.875in}
-% set both margins to 2.5 pc
-\setlength{\oddsidemargin}{-0.1875in}% 1 - (8.5 - 6.875)/2
-\setlength{\evensidemargin}{-0.1875in}
-\setlength{\marginparwidth}{0pc}
-\setlength{\marginparsep}{0pc}%
-\setlength{\topmargin}{0in} \setlength{\headheight}{0pt}
-\setlength{\headsep}{0pt}
-\setlength{\footskip}{37pt}%
-%\setlength{\columnsep}{0.3125in}
-%\setlength{\columnwidth}{3.28125in}% (6.875 - 0.3125)/2 = 3.28125in
-\setlength{\parindent}{1pc}
-\newcommand{\myMargin}{1.00in}
-\usepackage[top=\myMargin, left=\myMargin, right=\myMargin, bottom=\myMargin, nohead]{geometry}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{hyperref}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-
-\lstset{basicstyle={\footnotesize\ttfamily}}
-
-\newenvironment{commentary}
-{ \vspace{-0.1in}
- \begin{quotation}
- \noindent
- \small \em
- \rule{\linewidth}{1pt}\\
-}
-{
- \end{quotation}
-}
-
-\title{Getting Started - Tutorial 03: Instantiating Modules}
-\author{Jonathan Bachrach, Vincent Lee \\
-EECS Department, UC Berkeley\\
-{\tt \{jrb\}@eecs.berkeley.edu}
-}
-\date{\today}
-
-\newenvironment{example}{\VerbatimEnvironment\begin{footnotesize}\begin{Verbatim}}{\end{Verbatim}\end{footnotesize}}
-\newcommand{\kode}[1]{\begin{footnotesize}{\tt #1}\end{footnotesize}}
-
-\def\code#1{{\tt #1}}
-
-\def\note#1{\noindent{\bf [Note: #1]}}
-%\def\note#1{}
-
-\begin{document}
-\maketitle{}
-
-\input{modules-guts}
-
-\end{document}
diff --git a/doc/getting-started/projects-guts.tex b/doc/getting-started/projects-guts.tex
deleted file mode 100644
index 4cb90208..00000000
--- a/doc/getting-started/projects-guts.tex
+++ /dev/null
@@ -1,109 +0,0 @@
-\section{Creating Your Own Projects}
-
-In order to create your own projects from scratch, you will need to create a directory, a Chisel source file, and a build.sbt configuration file. In the first part of this tutorial we cover the basic calls to SBT in order generate appropriate files. At the end of the tutorial, we will explain how the Makefile infrastructure can make the process more streamlined.
-
-\subsection{Directory Structure}
-
-The simplest project file organization is using a single directory containing your Scala project file and your Chisel source file. The project directory structure would look like:
-
-\begin{bash}
-Hello/
- build.sbt # scala configuration file
- Hello.scala # your source file
-\end{bash}
-
-We will refer to the path to the \verb+Hello+ directory as \verb+$BASEDIR+ from here on. More sophisticated directory structures can be useful in the future. Consult the SBT documentation for more information.
-
-\subsection{The Source Directory and Chisel Main}
-
-The top directory \verb+$BASEDIR/+ contains Scala source files containing all of the Chisel module definitions for your circuit and a main method. In this simple example, we have one Scala source file as shown below:
-
-\begin{scala}
-package Hello
-
-import Chisel._
-
-class HelloModule extends Module {
- val io = new Bundle {
- val out = UInt(OUTPUT, 8)
- }
- io.out := UInt(42)
-}
-
-class HelloModuleTests(c: HelloModule)
- extends Tester(c) {
- step(1)
- expect(c.io.out, 42)
-}
-
-object hello {
- def main(args: Array[String]): Unit = {
- val margs =
- Array("--backend", "c", "--genHarness", "--compile", "--test")
- chiselMainTest(margs, () => Module(new HelloModule())) {
- c => new HelloModuleTests(c)
- })
- }
-}
-\end{scala}
-
-In the above example, we have a module definition in package \verb+Hello+ for a \verb+Hello+ module. The main method calls \verb+chiselMainTest+ for a new Hello module\footnote{Note that when you have multiple Scala files, in order for main to recognize your module definition, your module definition must be in the same package as the main function}. In addition to creating the module, the call to \verb+chiselMainTest+ also includes a call to execute the scala testbench defined in the routine \verb+HelloModuleTests+.
-
-\subsection{The build.sbt Template}
-
-The \verb+build.sbt+ configuration file is located in the top folder and contains a number of settings used by \verb+sbt+ when building and compiling the Chisel sources. The following shows the recommended \verb+build.sbt+ template that should be used:
-
-\begin{scala}
-scalaVersion := "2.10.2"
-
-resolvers ++= Seq(
- "scct-github-repository" at "http://mtkopone.github.com/scct/maven-repo"
-)
-
-libraryDependencies +=
- "edu.berkeley.cs" %% "chisel" % "latest.release"
-\end{scala}
-
-The SBT project file contains a reference to Scala version greater or equal to 2.10.2 and a dependency on the latest release of the Chisel library.
-
-\section{Compiling the Chisel Source}
-
-\subsection{Compiling the Emulation Files}
-
-In order to launch SBT to compile the Chisel code we must first be in the directory \verb+$BASEDIR/+. The following call is then made to compile and run the Hello module:
-
-\begin{bash}
-sbt run
-\end{bash}
-
-\subsection{Running the Chisel Tests}
-
-To actually run the tests referenced in the main method of \verb+$BASEDIR/Hello.scala+, we need to tell SBT to also generate the harness and run the tests. For instance, for our Hello module introduced earlier, the Chisel main method references a test routine \verb+HelloTests+. In order to both compile the Hello component and run the tests defined in \verb+Hello+, we make the following call to sbt:
-
-\begin{bash}
-sbt "run --backend c --compile --test --genHarness"
-\end{bash}
-
-Note the addition of the 5 arguments at the end of the call to \verb+run+. This will both compile the \verb+.cpp+ and \verb+.h+ files for the emulator and run the Chisel tests defined.
-
-\subsection{Compiling Verilog}
-
-Similarly to compile the Chisel code and generate the Verilog HDL, a similar call to SBT is made with slightly different arguments. The call looks like:
-
-\begin{bash}
-sbt "run --backend v --genHarness"
-\end{bash}
-
-Notice the call is very similar to when generating C++; the key difference is the parameter to the \verb+--backend+ attribute which is now \verb+v+ which specifies to sbt that we would like to compile our Chisel component to Verilog.
-
-\section{Putting It All Together}
-
-In summary, the bare minimum project components that are necessary for your project to get off the ground are the following files:
-
-\begin{enumerate}
-\item \verb+$BASEDIR/build.sbt+
-\item \verb+$BASEDIR/.scala+
-\end{enumerate}
-
-Together, these files compose a Chisel project and can be used to generate the Verilog and C++ files. It is strongly recommended that you supplement the file structure with appropriate Makefiles but is not strictly necessary (examples can be found in the Chisel tutorial project).
-
diff --git a/doc/getting-started/projects.tex b/doc/getting-started/projects.tex
deleted file mode 100644
index dfbcdd3f..00000000
--- a/doc/getting-started/projects.tex
+++ /dev/null
@@ -1,58 +0,0 @@
-\documentclass[twocolumn, 10pt]{article}
-\setlength\textwidth{6.875in}
-\setlength\textheight{8.875in}
-% set both margins to 2.5 pc
-\setlength{\oddsidemargin}{-0.1875in}% 1 - (8.5 - 6.875)/2
-\setlength{\evensidemargin}{-0.1875in}
-\setlength{\marginparwidth}{0pc}
-\setlength{\marginparsep}{0pc}%
-\setlength{\topmargin}{0in} \setlength{\headheight}{0pt}
-\setlength{\headsep}{0pt}
-\setlength{\footskip}{37pt}%
-%\setlength{\columnsep}{0.3125in}
-%\setlength{\columnwidth}{3.28125in}% (6.875 - 0.3125)/2 = 3.28125in
-\setlength{\parindent}{1pc}
-\newcommand{\myMargin}{1.00in}
-\usepackage[top=\myMargin, left=\myMargin, right=\myMargin, bottom=\myMargin, nohead]{geometry}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{hyperref}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-
-\lstset{basicstyle={\footnotesize\ttfamily}}
-
-\newenvironment{commentary}
-{ \vspace{-0.1in}
- \begin{quotation}
- \noindent
- \small \em
- \rule{\linewidth}{1pt}\\
-}
-{
- \end{quotation}
-}
-
-\title{Getting Started - Tutorial 05: Creating Your Own Project}
-\author{Jonathan Bachrach, Vincent Lee \\
-EECS Department, UC Berkeley\\
-{\tt \{jrb\}@eecs.berkeley.edu}
-}
-\date{\today}
-
-\newenvironment{example}{\VerbatimEnvironment\begin{footnotesize}\begin{Verbatim}}{\end{Verbatim}\end{footnotesize}}
-\newcommand{\kode}[1]{\begin{footnotesize}{\tt #1}\end{footnotesize}}
-
-\def\code#1{{\tt #1}}
-
-\def\note#1{\noindent{\bf [Note: #1]}}
-%\def\note#1{}
-
-\begin{document}
-\maketitle{}
-
-\input{projects-guts}
-
-\end{document}
diff --git a/doc/getting-started/scripting-guts.tex b/doc/getting-started/scripting-guts.tex
deleted file mode 100644
index 1f550ad9..00000000
--- a/doc/getting-started/scripting-guts.tex
+++ /dev/null
@@ -1,223 +0,0 @@
-\section{Using the For loop}
-
-Often times parametrization requires instantiating multiple components which are connected in a very regular structure. A revisit to the parametrized \verb+Adder+ component definition shows the \verb+for+ loop construct in action:
-
-\begin{scala}
-// A n-bit adder with carry in and carry out
-class Adder(n: Int) extends Module {
- val io = new Bundle {
- val A = UInt(INPUT, n)
- val B = UInt(INPUT, n)
- val Cin = UInt(INPUT, 1)
- val Sum = UInt(OUTPUT, n)
- val Cout = UInt(OUTPUT, 1)
- }
- // create a vector of FullAdders
- val FAs = Vec.fill(n){ Module(new FullAdder()).io }
- val carry = Vec.fill(n+1){ UInt(width = 1) }
- val sum = Vec.fill(n){ Bool() }
-
- // first carry is the top level carry in
- carry(0) := io.Cin
-
- // wire up the ports of the full adders
- for(i <- 0 until n) {
- FAs(i).a := io.A(i)
- FAs(i).b := io.B(i)
- FAs(i).cin := carry(i)
- carry(i+1) := FAs(i).cout
- sum(i) := FAs(i).sum.toBool()
- }
- io.Sum := sum.toBits().toUInt()
- io.Cout := carry(n)
-}
-\end{scala}
-
-Notice that a Scala integer \verb+i+ value is used in the \verb+for+ loop definition as the index variable. This indexing variable is specified to take values from 0 \verb+until+ n, which means it takes values 0, 1, 2..., n-1. If we wanted it to take values from 0 to n inclusive, we would use \verb+for (i <- 0 to n)+.
-
-It is also important to note, that the indexing variable \verb+i+ does not actually manifest itself in the generated hardware. It exclusively belongs to Scala and is only used in declaring how the connections are specified in the Chisel component definition.
-
-The for loop construct is also very useful for assigning to arbitrarily long \verb+Vec+s
-
-\section{Using If, Else If, Else}
-
-As previously mentioned, the \verb+if, elseif,+ and \verb+else+ keywords are reserved for Scala control structures. What this means for Chisel is that these constructs allow you to selectively generate different structures depending on parameters that are supplied. This is particularly useful when you want to turn certain features of your implementation "on" or "off", or if you want to use a different variant of some component.
-
-For instance, suppose we have several simple counters that we would like to package up into a general purpose counter module: UpCounter, DownCounter, and OneHotCounter. From the definitions below, we notice that for these simple counters, the I/O interfaces and parameters are identical:
-
-\begin{scala}
-// Simple up counter that increments from 0 and wraps around
-class UpCounter(CounterWidth:Int) extends Module {
- val io = new Bundle {
- val output = UInt(OUTPUT, CounterWidth)
- val ce = Bool(INPUT)
- }...
-}
-
-// Simple down counter that decrements from
-// 2^CounterWidth-1 then wraps around
-class DownCounter(CounterWidth:Int) extends Module{
- val io = new Bundle {
- val output = UInt(OUTPUT, CounterWidth)
- val ce = Bool(INPUT)
- }...
-}
-
-// Simple one hot counter that increments from one hot 0
-// to CounterWidth-1 then wraps around
-class OneHotCounter(CounterWidth:Int) extends Module {
- val io = new Bundle {
- val output = UInt(OUTPUT, CounterWidth)
- val ce = Bool(INPUT)
- }...
-}
-\end{scala}
-
-We could just instantiate all three of these counters and multiplex between them but if we needed one at any given time this would be a waste of hardware. In order to choose between which of these three counters we want to instantiate, we can use Scala's \verb+if, else if, else+ statements to tell Chisel how to pick which component to instantiate based on a \verb+CounterType+ parameter:
-
-\begin{scala}
-class Counter(CounterWidth: Int, CounterType: String)
- extends Module {
- val io = new Bundle {
- val output = UInt(OUTPUT, CounterWidth)
- val ce = Bool(INPUT)
- }
- if (CounterType == "UpCounter") {
- val upcounter = new UpCounter(CounterWidth)
- upcounter.io.ce := io.ce
- io.output := upcounter.io.output
- } else if (CounterType == "DownCounter") {
- val downcounter = new DownCounter(CounterWidth)
- downcounter.io.ce := io.ce
- io.output := downcounter.io.output
- } else if (CounterType == "OneHotCounter") {
- val onehotcounter = new OneHotCounter(CounterWidth)
- onehotcounter.io.ce := io.ce
- io.output := onehotcounter.io.output
- } else {
- // default output 1
- io.output := UInt(1)
- }
-}
-\end{scala}
-
-By consolidating these three counter components into a single \verb+Counter+ module, we can instantiate a different counter by simply changing the parameter \verb+CounterType+. For instance:
-
-\begin{scala}
-// instantiate a down counter of width 16
-val downcounter =
- Module(new Counter(16, "DownCounter"))
-
-// instantiate an up counter of width 16
-val upcounter =
- Module(new Counter(16, "UpCounter"))
-
-// instantiate a one hot counter of width 16
-val onehotcounter =
- Module(new Counter(16, "OneHotCounter"))
-\end{scala}
-
-This allows seamless alternation between them.
-
-\section{Using def}
-
-Chisel also allows the usage of the Scala \verb+def+ statement to define Chisel code that may be used frequently. These \verb+def+ statements can be packaged into a Scala Object and then called inside a Module. The following Chisel code shows an alternate implementation of an counter using \verb+def+ that increments by \verb+amt+ if the \verb+inc+ signal is asserted.
-
-\begin{scala}
-object Counter {
- def wrapAround(n: UInt, max: UInt) =
- Mux(n > max, UInt(0), n)
-
- def counter(max: UInt, en: Bool, amt: UInt) = {
- val x = Reg(init = UInt(0, max.getWidth))
- x := wrapAround(x + amt, max)
- x
- }
-}
-
-class Counter extends Module {
- val io = new Bundle {
- val inc = Bool(INPUT)
- val amt = UInt(INPUT, 4)
- val tot = UInt(OUTPUT, 8)
- }
- io.tot := counter(UInt(255), io.inc, io.amt)
-}
-\end{scala}
-
-\noindent
-In this example, we use calls to subroutines defined in the \verb+Counter+ object in order to perform the appropriate logic.
-
-\section{\problem{Parameterized Vec Shift Reg}}
-
-The next assignment is to construct a bit shift register with delay parameter.
-The following is a the template from \verb+$TUT_DIR/problems/VecShiftRegisterParam.scala+:
-
-\begin{scala}
-class VecShiftRegisterParam(val n: Int, val w: Int) extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, w)
- val out = UInt(OUTPUT, w)
- }
- ...
- io.out := UInt(0)
-}
-\end{scala}
-
-\noindent
-where \verb+out+ is a \verb+n+ cycle delayed copy of values on \verb+in+.
-Also notice how \verb+val+ is added to each parameter value to
-allow those values to be accessible from the tester. Run
-
-\begin{bash}
-make VecShiftRegisterParam.out
-\end{bash}
-
-\noindent
-until your circuit passes the tests.
-
-\section{\problem{Mul Lookup Table}}
-
-The next assignment is to write a 16x16 multiplication table using \verb+Vec+.
-The following is a the template from \verb+$TUT_DIR/problems/Mul.scala+:
-
-\begin{scala}
-class Mul extends Module {
- val io = new Bundle {
- val x = UInt(INPUT, 4)
- val y = UInt(INPUT, 4)
- val z = UInt(OUTPUT, 8)
- }
- val muls = new ArrayBuffer[UInt]()
-
- // flush this out ...
-
- io.z := UInt(0)
-}
-\end{scala}
-
-\noindent
-As a hint build the lookup table using a rom constructed from the \verb+tab+ lookup table represented as a Scala ArrayBuffer with incrementally added elements (using \verb!+=!):
-
-\begin{scala}
-val tab = Vec(muls)
-\end{scala}
-
-\noindent
-and lookup the result using an address formed from the \verb+x+ and \verb+y+ inputs as follows:
-
-\begin{scala}
-io.z := tab(Cat(io.x, io.y))
-\end{scala}
-
-\noindent
-Run
-
-\begin{bash}
-make Mul.out
-\end{bash}
-
-\noindent
-until your circuit passes the tests.
-
-% The first call to \verb+counter+ in the \verb+Counter+ module
diff --git a/doc/getting-started/scripting.tex b/doc/getting-started/scripting.tex
deleted file mode 100644
index 7abb4b09..00000000
--- a/doc/getting-started/scripting.tex
+++ /dev/null
@@ -1,58 +0,0 @@
-\documentclass[twocolumn, 10pt]{article}
-\setlength\textwidth{6.875in}
-\setlength\textheight{8.875in}
-% set both margins to 2.5 pc
-\setlength{\oddsidemargin}{-0.1875in}% 1 - (8.5 - 6.875)/2
-\setlength{\evensidemargin}{-0.1875in}
-\setlength{\marginparwidth}{0pc}
-\setlength{\marginparsep}{0pc}%
-\setlength{\topmargin}{0in} \setlength{\headheight}{0pt}
-\setlength{\headsep}{0pt}
-\setlength{\footskip}{37pt}%
-%\setlength{\columnsep}{0.3125in}
-%\setlength{\columnwidth}{3.28125in}% (6.875 - 0.3125)/2 = 3.28125in
-\setlength{\parindent}{1pc}
-\newcommand{\myMargin}{1.00in}
-\usepackage[top=\myMargin, left=\myMargin, right=\myMargin, bottom=\myMargin, nohead]{geometry}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{hyperref}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-
-\lstset{basicstyle={\footnotesize\ttfamily}}
-
-\newenvironment{commentary}
-{ \vspace{-0.1in}
- \begin{quotation}
- \noindent
- \small \em
- \rule{\linewidth}{1pt}\\
-}
-{
- \end{quotation}
-}
-
-\title{Getting Started: Tutorial 07 - Scripting Hardware Generation}
-\author{Jonathan Bachrach, Vincent Lee \\
-EECS Department, UC Berkeley\\
-{\tt \{jrb\}@eecs.berkeley.edu}
-}
-\date{\today}
-
-\newenvironment{example}{\VerbatimEnvironment\begin{footnotesize}\begin{Verbatim}}{\end{Verbatim}\end{footnotesize}}
-\newcommand{\kode}[1]{\begin{footnotesize}{\tt #1}\end{footnotesize}}
-
-\def\code#1{{\tt #1}}
-
-\def\note#1{\noindent{\bf [Note: #1]}}
-%\def\note#1{}
-
-\begin{document}
-\maketitle{}
-
-\input{scripting-guts}
-
-\end{document}
diff --git a/doc/getting-started/state-guts.tex b/doc/getting-started/state-guts.tex
deleted file mode 100644
index 5b45e744..00000000
--- a/doc/getting-started/state-guts.tex
+++ /dev/null
@@ -1,356 +0,0 @@
-\section{Conditional Register Updates}
-
-As shown earlier in the tutorial, conditional register updates are performed with the \verb+when+ block which takes a \verb+Bool+ value or some boolean expression to evaluate.
-In this section we more fully explore how to use this \verb+when+ conditional update structure.
-
-If a \verb+when+ block is used by itself, Chisel will assume that if the condition for the \verb+when+ block doesn't evaluate to true, there is no update to the register value. However, most of the time we don't want to limit ourselves to a single conditional. Thus in Chisel we use \verb+.elsewhen+ and \verb+.otherwise+ statements to select between multiple possible register updates as shown in the following sections.
-
-\subsection{The .elsewhen Clause}
-
-When specifying a conditional update, we may want to check several conditions which we want to check in some order.
-To do this for register updates, we use a \verb+when ... .elsewhen+ structure. This is analagous to an \verb+if... else if+ control structure in sequential programming. \footnote{Note that the if .. else if control structure in Chisel is NOT used to specify register updates}
-As with \verb+else if+ clauses, as many \verb+.elsewhen+ statements can be chained together in a single \verb+when+ block.
-
-The general structure thus looks like:
-
-%$when$ () {}
-%.elsewhen () {}
-%...
-%.elsewhen () {}
-
-\begin{scala}
-when () {}
-.elsewhen () {}
-...
-.elsewhen () {}
-\end{scala}
-
-Where \verb++ through \verb++ represent the trigger conditions of their respective \verb++ segments.
-
-An example of this statement in action is shown in the following implementation of a simple stack pointer. Suppose, we need to maintain a pointer that keeps track of the address of the top of a stack. Given a signal \verb+pop+ that decrements the stack pointer address by 1 entry and a signal \verb+push+ that increments the stack pointer address by 1 entry, the implementation of just the pointer would look like the following:
-
-\begin{scala}
-class StackPointer(depth:Int) extends Module {
- val io = new Bundle {
- val push = Bool(INPUT)
- val en = Bool(INPUT)
- val pop = Bool(INPUT)
- }
-
- val sp = Reg(init = UInt(0, width = log2Up(depth)))
-
- when (io.en && io.push && (sp != UInt(depth-1))) {
- sp := sp + UInt(1)
- } .elsewhen(io.en && io.pop && (sp > UInt(0))) {
- sp := sp - UInt(1)
- }
-}
-\end{scala}
-
-Notice that in this implementation, the push signal has higher priority over the pop signal as it appears earlier in the \verb+when+ block.
-
-\subsection{The .otherwise Clause}
-
-In order to specify a default register update value if all the conditions in the \verb+when+ block fail to trigger, we use an \verb+.otherwise+ clause.
-The \verb+.otherwise+ clause is analagous to the \verb+else+ case that completes an \verb+if ... else+ block. The \verb+.otherwise+ statement must occur last in the \verb+when+ block.
-
-The general structure for the complete \verb+when+ block now looks like:
-\begin{scala}
-when () {}
-.elsewhen () {}
-...
-.elsewhen () {}
-.otherwise {}
-\end{scala}
-
-In the previous example, we could add a default statement which just assigns \verb+sp+ to the current value of \verb+sp+. The \verb+block+ would then look like:
-
-\begin{scala}
-when(io.en && io.push && (sp != UInt(depth-1))) {
- sp := sp + UInt(1)
-} .elsewhen(io.en && io.pop && (sp > UInt(0))) {
- sp := sp - UInt(1)
-} .otherwise {
- sp := sp
-}
-\end{scala}
-
-The explicit assignment to preserve the value of \verb+sp+ is redundant in this case but it captures the point of the \verb+.otherwise+ statement.
-
-\subsection{The unless Clause}
-
-% Martin: this feels a little bit strange as it is not a usual construct in a programming language.
-% It is simple !condition, right? So I would drop it.
-
-To complement the \verb+when+ statement, Chisel also supports an \verb+unless+ statement. The \verb+unless+ statement is a conditional assignment that triggers only if the condition is false. The general structure for the \verb+unless+ statement is:
-
-\begin{scala}
-unless ( ) { }
-\end{scala}
-
-For example, suppose we want to do a simple search of the contents of memory and determine the address that contains some number. Since we don't know how long the search will take, the module will output a \verb+done+ signal when it is finished and until then, we want to continue to search memory. The Chisel code for the module would look like:
-
-\begin{scala}
-class MemorySearch extends Module {
- val io = new Bundle {
- val target = UInt(INPUT, 4)
- val address = UInt(OUTPUT, 3)
- val en = Bool(INPUT)
- val done = Bool(INPUT)
- }
- val index = Reg(init = UInt(0, width = 3))
- val list = Vec(UInt(0), UInt(4), UInt(15), UInt(14), UInt(2), UInt(5), UInt(13))
- val memVal = list(index)
-
- val done = (memVal === io.target) || (index === UInt(7))
-
- unless (done) {
- index := index + UInt(1)
- }
- io.done := done
- io.address := index
-}
-\end{scala}
-
-In this example, we limit the size of the memory to 8 entries and use a vector of literals to create a read only memory. Notice that the \verb+unless+ statement is used to terminate the iteration if it see that the \verb+done+ signal is asserted. Otherwise, it will continue to increment the index in memory until it finds the value in \verb+target+ or reaches the last index in the memory (7).
-
-\section{Combinational Conditional Assignment}
-
-You can also use the \verb+when .elsewhen .otherwise+ block to define combinational values that may take many values. For example, the following Chisel code show how to implement a basic arithmetic unit with 4 operations: add, subtract, and pass. In this example, we check the opcode to determine which operation to perform and conditionally assign the output.
-
-\begin{scala}
-class BasicALU extends Module {
- val io = new Bundle {
- val a = UInt(INPUT, 4)
- val b = UInt(INPUT, 4)
- val opcode = UInt(INPUT, 2)
- val output = UInt(OUTPUT, 4)
- }
- io.output := UInt(0)
- when (io.opcode === UInt(0)) {
- io.output := io.a + io.b // ADD
- } .elsewhen (io.opcode === UInt(1)) {
- io.output := io.b - io.b // SUB
- } .elsewhen (io.opcode === UInt(2)) {
- io.output := io.a // PASS A
- } .otherwise {
- io.output := io.b // PASS B
- }
-}
-\end{scala}
-
-Notice that this can easily be easily expanded to check many different conditions for more complicated arithmetic units or combinational blocks.
-
-\section{Read Only Memories}
-
-To instantiate read only memories in Chisel, we use a vector of constant literals and specify a literal type. For example, in order to instantiate an 4 entry read only memory with the values 0 to 3, the definition would look like the following:
-
-\begin{footnotesize}
-\begin{scala}
-val numbers =
- Vec(UInt(0),UInt(1),UInt(2),UInt(3)){ UInt(width = 2) }
-\end{scala}
-\end{footnotesize}
-
-Notice that we need to specify the type of literal in the {...} braces following the literals. Accessing the values in the read only memory is the same as accessing an entry in a \verb+Vec+. For example, to access the 2nd entry of the memory we would use:
-
-\begin{scala}
-val entry2 = numbers(2)
-\end{scala}
-
-\section{Read-Write Memories}
-
-Chisel contains a primitive for memories called \verb+Mem+. Using the \verb+Mem+ class it is possible to construct multi-ported memory that can be synchronous or combinational read. \footnote{The complete definition can be found in the chisel source in Mem.scala}
-
-\subsection{Basic Instantiation}
-
-The \verb+Mem+ construction takes a memory depth and a data type which it is composed of. The general declaration structure looks like:
-
-\begin{scala}
-val myMem = Mem(, )
-\end{scala}
-
-Where \verb++ corresponds to the number of entries of \verb++ are in the memory.
-
-For instance, if you wanted to create a 128 deep memory of 32 bit UInt types, you would use the following instantiation:
-
-\begin{scala}
-val myMem = Mem(UInt(width = 32), depth = 128)
-\end{scala}
-
-Note that when constructing a memory in Chisel, the initial value of memory contents cannot be specified. Therefore, you should never assume anything about the initial contents of your \verb+Mem+ class.
-
-\subsection{Synchronous vs. Combinational Read}
-
-It is possible to specify either combinational or synchronous read behavior during instantiation by setting the \verb+seqRead+ parameter when defining the \verb+Mem+. The \verb+seqRead+ parameter is a \verb+Bool+ that tells Chisel if you want synchronous read behavior memory or not.
-
-For instance, if we wanted a combinational read 128 entry memory of 32 bit UInt types, we would use the following definition:
-
-\begin{scala}
-val asyncMem =
- Mem(UInt(width = 32), 128, seqRead = false)
-\end{scala}
-
-Likewise, if we wanted a synchronous read 128 entry memory of 32 bit UInt types, we would set the \verb+seqRead+ to true:
-
-\begin{scala}
-val syncMem =
- Mem(UInt(width = 32), 128, seqRead = true)
-\end{scala}
-
-% this needs more elaboration. Memories in hardware are tough...
-
-By default, Chisel will assume that the read behavior is combinational.
-
-\subsection{Adding Write Ports}
-
-To add write ports to the \verb+Mem+, we use a \verb+when+ block to allow Chisel to infer a write port. Inside the \verb+when+ block, we specify the location and data for the write transaction. In general, adding a write port requires the following definition:
-
-\begin{scala}
-when ( ) {
- ( ) :=
-}
-\end{scala}
-
-Where \verb++ refers to the entry number in the memory to write to. Also notice that we use the reassignment operator \verb+:=+ when writing to the memory.
-
-
-For example, suppose we have a 128 deep memory of 32 bit UInt types. If we wanted to write a 32 bit value \verb+dataIn+ to the memory at location \verb+writeAddr+ if as write enable signal \verb+we+ is true, our Chisel code would look like:
-
-\begin{scala}
-...
-val myMem = Mem(UInt(width = 32), depth = 128)
-when (wen) {
- myMem(writeAddr) := dataIn
-}
-...
-\end{scala}
-
-
-
-\subsection{Adding Read Ports}
-
-Depending on the type of read behaviour specified, the syntax for adding read ports to \verb+Mem+ in Chisel is slightly different for combinational read and synchronous read memories.
-
-\subsubsection{Combinational Read Ports}
-
-For combinational read memories, adding read ports to the memory simply amounts to placing an assignment inside a \verb+when+ block with some trigger condition. If you want Chisel to infer multiple read ports, simply add more assignments in the \verb+when+ definition. The general definition for read ports is thus:
-
-\begin{scala}
-when () {
- := ( )
- ...
- := ( )
-}
-\end{scala}
-
-For instance, if you wanted a 128 entry memory of 32 bit UInt values with two combinational read ports, with some read enable \verb+re+ and reads from addresses \verb+raddr1+ and \verb+raddr2+, we would use the following \verb+when+ block definition:
-
-\begin{scala}
-...
-val myMem =
- Mem(UInt(width = 32), 128, seqRead = false)
-val read_port1 = UInt(width = 32)
-val read_port2 = UInt(width = 32)
-when (re) {
- read_port1 := myMem(raddr1)
- read_port2 := myMem(raddr2)
-}
-...
-\end{scala}
-
-Note that the type and width of the \verb+read_port1+ and \verb+read_port2+ should match the type and width of the entries in the \verb+Mem+.
-
-\subsubsection{Synchronous Read Ports}
-
-In order to add synchronous read ports to the Chisel \verb+Mem+ class, Chisel requires that the output from the memory be assigned to a \verb+Reg+ type. Like the combinational read port, a synchronous read assignment must occur in a \verb+when+ block. The general structure for the definition of a synchronous read port is as follows:
-
-\begin{scala}
-...
-val myMem =
- Mem(UInt(width = 32), depth = 128, seqRead = true)
-val read_port = Reg(UInt(width = 32))
-when (re) {
- read_port := myMem(raddr)
-}
-...
-\end{scala}
-
-\subsection{Example of Mem in Action}
-
-% Martin: no, it was not yet shown
-%We introduced a basic stack pointer bookkeeping example earlier in the tutorial. In this section we show how the complete stack implementation would look like.
-
-Here we provide a small example of using a memory by implementing a stack.
-
-Suppose we would like to implement a stack that takes two signals \verb+push+ and \verb+pop+ where \verb+push+ tells the stack to push an input \verb+dataIn+ to the top of the stack, and \verb+pop+ tells the stack to pop off the top value from the stack. Furthermore, an enable signal \verb+en+ disables pushing or popping if not asserted. Finally, the stack should always output the top value of the stack.
-
-\begin{scala}
-class Stack(depth: Int) extends Module {
- val io = new Bundle {
- val dataIn = UInt(INPUT, 32)
- val dataOut = UInt(OUTPUT, 32)
- val push = Bool(INPUT)
- val pop = Bool(INPUT)
- val en = Bool(INPUT)
- }
-
- // declare the memory for the stack
- val stack_mem =
- Mem(UInt(width = 32), depth, seqRead = false)
- val sp = Reg(init = UInt(0, width = log2Up(depth)))
- val dataOut = Reg(init = UInt(0, width = 32))
-
- // Push condition - make sure stack isn't full
- when(io.en && io.push && (sp != UInt(depth-1))) {
- stack_mem(sp + UInt(1)) := io.dataIn
- sp := sp + UInt(1)
- }
- // Pop condition - make sure the stack isn't empty
- .elsewhen(io.en && io.pop && (sp > UInt(0))) {
- sp := sp - UInt(1)
- }
-
- when(io.en) {
- dataOut := stack_mem(sp)
- }
-
- io.dataOut := dataOut
-}
-\end{scala}
-
-Since the module is parametrized to be \verb+depth+ entries deep, in order to correctly extract the minimum width of the stack pointer \verb+sp+ we take the \verb+log2Up(depth)+. This takes the base 2 logarithm of \verb+depth+ and rounds up.
-
-\subsection{\problem{Load/Search Mem}}
-
-In this assignment, write a memory module that supports loading elements and searching based on the following template:
-
-\begin{scala}
-class DynamicMemorySearch(val n: Int, val w: Int) extends Module {
- val io = new Bundle {
- val isWr = Bool(INPUT)
- val wrAddr = UInt(INPUT, log2Up(n))
- val data = UInt(INPUT, w)
- val en = Bool(INPUT)
- val target = UInt(OUTPUT, log2Up(n))
- val done = Bool(OUTPUT)
- }
- val index = Reg(init = UInt(0, width = log2Up(n)))
- val memVal = UInt(0)
- /// fill in here
- io.done := Bool(false)
- io.target := index
-}
-\end{scala}
-
-\noindent
-and found in \verb+$TUT_DIR/problems/DynamicMemorySearch.scala+.
-Notice how it support depth and width parameters \verb+n+ and \verb+w+ and
-how the address width is computed from the depth. Run
-
-\begin{bash}
-make DynamicMemorySearch.out
-\end{bash}
-
-\noindent
-until your circuit passes the tests.
diff --git a/doc/getting-started/state.tex b/doc/getting-started/state.tex
deleted file mode 100644
index ac993c25..00000000
--- a/doc/getting-started/state.tex
+++ /dev/null
@@ -1,58 +0,0 @@
-\documentclass[twocolumn, 10pt]{article}
-\setlength\textwidth{6.875in}
-\setlength\textheight{8.875in}
-% set both margins to 2.5 pc
-\setlength{\oddsidemargin}{-0.1875in}% 1 - (8.5 - 6.875)/2
-\setlength{\evensidemargin}{-0.1875in}
-\setlength{\marginparwidth}{0pc}
-\setlength{\marginparsep}{0pc}%
-\setlength{\topmargin}{0in} \setlength{\headheight}{0pt}
-\setlength{\headsep}{0pt}
-\setlength{\footskip}{37pt}%
-%\setlength{\columnsep}{0.3125in}
-%\setlength{\columnwidth}{3.28125in}% (6.875 - 0.3125)/2 = 3.28125in
-\setlength{\parindent}{1pc}
-\newcommand{\myMargin}{1.00in}
-\usepackage[top=\myMargin, left=\myMargin, right=\myMargin, bottom=\myMargin, nohead]{geometry}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{hyperref}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-
-\lstset{basicstyle={\footnotesize\ttfamily}}
-
-\newenvironment{commentary}
-{ \vspace{-0.1in}
- \begin{quotation}
- \noindent
- \small \em
- \rule{\linewidth}{1pt}\\
-}
-{
- \end{quotation}
-}
-
-\title{Getting Started: Tutorial 06 - Conditional Assignments and Memories}
-\author{Jonathan Bachrach, Vincent Lee \\
-EECS Department, UC Berkeley\\
-{\tt \{jrb\}@eecs.berkeley.edu}
-}
-\date{\today}
-
-\newenvironment{example}{\VerbatimEnvironment\begin{footnotesize}\begin{Verbatim}}{\end{Verbatim}\end{footnotesize}}
-\newcommand{\kode}[1]{\begin{footnotesize}{\tt #1}\end{footnotesize}}
-
-\def\code#1{{\tt #1}}
-
-\def\note#1{\noindent{\bf [Note: #1]}}
-%\def\note#1{}
-
-\begin{document}
-\maketitle{}
-
-\input{state-guts}
-
-\end{document}
diff --git a/doc/getting-started/testing-guts.tex b/doc/getting-started/testing-guts.tex
deleted file mode 100644
index e2ca42ec..00000000
--- a/doc/getting-started/testing-guts.tex
+++ /dev/null
@@ -1,179 +0,0 @@
-\section{The Scala Testbench Simulation}
-
-Chisel's Scala based testbench is the first line of defense against simple bugs in your design. The Scala testbench uses several unique Chisel constructs to perform this. To see how this works, let's first explore a simple example.
-
-\subsection{Scala Testbench Example}
-
-Below is the \verb+ByteSelector.scala+ module definition from the previous tutorial and the corresponding Chisel test harness.
-
-\begin{scala}
-package TutorialExamples
-
-import Chisel._
-
-class ByteSelector extends Module {
- val io = new Bundle {
- val in = UInt(INPUT, 32)
- val offset = UInt(INPUT, 2)
- val out = UInt(OUTPUT, 8)
- }
- io.out := UInt(0, width = 8)
- when (io.offset === UInt(0)) {
- io.out := io.in(7,0)
- } .elsewhen (io.offset === UInt(1)) {
- io.out := io.in(15,8)
- } .elsewhen (io.offset === UInt(2)) {
- io.out := io.in(23,16)
- } .otherwise {
- io.out := io.in(31,24)
- }
-}
-
-class ByteSelectorTests(c: ByteSelector)
- extends Tester(c) {
- val test_in = 12345678
- for (t <- 0 until 4) {
- poke(c.io.in, test_in)
- poke(c.io.offset, t)
- step(1)
- expect(c.io.out, (test_in >> (t * 8)) & 0xFF)
- }
-}
-\end{scala}
-
-In the test harness \verb+ByteSelectorTests+ we see that the test portion is written in Scala with some Chisel constructs inside a \verb+Tester+ class definition. The device under test is passed to us as a parameter \verb+c+.
-
-In the \verb+for+ loop, the assignments for each input of the \verb+ByteSelector+ is set to the appropriate values using \verb+poke+. For this particular example, we are testing the \verb+ByteSelector+ by hardcoding the input to some known value and checking if each of the 4 offsets returns the appropriate byte. To do this, on each iteration we generate appropriate inputs to the module and tell the simulation to assign this value to the input of the device we are testing \verb+c+:
-
-\begin{scala}
-val test_in = 12345678
-for (t <- 0 until 4) {
- // set in of the DUT to be some known word
- poke(c.io.in, test_in)
- // set the offset of the DUT
- poke(c.io.offset, t)
- ...
-}
-\end{scala}
-
-Next we step the circuit. We next advance the simulation by calling the \verb+step+ function. This effectively advances the simulation one clock cycle in the presence of sequential logic.
-
-\begin{scala}
-step(1)
-\end{scala}
-
-Finally, we check for expected outputs.
-In this case, we check the expected output of \verb+ByteSelector+ as follows:
-
-\begin{scala}
-expect(c.io.out, (test_in >> (t * 8)) & 0xFF)
-\end{scala}
-
-This defines the reference output expected for this particular cycle of the simulation. Since the circuit we are testing is purely combinational, we expected that the output we define appears on any advancement of the simulation. The \verb+expect+ function will record either true or false after checking if the output generates the expected reference output. The results of successive \verb+expect+'s are anded into a \verb+Tester+ field called \verb+ok+ which starts out as \verb+true+. The value of the \verb+ok+ field determines the success or failure of the tester execution.
-
-Actually \verb+expect+ is defined in terms of \verb+peek+ roughly as follows:
-
-\begin{scala}
-def expect (data: Bits, expected: BigInt) =
- ok = peek(data) == expected && ok
-\end{scala}
-
-where \verb+peek+ gets the value of a signal from the DUT.
-
-\subsection{Simulation Debug Output}
-
-Now suppose we run the testbench for the \verb+ByteSelector+ defined previously. To do this, \verb+cd+ into the \verb+$DIR/problems+ directory and run \verb+make ByteSelector+.
-
-When we run the testbench, we will notice that the simulation produces debug output every time the \verb+step+ function is called. Each of these calls gives the state of the inputs and outputs to the \verb+ByteSelector+ and whether the check between the reference output and expected output matched as shown below:
-
-\begin{bash}
-STARTING ../emulator/problems/ByteSelector
----
-POKE ByteSelector__io_in <- 12345678
-POKE ByteSelector__io_offset <- 0
-STEP 1 <- 0
-PEEK ByteSelector__io_out -> 0x4e
-EXPECT ByteSelector__io_out <- 78 == 78 PASS
-POKE ByteSelector__io_in <- 12345678
-POKE ByteSelector__io_offset <- 1
-STEP 1 <- 0
-PEEK ByteSelector__io_out -> 0x61
-EXPECT ByteSelector__io_out <- 97 == 97 PASS
-...
-POKE ByteSelector__io_in <- 12345678
-POKE ByteSelector__io_offset <- 3
-STEP 1 <- 0
-PEEK ByteSelector__io_out -> 0x00
-EXPECT ByteSelector__io_out <- 0 == 0 PASS
-PASSED // Final pass assertion
-[success] Total time: 6 s, completed Feb 23, 2014 9:52:22 PM
-\end{bash}
-
-Also notice that there is a final pass assertion "PASSED" at the end which corresponds to the \verb+allGood+ at the very end of the testbench. In this case, we know that the test passed since the allGood assertion resulted in a "PASSED". In the event of a failure, the assertion would result in a "FAILED" output message here.
-
-\subsection{General Testbench}
-
-In general, the scala testbench should have the following rough structure:
-
-\begin{itemize}
-\item Set inputs using \verb+poke+
-\item Advance simulation using \verb+step+
-\item Check expected values using \verb+expect+ (and/or \verb+peek+)
-\item Repeat until all appropriate test cases verified
-\end{itemize}
-
-For sequential modules we may want to delay the output definition to the appropriate time as the \verb+step+ function implicitly advances the clock one period in the simulation. Unlike Verilog, you do not need to explicitly specify the timing advances of the simulation; Chisel will take care of these details for you.
-
-\section{\problem{Max2 Testbench}}
-
-In this assignment, write a tester for the \verb+Max2+ circuit:
-
-\begin{scala}
-class Max2 extends Module {
- val io = new Bundle {
- val in0 = UInt(INPUT, 8)
- val in1 = UInt(INPUT, 8)
- val out = UInt(OUTPUT, 8)
- }
- io.out := Mux(io.in0 > io.in0, io.in0, io.in1)
-}
-\end{scala}
-
-\noindent
-found in \verb+$TUT_DIR/problems/Max2.scala+ by filling in the following tester:
-
-\begin{scala}
-class Max2Tests(c: Max2) extends Tester(c) {
- for (i <- 0 until 10) {
- // FILL THIS IN HERE
- poke(c.io.in0, 0)
- poke(c.io.in1, 0)
- // FILL THIS IN HERE
- step(1)
- expect(c.io.out, 1)
- }
-}
-\end{scala}
-
-\noindent
-using random integers generated as follows:
-
-\begin{scala}
-// returns random int in 0..lim-1
-val in0 = rnd.nextInt(lim)
-\end{scala}
-
-\noindent
-Run
-
-\begin{bash}
-make Max2.out
-\end{bash}
-
-\noindent
-until the circuit passes your tests.
-
-\section{Limitations of the Testbench}
-
-The Chisel testbench works well for simple tests and small numbers of simulation iterations. However, for larger test cases, the Chisel testbench quickly becomes more complicated and slower simply due to the inefficiency of the infrastructure. For these larger and more complex test cases, we recommend using the C++ emulator or Verilog test harnesses which run faster and can handle more rigorous test cases.
-
diff --git a/doc/getting-started/testing.tex b/doc/getting-started/testing.tex
deleted file mode 100644
index 3c068cd9..00000000
--- a/doc/getting-started/testing.tex
+++ /dev/null
@@ -1,58 +0,0 @@
-\documentclass[twocolumn, 10pt]{article}
-\setlength\textwidth{6.875in}
-\setlength\textheight{8.875in}
-% set both margins to 2.5 pc
-\setlength{\oddsidemargin}{-0.1875in}% 1 - (8.5 - 6.875)/2
-\setlength{\evensidemargin}{-0.1875in}
-\setlength{\marginparwidth}{0pc}
-\setlength{\marginparsep}{0pc}%
-\setlength{\topmargin}{0in} \setlength{\headheight}{0pt}
-\setlength{\headsep}{0pt}
-\setlength{\footskip}{37pt}%
-%\setlength{\columnsep}{0.3125in}
-%\setlength{\columnwidth}{3.28125in}% (6.875 - 0.3125)/2 = 3.28125in
-\setlength{\parindent}{1pc}
-\newcommand{\myMargin}{1.00in}
-\usepackage[top=\myMargin, left=\myMargin, right=\myMargin, bottom=\myMargin, nohead]{geometry}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{hyperref}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-
-\lstset{basicstyle={\footnotesize\ttfamily}}
-
-\newenvironment{commentary}
-{ \vspace{-0.1in}
- \begin{quotation}
- \noindent
- \small \em
- \rule{\linewidth}{1pt}\\
-}
-{
- \end{quotation}
-}
-
-\title{Getting Started - Tutorial 04: Writing Scala Testbenches}
-\author{Jonathan Bachrach, Vincent Lee \\
-EECS Department, UC Berkeley\\
-{\tt \{jrb\}@eecs.berkeley.edu}
-}
-\date{\today}
-
-\newenvironment{example}{\VerbatimEnvironment\begin{footnotesize}\begin{Verbatim}}{\end{Verbatim}\end{footnotesize}}
-\newcommand{\kode}[1]{\begin{footnotesize}{\tt #1}\end{footnotesize}}
-
-\def\code#1{{\tt #1}}
-
-\def\note#1{\noindent{\bf [Note: #1]}}
-%\def\note#1{}
-
-\begin{document}
-\maketitle{}
-
-\input{testing-guts}
-
-\end{document}
diff --git a/doc/html.cfg b/doc/html.cfg
deleted file mode 100644
index 6951fdef..00000000
--- a/doc/html.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-\Preamble{xhtml}
- \Configure{graphics*}
- {pdf}
- {\Needs{"convert \csname Gin@base\endcsname.pdf
- \csname Gin@base\endcsname.png"}%
- \Picture[pict]{\csname Gin@base\endcsname.png}%
- }
-\begin{document}
-\EndPreamble
diff --git a/doc/installation/installation.tex b/doc/installation/installation.tex
deleted file mode 100644
index f244bf1e..00000000
--- a/doc/installation/installation.tex
+++ /dev/null
@@ -1,301 +0,0 @@
-\documentclass[twocolumn, 10pt]{article}
-\setlength\textwidth{6.875in}
-\setlength\textheight{8.875in}
-% set both margins to 2.5 pc
-\setlength{\oddsidemargin}{-0.1875in}% 1 - (8.5 - 6.875)/2
-\setlength{\evensidemargin}{-0.1875in}
-\setlength{\marginparwidth}{0pc}
-\setlength{\marginparsep}{0pc}%
-\setlength{\topmargin}{0in} \setlength{\headheight}{0pt}
-\setlength{\headsep}{0pt}
-\setlength{\footskip}{37pt}%
-%\setlength{\columnsep}{0.3125in}
-%\setlength{\columnwidth}{3.28125in}% (6.875 - 0.3125)/2 = 3.28125in
-\setlength{\parindent}{1pc}
-\newcommand{\myMargin}{1.00in}
-\usepackage[top=\myMargin, left=\myMargin, right=\myMargin, bottom=\myMargin, nohead]{geometry}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{hyperref}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-
-\lstset{basicstyle={\footnotesize\ttfamily}}
-
-\newenvironment{commentary}
-{ \vspace{-0.1in}
- \begin{quotation}
- \noindent
- \small \em
- \rule{\linewidth}{1pt}\\
-}
-{
- \end{quotation}
-}
-
-% \newenvironment{kode}%
-% {\footnotesize
-% %\setlength{\parskip}{0pt}
-% %\setlength{\topsep}{0pt}
-% %\setlength{\partopsep}{0pt}
-% \verbatim}
-% {\endverbatim
-% %\vspace*{-0.1in}
-% }
-
-% \newenvironment{kode}%
-% {\VerbatimEnvironment
-% \footnotesize\begin{Sbox}\begin{minipage}{6in}\begin{Verbatim}}%
-% {\end{Verbatim}\end{minipage}\end{Sbox}
-% \setlength{\fboxsep}{8pt}\fbox{\TheSbox}}
-
-% \newenvironment{kode}
-% {\begin{Sbox}
-% \footnotesize
-% \begin{minipage}{6in}
-% %\setlength{\parskip}{0pt}
-% %\setlength{\topsep}{0pt}
-% %\setlength{\partopsep}{0pt}
-% \verbatim}
-% {\endverbatim
-% \end{minipage}
-% \end{Sbox}
-% \fbox{\TheSbox}
-% %\vspace*{-0.1in}
-% }
-
-\title{Chisel Installation}
-\author{Jonathan Bachrach \\
-EECS Department, UC Berkeley\\
-{\tt \{jrb\}@eecs.berkeley.edu}
-}
-\date{\today}
-
-\newenvironment{example}{\VerbatimEnvironment\begin{footnotesize}\begin{Verbatim}}{\end{Verbatim}\end{footnotesize}}
-\newcommand{\kode}[1]{\begin{footnotesize}{\tt #1}\end{footnotesize}}
-
-\def\code#1{{\tt #1}}
-
-\def\note#1{\noindent{\bf [Note: #1]}}
-%\def\note#1{}
-
-\begin{document}
-\maketitle{}
-
-\section{Introduction}
-
-This document is an installation guide for {\em Chisel} (Constructing
-Hardware In a Scala Embedded Language). Chisel is a hardware
-construction language embedded in the high-level programming language
-Scala.
-
-\subsection{Github}
-
-\begin{itemize}
-\item Get an account on \verb|www.github.com|
-\item Register your public key on \verb|github.com|
-\end{itemize}
-
-\subsection{Development Tool Installation}
-
-\subsubsection{MacOSX}
-
-\begin{enumerate}
-\item Install XCODE including console tools.
-\item Install MacPorts from \url{http://www.macports.org}
-\end{enumerate}
-
-\noindent
-From there install the following MacPorts packages:
-
-\begin{enumerate}
-\item \verb+git+
-\item \verb+openjdk6+
-\end{enumerate}
-
-\noindent
-using
-
-\begin{bash}
-sudo port install
-\end{bash}
-
-\subsubsection{Linux}
-
-To install Chisel on Linux, install the following packages:
-
-\begin{enumerate}
-\item \verb+git+
-\item \verb|g++|
-\item \verb+openjdk-7-jre+
-\item \verb+openjdk-7-jdk+
-\end{enumerate}
-
-\noindent
-using
-
-\begin{bash}
-sudo apt-get install
-\end{bash}
-
-% To install Chisel on Linux, download and run the \verb|install| script
-% provided on the website. Note: python must be installed for
-% this script to work. The script does the following:
-% \begin{enumerate}
-% \item installs \verb|g++| if necessary
-% \item installs Java runtime and compiler if necessary
-% \item installs \verb+git+ if necessary
-% \item prompts for a location to install Chisel (needs an absolute path)\label{step:chiseldir}
-% \item clones Chisel into the location provided by Step~\ref{step:chiseldir}
-% \end{enumerate}
-%
-% After running the installation script, you need to set the CHISEL
-% environment variable in your bashrc file to point to where you
-% installed Chisel in Step~\ref{step:chiseldir}.
-%
-% \subsection{Verify}
-% To verify that everything has been configured correctly, download
-% run the \verb|verify| script provided on teh website. The
-% script will run the compiler on simple use case. If everything
-% goes correctly, you should find the following files in
-% $CHISEL/emulator:
-% \begin{itemize}
-% \item GCD-emulator.cpp
-% \item GCD-makefile
-% \item GCD.h
-% \item GCD.cpp
-% \end{itemize}
-
-\section{Setting Up Tutorial}
-
-\verb+cd+ above directory = \verb+$DIR+ you've chosen to place Chisel tutorial and type:
-
-\begin{bash}
-cd $DIR
-git clone https://github.com/ucb-bar/chisel-tutorial.git
-\end{bash}
-
-\noindent
-Your copy of the Chisel Tutorial repository will then be in \verb+$DIR/chisel-tutorial+. Define this as a variable in your bash environment:
-
-The following is the Chisel tutorial directory structure:
-
-\begin{bash}
-chisel-tutorial/
- src/
- problems/
- Accumulator.scala ...
- solutions/
- Accumulator.scala ...
- emulator/
- problems/
- Makefile
- solutions/
- Makefile
- verilog/
- problems/
- Makefile
- solutions/
- Makefile
- sbt/
- project/
- build.scala
-\end{bash}
-
-\noindent
-The tutorial is split into problems and solutions, where the problems have some piece of the design to be filled in by the user and where the solutions are meant to be complete designs that should pass the given tests. In order to run either, you change directory into the appropriate subdirectory and type make of the particular lesson name:
-
-\begin{bash}
-cd $CHISEL/tutorial/emulator/solutions
-make GCD
-\end{bash}
-
-\noindent
-or you can run all tests using
-
-\begin{bash}
-cd $CHISEL/tutorial/emulator/solutions
-make all
-\end{bash}
-
-\noindent
-and the output should show that all tests have passed.
-
-In order to produce Verilog, just do the following:
-
-\begin{bash}
-cd $CHISEL/tutorial/verilog/solutions
-make all
-\end{bash}
-
-\section{Creating Your Own Projects}
-
-SBT has a particular directory structure that we adhere to and
-somewhat improve. Assuming that we have a project named {\em gpu},
-then the following would be the directory structure template:
-
-\begin{bash}
-gpu/
- sbt/
- project/
- build.scala # edit this as shown below
- src/
- gpu.scala # your source files go here
- emulator/ # your C++ target can go here
- verilog/ # your Verilog target can go here
-\end{bash}
-
-\noindent
-and the following is the \verb+build.scala+ template:
-
-\begin{scala}
-import sbt._
-import Keys._
-
-object BuildSettings {
- val buildOrganization = "edu.berkeley.cs"
- val buildVersion = "1.1"
- val buildScalaVersion = "2.10.4"
-
- def apply(projectdir: String) = {
- Defaults.defaultSettings ++ Seq (
- organization := buildOrganization,
- version := buildVersion,
- scalaVersion := buildScalaVersion,
- scalaSource in Compile :=
- Path.absolute(file(projectdir + "/src"))
- libraryDependencies +=
- "edu.berkeley.cs" %% "chisel" % "latest.release"
- )
- }
-}
-
-object ChiselBuild extends Build {
- import BuildSettings._
- lazy val gpu =
- Project("gpu", file("gpu"),
- settings = BuildSettings(".."))
- dependsOn(chisel)
-}
-\end{scala}
-
-If you want to update your version of Chisel, all you have to do is
-change the version number for Chisel. For instance,
-
-\begin{scala}
-libraryDependencies += "edu.berkeley.cs" %% "chisel" % "1.0"
-\end{scala}
-
-\noindent
-is using release 1.0, and
-
-\begin{scala}
-libraryDependencies += "edu.berkeley.cs" %% "chisel" % "1.0.1"
-\end{scala}
-
-\noindent
-is using release 1.0.1
-
-\end{document}
diff --git a/doc/manual/beramono.sty b/doc/manual/beramono.sty
deleted file mode 100644
index fcbc324c..00000000
--- a/doc/manual/beramono.sty
+++ /dev/null
@@ -1,32 +0,0 @@
-\ProvidesPackage{beramono}[2004/01/31 (WaS)]
-\RequirePackage{keyval}
-\define@key{Fvm}{scaled}[.9]{%
- \def\fvm@Scale{#1}}
-\def\ProcessOptionsWithKV#1{%
- \let\@tempc\relax
- \let\Fvm@tempa\@empty
- \@for\CurrentOption:=\@classoptionslist\do{%
- \@ifundefined{KV@#1@\CurrentOption}%
- {}%
- {%
- \edef\Fvm@tempa{\Fvm@tempa,\CurrentOption,}%
- \@expandtwoargs\@removeelement\CurrentOption
- \@unusedoptionlist\@unusedoptionlist
- }%
- }%
- \edef\Fvm@tempa{%
- \noexpand\setkeys{#1}{%
- \Fvm@tempa\@ptionlist{\@currname.\@currext}%
- }%
- }%
- \Fvm@tempa
- \let\CurrentOption\@empty
-}
-\ProcessOptionsWithKV{Fvm}
-\AtEndOfPackage{%
- \let\@unprocessedoptions\relax
-}
-\renewcommand{\ttdefault}{fvm}
-\endinput
-%%
-%% End of file `beramono.sty'.
diff --git a/doc/manual/figs/bits-1.graffle b/doc/manual/figs/bits-1.graffle
deleted file mode 100644
index 2c15dfc9..00000000
--- a/doc/manual/figs/bits-1.graffle
+++ /dev/null
@@ -1,352 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.18.0.187838
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {577, 533}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- CanvasSize
- {577, 533}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-16 00:15:06 +0000
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- FileType
- flat
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{252, 384.99200000000002}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1168
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Lit(1)}
- VerticalPad
- 0
-
-
-
- Bounds
- {{252, 302.99200000000002}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1167
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-UInt}
- VerticalPad
- 0
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1168
-
- ID
- 1169
- Points
-
- {288, 348.49200000000002}
- {288, 384.49200000000002}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1167
-
-
-
- GridInfo
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 2
- ImageCounter
- 3
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2013-07-30 21:15:05 +0000
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- OutlineStyle
- Basic
- PageBreaks
- NO
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSHorizonalPagination
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- size
- {611.99999713897705, 792}
-
- NSPrintReverseOrientation
-
- int
- 0
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
- FitInWindow
-
- Frame
- {{301, 627}, {717, 626}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- Sidebar
-
- SidebarWidth
- 138
- VisibleRegion
- {{1, 1}, {575, 532}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 0.0
- 1
-
-
-
-
-
diff --git a/doc/manual/figs/bits-1.pdf b/doc/manual/figs/bits-1.pdf
deleted file mode 100644
index b6f74503..00000000
Binary files a/doc/manual/figs/bits-1.pdf and /dev/null differ
diff --git a/doc/manual/figs/bits-and.graffle b/doc/manual/figs/bits-and.graffle
deleted file mode 100644
index 6949936f..00000000
--- a/doc/manual/figs/bits-and.graffle
+++ /dev/null
@@ -1,614 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.18.0.187838
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {632.2101313320826, 584}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- CanvasSize
- {632.2101313320826, 584}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-15 18:24:36 +0000
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- FileType
- flat
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{297, 466.98399999999998}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1174
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Lit(2)}
- VerticalPad
- 0
-
-
-
- Bounds
- {{297, 384.98399999999998}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1165
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-UInt}
- VerticalPad
- 0
-
-
-
- Bounds
- {{207, 466.98399999999998}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1166
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Lit(1)}
- VerticalPad
- 0
-
-
-
- Bounds
- {{207, 384.98399999999998}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1163
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-UInt}
- VerticalPad
- 0
-
-
-
- Bounds
- {{252, 302.98399999999998}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1168
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Op(&)}
- VerticalPad
- 0
-
-
-
- Bounds
- {{252, 220.98400000000001}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1167
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-UInt}
- VerticalPad
- 0
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1168
-
- ID
- 1169
- Points
-
- {288, 266.48400000000004}
- {288, 302.48399999999998}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1167
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1163
-
- ID
- 1170
- Points
-
- {275.41183610528583, 348.4223330470258}
- {255.58797066071944, 384.54566538128557}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1168
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1165
-
- ID
- 1171
- Points
-
- {300.58816389471417, 348.4223330470258}
- {320.41202933928059, 384.54566538128557}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1168
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1166
-
- ID
- 1172
- Points
-
- {243, 430.48399999999998}
- {243, 466.48399999999998}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1163
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1174
-
- ID
- 1173
- Points
-
- {333, 430.48399999999998}
- {333, 466.48399999999998}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1165
-
-
-
- GridInfo
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 2
- ImageCounter
- 3
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2013-07-30 21:15:32 +0000
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- OutlineStyle
- Basic
- PageBreaks
- NO
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSHorizonalPagination
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- size
- {611.99999713897705, 792}
-
- NSPrintReverseOrientation
-
- int
- 0
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
- FitInWindow
-
- Frame
- {{1124, 376}, {717, 626}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- Sidebar
-
- SidebarWidth
- 138
- VisibleRegion
- {{1.0970537062243479, 1.0970537062243479}, {630.80588107899996, 583.63257171135308}}
- Zoom
- 0.91153240203857422
- ZoomValues
-
-
- Canvas 1
- 0.0
- 1
-
-
-
-
-
diff --git a/doc/manual/figs/bits-and.pdf b/doc/manual/figs/bits-and.pdf
deleted file mode 100644
index dfa7ffe9..00000000
Binary files a/doc/manual/figs/bits-and.pdf and /dev/null differ
diff --git a/doc/manual/figs/bits-or-and.graffle b/doc/manual/figs/bits-or-and.graffle
deleted file mode 100644
index 71446108..00000000
--- a/doc/manual/figs/bits-or-and.graffle
+++ /dev/null
@@ -1,1024 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.18.0.187838
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {722.06191369606006, 667}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- CanvasSize
- {722.06191369606006, 667}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-15 18:25:38 +0000
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- FileType
- flat
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{274.5, 549.01199999999994}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1183
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
- MiddleColor
-
- b
- 0.588235
- g
- 0.917647
- r
- 0.568627
-
- TrippleBlend
- YES
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Lit(2)}
- VerticalPad
- 0
-
-
-
- Bounds
- {{274.5, 467.012}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1166
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
- MiddleColor
-
- b
- 0.588235
- g
- 0.917647
- r
- 0.568627
-
- TrippleBlend
- YES
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-UInt}
- VerticalPad
- 0
-
-
-
- Bounds
- {{184.5, 549.01199999999994}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1181
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Lit(1)}
- VerticalPad
- 0
-
-
-
- Bounds
- {{184.5, 467.012}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1163
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-UInt}
- VerticalPad
- 0
-
-
-
- Bounds
- {{229.5, 385.012}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1168
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
- MiddleColor
-
- b
- 0.588235
- g
- 0.917647
- r
- 0.568627
-
- TrippleBlend
- YES
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Op(&)}
- VerticalPad
- 0
-
-
-
- Bounds
- {{319.5, 385.012}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1179
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Lit(3)}
- VerticalPad
- 0
-
-
-
- Bounds
- {{319.5, 303.012}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1172
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-UInt}
- VerticalPad
- 0
-
-
-
- Bounds
- {{229.5, 303.012}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1167
- Shape
- Rectangle
- Style
-
- fill
-
- FillType
- 2
- GradientAngle
- 90
- GradientColor
-
- w
- 0.666667
-
- MiddleColor
-
- b
- 0.588235
- g
- 0.917647
- r
- 0.568627
-
- TrippleBlend
- YES
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-UInt}
- VerticalPad
- 0
-
-
-
- Bounds
- {{274.5, 221.012}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1173
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Op(|)}
- VerticalPad
- 0
-
-
-
- Bounds
- {{274.5, 139.012}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1176
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-UInt}
- VerticalPad
- 0
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1168
-
- ID
- 1169
- Points
-
- {265.5, 348.512}
- {265.5, 384.512}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1167
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1163
-
- ID
- 1170
- Points
-
- {252.91189443734092, 430.45033350292323}
- {233.08812081774249, 466.57366662158393}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1168
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1166
-
- ID
- 1171
- Points
-
- {278.08810556265905, 430.45033350292323}
- {297.91187918225751, 466.57366662158393}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1168
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1167
-
- ID
- 1174
- Points
-
- {297.91189443734095, 266.45033350292317}
- {278.08812081774249, 302.57366662158393}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1173
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1172
-
- ID
- 1175
- Points
-
- {323.08810556265905, 266.45033350292317}
- {342.91187918225751, 302.57366662158393}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1173
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1173
-
- ID
- 1177
- Points
-
- {310.5, 184.512}
- {310.5, 220.512}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1176
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1179
-
- ID
- 1178
- Points
-
- {355.5, 348.512}
- {355.5, 384.512}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1172
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1181
-
- ID
- 1180
- Points
-
- {220.5, 512.51199999999994}
- {220.5, 548.51199999999994}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1163
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1183
-
- ID
- 1182
- Points
-
- {310.5, 512.51199999999994}
- {310.5, 548.51199999999994}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1166
-
-
-
- GridInfo
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 2
- ImageCounter
- 3
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2013-07-30 21:14:33 +0000
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- OutlineStyle
- Basic
- PageBreaks
- NO
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSHorizonalPagination
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- size
- {611.99999713897705, 792}
-
- NSPrintReverseOrientation
-
- int
- 0
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
- FitInWindow
-
- Frame
- {{301, 478}, {717, 626}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- Sidebar
-
- SidebarWidth
- 138
- VisibleRegion
- {{1.2530329100446431, 1.2530329100446431}, {720.49392327566977, 666.6135081437501}}
- Zoom
- 0.79806363582611084
- ZoomValues
-
-
- Canvas 1
- 0.0
- 1
-
-
-
-
-
diff --git a/doc/manual/figs/bits-or-and.pdf b/doc/manual/figs/bits-or-and.pdf
deleted file mode 100644
index 218a978d..00000000
Binary files a/doc/manual/figs/bits-or-and.pdf and /dev/null differ
diff --git a/doc/manual/figs/node-hierarchy.graffle b/doc/manual/figs/node-hierarchy.graffle
deleted file mode 100644
index b8258372..00000000
--- a/doc/manual/figs/node-hierarchy.graffle
+++ /dev/null
@@ -1,926 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 138.33.0.157554
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {604.847, 543}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- CanvasOrigin
- {0, 0}
- CanvasSize
- {604.847, 543}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-15 10:53:49 -0700
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- FileType
- flat
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{387, 425.988}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1163
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Mem}
- VerticalPad
- 0
-
-
-
- Bounds
- {{297, 425.988}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1169
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Reg}
- VerticalPad
- 0
-
-
-
- Bounds
- {{207, 425.988}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1192
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Data}
- VerticalPad
- 0
-
-
-
- Bounds
- {{207, 343.988}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1168
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Op}
- VerticalPad
- 0
-
-
-
- Bounds
- {{117, 343.988}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1183
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Lit}
- VerticalPad
- 0
-
-
-
- Bounds
- {{297, 343.988}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1166
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Updateable}
- VerticalPad
- 0
-
-
-
- Bounds
- {{207, 261.988}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1167
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Node}
- VerticalPad
- 0
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1168
-
- ID
- 1170
- Points
-
- {243, 307.488}
- {243, 343.488}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1167
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1183
-
- ID
- 1182
- Points
-
- {217.935, 307.325}
- {178.065, 343.651}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1167
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1192
-
- ID
- 1193
- Points
-
- {307.935, 389.325}
- {268.065, 425.651}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1166
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1169
-
- ID
- 1194
- Points
-
- {333, 389.488}
- {333, 425.488}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1166
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1163
-
- ID
- 1195
- Points
-
- {358.065, 389.325}
- {397.935, 425.651}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1166
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1166
-
- ID
- 1197
- Points
-
- {268.065, 307.325}
- {307.935, 343.651}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1167
-
-
-
- GridInfo
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 2
- ImageCounter
- 3
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2012-05-22 23:15:43 -0700
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- OutlineStyle
- Basic
- PageBreaks
- NO
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAx7X05TU2l6ZT1mZn2WgWQCgRgDhg==
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- QuickLookPreview
-
- JVBERi0xLjMKJcTl8uXrp/Og0MTGCjUgMCBvYmoKPDwgL0xlbmd0aCA2IDAgUiAvRmls
- dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGVVMtu20AMvO9X8OgcvFku9yFd67aH
- oA+kVtFD0YPr2EWDuE1q/z86XMeSbclKa8GQFuAsh8Mhn+iWnsjhicIUg9CfFX2hX3Q9
- 2zItt8Tl2S5p6mwk/ScXbBVyPESvEXFDbO73mNm8XOdoPsPNXA5Tfenlyw35VFmXQiZx
- 2YrHx6Z81hKFJIhNkcU80Lww6+MlHvBV3eLrbAs++FjwNIw3yC+CNICGqtLMOClIT8MY
- 5axU9/zanKat44WcpWY+4LuaOR/qeLlmD+mUw55zOQHUcfYuk5dkHXvKnkK0Dj9v0Mv1
- cBMUkNjWKLsAtO2qONrute2O0PKj9mlOD+UjexXxVQMraApqloSkaqAp3lMOFj2EOQI1
- G7p+y9bBA82aJh9+362uqLmnN80+j9rLtPbydSaOoStBGV0gj1A1yil5c5m8NplzUvLa
- jYvkxdlUc2AK5oz858e7xW61+P7QL6HMB6tczEMlmCMV2yHQ0H4JI/ozhuO5hFH9kxXR
- Gvr6v/u5G5MfhvhX+RHa5z4iv3rnVH7skiHzYCCc1C719f/42OPe6a7uzx7O4bru3Nz3
- jgqnsTqwp94ZEV7J1wHW0cuPzWPOne9tylJhnZw7//VitxijDzuf0h+ZW8T+F321/oH+
- qHEYk+pSNWCcT6sfPfbd3Ep1zv7y4GrsOXsztnWC79g/i3+ybARuF4d5bSUHMSybrzR5
- j0mFzTxNNlf0jZqb/d65/QuiI3f1CmVuZHN0cmVhbQplbmRvYmoKNiAwIG9iago1NTUK
- ZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCA0IDAgUiAvUmVzb3Vy
- Y2VzIDcgMCBSIC9Db250ZW50cyA1IDAgUiAvTWVkaWFCb3ggWzAgMCA1MzEgNTQzXQo+
- PgplbmRvYmoKNyAwIG9iago8PCAvUHJvY1NldCBbIC9QREYgL1RleHQgXSAvQ29sb3JT
- cGFjZSA8PCAvQ3MyIDkgMCBSIC9DczEgOCAwIFIgPj4gL0ZvbnQgPDwKL0YxLjAgMTAg
- MCBSID4+ID4+CmVuZG9iagoxMSAwIG9iago8PCAvTGVuZ3RoIDEyIDAgUiAvTiAxIC9B
- bHRlcm5hdGUgL0RldmljZUdyYXkgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFt
- CngBhVJPSBRRHP7NNhKEiEGFeIh3CgmVKaysoNp2dVmVbVuV0qIYZ9+6o7Mz05vZNcWT
- BF2iPHUPomN07NChm5eiwKxL1yCpIAg8dej7zezqKIRveTvf+/39ft97RG2dpu87KUFU
- c0OVK6Wnbk5Ni4MfKUUd1E5YphX46WJxjLHruZK/u9fWZ9LYst7HtXb79j21lWVgIeot
- trcQ+iGRZgAfmZ8oZYCzwB2Wr9g+ATxYDqwa8COiAw+auTDT0Zx0pbItkVPmoigqr2I7
- Sa77+bnGvou1iYP+XI9m1o69s+qq0UzUtPdEobwPrkQZz19U9mw1FKcN45xIQxop8q7V
- 3ytMxxGRKxBKBlI1ZLmfak6ddeB1GLtdupPj+PYQpT7JYKiJtemymR2FfQB2KsvsEPAF
- 6PGyYg/ngXth/1tRw5PAJ2E/ZId51q0f9heuU+B7hD014M4UrsXx2oofXi0BQ/dUI2iM
- c03E09c5c6SI7zHUGZj3RjmmCzF3lqoTN4A7YR9ZqmYKsV37ruol7nsCd9PjO9GbOQtc
- oBxJcrEV2RTQPAlYFH2LsEkOPD7OHlXgd6iYwBy5idzNKPce1REbZ6NSgVZ6jVfGT+O5
- 8cX4ZWwYz4B+rHbXe3z/6eMVdde2Pjz5jXrcOa69nRtVYVZxZQvd/8cyhI/ZJzmmwdOh
- WVhr2HbkD5rMTLAMKMR/BT6X+pITVdzV7u24RRLMUD4sbCW6S1RuKdTqPYNKrBwr2AB2
- cJLELFocuFNrujl4d9giem35TVey64b++vZ6+9ryHm3KqCkoE82zRGaUsVuj5N142/1m
- kRGfODq+572KWsn+SUUQP4U5WiryFFX0VlDWxG9nDn4btn5cP6Xn9UH9PAk9rZ/Rr+ij
- Eb4MdEnPwnNRH6NJ8LBpIeISoIqDM9ROVGONA+Ip8fK0W2SR/Q9AGf1mCmVuZHN0cmVh
- bQplbmRvYmoKMTIgMCBvYmoKNzA0CmVuZG9iago5IDAgb2JqClsgL0lDQ0Jhc2VkIDEx
- IDAgUiBdCmVuZG9iagoxMyAwIG9iago8PCAvTGVuZ3RoIDE0IDAgUiAvTiAzIC9BbHRl
- cm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGF
- VM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZuNuvuJrWliOTi
- 0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731vdt8ADXLSNPWA
- BOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7d7J3rZrStpoH
- hP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFkifEA1Lc5/TbhT
- zSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHC
- CxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJK
- gnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQ
- EEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8
- Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwa
- P+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7PLrXWc62JizdW
- m5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinS
- bZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIv
- bODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOW
- ls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw
- /bBS+fmsUtl+ThrWgZf6b8C8/UUKZW5kc3RyZWFtCmVuZG9iagoxNCAwIG9iago3MzcK
- ZW5kb2JqCjggMCBvYmoKWyAvSUNDQmFzZWQgMTMgMCBSIF0KZW5kb2JqCjQgMCBvYmoK
- PDwgL1R5cGUgL1BhZ2VzIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdIC9Db3VudCAxIC9L
- aWRzIFsgMyAwIFIgXSA+PgplbmRvYmoKMTUgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cg
- L091dGxpbmVzIDIgMCBSIC9QYWdlcyA0IDAgUiA+PgplbmRvYmoKMiAwIG9iago8PCAv
- TGFzdCAxNiAwIFIgL0ZpcnN0IDE3IDAgUiA+PgplbmRvYmoKMTcgMCBvYmoKPDwgL1Bh
- cmVudCAxOCAwIFIgL0NvdW50IDAgL0Rlc3QgWyAzIDAgUiAvWFlaIDAgNTQzIDAgXSAv
- VGl0bGUgKENhbnZhcyAxKQo+PgplbmRvYmoKMTggMCBvYmoKPDwgPj4KZW5kb2JqCjE2
- IDAgb2JqCjw8IC9QYXJlbnQgMTggMCBSIC9Db3VudCAwIC9EZXN0IFsgMyAwIFIgL1hZ
- WiAwIDU0MyAwIF0gL1RpdGxlIChDYW52YXMgMSkKPj4KZW5kb2JqCjE5IDAgb2JqCjw8
- IC9MZW5ndGggMjAgMCBSIC9MZW5ndGgxIDk2MzIgL0ZpbHRlciAvRmxhdGVEZWNvZGUg
- Pj4Kc3RyZWFtCngBvVp5fFTV9T/37bNkMjOZfZ9MZiaTfSEhIYEMIQkJEAgJS4IEkkDY
- hBoxpoJiowWRiPxEBBSsgkvYigwBYYDCj1IU7KJYFZVqqy1aquZj7Q+1BWbmd96bECGf
- 1g9/+Ol7c+7+7j33e88957z7pnPp3e2QAN1AQ92M1o55IF0pLgDSPWdJa0c8nyRGy+d0
- dWK5eLGpAPTieR3zl8TzwhMAcvv8xcsGnk96AUCtXtDeOjdeD9cwLlyABfE8GYZxyoIl
- nffE89qDGE9YfMecgfqk+zCfuqT1noHx4QPMu37UuqQ93t4j9pfSccddnQN58fnqjqXt
- A+1JI/L3BhAsTYI7QAa3Aw8UqPFuBuAvye3AYK1Yj9fcDMWG2YmlX4NGkPKza/9Hil91
- /+L8P9uv+RXrhX9hgex6ezHmAtEAgJJgfb9i/WCN9BwGSWFoSA9DDVIZUgFSevpoE3ST
- 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
- k1JGlqVUTWt4esq6yHDq0u1163oj66ljS/LGP/NG5Kwo5yWx9xk3MxHf9kxghseC+U8K
- m9RPGV5kdgq96l2GsHBWeJf5RPU3nXKEwNlNvNKuVZh5s1lP+RMtVplfb7ZYw0R2wL10
- QHvc7GXEXc0MMDI+RZIMd7qG8hHeiCk2AVNyndIHRI2BYOB8hFZhIBrbuJOJliRFKzlX
- OFeUUS3uegptNDqZ+Tz10aqcCUdf3LTpefwQeS367YfRa0T7V66TJPZumvXEtb49F+kL
- 0S/QlESiL5H0a2iwg6xoF6NTGS/uaxUkQ2cwY5eww0ilCi6bRsXZ9Xwip7LbFMkqym+y
- pMjRKroDyYlmT8q/tYrSZtWgkpRUoc1gBdbiY3xgxYmxBgyIWeUD2ijNSZqRaBtFSyiu
- HvoOoi0kA+uMH4dEvYbugsZDvbrDW3X0WKUXw2jWvsLgbfceih7u3LKsPqfk4LK3ft89
- c/+xuVvum95L719Xk1oa/RvO8blNswscNZEPxf1gjH1JydgZuKL1LydkyU+qSJiUBb2M
- odhIcyq5xoKiil8QA6BX6RNpJ03R1wz4VnzNPX9F3ERGmotPiw6vOi6i2aKARkr71ZGL
- 0sbBPRh3HAd8HF8B2sD8nYf27PHpcxMcOucY//0z1q9nZ0Tf2RCpLEpSEGqdTHhgPvXK
- BkkXYIBfntvx++i/u8S/6/ghG7+p5eKbdgF+J66ASumr6zj8rjoJv/vW45fc6diK4ElE
- /PSDw9MJGDN56uhx09Kr2xd3tXcunNMqtbg+whRMtCB1IHUjPYa0DSmEdBLpHNJHSH8X
- u0VSI7mQcpCCSHVILUgdsYEL8BpME+Tx5vyEIfnaIfmJQ/KThuTrh+SnDsmLs7tx/LYh
- +blD8hLWN/A7f0j9wiF58Szpxv6l/0rd8PwdQ+o7huQ7xfz/A+fEBWMKZW5kc3RyZWFt
- CmVuZG9iagoyMCAwIG9iago2MjUzCmVuZG9iagoyMSAwIG9iago8PCAvVHlwZSAvRm9u
- dERlc2NyaXB0b3IgL0FzY2VudCA3NzAgL0NhcEhlaWdodCA3MzcgL0Rlc2NlbnQgLTIz
- MCAvRmxhZ3MgMzIKL0ZvbnRCQm94IFstOTUxIC00ODEgMTQ0NSAxMTIyXSAvRm9udE5h
- bWUgL0NRVUFKVitIZWx2ZXRpY2EgL0l0YWxpY0FuZ2xlIDAKL1N0ZW1WIDAgL01heFdp
- ZHRoIDE1MDAgL1hIZWlnaHQgNjM3IC9Gb250RmlsZTIgMTkgMCBSID4+CmVuZG9iagoy
- MiAwIG9iagpbIDcyMiAwIDAgMCAwIDAgMCAwIDU1NiA4MzMgNzIyIDc3OCAwIDAgNzIy
- IDAgMCA3MjIgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjU1NiA1NTYgMCA1NTYgNTU2IDAg
- NTU2IDAgMjIyIDAgMCAyMjIgODMzIDAgNTU2IDU1NiAwIDAgMCAyNzggXQplbmRvYmoK
- MTAgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNlRm9u
- dCAvQ1FVQUpWK0hlbHZldGljYSAvRm9udERlc2NyaXB0b3IKMjEgMCBSIC9XaWR0aHMg
- MjIgMCBSIC9GaXJzdENoYXIgNjggL0xhc3RDaGFyIDExNiAvRW5jb2RpbmcgL01hY1Jv
- bWFuRW5jb2RpbmcKPj4KZW5kb2JqCjIzIDAgb2JqCihNYWMgT1MgWCAxMC42LjggUXVh
- cnR6IFBERkNvbnRleHQpCmVuZG9iagoyNCAwIG9iagooRDoyMDEyMDUyMzA4MTczOVow
- MCcwMCcpCmVuZG9iagoxIDAgb2JqCjw8IC9Qcm9kdWNlciAyMyAwIFIgL0NyZWF0aW9u
- RGF0ZSAyNCAwIFIgL01vZERhdGUgMjQgMCBSID4+CmVuZG9iagp4cmVmCjAgMjUKMDAw
- MDAwMDAwMCA2NTUzNSBmIAowMDAwMDEwMDYxIDAwMDAwIG4gCjAwMDAwMDI3OTMgMDAw
- MDAgbiAKMDAwMDAwMDY3MCAwMDAwMCBuIAowMDAwMDAyNjQ0IDAwMDAwIG4gCjAwMDAw
- MDAwMjIgMDAwMDAgbiAKMDAwMDAwMDY1MSAwMDAwMCBuIAowMDAwMDAwNzc0IDAwMDAw
- IG4gCjAwMDAwMDI2MDggMDAwMDAgbiAKMDAwMDAwMTcxMiAwMDAwMCBuIAowMDAwMDA5
- NzkyIDAwMDAwIG4gCjAwMDAwMDA4ODQgMDAwMDAgbiAKMDAwMDAwMTY5MiAwMDAwMCBu
- IAowMDAwMDAxNzQ4IDAwMDAwIG4gCjAwMDAwMDI1ODggMDAwMDAgbiAKMDAwMDAwMjcy
- NyAwMDAwMCBuIAowMDAwMDAyOTU2IDAwMDAwIG4gCjAwMDAwMDI4NDEgMDAwMDAgbiAK
- MDAwMDAwMjkzNCAwMDAwMCBuIAowMDAwMDAzMDQ5IDAwMDAwIG4gCjAwMDAwMDkzOTIg
- MDAwMDAgbiAKMDAwMDAwOTQxMyAwMDAwMCBuIAowMDAwMDA5NjM4IDAwMDAwIG4gCjAw
- MDAwMDk5NjcgMDAwMDAgbiAKMDAwMDAxMDAxOSAwMDAwMCBuIAp0cmFpbGVyCjw8IC9T
- aXplIDI1IC9Sb290IDE1IDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8YjZmZmIyZWU5NzJm
- Yjg0NDQ2ZmQ1NjE2ZGRhOTg3MWY+CjxiNmZmYjJlZTk3MmZiODQ0NDZmZDU2MTZkZGE5
- ODcxZj4gXSA+PgpzdGFydHhyZWYKMTAxMzYKJSVFT0YKMSAwIG9iago8PC9BdXRob3Ig
- KEpvbmF0aGFuIEJhY2hyYWNoKS9DcmVhdGlvbkRhdGUgKEQ6MjAxMjA1MTUxNzUzMDBa
- KS9DcmVhdG9yIChPbW5pR3JhZmZsZSBQcm9mZXNzaW9uYWwgNS4zLjYpL01vZERhdGUg
- KEQ6MjAxMjA1MjMwNjE1MDBaKS9Qcm9kdWNlciAyMyAwIFIgL1RpdGxlIChub2RlLWhp
- ZXJhcmNoeS5ncmFmZmxlKT4+CmVuZG9iagp4cmVmCjEgMQowMDAwMDEwNzk0IDAwMDAw
- IG4gCnRyYWlsZXIKPDwvSUQgWzxiNmZmYjJlZTk3MmZiODQ0NDZmZDU2MTZkZGE5ODcx
- Zj4gPGI2ZmZiMmVlOTcyZmI4NDQ0NmZkNTYxNmRkYTk4NzFmPl0gL0luZm8gMSAwIFIg
- L1ByZXYgMTAxMzYgL1Jvb3QgMTUgMCBSIC9TaXplIDI1Pj4Kc3RhcnR4cmVmCjEwOTkx
- CiUlRU9GCg==
-
- QuickLookThumbnail
-
- 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
- AAAEAAAHDAAAAAAACAAIAAgACAABAAEAAQAB
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
- FitInWindow
-
- Frame
- {{347, 227}, {717, 626}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- Sidebar
-
- SidebarWidth
- 138
- VisibleRegion
- {{1.04853, 1.04853}, {602.903, 542.088}}
- Zoom
- 0.95371901988983154
- ZoomValues
-
-
- Canvas 1
- 0.0
- 1
-
-
-
- saveQuickLookFiles
- YES
-
-
diff --git a/doc/manual/figs/node-hierarchy.pdf b/doc/manual/figs/node-hierarchy.pdf
deleted file mode 100644
index 4583c760..00000000
Binary files a/doc/manual/figs/node-hierarchy.pdf and /dev/null differ
diff --git a/doc/manual/figs/type-hierarchy.graffle b/doc/manual/figs/type-hierarchy.graffle
deleted file mode 100644
index 1e684201..00000000
--- a/doc/manual/figs/type-hierarchy.graffle
+++ /dev/null
@@ -1,830 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.18.0.187838
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {677.6772983114447, 626}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- CanvasSize
- {677.6772983114447, 626}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-05-15 17:50:34 +0000
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- FileType
- flat
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{274.49999856948853, 262.01600646972656}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1166
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Aggregate}
- VerticalPad
- 0
-
-
-
- Bounds
- {{364.49999856948853, 344.01600646972656}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1173
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Vec}
- VerticalPad
- 0
-
-
-
- Bounds
- {{274.49999856948853, 344.01600646972656}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1174
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Bundle}
- VerticalPad
- 0
-
-
-
- Bounds
- {{229.49999856948855, 426.01600646972656}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1172
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-SInt}
- VerticalPad
- 0
-
-
-
- Bounds
- {{139.49999856948853, 426.01600646972656}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1171
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-UInt}
- VerticalPad
- 0
-
-
-
- Bounds
- {{184.49999856948853, 344.01600646972656}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1170
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Num}
- VerticalPad
- 0
-
-
-
- Bounds
- {{139.49999856948853, 508.01600646972656}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1169
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Bool}
- VerticalPad
- 0
-
-
-
- Bounds
- {{184.49999856948853, 262.01600646972656}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1168
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Bits}
- VerticalPad
- 0
-
-
-
- Bounds
- {{229.49999856948855, 180.01600646972656}, {72, 45}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1167
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf390
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-Data}
- VerticalPad
- 0
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1169
-
- ID
- 1175
- Points
-
- {175.49997927083118, 471.51600646972724}
- {175.49997927083118, 507.51600646977789}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1171
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1170
-
- ID
- 1176
- Points
-
- {220.50001566718862, 307.51600646972304}
- {220.50001566718862, 343.516006469469}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1168
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1171
-
- ID
- 1177
- Points
-
- {207.91189374193721, 389.45434001274441}
- {188.08812133658486, 425.57767309141406}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1170
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1172
-
- ID
- 1178
- Points
-
- {233.08810841981315, 389.45433997117317}
- {252.91188872613353, 425.5776729681487}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1170
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1174
-
- ID
- 1181
- Points
-
- {310.50001566718862, 307.51600646972304}
- {310.50001566718862, 343.516006469469}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1166
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1168
-
- ID
- 1191
- Points
-
- {252.91189374193721, 225.45434001274441}
- {233.08812133658483, 261.57767309141406}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1167
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1173
-
- ID
- 1192
- Points
-
- {335.56471631066012, 307.35275148695979}
- {375.4352722911143, 343.67926152482607}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1166
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1166
-
- ID
- 1193
- Points
-
- {278.08810841981312, 225.45433997117314}
- {297.9118887261335, 261.5776729681487}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1167
-
-
-
- GridInfo
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 2
- ImageCounter
- 3
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2013-07-30 21:07:34 +0000
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- OutlineStyle
- Basic
- PageBreaks
- NO
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSHorizonalPagination
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- size
- {611.99999713897705, 792}
-
- NSPrintReverseOrientation
-
- int
- 0
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
- FitInWindow
-
- Frame
- {{324, 186}, {717, 626}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- Sidebar
-
- SidebarWidth
- 138
- VisibleRegion
- {{1.1750433447927242, 1.1750433447927242}, {675.64992325581647, 625.12305942972932}}
- Zoom
- 0.85103243589401245
- ZoomValues
-
-
- Canvas 1
- 0.0
- 1
-
-
-
-
-
diff --git a/doc/manual/figs/type-hierarchy.pdf b/doc/manual/figs/type-hierarchy.pdf
deleted file mode 100644
index f06dc97d..00000000
Binary files a/doc/manual/figs/type-hierarchy.pdf and /dev/null differ
diff --git a/doc/manual/manual.tex b/doc/manual/manual.tex
deleted file mode 100644
index f39951cf..00000000
--- a/doc/manual/manual.tex
+++ /dev/null
@@ -1,1726 +0,0 @@
-\documentclass[10pt,twocolumn]{article}
-\setlength\textwidth{6.875in}
-\setlength\textheight{8.875in}
-% set both margins to 2.5 pc
-\setlength{\oddsidemargin}{-0.1875in}% 1 - (8.5 - 6.875)/2
-\setlength{\evensidemargin}{-0.1875in}
-\setlength{\marginparwidth}{0pc}
-\setlength{\marginparsep}{0pc}%
-\setlength{\topmargin}{0in} \setlength{\headheight}{0pt}
-\setlength{\headsep}{0pt}
-\setlength{\footskip}{37pt}%
-\setlength{\columnsep}{0.3125in}
-\setlength{\columnwidth}{3.28125in}% (6.875 - 0.3125)/2 = 3.28125in
-\setlength{\parindent}{1pc}
-\newcommand{\myMargin}{1.00in}
-\usepackage[top=\myMargin, left=\myMargin, right=\myMargin, bottom=\myMargin, nohead]{geometry}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage[procnames]{listings}
-\usepackage{hyperref}
-
-\newenvironment{commentary}
-{ \vspace{-0.1in}
- \begin{quotation}
- \noindent
- \small \em
- \rule{\linewidth}{1pt}\\
-}
-{
- \end{quotation}
-}
-
-\title{Chisel Manual}
-\author{Jonathan Bachrach, Huy Vo, Krste Asanovi\'{c} \\
-EECS Department, UC Berkeley\\
-{\tt \{jrb|huytbvo|krste\}@eecs.berkeley.edu}
-}
-\date{\today}
-
-\newenvironment{example}{\VerbatimEnvironment\begin{footnotesize}\begin{Verbatim}}{\end{Verbatim}\end{footnotesize}}
-\newcommand{\kode}[1]{\begin{footnotesize}{\tt #1}\end{footnotesize}}
-
-\def\code#1{{\small\tt #1}}
-
-\def\note#1{\noindent{\bf [Note: #1]}}
-%\def\note#1{}
-
-\input{../style/scala.tex}
-
-\lstset{frame=, basicstyle={\footnotesize\ttfamily}}
-
-\lstset{frame=}
-
-\begin{document}
-\maketitle{}
-
-% TODO: default
-% TODO: enum yields UInt
-% TODO: why hardware construction languages
-
-
-
-\section{Introduction}
-
-This document is a manual for {\em Chisel} (Constructing Hardware In a
-Scala Embedded Language). Chisel is a hardware construction language
-embedded in the high-level programming language Scala. A separate
-Chisel tutorial document provides a gentle introduction to using
-Chisel, and should be read first. This manual provides a
-comprehensive overview and specification of the Chisel language, which
-is really only a set of special class definitions, predefined objects,
-and usage conventions within Scala. When you write a Chisel program
-you are actually writing a Scala program. In this manual, we presume
-that you already understand the basics of Scala. If you are
-unfamiliar with Scala, we recommend you consult one of the excellent
-Scala books (\cite{programming-scala}, \cite{programming-in-scala}).
-
-\section{Nodes}
-
-Any hardware design in Chisel is ultimately represented by a graph of
-node objects. User code in Chisel generate this graph of nodes, which
-is then passed to the Chisel backends to be translated into Verilog or
-C++ code. Nodes are defined as follows:
-
-\begin{scala}
-class Node {
- // name assigned by user or from introspection
- var name: String = ""
- // incoming graph edges
- def inputs: ArrayBuffer[Node]
- // outgoing graph edges
- def consumers: ArrayBuffer[Node]
- // node specific width inference
- def inferWidth: Int
- // get width immediately inferrable
- def getWidth: Int
- // get first raw node
- def getRawNode: Node
- // convert to raw bits
- def toBits: Bits
- // convert to raw bits
- def fromBits(x: Bits): this.type
- // return lit value if inferrable else null
- def litOf: Lit
- // return value of lit if litOf is non null
- def litValue(default: BigInt = BigInt(-1)): BigInt
-}
-\end{scala}
-
-
-The uppermost levels of the node class hierarchy are shown in
-Figure~\ref{fig:node-hierarchy}. The basic categories are:
-
-\begin{description}
-\item[Lit] -- constants or literals,
-\item[Op] -- logical or arithmetic operations,
-\item[Updateable] -- conditionally updated nodes,
-\item[Data] -- typed wires or ports,
-\item[Reg] -- positive-edge-triggered registers, and
-\item[Mem] -- memories.
-\end{description}
-
-\begin{figure}[h]
-\centering
-\includegraphics[width=3in]{figs/node-hierarchy.pdf}
-\caption{Node hierarchy.}
-\label{fig:node-hierarchy}
-\end{figure}
-
-\section{Lits}
-
-Raw literals are represented as \code{Lit} nodes defined as follows:
-
-\begin{scala}
-class Lit extends Node {
- // original value
- val inputVal: BigInt
-}
-\end{scala}
-
-\noindent
-Raw literals contain a collection of bits.
-Users do not create raw literals directly, but instead use type
-constructors defined in Section~\ref{sec:types}.
-
-% Constant or literal values are expressed using Scala integers or strings passed to constructors for the types:
-
-% TODO: isLit and litOf
-
-\section{Ops}
-
-Raw operations are represented as \code{Op} nodes defined as follows:
-
-\begin{scala}
-class Op extends Node {
- // op name used during emission
- val op: String
-}
-\end{scala}
-
-\noindent
-Ops compute a combinational function of their inputs.
-
-\section{Types}
-\label{sec:types}
-
-A Chisel graph representing a hardware design contains {\em raw} and
-{\em type} nodes. The Chisel type system is maintained separately
-from the underlying Scala type system, and so type nodes are
-interspersed between raw nodes to allow Chisel to check and respond to
-Chisel types. Chisel type nodes are erased before the hardware design
-is translated into C++ or Verilog. The \code{getRawNode} operator
-defined in the base Node class, skips type nodes and returns the first
-raw node found. Figure~\ref{fig:type-hierarchy} shows the built-in
-Chisel type hierarchy, with \code{Data} as the topmost node.
-
-\begin{figure}[h]
-\centering
-\includegraphics[height=2.5in]{figs/type-hierarchy.pdf}
-\caption{Chisel type hierarchy.}
-\label{fig:type-hierarchy}
-\end{figure}
-
-\noindent
-Built-in scalar types include \code{Bool}, \code{SInt},
-and \code{UInt} and built-in aggregate types \code{Bundle} and
-\code{Vec} allow the user to expand the set of Chisel datatypes with
-collections of other types.
-
-\code{Data} itself is a node:
-\begin{scala}
-abstract class Data extends Node {
- override def clone(): this.type =
- this.getClass.newInstance.
- asInstanceOf[this.type]
- // simple conversions
- def toSInt: SInt
- def toUInt: UInt
- def toBool: Bool
- def toBits: Bits
- // flatten out to leaves of tree
- def flatten: Array[(String, Data)]
- // port direction if leaf
- def dir: PortDir
- // change dir to OUTPUT
- def asOutput: this.type
- // change dir to INPUT
- def asInput: this.type
- // change polarity of dir
- def flip: this.type
- // assign to input
- def :=[T <: Data](t: T)
- // bulk assign to input
- def <>(t: Data)
-}
-\end{scala}
-\noindent
-The Data class has methods for converting between types and for
-delegating port methods to its single input. We will discuss ports in
-Section~\ref{sec:ports}. Finally, users can override the \code{clone}
-method in their own type nodes (e.g., bundles) in order to reflect
-construction parameters that are necessary for cloning.
-
-Data nodes can be used for four purposes:
-
-\begin{itemize}
-\item {\bf types} -- \kode{UInt(width = 8)} -- record intermediate types in the graph
- specifying at minimum bitwidth (described in this section),
-\item {\bf wires} -- \kode{UInt(width = 8)} -- serve as forward declarations of data allowing future
- conditional updates (described in Section~\ref{sec:wires}),
-\item {\bf ports} -- \kode{UInt(dir = OUTPUT, width = 8)} -- are
- specialized wires defining module interfaces, and
- additionally specify direction (described in
- Section~\ref{sec:ports}), and
-\item{\bf literals} -- \kode{UInt(1)} or \kode{UInt(1, 8)} -- can be constructed using type object
-constructors specifying their value and optional width.
-\end{itemize}
-
-\subsection{Bits}
-
-In Chisel, a raw collection of bits is represented by the \code{Bits}
-type defined as follows:
-
-\begin{scala}
-object Bits {
- def apply(dir: PortDir = null,
- width: Int = -1): Bits
- // create literal from BigInt or Int
- def apply(value: BigInt, width: Int = -1): Bits
- // create literal from String using
- // base_char digit+ string format
- def apply(value: String, width: Int = -1): Bits
-}
-
-class Bits extends Data with Updateable {
- // bitwise-not
- def unary_~(): Bits
- // bitwise-and
- def & (b: Bits): Bits
- // bitwise-or
- def | (b: Bits): Bits
- // bitwise-xor
- def ^ (b: Bits): Bits
- // and-reduction
- def andR(): Bool
- // or-reduction
- def orR(): Bool
- // xor-reduction
- def xorR(): Bool
- // logical NOT
- def unary_!(): Bool
- // logical AND
- def && (b: Bool): Bool
- // logical OR
- def || (b: Bool): Bool
- // equality
- def ===(b: Bits): Bool
- // inequality
- def != (b: Bits): Bool
- // logical left shift
- def << (b: UInt): Bits
- // logical right shift
- def >> (b: UInt): Bits
- // concatenate
- def ## (b: Bits): Bits
- // extract single bit, LSB is 0
- def apply(x: Int): Bits
- // extract bit field from end to start bit pos
- def apply(hi: Int, lo: Int): Bits
-}
-
-def Cat[T <: Data](elt: T, elts: T*): Bits
-\end{scala}
-
-\noindent
-Bits has methods for simple bit operations.
-Note that \code{\#\#} is binary
-concatenation, while \code{Cat} is an n-ary concatentation.
-To avoid colliding with Scala's builtin \code{==},
-Chisel's bitwise comparison is named \code{===}.
-
-A field of width \code{n} can be created from a single bit using \code{Fill}:
-\begin{scala}
-def Fill(n: Int, field: Bits): Bits
-\end{scala}
-
-\noindent
-and two inputs can be selected using \code{Mux}:
-
-\begin{scala}
-def Mux[T <: Data](sel: Bits, cons: T, alt: T): T
-\end{scala}
-
-\noindent
-
-Constant or literal values are expressed using Scala integers or
-strings passed to constructors for the types:
-\begin{scala}
-UInt(1) // decimal 1-bit lit from Scala Int.
-UInt("ha") // hex 4-bit lit from string.
-UInt("o12") // octal 4-bit lit from string.
-UInt("b1010") // binary 4-bit lit from string.
-\end{scala}
-
-\noindent
-producing a \code{Lit} as shown in the
-leftmost subfigure of Figure~\ref{fig:bits-expressions}.
-
-Operations return an actual operator node with a type node combining
-the input type nodes. See Figure~\ref{fig:bits-expressions} for
-successively more complicated examples.
-
-\begin{figure*}
-\begin{center}
-\begin{tabular}{ccc}
-\includegraphics[height=0.94in]{figs/bits-1.pdf} &
-\includegraphics[height=1.96in]{figs/bits-and.pdf} &
-\includegraphics[height=3.0in]{figs/bits-or-and.pdf} \\
-\kode{a = UInt(1)} & \kode{b = a \& UInt(2)} &
-\kode{b | UInt(3)} \\
-\end{tabular}
-\end{center}
-\caption{Chisel Op/Lit graphs constructed with algebraic expressions
- showing the insertion of type nodes.}
-\label{fig:bits-expressions}
-\end{figure*}
-
-
-\subsection{Bools}
-
-Boolean values are represented as \code{Bool}s:
-
-\begin{scala}
-object Bool {
- def apply(dir: PortDir = null): Bool
- // create literal
- def apply(value: Boolean): Bool
-}
-
-class Bool extends UInt
-\end{scala}
-
-\noindent
-\code{Bool} is equivalent to \code{UInt(width = 1)}.
-
-\subsection{Nums}
-
-\code{Num} is a type node which defines arithmetic operations:
-
-\begin{scala}
-class Num extends Bits {
- // Negation
- def unary_-(): Bits
- // Addition
- def +(b: Num): Num
- // Subtraction
- def -(b: Num): Num
- // Multiplication
- def *(b: Num): Num
- // Greater than
- def >(b: Num): Bool
- // Less than
- def <(b: Num): Bool
- // Less than or equal
- def <=(b: Num): Bool
- // Greater than or equal
- def >=(b: Num): Bool
-}
-\end{scala}
-
-% // Modulus
-% def %(b: Num): Num
-% // Division
-% def /(b: Num): Num
-
-Signed and unsigned integers
-are considered subsets of fixed-point numbers and are represented by
-types \code{SInt} and \code{UInt} respectively:
-
-\begin{scala}
-object SInt {
- def apply (dir: PortDir = null,
- width: Int = -1): SInt
- // create literal
- def apply (value: BigInt, width: Int = -1): SInt
- def apply (value: String, width: Int = -1): SInt
-}
-
-class SInt extends Num
-
-object UInt {
- def apply(dir: PortDir = null,
- width: Int = -1): UInt
- // create literal
- def apply(value: BigInt, width: Int = -1): UInt
- def apply(value: String, width: Int = -1): UInt
-}
-
-class UInt extends Num {
- // arithmetic right shift
- override def >> (b: UInt): SInt
-}
-\end{scala}
-
-\noindent
-Signed fixed-point
-numbers, including integers, are represented using two's-complement
-format.
-
-\subsection{Bundles}
-
-Bundles group together several named fields of potentially different
-types into a coherent unit, much like a \code{struct} in C:
-
-\begin{scala}
-class Bundle extends Data {
- // shallow named bundle elements
- def elements: ArrayBuffer[(String, Data)]
-}
-\end{scala}
-
-\noindent
-The name and type of each element in a Bundle can be obtained with the
-\code{elements} method, and the \code{flatten} method returns the
-elements at the leaves for nested aggregates. Users can define new
-bundles by subclassing \code{Bundle} as follows:
-
-\begin{scala}
-class MyFloat extends Bundle {
- val sign = Bool()
- val exponent = UInt(width = 8)
- val significand = UInt(width = 23)
-}
-\end{scala}
-\noindent
-Elements are accessed using Scala field access:
-
-\begin{scala}
-val x = new MyFloat()
-val xs = x.sign
-\end{scala}
-
-The names given to a bundle's elements when they are emitted by a C++
-or Verilog backend are obtained from their bundle field names, using
-Scala introspection.
-
-\subsection{Vecs}
-
-Vecs create an indexable vector of elements:
-
-\begin{scala}
-object Vec {
- def apply[T <: Data](elts: Seq[T]): Vec[T]
- def apply[T <: Data](elt0: T, elts: T*): Vec[T]
- def fill[T <: Data](n: Int)(type: => T): Vec[T]
- def tabulate[T <: Data](n: Int)
- (type: (Int) => T): Vec[T]
- def tabulate[T <: Data](n1: Int, n2: Int)
- (type: (Int, Int) => T): Vec[Vec[T]]
-}
-
-class Vec[T <: Data](n: Int, val type: () => T)
- extends Data {
- def apply(idx: UInt): T
- def apply(idx: Int): T
- def forall(p: T => Bool): Bool
- def exists(p: T => Bool): Bool
- def contains[T <: Bits](x: T): Bool
- def count(p: T => Bool): UInt
- def indexWhere(p: T => Bool): UInt
- def lastIndexWhere(p: T => Bool): UInt
-}
-\end{scala}
-
-\noindent
-with \code{n} elements of type defined with the \code{gen} thunk.
-Users can access elements statically with an \code{Int} index or
-dynamically using a \code{UInt} index,
-where dynamic access creates a virtual type node (representing a read
-``port'') that records the read using the given address. In either case,
-users can wire to the result of a read as follows:
-
-\begin{scala}
-v(a) := d
-\end{scala}
-
-Read-only memories can be expressed as Vecs of literals:
-
-\begin{scala}
-val rom = Vec(UInt(3), UInt(7), UInt(4), UInt(0)) { UInt(width=3) }
-val dout = rom(addr)
-\end{scala}
-
-% TODO: conditionally assigning to elements
-
-\subsection{Bit Width Inference}
-
-Users are required to set bit widths of ports and registers, but otherwise,
-bit widths on nodes are automatically inferred unless set manually by
-the user (using \code{Extract} or \code{Cat}).
-The bit-width inference engine starts from the graph's input ports and
-calculates node output bit widths from their respective input bit widths according to the following set of rules:\\[-2mm]
-
-{\small
-\begin{tabular}{ll}
-{\bf operation} & {\bf bit width} \\
-\verb|z = x + y| & \verb+wz = max(wx, wy)+ \\
-\verb+z = x - y+ & \verb+wz = max(wx, wy)+\\
-\verb+z = x & y+ & \verb+wz = max(wx, wy)+ \\
-\verb+z = Mux(c, x, y)+ & \verb+wz = max(wx, wy)+ \\
-\verb+z = w * y+ & \verb!wz = wx + wy! \\
-\verb+z = x << n+ & \verb!wz = wx + maxNum(n)! \\
-\verb+z = x >> n+ & \verb+wz = wx - minNum(n)+ \\
-\verb+z = Cat(x, y)+ & \verb!wz = wx + wy! \\
-\verb+z = Fill(n, x)+ & \verb+wz = wx * maxNum(n)+ \\
-% \verb+z = x < y+ & \verb+<= > >= && || != ===+ & \verb+wz = 1+ \\
-\end{tabular}
-}
-\\[1mm]
-\noindent
-where for instance $wz$ is the bit width of wire $z$, and the \verb+&+
-rule applies to all bitwise logical operations.
-
-The bit-width inference process continues until no bit width changes.
-Except for right shifts by known constant amounts, the bit-width
-inference rules specify output bit widths that are never smaller than
-the input bit widths, and thus, output bit widths either grow or stay
-the same. Furthermore, the width of a register must be specified by
-the user either explicitly or from the bitwidth of the reset value.
-From these two requirements, we can show that the bit-width inference
-process will converge to a fixpoint.
-
-\begin{example}
-Shouldn't & return bitwidth that is min() of inputs?
-\end{example}
-
-
-\section{Updateables}
-
-\label{sec:wires}
-
-When describing the operation of wire and state nodes, it is often
-useful to give the specification as a series of conditional updates to
-the output value and to spread out these updates across several
-separate statements. For example, the output of a Data node can be
-referenced immediately, but its input can be set later.
-\code{Updateable} represents a conditionally updateable node, which
-accumulates accesses to the node and which can later generate muxes to
-combine these accesses in the circuit.
-
-\begin{scala}
-abstract class Updateable extends Node {
- // conditional reads
- def reads: Queue[(Bool, UInt)]
- // conditional writes
- def writes: Queue[(Bool, UInt, Node)]
- // gen mux integrating all conditional writes
- def genMuxes(default: Node)
- override def := (x: Node): this.type
-}
-\end{scala}
-
-Chisel provides conditional update rules in the form of the
-\code{when} construct to support this style of sequential logic
-description:
-
-\begin{scala}
-object when {
- def apply(cond: Bool)(block: => Unit): when
-}
-
-class when (prevCond: Bool) {
- def elsewhen (cond: Bool)(block: => Unit): when
- def otherwise (block: => Unit): Unit
-}
-\end{scala}
-
-\noindent
-\code{when} manipulates a global condition stack with dynamic scope.
-Therefore, \code{when} creates a new condition that is in force across
-function calls. For example:
-
-\begin{scala}
-def updateWhen (c: Bool, d: Data) =
- when (c) { r := d }
-when (a) {
- updateWhen(b, x)
-}
-\end{scala}
-
-\noindent
-is the same as:
-
-\begin{scala}
-when (a) {
- when (b) { r := x }
-}
-\end{scala}
-
-% TODO: talk about conds
-
-Chisel provides some syntactic sugar for other common forms of
-conditional updates:
-
-\begin{scala}
-def unless(c: Bool)(block: => Unit) =
- when (!c) { block )
-\end{scala}
-
-\noindent
-and
-
-\begin{scala}
-def otherwise(block: => Unit) =
- when (Bool(true)) { block }
-\end{scala}
-
-We introduce the \code{switch} statement for conditional updates
-involving a series of comparisons against a common key:
-
-\begin{scala}
-def switch(c: UInt)(block: => Unit): Unit
-
-def is(v: Bool)(block: => Unit)
-\end{scala}
-
-\section{Forward Declarations}
-
-Purely combinational circuits are not allowed to have cycles between
-nodes, and Chisel will report an error if such a cycle is detected.
-Because they do not have cycles, legal combinational circuits can
-always be constructed in a feed-forward manner, by adding new nodes
-whose inputs are derived from nodes that have already been defined.
-Sequential circuits naturally have feedback between nodes, and so it
-is sometimes necessary to reference an output wire before the
-producing node has been defined. Because Scala evaluates program
-statements sequentially, we have allowed data nodes to serve as a wire
-providing a declaration of a node that can be used immediately, but
-whose input will be set later. For example, in a simple CPU, we need
-to define the \verb!pcPlus4! and \verb!brTarget! wires so they can be
-referenced before definition:
-\begin{scala}
-val pcPlus4 = UInt()
-val brTarget = UInt()
-val pcNext = Mux(pcSel, brTarget, pcPlus4)
-val pcReg = RegUpdate(pcNext)
-pcPlus4 := pcReg + UInt(4)
-...
-brTarget := addOut
-\end{scala}
-
-\noindent
-The wiring operator
-\verb!:=! is used to wire up
-the connection after \verb!pcReg! and \verb!addOut! are defined.
-After all assignments are made and the circuit is being elaborated,
-it is an error if a forward declaration is unassigned.
-
-\section{Regs}
-
-The simplest form of state element supported by Chisel is a
-positive-edge-triggered register defined as follows:
-
-\begin{scala}
-object Reg {
- def apply[T <: Data]
- (type: T, next: T = null, init: T = null): T
-}
-
-object RegNext {
- def apply[T <: Data] (next: T, init: T = null): T
-}
-
-object RegInit {
- def apply[T <: Data] (init: T): T
-}
-
-class Reg extends Updateable
-\end{scala}
-
-\noindent
-where it can be constructed as follows:
-
-\begin{scala}
-val r1 = RegUpdate(io.in)
-val r2 = RegReset(UInt(1, 8))
-val r3 = RegUpdate(io.in, UInt(1))
-val r4 = Reg(UInt(width = 8))
-\end{scala}
-
-\noindent
-where \code{resetVal} is the value a reg takes on when implicit
-\code{reset} is \code{Bool(true)}.
-
-\section{Mems}
-
-Chisel supports random-access memories via the Mem construct. Writes to Mems
-are positive-edge-triggered and reads are either combinational or
-positive-edge-triggered.
-
-\begin{scala}
-object Mem {
- def apply[T <: Data](type: T, depth: Int,
- seqRead: Boolean = false): Mem
-}
-
-class Mem[T <: Data](type: T, depth: Int,
- seqRead: Boolean = false)
- extends Updateable {
- def apply(idx: UInt): T
-}
-\end{scala}
-
-Ports into Mems are created by applying a \code{UInt} index. A 32-entry
-register file with one write port and two combinational read ports might be
-expressed as follows:
-
-\begin{scala}
-val rf = Mem(UInt(width = 64), 32)
-when (wen) { rf(waddr) := wdata }
-val dout1 = rf(waddr1)
-val dout2 = rf(waddr2)
-\end{scala}
-
-If the optional parameter seqRead is set, Chisel will attempt to infer
-sequential read ports when a Reg is assigned the output of a Mem. A one-read,
-one-write SRAM might be described as follows:
-
-\begin{scala}
-val ram1r1w =
- Mem(UInt(width = 32), 1024, seqRead = true)
-val dout = Reg(UInt())
-when (wen) { ram1r1w(waddr) := wdata }
-when (ren) { dout := ram1r1w(raddr) }
-\end{scala}
-
-Single-ported SRAMs can be inferred when the read and write conditions are
-mutually exclusive in the same \code{when} chain:
-
-\begin{scala}
-val ram1p =
- Mem(UInt(width = 32), 1024, seqRead = true)
-val dout = Reg(UInt())
-when (wen) { ram1p(waddr) := wdata }
-.elsewhen (ren) { dout := ram1p(raddr) }
-\end{scala}
-
-If the same Mem address is both written and sequentially read on the same clock
-edge, or if a sequential read enable is cleared, then the read data is
-implementation-defined.
-
-Mem also supports write masks for subword writes. A given bit is written if
-the corresponding mask bit is set.
-
-\begin{scala}
-val ram = Mem(UInt(width = 32), 256)
-when (wen) { ram.write(waddr, wdata, wmask) }
-\end{scala}
-
-\section{Ports}
-\label{sec:ports}
-
-Ports are \code{Data} derived nodes used as interfaces to hardware
-modules. A port is a directional version of a primitive
-\code{Data} object. Port directions are defined as follows:
-
-\begin{scala}
-trait PortDir
-object INPUT extends PortDir
-object OUTPUT extends PortDir
-\end{scala}
-
-\noindent
-Aggregate ports can be recursively constructed using either a vec or
-bundle with instances of \code{Port}s as leaves.
-
-\section{Modules}
-
-In Chisel, {\em modules} are very similar to {\em modules} in
-Verilog, defining a hierarchical structure in the generated circuit.
-The hierarchical module namespace is accessible in downstream tools
-to aid in debugging and physical layout. A user-defined module is
-defined as a {\em class} which:
-\begin{itemize}
-\item inherits from \code{Module},
-\item contains an interface Bundle stored in a field named \code{io}, and
-\item wires together subcircuits in its constructor.
-\end{itemize}
-
-Users write their own modules by subclassing Module which is
-defined as follows:
-
-\begin{scala}
-abstract class Module {
- val io: Bundle
- var name: String = ""
- def compileV: Unit
- def compileC: Unit
-}
-\end{scala}
-
-\noindent
-and defining their own \code{io} field. For example, to define a two
-input mux, we would define a module as follows:
-
-\begin{scala}
-class Mux2 extends Module {
- val io = new Bundle{
- val sel = Bool(INPUT)
- val in0 = Bool(INPUT)
- val in1 = Bool(INPUT)
- val out = Bool(OUTPUT)
- }
- io.out := (io.sel & io.in1) | (~io.sel & io.in0)
-}
-\end{scala}
-
-\noindent
-The \code{:=} assignment operator, used in the body of a
-module definition, is a special operator in Chisel that wires the input of
-left-hand side to the output of the right-hand side. It is typically
-used to connect an output port to its definition.
-
-The \code{<>} operator bulk connects interfaces of opposite gender between
-sibling modules or interfaces of same gender between parent/child modules.
-Bulk connections connect leaf ports using pathname matching.
-Connections are only made if one of the ports is non-null,
-allowing users to repeatedly bulk-connect partially filled interfaces.
-After all connections are made and the circuit is being elaborated,
-Chisel warns users if ports have other than exactly one connection to them.
-
-The names given to the nodes and submodules stored in a module
-when they are emitted by a C++ or Verilog backend are obtained from
-their module field names, using Scala introspection.
-
-% TODO: what is same name -- is it a pathname?
-
-\section{BlackBox}
-
-Black boxes allow users to define interfaces to circuits defined
-outside of Chisel. The user defines:
-
-\begin{itemize}
-\item a module as a subclass of \code{BlackBox} and
-\item an \code{io} field with the interface.
-\end{itemize}
-
-\noindent
-For example, one could define a simple ROM blackbox as:
-
-\begin{scala}
-class RomIo extends Bundle {
- val isVal = Bool(INPUT)
- val raddr = UInt(INPUT, 32)
- val rdata = UInt(OUTPUT, 32)
-}
-
-class Rom extends BlackBox {
- val io = new RomIo()
-}
-\end{scala}
-
-\section{Printf and Sprintf}
-
-Chisel provides the ability to format and print strings for debugging
-purposes. The \code{printf} and \code{sprintf} construct are similar to their
-C namesakes: they take a format string and a variable number of arguments,
-then print or return a string, respectively. During simulation, \code{printf}
-prints the formatted string to the console on rising clock edges.
-\code{sprintf}, on the other hand, returns the formatted string as a bit
-vector.
-
-Supported format specifiers are \code{\%b} (binary number), \code{\%d}
-(decimal number), \code{\%x} (hexadecimal number), and \code{\%s} (string
-consisting of a sequence of 8-bit extended ASCII characters). (\code{\%\%}
-specifies a literal \code{\%}.) Unlike in C, there are no width modifiers: the
-bit width of the corresponding argument determines the width in the string
-representation.
-
-The following example prints the line \code{"0x4142 16706 AB"} on cycles when
-\code{c} is true:
-
-\begin{scala}
-val x = Bits(0x4142)
-val s1 = sprintf("%x %s", x, x);
-when (c) { printf("%d %s\n", x, s1); }
-\end{scala}
-
-\section{Assert}
-
-Runtime assertions are provided by the \code{assert} construct. During
-simulation, if an assertion's argument is false on a rising clock edge,
-an error is printed and simulation terminates. For example, the following
-will terminate simulation after ten clock cycles:
-
-\begin{scala}
-val x = Reg(init = UInt(0, 4))
-x := x + UInt(1)
-assert(x < UInt(10))
-\end{scala}
-
-\section{Main and Testing}
-
-In order to construct a circuit,
-the user calls \code{chiselMain} from their top level \code{main} function:
-
-\begin{scala}
-object chiselMain {
- def apply[T <: Module]
- (args: Array[String], comp: () => T): T
-}
-\end{scala}
-
-\noindent
-which when run creates C++ files named
-\code{{\it module\_name}.cpp} and \code{{\it module\_name}.h} in
-the directory specified with
-\code{-{-}targetDir {\it dir\_name}} argument.
-
-% \begin{scala}
-% class TestIO
-% (val format: String, val args: Seq[Data] = null)
-%
-% class Scanner extends TestIO
-%
-% class Printer extends TestIO
-%
-% object chiselMainDebug {
-% def apply[T <: Module]
-% (args: Array[String], comp: () => T)(
-% scanner: T => TestIO,
-% printer: T => TestIO)
-% }
-% \end{scala}
-%
-% \noindent
-%
-% We can use the \code{chiselMainDebug} call and \code{TestIO} objects as follows:
-%
-% \begin{scala}
-% object tutorial {
-% def main(args: Array[String]) = {
-% val dargs = args ++ Array("--genHarness")
-% chiselMainDebug(dargs, () => new Mux2())(
-% c => Scanner("%x %x %x",
-% c.io.sel, c.io.in0, c.io.in1),
-% c => Printer("%x %x %x %x",
-% c.io.sel, c.io.in0, c.io.in1,
-% c.io.out))
-% }
-% }
-% \end{scala}
-%
-% \noindent
-% where the first three hex numbers from each line are read in from
-% standard input and bound to the \code{sel}, \code{in0}, and
-% \code{in1} inputs of the multiplexer circuit, and the multiplexer
-% inputs and \code{out} are printed out in hex format.
-%
-% Alternatively, a user can specify the scanned inputs and printed
-% outputs using aggregate data and one format directive per aggregate.
-% For example, the following accomplishes the same scanning / printing
-% as above:
-%
-% \begin{scala}
-% object tutorial {
-% def main(args: Array[String]) = {
-% val dargs = args ++ Array("--genHarness")
-% chiselMainDebug(dargs, () => new Mux2())(
-% c => Scanner("%x", c.io),
-% c => Printer("%x", c.io)
-% }
-% }
-% \end{scala}
-%
-% Using \code{--generate-harness} for \code{Mux2}
-% creates a \code{Mux2-emulator.cpp} and \code{Mux2-makefile} in directory
-% specified by \code{--targetDir}. The user can then compile it using:
-%
-% \begin{scala}
-% make -f Mux2-makefile
-% \end{scala}
-%
-% \noindent
-%
-% A user can test the multiplexer by creating a test file called
-% \code{test.out} containing:
-% \begin{scala}
-% 0 0 0 0
-% 0 0 1 0
-% 0 1 0 1
-% 0 1 1 1
-% 1 0 0 0
-% 1 0 1 1
-% 1 1 0 0
-% 1 1 1 1
-% \end{scala}
-%
-% \noindent
-% and can be compared using a script as follows
-%
-% \begin{scala}
-% cut -f 1,2,3 -d " " < test | Mux2 > test.out
-% diff test.out test
-% \end{scala}
-
-\begin{figure}
-\begin{center}
-\includegraphics[width=0.45\textwidth]{../tutorial/figs/DUT.pdf}
-\end{center}
-\caption{DUT run using a Tester object in Scala with stdin and stdout connected}
-\label{fig:dut}
-\end{figure}
-
-Testing is a crucial part of circuit design,
-and thus in Chisel we provide a mechanism for
-testing circuits by providing test vectors within Scala using
-subclasses of the \code{Tester} class:
-
-\begin{scala}
-class Tester[T <: Module]
- (val c: T, val isTrace: Boolean = true) {
- var t: Int
- var ok: Boolean
- val rnd: Random
- def int(x: Boolean): BigInt
- def int(x: Int): BigInt
- def int(x: Bits): BigInt
- def reset(n: Int = 1)
- def step(n: Int): Int
- def pokeAt(data: Mem[T], index: Int, x: BigInt)
- def poke(data: Bits, x: BigInt)
- def poke(data: Aggregate, x: Array[BigInt])
- def peekAt(data: Mem[T], index: Int)
- def peek(data: Bits): BigInt
- def peek(data: Aggregate): Array[BigInt]
- def expect (good: Boolean, msg: String): Boolean
- def expect (data: Bits, target: BigInt): Boolean
-}
-\end{scala}
-
-\noindent
-which binds a tester to a module
-and allows users to write tests using the given debug protocol. In particular, users utilize:
-\begin{itemize}
-\item \code{poke} to set input port and state values,
-\item \code{step} to execute the circuit one time unit,
-\item \code{peek} to read port and state values, and
-\item \code{expect} to compare peeked circuit values to expected arguments.
-\end{itemize}
-
-\noindent
-Users connect tester instances to modules using:
-
-\begin{scala}
-object chiselMainTest {
- def apply[T <: Module]
- (args: Array[String], comp: () => T)(
- tester: T => Tester[T]): T
-}
-\end{scala}
-
-\noindent
-When \code{-{-}test} is given as an argument to \code{chiselMain}, a
-tester instance runs the Design Under Test (DUT) in a separate
-process with \code{stdin} and \code{stdout} connected so that debug commands can
-be sent to the DUT and responses can be received from the DUT as shown in
-Figure~\ref{fig:dut}.
-\noindent
-
-For example, in the following:
-
-\begin{scala}
-class Mux2Tests(c: Mux2) extends Tester(c) {
- val n = pow(2, 3).toInt
- for (s <- 0 until 2) {
- for (i0 <- 0 until 2) {
- for (i1 <- 0 until 2) {
- poke(c.io.sel, s)
- poke(c.io.in1, i1)
- poke(c.io.in0, i0)
- step(1)
- expect(c.io.out, (if (s == 1) i1 else i0))
- }
- }
- }
-}
-\end{scala}
-
-\noindent
-assignments for each input of \verb+Mux2+ is set to the appropriate values using \verb+poke+. For this particular example, we are testing the \verb+Mux2+ by hardcoding the inputs to some known values and checking if the output corresponds to the known one. To do this, on each iteration we generate appropriate inputs to the module and tell the simulation to assign these values to the inputs of the device we are testing \verb+c+, step the circuit, and test the expected value.
-Finally, the following shows how the tester is invoked:
-
-\begin{scala}
-chiselMainTest(args + "--test", () => new Mux2()){
- c => new Mux2Tests(c)
-}
-\end{scala}
-
-Finally, command arguments for \code{chiselMain*} are as follows: \\
-
-\begin{tabular}{lll}
-\verb+--targetDir+ & target pathname prefix \\
-\verb+--genHarness+ & generate harness file for C++ \\
-\verb+--debug+ & put all wires in C++ class file \\
-\verb+--compile+ & compiles generated C++ \\
-\verb+--test+ & runs tests using C++ app \\
-\verb+--backend v+ & generate verilog \\
-\verb+--backend c+ & generate C++ (default)\\
-\verb+--vcd+ & enable vcd dumping \\
-\end{tabular}
-
-
-\section{C++ Emulator}
-
-The C++ emulator is based on a fast multiword library using
-C++ templates.
-A single word is defined by \code{val\_t} as follows:
-
-\begin{cpp}
-typedef uint64_t val_t;
-typedef int64_t sval_t;
-typedef uint32_t half_val_t;
-\end{cpp}
-
-\noindent
-and multiwords are defined by \code{dat\_t} as follows:
-
-\begin{cpp}
-template
-class dat_t {
- public:
- const static int n_words;
- inline int width ( void );
- inline int n_words_of ( void );
- inline bool to_bool ( void );
- inline val_t lo_word ( void );
- inline unsigned long to_ulong ( void );
- std::string to_str ();
- dat_t ();
-template
- dat_t (const dat_t& src);
- dat_t (const dat_t& src);
- dat_t (val_t val);
-template
- dat_t mask(dat_t fill, int n);
-template
- dat_t mask(int n);
-template
- dat_t mask(void);
- dat_t operator + ( dat_t o );
- dat_t operator - ( dat_t o );
- dat_t operator - ( );
- dat_t operator * ( dat_t o );
- dat_t fix_times_fix( dat_t o );
- dat_t ufix_times_fix( dat_t o );
- dat_t fix_times_ufix( dat_t o );
- dat_t<1> operator < ( dat_t o );
- dat_t<1> operator > ( dat_t o );
- dat_t<1> operator >= ( dat_t o );
- dat_t<1> operator <= ( dat_t o );
- dat_t<1> gt ( dat_t o );
- dat_t<1> gte ( dat_t o );
- dat_t<1> lt ( dat_t o );
- dat_t<1> lte ( dat_t o );
- dat_t operator ^ ( dat_t o );
- dat_t operator & ( dat_t o );
- dat_t operator | ( dat_t o );
- dat_t operator ~ ( void );
- dat_t<1> operator ! ( void );
- dat_t<1> operator && ( dat_t<1> o );
- dat_t<1> operator || ( dat_t<1> o );
- dat_t<1> operator == ( dat_t o );
- dat_t<1> operator == ( datz_t o );
- dat_t<1> operator != ( dat_t o );
- dat_t operator << ( int amount );
- dat_t operator << ( dat_t o );
- dat_t operator >> ( int amount );
- dat_t operator >> ( dat_t o );
- dat_t rsha ( dat_t o);
- dat_t& operator = ( dat_t o );
- dat_t fill_bit(val_t bit);
- dat_t fill_byte
- (val_t byte, int nb, int n);
-template
- dat_t fill( void );
-template
- dat_t fill( dat_t n );
-template
- dat_t extract();
-template
- dat_t extract(val_t e, val_t s);
-template
- dat_t extract
- (dat_t e, dat_t s);
-template
- dat_t inject
- (dat_t src, val_t e, val_t s);
-template
- dat_t inject
- (dat_t src,
- dat_t e, dat_t s);
-template
- dat_t log2();
- dat_t<1> bit(val_t b);
- val_t msb();
-template
- dat_t<1> bit(dat_t b)
-}
-\end{cpp}
-
-\begin{cpp}
-template
- dat_t DAT(dat_t dat);
-template
- dat_t LIT(val_t value);
-template dat_t
- mux ( dat_t<1> t, dat_t c, dat_t a )
-\end{cpp}
-
-\noindent
-where \code{w} is the bit width parameter.
-
-The Chisel compiler compiles top level modules into a single flattened \code{mod\_t}
-class that can be created and executed:
-
-\begin{cpp}
-class mod_t {
- public:
- // initialize module
- virtual void init (void) { };
- // compute all combinational logic
- virtual void clock_lo (dat_t<1> reset) { };
- // commit state updates
- virtual void clock_hi (dat_t<1> reset) { };
- // print printer specd node values to stdout
- virtual void print (FILE* f) { };
- // scan scanner specd node values from stdin
- virtual bool scan (FILE* f) { return true; };
- // dump vcd file
- virtual void dump (FILE* f, int t) { };
-};
-\end{cpp}
-
-Either the Chisel compiler can create a harness or the user can write
-a harness themselves. The following is an example of a harness for a
-CPU module:
-
-\begin{cpp}
-#include "cpu.h"
-
-int main (int argc, char* argv[]) {
- cpu_t* c = new cpu_t();
- int lim = (argc > 1) ? atoi(argv[1]) : -1;
- c->init();
- for (int t = 0; lim < 0 || t < lim; t++) {
- dat_t<1> reset = LIT<1>(t == 0);
- if (!c->scan(stdin)) break;
- c->clock_lo(reset);
- c->clock_hi(reset);
- c->print(stdout);
- }
-}
-\end{cpp}
-
-\section{Verilog}
-
-Chisel generates Verilog when the \code{--v} argument is passed into
-\code{chiselMain}. For example, from SBT, the following
-
-\begin{scala}
-run --v
-\end{scala}
-
-\noindent
-would produce a single Verilog file named \code{{\it module-name}.v} in
-the target directory.
-The file will contain one module per module defined as submodules of
-the top level module created in \code{chiselMain}. Modules with
-the same interface and body are cached and reused.
-
-\section{Multiple Clock Domains}
-
-Chisel 2.0 introduced support of multiple clock domains.
-
-\subsection{Creating Clock domains}
-
-In order to use multiple clock domains, users must create multiple clocks.
-In Chisel, clocks are first class nodes created with a reset signal parameter and defined as follows:
-
-\begin{scala}
-class Clock (reset: Bool) extends Node {
- def reset: Bool // returns reset pin
-}
-\end{scala}
-
-\noindent
-% Having reset in clock makes it easier to pass around.
-In Chisel there is a builtin implicit clock that state elements use by default:
-
-\begin{scala}
-var implicitClock = new Clock( implicitReset )
-\end{scala}
-
-The clock for state elements and modules can be defined using an additional named parameter called clock:
-
-\begin{scala}
-Reg(... clock: Clock = implicitClock)
-Mem(... clock: Clock = implicitClock)
-Module(... clock: Clock = implicitClock)
-\end{scala}
-
-\subsection{Crossing Clock Domains}
-
-There are two ways that circuits can be defined to send data between clock domains.
-The first and most primitive way is by using a synchronizer circuit comprised of two registers as follows:
-
-\begin{scala}
-// signalA is in clock domain clockA,
-// want a version in clockB as signalB
-val s1 = Reg(init = UInt(0), clock = clockB)
-val s2 = Reg(init = UInt(0), clock = clockB)
-s1 := signalA
-s2 := s1;
-signalB := s2
-\end{scala}
-
-\noindent
-Due to metastability issues, this technique is limited to communicating one bit data between domains.
-
-The second and more general way to send data between domains is by using an asynchronous queue:
-
-\begin{scala}
-class AsyncQueue[T<:Data](gen: T, depth: Int, enq_clk: Clock, deq_clock: Clock)
- extends Module
-\end{scala}
-
-\noindent
-We can then get a version of signalA from clock domains clockA to clockB by specifying the standard queue parameters and the two clocks and then using the standard decoupled ready/valid signals:
-
-\begin{scala}
-val queue = new AsyncQueue(Uint(width = 32), 2, clockA, clockB)
-fifo.enq.bits := signalA
-signalB := fifo.deq.bits
-fifo.valid := condA
-fifo.ready := condB
-...
-\end{scala}
-
-\subsection{Backend Specific Multiple Clock Domains}
-
-Clock domains can be mapped to both the C++ and Verilog backends in a domain-specific manner. For the purposes of showing how to drive a multi clock design, consider the example of hardware with two modules communicating using an AsyncQueue with each module on separate clocks: \verb+fastClock+ and \verb+slowClock+.
-
-\subsubsection{C++}
-
-In the C++ backend, for every clock \verb+i+ there is a
-\begin{itemize}
-\item \verb+uint64_t clk_i+ field representing the clock \verb+i+'s period,
-\item \verb+uint63_t clk_i_cnt+ field representing the clock \verb+i+'s current count,
-\item \verb+clock_lo_i+ and \verb+clock_hi_i+,
-\item \verb+int reset()+ function which ensures that all \verb+clock_lo+ and \verb+clock_hi+ functions are called at least once, and
-\item \verb+int clock(reset)+ function which computes min delta, invokes appropriate \verb+clock_lo+ and \verb+clock_hi+'s and returns min delta used.
-\end{itemize}
-
-\noindent
-In order to set up a C++ simulation, the user
-\begin{itemize}
-\item initializes all period fields to desired period
-\item initializes all count fields to desired phase,
-\item calls \verb+reset+ and then
-\item repeated calls clock to step the simulation.
-\end{itemize}
-
-\noindent
-The following is a C++ example of a main function for the \verb+slowClock+ / \verb+fastClock+ example:
-
-\begin{scala}
-int main(int argc, char** argv) {
- ClkDomainTest_t dut;
- dut.init(1);
- dut.clk = 2;
- dut.clk_cnt = 1;
- dut.fastClock = 4;
- dut.fastClock_cnt = 0;
- dut.slowClock = 6;
- dut.slowClock_cnt = 0;
- for (int i = 0; i < 12; i ++)
- dut.reset();
- for (int i = 0; i < 96; i ++)
- dut.clock(LIT<1>(0));
-}
-\end{scala}
-
-\subsubsection{Verilog}
-
-In Verilog,
-
-\begin{itemize}
-\item Chisel creates a new port for each clock / reset,
-\item Chisel wires all the clocks to the top module, and
-\item the user must create an \verb+always+ block clock driver for every clock \verb+i+.
-\end{itemize}
-
-\noindent
-The following is a Verilog example of a top level harness to drive the \verb+slowClock+ / \verb+fastClock+ example circuit:
-
-\begin{scala}
-module emulator;
- reg fastClock = 0, slowClock = 0,
- resetFast = 1, resetSlow = 1;
- wire [31:0] add, mul, test;
- always #2 fastClock = ~fastClock;
- always #4 slowClock = ~slowClock;
- initial begin
- #8
- resetFast = 0;
- resetSlow = 0;
- #400
- $finish;
- end
- ClkDomainTest dut (
- .fastClock(fastClock),
- .slowClock(slowClock),
- .io_resetFast(resetFast),
- .io_resetSlow(resetSlow),
- .io_add(add), .io_mul(mul), .io_test(test));
-endmodule
-\end{scala}
-
-\noindent
-See \url{http://www.asic-world.com/verilog/verifaq2.html} for more information about simulating clocks in Verilog.
-
-
-\section{Extra Stuff}
-
-\lstset{language=scala}
-
-\begin{scala}
-def ListLookup[T <: Bits]
- (addr: UInt, default: List[T],
- mapping: Array[(UInt, List[T])]): List[T]
-
-def Lookup[T <: Data]
- (addr: UInt, default: T,
- mapping: Seq[(UInt, T)]): T
-
-// n-way multiplexor
-def MuxCase[T <: Data]
- (default: T, mapping: Seq[(Bool, T)]): T
-
-// n-way indexed multiplexer:
-def MuxLookup[S <: UInt, T <: Data]
- (key: S, default: T, mapping: Seq[(S, T)]): T
-\end{scala}
-
-% TODO: PROBE
-% \begin{scala}
-% Probe
-% \end{scala}
-
-\begin{scala}
-// create n enum values of given type
-def Enum[T <: UInt]
- (n: Int)(type: => T): List[T]
-
-// create enum values of given type and names
-def Enum[T <: UInt]
- (l: Symbol *)(type: => T): Map[Symbol, T]
-
-// create enum values of given type and names
-def Enum[T <: UInt]
- (l: List[Symbol])(type: => T): Map[Symbol, T]
-\end{scala}
-
-% \section{Name Mangling}
-%
-% \begin{itemize}
-% \item separate and escape sequence
-% \item module prefix
-% \item vec element suffixes
-% \item naming from fields
-% \item bundle field paths
-% \item target language reserve word avoidance
-% \end{itemize}
-
-\section{Standard Library}
-
-\subsection{Math}
-
-\begin{scala}
-// Returns the log base 2 of the input
-// Scala Integer rounded up
-def log2Up(in: Int): Int
-
-// Returns the log base 2 of the input
-// Scala Integer rounded down
-def log2Down(in: Int): Int
-
-// Returns true if the input Scala Integer
-// is a power of 2
-def isPow2(in: Int): Boolean
-
-// linear feedback shift register
-def LFSR16(increment: Bool = Bool(true)): UInt
-\end{scala}
-
-\subsection{Sequential}
-
-\begin{scala}
-// Returns the n-cycle delayed version
-// of the input signal
-// Has an optional enable signal defaulting to true
-def ShiftRegister[T <: Data](in: T, n: Int, en = Bool(true)): T
-
-def Counter(cond: Bool, n: Int) = {
- val c = RegReset(UInt(0, log2Up(n)))
- val wrap = c === UInt(n-1)
- when (cond) {
- c := Mux(Bool(!isPow2(n)) && wrap, UInt(0),
- c + UInt(1))
- }
- (c, wrap && cond)
-}
-\end{scala}
-
-\subsection{UInt}
-
-\begin{scala}
-// Returns the number of bits set in the
-// input signal. Causes an exception if
-// the input is wider than 32 bits.
-def PopCount(in: UInt): UInt
-
-// Returns the reverse the input signal
-def Reverse(in: UInt): UInt
-
-// returns the one hot encoding of
-// the input UInt
-def UIntToOH(in: UInt, width: Int): UInt
-
-// does the inverse of UIntToOH
-def OHToUInt(in: UInt): UInt
-def OHToUInt(in: Seq[Bool]): UInt
-
-// Builds a Mux tree out of the input
-// signal vector using a one hot encoded
-// select signal. Returns the output of
-// the Mux tree
-def Mux1H[T <: Data]
- (sel: UInt, in: Vec[T]): T
-def Mux1H[T <: Data]
- (sel: Vec[Bool], in: Vec[T]): T
-
-// Builds a Mux tree under the
-// assumption that multiple
-// select signals can be enabled.
-// Priority is given to the first
-// select signal. Returns the output
-// of the Mux tree.
-def PriorityMux[T <: Data]
- (sel: UInt, in: Seq[T]): T
-def PriorityMux[T <: Data]
- (sel: Seq[UInt], in: Seq[T]): T
-
-// Returns the bit position of the
-// trailing 1 in the input vector with
-// the assumption that multiple bits of
-// the input bit vector can be set
-def PriorityEncoder(in: UInt): UInt
-def PriorityEncoder(in: Seq[Bool]): UInt
-
-// Returns the bit position of the
-// trailing 1 in the input vector with
-// the assumption that only one bit in
-// the input vector can be set
-def PriorityEncoderOH(in: UInt): UInt
-def PriorityEncoderOH(in: Seq[Boo]): UInt
-\end{scala}
-
-\subsection{Decoupled}
-
-\begin{scala}
-// Adds a ready-valid handshaking
-// protocol to any interface. The
-// standard used is that the
-// consumer uses the flipped
-// interface.
-class DecoupledIO[+T <: Data](type: T)
- extends Bundle {
- val ready = Bool(INPUT)
- val valid = Bool(OUTPUT)
- val bits = data.asOutput
-}
-
-// Adds a valid protocol to any
-// interface. The standard used is
-// that the consumer uses the
-// fliped interface.
-class ValidIO[+T <: Data](type: T)
- extends Bundle {
- val valid = Bool(OUTPUT)
- val bits = data.asOutput
-}
-
-// Hardware module that is used to
-// sequence n producers into 1 consumer.
-// Priority is given to lower
-// producer
-// Example usage:
-// val arb = new Arbiter(UInt(), 2)
-// arb.io.in(0) <> producer0.io.out
-// arb.io.in(1) <> producer1.io.out
-// consumer.io.in <> arb.io.out
-class Arbiter[T <: Data](type: T, n: Int)
- extends Module
-
-// Hardware module that is used to
-// sequence n producers into 1 consumer.
-// Producers are chosen in round robin
-// order
-// Example usage:
-// val arb = new RRArbiter(UInt(), 2)
-// arb.io.in(0) <> producer0.io.out
-// arb.io.in(1) <> producer1.io.out
-// consumer.io.in <> arb.io.out
-class RRArbiter[T <: Data](type: T, n: Int)
- extends Module
-
-// Generic hardware queue. Required
-// parameter entries controls the
-// depth of the queues. The width of
-// the queue is determined from the
-// inputs.
-// Example usage:
-// val q = new Queue(UInt(), 16)
-// q.io.enq <> producer.io.out
-// consumer.io.in <> q.io.deq
-class Queue[T <: Data]
- (type: T, entries: Int,
- pipe: Boolean = false,
- flow: Boolean = false
- flushable: Boolean = false)
- extends Module
-
-// A hardware module that delays data
-// coming down the pipeline by the
-// number of cycles set by the
-// latency parameter. Functionality
-// is similar to ShiftRegister but
-// this exposes a Pipe interface.
-// Example usage:
-// val pipe = new Pipe(UInt())
-// pipe.io.enq <> produce.io.out
-// consumer.io.in <> pipe.io.deq
-class Pipe[T <: Data]
- (type: T, latency: Int = 1) extends Module
-
-\end{scala}
-
-% henry
-
-% \section{Acknowlegements}
-%
-% Many people have helped out in the design of Chisel, and we thank them
-% for their patience, bravery, and belief in a better way. Many
-% Berkeley EECS students in the Isis group gave weekly feedback as the
-% design evolved including but not limited to Yunsup Lee, Andrew
-% Waterman, Scott Beamer, Chris Celio, etc. Yunsup Lee gave us feedback
-% in response to the first RISC-V implementation, called TrainWreck,
-% translated from Verilog to Chisel. Andrew Waterman and Yunsup Lee
-% helped us get our Verilog backend up and running and Chisel TrainWreck
-% running on an FPGA. Brian Richards was the first actual Chisel user,
-% first translating (with Huy Vo) John Hauser's FPU Verilog code to
-% Chisel, and later implementing generic memory blocks. Brian gave many
-% invaluable comments on the design and brought a vast experience in
-% hardware design and design tools. Chris Batten shared his fast
-% multiword C++ template library that inspired our fast emulation
-% library. Huy Vo became our undergraduate research assistant and was
-% the first to actually assist in the Chisel implementation. We
-% appreciate all the EECS students who participated in the Chisel
-% bootcamp and proposed and worked on hardware design projects all of
-% which pushed the Chisel envelope. We appreciate the work that James
-% Martin and Alex Williams did in writing and translating network and
-% memory controllers and non-blocking caches. Finally, Chisel's
-% functional programming and bit-width inference ideas were inspired by
-% earlier work on a hardware description language called Gel~\cite{gel} designed in
-% collaboration with Dany Qumsiyeh and Mark Tobenkin.
-%
-% % \note{Who else?}
-%
-\begin{thebibliography}{50}
-\bibitem{chisel-dac12} Bachrach, J., Vo, H., Richards, B., Lee, Y., Waterman,
- A., Avi\v{z}ienis, Wawrzynek, J., Asanovi\'{c} \textsl{Chisel:
- Constructing Hardware in a Scala Embedded Language}
-in DAC '12.
-\bibitem{programming-in-scala}Odersky, M., Spoon, L., Venners,
- B. \textsl{Programming in Scala} by Artima.
-\bibitem{programming-scala}Payne, A., Wampler, D.
- \textsl{Programming Scala} by O'Reilly books.
-% \bibitem{gel} Bachrach, J., Qumsiyeh, D., Tobenkin, M. \textsl{Hardware Scripting in Gel}.
-% in Field-Programmable Custom Computing Machines, 2008. FCCM '08. 16th.
-\end{thebibliography}
-
-
-\end{document}
diff --git a/doc/parameters/beramono.sty b/doc/parameters/beramono.sty
deleted file mode 100644
index fcbc324c..00000000
--- a/doc/parameters/beramono.sty
+++ /dev/null
@@ -1,32 +0,0 @@
-\ProvidesPackage{beramono}[2004/01/31 (WaS)]
-\RequirePackage{keyval}
-\define@key{Fvm}{scaled}[.9]{%
- \def\fvm@Scale{#1}}
-\def\ProcessOptionsWithKV#1{%
- \let\@tempc\relax
- \let\Fvm@tempa\@empty
- \@for\CurrentOption:=\@classoptionslist\do{%
- \@ifundefined{KV@#1@\CurrentOption}%
- {}%
- {%
- \edef\Fvm@tempa{\Fvm@tempa,\CurrentOption,}%
- \@expandtwoargs\@removeelement\CurrentOption
- \@unusedoptionlist\@unusedoptionlist
- }%
- }%
- \edef\Fvm@tempa{%
- \noexpand\setkeys{#1}{%
- \Fvm@tempa\@ptionlist{\@currname.\@currext}%
- }%
- }%
- \Fvm@tempa
- \let\CurrentOption\@empty
-}
-\ProcessOptionsWithKV{Fvm}
-\AtEndOfPackage{%
- \let\@unprocessedoptions\relax
-}
-\renewcommand{\ttdefault}{fvm}
-\endinput
-%%
-%% End of file `beramono.sty'.
diff --git a/doc/parameters/figs/alter.pdf b/doc/parameters/figs/alter.pdf
deleted file mode 100644
index ea4ce36e..00000000
Binary files a/doc/parameters/figs/alter.pdf and /dev/null differ
diff --git a/doc/parameters/figs/alterchain.pdf b/doc/parameters/figs/alterchain.pdf
deleted file mode 100644
index 1bcc03c2..00000000
Binary files a/doc/parameters/figs/alterchain.pdf and /dev/null differ
diff --git a/doc/parameters/figs/alterview.pdf b/doc/parameters/figs/alterview.pdf
deleted file mode 100644
index 3f11b56e..00000000
Binary files a/doc/parameters/figs/alterview.pdf and /dev/null differ
diff --git a/doc/parameters/figs/bex1.png b/doc/parameters/figs/bex1.png
deleted file mode 100644
index 822da1da..00000000
Binary files a/doc/parameters/figs/bex1.png and /dev/null differ
diff --git a/doc/parameters/figs/ex1.pdf b/doc/parameters/figs/ex1.pdf
deleted file mode 100644
index 9b6985e5..00000000
Binary files a/doc/parameters/figs/ex1.pdf and /dev/null differ
diff --git a/doc/parameters/figs/ex2.pdf b/doc/parameters/figs/ex2.pdf
deleted file mode 100644
index fb09855b..00000000
Binary files a/doc/parameters/figs/ex2.pdf and /dev/null differ
diff --git a/doc/parameters/figs/ex3.pdf b/doc/parameters/figs/ex3.pdf
deleted file mode 100644
index d815664a..00000000
Binary files a/doc/parameters/figs/ex3.pdf and /dev/null differ
diff --git a/doc/parameters/figs/ex4.pdf b/doc/parameters/figs/ex4.pdf
deleted file mode 100644
index 6bf1ffef..00000000
Binary files a/doc/parameters/figs/ex4.pdf and /dev/null differ
diff --git a/doc/parameters/figs/ex5.pdf b/doc/parameters/figs/ex5.pdf
deleted file mode 100644
index 699ca2eb..00000000
Binary files a/doc/parameters/figs/ex5.pdf and /dev/null differ
diff --git a/doc/parameters/figs/ex6.pdf b/doc/parameters/figs/ex6.pdf
deleted file mode 100644
index 247834af..00000000
Binary files a/doc/parameters/figs/ex6.pdf and /dev/null differ
diff --git a/doc/parameters/figs/figs.graffle b/doc/parameters/figs/figs.graffle
deleted file mode 100644
index 4fdb8cde..00000000
--- a/doc/parameters/figs/figs.graffle
+++ /dev/null
@@ -1,4719 +0,0 @@
-
-
-
-
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.18.0.187838
-
- CreationDate
- 2014-08-26 00:25:08 +0000
- Creator
- adamiz
- FileType
- flat
- GraphDocumentVersion
- 8
- GuidesLocked
- NO
- GuidesVisible
- YES
- ImageCounter
- 3
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2014-08-30 01:30:50 +0000
- Modifier
- adamiz
- NotesVisible
- NO
- OriginVisible
- NO
- PageBreaks
- NO
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSHorizonalPagination
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- size
- {612, 792}
-
- NSPrintReverseOrientation
-
- int
- 0
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- ReadOnly
- NO
- Sheets
-
-
- ActiveLayerIndex
- 0
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {1423, 1085}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- CanvasSize
- {1423, 1085}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphicsList
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{294.63357925415039, 380.70932470185664}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1265
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 D Cache}
-
-
-
- Bounds
- {{294.63357925415039, 404.67831339018437}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1266
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 sets\
-ways}
- VerticalPad
- 0
-
-
-
- ID
- 1264
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{218.63357925415039, 380.70932470185664}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1196
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 I Cache}
-
-
-
- Bounds
- {{218.63357925415039, 404.67831339018437}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1197
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 sets\
-ways}
- VerticalPad
- 0
-
-
-
- ID
- 1195
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{130.46661376953125, 385.03609664606915}, {76.090758527787159, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1232
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Small Core}
-
-
-
- Bounds
- {{130.46661451908778, 409.32894849074296}, {76.090758527787159, 54.658956938383128}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- b
- 0.113725
- g
- 0.121569
- r
- 0.937255
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1233
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 \expnd0\expndtw0\kerning0
-fpu}
- VerticalPad
- 0
-
-
-
- ID
- 1231
-
-
- Bounds
- {{214.95525328036354, 292.36556616240142}, {65.113480255679178, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1193
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Tile}
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1231
-
- ID
- 1326
- Points
-
- {239.24083045264209, 317.07606303961256}
- {194.5014370674246, 385.03609664606915}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1193
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1195
-
- ID
- 1327
- Points
-
- {247.51201592475354, 317.15843591847334}
- {247.5121290749658, 380.70932470185664}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1193
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1264
-
- ID
- 1328
- Points
-
- {255.47229818124524, 317.08084490040147}
- {295.77052266344117, 380.70932470185664}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1193
-
-
-
- GridInfo
-
- HPages
- 3
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- Orientation
- 2
- OutlineStyle
- Basic
- PrintOnePage
-
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Simple parameters
- UniqueID
- 1
- VPages
- 2
-
-
- ActiveLayerIndex
- 0
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {943, 785}}
- Class
- SolidGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 11
-
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- CanvasSize
- {943, 785}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphicsList
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{385.1055793762207, 380.70932470185664}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1265
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 D Cache}
-
-
-
- Bounds
- {{385.1055793762207, 404.67831339018437}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1266
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 sets\
-ways}
- VerticalPad
- 0
-
-
-
- ID
- 1264
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{309.1055793762207, 380.70932470185664}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1196
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 I Cache}
-
-
-
- Bounds
- {{309.1055793762207, 404.67831339018437}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1197
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 sets\
-ways}
- VerticalPad
- 0
-
-
-
- ID
- 1195
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{220.4763916642375, 385.03609664606915}, {71.015203032513696, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1449
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Small Core}
-
-
-
- Bounds
- {{220.4763923637957, 409.32894849074296}, {71.015203032513696, 54.658956938383128}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- b
- 0.113725
- g
- 0.121569
- r
- 0.937255
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1450
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 \expnd0\expndtw0\kerning0
-fpu}
- VerticalPad
- 0
-
-
-
- ID
- 1448
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{132.4763916642375, 385.03609664606915}, {71.015203032513696, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1232
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Big Core}
-
-
-
- Bounds
- {{132.4763923637957, 409.32894849074296}, {71.015203032513696, 54.658956938383128}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- b
- 0.113725
- g
- 0.121569
- r
- 0.937255
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1233
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 \expnd0\expndtw0\kerning0
-iq_depth\
-lsq_depth}
- VerticalPad
- 0
-
-
-
- ID
- 1231
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{253.59713745117188, 265.03609664606915}, {86.77371130341065, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1443
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Tile}
-
-
-
- Bounds
- {{253.59713830596434, 289.32894849074296}, {86.77371130341065, 54.658956938383128}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- b
- 0.113725
- g
- 0.121569
- r
- 0.937255
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1444
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 \expnd0\expndtw0\kerning0
-which_core}
- VerticalPad
- 0
-
-
-
- ID
- 1442
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1264
-
- ID
- 1445
- Points
-
- {335.47317142973168, 343.9879054291261}
- {385.1055793762207, 394.89271290345039}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1442
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1195
-
- ID
- 1446
- Points
-
- {310.47336583106994, 343.98790542912616}
- {323.02149876478444, 380.70932470185659}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1442
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1231
-
- ID
- 1447
- Points
-
- {254.25909655536935, 343.98790542912604}
- {203.49159539630938, 390.89481834992336}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- Pattern
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1442
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1448
-
- ID
- 1454
- Points
-
- {283.4972540181634, 343.9879054291261}
- {269.47335080633479, 385.03609664606915}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- Pattern
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1442
-
-
-
- GridInfo
-
- HPages
- 2
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- Orientation
- 2
- OutlineStyle
- Basic
- PrintOnePage
-
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Disjoint parameter sets
- UniqueID
- 2
- VPages
- 2
-
-
- ActiveLayerIndex
- 0
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {943, 785}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- CanvasSize
- {943, 785}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphicsList
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{376.1055793762207, 352.6973236642591}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1392
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Memory}
-
-
-
- Bounds
- {{376.1055793762207, 376.6663123525866}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1393
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;\red0\green0\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 size\
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-\cf3 width}
- VerticalPad
- 0
-
-
-
- ID
- 1391
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{218.1055793762207, 476.69732366425922}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1386
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Memory}
-
-
-
- Bounds
- {{218.1055793762207, 500.6663123525866}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1387
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;\red0\green0\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 size\
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-\cf3 width}
- VerticalPad
- 0
-
-
-
- ID
- 1385
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{300.1055793762207, 352.6973236642591}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1383
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Memory}
-
-
-
- Bounds
- {{300.1055793762207, 376.6663123525866}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1384
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;\red0\green0\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 size\
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-\cf3 width}
- VerticalPad
- 0
-
-
-
- ID
- 1382
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{218.1055793762207, 357.02408221779592}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1293
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 LSQ}
-
-
-
- Bounds
- {{218.1055793762207, 381.31696084382099}, {57.756828308105469, 54.658956938383128}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- b
- 0.113725
- g
- 0.121569
- r
- 0.937255
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1294
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 depth}
- VerticalPad
- 0
-
-
-
- ID
- 1292
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{142.1055793762207, 357.02408221779592}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1226
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 IQ}
-
-
-
- Bounds
- {{142.1055793762207, 381.31696084382088}, {57.756828308105469, 54.658956938383128}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- b
- 0.113725
- g
- 0.121569
- r
- 0.937255
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1227
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 \expnd0\expndtw0\kerning0
-depth}
- VerticalPad
- 0
-
-
-
- ID
- 1225
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{142.1055793762207, 476.6973236642591}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1361
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Memory}
-
-
-
- Bounds
- {{142.1055793762207, 500.6663123525866}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1362
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;\red0\green0\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 size\
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-\cf3 width}
- VerticalPad
- 0
-
-
-
- ID
- 1360
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{376.1055793762207, 228.69732366425899}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1265
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 D Cache}
-
-
-
- Bounds
- {{376.1055793762207, 252.66631235258671}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1266
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 sets\
-ways}
- VerticalPad
- 0
-
-
-
- ID
- 1264
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{300.1055793762207, 228.69732366425899}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1196
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 I Cache}
-
-
-
- Bounds
- {{300.1055793762207, 252.66631235258671}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1197
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 sets\
-ways}
- VerticalPad
- 0
-
-
-
- ID
- 1195
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{197.95362472534165, 233.0240956084715}, {84.060736781795853, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1333
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Big Core}
-
-
-
- Bounds
- {{197.95362555340935, 257.31694745314536}, {84.060736781795853, 54.658956938383128}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- b
- 0.113725
- g
- 0.121569
- r
- 0.937255
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1334
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 \expnd0\expndtw0\kerning0
-iq_depth\
-lsq_depth}
- VerticalPad
- 0
-
-
-
- ID
- 1332
-
-
- Bounds
- {{296.42725372314453, 168.35356512480377}, {65.113479614257812, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1377
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Tile}
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1225
-
- ID
- 1380
- Points
-
- {218.01818168299752, 311.9759043915285}
- {192.95175664608902, 357.02408221779586}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1332
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1292
-
- ID
- 1381
- Points
-
- {242.21244237601843, 311.9759043915285}
- {244.75545086251691, 357.02408221779586}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1332
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1360
-
- ID
- 1388
- Points
-
- {170.98413743668584, 435.97591778220402}
- {170.98428588342901, 476.6973236642591}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1225
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1385
-
- ID
- 1389
- Points
-
- {246.98413743668584, 435.97591778220414}
- {246.98428588342901, 476.69732366425922}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1292
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1382
-
- ID
- 1390
- Points
-
- {328.98367355057167, 316.30267633574101}
- {328.98340768671648, 352.6973236642591}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1195
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1391
-
- ID
- 1394
- Points
-
- {404.98367355057167, 316.30267633574101}
- {404.98340768671648, 352.6973236642591}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1264
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1264
-
- ID
- 1395
- Points
-
- {339.33643064540007, 193.03191599325183}
- {376.10557937622065, 237.54200360969685}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1377
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1195
-
- ID
- 1396
- Points
-
- {328.98398554662987, 193.14643488528665}
- {328.98396310349642, 228.69732366425896}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1377
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1332
-
- ID
- 1397
- Points
-
- {316.886019359702, 193.00579930138588}
- {278.17275494486813, 233.0240956084715}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1377
-
-
-
- GridInfo
-
- HPages
- 2
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- Orientation
- 2
- OutlineStyle
- Basic
- PrintOnePage
-
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Adding location-independent parameters
- UniqueID
- 3
- VPages
- 2
-
-
- ActiveLayerIndex
- 0
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {928, 789}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- CanvasSize
- {928, 789}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphicsList
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{361.18390732149192, 505.10237767934234}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1392
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Memory}
-
-
-
- Bounds
- {{361.18390732149192, 529.07136636766984}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1393
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;\red0\green0\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 size\
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-\cf3 ecc}
- VerticalPad
- 0
-
-
-
- ID
- 1391
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{208.18390732149197, 629.10237767934257}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1386
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Memory}
-
-
-
- Bounds
- {{208.18390732149197, 653.07136636766995}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1387
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;\red0\green0\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 size\
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-\cf3 ecc}
- VerticalPad
- 0
-
-
-
- ID
- 1385
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{285.18390732149192, 505.10237767934234}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1383
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Memory}
-
-
-
- Bounds
- {{285.18390732149192, 529.07136636766984}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1384
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;\red0\green0\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 size\
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-\cf3 ecc}
- VerticalPad
- 0
-
-
-
- ID
- 1382
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{208.18390732149197, 509.42913623287916}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1293
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 LSQ}
-
-
-
- Bounds
- {{208.18390732149197, 533.72201485890412}, {57.756828308105469, 54.658956938383128}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- b
- 0.113725
- g
- 0.121569
- r
- 0.937255
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1294
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 depth}
- VerticalPad
- 0
-
-
-
- ID
- 1292
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{132.18390732149197, 509.42913623287916}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1226
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 IQ}
-
-
-
- Bounds
- {{132.18390732149197, 533.72201485890412}, {57.756828308105469, 54.658956938383128}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- b
- 0.113725
- g
- 0.121569
- r
- 0.937255
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1227
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 \expnd0\expndtw0\kerning0
-depth}
- VerticalPad
- 0
-
-
-
- ID
- 1225
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{132.18390732149197, 629.10237767934223}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1361
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Memory}
-
-
-
- Bounds
- {{132.18390732149197, 653.07136636766973}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1362
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;\red0\green0\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 size\
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-\cf3 ecc}
- VerticalPad
- 0
-
-
-
- ID
- 1360
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{361.18390732149192, 381.10237767934234}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1265
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 D Cache}
-
-
-
- Bounds
- {{361.18390732149192, 405.07136636767007}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1266
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 sets\
-ways}
- VerticalPad
- 0
-
-
-
- ID
- 1264
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{285.18390732149192, 381.10237767934234}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1196
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 I Cache}
-
-
-
- Bounds
- {{285.18390732149192, 405.07136636767007}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1197
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 sets\
-ways}
- VerticalPad
- 0
-
-
-
- ID
- 1195
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{194.75621872285924, 385.42914962355485}, {80.612204711274501, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1333
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Big Core}
-
-
-
- Bounds
- {{194.75621951695584, 409.72200146822871}, {80.612204711274501, 54.658956938383128}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- b
- 0.113725
- g
- 0.121569
- r
- 0.937255
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1334
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 \expnd0\expndtw0\kerning0
-iq_depth\
-lsq_depth}
- VerticalPad
- 0
-
-
-
- ID
- 1332
-
-
- Bounds
- {{281.50558166841574, 282.75861913988717}, {65.113479614257812, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1377
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Tile}
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1225
-
- ID
- 1380
- Points
-
- {211.47609516335541, 464.38095840661191}
- {184.56052391706112, 509.42913623287916}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1332
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1292
-
- ID
- 1381
- Points
-
- {235.67100430655034, 464.38095840661191}
- {236.36560656667797, 509.42913623287916}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1332
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1360
-
- ID
- 1388
- Points
-
- {161.06233503210461, 588.3809717972872}
- {161.06233503210461, 629.10237767934223}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1225
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1385
-
- ID
- 1389
- Points
-
- {237.06233503210461, 588.3809717972872}
- {237.06233503210461, 629.10237767934268}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1292
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1382
-
- ID
- 1390
- Points
-
- {314.06234107334649, 468.70773035082436}
- {314.06234107334649, 505.10237767934234}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1195
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1391
-
- ID
- 1394
- Points
-
- {390.06234107334649, 468.70773035082436}
- {390.06234107334649, 505.10237767934234}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1264
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1264
-
- ID
- 1395
- Points
-
- {321.41566245820957, 307.48313727490483}
- {364.45460300234242, 381.10237767934228}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1377
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1195
-
- ID
- 1396
- Points
-
- {314.06233371625194, 307.55148889519205}
- {314.06233371625194, 381.10237767934228}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1377
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1332
-
- ID
- 1397
- Points
-
- {306.41686612918278, 307.47870995912245}
- {259.01882944549004, 385.42914962355485}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1377
-
-
-
- GridInfo
-
- HPages
- 2
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- Orientation
- 2
- OutlineStyle
- Basic
- PrintOnePage
-
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Adding location-specific parameters
- UniqueID
- 5
- VPages
- 2
-
-
- ActiveLayerIndex
- 0
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {943, 785}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- CanvasSize
- {943, 785}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphicsList
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{247.69789886474612, 357.04009444880353}, {80.612204711274501, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1333
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Big Core}
-
-
-
- Bounds
- {{247.69789965884272, 381.33294629347739}, {80.612204711274501, 54.658956938383128}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- b
- 0.113725
- g
- 0.121569
- r
- 0.937255
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1334
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 #arch_reg\
-#phy_reg\
-rob_size}
- VerticalPad
- 0
-
-
-
- ID
- 1332
-
-
- Bounds
- {{255.44726181030276, 296.3695639651358}, {65.113479614257812, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1377
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Tile}
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1332
-
- ID
- 1397
- Points
-
- {288.00401526031152, 321.16243374149587}
- {288.00401526031152, 357.04009444880353}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1377
-
-
-
- GridInfo
-
- HPages
- 2
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- Orientation
- 2
- OutlineStyle
- Basic
- PrintOnePage
-
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Deriving Top-level Parameters
- UniqueID
- 7
- VPages
- 2
-
-
- ActiveLayerIndex
- 0
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {1423, 1085}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- CanvasSize
- {1423, 1085}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphicsList
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{297.12559127807617, 380.70932470185664}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1265
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 D Cache}
-
-
-
- Bounds
- {{297.12559127807617, 404.67831339018437}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1266
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 sets}
- VerticalPad
- 0
-
-
-
- ID
- 1264
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{221.12559127807617, 380.70930541438798}, {57.756828308105469, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1196
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 I Cache}
-
-
-
- Bounds
- {{221.12559127807617, 404.67829410271571}, {57.756828308105469, 63.636363983154297}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1197
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 sets}
- VerticalPad
- 0
-
-
-
- ID
- 1195
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{244.61714935302734, 265.03609664606915}, {86.77371130341065, 24.292869750392498}}
- Class
- ShapedGraphic
- ID
- 1443
- Shape
- Rectangle
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Tile}
-
-
-
- Bounds
- {{244.6171502078198, 289.32894849074296}, {86.77371130341065, 54.658956938383128}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- b
- 0.113725
- g
- 0.121569
- r
- 0.937255
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 1444
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;\red239\green31\blue29;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf2 \expnd0\expndtw0\kerning0
-ic_sets\
-dc_sets}
- VerticalPad
- 0
-
-
-
- ID
- 1442
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1264
-
- ID
- 1445
- Points
-
- {300.88107480695737, 343.9879054291261}
- {312.85962908723855, 380.70932470185664}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1442
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 1195
-
- ID
- 1446
- Points
-
- {275.61916900984426, 343.9879054291261}
- {264.09850750696683, 380.70930541438793}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- Legacy
-
- LineType
- 1
- TailArrow
- 0
-
-
- Tail
-
- ID
- 1442
-
-
-
- GridInfo
-
- HPages
- 3
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- Orientation
- 2
- OutlineStyle
- Basic
- PrintOnePage
-
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Renaming Parameters
- UniqueID
- 8
- VPages
- 2
-
-
- ActiveLayerIndex
- 0
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {1423, 1085}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- CanvasSize
- {1423, 1085}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphicsList
-
-
- Bounds
- {{347.13099670410156, 465.36297607421875}, {155.74600219726562, 41.13702392578125}}
- Class
- ShapedGraphic
- FitText
- Clip
- Flow
- Clip
- ID
- 18
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 case 'width' => 128\
-case 'location' => 'cache'}
- VerticalPad
- 0
-
-
-
- Bounds
- {{73.130996704101562, 465.36297607421875}, {155.74600219726562, 41.13702392578125}}
- Class
- ShapedGraphic
- FitText
- Clip
- Flow
- Clip
- ID
- 17
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 case 'width' => 64\
-case 'location' => 'core'}
- VerticalPad
- 0
-
-
-
- Bounds
- {{296.75399780273438, 285.75}, {256.5, 89.5}}
- Class
- ShapedGraphic
- ID
- 15
- Shape
- RoundRect
- Style
-
- Text
-
- Align
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
-
-\f0\fs24 \cf0 case 'width' => site('location') match \
- \{\
- case 'core => 64\
- case 'cache => 128\
- \}}
- VerticalPad
- 0
-
-
-
- Bounds
- {{296.75399780273438, 411.5}, {256.5, 36}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 14
- Shape
- RoundRect
- Style
-
- Text
-
- Align
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
- case 'location' => 'cache'}
- VerticalPad
- 0
-
-
-
- Bounds
- {{22.753997802734379, 285.75}, {256.5, 89.5}}
- Class
- ShapedGraphic
- ID
- 8
- Shape
- RoundRect
- Style
-
- Text
-
- Align
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
-
-\f0\fs24 \cf0 case 'width' => site('location') match \
- \{\
- case 'core => 64\
- case 'cache => 128\
- \}}
- VerticalPad
- 0
-
-
-
- Bounds
- {{22.753997802734379, 411.5}, {256.5, 36}}
- Class
- ShapedGraphic
- ID
- 7
- Shape
- RoundRect
- Style
-
- Text
-
- Align
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
-
-\f0\fs24 \cf0 case 'location' => 'core'}
- VerticalPad
- 0
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 7
-
- ID
- 9
- Points
-
- {151.00770863622569, 375.75000000073703}
- {151.01059939602146, 411.00000005269834}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- FilledArrow
-
-
- Tail
-
- ID
- 8
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 14
-
- ID
- 16
- Points
-
- {425.00771041829984, 375.75000000073805}
- {425.01060256634128, 411.00000005276996}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- FilledArrow
-
-
- Tail
-
- ID
- 15
-
-
-
- GridInfo
-
- HPages
- 3
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- Orientation
- 2
- OutlineStyle
- Basic
- PrintOnePage
-
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Site
- UniqueID
- 9
- VPages
- 2
-
-
- ActiveLayerIndex
- 0
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {1423, 1085}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- CanvasSize
- {1423, 1085}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphicsList
-
-
- Bounds
- {{123.12300109863281, 411.13702392578125}, {155.74600219726562, 49.86297607421875}}
- Class
- ShapedGraphic
- FitText
- Clip
- Flow
- Clip
- ID
- 17
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 case 'sets' => 128\
-case 'ways' => 4\
-case 'size' => 512}
- VerticalPad
- 0
-
-
-
- Bounds
- {{67.123001098632798, 337.85900115966797}, {267.74600219726562, 57.25}}
- Class
- ShapedGraphic
- ID
- 8
- Shape
- RoundRect
- Style
-
- Text
-
- Align
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
-
-\f0\fs24 \cf0 case 'sets' => 128\
-case 'ways' => 4\
-case 'size' => here('sets')*here('ways')}
- VerticalPad
- 0
-
-
-
- GridInfo
-
- HPages
- 3
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- Orientation
- 2
- OutlineStyle
- Basic
- PrintOnePage
-
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Here
- UniqueID
- 11
- VPages
- 2
-
-
- ActiveLayerIndex
- 0
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {1423, 1085}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- CanvasSize
- {1423, 1085}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphicsList
-
-
- Bounds
- {{73.130996704101562, 490.5}, {155.74600219726562, 64.5}}
- Class
- ShapedGraphic
- FitText
- Clip
- Flow
- Clip
- ID
- 14
- Shape
- Rectangle
- Style
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 case 'fpu' => true\
-case 'depth' => 10\
-case 'width' => 32\
-case 'size' => 320}
- VerticalPad
- 0
-
-
-
- Bounds
- {{22.753997802734382, 437.17549896240234}, {256.5, 24.625}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 12
- Shape
- RoundRect
- Style
-
- Text
-
- Align
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-case 'size' => 320}
- VerticalPad
- 0
-
-
-
- Bounds
- {{22.753997802734382, 360.92549896240234}, {256.5, 39.125}}
- Class
- ShapedGraphic
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- NSKern
- 0.0
- Size
- 12
-
- ID
- 10
- Shape
- RoundRect
- Style
-
- Text
-
- Align
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
-
-\f0\fs24 \cf0 \expnd0\expndtw0\kerning0
-case 'depth' => 10\
-case 'width' => 32}
- VerticalPad
- 0
-
-
-
- Bounds
- {{22.753997802734382, 270.86299896240234}, {256.5, 53.25}}
- Class
- ShapedGraphic
- ID
- 8
- Shape
- RoundRect
- Style
-
- Text
-
- Align
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210
-\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
-
-\f0\fs24 \cf0 case 'fpu' => true\
-case 'depth' => 5\
-case 'width' => 64}
- VerticalPad
- 0
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 10
-
- ID
- 11
- Points
-
- {151.01882096820287, 324.6129988676123}
- {151.03839164571983, 360.42549970766987}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- FilledArrow
-
-
- Tail
-
- ID
- 8
-
-
-
- Class
- LineGraphic
- Head
-
- ID
- 12
-
- ID
- 13
- Points
-
- {151.00900155701197, 400.550498966335}
- {151.01801143238467, 436.67549925046814}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- FilledArrow
-
-
- Tail
-
- ID
- 10
-
-
-
- GridInfo
-
- HPages
- 3
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- AutoLayout
- 2
- LineLength
- 0.4643835723400116
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- Orientation
- 2
- OutlineStyle
- Basic
- PrintOnePage
-
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Alter
- UniqueID
- 10
- VPages
- 2
-
-
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UseEntirePage
-
- WindowInfo
-
- CurrentSheet
- 7
- ExpandedCanvases
-
- Frame
- {{-242, 900}, {1920, 1178}}
- ListView
-
- OutlineWidth
- 231
- RightSidebar
-
- Sidebar
-
- SidebarWidth
- 267
- VisibleRegion
- {{0.5, 0.5}, {703.5, 534.5}}
- Zoom
- 2
- ZoomValues
-
-
- Simple parameters
- 1.8300000429153442
- 1.6799999475479126
-
-
- Disjoint parameter sets
- 0.94999998807907104
- 1.1399999856948853
-
-
- Adding location-independent parameters
- 0.0
- 1
-
-
- Adding location-specific parameters
- 0.94999998807907104
- 0.93999999761581421
-
-
- Deriving Top-level Parameters
- 0.94999998807907104
- 1
-
-
- Renaming Parameters
- 2
- 0.94999998807907104
-
-
- Site
- 2
- 1
-
-
- Alter
- 2
- 1
-
-
- Here
- 2
- 1
-
-
-
-
-
diff --git a/doc/parameters/figs/figs.png b/doc/parameters/figs/figs.png
deleted file mode 100644
index 822da1da..00000000
Binary files a/doc/parameters/figs/figs.png and /dev/null differ
diff --git a/doc/parameters/figs/here.pdf b/doc/parameters/figs/here.pdf
deleted file mode 100644
index d4cb2c8e..00000000
Binary files a/doc/parameters/figs/here.pdf and /dev/null differ
diff --git a/doc/parameters/figs/sitea.pdf b/doc/parameters/figs/sitea.pdf
deleted file mode 100644
index 80d271d9..00000000
Binary files a/doc/parameters/figs/sitea.pdf and /dev/null differ
diff --git a/doc/parameters/figs/siteb.pdf b/doc/parameters/figs/siteb.pdf
deleted file mode 100644
index 3ced9736..00000000
Binary files a/doc/parameters/figs/siteb.pdf and /dev/null differ
diff --git a/doc/parameters/parameters.pdf b/doc/parameters/parameters.pdf
deleted file mode 100644
index 459f4249..00000000
Binary files a/doc/parameters/parameters.pdf and /dev/null differ
diff --git a/doc/parameters/parameters.tex b/doc/parameters/parameters.tex
deleted file mode 100644
index a27aa8d9..00000000
--- a/doc/parameters/parameters.tex
+++ /dev/null
@@ -1,805 +0,0 @@
-\documentclass[10pt,twocolumn]{article}
-\setlength\textwidth{6.875in}
-\setlength\textheight{8.875in}
-% set both margins to 2.5 pc
-\setlength{\oddsidemargin}{-0.1875in}% 1 - (8.5 - 6.875)/2
-\setlength{\evensidemargin}{-0.1875in}
-\setlength{\marginparwidth}{0pc}
-\setlength{\marginparsep}{0pc}%
-\setlength{\topmargin}{0in} \setlength{\headheight}{0pt}
-\setlength{\headsep}{0pt}
-\setlength{\footskip}{37pt}%
-\setlength{\columnsep}{0.3125in}
-\setlength{\columnwidth}{3.28125in}% (6.875 - 0.3125)/2 = 3.28125in
-\setlength{\parindent}{1pc}
-\newcommand{\myMargin}{1.00in}
-\usepackage[top=\myMargin, left=\myMargin, right=\myMargin, bottom=\myMargin, nohead]{geometry}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage[procnames]{listings}
-\usepackage{hyperref}
-
-\newenvironment{commentary}
-{ \vspace{-0.1in}
- \begin{quotation}
- \noindent
- \small \em
- \rule{\linewidth}{1pt}\\
-}
-{
- \end{quotation}
-}
-
-\title{Advanced Parameterization Manual}
-\author{Adam Izraelevitz \\
-EECS Department, UC Berkeley\\
-{\tt adamiz@eecs.berkeley.edu}
-}
-\date{\today}
-
-\newenvironment{example}{\VerbatimEnvironment\begin{footnotesize}\begin{Verbatim}}{\end{Verbatim}\end{footnotesize}}
-\newcommand{\kode}[1]{\begin{footnotesize}{\tt #1}\end{footnotesize}}
-
-\def\code#1{{\small\tt #1}}
-
-\def\note#1{\noindent{\bf [Note: #1]}}
-%\def\note#1{}
-
-\input{../style/scala.tex}
-
-\lstset{frame=, basicstyle={\footnotesize\ttfamily}}
-
-\lstset{frame=}
-
-\begin{document}
-\maketitle{}
-
-
-\section{Introduction}
-
-This document is a manual for using the advanced parameter library within {\em Chisel}. For more general information regarding {\em Chisel} as a hardware construction language, please see the Getting Started documentation.
-
-As hardware designs grow in complexity, modularity becomes necessary for maintaince and verification. The primary use case for {\em Chisel} is describing diverse and highly-parameterized hardware generators, and we quickly realized that the traditional parameterization method forces brittleness into a design's source code and limits component reuse.
-
-The outline of this document is as follows: in Section \ref{sec:advanced}, we describe the basic objects and methods for the advanced parameterization mechanism, as well as the required boilerplate to use it. In Section \ref{sec:examples}, a series of increasingly complex examples of design patterns are described. For each example, we propose the simplest parameterization scheme which solves the problem. As the examples build in complexity, so do the parameterization requirements, until we we arrive at the described advanced parameterization mechanism. The next section, Section \ref{sec:knobs}, introduces the concept of \code{Knobs} and their relationship to design constraints and the \code{Parameters} object. Finally, in Section \ref{sec:heuristics}, we explain multiple design heuristics which should be followed when using advanced parameterization.
-
-\section{Advanced Parameterization}
-\label{sec:advanced}
-
-Every {\em Chisel} Module has a member \code{params} of class \code{Parameters} that provides the mechanism for passing parameters between modules.
-
-This section describes the following features: (1) the \code{Parameters} class and associated methods/members; (2) the basic usage model; (3) syntactic sugar; (4) boilerplate code for exposing parameters to external users/programs; (5) advanced functionality via Views (site, here, up).
-
-\subsection{Classes and Methods}
-The \code{Parameters} class has the following base methods:
-
- \begin{scala}
-class Parameters {
- // returns a value of type T
- def apply[T](key:Any):T
-
- // returns new Parameters class
- def alter(mask:(Any,View,View,View)=>Any):Parameters
-
- // returns a Module's Parameters instance
- def params:Parameters
-}
- \end{scala}
-\code{View} is a class containing a base method:
- \begin{scala}
-class View {
- // returns a value of type T
- def apply[T](key:Any):T
-}
- \end{scala}
-\code{Parameters} has a factory object containing one basic method:
- \begin{scala}
-object Parameters {
- // returns an empty Parameters instance
- def empty:Parameters
-}
- \end{scala}
-
-The \code{Module} factory object now has an additional apply method:
- \begin{scala}
-object Module {
- // returns a new Module of type T, initialized with a Parameters instance if _p !=None.
- def apply[T<:Module](c: =>T)(implicit _p: Option[Parameters] = None):T
-}
- \end{scala}
-
-\subsection{Basic Usage Model}
-
-This example shows the simplest usage of (1) quering params, (2) altering a Parameters object, and (3) passing a Parameters object to a Module:
-
-\begin{scala}
-class Tile extends Module {
- val width = params[Int]('width')
-}
-object Top {
- val parameters = Parameters.empty
- val tile_parameters = parameters.alter( (key,site,here,up) => {
- case 'width' => 64
- })
- def main(args:Array[String]) = {
- chiselMain(args,()=>Module(new Tile)(Some(tile_parameters)))
- }
-}
-\end{scala}
-
-Within the Module \code{Tile}, the \code{params} member is queried by calling Parameters.apply with the key and return value type.
-
-In \code{Top}, an empty parameters is created by calling Parameters.empty; then it is altered with a function of type \code{(Any,View,View,View) => Any} to return a new Parameters instance, which is assigned to \code{tile\_parameters}.
-
-After wrapping \code{tile\_parameters} within \code{Some:Option[Parameters]}, it is passed as a second argument to the Module object when passed to \code{chiselMain}.
-
-\subsection{Syntactic Sugar: Field[T]}
-
-The simple example requires the return type \code{Int} must be included as an argument to the apply method, otherwise the Scala compiler will throw an error:
-
-\begin{scala}
-class Tile extends Module {
- val width = params[Int]('width')
-}
-\end{scala}
-
-Alternatively, one can create a case object for each key which extends \code{Field[T]} and pass that directly into \code{params} apply method. Because \code{Field} contains the return type information, the type does not need to be passed:
-
-\begin{scala}
-case object Width extends Field[Int]
-class Tile extends Module {
- val width = params(Width)
-}
-\end{scala}
-
-For the rest of the document, assume the key to every query is a case class that extends \code{Field[T]} with the correct return type.
-
-\subsection{Syntactic Sugar: Passing and Altering}
-
-\begin{figure}[h]
-\centering
-\includegraphics[width=3in]{figs/alter}
-\caption{An example of Memory's key/value chain and flat map.}
-\label{fig:alter}
-\end{figure}
-
-As a module hierarchy is formed, \code{Parameters} objects are passed between a parent module and a child module. If specified by the programmer, these objects can be copied and altered prior to instantiating the child.
-
-Anytime an alteration is performed, {\em Chisel} internally copies the existing chain of key/value mappings and attaches the provided key/value mappings to the bottom of this chain. When a query is evaluated, it first queries the chain's bottom key/value mapping. If there is no match, the query is then evaluated on the next key/value mapping in the chain, and so forth. If a query reaches the top of the chain with no matches, {\em Chisel} triggers a \code{ParameterUndefinedException}.
-
-When instantiating a child, the parent can pass its \code{Parameters} object one of two ways:
-\begin{enumerate}
- \item Explicitly pass its \code{Parameters} object to its child via a second argument to the Module factory, wrapped in \code{Option[Parameters]}:
-\begin{scala}
-class Tile extends Module {
- val width = params(Width)
- val core = Module(new Core)(Some(params))
- // Explicit passing of Tile's params to Core
-}
-\end{scala}
- \item Implicitly pass its \code{Parameters} object to its child:
-\begin{scala}
-class Tile extends Module {
- val width = params(Width)
- val core = Module(new Core)
- // Implicit passing of Tile's params to Core
-}
-\end{scala}
-\end{enumerate}
-
-If a parent wants to copy/alter the child's dictionary, the parent has two methods to do so:
-\begin{enumerate}
- \item Provide a PartialFunction mapping as an argument to the Module factory. Internally, {\em Chisel} will copy the parent's \code{Parameters} object and apply the alteration:
-\begin{scala}
-class Tile extends Module {
- val width = params(Width)
- val core = Module(new Core,{case Width => 32})
- // Provide PartialFunction to Module factory constructor to alter Core's \code{Parameters} object
-}
-\end{scala}
- \item Call the \code{Parameter.alter} function, which returns a new \code{Parameters} object. This approach gives the programmer access to the new \code{Parameters} object, as well as the ability to use \code{site}, \code{here}, and \code{up} (see Sections \ref{sec::site}, \ref{sec::here}, \ref{sec::up}) :
-\begin{scala}
-class Tile extends Module {
- val width = params(Width)
- val core_params = params.alter(
- (pname,site,here,up) => pname match {
- case Width => 32
- })
- val core = Module(new Core)(Some(core_params))
- // Use the Parameter.alter method to return an altered Parameter object. Only use when site, here, or up mechanisms are needed
-}
-\end{scala}
-\end{enumerate}
-A more complicated example of a alteration chain is shown in Figure \ref{fig:alter} and describe below:
-\begin{scala}
-class Tile extends Module {
- ...
- val core = Module(new Core, {case FPU => true; case QDepth => 20; case Width => 64})
-}
-class Core extends Module {
- val fpu = params(FPU)
- val width = params(Width)
- val depth = params(Depth)
- val queue = Module(new Queue,{case Depth => depth*2; case Width => 32})
-}
-class Queue extends Module {
- val depth = params(Depth)
- val width = params(Width)
- val mem = Module(new Memory,{case Size => depth * width})
-}
-class Memory extends Module {
- val size = params(Size)
- val width = params(Width)
-}
-\end{scala}
-
-\subsection{ChiselConfig and Boilerplate}
-\label{sec::config}
-
-{\em Chisel}'s mechanism to seed the top-level parameters is through a \code{ChiselConfig} object. \code{ChiselConfig.topDefinitions} contains the highest parameter definitions and is of the following form:
-\begin{scala}
-case object Width extends Field[Int]
-class DefaultConfig extends ChiselConfig {
- val topDefinitions:World.TopDefs = {
- (pname,site,here) => pname match {
- case Width => 32
- }
- }
-}
-\end{scala}
-Normally, a design calls \code{chiselMain.apply} to instantiate a design. To use {\em Chisel}'s parameterization mechanism and correctly seed a \code{ChiselConfig}, one should instead call \code{chiselMain.run} with the design NOT surrounded by the \code{Module} factory. The reason for this change is to preserve backwards compatibility with existing designs, although we intend to fix this in future releases.
-
-An example of calling \code{chiselMain.run} is as follows:
-\begin{scala}
-object Run {
- def main(args: Array[String]): Unit = {
- chiselMain.run(args, () => new Tile())
- }
-}
-\end{scala}
-To instantiate a design with a specific \code{ChiselConfig}, simply call the {\em Chisel} compiler with the \code{-{-}configInstance {\it project\_name.configClass\_name}} argument.
-
-\subsection{Using site}
-\label{sec::site}
-
-\begin{figure*}
-\begin{center}
-\begin{tabular}{cc}
-\includegraphics[height=2.0in]{figs/sitea} &
-\includegraphics[height=2.0in]{figs/siteb} \\
-(a) Core's key/value chain and flat map & (b) Cache's key/value chain and flat map \\
-\end{tabular}
-\end{center}
-\caption{For (a), site(Location) will return Core, while in (b) site(Location) will return Cache.}
-\label{fig:site}
-\end{figure*}
-To help the designer express dependencies between parameters, we added the \code{site} mechanism. To understand its function, remember that conceptually, a queried Module's params member first looks at the bottom key/value mapping in its chain of key/value mappings. If there is no match, the query moves up the chain.
-
-Suppose we have some modules which have following form:
-
-\begin{scala}
-class Core extends Module {
- val data_width = params(Width)
- ...
-}
-class Cache extends Module {
- val line_width = params(Width)
- ...
-}
-\end{scala}
-Unfortunately, both have identical queries for \code{Width} but, for this example's sake, have different semantic meaning. Inside a core, \code{Width} means the word size, while in the \code{Cache}, \code{Width} means the width of a cache line. We want to be able to easily tailor the parameter's response to either query.
-
-The \code{site} mechanism allows a key/value mapping in the middle of the chain to make its own queries that start at the bottom of the chain.
-
-Consider the following example:
-\begin{scala}
-class DefaultConfig extends ChiselConfig {
- val top:World.TopDefs = {
- (pname,site,here) => pname match {
- case Width => site(Location) match {
- case 'core' => 64 // data width
- case 'cache' => 128 // cache line width
- }
- }
- }
-}
-class Tile extends Module {
- val core = Module(new Core, {case Location => 'core'})
- val cache = Module(new Cache, {case Location => 'cache'})
-}
-\end{scala}
-The top-level key/value mapping is using \code{site} to query the bottom of the chain for \code{Location}. Depending on what value returns (either \code{'core'} or \code{'cache'}), the top-level key/value mapping produces a different value (Figure \ref{fig:site}).
-
-\subsection{Using here}
-\label{sec::here}
-
-\begin{figure}[h]
-\centering
-\includegraphics[width=3in]{figs/here}
-\caption{Instead of using 128 or 4 directly, we can access it via here(Sets) and here(Ways), respectively.}
-\label{fig:alter}
-\end{figure}
-
-If a parameter is a deterministic function of other parameters expressed at the same group in the key/value mapping chain, one does not want to duplicate a value, as giving a new value would require multiple changes. Instead, one can use the \code{here} mechanism to query the same group of key/value mappings that \code{here} was called:
-
-\begin{scala}
-class Tile extends Module {
- val cache_params = params.alter(
- (pname, site, here, up) => pname match {
- case Sets => 128
- case Ways => 4
- case Size => here(Sets)*here(Ways)
- })
- val cache = Module(new Cache)(cache_params)
-}
-\end{scala}
-
-\subsection{Using up}
-\label{sec::up}
-
-The \code{up} mechanism enables the user to query the parent group of key/value mappings. It is equivalent to calling \code{Parameters.apply} directly, but can be done within calling \code{Parameters.alter}. For an example use, see Section \ref{sec::rename}.
-
-\section{Examples}
-\label{sec:examples}
-
-The three goals of any parameterization scheme are: (1) all searchable parameters are exposed at the top level; (2) source code must never change when evaluating different points; (3) adding new parameters requires little source code change. After each example is described, we present the simplest parameterization scheme that supports the desired design space without violating any of the three goals. As examples grow in complexity, so too must the simplest parameterization scheme, until we arrive at the current advanced parameterization method.
-
-\subsection{Simple Parameters}
-
-\begin{figure}[h]
-\centering
-\includegraphics[width=3in]{figs/ex1}
-\caption{For a few number of parameters, the simplest scheme is to pass them directly via constructor arguments.}
-\label{fig:ex1}
-\end{figure}
-
-In this simple design, we only vary core and cache-specific parameters. The most straightforward parameterization scheme is passing all parameters via arguments to \code{Tile}'s constructor. These values are then passed to \code{Core} and \code{Cache} via their respective constructors:
-
-\begin{scala}
-class Tile (val fpu:Boolean, val ic_sets:Int, val ic_ways:Int, val dc_sets:Int, val dc_ways:Int) extends Module {
- val core = Module(new Core(fpu))
- val icache = Module(new Cache(ic_sets,ic_ways)
- val dcache = Module(new Cache(dc_sets,dc_ways))
- ...
-}
-class Core (val fpu:Boolean) {...}
-class Cache(val sets:Int, val ways:Int) extends Module {...}
-\end{scala}
-
-No source code changes are necessary to explore our parameter space, and all searchable parameters are exposed at the top. In addition, adding a new parameter, because this example is simple, requires very few changes to our source code.
-
-\subsection{Disjoint Parameter Sets}
-
-\begin{figure}[h]
-\centering
-\includegraphics[width=3in]{figs/ex2}
-\caption{For disjoint parameter sets, we can group sets of parameters into configuration objects to pass as constructor arguments.}
-\label{fig:ex2}
-\end{figure}
-
-In this next design, we are designing a chip which could instantiate different cores, each with its own set of parameters. If we apply our simple solution, the number of arguments to \code{Tile}'s constructor would be huge as it must contain all parameters for all possible cores (which would likely be much greater than two cores!).
-
-One could propose that a better solution would be to group parameters into configuration objects. For example, we could group all \code{BigCore} parameters into a \code{BigCoreConfig} case class, and all \code{SmallCore} parameters into a \code{SmallCoreConfig} class, both of which extend \code{CoreConfig}. In addition, we have our caches and \code{Tile} accept a \code{CacheConfig} and \code{TileConfig}, respectively, within their constructors.
-
-\begin{scala}
-abstract class CoreConfig {}
-case class BigCoreConfig(iq_depth:Int, lsq_depth:Int) extends CoreConfig
-case class SmallCoreConfig(fpu:Boolean) extends CoreConfig
-case class CacheConfig(sets:Int, ways:Int)
-case class TileConfig(cc:CoreConfig, icc:CacheConfig, dcc:CacheConfig)
-
-class Tile (val tc:TileConfig) extends Module {
- val core = tc.cc match {
- case bcc:BigCoreConfig => Module(new BigCore(tc.bcc))
- case scc:SmallCoreConfig => Module(new SmallCore(tc.scc))
- }
- val icache = Module(new Cache(tc.icc)
- val dcache = Module(new Cache(tc.dcc))
- ...
-}
-...
-\end{scala}
-
-\subsection{Location-Independent Parameters}
-
-\begin{figure}[h]
-\centering
-\includegraphics[width=3in]{figs/ex3}
-\caption{For location-independent parameters, every module has a parameter dictionary, which they can copy and alter before passing to each child module.}
-\label{fig:ex3}
-\end{figure}
-
-The subtle reason why nested configuration objects are extremely brittle is the structure of the nested configuration objects encodes the module hierarchy. Given a new design described in Figure \ref{fig:ex3}, we assume that \code{BigCore}'s IQ and LSQ, as well as the icache and dcache, instantiate a \code{Memory} module. This Memory module contains a \code{width} parameter, and in order for the design to function correctly, all of Memory widths must be set to the same value. To ensure this requirement, the follow code might be written:
-
-\begin{scala}
-case class MemConfig(size:Int, banks:Int, width:Int)
-case class CacheConfig(sets:Int, ways:Int, mc:MemConfig)
-case class QueueConfig(depth:Int, mc:MemConfig)
-case class BigCoreConfig(iqc:QueueConfig, lsqc:QueueConfig, mc:MemConfig)
-
-case class TileConfig(cc:CoreConfig, icc:CacheConfig, dcc:CacheConfig)
-
-class Tile (val tc:TileConfig) extends Module {
- val core = tc.cc match {
- case bcc:BigCoreConfig => Module(new BigCore(tc.bcc))
- case scc:SmallCoreConfig => Module(new SmallCore(tc.scc))
- }
- val icache = Module(new Cache(tc.icc)
- val dcache = Module(new Cache(tc.dcc))
-
- require(tc.dcc.mc.width == tc.icc.mc.width)
- require(tc.bcc.iqc.mc.width == tc.bcc.lsqc.mc.width)
- require(tc.dcc.mc.width == tc.bcc.lsqc.mc.width)
- ...
-}
-...
-\end{scala}
-
-The series of require statements is extremely brittle, as any change in our design's hierarchy requires massive rewrites of all of these statements. Omitting the require statements is not a viable option; these statements are necessary to enforce this fundamental design requirement.
-
-This flaw in configuration objects leads us towards the first functionality of our custom parameterization solution, namely a copy/alter dictionary of type \code{Parameters}. We use this key-value structure (map or dictionary) to store a module's parameters.
-
-To parameterize the design in Figure \ref{fig:ex3}, we implicitly pass the \code{Parameters} object and, if an alter is needed, provide a \code{PartialFunction} to the \code{Module} factory. Recall from Section \ref{sec:advanced} that the class \code{MyConfig} (extends \code{ChiselConfig}) must be passed to the {\em Chisel} compiler via the \code{-{-}configInstance} flag to seed the top-level parameters:
-\begin{scala}
-class DefaultConfig() extends ChiselConfig {
- val top:World.TopDefs = {
- (pname,site,here) => pname match {
- case IQ_depth => 10
- case LSQ_depth =>10
- case Ic_sets => 128
- case Ic_ways => 2
- case Dc_sets => 512
- case Dc_ways => 4
- case Width => 64
- // since any module querying Width should return 64, the name should NOT be unique to modules
- }
- }
-}
-class Tile extends Module {
- val core = Module(new Core)(params)
- val ic_sets = params(Ic_sets)
- val ic_ways = params(Ic_ways)
- val icache = Module(new Cache, {case Sets => ic_sets; case Ways => ic_ways})
- // we can rename Ic_sets to Sets, effectively isolating Cache's query keys from any design hierarchy dependence
- val dc_sets = params(Dc_sets)
- val dc_ways = params(Dc_ways)
- val dcache = Module(new Cache, {case Sets => dc_sets; case Ways => dc_ways})
- // similarly we rename Dc_sets to Sets and Dc_ways to Ways
-}
-class Core extends Module {
- val iqdepth = params(IQ_depth)
- val iq = Module(new Queue, {case Depth => iqdepth})
- val lsqdepth = params(LSQ_depth)
- val lsq = Module(new Queue, {case Depth => lsqdepth})
- ...
-}
-class Queue extends Module {
- val depth = params(Depth)
- val mem = Module(new Memory,{case Size => depth})
- ...
-}
-class Cache extends Module {
- val sets = params(Sets)
- val ways = params(Ways)
- val mem = Module(new Memory,{case Size => sets*ways})
-}
-class Memory extends Module {
- val size = params(Size)
- val width = params(Width)
-}
-\end{scala}
-
-Although this parameterization method is reasonably verbose, it scales well with adding parameters, requires no source changes, and allows a single parameter, such as \code{Width}, to change all leaf modules.
-
-\subsection{Location-Specific Parameters}
-
-\begin{figure}[h]
-\centering
-\includegraphics[width=3in]{figs/ex4}
-\caption{For location-dependent parameters, we can use the \code{site} mechanism to customize these parameters at the top level.}
-\label{fig:ex4}
-\end{figure}
-
-As we saw in the previous section, copying and altering a \code{Parameters} object can be verbose. If we wanted to add an ECC parameter to our \code{Memory} module, which depends on where the \code{Memory} is instantiated, we would change source code in multiple parents to rename each parameter (e.g. ECC\_icache => ECC).
-
-In the example depicted in Figure \ref{fig:ex4}, we instead use the \code{site} functionality of our \code{Parameters} object to obtain location-specific information, and tailor the value we return to that location-specific value. After adding the location-specific information, we drastically reduce the amount of code changes necessary:
-
-\begin{scala}
-class DefaultConfig() extends ChiselConfig {
- val top:World.TopDefs = {
- (pname,site,here) => pname match {
- case Depth => site(Queue_type) match {
- case 'iq' => 20
- case 'lsq' => 10
- }
- case Sets => site(Cache_type) match {
- case 'i' => 128
- case 'd' => 512
- }
- case Ways => site(Cache_type) match {
- case 'i' => 2
- case 'd' => 4
- }
- case Width => 64
- // since any module querying Width should return 64, the name should NOT be unique to modules
- case ECC => site(Location) match {
- 'incore' => false
- 'incache' => true
- }
- }
- }
-}
-class Tile (val params:Parameters) extends Module {
- val core = Module(new Core,{Location => 'incore'})
- // we can give core and its child modules a location identifier
-
- val cacheparams = params.alter({Location => 'incache'})
- // we can give both caches and all their child modules a location identifier
- val icache = Module(new ICache)(cacheparams)
- val dcache = Module(new DCache)(cacheparams)
-}
-class Core extends Module {
- val iq = Module(new IQ)
- val lsq = Module(new LSQ)
- ...
-}
-class IQ extends Module {
- val depth = params(Depth)
- val mem = Module(new Memory, {Size = depth})
- // in some cases, using copy/alter is preferred instead of \code{site} (see Design Heuristics for more details)
- ...
-}
-class LSQ extends Module {
- val depth = params(Depth)
- val mem = Module(new Memory, {Size = depth})
- ...
-}
-class ICache extends Module {
- val sets = params(Sets)
- val ways = params(Ways)
- val mem = Module(new Memory,{Size => sets*ways})
-}
-class DCache extends Module {
- val sets = params(Sets)
- val ways = params(Ways)
- val mem = Module(new Memory, {Size => sets*ways})
-}
-class Memory extends Module {
- val size = params(Size)
- val ecc = params(ECC)
-}
-\end{scala}
-
-\subsection{Derivative Parameters}
-
-\begin{figure}[h]
-\centering
-\includegraphics[width=1.5in]{figs/ex5}
-\caption{To derive a parameter from another top-level parameter, we can use the here functionality to avoid duplicating a parameter value.}
-\label{fig:ex5}
-\end{figure}
-
-In Figure \ref{fig:ex5}, we always want our ROB to be four-thirds the size of the difference between the number physical registers and the number of architectural registers. If we express this in \code{MyConfig.top}, it could look like the following:
-
-\begin{scala}
-case object NUM_arch_reg extends Field[Int]
-case object NUM_phy_reg extends Field[Int]
-case object ROB_size extends Field[Int]
-class DefaultConfig() extends ChiselConfig {
- val top:World.TopDefs = {
- (pname,site,here) => pname match {
- case NUM_arch_reg => 32
- case NUM_phy_reg => 64
- case ROB_size => 4*(64-32)/3
- }
-}
-\end{scala}
-However, if we later increase the number of physical registers, we need to remember to update the value in the derivation of the ROB size. To avoid this potential error, one should use the 'here' functionality to query the same group of parameters:
-
-\begin{scala}
-class DefaultConfig() extends ChiselConfig {
- val top:World.TopDefs = {
- (pname,site,here) => pname match {
- case NUM_arch_reg => 32
- case NUM_phy_reg => 64
- case ROB_size => 4*(here(NUM_phy_reg) - here(NUM_arch_reg))/3
- }
-}
-\end{scala}
-
-\subsection{Renaming Parameters}
-\label{sec::rename}
-
-\begin{figure}[h]
-\centering
-\includegraphics[width=1.5in]{figs/ex6}
-\caption{To rename or programmatically alter a parameter based on the previous value, one can use the up mechanism to query the parent's \code{Parameters} object.}
-\label{fig:ex6}
-\end{figure}
-
-In Figure \ref{fig:ex6}, both cache modules query for a \code{sets} parameter. However, \code{Tile} has \code{ic\_sets} and \code{dc\_sets} as parameters. To rename the parameters, we can read the parent value and alter the child's \code{Parameters} object:
-
-\begin{scala}
-class Tile extends Module {
- val ic_sets = params(Ic_sets)
- val ic = Module(new Cache,{case Sets => ic_sets})
- val dc_sets = params(Ic_sets)
- val dc = Module(new Cache,{case Sets => dc_sets})
- ...
-}
-\end{scala}
-Alternatively, we can use the 'up' mechanism within the Parameters.alter method to query the parent module's Parameter object:
-\begin{scala}
-class Tile extends Module {
- val ic_params = params.alter(
- (pname,site,here,up) => pname match {
- case Sets => up(Ic_sets)
- }
- )
- val ic = Module(new Cache)(ic_params)
- ...
-}
-\end{scala}
-In general one should never use the \code{up} mechanism as it is more verbose. However, it can be useful if the parent is making significant changes to a child's \code{Parameters} object, as all changes can be contained the \code{Parameter.alter} method because one has access to all three central mechanisms (\code{up}, \code{site}, and \code{here}).
-
-\section{External Interface}
-\label{sec:knobs}
-
-So far, this document has only describe mechanisms to manipulate parameters at a top-level class (\code{ChiselConfig}). However, to actually generate multiple C++ or Verilog designs, we need to manually change these parameters.
-
-One would prefer to express design constraints (parameter ranges, dependencies, constraints) and leave the actual instantiation of a specific design separate from the expression of the valid design space.
-
-With that motivation, {\em Chisel} has an additional feature based around the concept of ``Knobs,'' or parameters that are created specifically to explore a design space. This section will describe Knobs and their uses, the Dump Object, adding constraints to parameters/Knobs, and the two modes to running the Chisel compiler: --configCollect and --configInstance.
-
-\subsection{Knobs}
-A generator has some parameters that are fixed, and others that dictate the specific design point being generated. These generator-level parameters, called Knobs, have an additional key-value mapping to allow external programs and users to easily overwrite their values.
-
-Knobs can only be instantiated within a \code{ChiselConfig} subclass's \code{topDefinitions}:
-
-\begin{scala}
-package example
-class MyConfig extends ChiselConfig {
- val topDefinitions:World.TopDefs = {
- (pname,site,here) => pname match {
- case NTiles => Knob('NTILES')
- case .... => .... // other non-generator parameters go here
- }
- }
- override val knobValues:Any=>Any = {
- case 'NTILES' => 1 // generator parameter assignment
- }
-}
-\end{scala}
-
-When the query \code{NTiles} matches within topDefinitions, the \code{Knob('NTILES')} is returned. Internally, Chisel will lookup \code{'NTILES'} within MyConfig.knobValues and return 1. As described in Section \ref{sec::config}, the flag required to execute a generator with this specific config is:
-
-\code{sbt run ... -{-}configInstance example.MyConfig}
-
-Suppose we wanted to instantiate a new design that had two tiles: simply use Scala's class inheritance and overwrite the knobValues method:
-
-\begin{scala}
-package example
-class MyConfig2 extends MyConfig {
- override val knobValues:Any=>Any = {
- case 'NTILES' => 2 // will generate new design with 2 tiles
- }
-}
-\end{scala}
-
-Notice that both classes can exist in the source code, so both designs can be instantiated from the commandline. For the new design with two tiles, simply call:
-
-\code{sbt run ... -{-}configInstance example.MyConfig2}
-
-\subsection{Dump}
-
-Downstream from Chisel, other tools might need to know specific parameter/Knob assignments. If so, just pass the Knob/value to the Dump object, which will write the name and value to a file, then return the Knob/value:
-
-\begin{scala}
-package example
-class MyConfig extends ChiselConfig {
- val topDefinitions:World.TopDefs = {
- (pname,site,here) => pname match {
- case Width => Dump('Width',64) // will return 64. Requires naming the parameter as the 1st argument
- case NTiles => Dump(Knob('NTILES')) // will return Knob('NTILES'), no name needed
- }
- }
- override val knobValues:Any=>Any = {
- case 'NTILES' => 1 // generator parameter assignment
- }
-}
-\end{scala}
-
-The name and value of each dumped parameter will be written to a \code{*.knb} file located in the directory set by \code{-{-}targetDir {\it path}}.
-
-\subsection{Constraints}
-
-Now that external programs/users can easily overwrite a configuration's \code{knobValue} method, we have provided a mechanism for defining legal ranges for Knobs. Within a \code{ChiselConfig}, one can overwrite another method called \code{topConstraints}:
-
-\begin{scala}
-package example
-class MyConfig extends ChiselConfig {
- val topDefinitions:World.TopDefs = {
- (pname,site,here) => pname match {
- case NTiles => Knob('NTILES')
- }
- }
- override val topConstraints:List[ViewSym=>Ex[Boolean]]
- = List( { ex => ex(NTiles) > 0 },
- { ex => ex(NTiles) <= 4 })
- override val knobValues:Any=>Any = {
- case 'NTILES' => 1 // generator parameter assignment
- }
-}
-\end{scala}
-
-Now, if someone tried to instantiate our design with the following configuration and command, it would fail:
-
-\begin{scala}
-package example
-class BadConfig extends ChiselConfig {
- override val knobValues:Any=>Any = {
- case 'NTILES' => 5 // would violate our constraint, throws an error
- }
-}
-
-// throws 'Constriant failed' error
-sbt run ... --configInstance example.BadConfig
-\end{scala}
-
-Constraints can be declared anywhere in the design, not just at the top level, by calling a Parameter's \code{constrain} method:
-
-\begin{scala}
-package example
-class MyConfig extends ChiselConfig {
- val topDefinitions:World.TopDefs = {
- (pname,site,here) => pname match {
- case NTiles => Knob('NTILES')
- }
- }
- override val knobValues:Any=>Any = {
- case 'NTILES' => 1 // generator parameter assignment
- }
-}
-class Tile extends Module {
- params.constrain( ex => ex(NTiles) > 0 )
- params.constrain( ex => ex(NTiles) <= 4 )
-}
-object Run {
- def main(args: Array[String]): Unit = {
- chiselMain.run(args, () => new Tile())
- }
-}
-
-sbt runMain example.Run ... --configInstance example.MyConfig
-\end{scala}
-
-Finally, if a designer wants to know a design's constraints, they can execute Chisel with the \code{-{-}configCollect {\it project\_name.config\_name}} flag, which will dump a list of the constraints to a \code{*.cst} file, located in the path specificed by \code{-{-}targetDir {\it path}}:
-
-\begin{scala}
-sbt runMain example.Run ... --configCollect example.MyConfig --targetDir
-\end{scala}
-
-\section{Design Heuristics}
-\label{sec:heuristics}
-
-TODO
-
-
-% \section{Acknowlegements}
-%
-\begin{thebibliography}{50}
-\bibitem{chisel-dac12} Bachrach, J., Vo, H., Richards, B., Lee, Y., Waterman,
- A., Avi\v{z}ienis, Wawrzynek, J., Asanovi\'{c} \textsl{Chisel:
- Constructing Hardware in a Scala Embedded Language}
-in DAC '12.
-\bibitem{programming-in-scala}Odersky, M., Spoon, L., Venners,
- B. \textsl{Programming in Scala} by Artima.
-\bibitem{programming-scala}Payne, A., Wampler, D.
- \textsl{Programming Scala} by O'Reilly books.
-% \bibitem{gel} Bachrach, J., Qumsiyeh, D., Tobenkin, M. \textsl{Hardware Scripting in Gel}.
-% in Field-Programmable Custom Computing Machines, 2008. FCCM '08. 16th.
-\end{thebibliography}
-
-
-\end{document}
diff --git a/doc/style/scala.tex b/doc/style/scala.tex
deleted file mode 100644
index 26299e9d..00000000
--- a/doc/style/scala.tex
+++ /dev/null
@@ -1,64 +0,0 @@
-% "define" Scala
-\usepackage[T1]{fontenc}
-\usepackage[scaled=0.82]{beramono}
-\usepackage{microtype}
-
-\sbox0{\small\ttfamily A}
-\edef\mybasewidth{\the\wd0 }
-
-\lstdefinelanguage{scala}{
- morekeywords={abstract,case,catch,class,def,%
- do,else,extends,false,final,finally,%
- for,if,implicit,import,match,mixin,%
- new,null,object,override,package,%
- private,protected,requires,return,sealed,%
- super,this,throw,trait,true,try,%
- type,val,var,while,with,yield},
- sensitive=true,
- morecomment=[l]{//},
- morecomment=[n]{/*}{*/},
- morestring=[b]",
- morestring=[b]',
- morestring=[b]"""
-}
-
-\usepackage{color}
-\definecolor{dkgreen}{rgb}{0,0.6,0}
-\definecolor{gray}{rgb}{0.5,0.5,0.5}
-\definecolor{mauve}{rgb}{0.58,0,0.82}
-
-% Default settings for code listings
-\lstset{frame=tb,
- language=scala,
- aboveskip=3mm,
- belowskip=3mm,
- showstringspaces=false,
- columns=fixed, % basewidth=\mybasewidth,
- basicstyle={\small\ttfamily},
- numbers=none,
- numberstyle=\footnotesize\color{gray},
- % identifierstyle=\color{red},
- keywordstyle=\color{blue},
- commentstyle=\color{dkgreen},
- stringstyle=\color{mauve},
- frame=single,
- breaklines=true,
- breakatwhitespace=true,
- procnamekeys={def, val, var, class, trait, object, extends},
- procnamestyle=\ttfamily\color{red},
- tabsize=2
-}
-
-\lstnewenvironment{scala}[1][]
-{\lstset{language=scala,#1}}
-{}
-\lstnewenvironment{cpp}[1][]
-{\lstset{language=C++,#1}}
-{}
-\lstnewenvironment{bash}[1][]
-{\lstset{language=bash,#1}}
-{}
-\lstnewenvironment{verilog}[1][]
-{\lstset{language=verilog,#1}}
-{}
-
diff --git a/doc/style/talk.tex b/doc/style/talk.tex
deleted file mode 100644
index 19584954..00000000
--- a/doc/style/talk.tex
+++ /dev/null
@@ -1,38 +0,0 @@
-\lstset{basicstyle={\footnotesize\ttfamily}}
-
-\usetheme[height=8mm]{Rochester}
-\setbeamersize{text margin left=3mm}
-\setbeamersize{text margin right=3mm}
-\setbeamertemplate{navigation symbols}{}
-
-\definecolor{Cobalt}{rgb}{0.25,0.125,0.70}
-\definecolor{RedOrange}{rgb}{0.8,0.25,0.0}
-% \definecolor{RedOrange}{rgb}{0.8,0.775,0.25}
-\def\frametitledefaultcolor{Cobalt}
-\def\frametitleproblemcolor{RedOrange}
-
-\lstset{basicstyle={\footnotesize\ttfamily}}
-
-\setbeamertemplate{frametitle}
-{
-\vskip-7mm
-\textbf{\insertframetitle}\hfill\insertframenumber
-}
-\setbeamercolor{frametitle}{bg=\frametitledefaultcolor}
-
-\newenvironment{sample}{\VerbatimEnvironment\begin{footnotesize}\begin{semiverbatim}}{\end{semiverbatim}\end{footnotesize}}
-
-\newenvironment{FramedSemiVerb}%
-{\begin{Sbox}\begin{minipage}{.94\textwidth}\begin{semiverbatim}}%
-{\end{semiverbatim}\end{minipage}\end{Sbox}
-\setlength{\fboxsep}{8pt}\fbox{\TheSbox}}
-
-\newenvironment{FramedVerb}%
-{\VerbatimEnvironment
-\begin{Sbox}\begin{minipage}{.94\textwidth}\begin{Verbatim}}%
-{\end{Verbatim}\end{minipage}\end{Sbox}
-\setlength{\fboxsep}{8pt}\fbox{\TheSbox}}
-
-% \newenvironment{sample}{\VerbatimEnvironment\begin{footnotesize}\begin{Verbatim}}{\end{Verbatim}\end{footnotesize}}
-\newcommand{\code}[1]{\begin{footnotesize}{\tt #1}\end{footnotesize}}
-\newcommand{\comment}[1]{{\color{Green}\it\smaller #1}}
diff --git a/doc/talks/aspire/figs/design-loop-compile-test-debug-eval.pdf b/doc/talks/aspire/figs/design-loop-compile-test-debug-eval.pdf
deleted file mode 100644
index b5501b26..00000000
Binary files a/doc/talks/aspire/figs/design-loop-compile-test-debug-eval.pdf and /dev/null differ
diff --git a/doc/talks/aspire/figs/design-loop-debug.graffle b/doc/talks/aspire/figs/design-loop-debug.graffle
deleted file mode 100644
index c1dc927a..00000000
Binary files a/doc/talks/aspire/figs/design-loop-debug.graffle and /dev/null differ
diff --git a/doc/talks/aspire/figs/design-loop-debug.pdf b/doc/talks/aspire/figs/design-loop-debug.pdf
deleted file mode 100644
index a438f224..00000000
Binary files a/doc/talks/aspire/figs/design-loop-debug.pdf and /dev/null differ
diff --git a/doc/talks/aspire/figs/design-loop-program-compile-test-debug-eval.graffle b/doc/talks/aspire/figs/design-loop-program-compile-test-debug-eval.graffle
deleted file mode 100644
index 1f40bee1..00000000
Binary files a/doc/talks/aspire/figs/design-loop-program-compile-test-debug-eval.graffle and /dev/null differ
diff --git a/doc/talks/aspire/figs/design-loop-program-compile-test-debug-eval.pdf b/doc/talks/aspire/figs/design-loop-program-compile-test-debug-eval.pdf
deleted file mode 100644
index fac9140e..00000000
Binary files a/doc/talks/aspire/figs/design-loop-program-compile-test-debug-eval.pdf and /dev/null differ
diff --git a/doc/talks/aspire/figs/design-loop-program-eval.graffle b/doc/talks/aspire/figs/design-loop-program-eval.graffle
deleted file mode 100644
index 3772a375..00000000
Binary files a/doc/talks/aspire/figs/design-loop-program-eval.graffle and /dev/null differ
diff --git a/doc/talks/aspire/figs/design-loop-program-eval.pdf b/doc/talks/aspire/figs/design-loop-program-eval.pdf
deleted file mode 100644
index 996c66ee..00000000
Binary files a/doc/talks/aspire/figs/design-loop-program-eval.pdf and /dev/null differ
diff --git a/doc/talks/aspire/figs/design-loop-programming.graffle b/doc/talks/aspire/figs/design-loop-programming.graffle
deleted file mode 100644
index a6019efa..00000000
Binary files a/doc/talks/aspire/figs/design-loop-programming.graffle and /dev/null differ
diff --git a/doc/talks/aspire/figs/design-loop-programming.pdf b/doc/talks/aspire/figs/design-loop-programming.pdf
deleted file mode 100644
index 7b4e497e..00000000
Binary files a/doc/talks/aspire/figs/design-loop-programming.pdf and /dev/null differ
diff --git a/doc/talks/aspire/figs/design-loop-test-debug-eval.graffle b/doc/talks/aspire/figs/design-loop-test-debug-eval.graffle
deleted file mode 100644
index 68054330..00000000
Binary files a/doc/talks/aspire/figs/design-loop-test-debug-eval.graffle and /dev/null differ
diff --git a/doc/talks/aspire/figs/design-loop-test-debug-eval.pdf b/doc/talks/aspire/figs/design-loop-test-debug-eval.pdf
deleted file mode 100644
index fcf33206..00000000
Binary files a/doc/talks/aspire/figs/design-loop-test-debug-eval.pdf and /dev/null differ
diff --git a/doc/talks/aspire/figs/design-loop-test.graffle b/doc/talks/aspire/figs/design-loop-test.graffle
deleted file mode 100644
index cd53f6b3..00000000
Binary files a/doc/talks/aspire/figs/design-loop-test.graffle and /dev/null differ
diff --git a/doc/talks/aspire/figs/design-loop-test.pdf b/doc/talks/aspire/figs/design-loop-test.pdf
deleted file mode 100644
index ed85b178..00000000
Binary files a/doc/talks/aspire/figs/design-loop-test.pdf and /dev/null differ
diff --git a/doc/talks/aspire/figs/design-loop.graffle b/doc/talks/aspire/figs/design-loop.graffle
deleted file mode 100644
index 4f0b4748..00000000
Binary files a/doc/talks/aspire/figs/design-loop.graffle and /dev/null differ
diff --git a/doc/talks/aspire/figs/design-loop.pdf b/doc/talks/aspire/figs/design-loop.pdf
deleted file mode 100644
index 01c18086..00000000
Binary files a/doc/talks/aspire/figs/design-loop.pdf and /dev/null differ
diff --git a/doc/talks/dac12/dac12-talk.tex b/doc/talks/dac12/dac12-talk.tex
deleted file mode 100644
index dabf7ead..00000000
--- a/doc/talks/dac12/dac12-talk.tex
+++ /dev/null
@@ -1,645 +0,0 @@
-\documentclass[xcolor=pdflatex,dvipsnames,table]{beamer}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{relsize}
-\usepackage[procnames]{listings}
-
-\input{../../style/scala.tex}
-\input{../../style/talk.tex}
-
-% \def\poster{1}
-
-\title{Chisel: Constructing Hardware In a Scala Embedded Language}
-\author[Jonathan Bachrach et al]{Jonathan Bachrach, Huy Vo, Brian Richards, \\
-Yunsup Lee, Andrew Waterman, Rimas Avizienis, \\
-John Wawrzynek, Krste Asanovic}
-\date{\today}
-\institute[UC Berkeley]{EECS UC Berkeley}
-
-\begin{document}
-
-\begin{frame}
-\titlepage
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{21st Century Architecture Design}
-{\Large\textbf{Harder to get hardware / software efficiency gains}}
-\vskip5mm
-\begin{itemize}
-\item Need massive design-space exploration
-\begin{itemize}
-\item Hardware and software codesign and cotuning
-\end{itemize}
-\item Need meaningful results
-\begin{itemize}
-\item Cycle counts
-\item Cycle time, power and area
-\item Real chips
-\end{itemize}
-\item Traditional architectural simulators, hardware-description
- languages, and tools are inadequate
-\begin{itemize}
-\item Slow
-\item Inaccurate
-\item Error prone
-\item Difficult to modify and parameterize
-\end{itemize}
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Bottom Line -- Shorten Design Loop}
-{\LARGE\textbf{If you make it}}
-\vskip2mm
-\begin{itemize}
-\item Easier to make design changes
-\begin{itemize}
-\item Fewer lines of design code ( \textbf{>> 3x} )
-\item More reusable code
-\item Parameterize designs
-\end{itemize}
-\item Faster to test results ( \textbf{>> 8x} )
-\begin{itemize}
-\item Fast compilation
-\item Fast simulation
-\item Easy testing
-\item Easy verification
-\end{itemize}
-\end{itemize}
-\vskip0.8cm
-{\LARGE\textbf{Then you can}}
-\begin{itemize}
-\item Explore more design space
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Chisel is ...}
-
-\begin{columns}[c]
-
-\column{0.55\textwidth}
-
-\begin{itemize}
-\item Best of hardware and software design ideas
-\item Embedded within Scala language to leverage mindshare and language design
-\item Algebraic construction and wiring
-\item Hierarchical, object oriented, and functional construction
-\item Abstract data types and interfaces
-\item Bulk connections
-\item Multiple targets
-\begin{itemize}
-\item Simulation and synthesis
-\item Memory IP is target-specific
-\end{itemize}
-\end{itemize}
-
-\column{0.40\textwidth}
-
-\begin{center}
-single source \\
-\includegraphics[width=0.99\textwidth]{./figs/targets.pdf} \\
-multiple targets \\
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{The Scala Programming Language}
-
-\begin{columns}[c]
-
-\column{0.75\textwidth}
-
-\begin{itemize}
-\item Compiled to JVM
-\begin{itemize}
-\item Good performance
-\item Great Java interoperability
-\item Mature debugging, execution environments
-\end{itemize}
-\item Object Oriented
-\begin{itemize}
-\item Factory Objects, Classes
-\item Traits, overloading etc
-\end{itemize}
-\item Functional
-\begin{itemize}
-\item Higher order functions
-\item Anonymous functions
-\item Currying etc
-\end{itemize}
-\item Extensible
-\begin{itemize}
-\item Domain Specific Languages (DSLs)
-\end{itemize}
-\end{itemize}
-
-\column{0.25\textwidth}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{../../bootcamp/figs/programming-scala.pdf} \\
-\includegraphics[height=0.4\textheight]{../../bootcamp/figs/programming-in-scala.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-
-\begin{frame}[fragile]{Primitive Datatypes}
-\begin{itemize}
-\item{Chisel has 4 primitive datatypes}
-\begin{description}
-\item[Bits] -- raw collection of bits
-\item[Fix] -- signed fixed-point number
-\item[UFix] -- unsigned fixed-point number
-\item[Bool] -- Boolean value
-\end{description}
-\item Can do arithmetic and logic with these datatypes
-\end{itemize}
-
-\textbf{Example Literal Constructions}
-\begin{scala}
-val sel = Bool(false)
-val a = UFix(25)
-val b = Fix(-35)
-\end{scala}
-where \verb+val+ is a Scala keyword used to declare variables whose values won't change
-\end{frame}
-
-\begin{frame}[fragile]{Aggregate Data Types}
-
-\textbf{Bundle}
-
-\begin{itemize}
-\item User-extendable collection of values with named fields
-\item Similar to structs
-\end{itemize}
-
-\begin{footnotesize}
-% \textbf{Bundle Example}
-\begin{scala}
-class MyFloat extends Bundle{
- val sign = Bool()
- val exponent = UFix(width=8)
- val significand = UFix(width=23)
-}
-\end{scala}
-\end{footnotesize}
-
-\textbf{Vec}
-
-\begin{itemize}
-\item Create indexable collection of values
-\item Similar to array
-\end{itemize}
-
-\begin{footnotesize}
-% \textbf{Vec Example}
-\begin{scala}
-val myVec = Vec(5){ Fix(width=23) }
-\end{scala}
-\end{footnotesize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Example}
-\begin{columns}
-
-\column{0.45\textwidth}
-
-\begin{footnotesize}
-\begin{scala}
-class GCD extends Component {
- val io = new Bundle {
- val a = UFix(INPUT, 16)
- val b = UFix(INPUT, 16)
- val z = UFix(OUTPUT, 16)
- val valid = Bool(OUTPUT) }
- val x = Reg(resetVal = io.a)
- val y = Reg(resetVal = io.b)
- when (x > y) {
- x := x - y
- } .otherwise {
- y := y - x
- }
- io.z := x
- io.valid := y === UFix(0)
-}
-\end{scala}
-\end{footnotesize}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../../bootcamp/figs/gcd.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Polymorphism and Parameterization}
-\begin{itemize}
-\item Chisel users can define their own parameterized functions
-\begin{itemize}
-\item Parameterization encourages reusability
-\item Data types can be inferred and propagated
-\end{itemize}
-\end{itemize}
-
-\textbf{Example Shift Register:}
-\begin{scala}
-def delay[T <: Bits](x: T, n: Int): T =
- if(n == 0) x else Reg(delay(x, n - 1))
-\end{scala}
-where
-\begin{itemize}
-\item The input \verb+x+ is delayed n cycles
-\item \verb+x+ can by of any type that extends from \verb+Bits+
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]{Abstract Data Types}
-\begin{itemize}
-\item The user can construct new data types
-\begin{itemize}
-\item Allows for compact, readable code
-\end{itemize}
-\item Example: Complex numbers
-\begin{itemize}
-\item Useful for FFT, Correlator, other DSP
-\item Define arithmetic on complex numbers
-\end{itemize}
-\end{itemize}
-
-\begin{footnotesize}
-\begin{scala}
-class Complex(val real: Fix, val imag: Fix)
- extends Bundle {
- def + (b: Complex): Complex =
- new Complex(real + b.real, imag + b.imag)
- ...
-}
-val a = new Complex(Fix(32), Fix(-16))
-val b = new Complex(Fix(-15), Fix(21))
-val c = a + b
-\end{scala}
-\end{footnotesize}
-
-\end{frame}
-
-\begin{frame}[fragile, shrink]
-\frametitle{Functional Composition}
-
-% \begin{itemize}
-% \item natural
-% \item reusable
-% \item composable
-% \end{itemize}
-% \vskip1cm
-
-\begin{Large}
-\begin{columns}
-
-\column{0.45\textwidth}
-\verb+Map(ins, x => x * y)+ \\
-\begin{center}
-\includegraphics[height=0.6\textheight]{../../bootcamp/figs/map.pdf} \\[2cm]
-\end{center}
-
-\column{0.45\textwidth}
-\vskip2mm
-\verb+Chain(n, in, x => f(x))+ \\
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../../bootcamp/figs/chain.pdf} \\
-\end{center}
-
-\verb+Reduce(data, Max)+ \\
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../../bootcamp/figs/reduce.pdf} \\
-\end{center}
-
-
-\end{columns}
-
-\end{Large}
-
-\end{frame}
-
-\begin{frame}[fragile]{Generator}
-\begin{footnotesize}
-\begin{scala}
-class Cache(cache_type: Int = DIR_MAPPED,
- associativity: Int = 1,
- line_size: Int = 128,
- cache_depth: Int = 16,
- write_policy: Int = WRITE_THRU
- ) extends Component {
- val io = new Bundle() {
- val cpu = new IoCacheToCPU()
- val mem = new IoCacheToMem().flip()
- }
- val addr_idx_width = log2(cache_depth).toInt
- val addr_off_width = log2(line_size/32).toInt
- val addr_tag_width = 32 - addr_idx_width - addr_off_width - 2
- val log2_assoc = log2(associativity).toInt
- ...
- if (cache_type == DIR_MAPPED)
- ...
-\end{scala}
-\end{footnotesize}
-
-\end{frame}
-
-\begin{frame}[fragile]{Testing}
-
-\begin{columns}
-\column{0.45\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-package Tutorial {
-import Chisel._
-import scala.collection.mutable.HashMap
-import scala.util.Random
-
-class Combinational extends Component {
- val io = new Bundle {
- val x = UFix(INPUT, 16)
- val y = UFix(INPUT, 16)
- val z = UFix(OUTPUT, 16) }
- io.z := io.x + io.y
-}
-
-class CombinationalTests(c: Combinational)
- extends Tester(c, Array(c.io)) {
- defTests {
- var allGood = true
- val vars = new HashMap[Node, Node]()
- val rnd = new Random()
- val maxInt = 1 << 16
- for (i <- 0 until 10) {
- vars.clear()
- val x = rnd.nextInt(maxInt)
- val y = rnd.nextInt(maxInt)
- vars(c.io.x) = UFix(x)
- vars(c.io.y) = UFix(y)
- vars(c.io.z) = UFix((x + y)&(maxInt-1))
- allGood = step(vars) && allGood
- }
- allGood
- } } }
-\end{scala}
-}
-\column{0.45\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-class Tester[T <: Component]
- (val c: T, val testNodes: Array[Node])
-
-def defTests(body: => Boolean)
-
-def step(vars: HashMap[Node, Node]): Boolean
-\end{scala}
-}
-\begin{tiny}
-\begin{itemize}
-\item user subclasses \code{Tester} defining DUT and
-\code{testNodes} and tests in \code{defTests} body
-\item \code{vars} is mapping from \code{testNodes} to literals, called bindings
-\item \code{step} runs test with given bindings, where
-var values for input ports are sent to DUT,
-DUT computes next outputs, and
-DUT sends next outputs to Chisel
-\item finally \code{step} compares received values against var values
- for output ports and returns false if any comparisons fail
-\end{itemize}
-\end{tiny}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{../../tutorial/figs/DUT.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Chisel Line Count Breakdown}
-
-\begin{columns}
-
-\column{0.3\textwidth}
-
-\begin{itemize}
-\item \verb+~+5200 lines total
-\item Embeds into Scala well
-\end{itemize}
-
-\column{0.7\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/linecount.png}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}
-\frametitle {Chisel versus Hand-Coded Verilog}
-
-\begin{itemize}
-\item 3-stage RISCV CPU hand-coded in Verilog
-\item Translated to Chisel
-\item Resulted in 3x reduction in lines of code
-\item Most savings in wiring
-\item Lots more savings to go ...
-% \item Chisel-generated Verilog gives comparable synthesis quality of results
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}{Related Work}
-
-\begin{itemize}
-\item SystemVerilog
-\begin{itemize}
-\item Lacks general purpose programming and extensibility
-\end{itemize}
-\item Lava
-\begin{itemize}
-\item Elegant but focus on spatial layout
-\end{itemize}
-\item Domain-specific (Bluespec + Esterel + AutoESL)
-\begin{itemize}
-\item Powerful but needs to match task at hand
-\end{itemize}
-\item Generator language (Genesis2 + SpiralFFT)
-\begin{itemize}
-\item Either inherit poor abstraction qualities of underlying HDL or
-\item Do not provide complete solution
-\end{itemize}
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Rocket Microarchitecture}
-\begin{itemize}
-\item 6-stage RISC decoupled integer datapath + 5-stage IEEE FPU + MMU
- and non-blocking caches
-\item Completely written in Chisel
-\end{itemize}
-\includegraphics[width=\textwidth]{figs/rocket-microarchitecture.pdf}
-
-\end{frame}
-
-\ifx\poster\undefined
-\begin{frame}[fragile]
-\frametitle{Single Source / Multiple Targets}
-
-\begin{center}
-single source \\
-\includegraphics[width=0.95\textwidth]{./figs/targets.pdf} \\
-multiple targets \
-\end{center}
-
-\end{frame}
-\fi
-
-\begin{frame}[fragile]
-\frametitle{Fast Cycle-Accurate Simulation in C++}
-
-\begin{itemize}
-\item Compiles to single class
-\begin{itemize}
-\item Keep state and top level io in class fields
-\item \verb+clock_lo+ and \verb+clock_hi+ methods
-\end{itemize}
-\item Generates calls to fast multiword library using C++ templates
-\begin{itemize}
-\item specializing for small word cases
-\item remove branching as much as possible to utilize maximum ILP in processor
-\end{itemize}
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Simulator Comparison}
-
-\textbf{Comparison of simulation time when booting Tessellation OS}
-\vskip0.5cm
-
-\begin{footnotesize}
-\begin{tabular}{lrrrrrr}
-\textbf{Simulator} & \textbf{Compile} & \textbf{Compile} & \textbf{Run} & \textbf{Run} & \textbf{Total} & \textbf{Total} \\
-& \textbf{Time (s)} & \textbf{Speedup} & \textbf{Time (s)} & \textbf{Speedup} & \textbf{Time (s)} & \textbf{Speedup} \\
-\hline
-VCS & 22 & 1.000 & 5368 & 1.00 & 5390 & 1.00 \\
-Chisel C++ & 119 & 0.184 & 575 & 9.33 & 694 & 7.77\\
-Virtex-6 & 3660 & 0.006 & 76 & 70.60 & 3736 & 1.44\\
-\end{tabular}
-\end{footnotesize}
-
-
-\end{frame}
-
-\ifx\poster\undefined
-\begin{frame}
-\frametitle{Simulation Crossover Points}
-
-% \begin{columns}
-% \begin{tabular}{ll}
-% \textbf{Simulation} & \textbf{Worth it if ...} \\
-% \hline
-% Chisel C++ & millions of cycles \\
-% FPGA & billions of cycles \\
-% \end{tabular}
-%
-% \column{0.55\textwidth}
-
-\begin{center}
-\includegraphics[height=0.8\textheight]{figs/perf.pdf}
-\end{center}
-
-% \end{columns}
-
-\end{frame}
-\fi
-
-\begin{frame}[fragile]
-\frametitle{Data Parallel Processor Tape Out Results}
-
-\begin{center}
-Completely written in Chisel
-\includegraphics[height=0.7\textheight]{figs/ibm45.png}
-
-\begin{footnotesize}
-The data-parallel processor layout results using IBM 45nm SOI 10-metal layer process using memory compiler generated 6T and 8T SRAM blocks.
-\end{footnotesize}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]{Products}
-
-\begin{itemize}
-\item Open source with BSD license
-\begin{itemize}
-\item \verb+chisel.eecs.berkeley.edu+
-\item complete set of documentation
-\item public alpha now
-\end{itemize}
-\item Library of components
-\begin{itemize}
-\item queues, decoders, encoders, popcount, scoreboards, integer ALUs, LFSR, Booth multiplier, iterative divider, ROMs, RAMs, CAMs, TLB, caches, prefetcher, fixed-priority arbiters, round-robin arbiters, IEEE-754/2008 floating-point units
-\end{itemize}
-\item Set of educational processors including:
-\begin{itemize}
-\item microcoded processor, one-stage, two-stage, and five-stage pipelines, and an out-of-order processor, all with accompanying visualizations.
-\end{itemize}
-\end{itemize}
-
-\end{frame}
-
-\ifx\poster\undefined
-\begin{frame}[fragile]
-\frametitle{Future}
-
-\begin{itemize}
-\item Automated design space exploration
-\item Insertion of activity counters for power monitors
-\item Automatic fault insertion
-\item Faster and more scalable simulation
-\item More generators
-\item More little languages
-\item Compilation to UCLID
-\end{itemize}
-
-\end{frame}
-\fi
-
-\ifx\poster\undefined
-\begin{frame}[fragile]{Come to Poster}
-
-\begin{itemize}
-\item Open source plans
-\item Manual, tutorial, and bootcamp
-\item Chisel workflow
-\item More on testing
-\item Educational processors
-\end{itemize}
-
-\end{frame}
-\fi
-
-
-
-\end{document}
diff --git a/doc/talks/dac12/figs/ibm45.png b/doc/talks/dac12/figs/ibm45.png
deleted file mode 100644
index 2fb10d7c..00000000
Binary files a/doc/talks/dac12/figs/ibm45.png and /dev/null differ
diff --git a/doc/talks/dac12/figs/linecount.png b/doc/talks/dac12/figs/linecount.png
deleted file mode 100644
index 7b2e0eeb..00000000
Binary files a/doc/talks/dac12/figs/linecount.png and /dev/null differ
diff --git a/doc/talks/dac12/figs/perf.pdf b/doc/talks/dac12/figs/perf.pdf
deleted file mode 100644
index 6b8066ac..00000000
Binary files a/doc/talks/dac12/figs/perf.pdf and /dev/null differ
diff --git a/doc/talks/dac12/figs/rocket-microarchitecture.pdf b/doc/talks/dac12/figs/rocket-microarchitecture.pdf
deleted file mode 100644
index bf7afff4..00000000
Binary files a/doc/talks/dac12/figs/rocket-microarchitecture.pdf and /dev/null differ
diff --git a/doc/talks/dac12/figs/targets.pdf b/doc/talks/dac12/figs/targets.pdf
deleted file mode 100644
index 4d9c787c..00000000
Binary files a/doc/talks/dac12/figs/targets.pdf and /dev/null differ
diff --git a/doc/talks/microsoft/libs-to-langs-guts-in-scala.tex b/doc/talks/microsoft/libs-to-langs-guts-in-scala.tex
deleted file mode 100644
index 2277dc66..00000000
--- a/doc/talks/microsoft/libs-to-langs-guts-in-scala.tex
+++ /dev/null
@@ -1,769 +0,0 @@
-% \begin{frame}[fragile]{Chisel Today}
-% \begin{itemize}
-% \item whirlwind tour of chisel
-% \item recents results and products
-% \item update on upcoming release
-% \item future research work
-% \end{itemize}
-% \end{frame}
-
-\begin{frame}[fragile]
-\frametitle{What is Chisel?}
-\vfill
-\begin{itemize}
-\item {\bf Abstractly}: Chisel is a framework for {\it programmatically} generating circuitry.
-\item {\bf Less Abstractly}: Chisel is a software library for creating and connecting circuit components to form a circuit graph.
-\item {\bf Concretely}: Chisel is a DSL embedded in Scala for creating and connecting circuit components, with tools for simulation and translation to Verilog.
-\end{itemize}
-\vspace{3.5cm}
-{\it\small * based on slides by my PhD student Patrick Li}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Chisel is a {\it Library}}
-\begin{itemize}
-\item Classes are provided for circuit components:
-\begin{itemize}
-\item \verb+Register()+
-\item \verb+Adder()+
-\item \verb+Multiplexor()+
-\item \verb+Wire(name)+
-\item \verb+Constant(name)+
-\end{itemize}
-
-\noindent
-and \verb+new+ used to construct components and \verb+connect+ used to wire them together:
-\begin{itemize}
-\item \verb+new Register()+
-\item ...
-\item \verb+connect(input, output)+
-\end{itemize}
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{What if Chisel was a Scala Library?}
-\begin{columns}
-\column{0.50\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
- val adder = new Adder();
- val multiplexor = new Multiplexor();
- val one = new UInt(1);
- val zero = new UInt(0);
-
- // Connect Components
- connect(multiplexor.choice, reset);
- connect(multiplexor.in_a, zero.out);
- connect(multiplexor.in_b, adder.out);
- connect(counter.in, multiplexor.out);
- connect(adder.in_a, counter.out);
- connect(adder.in_b, one.out);
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\column{0.40\textwidth}
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/simple-counter.pdf}
-\end{center}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{What if Chisel was a Scala Library?}
-\begin{columns}
-\column{0.50\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
- val adder = new Adder();
- val multiplexor = new Multiplexor();
- val one = new UInt(1);
- val zero = new UInt(0);
-
- // Connect Components
- connect(multiplexor.choice, reset);
- connect(multiplexor.in_a, zero.out);
- connect(multiplexor.in_b, adder.out);
- connect(counter.in, multiplexor.out);
- connect(adder.in_a, counter.out);
- connect(adder.in_b, one.out);
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\column{0.40\textwidth}
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/simple-counter.pdf}
-\end{center}
-\end{columns}
-\begin{itemize}
-\item using Scala to programmatically generate hardware
-\item can use full power of Scala (loops, arrays, conditionals, ...)
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{What if Chisel was a Scala Library?}
-\begin{columns}
-\column{0.50\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
- val adder = new Adder();
- val multiplexor = new Multiplexor();
- val one = new UInt(1);
- val zero = new UInt(0);
-
- // Connect Components
- connect(multiplexor.choice, reset);
- connect(multiplexor.in_a, zero.out);
- connect(multiplexor.in_b, adder.out);
- connect(counter.in, multiplexor.out);
- connect(adder.in_a, counter.out);
- connect(adder.in_b, one.out);
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\column{0.40\textwidth}
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/simple-counter.pdf}
-\end{center}
-\end{columns}
-\begin{itemize}
-\item but Scala is pretty Verbose, how can we do better?
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Functional Composition of Adder}
-\begin{columns}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
- val adder = new Adder();
- val multiplexor = new Multiplexor();
- val one = new UInt(1);
- val zero = new UInt(0);
-
- // Connect Components
- connect(multiplexor.choice, reset);
- connect(multiplexor.in_a, zero.out);
- connect(multiplexor.in_b, adder.out);
- connect(counter.in, multiplexor.out);
- connect(adder.in_a, counter.out);
- connect(adder.in_b, one.out);
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-
-\column{0.05\textwidth}
-\begin{center}
-$\Rightarrow$
-\end{center}
-\column{0.4\textwidth}
-
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
- val multiplexor = new Multiplexor();
- val one = new UInt(1);
- val zero = new UInt(0);
-
- // Connect Components
- connect(multiplexor.choice, reset);
- connect(multiplexor.in_a, zero.out);
- connect(multiplexor.in_b,
- make_adder(one.out, counter.out));
- connect(counter.in, multiplexor.out);
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Functional Composition of Multiplexor}
-\begin{columns}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
- val multiplexor = new Multiplexor();
- val one = new UInt(1);
- val zero = new UInt(0);
-
- // Connect Components
- connect(multiplexor.choice, reset);
- connect(multiplexor.in_a, zero.out);
- connect(multiplexor.in_b,
- make_adder(one.out, counter.out));
- connect(counter.in, multiplexor.out);
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\column{0.05\textwidth}
-\begin{center}
-$\Rightarrow$
-\end{center}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
- val one = new UInt(1);
- val zero = new UInt(0);
-
- // Connect Components
- connect(counter.in,
- make_multiplexor(reset,
- zero.out
- make_adder(one.out, counter.out)));
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Functional Composition of UInt Creation}
-\begin{columns}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
- val one = new UInt(1);
- val zero = new UInt(0);
-
- // Connect Components
- connect(counter.in,
- make_multiplexor(reset,
- zero.out
- make_adder(one.out, counter.out)));
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\column{0.05\textwidth}
-\begin{center}
-$\Rightarrow$
-\end{center}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
-
- // Connect Components
- connect(counter.in,
- make_multiplexor(reset,
- UInt(0),
- make_adder(UInt(1), counter.out)));
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Overload Addition Operator}
-\begin{columns}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
-
- // Connect Components
- connect(counter.in,
- make_multiplexor(reset,
- UInt(0),
- make_adder(UInt(1), counter.out)));
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\column{0.05\textwidth}
-\begin{center}
-$\Rightarrow$
-\end{center}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
-
- // Connect Components
- connect(counter.in,
- make_multiplexor(reset,
- UInt(0),
- UInt(1) + counter.out));
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Introduce Connect Infix Operator}
-\begin{columns}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
-
- // Connect Components
- connect(counter.in,
- make_multiplexor(reset,
- UInt(0),
- UInt(1) + counter.out));
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\column{0.05\textwidth}
-\begin{center}
-$\Rightarrow$
-\end{center}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
-
- // Connect Components
- counter.in :=
- make_multiplexor(reset,
- UInt(0),
- UInt(1) + counter.out);
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Automatically Create Multiplexors}
-\begin{columns}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
-
- // Connect Components
- counter.in :=
- make_multiplexor(reset,
- UInt(0),
- UInt(1) + counter.out);
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\column{0.05\textwidth}
-\begin{center}
-$\Rightarrow$
-\end{center}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
-
- // Connect Components
- when (reset) {
- counter.in := UInt(0);
- } .otherwise {
- counter.in := UInt(1) + counter.out;
- }
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Grab Names of Wires Directly}
-\begin{columns}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire("reset");
- val counter = new Register("counter");
-
- // Connect Components
- when (reset) {
- counter.in := UInt(0);
- } .otherwise {
- counter.in := UInt(1) + counter.out;
- }
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\column{0.05\textwidth}
-\begin{center}
-$\Rightarrow$
-\end{center}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire();
- val counter = new Register();
-
- // Connect Components
- when (reset) {
- counter.in := UInt(0);
- } .otherwise {
- counter.in := UInt(1) + counter.out;
- }
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Abstract Counter}
-\begin{columns}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire();
- val counter = new Register();
-
- // Connect Components
- when (reset) {
- counter.in := UInt(0);
- } .otherwise {
- counter.in := UInt(1) + counter.out;
- }
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\column{0.05\textwidth}
-\begin{center}
-$\Rightarrow$
-\end{center}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def make_counter(reset: Boolean) = {
- val counter = new Register();
- when (reset) {
- counter.in := UInt(0);
- } .otherwise {
- counter.in := UInt(1) + counter.out;
- }
- counter
-}
-
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire();
- val counter = make_counter(reset);
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Make Reset Implicit}
-\begin{columns}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def make_counter(reset: Boolean) = {
- val counter = new Register();
- when (reset) {
- counter.in := UInt(0);
- } .otherwise {
- counter.in := UInt(1) + counter.out;
- }
- counter
-}
-
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire();
- val counter = make_counter(reset);
-
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\column{0.05\textwidth}
-\begin{center}
-$\Rightarrow$
-\end{center}
-\column{0.4\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def make_counter() = {
- val counter = new Register();
- when (reset) {
- counter.in := UInt(0);
- } .otherwise {
- counter.in := UInt(1) + counter.out;
- }
- counter
-}
-
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire();
- val counter =
- withReset(reset) {
- make_counter(reset);
- }
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Looks ``Behavioral'' but ...}
-\begin{columns}
-\column{0.50\textwidth}
-{\lstset{basicstyle={\tiny\ttfamily}}
-\begin{scala}
-def make_counter() = {
- val counter = new Register();
- when (reset) {
- counter.in := UInt(0);
- } .otherwise {
- counter.in := UInt(1) + counter.out;
- }
- counter
-}
-
-def main(args: Array[String]) = {
- // Create Components
- val reset = new Wire();
- val counter =
- withReset(reset) {
- make_counter(reset);
- }
- // Produce Verilog
- generate_verilog(counter);
-}
-\end{scala}
-}
-\column{0.40\textwidth}
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/simple-counter.pdf}
-\end{center}
-\end{columns}
-\begin{itemize}
-\item every construct actually creates a concrete circuit
-\item know cost of everything
-\item layered and can choose level of abstraction
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{Hosting Language Ingredients}
-Crucial
-\begin{itemize}
-\item Type Inference
-\item Infix Operator Overloading
-\item Lightweight Closures
-\item Dynamic Scoping
-\item Introspection or Simple Macros
-\item Functional Programming
-\end{itemize}
-\vspace{0.5cm}
-Even Better with
-\begin{itemize}
-\item Object Orientation
-\item Powerful Macros
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{Synthesizable By Construction}
-Well formed Chisel graphs are synthesizable.
-\begin{columns}
-\column{0.6\textwidth}
-\begin{itemize}
-\item Use small number of basic nodes
-\begin{itemize}
-\item simple semantics
-\item easy to synthesize
-\end{itemize}
-\item During construction check that
-\begin{itemize}
-\item types, directions and widths match
-\item there are no combinational loops
-\end{itemize}
-\end{itemize}
-\column{0.3\textwidth}
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/synthesizable.pdf}
-\end{center}
-\end{columns}
-\vspace{1cm}
-\begin{itemize}
-\item {\color{red}If it passes these checks then it's synthesizable}
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]{Hardware Language Approaches}
-% \begin{columns}
-% \column{0.45\textwidth}
-\begin{itemize}
-\item {\color{magenta}behavioral} -- high level language compiled to verilog
-\begin{itemize}
-\item examples: C, Lime, CHP, Esterel, BlueSpec
-\end{itemize}
-\item {\color{orange}simulation} -- simulation language with synthesizable subset
-\begin{itemize}
-\item examples: Verilog, System Verilog, SystemC, myHDL
-\end{itemize}
-\item {\color{green}construction} -- programmatically construct circuits
-\begin{itemize}
-\item examples: Chisel, Lava
-\end{itemize}
-\end{itemize}
-% \column{0.45\textwidth}
-% \begin{center}
-% \includegraphics[width=1.0\textwidth]{figs/hdls.pdf}
-% \end{center}
-% \end{columns}
-\end{frame}
-
-\begin{frame}[fragile]{Hardware Language Comparisons}
-\begin{small}
-\begin{center}
-\begin{tabular}{|r|c|c|c|}
-\hline
-{\bf name} & {\bf example} & {\bf pros} & {\bf cons} \\
-\hline
-{\color{magenta}behavioral} & C-to-gates & high level & unpredictable \\
- & & & QoR \\
-\hline
-{\color{orange}simulation} & Verilog & flexible & synthesizable? + \\
- & & & low abstraction \\
-\hline
-{\color{green}construction} & Chisel & metaprogramming + & two levels + \\
- & & predictable QoR + & blemishes \\
- & & synthesizable QoR & \\
-\hline
-\end{tabular}
-\end{center}
-\end{small}
-
-\begin{columns}
-\column{0.4\textwidth}
-\begin{center}
-\includegraphics[width=0.8\textwidth]{figs/hdls.pdf}
-\end{center}
-\column{0.5\textwidth}
-Chisel
-\begin{itemize}
-\item is {\bf not} Scala to Verilog
-\item produces circuits that are synthesizable by construction
-\item permits simulation by driving synthesized design
-\end{itemize}
-\end{columns}
-\end{frame}
diff --git a/doc/talks/microsoft/libs-to-langs.tex b/doc/talks/microsoft/libs-to-langs.tex
deleted file mode 100644
index d60f462f..00000000
--- a/doc/talks/microsoft/libs-to-langs.tex
+++ /dev/null
@@ -1,31 +0,0 @@
-\documentclass[xcolor=pdflatex,dvipsnames,table]{beamer}
-% \usepackage{pgfpages}
-% \setbeamertemplate{note page}[plain]
-% \setbeameroption{show notes on second screen=right}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{relsize}
-\usepackage[procnames]{listings}
-
-\input{../../style/scala.tex}
-\input{../../style/talk.tex}
-
-\title{Chisel @ Microsoft}
-\author{{\Large Jonathan Bachrach} + Huy Vo + Andrew Waterman + \\
-Sebastian Mirolo + John Wawrzynek + Krste Asanovi\'{c} + \\
-many more}
-\date{\today}
-\institute[UC Berkeley]{EECS UC Berkeley}
-
-\begin{document}
-
-\begin{frame}
-\titlepage
-\end{frame}
-\addtocounter{framenumber}{-1}
-
-\input{libs-to-langs-guts.tex}
-
-\end{document}
-
diff --git a/doc/templates/base.html b/doc/templates/base.html
deleted file mode 100644
index da2aeaeb..00000000
--- a/doc/templates/base.html
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
- Chisel: Constructing Hardware in an Scala Embedded Language
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {% block localheader %}{% endblock %}
-
-
-
-
-
-
-
- {% block content %}{% endblock %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {% block bodyscripts %}
- {% endblock %}
-
-
diff --git a/doc/templates/changelog_v2.2.19.html b/doc/templates/changelog_v2.2.19.html
deleted file mode 100644
index 9a42afac..00000000
--- a/doc/templates/changelog_v2.2.19.html
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
- #263
- No Explicit Error When Writing To Your Inputs
-
-
-
- #259
- C++ compilation speedups
-
-
-
- #257
- initialize register that guards reset for assert checking
-
-
-
- #251
- make assertions an option in driver
-
-
-
- #248,249
- Update ShiftRegister to support a parameterized delay of 0.
-
-
-
- #247
- Vec getWidth return zero
-
-
-
- #176
- Re-enable testEqlBundle() and testEqlVec() after inserting explicit toBits comversion.
-
-
-
- #124
- Zero width wire support
-
-
-
- #86
- Queue is generating incorrect code; io.deq signals don't match io.enq signals.
-
-
-
-
- #83
- log2Up(1) returns 1, instead of the correct answer of 0
-
-
-
- #76
- Width inference takes hours, needs to quickly detect and throw error on un-inferable code
-
-
diff --git a/doc/templates/changelog_v2.2.20.html b/doc/templates/changelog_v2.2.20.html
deleted file mode 100644
index 95b3e0c4..00000000
--- a/doc/templates/changelog_v2.2.20.html
+++ /dev/null
@@ -1,138 +0,0 @@
-
-
-
- #331
- Fill(0, ...) fails with a java exception
-
-
-
- #321
- Support poking large numbers - extension of #318
-
-
-
- #319
- --parallelMakeJobs doesn't understand --targetDir
-
-
-
- #300
- Generated cpp files lack Config substring (C++ backend)
-
-
-
- #298
- Printf() doesn't since the switch to the new Tester
-
-
-
- #295
- Bundle.calcElements calculates too many
-
-
-
- #292
- Vcd varName,stripComponent code emits invalid variable IDs
-
-
-
- #290
- Register with custom clock for a bundle generate wrong verilog
-
-
-
- #286
- Width Inference Issue (width of operations on literals)
-
-
-
- #209
- enerated Verilog repeated wire names (Verilog backend)
-
-
-
- #196
- README Instructions don't let to a working HelloWorld
-
-
-
- #168
- lit as port breaks chisel - flag it as a ChiselError
-
-
-
- #153
- nameIt is way too eager, needs to chill out
-
-
-
- #94
- printf being discarded during elaboration
-
-
-
-
- Vtests: fix step
-
-
-
-
- Deleted unused ModularCpp backend before more bitrot sets in.
-
-
-
-
- Cosmetic/scalastyle fixes - no functional changes.
-
-
-
-
- Add support for a constant pool (C++ backend)
-
-
-
-
- Add hasSRAM & sramMaxSize for custom transforms
-
-
-
-
- Fix naming problems when adding modules in custom transforms
-
-
-
-
- Parametrization in custom transforms
-
-
-
-
- Fix a binding problem
-
-
-
-
- Fixes to --partitionIslands
-
-
-
-
- Small changes in parameterization
-
-
-
-
- Added "in" operator that can be used when defining constraints. Currently only works for List[Int], Range, and List[Chisel.IntEx]
-
-
-
-
- Significant rewrite of the Bundle and Vec code
-
-
-
-
- Significant changes to Verilog test code
-
-
-
diff --git a/doc/templates/changelog_v2.2.21.html b/doc/templates/changelog_v2.2.21.html
deleted file mode 100644
index ce674823..00000000
--- a/doc/templates/changelog_v2.2.21.html
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
- #347
- Mishandling of UInts with MSB == 1
-
-
-
- #346
- Signals only used as resets are trimmed
-
-
-
- #335
- Null Pointer Exception on Floating Output.
-
-
-
- #334
- Fix poking Negative Values Fails
-
-
-
- #325
- ChiselUtil Reverse: Cpp optimization floods console with warnings
-
-
-
-
- Eliminate NullPointerException if computeMemPorts is called before forceMatchingWidth.
-
-
-
-
- Reorder Chisel standard passes for performance and flexibility.
-
-
-
-
- Simplify and speed up width inference.
-
-
-
-
- Placate various C++ compilers (C++ backend).
-
-
-
-
- Minor changes to the dot backend for literal node names in debugging support (Dot backend).
-
-
-
-
- Fixes to binding and register naming.
-
-
-
diff --git a/doc/templates/changelog_v2.2.22.html b/doc/templates/changelog_v2.2.22.html
deleted file mode 100644
index 25e36247..00000000
--- a/doc/templates/changelog_v2.2.22.html
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
- #363
- Convert to C++ getline() semantics
-
-
-
- #363
- Break out of read_eval_print_loop() if getline() returns an error.
-
-
-
- #363
- Check File pointers are non-NULL before trying to fclose() them.
-
-
-
- #359
- Weird compiler error for write-masked Mems in Verilog backend.
-
-
-
- #358
- Muxes of type Bits now use SInt (previously, UInt).
-
-
-
- #356
- : Tester.expect always results a PASS on data wider than 32 bits, even when signal value does not much the expected value.
-
-
-
- #265
- Wrong verilog generated from When X{ when Y{ reg := }} otherwise { reg := }.
-
-
-
- #191
- Randomize unconnected Verilog wires (as we do for the C++ backend).
-
-
-
-
- Fix fromNode involving zero-width wires.
-
-
-
-
- Fixes from HPCA workshop.
-
-
-
-
- Minor fixes to the tutorial.
-
-
-
-
- Use signal names from parent objects (implicit reset may have a different name).
-
-
-
-
- Support Quartus' variant of `ifndef SYNTHESIS.
-
-
-
-
- Work around bug causing illegal assignment of static const variable.
-
-
-
-
- Don't accept negative UInt literals.
-
-
-
diff --git a/doc/templates/changelog_v2.2.24.html b/doc/templates/changelog_v2.2.24.html
deleted file mode 100644
index 186c8c65..00000000
--- a/doc/templates/changelog_v2.2.24.html
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
- Convert from unsupported sbt-scct to scoverage.
-
-
-
-
- Fix bug in applying new parameters via bundle factory
-
-
-
-
- Initial support for Scala 2.11
-
-
-
diff --git a/doc/templates/changelog_v2.2.25.html b/doc/templates/changelog_v2.2.25.html
deleted file mode 100644
index 85f8385b..00000000
--- a/doc/templates/changelog_v2.2.25.html
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
-
-
-
- Detect and issue an error for double Module() wrapping - #385
-
-
-
-
- Fix Data width lost in Vec #384.
-
-
-
-
- For test, use JUnitSuite over AssertionsForJUnit
-
-
-
-
- In Verilog, fix bug for similar modules, some not emitted
-
-
-
-
- Better Namespace conflict resolution for Verilog
-
-
-
-
- Fix for multiply instantiated modules in Chisel result in redundant (functionally equivalent) module definitions in generated Verilog #374
-
-
-
-
- In CPP, better detection of signals to randomize
-
-
-
-
- Disallow comparisons between Nodes and non-Nodes
-
-
-
-
- Include type of missing Parameter in error message
-
-
-
-
- Address issue with width-inference of right-shift
-
-
-
-
- Update emulator_{api,mod}.h to eliminate C++ compiler warnings.
-
-
-
-
- Update README to reflect current build procedure.
-
-
-
diff --git a/doc/templates/documentation.html b/doc/templates/documentation.html
deleted file mode 100644
index faf78517..00000000
--- a/doc/templates/documentation.html
+++ /dev/null
@@ -1,26 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-
-
-
- The rationale for Chisel and a gentle introduction can be found
- in the DAC 2012 paper .
-
-
- Chisel 2.2.x
-
- This is the accompanying documentation for the chisel 2.2.x jar files.
-
-
-
-
-{% endblock %}
diff --git a/doc/templates/download.html b/doc/templates/download.html
deleted file mode 100644
index 53d114d0..00000000
--- a/doc/templates/download.html
+++ /dev/null
@@ -1,95 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-
-
-Chisel
-
-Chisel is made available under a modified BSD Licence .
-The public repository is hosted on github .
-
-
-See instructions for downloading and
-installing the distribution on either Linux/x86 or Mac OS X.
-
-
-
-
-There is a VirtualBox Image with chisel, chisel-tutorial, riscv-sodor
-and the riscv tools (isa sim, gcc, etc.)
-
-
-First, install VirtualBox
-and Vagrant . Then from a terminal:
-
-
-$ vagrant box add chisel-riscv https://chisel.eecs.berkeley.edu/chisel-riscv.box
-$ vagrant init chisel-riscv
-$ diff -u prev Vagrantfile
-- # config.vm.network :forwarded_port, guest: 80, host: 8080
-+ config.vm.network :forwarded_port, guest: 8080, host: 8888
-$ vagrant up
-
-
-You can then browse, pull latest changes and re-build the projects through
-the jenkins interface at http://localhost:8888/
-
-
-If you want to do work on the command line (run the chisel tutorial for example)
-
-
-host$ vagrant ssh
-guest$ export PATH=${PATH}:/var/lib/jenkins/local/bin
-guest$ cd /var/lib/jenkins/jobs/chisel-tutorial/workspace
-# follow instructions on https://github.com/ucb-bar/chisel-tutorial
-guest$ cd examples
-guest$ make
-
-
-
-
-There is a public Amazon EC2 AMI with chisel, chisel-tutorial and riscv-sodor
-installed and ready to go.
-
-
-id: ami-345ec104
-login: ubuntu
-
-
-Third-party Chisel Integrated Circuits
-
-
-tutorials
-Examples of Basic Logic Circuits
-(Jonathan Bachrach)
-
-
-riscv-sodor
-Educational microarchitectures for risc-v isa
-(Christopher Celio)
-
-
-Patmos
-Time-predictable VLIW processor
-(T-CREST)
-
-
-comphdl
-Chisel Blink, Counter and FSM Examples
-(Martin Schoeberl)
-
-
-OpenSoC Fabric
-A Parameterizable NoC
-(LBL Computer Architecture Lab)
-
-
-
-
-To Add your project to the list, just advertise about it on the
-Chisel mailing list !
-
-
-{% endblock %}
diff --git a/doc/templates/faq.html b/doc/templates/faq.html
deleted file mode 100644
index 890ac06b..00000000
--- a/doc/templates/faq.html
+++ /dev/null
@@ -1,78 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-
-
-
- Does Chisel convert Scala to Verilog?
- No Chisel is a hardware construction language for writing Scala programs
- that generate hardware
-
- What's the overhead for Chisel?
- None. Chisel allows designers to write circuits structurally as they do
- in Verilog with no extra overhead.
-
- Why do I need SBT to compile and execute my Chisel code?
-
- Technically you don't.
-
-
- SBT is
- a builder for scala which is a cross between apt-get and make.
- It downloads all the prerequisites (as apt-get would do) then
- builds your chisel code (as make would do). The downloaded files
- will be cached in ~/.sbt and ~/.ivy2.
-
-
- Chisel is packaged as a regular JAR file published on the sonatype
- repo. If you have your own build system, the bare minimum you need
- is to download the latest chisel jar file
- and execute the following commands (based on the example in the
- README file).
-
-
-# Compile and execute your Chisel code
-$ scalac-2.10 -cp chisel_2.10-2.2.25.jar Hello.scala
-$ scala-2.10 -cp chisel_2.10-2.2.25.jar:. hello
-
-# Compile and run the generated simulation
-$ g++ -std=c++11 -o HelloModule HelloModule.cpp HelloModule-emulator.cpp
-$ ./HelloModule 1
-
-
- How can I make a vector of modules?
-
-Vec.fill{ Module(new CPU()).io }
-
-
- How do I get in touch with the Chisel community?
-
-There is a Chisel users Google group .
-You can also search for Chisel on Stack Overflow .
-To report bugs on the Chisel code itself,
-please open an issue on github .
-
-
- How stable is Chisel?
-
- Every night, we build all of Chisel and the projects listed
- in download with the help of
- a jenkins buildbot.
- Follow the unit tests trends here .
-
-
- How did you get to work on such a cool project?
- Chisel has been partially funded by
-
- Project Isis: DoE Award DE-SC0003624.
- Par Lab: Microsoft (Award #024263) and Intel (Award #024894) funding
- and by matching funding by U.C. Discovery (Award #DIG07-10227).
- Additional support came from Par Lab affiliates Nokia, NVIDIA, Oracle,
- and Samsung.
- ASPIRE: DARPA PERFECT program, Award HR0011-12-2-0016.
-
- Thank you for your support!
-
-{% endblock %}
diff --git a/doc/templates/index.html b/doc/templates/index.html
deleted file mode 100644
index ce2ec2c5..00000000
--- a/doc/templates/index.html
+++ /dev/null
@@ -1,252 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-
-
-
-
-
-
-
-
-Chisel is an open-source hardware construction language
-developed at UC Berkeley that supports
-advanced hardware design using highly parameterized generators
-and layered domain-specific hardware languages.
-
-
-
-
- Hardware construction language (not C to Gates)
- Embedded in the Scala programming language
- Algebraic construction and wiring
- Abstract data types and interfaces
- Bulk connections
- Hierarchical + object oriented + functional construction
- Highly parameterizable using metaprogramming in Scala
- Supports layering of domain specific languages
-
-
-
-
- Sizeable standard library including floating-point units
- Multiple clock domains
- Generates high-speed C++-based cycle-accurate software simulator
- Generates low-level Verilog designed to pass on to standard ASIC or FPGA tools
- Open source on github with modified BSD license
- Complete set of docs
- Growing community of adopters
-
-
-
-
-
-
-
-
-
-
-
-
-
-You can find code examples on the Berkeley EECS Berkeley Architecture Research
-(BAR) github page .
-Chisel-tutorial is
-a set of sample circuits with supporting
-documentation .
-Sodor is a set of
-educational processors written in Chisel by Christopher
-Celio, a PhD student at UC Berkeley. Sodor implements the RISC-V
-Instruction Set Architecture designed in the BAR group and described on
-riscv.org .
-
-
-
-
-
-
-import Chisel. _
-
-class GCD extends Module {
- val io = new Bundle {
- val a = UInt ( INPUT, 16 )
- val b = UInt ( INPUT, 16 )
- val e = Bool ( INPUT)
- val z = UInt ( OUTPUT, 16 )
- val v = Bool ( OUTPUT)
- }
- val x = Reg(UInt ())
- val y = Reg(UInt ())
- when ( x > y) { x := x - y }
- unless ( x > y) { y := y - x }
- when ( io. e) { x := io. a; y := io. b }
- io. z := x
- io. v := y === UInt ( 0 )
-}
-
-object Example {
- def main ( args: Array[ String]) : Unit = {
- chiselMain(args, () => Module ( new GCD ()))
- }
-}
-
-
-
-
-
import Chisel. _ // importing the Chisel library.
-
-/// Creating a Module that computes the maximum of N values
-//
-// This generator shows how it is possible to do functional construction
-// of circuits.
-
-class MaxN ( n: Int , w: Int /* parameterized input */ ) extends Module {
-
- private def Max2 ( x: UInt, y: UInt) = Mux ( x > y, x, y)
-
- val io = new Bundle {
- val in = Vec.fill ( n) { UInt ( INPUT, w) }
- val out = UInt ( OUTPUT, w)
- }
- io. out := io.in.reduceLeft ( Max2)
-}
-
-object MaxNExample {
- // Main Entry Point of the circuit generator
- def main ( args: Array[ String]) : Unit = {
- // instantiate with 4 ports. Each port is 8 bits wide.
- chiselMain(args, () => Module ( new MaxN ( 4 , 8 )))
- }
-}
-
-
-
-
/** Four-by-four multiply using a look-up table.
-*/
-class Mul extends Module {
- val io = new Bundle {
- val x = UInt ( INPUT, 4 )
- val y = UInt ( INPUT, 4 )
- val z = UInt ( OUTPUT, 8 )
- }
- val muls = new ArrayBuffer[UInt] ()
-
- for ( i <- 0 until 16 )
- for ( j <- 0 until 16 )
- muls + = UInt ( i * j, width = 8 )
- val tbl = Vec ( muls)
- io. z := tbl( ( io. x << UInt ( 4 )) | io. y)
-}
-
-
-
-
/** A n-bit adder with carry in and carry out
- */
-class Adder ( val n: Int ) extends Module {
- val io = new Bundle {
- val A = UInt ( INPUT, n)
- val B = UInt ( INPUT, n)
- val Cin = UInt ( INPUT, 1 )
- val Sum = UInt ( OUTPUT, n)
- val Cout = UInt ( OUTPUT, 1 )
- }
- //create a vector of FullAdders
- val FAs = Vec.fill ( n) { Module ( new FullAdder ()). io }
- val carry = Vec.fill ( n+ 1 ) { UInt ( width = 1 ) }
- val sum = Vec.fill ( n) { Bool () }
-
- //first carry is the top level carry in
- carry ( 0 ) := io. Cin
-
- //wire up the ports of the full adders
- for ( i <- 0 until n) {
- FAs ( i). a := io.A ( i)
- FAs ( i). b := io.B ( i)
- FAs ( i). cin := carry ( i)
- carry ( i+ 1 ) := FAs ( i). cout
- sum ( i) := FAs(i).sum.toBool ()
- }
- io. Sum := sum.toBits().toUInt ()
- io. Cout := carry ( n)
-}
-
-
-
-
-
-
-
-
-
-
-
-
-Getting started with Chisel is easy. Boilerplate verilog often directly maps
-to Chisel one-liners. Everything you learn to write Scala code is directly
-applicable. Follow the Chisel Tutorial .
-When you have a question that the documentation doesn't answer, check
-Stack Overflow
-or ask on the Chisel users mailing list .
-
-
-
-
-
-Chisel is released as a JAR file through the official Maven repo.
-Just add this line to your build.sbt
-
-
-libraryDependencies += "edu.berkeley.cs" %% "chisel" % "latest.release"
-
-
-If you are new to Scala
-and have no idea what that means, follow the step-by-step
-in Chisel's README.md.
-
-
-
-
-
-
-Also see: slides from the second Chisel
-bootcamp.
-
-
-
-
-
-{% endblock %}
diff --git a/doc/templates/releasenotes_v2.2.19.html b/doc/templates/releasenotes_v2.2.19.html
deleted file mode 100644
index 659dd069..00000000
--- a/doc/templates/releasenotes_v2.2.19.html
+++ /dev/null
@@ -1,97 +0,0 @@
-This release of Chisel adds support for:
-
- design parameters
- 0-width wires
- C++ backend compilation performance
-
-
-
-We are introducing experimental support to Chisel to allow module
-designers to specify design parameters that should be configured on
-the fly as the design is elaborated. We provide support for looking up
-parameter values within Chisel Modules and Bundles, as well as scoping
-where certain parameter values are defined and customizing how
-dependent parameters are calculated. Users can define custom
-ChiselConfiguration classes which override default parameter values,
-and they can select which configuration to use at runtime via the
-Chisel command line. We allow constraints to be placed on parameter
-values and provide hooks for automated design space exploration of
-parameter spaces. A detailed guide to these experimental features is
-available at in the Chisel repo at chisel/doc/parameters/parameters.pdf
-
-
-0-width wire support attempts to eliminate 0-width wires from the
-design by either replacing them with the appropriate identity element,
-or by removing them entirely. This feature is highly experimental and
-is controlled by the --W0W command line option to Chisel.
-
-
-The C++ backend changes attempt to improve compilation performance by
-reducing the size of the functions generated by the C++ backend. This
-feature is highly experimental and is controlled by a number of Chisel
-command line options. The following options are either treated as
-simple binary feature enablers, or take an argument
-specifying the value of some optional feature.
-
-
-
- --allocateOnlyNeededShadowRegisters
- (C++ backend) Attempt to allocate only those shadow registers
- actually required. This reduces the size of the main C++ design
- object (especially when --shadowRegisterInObject is enabled), which
- in turn reduces compilation time. It should have no execution-time
- performance impact.
-
-
- --compileInitializationUnoptimized
- (C++ backend) Compile initialization code at -O0, rarely used code
- at -O1.
-
-
- --isVCDinline
- (C++ backend) Generate VCD dump code without goto branches. Allows
- compiling smaller VCD dump functions, reducing C++ compile
- times. This will have some impact on execution-time performance.
-
-
- --lineLimitFunctions (Integer)
- (C++ backend) Limit the number of lines in a C++ function/method
- before splitting it up into multiple functions to reduce C++ compile
- times. The value specifies a loose upper limit on the
- number of lines output to a single function before that function is
- split up into smaller functions. This involves a trade-off between
- compile-time performance and execution-time performance. Smaller
- functions yield faster compile times, but result in slower execution
- since instead of calling a single function, calls to multiple
- functions are generated. Reasonable values for this argument would
- be in the range from 256 to 2048.
-
-
- --minimumLinesPerFile (Integer)
- (C++ backend) Limit the minimum number of lines per file so as not
- to produce trivial files. This works in conjunction with
- --lineLimitFunctions to break up a massive single file into
- multiple smaller (but not too small) files. Reasonable values for
- this argument would be in the range of 1024 to 32768.
-
-
- --parallelMakeJobs (Integer)
- (C++ backend) Generate a Makefile to compile multiple C++ files in
- parallel. The argument specifies the amount of parallelism
- (the argument to the -j option to make). A value of -1 indicates
- that no value will be passed with the -j argument to make, which in
- turn should inform make not to limit the number of jobs that can run
- simultaneously.
-
-
- --partitionIslands
- (C++, dot backends) Partition the graph into islands of
- combinatorial logic that may be compiled and executed in parallel.
-
-
- --shadowRegisterInObject
- (C++ backend) Allocate shadow registers in the global emulation
- object (as opposed to the local clock procedures). This is
- automatically enabled when --lineLimitFunctions is in effect.
-
-
diff --git a/doc/templates/releasenotes_v2.2.20.html b/doc/templates/releasenotes_v2.2.20.html
deleted file mode 100644
index 4e7e99b5..00000000
--- a/doc/templates/releasenotes_v2.2.20.html
+++ /dev/null
@@ -1,24 +0,0 @@
-This release of Chisel is largely a maintenance release.
-See the associated Changelog for issues resolved with this release.
-
-
-There were significant changes to the Bundle and Vec code:
-
- Make the flatten methods generate correct element names
- Internal data structures
-
- Bundle: LinkedHashMap(name & io pairs)
- Vec: Vector(now Vec is immutable)
-
-
- Remove legacy code
-
-
-
-There were significant changes to Verilog testing:
-
- Use vpi routines for verilog tests
- Fix timing and compile errors of verilog tests
- Generate the same harness regardless of the --test option
-
-
diff --git a/doc/templates/releasenotes_v2.2.21.html b/doc/templates/releasenotes_v2.2.21.html
deleted file mode 100644
index 80832c85..00000000
--- a/doc/templates/releasenotes_v2.2.21.html
+++ /dev/null
@@ -1,3 +0,0 @@
-This release of Chisel is largely a maintenance release.
-See the associated Changelog for issues resolved with this release.
-
diff --git a/doc/templates/releasenotes_v2.2.22.html b/doc/templates/releasenotes_v2.2.22.html
deleted file mode 100644
index aaea69da..00000000
--- a/doc/templates/releasenotes_v2.2.22.html
+++ /dev/null
@@ -1,10 +0,0 @@
-This release of Chisel is largely a maintenance release.
-See the associated Changelog for issues resolved with this release.
-
-Muxes of type Bits now use SInt (previously, UInt) This fixes issue
-#358 and constitutes behavioral change. To facilitate any necessary
-porting, a warning is now issued when a Mux of type Bits is
-created. This warning will likely be turned off or removed in future
-versions. Justification behind using SInt over UInt is so that
-corresponding sign extension is better aligned to C semantics.
-
diff --git a/doc/templates/releasenotes_v2.2.24.html b/doc/templates/releasenotes_v2.2.24.html
deleted file mode 100644
index e5cb19b1..00000000
--- a/doc/templates/releasenotes_v2.2.24.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-This release of Chisel is largely a maintenance release.
-See the associated Changelog for issues resolved with this release.
-
-
-This release provides initial support for Scala 2.11.
-
-In order to use the 2.11 version of the code, change the scalaVersion
-definition in your build.sbt (or build.scala) file from
-
-scalaVersion := "2.10.x"
-
-to:
-
-scalaVersion := "2.11.4"
-
-
-
-NOTE: Expect three warnings when compiling under Scala 2.11:
-
-
-[warn] src/main/scala/Parameters.scala:272: abstract type T in type pattern Chisel.Ex[T] is unchecked since it is eliminated by erasure
-[warn] case ex:Ex[T] => _bindLet[T](pname,ex)
-[warn] ^
-[warn] src/main/scala/Parameters.scala:271: abstract type T in type pattern Chisel.Knob[T] is unchecked since it is eliminated by erasure
-[warn] case k:Knob[T] => ExVar[T](_VarKnob[T](k.name))
-[warn] ^
-[warn] src/main/scala/Parameters.scala:272: abstract type T in type pattern Chisel.Ex[T] is unchecked since it is eliminated by erasure
-[warn] case ex:Ex[T] => _bindLet[T](pname,ex)
-[warn] ^
-model contains 286 documentable templates
-[warn] three warnings found
-
diff --git a/doc/templates/releasenotes_v2.2.25.html b/doc/templates/releasenotes_v2.2.25.html
deleted file mode 100644
index 80832c85..00000000
--- a/doc/templates/releasenotes_v2.2.25.html
+++ /dev/null
@@ -1,3 +0,0 @@
-This release of Chisel is largely a maintenance release.
-See the associated Changelog for issues resolved with this release.
-
diff --git a/doc/templates/releases.html b/doc/templates/releases.html
deleted file mode 100644
index e8ad3373..00000000
--- a/doc/templates/releases.html
+++ /dev/null
@@ -1,59 +0,0 @@
-{% extends "base.html" %}
-
-{% block content %}
-
-
-
- Chisel 2.2.x
-
-
ReleaseNotes for Chisel @VERSION@ @DATE@
- {% include "releasenotes_@VERSION@.html" %}
-
-
-
ChangeLog for Chisel @VERSION@ @DATE@
- {% include "changelog_@VERSION@.html" %}
-
-
-
ReleaseNotes for Chisel v2.2.24 2015-03-09
- {% include "releasenotes_v2.2.24.html" %}
-
-
-
ChangeLog for Chisel v2.2.24 2015-03-09
- {% include "changelog_v2.2.24.html" %}
-
-
-
ReleaseNotes for Chisel v2.2.22 2015-02-26
- {% include "releasenotes_v2.2.22.html" %}
-
-
-
ChangeLog for Chisel v2.2.22 2015-02-26
- {% include "changelog_v2.2.22.html" %}
-
-
-
ReleaseNotes for Chisel v2.2.21 2014-12-12
- {% include "releasenotes_v2.2.21.html" %}
-
-
-
ChangeLog for Chisel v2.2.21 2014-12-12
- {% include "changelog_v2.2.21.html" %}
-
-
-
ReleaseNotes for Chisel v2.2.20 2014-11-20
- {% include "releasenotes_v2.2.20.html" %}
-
-
-
ChangeLog for Chisel v2.2.20 2014-11-20
- {% include "changelog_v2.2.20.html" %}
-
-
-
ReleaseNotes for Chisel v2.2.19 2014-10-03
- {% include "releasenotes_v2.2.19.html" %}
-
-
-
ChangeLog for Chisel v2.2.19 2014-10-03
- {% include "changelog_v2.2.19.html" %}
-
-
-{% endblock %}
diff --git a/doc/templates/unit_tests_trends.html b/doc/templates/unit_tests_trends.html
deleted file mode 100644
index 062a610b..00000000
--- a/doc/templates/unit_tests_trends.html
+++ /dev/null
@@ -1,118 +0,0 @@
-{% extends "base.html" %}
-
-{% block localheader %}
-
-{% endblock %}
-
-{% block content %}
-
-
Build Metrics for Chisel
-
code repository at http://github.com/ucb-bar/chisel
-
Static Style Checker
-
-$ sbt scalastyle
-
-
-
-
-
-
Runtime Analysis
-
-$ sbt scct:test
-
-
-
-
-
-{% endblock %}
-
-{% block bodyscripts %}
-
-
-
-{% endblock %}
-
diff --git a/doc/tutorial/figs/DUT.graffle b/doc/tutorial/figs/DUT.graffle
deleted file mode 100644
index 920a7d0b..00000000
--- a/doc/tutorial/figs/DUT.graffle
+++ /dev/null
@@ -1,469 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 139.7.0.167456
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {756, 553}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- BaseZoom
- 0
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2012-06-05 23:04:25 -0700
- Creator
- Jonathan Bachrach
- DisplayScale
- 1 0/72 in = 1.0000 in
- FileType
- auto
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{240, 231.5}, {96, 41}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 26
-
- ID
- 10
- Line
-
- ID
- 6
- Position
- 0.5
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs52 \cf0 outputs}
-
- Wrap
- NO
-
-
- Bounds
- {{248, 159.5}, {80, 41}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Color
-
- w
- 0
-
- Font
- Helvetica
- Size
- 26
-
- ID
- 9
- Line
-
- ID
- 5
- Position
- 0.5
- RotationType
- 0
-
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs52 \cf0 inputs}
-
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- ID
- 6
- Points
-
- {216, 252}
- {360, 252}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- Legacy
-
- TailArrow
- StickArrow
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- ID
- 5
- Points
-
- {216, 180}
- {360, 180}
-
- Style
-
- stroke
-
- HeadArrow
- StickArrow
- Legacy
-
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{360, 144}, {144, 144}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- ID
- 4
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs52 \cf0 DUT}
-
-
-
- Bounds
- {{72, 144}, {144, 144}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- Helvetica
- Size
- 25
-
- ID
- 3
- Shape
- Rectangle
- Style
-
- stroke
-
- Width
- 2
-
-
- Text
-
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs52 \cf0 Chisel}
-
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2012-06-07 22:13:36 -0700
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSLeftMargin
-
- float
- 18
-
- NSOrientation
-
- int
- 1
-
- NSPaperName
-
- string
- US Letter
-
- NSPaperSize
-
- size
- {792, 612}
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{0, -82}, {575, 718}}
- Zoom
- 1
- ZoomValues
-
-
- Canvas 1
- 1
- 1
-
-
-
-
-
diff --git a/doc/tutorial/figs/DUT.pdf b/doc/tutorial/figs/DUT.pdf
deleted file mode 100644
index d61de1d8..00000000
Binary files a/doc/tutorial/figs/DUT.pdf and /dev/null differ
diff --git a/doc/tutorial/figs/condupdates.graffle b/doc/tutorial/figs/condupdates.graffle
deleted file mode 100644
index 71d93992..00000000
--- a/doc/tutorial/figs/condupdates.graffle
+++ /dev/null
@@ -1,2822 +0,0 @@
-
-
-
-
- ActiveLayerIndex
- 0
- ApplicationVersion
-
- com.omnigroup.OmniGrafflePro
- 138.33.0.157554
-
- AutoAdjust
-
- BackgroundGraphic
-
- Bounds
- {{0, 0}, {576, 733}}
- Class
- SolidGraphic
- ID
- 2
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
-
- CanvasOrigin
- {0, 0}
- ColumnAlign
- 1
- ColumnSpacing
- 36
- CreationDate
- 2011-09-12 23:56:23 -0700
- Creator
- Krste Asanovic
- DisplayScale
- 1 0/72 in = 1.0000 in
- GraphDocumentVersion
- 8
- GraphicsList
-
-
- Bounds
- {{302, 209}, {100, 22}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 155
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs36 \cf0 Initial values}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{394, 237}, {11, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 296
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 0}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{313, 237}, {11, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 295
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 0}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 294
- Points
-
- {432, 318}
- {432, 369}
- {396, 369}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 290
- Info
- 1
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- Head
-
- ID
- 274
- Info
- 1
-
- ID
- 293
- Points
-
- {324, 381}
- {324, 387}
- {315, 387}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 288
- Info
- 1
-
-
-
- Class
- Group
- Graphics
-
-
- Bounds
- {{387, 286}, {11, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 278
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 f}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{459, 286}, {11, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 279
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 t}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 280
- Points
-
- {468, 282}
- {468, 255}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 281
- Points
-
- {396, 282}
- {396, 261}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{462, 234}, {22, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 282
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 e1}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{257, 286}, {22, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 283
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 c1}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{330.639, 295.502}, {8.99658, 8.99658}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 284
- Line
-
- ID
- 292
- Position
- 0.4762515127658844
- RotationType
- 0
-
- Shape
- Circle
- Style
-
- fill
-
- Color
-
- b
- 0
- g
- 0
- r
- 0
-
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 285
- Points
-
- {432, 380}
- {432, 381}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- HeadScale
- 1.5000001192092896
- LineType
- 1
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- Group
- Graphics
-
-
- AllowLabelDrop
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- Head
-
- ID
- 289
-
- ID
- 287
- Points
-
- {333, 300}
- {333.154, 320.917}
-
- Style
-
- stroke
-
- Cap
- 0
- HeadArrow
- 0
- Join
- 0
- LineType
- 1
- TailArrow
- 0
- Width
- 2
-
-
-
-
- AllowLabelDrop
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 288
- Points
-
- {324, 363}
- {324, 381}
-
- Style
-
- stroke
-
- Cap
- 0
- HeadArrow
- 0
- Join
- 0
- LineType
- 1
- TailArrow
- 0
- TailScale
- 1.8571430444717407
- Width
- 2
-
-
- Tail
-
- ID
- 289
-
-
-
- AllowConnections
- NO
- Bounds
- {{301.5, 322.5}, {45, 36}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 289
- Magnets
-
- {1, 0}
- {-0.460092, -0.26062}
- {-0.475541, 0.277852}
-
- Rotation
- 90
- Shape
- OrGate
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Width
- 2
-
-
- Text
-
- VerticalPad
- 0
-
- VFlip
- YES
-
-
- ID
- 286
- Rotation
- 90
- VFlip
- YES
-
-
- Bounds
- {{360, 282}, {144, 36}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 290
- Magnets
-
- {0, 1}
- {0, -1}
-
- Shape
- Trapazoid
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 291
- Points
-
- {315, 327.101}
- {315, 261}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- AllowConnections
- NO
- AllowLabelDrop
-
- AllowToConnect
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 292
- Points
-
- {378, 300}
- {333, 300}
- {288, 300}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- ID
- 277
- VFlip
- YES
-
-
- Bounds
- {{389, 507}, {11, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 276
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 r}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{401, 471}, {22, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 259
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 in}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{252, 471}, {65, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 260
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 enable}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{387, 400}, {11, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 261
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 f}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{459, 400}, {11, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 262
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 t}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 263
- Points
-
- {468, 396}
- {468, 369}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 264
- Points
-
- {396, 396}
- {396, 369}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{462, 348}, {22, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 265
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 e2}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{257, 400}, {22, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 266
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 c2}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Bounds
- {{330.639, 409.502}, {8.99658, 8.99658}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 267
- Line
-
- ID
- 275
- Position
- 0.4762515127658844
- RotationType
- 0
-
- Shape
- Circle
- Style
-
- fill
-
- Color
-
- b
- 0
- g
- 0
- r
- 0
-
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 268
- Points
-
- {432, 433}
- {432, 495}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- HeadScale
- 1.5000001192092896
- LineType
- 1
- TailArrow
- 0
- Width
- 2
-
-
- Tail
-
- ID
- 273
- Info
- 1
-
-
-
- Class
- Group
- Graphics
-
-
- AllowLabelDrop
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- Head
-
- ID
- 272
-
- ID
- 270
- Points
-
- {333, 414}
- {333.154, 434.917}
-
- Style
-
- stroke
-
- Cap
- 0
- HeadArrow
- 0
- Join
- 0
- LineType
- 1
- TailArrow
- 0
- Width
- 2
-
-
-
-
- AllowLabelDrop
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 271
- Points
-
- {324, 477}
- {324, 495}
-
- Style
-
- stroke
-
- Cap
- 0
- HeadArrow
- FilledArrow
- Join
- 0
- LineType
- 1
- TailArrow
- 0
- TailScale
- 1.8571430444717407
- Width
- 2
-
-
- Tail
-
- ID
- 272
-
-
-
- AllowConnections
- NO
- Bounds
- {{301.5, 436.5}, {45, 36}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 272
- Magnets
-
- {1, 0}
- {-0.460092, -0.26062}
- {-0.475541, 0.277852}
-
- Rotation
- 90
- Shape
- OrGate
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Width
- 2
-
-
- Text
-
- VerticalPad
- 0
-
- VFlip
- YES
-
-
- ID
- 269
- Rotation
- 90
- VFlip
- YES
-
-
- Bounds
- {{360, 396}, {144, 36}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 273
- Magnets
-
- {0, 1}
- {0, -1}
-
- Shape
- Trapazoid
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 274
- Points
-
- {315, 441}
- {315, 387}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- AllowConnections
- NO
- AllowLabelDrop
-
- AllowToConnect
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 275
- Points
-
- {378, 414}
- {333, 414}
- {288, 414}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{351, 534}, {33, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 257
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 out}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 256
- Points
-
- {396, 531}
- {396, 558}
-
- Style
-
- stroke
-
- HeadArrow
- FilledArrow
- HeadScale
- 1.5000001192092896
- LineType
- 1
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Bounds
- {{210, 507}, {55, 21}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 255
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\b\fs36 \cf0 clock}
- VerticalPad
- 0
-
- VFlip
- YES
- Wrap
- NO
-
-
- Class
- Group
- Graphics
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 252
- Points
-
- {288, 513}
- {270, 513}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- Class
- LineGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 253
- Points
-
- {288, 495}
- {306, 513}
- {288, 531}
-
- Style
-
- stroke
-
- HeadArrow
- 0
- TailArrow
- 0
- Width
- 2
-
-
-
-
- AllowConnections
- NO
- Bounds
- {{288, 495}, {216, 36}}
- Class
- ShapedGraphic
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 254
- Shape
- Rectangle
- Style
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Width
- 2
-
-
- VFlip
- YES
-
-
- ID
- 251
- VFlip
- YES
-
-
- Bounds
- {{100.5, 423}, {141, 40}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 88
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Align
- 0
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
-
-\f0\b\fs36 \cf0 when (c2)\
- \{ r := e2 \}}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- Bounds
- {{100.5, 318}, {141, 40}}
- Class
- ShapedGraphic
- FitText
- YES
- Flow
- Resize
- FontInfo
-
- Font
- CourierNewPS-BoldMT
- Size
- 18
-
- ID
- 68
- Shape
- Rectangle
- Style
-
- fill
-
- Draws
- NO
-
- shadow
-
- Draws
- NO
-
- stroke
-
- Draws
- NO
-
-
- Text
-
- Align
- 0
- Pad
- 0
- Text
- {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf360
-{\fonttbl\f0\fmodern\fcharset0 CourierNewPS-BoldMT;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
-
-\f0\b\fs36 \cf0 when (c1)\
- \{ r := e1 \}}
- VerticalPad
- 0
-
- Wrap
- NO
-
-
- GridInfo
-
- ShowsGrid
- YES
- SnapsToGrid
- YES
-
- GuidesLocked
- NO
- GuidesVisible
- YES
- HPages
- 1
- ImageCounter
- 1
- KeepToScale
-
- Layers
-
-
- Lock
- NO
- Name
- Layer 1
- Print
- YES
- View
- YES
-
-
- LayoutInfo
-
- Animate
- NO
- circoMinDist
- 18
- circoSeparation
- 0.0
- layoutEngine
- dot
- neatoSeparation
- 0.0
- twopiSeparation
- 0.0
-
- LinksVisible
- NO
- MagnetsVisible
- NO
- MasterSheets
-
- ModificationDate
- 2012-05-30 10:27:26 -0700
- Modifier
- Jonathan Bachrach
- NotesVisible
- NO
- Orientation
- 2
- OriginVisible
- NO
- PageBreaks
- YES
- PrintInfo
-
- NSBottomMargin
-
- float
- 41
-
- NSLeftMargin
-
- float
- 18
-
- NSPaperSize
-
- coded
- BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAx7X05TU2l6ZT1mZn2WgWQCgRgDhg==
-
- NSRightMargin
-
- float
- 18
-
- NSTopMargin
-
- float
- 18
-
-
- PrintOnePage
-
- QuickLookPreview
-
- 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
- 4/NDyqTL1e+Uv+qLny/xZdPpC5APfB3F4n1dfLpUhxvv6pu7utDl8J+nrz5XGZAlAquL
- 50v9m968zt9C3/wDhSFj7AplbmRzdHJlYW0KZW5kb2JqCjYgMCBvYmoKMTcyMwplbmRv
- YmoKMyAwIG9iago8PCAvVHlwZSAvUGFnZSAvUGFyZW50IDQgMCBSIC9SZXNvdXJjZXMg
- NyAwIFIgL0NvbnRlbnRzIDUgMCBSIC9NZWRpYUJveCBbMCAwIDU3NiA3MzNdCj4+CmVu
- ZG9iago3IDAgb2JqCjw8IC9Qcm9jU2V0IFsgL1BERiAvVGV4dCBdIC9Db2xvclNwYWNl
- IDw8IC9DczIgOSAwIFIgL0NzMSA4IDAgUiA+PiAvRm9udCA8PAovRjIuMCAxMSAwIFIg
- L0YxLjAgMTAgMCBSID4+ID4+CmVuZG9iagoxMiAwIG9iago8PCAvTGVuZ3RoIDEzIDAg
- UiAvTiAxIC9BbHRlcm5hdGUgL0RldmljZUdyYXkgL0ZpbHRlciAvRmxhdGVEZWNvZGUg
- Pj4Kc3RyZWFtCngBhVJPSBRRHP7NNhKEiEGFeIh3CgmVKaysoNp2dVmVbVuV0qIYZ9+6
- o7Mz05vZNcWTBF2iPHUPomN07NChm5eiwKxL1yCpIAg8dej7zezqKIRveTvf+/39ft97
- RG2dpu87KUFUc0OVK6Wnbk5Ni4MfKUUd1E5YphX46WJxjLHruZK/u9fWZ9LYst7HtXb7
- 9j21lWVgIeottrcQ+iGRZgAfmZ8oZYCzwB2Wr9g+ATxYDqwa8COiAw+auTDT0Zx0pbIt
- kVPmoigqr2I7Sa77+bnGvou1iYP+XI9m1o69s+qq0UzUtPdEobwPrkQZz19U9mw1FKcN
- 45xIQxop8q7V3ytMxxGRKxBKBlI1ZLmfak6ddeB1GLtdupPj+PYQpT7JYKiJtemymR2F
- fQB2KsvsEPAF6PGyYg/ngXth/1tRw5PAJ2E/ZId51q0f9heuU+B7hD014M4UrsXx2oof
- Xi0BQ/dUI2iMc03E09c5c6SI7zHUGZj3RjmmCzF3lqoTN4A7YR9ZqmYKsV37ruol7nsC
- d9PjO9GbOQtcoBxJcrEV2RTQPAlYFH2LsEkOPD7OHlXgd6iYwBy5idzNKPce1REbZ6NS
- gVZ6jVfGT+O58cX4ZWwYz4B+rHbXe3z/6eMVdde2Pjz5jXrcOa69nRtVYVZxZQvd/8cy
- hI/ZJzmmwdOhWVhr2HbkD5rMTLAMKMR/BT6X+pITVdzV7u24RRLMUD4sbCW6S1RuKdTq
- PYNKrBwr2AB2cJLELFocuFNrujl4d9giem35TVey64b++vZ6+9ryHm3KqCkoE82zRGaU
- sVuj5N142/1mkRGfODq+572KWsn+SUUQP4U5WiryFFX0VlDWxG9nDn4btn5cP6Xn9UH9
- PAk9rZ/Rr+ijEb4MdEnPwnNRH6NJ8LBpIeISoIqDM9ROVGONA+Ip8fK0W2SR/Q9AGf1m
- CmVuZHN0cmVhbQplbmRvYmoKMTMgMCBvYmoKNzA0CmVuZG9iago5IDAgb2JqClsgL0lD
- Q0Jhc2VkIDEyIDAgUiBdCmVuZG9iagoxNCAwIG9iago8PCAvTGVuZ3RoIDE1IDAgUiAv
- TiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+Pgpz
- dHJlYW0KeAGFVM9rE0EU/jZuqdAiCFprDrJ4kCJJWatoRdQ2/RFiawzbH7ZFkGQzSdZu
- NuvuJrWliOTi0SreRe2hB/+AHnrwZC9KhVpFKN6rKGKhFy3xzW5MtqXqwM5+8943731v
- dt8ADXLSNPWABOQNx1KiEWlsfEJq/IgAjqIJQTQlVdvsTiQGQYNz+Xvn2HoPgVtWw3v7
- d7J3rZrStpoHhP1A4Eea2Sqw7xdxClkSAog836Epx3QI3+PY8uyPOU55eMG1Dys9xFki
- fEA1Lc5/TbhTzSXTQINIOJT1cVI+nNeLlNcdB2luZsbIEL1PkKa7zO6rYqGcTvYOkL2d
- 9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0+GAVtxqp+DXCFF8QTSeiVHHZ
- Lg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv4ndWUeF5jxNn3tTd70XaAq8w
- Dh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1JGq7dGJEsUF7Ntw9t1Gk3Tz+
- KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF5Zm5Gh7X08jjc01efJXUdpNX
- R5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXjVfPqS4R1WjE3359sfzs94i7P
- LrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPiKTEmdornIYmXxS7xkthLqwvi
- YG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM0lSJ93/CKmQ0nbkOb/qP28f8
- F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZua6N+OPwEWDyrFq1SNZ8gvAEc
- dod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VLFrOZVWLpdtiZ0x1uHKE5QvfE
- p0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UUKZW5kc3RyZWFtCmVuZG9iagoxNSAw
- IG9iago3MzcKZW5kb2JqCjggMCBvYmoKWyAvSUNDQmFzZWQgMTQgMCBSIF0KZW5kb2Jq
- CjQgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdIC9D
- b3VudCAxIC9LaWRzIFsgMyAwIFIgXSA+PgplbmRvYmoKMTYgMCBvYmoKPDwgL1R5cGUg
- L0NhdGFsb2cgL091dGxpbmVzIDIgMCBSIC9QYWdlcyA0IDAgUiA+PgplbmRvYmoKMiAw
- IG9iago8PCAvTGFzdCAxNyAwIFIgL0ZpcnN0IDE4IDAgUiA+PgplbmRvYmoKMTggMCBv
- YmoKPDwgL1BhcmVudCAxOSAwIFIgL0NvdW50IDAgL0Rlc3QgWyAzIDAgUiAvWFlaIDAg
- NzMzIDAgXSAvVGl0bGUgKENhbnZhcyAxKQo+PgplbmRvYmoKMTkgMCBvYmoKPDwgPj4K
- ZW5kb2JqCjE3IDAgb2JqCjw8IC9QYXJlbnQgMTkgMCBSIC9Db3VudCAwIC9EZXN0IFsg
- MyAwIFIgL1hZWiAwIDczMyAwIF0gL1RpdGxlIChDYW52YXMgMSkKPj4KZW5kb2JqCjIw
- IDAgb2JqCjw8IC9MZW5ndGggMjEgMCBSIC9MZW5ndGgxIDc3OTYgL0ZpbHRlciAvRmxh
- dGVEZWNvZGUgPj4Kc3RyZWFtCngBvVkLVJNXtt7nfyaERxIS8iAhCT9JCG98IBGUiAmi
- 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
- 1GaTw1zukLdmUuP++n9l4q+988y0jPl7ajYxH5rpMxzfidivuVzAuOLLKSVnCQPLoY1p
- Y5cLP+Me41+G/YwCT2mZADeHf5TbxJ/jzvOK2emr00VFmCj7HcvXIbT4t0A40jmAgdjO
- hckjx1i2Q8sQBv8recSXIggdWpyJFziWEJ5hBRbwzC5GQY11mDlBaLTb0E8OCyZT1VVj
- 5dCnnw6ZZPsYAYOZoVjrpY9krVeszMlUV12uFKNF5tx5a31OxqNlWQ48WkHA58A44QzH
- HubhO7le75DXe5NkXlRn4i8/j4b8hvsSlWQixuRPSArJPDu88vTwGi73+m627do7iNDI
- O12kFc+i/9kVi40snqb78Uy7Au7AE/WF+G5ZB0G5M8GT9uh7poD/PYK/tmZRzYLM8taV
- 3a1d7UubsE+USzsXYvJjmo+pBRP9bxNRgqcwvYQJ/2bCU2OA9zBdjoxcSMMYTcB+Ux0D
- 4Dg+nfHG/vKabhjffhOfntPe2P+em+qrb6pTnW/sv+amejet/x9hv9JhCmVuZHN0cmVh
- bQplbmRvYmoKMjEgMCBvYmoKNDc2NgplbmRvYmoKMjIgMCBvYmoKPDwgL1R5cGUgL0Zv
- bnREZXNjcmlwdG9yIC9Bc2NlbnQgNzcwIC9DYXBIZWlnaHQgNjg0IC9EZXNjZW50IC0y
- MzAgL0ZsYWdzIDMyCi9Gb250QkJveCBbLTk1MSAtNDgxIDE0NDUgMTEyMl0gL0ZvbnRO
- YW1lIC9EU1JXUlUrSGVsdmV0aWNhIC9JdGFsaWNBbmdsZSAwCi9TdGVtViAwIC9NYXhX
- aWR0aCAxNTAwIC9YSGVpZ2h0IDUxMyAvRm9udEZpbGUyIDIwIDAgUiA+PgplbmRvYmoK
- MjMgMCBvYmoKWyAyNzggMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg
- MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAyNzggMCAw
- IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDU1NiAwIDAg
- MCA1NTYKMCAwIDAgMjIyIDAgMCAyMjIgMCA1NTYgMCAwIDAgMCA1MDAgMjc4IDU1NiA1
- MDAgXQplbmRvYmoKMTEgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVU
- eXBlIC9CYXNlRm9udCAvRFNSV1JVK0hlbHZldGljYSAvRm9udERlc2NyaXB0b3IKMjIg
- MCBSIC9XaWR0aHMgMjMgMCBSIC9GaXJzdENoYXIgMzIgL0xhc3RDaGFyIDExOCAvRW5j
- b2RpbmcgL01hY1JvbWFuRW5jb2RpbmcKPj4KZW5kb2JqCjI0IDAgb2JqCjw8IC9MZW5n
- dGggMjUgMCBSIC9MZW5ndGgxIDIwMjQwIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0
- cmVhbQp4Aa18C1xUx/X/zNy7Txa4+4QF2Se7PBbYRQEF0b2ISAQVfEUwEvBB1NQEXzFv
- Jc3bpJUkNc/2J2nzbNJkAZOgTStt0jRJa+OvsUlM22D6S/O2mvzUNlF2/9+ZXXw0/T0+
- n/9vlzNnZu7cc2bOnDNz5ty7bN54RTcxkV4iEXXlZcvXE/EJqkAHV27Z7BFF4lhHiD7j
- kvWrL0uWXdcRomtfve7qS5LlgjmEFKhrupevSpbJaeCqNahIlmkFcP6ayzZflSwH3gFe
- s65nZep6gQ3lqsuWX5XiT/6Esufy5Zd1J9vP+wC4ZH3Pps2p8p3Abes3dqfa0zZC7Jbz
- yxmEULTKIV+SWnIT0RBGFBIm7RjJOs2bREaZX9cQwn7y4eLOzNoTeoNekP/R4p46nvlV
- 2p6V8Su/nq/5geFXaGsQ7fkF3Kd9cuwBQuT98SsTEc0PzlzhV/knZ2CJu26aTEkYEAFI
- IhdFrgXQCegCvAEYBRwF6IkHKW+7A7ALwK9oiFtKkDAgApBIFGknYPRMaQdyuwD9gGMA
- DVGl+FBaxkR3XaMUx61xsh6wCyDj1rOlo6JmR+paP7BEMmUNxhJGGgXsABwFyMQjnUa9
- Ip0iPYB+lA4DZFD/Gl3icIq0AHcJOAV8muxD3QHAMYAxMSL9Y2j+womkrlb6CoS+Qi+/
- Iq2A9YBeQAxwGAA5IA1LYxjxVyA8Jlp1Id8H2IfyCPABAG+dBjq8xRhYjpFnAZzOeCve
- 4hjAAPZfDU69d+IekUk3i8yJoZraiQfqbNIJjK1PpJlIw4AooAWwA/AsQAs2xwcNJnHf
- 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
- BPMdhGXemNLqbqy1j6MkYa4s2AGikPgczMkynKwkWoCd9mXydOJhaTFoDAiTeZy9QT3x
- H5ECrDKXY39qJv9Bp5NP8d1Ndo89CG5PaB8H1z3aJ8kJ7Q/wxG8nSnewBo1ZDkPnx1gP
- /U7iovhFWNOuJXvkv+JRD1HntC25cPGihQvmt7bMa5odnT6tdmpN9ZTJlRWTJpZHwmWl
- JaHiosKCYCDf7/N63K68Cbk5zuwsh91mtZiVzIx0U5rRoNdpNbLEKClp8M/q8sSCXTE5
- 6L/gglJe9i9HxfJzKrpiHlTNOr9NzMPvW45L57VU0fKSf2qpJluqZ1pSxVNLaktLPA1+
- T2z/TL9nmC6d34b8d2b62z2xIyI/V+TloCiko+D14g5PQ/aamZ4Y7fI0xGZtWbO9oWtm
- aQkdSDPW++u7jaUlZMCYhmwacrEs//oBmjWdigzLaqgZYESfjjHGcvwzG2JOP24FGSnQ
- sHxVrHV+W8PMXK+3vbQkRutX+lfECHekQ6IJqRdsYtr6mE6w8ayNYTjkDs9Aycj2O4cV
- sqIrZFrlX7V8WVtMWg4aDTFzCHxnxrKu+SD7bBHE4bLfeu7VXGl7Q/ZaD2+8ffutnlj/
- /LZz7s31cgrt7aCBe1lgVtf2WWB9J6aKZofROd59PpTkoJJHoUDXpZ6YwT/Dv2b7pV2Y
- kJztMbLgau9gTo66J3GY5DR4ti9q83tj0Vx/+/KZEwZsZPuCq4ecqsd5/pXSkgHFnJTm
- QEZmKmNKPzfTDUknr4mcaM5zzQvOiJPyPvpnx1To0UoPetLmx0Cm8KR7Ctm+cgqkjk87
- xV2xVZiGtTFDfdd2pYbXQ5Q0pgkofs/2EwTT7j/y+fk1y1M12oACS8ZFrhxnFCxGl4/n
- YzglFBdzvdDVYyLRx+miXFlasmWY7fevVzxAOEmS1jbc1l4Thsy9Xj6rdwyrZAUKsd75
- bcmyh6zIHSRqGOct1sWvjIxfsS/mV3rHr5y5vcsP9d2NXRMvXcT0wTN/mYrD2rCmJkYd
- /83l7uT15oX+ZgRhPA3bu1Kq2rzovFLyOhco5IZrqVzMWt8m5TKu2sixXElchSYuW3qm
- CQptppgcwJ9WaPKqYZ0eqihqqGdWTOm6IJm2G73elKH8TzcNJ47xuwQ6e1tqGLGaUKqj
- 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
- M5JUM29eDWCsIJXBSlFEPfLjUg92kFwy9Xl9KdGVEjrMjqgOe0apI7PUYU8jTurMyZMt
- zglXDycXdK6+JFw7l6vwSa7IkFtKW718mdVK55Vk1+nvcY2V1vH0nDz74bjixrdOKSuD
- CpdNQZ/aE+/J90uPIxI5mU5TK4s1NFJGNVWOKn9VtDgaipZMK70s47oMg8Zj99ynf0n7
- mueg9gPtySrsq2fO0uP2aoO9WiPFk32E3lJEi4onV5gsRq7FYZenQjG2Gplq7DUyo7ez
- hLaU0JKSIptaCovutihel67I2FtBK7xyWjqUb8lub6eP+vjNBkta1JdTnXVrZJgtVi06
- NSsj6tZ5dBGdpHNOiT6f3IVCc8e4OoY6+A6I+doQjR7hjzQyFbV0aVRRM108sUWhpe1H
- Qpbq8IaNR6CbaCIMdgiNeFeH0E5gJTeF7QIPJm/FzdWW6mpztfI5NSODP76UdGyAKnsr
- U9tLPjaVlBon1WV8SxxfbKTk0itW3qrJknvu3jmP/o7qPu64pqXnoruqXEXVtvzqOf+m
- 7nvTzyfx2LVrrl86JXfikqafzo4UFT176Q1/tpWX1eSnTy3LCWYpduejO+JL+eTSnuxp
- BYV5Fm/NRLzz+FliVL5XY8a+Xkz71HINMxiMJul5/Sv6j/RfG2Q3U0zufCUYZh5TON8T
- /Cz4WfFp7WlPIj89XzVkRoNC9sjkq8a0ClHKRiZXlX25aqExqCd8AbdYbXZH1rgC8GWc
- nImrjNc6XbPTPemFmb0I2ssu4vPKukxjodeY5uYTaiM6RcymqmvVaWM6elhHdYK32RjV
- 5ZSQQAbUQbVlEYfHEXG84Rh1HHUkHLpdDuoYb+ZwhlZeJ/QAizpXAO4DhTo2dMwVmyms
- 11y9AfM1ZXwtei5dTVMqKO4fBMZuidWo/mo1p6jY49UYvBq3mxYZkHi0Pjct1he6Cdpg
- P73hhhvI7EVXq0qwIM0UNBX65YK0gJ+Y0nHwwaY7ftWfz6R85vNr/DjeY+k5cxXaF+qg
- WPWoma9sxG4jUJECe2pZmWROZShfBbV2G7bmKrqq+aGWP9DC+IcfLbi/8VhTVJ3tF3oh
- LR68oXew/+67H9aY4xXl5fF3D/w6fqK4aKLYna7k6ekHt8Vi12246y6sbBth6XfA0kPk
- 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
- OLJxdLYkfhOZtJHniGrIqxBKAcyVZBCYO+vcF+JLPP+I7d2RjROONTvdHMVPT1/HMzRX
- 1FqFBKX31IxSXPMhcfDjBCZyZAgYE/neC5bsKMtGkiTF0/aNeDK+kZ8uz37E0449xA7t
- BRuhvcCiY1i1hPYCizJ6IMrAooy4uSgDizL6JMrAKPcOoVcoCyzKODmKMrBobxXlkSFg
- UUZfxf3AvDyYVs2LA2l8V/3Gp51i491I+U8tzh5F8JaF1TrJahWPXfDahfAidZKfrfnu
- L56eUh1t2tcUzc9tmbft+d7WOdmRaNMvmqKTq574Ob0mfgvbJ1WHuBtY5smO/5TOjQ/R
- hlQcsKhaHqvD2kLb8E7TlZpMvOd/vVocNoTzv02+IHJRBn3MdtLJdM4gkqBBJlnBJV5F
- V2+y5P/Gm3CRYfrsYFYxonRLnzcbfmNKmF176RpipmtUgycrksWynGUf7cGPF5Ixu7mI
- UI8hUIDANLB4UOUM82cP1QiM8GcL+OOxUZsLL0JpcQLh62lFGeO+HaK2Zv72EY+a4uUG
- NNKyvvwc96KqaeH668ryJiwrL+8wmvvXRqZVXZhmyaVfFM29ML63yK+rKS6pbWytaKBr
- Q560qpLSqrR0WzG98PKHa0uKavQZ9qL43oZmLoP5kMF6IYOtavixnBN2prUH7EVuyWfw
- 5t+JF/+/ztDogsUGuxM+LOSgW2JSvP+TIIaycsJnRHDynyUQReSEiyD5mA5S4I86Oygm
- PjVuDJgfGpISSY07eTRLSYRN8ef+V0JwciHU01lFfn1NkRDCzPiPQ15jVWmJEEL8vp4z
- QqCzLpyD04H4xP34nQL3jf75g6g9osRpeKfPihCtHU/qPGQmYqSz8HuP2fgdxBz8+qSF
- zMfvXhaTJfhlxFK8idgliFCsYUl6Wh77b25dMHtea6i+54qNa7s3zuu+snVh6Yyedavm
- Lvp/6hp0XgplbmRzdHJlYW0KZW5kb2JqCjI1IDAgb2JqCjEzNDY2CmVuZG9iagoyNiAw
- IG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0FzY2VudCA4MzMgL0NhcEhlaWdo
- dCA2MjUgL0Rlc2NlbnQgLTMwMCAvRmxhZ3MgMzIKL0ZvbnRCQm94IFstMTkyIC03MTAg
- NzAyIDEyMjJdIC9Gb250TmFtZSAvS1BSSU5QK0NvdXJpZXJOZXdQUy1Cb2xkTVQgL0l0
- YWxpY0FuZ2xlCjAgL1N0ZW1WIDAgL01heFdpZHRoIDYwMCAvWEhlaWdodCA1NDkgL0Zv
- bnRGaWxlMiAyNCAwIFIgPj4KZW5kb2JqCjI3IDAgb2JqClsgNjAwIDAgMCAwIDAgMCAw
- IDAgNjAwIDYwMCAwIDAgMCAwIDAgMCA2MDAgNjAwIDYwMCAwIDAgMCAwIDAgMCAwIDYw
- MCAwIDAKNjAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw
- IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAo2MDAgNjAwIDYwMCAwIDYwMCA2MDAg
- MCA2MDAgNjAwIDAgNjAwIDYwMCAwIDYwMCA2MDAgMCAwIDYwMCAwIDYwMCA2MDAgMCA2
- MDAKMCAwIDAgNjAwIDAgNjAwIF0KZW5kb2JqCjEwIDAgb2JqCjw8IC9UeXBlIC9Gb250
- IC9TdWJ0eXBlIC9UcnVlVHlwZSAvQmFzZUZvbnQgL0tQUklOUCtDb3VyaWVyTmV3UFMt
- Qm9sZE1UIC9Gb250RGVzY3JpcHRvcgoyNiAwIFIgL1dpZHRocyAyNyAwIFIgL0ZpcnN0
- Q2hhciAzMiAvTGFzdENoYXIgMTI1IC9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZwo+
- PgplbmRvYmoKMjggMCBvYmoKKE1hYyBPUyBYIDEwLjYuOCBRdWFydHogUERGQ29udGV4
- dCkKZW5kb2JqCjI5IDAgb2JqCihEOjIwMTIwNTMwMTcyNzQ0WjAwJzAwJykKZW5kb2Jq
- CjEgMCBvYmoKPDwgL1Byb2R1Y2VyIDI4IDAgUiAvQ3JlYXRpb25EYXRlIDI5IDAgUiAv
- TW9kRGF0ZSAyOSAwIFIgPj4KZW5kb2JqCnhyZWYKMCAzMAowMDAwMDAwMDAwIDY1NTM1
- IGYgCjAwMDAwMjQwNzMgMDAwMDAgbiAKMDAwMDAwMzk3NSAwMDAwMCBuIAowMDAwMDAx
- ODM5IDAwMDAwIG4gCjAwMDAwMDM4MjYgMDAwMDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBu
- IAowMDAwMDAxODE5IDAwMDAwIG4gCjAwMDAwMDE5NDMgMDAwMDAgbiAKMDAwMDAwMzc5
- MCAwMDAwMCBuIAowMDAwMDAyODk0IDAwMDAwIG4gCjAwMDAwMjM3OTQgMDAwMDAgbiAK
- MDAwMDAwOTU0OSAwMDAwMCBuIAowMDAwMDAyMDY2IDAwMDAwIG4gCjAwMDAwMDI4NzQg
- MDAwMDAgbiAKMDAwMDAwMjkzMCAwMDAwMCBuIAowMDAwMDAzNzcwIDAwMDAwIG4gCjAw
- MDAwMDM5MDkgMDAwMDAgbiAKMDAwMDAwNDEzOCAwMDAwMCBuIAowMDAwMDA0MDIzIDAw
- MDAwIG4gCjAwMDAwMDQxMTYgMDAwMDAgbiAKMDAwMDAwNDIzMSAwMDAwMCBuIAowMDAw
- MDA5MDg3IDAwMDAwIG4gCjAwMDAwMDkxMDggMDAwMDAgbiAKMDAwMDAwOTMzMyAwMDAw
- MCBuIAowMDAwMDA5NzI0IDAwMDAwIG4gCjAwMDAwMjMyODEgMDAwMDAgbiAKMDAwMDAy
- MzMwMyAwMDAwMCBuIAowMDAwMDIzNTM2IDAwMDAwIG4gCjAwMDAwMjM5NzkgMDAwMDAg
- biAKMDAwMDAyNDAzMSAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDMwIC9Sb290IDE2
- IDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8ZWFkZDM3NTdlMzUyZGMyMDc3NjU1NDZhMzVj
- N2E2NmY+CjxlYWRkMzc1N2UzNTJkYzIwNzc2NTU0NmEzNWM3YTY2Zj4gXSA+PgpzdGFy
- dHhyZWYKMjQxNDgKJSVFT0YKMSAwIG9iago8PC9BdXRob3IgKEtyc3RlIEFzYW5vdmlj
- XG5Kb25hdGhhbiBCYWNocmFjaCkvQ3JlYXRpb25EYXRlIChEOjIwMTEwOTEzMDY1NjAw
- WikvQ3JlYXRvciAoT21uaUdyYWZmbGUgUHJvZmVzc2lvbmFsIDUuMy42KS9Nb2REYXRl
- IChEOjIwMTIwNTMwMTcyNzAwWikvUHJvZHVjZXIgMjggMCBSIC9UaXRsZSAoY29uZHVw
- ZGF0ZXMuZ3JhZmZsZSk+PgplbmRvYmoKeHJlZgoxIDEKMDAwMDAyNDkwNiAwMDAwMCBu
- IAp0cmFpbGVyCjw8L0lEIFs8ZWFkZDM3NTdlMzUyZGMyMDc3NjU1NDZhMzVjN2E2NmY+
- IDxlYWRkMzc1N2UzNTJkYzIwNzc2NTU0NmEzNWM3YTY2Zj5dIC9JbmZvIDEgMCBSIC9Q
- cmV2IDI0MTQ4IC9Sb290IDE2IDAgUiAvU2l6ZSAzMD4+CnN0YXJ0eHJlZgoyNTExNgol
- JUVPRgo=
-
- QuickLookThumbnail
-
- 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
- AAEAAQ==
-
- ReadOnly
- NO
- RowAlign
- 1
- RowSpacing
- 36
- SheetTitle
- Canvas 1
- SmartAlignmentGuidesActive
- YES
- SmartDistanceGuidesActive
- YES
- UniqueID
- 1
- UseEntirePage
-
- VPages
- 1
- WindowInfo
-
- CurrentSheet
- 0
- ExpandedCanvases
-
-
- name
- Canvas 1
-
-
- Frame
- {{72, 4}, {1368, 874}}
- ListView
-
- OutlineWidth
- 142
- RightSidebar
-
- ShowRuler
-
- Sidebar
-
- SidebarWidth
- 120
- VisibleRegion
- {{-16, 224.5}, {609.5, 360}}
- Zoom
- 2
- ZoomValues
-
-
- Canvas 1
- 2
- 1
-
-
-
- saveQuickLookFiles
- YES
-
-
diff --git a/doc/tutorial/figs/condupdates.pdf b/doc/tutorial/figs/condupdates.pdf
deleted file mode 100644
index 8ba9abb9..00000000
Binary files a/doc/tutorial/figs/condupdates.pdf and /dev/null differ
diff --git a/doc/tutorial/figs/cpu.png b/doc/tutorial/figs/cpu.png
deleted file mode 100644
index cc0e89b8..00000000
Binary files a/doc/tutorial/figs/cpu.png and /dev/null differ
diff --git a/doc/tutorial/retreat-talk.tex b/doc/tutorial/retreat-talk.tex
deleted file mode 100644
index 3c59131e..00000000
--- a/doc/tutorial/retreat-talk.tex
+++ /dev/null
@@ -1,1067 +0,0 @@
-\documentclass[xcolor=pdflatex,dvipsnames,table]{beamer}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{relsize}
-\usepackage[procnames]{listings}
-\usepackage{array}
-
-\input{../style/scala.tex}
-\input{../style/talk.tex}
-
-\title[Chisel]{Chisel: Constructing Hardware In a Scala Embedded Language}
-\author[Bachrach et al]{Jonathan Bachrach, Huy Vo, Brian Richards, \\
-Yunsup Lee, Andrew Waterman, Rimas Avizienis, Henry Cook, \\
-John Wawrzynek, Krste Asanovic}
-\date{\today}
-\institute[parlab]{EECS UC Berkeley}
-
-\begin{document}
-
-{
-\setbeamertemplate{footline}{}
-\begin{frame}
- \titlepage
-\end{frame}
-}
-\addtocounter{framenumber}{-1}
-
-\begin{frame}[fragile]
-\frametitle{21st Century Architecture Design}
-{\Large\textbf{Harder to get hardware / software efficiency gains}}
-\vskip5mm
-\begin{itemize}
-\item Need massive design-space exploration
-\begin{itemize}
-\item Hardware and software codesign and cotuning
-\end{itemize}
-\item Need meaningful results
-\begin{itemize}
-\item Cycle counts
-\item Cycle time, power and area
-\item Real chips
-\end{itemize}
-\item Traditional architectural simulators, hardware-description
- languages, and tools are inadequate
-\begin{itemize}
-\item Slow
-\item Inaccurate
-\item Error prone
-\item Difficult to modify and parameterize
-\end{itemize}
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Bottom Line -- Shorten Design Loop}
-{\LARGE\textbf{Make it}}
-\vskip2mm
-\begin{itemize}
-\item Easier to make design changes
-\begin{itemize}
-\item Fewer lines of design code ( \textbf{>> 3x} )
-\item More reusable code
-\item Parameterize designs
-\end{itemize}
-\item Faster to test results ( \textbf{>> 8x} )
-\begin{itemize}
-\item Fast compilation
-\item Fast simulation
-\item Easy testing
-\item Easy verification
-\end{itemize}
-\end{itemize}
-\vskip0.8cm
-{\LARGE\textbf{Result}}
-\begin{itemize}
-\item Explore more design space
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Chisel is ...}
-
-\begin{columns}[c]
-
-\column{0.55\textwidth}
-
-\begin{itemize}
-\item Best of hardware and software design ideas
-\item Embedded within Scala language to leverage mindshare and language design
-\item Algebraic construction and wiring
-\item Hierarchical, object oriented, and functional construction
-\item Abstract data types and interfaces
-\item Bulk connections
-\item Multiple targets
-\begin{itemize}
-\item Simulation and synthesis
-\item Memory IP is target-specific
-\end{itemize}
-\end{itemize}
-
-\column{0.40\textwidth}
-
-\begin{center}
-single source \\
-\includegraphics[width=0.99\textwidth]{../manual/figs/targets.pdf} \\
-multiple targets \\
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{The Scala Programming Language}
-
-\begin{columns}[c]
-
-\column{0.75\textwidth}
-
-\begin{itemize}
-\item Compiled to JVM
-\begin{itemize}
-\item Good performance
-\item Great Java interoperability
-\item Mature debugging, execution environments
-\end{itemize}
-\item Object Oriented
-\begin{itemize}
-\item Factory Objects, Classes
-\item Traits, overloading etc
-\end{itemize}
-\item Functional
-\begin{itemize}
-\item Higher order functions
-\item Anonymous functions
-\item Currying etc
-\end{itemize}
-\item Extensible
-\begin{itemize}
-\item Domain Specific Languages (DSLs)
-\end{itemize}
-\end{itemize}
-
-\column{0.25\textwidth}
-
-\begin{center}
-\includegraphics[height=0.4\textheight]{figs/programming-scala.pdf} \\
-\includegraphics[height=0.4\textheight]{figs/programming-in-scala.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Algebraic Graph Construction}
-
-\begin{columns}
-\column{0.35\textwidth}
-{\lstset{basicstyle={\Large\ttfamily}}
-\begin{scala}
-Mux(x > y, x, y)
-\end{scala}
-}
-
-\column{0.6\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/max2.pdf}
-\end{center}
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Creating Component}
-
-\begin{columns}
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class Max2 extends Component {
- val io = new Bundle {
- val x = UFix(width = 8).asInput
- val y = UFix(width = 8).asInput
- val z = UFix(width = 8).asOutput }
- io.z := Mux(io.x > io.y, io.x, io.y)
-}
-\end{scala}
-}
-
-\column{0.45\textwidth}
-\begin{center}
-\includegraphics[width=0.95\textwidth]{figs/Max2c.pdf} \\
-\end{center}
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Connecting Components}
-
-\begin{columns}
-\column{0.25\textwidth}
-\begin{scala}
-val m1 = new Max2()
-m1.io.x := a
-m1.io.y := b
-val m2 = new Max2()
-m2.io.x := c
-m2.io.y := d
-val m3 = new Max2()
-m3.io.x := m1.io.z
-m3.io.y := m2.io.z
-\end{scala}
-
-\column{0.7\textwidth}
-
-\begin{center}
-\includegraphics[width=0.99\textwidth]{figs/Max4.pdf} \\
-\end{center}
-\end{columns}
-
-\end{frame}
-
-
-\begin{frame}[fragile]
-\frametitle{Defining Construction Functions}
-
-\begin{columns}
-
-\column{0.45\textwidth}
-
-\begin{scala}
-def Max2 = Mux(x > y, x, y)
-\end{scala}
-\begin{scala}
-Max2(x, y)
-\end{scala}
-
-\column{0.5\textwidth}
-
-\begin{center}
-\includegraphics[width=0.95\textwidth]{figs/Max2.pdf} \\[1cm]
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Functional Construction}
-
-\begin{columns}
-
-\column{0.45\textwidth}
-
-\begin{scala}
-Reduce(Array(a, b, c, d), Max2)
-\end{scala}
-
-\column{0.5\textwidth}
-
-\begin{center}
-\includegraphics[width=0.99\textwidth]{figs/reduceMax.pdf} \\
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Example}
-\begin{columns}
-
-\column{0.45\textwidth}
-
-\begin{footnotesize}
-\begin{scala}
-class GCD extends Component {
- val io = new Bundle {
- val a = UFix(INPUT, 16)
- val b = UFix(INPUT, 16)
- val z = UFix(OUTPUT, 16)
- val valid = Bool(OUTPUT) }
- val x = Reg(resetVal = io.a)
- val y = Reg(resetVal = io.b)
- when (x > y) {
- x := x - y
- } .otherwise {
- y := y - x
- }
- io.z := x
- io.valid := y === UFix(0)
-}
-\end{scala}
-\end{footnotesize}
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/gcd.pdf}
-\end{center}
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Primitive Datatypes}
-\begin{itemize}
-\item{Chisel has 4 primitive datatypes}
-\begin{description}
-\item[Bits] -- raw collection of bits
-\item[Fix] -- signed fixed-point number
-\item[UFix] -- unsigned fixed-point number
-\item[Bool] -- Boolean value
-\end{description}
-\item Can do arithmetic and logic with these datatypes
-\end{itemize}
-
-\textbf{Example Literal Constructions}
-\begin{scala}
-val sel = Bool(false)
-val a = UFix(25)
-val b = Fix(-35)
-\end{scala}
-where \verb+val+ is a Scala keyword used to declare variables whose values won't change
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Aggregate Data Types}
-
-\textbf{Bundle}
-
-\begin{itemize}
-\item User-extensible collection of values with named fields
-\item Similar to structs
-\end{itemize}
-
-\begin{footnotesize}
-% \textbf{Bundle Example}
-\begin{scala}
-class MyFloat extends Bundle{
- val sign = Bool()
- val exponent = UFix(width=8)
- val significand = UFix(width=23)
-}
-\end{scala}
-\end{footnotesize}
-
-\textbf{Vec}
-
-\begin{itemize}
-\item Create indexable collection of values
-\item Similar to arrays
-\end{itemize}
-
-\begin{footnotesize}
-% \textbf{Vec Example}
-\begin{scala}
-val myVec = Vec(5){ Fix(width=23) }
-\end{scala}
-\end{footnotesize}
-
-\end{frame}
-
-
-\begin{frame}[fragile]
-\frametitle{Abstract Data Types}
-\begin{itemize}
-\item The user can construct new data types
-\begin{itemize}
-\item Allows for compact, readable code
-\end{itemize}
-\item Example: Complex numbers
-\begin{itemize}
-\item Useful for FFT, Correlator, other DSP
-\item Define arithmetic on complex numbers
-\end{itemize}
-\end{itemize}
-
-\begin{footnotesize}
-\begin{scala}
-class Complex(val real: Fix, val imag: Fix)
- extends Bundle {
- def + (b: Complex): Complex =
- new Complex(real + b.real, imag + b.imag)
- ...
-}
-val a = new Complex(Fix(32), Fix(-16))
-val b = new Complex(Fix(-15), Fix(21))
-val c = a + b
-\end{scala}
-\end{footnotesize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Polymorphism and Parameterization}
-\begin{itemize}
-\item Chisel users can define their own parameterized functions
-\begin{itemize}
-\item Parameterization encourages reusability
-\item Data types can be inferred and propagated
-\end{itemize}
-\end{itemize}
-
-\textbf{Example Shift Register:}
-\begin{scala}
-def delay[T <: Data](x: T, n: Int): T =
- if(n == 0) x else Reg(delay(x, n - 1))
-\end{scala}
-where
-\begin{itemize}
-\item The input \verb+x+ is delayed n cycles
-\item \verb+x+ can by of any type that extends from \verb+Data+
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile, shrink]
-\frametitle{Functional Composition}
-
-% \begin{itemize}
-% \item natural
-% \item reusable
-% \item composable
-% \end{itemize}
-% \vskip1cm
-
-\begin{Large}
-\begin{columns}
-
-\column{0.45\textwidth}
-\verb+Map(ins, x => x * y)+ \\
-\begin{center}
-\includegraphics[height=0.6\textheight]{figs/map.pdf} \\[2cm]
-\end{center}
-
-\column{0.45\textwidth}
-\verb+Chain(n, in, x => f(x))+ \\
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/chain.pdf} \\
-\end{center}
-
-\verb+Reduce(data, Max)+ \\
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/reduce.pdf} \\
-\end{center}
-
-
-\end{columns}
-
-\end{Large}
-
-\end{frame}
-
-% \begin{frame}[fragile, shrink]
-% \frametitle{Chain}
-%
-% \begin{columns}
-%
-% \column{0.6\textwidth}
-%
-% \begin{scala}
-% def Chain[T <: Data]
-% (n: Int, in: T, f: T => T): T = {
-% if (n == 1)
-% in
-% else
-% chain(n-1, f(in), f)
-% }
-% \end{scala}
-% usage:
-% \begin{scala}
-% Chain(n, in, x => x + x)
-% \end{scala}
-%
-% \column{0.3\textwidth}
-%
-% \begin{center}
-% \includegraphics[width=0.9\textwidth]{figs/chain.pdf} \\
-% \end{center}
-%
-% \end{columns}
-% \end{frame}
-%
-% \begin{frame}[fragile, shrink]
-% \frametitle{Map}
-%
-% \begin{columns}
-%
-% \column{0.6\textwidth}
-%
-% \begin{scala}
-% def Map[S <: Data, T <: Data]
-% (ins: Seq[T], f: S => T): T
-% \end{scala}
-% usage:
-% \begin{scala}
-% Map(ins, h => Reg(h * Reg(x)))
-% \end{scala}
-%
-% \column{0.3\textwidth}
-%
-% \begin{center}
-% \includegraphics[height=0.7\textheight]{figs/map.pdf} \\
-% \end{center}
-%
-% \end{columns}
-% \end{frame}
-%
-% \begin{frame}[fragile, shrink]{Reduce}
-%
-% \begin{columns}
-%
-% \column{0.6\textwidth}
-%
-% \begin{scala}
-% def Reduce[T <: Data]
-% (ins: Seq[T], f: (T, T) => T): T = {
-% val len = ins.length
-% if (len == 1)
-% ins(0)
-% else
-% f(Reduce(in.slice(0, len/2), f),
-% Reduce(in.slice(len/2, len), f))
-% }
-% \end{scala}
-% usage:
-% \begin{scala}
-% def Max[T <: Num](x: T, y: T) =
-% Mux(x > y, x, y)
-% Reduce(data, Max)
-% \end{scala}
-%
-% \column{0.3\textwidth}
-%
-% \begin{center}
-% \includegraphics[width=0.9\textwidth]{figs/Reduce.pdf} \\
-% \end{center}
-%
-% \end{columns}
-%
-% \end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Generator}
-\begin{footnotesize}
-\begin{scala}
-class Cache(cache_type: Int = DIR_MAPPED,
- associativity: Int = 1,
- line_size: Int = 128,
- cache_depth: Int = 16,
- write_policy: Int = WRITE_THRU
- ) extends Component {
- val io = new Bundle() {
- val cpu = new IoCacheToCPU()
- val mem = new IoCacheToMem().flip()
- }
- val addr_idx_width = log2(cache_depth).toInt
- val addr_off_width = log2(line_size/32).toInt
- val addr_tag_width = 32 - addr_idx_width - addr_off_width - 2
- val log2_assoc = log2(associativity).toInt
- ...
- if (cache_type == DIR_MAPPED)
- ...
-\end{scala}
-\end{footnotesize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{State Elements}
-
-Simplest element is positive edge triggered register:
-\begin{scala}
-val prev_in = Reg(in)
-\end{scala}
-Can assign data input later using wiring
-\begin{scala}
-val pc = Reg(){ UFix(width = 16) }
-pc := pc + UFix(1, 16)
-\end{scala}
-Can quickly define more useful circuits
-\begin{scala}
-def risingEdge(x: Bool) = x && !Reg(x)
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Conditional Updates}
-
-\begin{columns}
-
-\column{0.45\textwidth}
-
-Convenient to specify updates spread across several statements
-\begin{scala}
-val r = Reg() { UFix(width = 16) }
-when (c === UFix(0)) {
- r := r + UFix(1)
-}
-\end{scala}
-or
-{\lstset{frame=shadowbox}
-\begin{scala}
-when (c1) { r := e1 }
-when (c2) { r := e2 }
-\end{scala}
-}
-
-\column{0.45\textwidth}
-
-\shadowbox{
-\includegraphics[width=0.95\textwidth]{figs/condupdates.pdf} }
-
-\end{columns}
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Composition of Conditional Updates}
-
-Nesting
-\begin{scala}
-when (a) { when (b) { body } }
-\end{scala}
-Chaining
-\begin{scala}
-when (c1) { u1 }
-.elsewhen (c2) { u2 }
-.otherwise { ud }
-\end{scala}
-Dynamic Scoping
-\begin{scala}
-def condUpdateR (c: Bool, d: Data) = when (c) { r := d }
-\end{scala}
-\begin{scala}
-when (a) { condUpdateR(b, x) }
-\end{scala}
-\begin{scala}
-when (a) { when (b) { r := x } }
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Symmetry of Conditional Updates}
-
-Regs and Wires
-\begin{scala}
-x := init
-when (isEnable) {
- x := data
-}
-\end{scala}
-
-Vecs and Mems
-\begin{scala}
-when (isEnable) {
- m(addr) := data
-}
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Object Oriented Conditional Updates}
-
-% \begin{scala}
-% class DecoupledIO[T <: Data]()(gen: => T) extends Bundle {
-% val valid = Bool(dir = OUTPUT)
-% val ready = Bool(dir = INPUT)
-% val data = gen.asOutput
-% }
-%
-% class EnqIO[T <: Data]()(gen: => T) extends DecoupledIO[T]()(gen) {
-% def enq(dat: T): T = { valid := Bool(true); data := dat; dat }
-% valid := Bool(false)
-% }
-%
-% class Packet extends Bundle {
-% val header = UFix(width = 8)
-% val body = Bits(width = 64)
-% }
-% \end{scala}
-%
-% example:
-
-\begin{columns}
-\column{0.57\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-val in = (new DeqIo()){ new Packet() }
-val out = (new EnqIo()){ new Packet() }
-when (in.valid && out.ready) {
- out.enq(filter(in.deq()))
-}
-\end{scala}
-
-\vskip5mm
-
-\begin{scala}
-val in = (new DeqIo()){ new Packet() }
-val outs = Vec(4){ new EnqIo()){ new Packet() } }
-val tbl = Mem(4){ UFix(width = 2) }
-when (in.valid) {
- val k = tbl(in.data.header)
- when (outs(k).ready) {
- outs(k).enq(in.deq())
- }
-}
-\end{scala}
-}
-
-\column{0.38\textwidth}
-
-\includegraphics[width=0.99\textwidth]{figs/filter.pdf} \\[20mm]
-\includegraphics[width=0.99\textwidth]{figs/router.pdf}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Component Testing}
-
-% \begin{itemize}
-% \item write tests in Scala
-% \item bind values using dot notation
-% \end{itemize}
-
-\begin{columns}
-\column{0.45\textwidth}
-
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class Mux2IO extends Bundle {
- val sel = Bits(width = 1).asInput
- val in0 = Bits(width = 1).asInput
- val in1 = Bits(width = 1).asInput
- val out = Bits(width = 1).asOutput
-}
-\end{scala}
-}
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/mux2.pdf}
-\end{center}
-
-\column{0.5\textwidth}
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class Mux2Tests extends Iterator[Mux2IO] {
- var i = 0
- val n = pow(2, 3)
- def hasNext = i < n
- def next = {
- val io = new Mux2IO
- val k = Bits(i, width = log2up(n))
- io.sel := k(0)
- io.in0 := k(1)
- io.in1 := k(2)
- io.out := Mux(k(0), k(1), k(2))
- i += 1
- io
- }
-}
-\end{scala}
-}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Chisel Line Count Breakdown}
-
-\begin{columns}
-
-\column{0.3\textwidth}
-
-\begin{itemize}
-\item \verb+~+5200 lines total
-\item Embeds into Scala well
-\end{itemize}
-
-\column{0.7\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/linecount.png}
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}
-\frametitle {Chisel versus Hand-Coded Verilog}
-
-\begin{itemize}
-\item 3-stage RISCV CPU hand-coded in Verilog
-\item Translated to Chisel
-\item Resulted in 3x reduction in lines of code
-\item Most savings in wiring
-\item Lots more savings to go ...
-% \item Chisel-generated Verilog gives comparable synthesis quality of results
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Process Language}
-
-\begin{columns}
-
-\column{0.5\textwidth}
-
-Composeable State Machines
-\begin{scala}
-Do{ ... }
-Exec(c){ a } / Exec{ a }
-Stop
-Skip / Wait(n)
-Seq(a, ...)
-Par(a, ...)
-Alt(c, a1, a2)
-While(c){ a } / Loop{ a }
-\end{scala}
-
-Each process block uses a \verb+when+
-\begin{scala}
-when (io.start) { ... }
-\end{scala}
-to ensure that state updates are updated only when process execute.
-
-\column{0.45\textwidth}
-
-\begin{center}
-\includegraphics[width=0.9\textwidth]{figs/process.pdf} \\
-\end{center}
-
-\end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile, shrink]
-\frametitle{Process Language Example}
-
-\begin{scala}
-class Multiply extends Component {
- val io = new Bundle{
- val start = Bool(INPUT);
- val x = UFix(dir = INPUT, width = 32)
- val y = UFix(dir = INPUT, width = 32)
- val z = UFix(dir = OUTPUT, width = 32)
- val finish = Bool(OUTPUT) }
- val a = Reg(){ UFix(0, 32) }
- val b = Reg(){ UFix(0, 32) }
- val acc = Reg(){ UFix(0, 32) }
- val finish =
- Exec(io.start) {
- Seq(Do{ a := io.x; b := io.y; acc := UFix(0, 32) },
- While(b != UFix(0, 32)) {
- Do{ a := (a << UFix(1))
- b := (b >> UFix(1))
- acc := Mux(b(0) === Bits(1), acc+a, acc) } })
- }
- io.finish := finish
- io.z := acc
-}
-\end{scala}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Transactors and Beyond}
-\begin{columns}
-\column{0.53\textwidth}
-{\lstset{basicstyle={\scriptsize\ttfamily}}
-\begin{scala}
-class Router extends Transactor {
- val n = 2
- val io = new RouterIO(n)
- val tbl = Mem(32){ UFix(width = sizeof(n)) }
- defRule("rd") {
- val cmd = io.reads.deq()
- io.replies.enq(tbl.read(cmd.addr))
- }
- defRule("wr") {
- val cmd = io.writes.deq()
- tbl.write(cmd.addr, cmd.data)
- }
- defRule("rt") {
- val pkt = io.in.deq()
- io.outs(tbl.read(pkt.header)).enq(pkt)
- }
-}
-\end{scala}
-}
-\column{0.42\textwidth}
-\includegraphics[width=0.99\textwidth]{figs/trouter.pdf}
-\end{columns}
-
-\end{frame}
-
-% \begin{frame}{Related Work}
-%
-% \begin{itemize}
-% \item SystemVerilog
-% \begin{itemize}
-% \item Lacks general purpose programming and extensibility
-% \end{itemize}
-% \item Lava
-% \begin{itemize}
-% \item Elegant but focus on spatial layout
-% \end{itemize}
-% \item Domain specific (bluespec + esterel + autoesl)
-% \begin{itemize}
-% \item Powerful but needs to match task at hand
-% \end{itemize}
-% \item Generator language (Genesis2 + spiralFFT)
-% \begin{itemize}
-% \item Either inherit poor abstraction qualities of underlying HDL or
-% \item Do not provide complete solution
-% \end{itemize}
-% \end{itemize}
-%
-% \end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Rocket Microarchitecture}
-\begin{itemize}
-\item 6-stage RISC decoupled integer datapath + 5-stage IEEE FPU + MMU
- and non-blocking caches
-\item Completely written in Chisel
-\end{itemize}
-\includegraphics[width=\textwidth]{figs/rocket-microarchitecture.pdf}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Single Source / Multiple Targets}
-
-\begin{center}
-single source \\
-\includegraphics[width=0.95\textwidth]{../manual/figs/targets.pdf} \\
-multiple targets \
-\end{center}
-
-\end{frame}
-
-
-\begin{frame}[fragile]
-\frametitle{Fast Cycle-Accurate Simulation in C++}
-
-\begin{itemize}
-\item Compiles to single class
-\begin{itemize}
-\item Keep state and top level io in class fields
-\item \verb+clock_lo+ and \verb+clock_hi+ methods
-\end{itemize}
-\item Generates calls to fast multiword library using C++ templates
-\begin{itemize}
-\item specializing for small word cases
-\item remove branching as much as possible to utilize maximum ILP in processor
-\end{itemize}
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Simulator Comparison}
-
-\textbf{Comparison of simulation time when booting Tessellation OS}
-\vskip0.5cm
-
-\begin{footnotesize}
-\begin{tabular}{lrrrrrr}
-\textbf{Simulator} & \textbf{Compile} & \textbf{Compile} & \textbf{Run} & \textbf{Run} & \textbf{Total} & \textbf{Total} \\
-& \textbf{Time (s)} & \textbf{Speedup} & \textbf{Time (s)} & \textbf{Speedup} & \textbf{Time (s)} & \textbf{Speedup} \\
-\hline
-VCS & 22 & 1.000 & 5368 & 1.00 & 5390 & 1.00 \\
-Chisel C++ & 119 & 0.184 & 575 & 9.33 & 694 & 7.77\\
-Virtex-6 & 3660 & 0.006 & 76 & 70.60 & 3736 & 1.44\\
-\end{tabular}
-\end{footnotesize}
-
-
-\end{frame}
-
-\begin{frame}
-\frametitle{Simulation Crossover Points}
-
-% \begin{columns}
-% \begin{tabular}{ll}
-% \textbf{Simulation} & \textbf{Worth it if ...} \\
-% \hline
-% Chisel C++ & millions of cycles \\
-% FPGA & billions of cycles \\
-% \end{tabular}
-%
-% \column{0.55\textwidth}
-
-\begin{center}
-\includegraphics[height=0.8\textheight]{figs/perf.pdf}
-\end{center}
-
-% \end{columns}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Data Parallel Processor Tape Out Results}
-
-\begin{center}
-Completely written in Chisel
-\includegraphics[height=0.7\textheight]{figs/ibm45.png}
-
-\begin{footnotesize}
-The data-parallel processor layout results using IBM 45nm SOI 10-metal layer process using memory compiler generated 6T and 8T SRAM blocks.
-\end{footnotesize}
-\end{center}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Products}
-
-\begin{itemize}
-\item Open source with BSD license
-\begin{itemize}
-\item \verb+chisel.eecs.berkeley.edu+
-\item complete set of documentation
-\item bootcamp / release june 8, 2012
-\end{itemize}
-\item Library of components
-\begin{itemize}
-\item queues, decoders, encoders, popcount, scoreboards, integer ALUs, LFSR, Booth multiplier, iterative divider, ROMs, RAMs, CAMs, TLB, caches, prefetcher, fixed-priority arbiters, round-robin arbiters, IEEE-754/2008 floating-point units
-\end{itemize}
-\item Set of educational processors including:
-\begin{itemize}
-\item microcoded processor, one-stage, two-stage, and five-stage pipelines, and an out-of-order processor, all with accompanying visualizations.
-\end{itemize}
-\end{itemize}
-
-\end{frame}
-
-\begin{frame}[fragile]
-\frametitle{Future}
-
-\begin{itemize}
-\item Automated design space exploration
-\item Insertion of activity counters for power monitors
-\item Automatic fault insertion
-\item Faster and more scalable simulation
-\item More generators
-\item More little languages
-\item Compilation to UCLID
-\end{itemize}
-
-\end{frame}
-
-
-\end{document}
diff --git a/doc/tutorial/tutorial.tex b/doc/tutorial/tutorial.tex
deleted file mode 100644
index 4ddb7a05..00000000
--- a/doc/tutorial/tutorial.tex
+++ /dev/null
@@ -1,2073 +0,0 @@
-\documentclass[twocolumn,10pt]{article}
-\setlength\textwidth{6.875in}
-\setlength\textheight{8.875in}
-% set both margins to 2.5 pc
-\setlength{\oddsidemargin}{-0.1875in}% 1 - (8.5 - 6.875)/2
-\setlength{\evensidemargin}{-0.1875in}
-\setlength{\marginparwidth}{0pc}
-\setlength{\marginparsep}{0pc}%
-\setlength{\topmargin}{0in} \setlength{\headheight}{0pt}
-\setlength{\headsep}{0pt}
-\setlength{\footskip}{37pt}%
-%\setlength{\columnsep}{0.3125in}
-%\setlength{\columnwidth}{3.28125in}% (6.875 - 0.3125)/2 = 3.28125in
-\setlength{\parindent}{1pc}
-\newcommand{\myMargin}{1.00in}
-\usepackage[top=\myMargin, left=\myMargin, right=\myMargin, bottom=\myMargin, nohead]{geometry}
-\usepackage{epsfig,graphicx}
-\usepackage{palatino}
-\usepackage{fancybox}
-\usepackage{url}
-\usepackage[procnames]{listings}
-
-\input{../style/scala.tex}
-
-\lstset{frame=, basicstyle={\footnotesize\ttfamily}}
-
-\newcommand{\todo}[1]{\emph{TODO: #1}}
-\newcommand{\comment}[1]{\emph{Comment: #1}}
-
-% uncomment following for final submission
-\renewcommand{\todo}[1]{}
-\renewcommand{\comment}[1]{}
-
-\newenvironment{commentary}
-{ \vspace{-0.1in}
- \begin{quotation}
- \noindent
- \small \em
- \rule{\linewidth}{1pt}\\
-}
-{
- \end{quotation}
-}
-
-% \newenvironment{kode}%
-% {\footnotesize
-% %\setlength{\parskip}{0pt}
-% %\setlength{\topsep}{0pt}
-% %\setlength{\partopsep}{0pt}
-% \verbatim}
-% {\endverbatim
-% %\vspace*{-0.1in}
-% }
-
-% \newenvironment{kode}%
-% {\VerbatimEnvironment
-% \footnotesize\begin{Sbox}\begin{minipage}{6in}\begin{Verbatim}}%
-% {\end{Verbatim}\end{minipage}\end{Sbox}
-% \setlength{\fboxsep}{8pt}\fbox{\TheSbox}}
-
-% \newenvironment{kode}
-% {\begin{Sbox}
-% \footnotesize
-% \begin{minipage}{6in}
-% %\setlength{\parskip}{0pt}
-% %\setlength{\topsep}{0pt}
-% %\setlength{\partopsep}{0pt}
-% \verbatim}
-% {\endverbatim
-% \end{minipage}
-% \end{Sbox}
-% \fbox{\TheSbox}
-% %\vspace*{-0.1in}
-% }
-
-\title{Chisel 2.2 Tutorial}
-\author{Jonathan Bachrach, Krste Asanovi\'{c}, John Wawrzynek \\
-EECS Department, UC Berkeley\\
-{\tt \{jrb|krste|johnw\}@eecs.berkeley.edu}
-}
-\date{\today}
-
-\newenvironment{example}{\VerbatimEnvironment\begin{footnotesize}\begin{Verbatim}}{\end{Verbatim}\end{footnotesize}}
-\newcommand{\kode}[1]{\begin{footnotesize}{\tt #1}\end{footnotesize}}
-
-\def\code#1{{\tt #1}}
-
-\def\note#1{\noindent{\bf [Note: #1]}}
-%\def\note#1{}
-
-\begin{document}
-\maketitle{}
-
-% TODO: default
-% TODO: enum yields Bits
-% TODO: why hardware construction languages
-
-\section{Introduction}
-
-This document is a tutorial introduction to {\em Chisel} (Constructing
-Hardware In a Scala Embedded Language). Chisel is a hardware
-construction language embedded in the high-level programming language
-Scala. At some point we will provide a proper reference manual, in
-addition to more tutorial examples. In the meantime, this document
-along with a lot of trial and error should set you on your way to
-using Chisel. Chisel is really only a set of special class
-definitions, predefined objects, and usage conventions within Scala,
-so when you write a Chisel program you are actually writing a Scala
-program. However, for the tutorial we don't presume that you
-understand how to program in Scala. We will point out necessary Scala
-features through the Chisel examples we give, and significant hardware
-designs can be completed using only the material contained herein.
-But as you gain experience and want to make your code simpler or more
-reusable, you will find it important to leverage the underlying power
-of the Scala language. We recommend you consult one of the excellent
-Scala books to become more expert in Scala programming.
-
-Chisel is still in its infancy and you are likely to encounter some
-implementation bugs, and perhaps even a few conceptual design
-problems. However, we are actively fixing and improving the language,
-and are open to bug reports and suggestions. Even in its early state,
-we hope Chisel will help designers be more productive in building
-designs that are easy to reuse and maintain.
-
-\begin{commentary}
-Through the tutorial, we format commentary on our design choices as in
-this paragraph. You should be able to skip the commentary sections
-and still fully understand how to use Chisel, but we hope you'll find
-them interesting.
-
-We were motivated to develop a new hardware language by years of
-struggle with existing hardware description languages in our research
-projects and hardware design courses. Verilog and VHDL were developed
-as hardware {\em simulation} languages, and only later did they become
-a basis for hardware {\em synthesis}. Much of the semantics of these
-languages are not appropriate for hardware synthesis and, in fact,
-many constructs are simply not synthesizable. Other constructs are
-non-intuitive in how they map to hardware implementations, or their
-use can accidently lead to highly inefficient hardware structures.
-While it is possible to use a subset of these languages and yield
-acceptable results, they nonetheless present a cluttered and confusing
-specification model, particularly in an instructional setting.
-
-However, our strongest motivation for developing a new hardware
-language is our desire to change the way that electronic system design
-takes place. We believe that it is important to not only teach
-students how to design circuits, but also to teach them how to design
-{\em circuit generators}---programs that automatically generate
-designs from a high-level set of design parameters and constraints.
-Through circuit generators, we hope to leverage the hard work of
-design experts and raise the level of design abstraction for everyone.
-To express flexible and scalable circuit construction, circuit
-generators must employ sophisticated programming techniques to make
-decisions concerning how to best customize their output circuits
-according to high-level parameter values and constraints. While
-Verilog and VHDL include some primitive constructs for programmatic
-circuit generation, they lack the powerful facilities present in
-modern programming languages, such as object-oriented programming,
-type inference, support for functional programming, and reflection.
-
-Instead of building a new hardware design language from scratch, we
-chose to embed hardware construction primitives within an existing
-language. We picked Scala not only because it includes the
-programming features we feel are important for building circuit
-generators, but because it was specifically developed as a base for
-domain-specific languages.
-\end{commentary}
-
-\section{Hardware expressible in Chisel}
-
-% The initial version of Chisel only supports the expression of
-% synchronous RTL (Register-Transfer Level) designs, with a single
-% common clock. Synchronous RTL circuits can be expressed as a
-% hierarchical composition of modules containing combinational logic and
-% clocked state elements. Although Chisel assumes a single global
-% clock, local clock gating logic is automatically generated for every
-% state element in the design to save power.
-% \begin{commentary}
-% Modern hardware designs often include multiple islands of logic, where
-% each island uses a different clock and where islands must correctly
-% communicate across clock island boundaries. Although clock-crossing
-% synchronization circuits are notoriously difficult to design, there
-% are known good solutions for most scenarios, which can be packaged as
-% library elements for use by designers. As a result, most effort in
-% new designs is spent in developing and verifying the functionality
-% within each synchronous island rather than on passing values between
-% islands.
-%
-% In its current form, Chisel can be used to describe each of the
-% synchronous islands individually. Existing tool frameworks can tie
-% together these islands into a complete design. For example, a
-% separate outer simulation framework can be used to model the assembly
-% of islands running together. It should be noted that exhaustive
-% dynamic verification of asynchronous communications is usually
-% impossible and that more formal static approaches are usually
-% necessary.
-% \end{commentary}
-
-This version of Chisel also only supports binary logic, and does not
-support tri-state signals.
-\begin{commentary}
-We focus on binary logic designs as they constitute the vast majority
-of designs in practice. We omit support for tri-state logic in the
-current Chisel language as this is in any case poorly supported by
-industry flows, and difficult to use reliably outside of controlled
-hard macros.
-\end{commentary}
-
-\section{Datatypes in Chisel}
-
-Chisel datatypes are used to specify the type of values held in state
-elements or flowing on wires. While hardware designs ultimately
-operate on vectors of binary digits, other more abstract
-representations for values allow clearer specifications and help the
-tools generate more optimal circuits. In Chisel, a raw collection of
-bits is represented by the \code{Bits} type. Signed and unsigned integers
-are considered subsets of fixed-point numbers and are represented by
-types \code{SInt} and \code{UInt} respectively. Signed fixed-point
-numbers, including integers, are represented using two's-complement
-format. Boolean values are represented as type \code{Bool}. Note
-that these types are distinct from Scala's builtin types such as
-\code{Int}. Additionally, Chisel defines {\em Bundles} for making
-collections of values with named fields (similar to {\em structs} in
-other languages), and {\em Vecs} for indexable collections of
-values. Bundles and Vecs will be covered later.
-
-Constant or literal values are expressed using Scala integers or
-strings passed to constructors for the types:
-\begin{scala}
-UInt(1) // decimal 1-bit lit from Scala Int.
-UInt("ha") // hexadecimal 4-bit lit from string.
-UInt("o12") // octal 4-bit lit from string.
-UInt("b1010") // binary 4-bit lit from string.
-
-SInt(5) // signed decimal 4-bit lit from Scala Int.
-SInt(-8) // negative decimal 4-bit lit from Scala Int.
-UInt(5) // unsigned decimal 3-bit lit from Scala Int.
-
-Bool(true) // Bool lits from Scala lits.
-Bool(false)
-\end{scala}
-
-Underscores can be used as separators in long string literals to aid
-readability, but are ignored when creating the value, e.g.:
-\begin{scala}
-UInt("h_dead_beef") // 32-bit lit of type UInt
-\end{scala}
-
-By default, the Chisel compiler will size each constant to the minimum
-number of bits required to hold the constant, including a sign bit for
-signed types. Bit widths can also be specified explicitly on
-literals, as shown below:
-\begin{scala}
-UInt("ha", 8) // hexadecimal 8-bit lit of type UInt
-UInt("o12", 6) // octal 6-bit lit of type UInt
-UInt("b1010", 12) // binary 12-bit lit of type UInt
-
-SInt(5, 7) // signed decimal 7-bit lit of type SInt
-UInt(5, 8) // unsigned decimal 8-bit lit of type UInt
-\end{scala}
-
-\noindent
-For literals of type \code{UInt}, the value is
-zero-extended to the desired bit width. For literals of type
-\code{SInt}, the value is sign-extended to fill the desired bit width.
-If the given bit width is too small to hold the argument value, then a
-Chisel error is generated.
-
-\begin{commentary}
-We are working on a more concise literal syntax for Chisel using
-symbolic prefix operators, but are stymied by the limitations of Scala
-operator overloading and have not yet settled on a syntax that is
-actually more readable than constructors taking strings.
-
-We have also considered allowing Scala literals to be automatically
-converted to Chisel types, but this can cause type ambiguity and
-requires an additional import.
-
-The SInt and UInt types will also later support an optional exponent
-field to allow Chisel to automatically produce optimized fixed-point
-arithmetic circuits.
-\end{commentary}
-
-\section{Combinational Circuits}
-
-A circuit is represented as a graph of nodes in Chisel. Each node is
-a hardware operator that has zero or more inputs and that drives one
-output. A literal, introduced above, is a degenerate kind of node
-that has no inputs and drives a constant value on its output. One way
-to create and wire together nodes is using textual expressions. For
-example, we could express a simple combinational logic circuit
-using the following expression:
-
-\begin{scala}
-(a & b) | (~c & d)
-\end{scala}
-
-The syntax should look familiar, with \code{\&} and \code{|}
-representing bitwise-AND and -OR respectively, and \code{\~{}}
-representing bitwise-NOT. The names \code{a} through \code{d}
-represent named wires of some (unspecified) width.
-
-Any simple expression can be converted directly into a circuit tree,
-with named wires at the leaves and operators forming the internal
-nodes. The final circuit output of the expression is taken from the
-operator at the root of the tree, in this example, the bitwise-OR.
-
-Simple expressions can build circuits in the shape of trees, but to
-construct circuits in the shape of arbitrary directed acyclic graphs
-(DAGs), we need to describe fan-out. In Chisel, we do this by naming
-a wire that holds a subexpression that we can then reference multiple
-times in subsequent expressions. We name a wire in Chisel by
-declaring a variable. For example, consider the select expression,
-which is used twice in the following multiplexer description:
-\begin{scala}
-val sel = a | b
-val out = (sel & in1) | (~sel & in0)
-\end{scala}
-
-\noindent
-The keyword \code{val} is part of Scala, and is used to name variables
-that have values that won't change. It is used here to name the
-Chisel wire, \code{sel}, holding the output of the first bitwise-OR
-operator so that the output can be used multiple times in the second
-expression.
-
-\section{Builtin Operators}
-
-Chisel defines a set of hardware operators for the builtin types shown
-in Table~\ref{tbl:chisel-operators}.
-\begin{table*}
-\begin{center}
-\begin{tabular}{|l|l|}
-\hline
-Example & Explanation \\
-\hline
-\hline
-\multicolumn{2}{|l|}{Bitwise operators. Valid on SInt, UInt, Bool.} \\
-\hline
-\hline
-\verb!val invertedX = ~x! & Bitwise NOT \\
-\verb!val hiBits = x & UInt("h_ffff_0000") ! & Bitwise AND \\
-\verb!val flagsOut = flagsIn | overflow ! & Bitwise OR \\
-\verb!val flagsOut = flagsIn ^ toggle ! & Bitwise XOR \\
-\hline
-\hline
-\multicolumn{2}{|l|}{Bitwise reductions. Valid on SInt and
- UInt. Returns Bool. } \\
-\hline
-\hline
-\verb!val allSet = andR(x) ! & AND reduction \\
-\verb!val anySet = orR(x) ! & OR reduction \\
-\verb!val parity = xorR(x) ! & XOR reduction \\
-\hline
-\hline
-\multicolumn{2}{|l|}{Equality comparison. Valid on SInt,
-UInt, and Bool. Returns Bool.} \\
-\hline
-\hline
-\verb@val equ = x === y@ & Equality \\
-\verb@val neq = x != y@ & Inequality \\
-\hline
-\hline
-\multicolumn{2}{|l|}{Shifts. Valid on SInt and UInt.} \\
-\hline
-\hline
-\verb@val twoToTheX = SInt(1) << x@ & Logical left shift. \\
-\verb@val hiBits = x >> UInt(16)@ & Right shift (logical on UInt and\&
-arithmetic on SInt). \\
-% \verb@val scaledX = x >>> 3@ & Arithmetic right shift, copies in sign bits. \\
-\hline
-\hline
-\multicolumn{2}{|l|}{Bitfield manipulation. Valid on SInt, UInt, and Bool. } \\
-\hline
-\hline
-\verb@val xLSB = x(0)@ & Extract single bit, LSB has index 0. \\
-\verb@val xTopNibble = x(15,12)@ & Extract bit field from end to start
-bit position. \\
-\verb@val usDebt = Fill(3, UInt("hA"))@ & Replicate a bit string multiple times. \\
-\verb@val float = Cat(sign,exponent,mantissa)@ & Concatenates bit fields, with first argument on left.\\
-\hline
-\hline
-\multicolumn{2}{|l|}{Logical operations. Valid on Bools. } \\
-\hline
-\verb@val sleep = !busy@ & Logical NOT \\
-\verb@val hit = tagMatch && valid @ & Logical AND \\
-\verb@val stall = src1busy || src2busy@ & Logical OR \\
-\verb@val out = Mux(sel, inTrue, inFalse)@ & Two-input mux where sel is a Bool \\ % {\bf Why?} \\
-\hline
-\hline
-\multicolumn{2}{|l|}{Arithmetic operations. Valid on Nums: SInt and UInt. } \\
-\hline
-\verb@val sum = a + b@ & Addition \\
-\verb@val diff = a - b @ & Subtraction \\
-\verb@val prod = a * b @ & Multiplication \\
-\verb@val div = a / b @ & Division \\
-\verb@val mod = a % b @ & Modulus \\
-\hline
-\hline
-\multicolumn{2}{|l|}{Arithmetic comparisons. Valid on Nums: SInt and
- UInt. Returns Bool.} \\
-\hline
-\verb@val gt = a > b@ & Greater than \\
-\verb@val gte = a >= b@ & Greater than or equal \\
-\verb@val lt = a < b@ & Less than \\
-\verb@val lte = a <= b@ & Less than or equal \\
-\hline
-\end{tabular}
-\end{center}
-\caption{Chisel operators on builtin data types.}
-\label{tbl:chisel-operators}
-\end{table*}
-
-\subsection{Bitwidth Inference}
-
-Users are required to set bitwidths of ports and registers, but otherwise,
-bit widths on wires are automatically inferred unless set manually by the user.
-% TODO: how do you set the width explicitly?
-The bit-width inference engine starts from the graph's input ports and
-calculates node output bit widths from their respective input bit widths according to the following set of rules:
-
-\begin{tabular}{ll}
-{\bf operation} & {\bf bit width} \\
-\verb|z = x + y| & \verb|wz = max(wx, wy)| \\
-\verb+z = x - y+ & \verb|wz = max(wx, wy)|\\
-\verb+z = x & y+ & \verb+wz = min(wx, wy)+ \\
-\verb+z = Mux(c, x, y)+ & \verb+wz = max(wx, wy)+ \\
-\verb+z = w * y+ & \verb!wz = wx + wy! \\
-\verb+z = x << n+ & \verb!wz = wx + maxNum(n)! \\
-\verb+z = x >> n+ & \verb+wz = wx - minNum(n)+ \\
-\verb+z = Cat(x, y)+ & \verb!wz = wx + wy! \\
-\verb+z = Fill(n, x)+ & \verb+wz = wx * maxNum(n)+ \\
-% \verb+z = x < y+ & \verb+<= > >= && || != ===+ & \verb+wz = 1+ \\
-\end{tabular}
-
-\noindent
-where for instance $wz$ is the bit width of wire $z$, and the \verb+&+
-rule applies to all bitwise logical operations.
-
-\comment{maxNum and MinNum need to be explained.}
-
-The bit-width inference process continues until no bit width changes.
-Except for right shifts by known constant amounts, the bit-width
-inference rules specify output bit widths that are never smaller than
-the input bit widths, and thus, output bit widths either grow or stay
-the same. Furthermore, the width of a register must be specified by
-the user either explicitly or from the bitwidth of the reset value.
-From these two requirements, we can show that the bit-width inference
-process will converge to a fixpoint.
-
-\begin{commentary}
-Our choice of operator names was constrained by the Scala language.
-We have to use triple equals \code{===} for equality to allow the
-native Scala equals operator to remain usable.
-
-We are also planning to add further operators that constrain bitwidth
-to the larger of the two inputs.
-\end{commentary}
-
-\section{Functional Abstraction}
-
-We can define functions to factor out a repeated piece of logic that
-we later reuse multiple times in a design. For example, we can wrap
-up our earlier example of a simple combinational logic block as
-follows:
-\begin{scala}
-def clb(a: UInt, b: UInt, c: UInt, d: UInt) =
- (a & b) | (~c & d)
-\end{scala}
-
-\noindent
-where \code{clb} is the function which takes \code{a}, \code{b},
-\code{c}, \code{d} as arguments and returns a wire to the output of a
-boolean circuit. The \code{def} keyword is part of Scala and
-introduces a function definition, with each argument followed by a colon then its type,
-and the function return type given after the colon following the
-argument list. The equals (\code{=})
-sign separates the function argument list from the function
-definition.
-
-We can then use the block in another circuit as follows:
-\begin{scala}
-val out = clb(a,b,c,d)
-\end{scala}
-
-% TODO: SHIFTER DONE FUNCTIONAL WITH LOOP
-
-%% Because Scala has powerful type inference, we can in many cases drop
-%% the type declarations on the function:
-%% \begin{scala}
-%% def clb(a, b, c, d) = (a & b) | (~c & d) // No types needed.
-
-%% def bigblock(a: Bool, b: Bool, c: Bool, d: Bool,
-%% f: UInt, g: UInt, h: UInt, i: UInt): Bool =
-%% clb(a, b, c, clb(f,g,h,i)!=0)
-
-%% \end{scala}
-
-%% Here, we use \code{clb} twice. The inner \verb!clb! works with
-%% fixed-point values to calculate the value of an internal node that is
-%% compared with 0 to give a \code{Bool}, while the outer \verb!clb!
-%% works with \code{Bool} values and returns the result of the
-%% function. Scala will perform type inference statically to check
-%% that there are no type errors.
-
-We will later describe many powerful ways to use functions to
-construct hardware using Scala's functional programming support.
-
-\section{Bundles and Vecs}
-
-\code{Bundle} and \code{Vec} are classes that allow the user to expand
-the set of Chisel datatypes with aggregates of other types.
-
-Bundles group together several named fields of potentially different
-types into a coherent unit, much like a \code{struct} in C. Users
-define their own bundles by defining a class as a subclass of
-\code{Bundle}:
-\begin{scala}
-class MyFloat extends Bundle {
- val sign = Bool()
- val exponent = UInt(width = 8)
- val significand = UInt(width = 23)
-}
-
-val x = new MyFloat()
-val xs = x.sign
-\end{scala}
-
-\noindent
-A Scala convention is to capitalize the name of new classes and we
-suggest you follow that convention in Chisel too. The \code{width}
-named parameter to the \code{UInt} constructor specificies the number
-of bits in the type.
-
-Vecs create an indexable vector of elements, and are constructed as
-follows:
-\begin{scala}
-// Vector of 5 23-bit signed integers.
-val myVec = Vec.fill(5){ SInt(width = 23) }
-
-// Connect to one element of vector.
-val reg3 = myVec(3)
-\end{scala}
-
-\noindent
-(Note that we have to specify the type of the \code{Vec} elements
-inside the trailing curly brackets, as we have to pass the bitwidth
-parameter into the \code{SInt} constructor.)
-
-The set of primitive classes
-(\code{SInt}, \code{UInt}, and \code{Bool}) plus the aggregate
-classes (\code{Bundles} and \code{Vec}s) all inherit from a common
-superclass, \code{Data}. Every object that ultimately inherits from
-\code{Data} can be represented as a bit vector in a hardware design.
-
-Bundles and Vecs can be arbitrarily nested to build complex data
-structures:
-\begin{scala}
-class BigBundle extends Bundle {
- // Vector of 5 23-bit signed integers.
- val myVec = Vec.fill(5) { SInt(width = 23) }
- val flag = Bool()
- // Previously defined bundle.
- val f = new MyFloat()
-}
-\end{scala}
-
-\noindent
-Note that the builtin Chisel primitive and aggregate classes do not
-require the \code{new} when creating an instance, whereas new user
-datatypes will. A Scala \code{apply} constructor can be defined so
-that a user datatype also does not require \code{new}, as described in
-Section~\ref{sec:funconstructor}.
-
-\section{Ports}
-
-Ports are used as interfaces to hardware components. A port is simply
-any \code{Data} object that has directions assigned to its members.
-
-Chisel provides port constructors to allow a direction to be added
-(input or output) to an object at construction time. Primitive port
-constructors take the direction as the first
-argument (where the direction is \code{INPUT} or
-\code{OUTPUT}) and the number of bits as the second argument (except
-booleans which are always one bit).
-
-An example port declaration is as follows:
-\begin{scala}
-class Decoupled extends Bundle {
- val ready = Bool(OUTPUT)
- val data = UInt(INPUT, 32)
- val valid = Bool(INPUT)
-}
-\end{scala}
-
-\noindent
-After defining \code{Decoupled}, it becomes a new type that can be
-used as needed for module interfaces or for named collections of
-wires.
-
-The direction of an object can also be assigned at instantation time:
-\begin{scala}
-class ScaleIO extends Bundle {
- val in = new MyFloat().asInput
- val scale = new MyFloat().asInput
- val out = new MyFloat().asOutput
-}
-\end{scala}
-
-\noindent
-The methods \code{asInput} and \code{asOutput} force all modules of
-the data object to the requested direction.
-
-By folding directions into the object declarations, Chisel is able to
-provide powerful wiring constructs described later.
-%% \begin{scala}
-%% class MuxBundle extends Bundle {
-%% val sel = UInt(INPUT, 1)
-%% val in0 = UInt(INPUT, 1)
-%% val in1 = UInt(INPUT, 1)
-%% val out = UInt(OUTPUT, 1)
-%% }
-
-%% class Mux2 extends Module {
-%% val io = new MuxBundle()
-%% io.out := (io.sel & io.in1) | (~io.sel & io.in0)
-%% }
-%% \end{scala}
-
-
-\section{Modules}
-
-Chisel {\em modules} are very similar to Verilog {\em modules} in
-defining a hierarchical structure in the generated circuit.
-%Like functional generators, we can also parameterize the construction of
-%circuits by turning them into object-oriented modules. Unlike
-%functional generators, modules also provide a coarse hierarchy on a
-%circuit and permit a level of generator abstraction that is often
-%useful.
-The hierarchical module namespace is accessible in downstream tools
-to aid in debugging and physical layout. A user-defined module is
-defined as a {\em class} which:
-\begin{itemize}
-\item inherits from \code{Module},
-\item contains an interface stored in a port field named \code{io}, and
-\item wires together subcircuits in its constructor.
-\end{itemize}
-As an example, consider defining your own two-input multiplexer as a
-module:
-\begin{scala}
-class Mux2 extends Module {
- val io = new Bundle{
- val sel = UInt(INPUT, 1)
- val in0 = UInt(INPUT, 1)
- val in1 = UInt(INPUT, 1)
- val out = UInt(OUTPUT, 1)
- }
- io.out := (io.sel & io.in1) | (~io.sel & io.in0)
-}
-\end{scala}
-
-\noindent
-The wiring interface to a module is a collection of ports in the
-form of a \code{Bundle}. The interface to the module is defined
-through a field named \code{io}. For \code{Mux2}, \code{io} is
-defined as a bundle with four fields, one for each multiplexer port.
-
-The \code{:=} assignment operator, used here in the body of the
-definition, is a special operator in Chisel that wires the input of
-left-hand side to the output of the right-hand side.
-
-\subsection{Module Hierarchy}
-
-We can now construct circuit hierarchies, where we build larger modules out
-of smaller sub-modules. For example, we can build a 4-input
-multiplexer module in terms of the \code{Mux2} module by wiring
-together three 2-input multiplexers:
-
-\begin{scala}
-class Mux4 extends Module {
- val io = new Bundle {
- val in0 = UInt(INPUT, 1)
- val in1 = UInt(INPUT, 1)
- val in2 = UInt(INPUT, 1)
- val in3 = UInt(INPUT, 1)
- val sel = UInt(INPUT, 2)
- val out = UInt(OUTPUT, 1)
- }
- val m0 = Module(new Mux2())
- m0.io.sel := io.sel(0)
- m0.io.in0 := io.in0; m0.io.in1 := io.in1
-
- val m1 = Module(new Mux2())
- m1.io.sel := io.sel(0)
- m1.io.in0 := io.in2; m1.io.in1 := io.in3
-
- val m3 = Module(new Mux2())
- m3.io.sel := io.sel(1)
- m3.io.in0 := m0.io.out; m3.io.in1 := m1.io.out
-
- io.out := m3.io.out
-}
-\end{scala}
-
-\noindent
-We again define the module interface as \code{io} and wire up the
-inputs and outputs. In this case, we create three \code{Mux2}
-children modules, using the \code{Module} constructor function and
-the Scala \code{new} keyword to create a
-new object. We then wire them up to one another and to the ports of
-the \code{Mux4} interface.
-
-\section{Running and Testing Examples}
-
-Now that we have defined modules, we will discuss how we actually run and test a circuit. Chisel translates into either \verb@C++@ or Verilog. In order to build a circuit we need to call \code{chiselMain}:
-
-\begin{scala}
-object tutorial {
- def main(args: Array[String]) = {
- chiselMain(args, () => Module(new Mux2()))
- }
-}
-\end{scala}
-
-\begin{figure}
-\begin{center}
-\includegraphics[width=0.45\textwidth]{../tutorial/figs/DUT.pdf}
-\end{center}
-\caption{DUT run using a Tester object in Scala with stdin and stdout connected}
-\label{fig:dut}
-\end{figure}
-
-Testing is a crucial part of circuit design,
-and thus in Chisel we provide a mechanism for
-testing circuits by providing test vectors within Scala using
-subclasses of the \code{Tester} class:
-
-\begin{scala}
-class Tester[T <: Module] (val c: T, val isTrace: Boolean = true) {
- var t: Int
- var ok: Boolean
- val rnd: Random
- def int(x: Boolean): BigInt
- def int(x: Int): BigInt
- def int(x: Bits): BigInt
- def reset(n: Int = 1)
- def step(n: Int): Int
- def pokeAt(data: Mem[T], index: Int, x: BigInt)
- def poke(data: Bits, x: BigInt)
- def poke(data: Aggregate, x: Array[BigInt])
- def peekAt(data: Mem[T], index: Int)
- def peek(data: Bits): BigInt
- def peek(data: Aggregate): Array[BigInt]
- def expect (good: Boolean, msg: String): Boolean
- def expect (data: Bits, target: BigInt): Boolean
-}
-\end{scala}
-
-\noindent
-which binds a tester to a module
-and allows users to write tests using the given debug protocol. In particular, users utilize:
-\begin{itemize}
-\item \code{poke} to set input port and state values,
-\item \code{step} to execute the circuit one time unit,
-\item \code{peek} to read port and state values, and
-\item \code{expect} to compare peeked circuit values to expected arguments.
-\end{itemize}
-
-\noindent
-Users connect tester instances to modules using:
-
-
-\begin{scala}
-object chiselMainTest {
- def apply[T <: Module]
- (args: Array[String], comp: () => T)(
- tester: T => Tester[T]): T
-}
-\end{scala}
-
-\noindent
-When \code{-{-}test} is given as an argument to \code{chiselMainTest}, a
-tester instance runs the Design Under Test (DUT) in a separate
-process with \code{stdin} and \code{stdout} connected so that debug commands can
-be sent to the DUT and responses can be received from the DUT as shown in
-Figure~\ref{fig:dut}.
-\noindent
-
-For example, in the following:
-
-\begin{scala}
-class Mux2Tests(c: Mux2) extends Tester(c) {
- val n = pow(2, 3).toInt
- for (s <- 0 until 2) {
- for (i0 <- 0 until 2) {
- for (i1 <- 0 until 2) {
- poke(c.io.sel, s)
- poke(c.io.in1, i1)
- poke(c.io.in0, i0)
- step(1)
- expect(c.io.out, (if (s == 1) i1 else i0))
- }
- }
- }
-}
-\end{scala}
-
-\noindent
-assignments for each input of \verb+Mux2+ is set to the appropriate values using \verb+poke+. For this particular example, we are testing the \verb+Mux2+ by hardcoding the inputs to some known values and checking if the output corresponds to the known one. To do this, on each iteration we generate appropriate inputs to the module and tell the simulation to assign these values to the inputs of the device we are testing \verb+c+, step the circuit, and test the expected value.
-\comment{Maybe elaborate a little bit what a step does. I assume it is one clock tick
-Is a step needed as well for testing plain combinational circuits?}
-Finally, the following shows how the tester is invoked:
-
-\begin{scala}
-chiselMainTest(args + "--test", () => Module(new Mux2())){
- c => new Mux2Tests(c)
-}
-\end{scala}
-
-Other command arguments are as follows:
-\begin{tabular}{lll}
-\verb+--targetDir+ & target pathname prefix \\
-\verb+--genHarness+ & generate harness file for C++ \\
-\verb+--backend v+ & generate verilog \\
-\verb+--backend c+ & generate C++ (default)\\
-\verb+--vcd+ & enable vcd dumping \\
-\verb+--debug+ & put all wires in class file \\
-\end{tabular}
-
-\comment{What does it mean to generate a harness file?}
-
-\section{State Elements}
-\label{sec:sequential}
-
-% SINGLE CLK and RESET
-
-The simplest form of state element supported by Chisel is a
-positive edge-triggered register, which can be instantiated
-as:
-\begin{scala}
-val reg = Reg(next = in)
-\end{scala}
-
-\noindent
-This circuit has an output that is a copy of the input signal \verb+in+
-delayed by one clock cycle. Note that we do not have to specify the
-type of \verb+Reg+ as it will be automatically inferred from its input
-when instantiated in this way. In the current version of Chisel,
-clock and reset are global signals that are implicity included where
-needed.
-
-Using registers, we can quickly define a number of useful circuit
-constructs. For example, a rising-edge detector that takes a boolean
-signal in and outputs true when the current value is true and the
-previous value is false is given by:
-\begin{scala}
-def risingedge(x: Bool) = x && !Reg(next = x)
-\end{scala}
-
-Counters are an important sequential circuit. To construct an
-up-counter that counts up to a maximum value, \verb+max+, then wraps
-around back to zero (i.e., modulo \verb!max+1!), we write:
-\begin{scala}
-def counter(max: UInt) = {
- val x = Reg(init = UInt(0, max.getWidth))
- x := Mux(x === max, UInt(0), x + UInt(1))
- x
-}
-\end{scala}
-
-\noindent
-The counter register is created in the \verb!counter! function
-with a reset value of \verb!0! (with width large enough to hold \verb+max+),
-to which the register will be initialized when the global reset for the circuit is asserted.
-The \verb!:=! assignment to \verb!x! in \verb!counter! wires an update combinational circuit
-which increments the counter value unless it hits the \verb+max+ at which point it wraps back to zero.
-Note that when \verb!x! appears on the right-hand side of
-an assigment, its output is referenced, whereas when on the left-hand
-side, its input is referenced.
-
-Counters can be used to build a number of useful sequential circuits.
-For example, we can build a pulse generator by outputting true when
-a counter reaches zero:
-\begin{scala}
-// Produce pulse every n cycles.
-def pulse(n: UInt) = counter(n - UInt(1)) === UInt(0)
-\end{scala}
-
-\noindent
-A square-wave generator can then be toggled by the pulse train,
-toggling between true and false on each pulse:
-\begin{scala}[escapechar=@]
-// Flip internal state when input true.
-def toggle(p: Bool) = {
- val x = Reg(init = Bool(false))
- x := Mux(p, !x, x)
- x
-}
-
-// Square wave of a given period.
-def squareWave(period: UInt) = toggle(pulse(period/2))
-\end{scala}
-
-\subsection{Forward Declarations}
-
-Purely combinational circuits cannot have cycles between nodes, and
-Chisel will report an error if such a cycle is detected. Because they
-do not have cycles, combinational circuits can always be constructed
-in a feed-forward manner, by adding new nodes whose inputs are derived
-from nodes that have already been defined. Sequential circuits
-naturally have feedback between nodes, and so it is sometimes
-necessary to reference an output wire before the producing node has
-been defined. Because Scala evaluates program statements
-sequentially, we allow data nodes to serve as a wire providing
-a declaration of a node that can be used immediately, but whose
-input will be set later.
-For example, in a simple CPU, we need to define the \verb!pcPlus4!
-and \verb!brTarget! wires so they can be referenced before defined:
-\begin{scala}
-val pcPlus4 = UInt()
-val brTarget = UInt()
-val pcNext = Mux(io.ctrl.pcSel, brTarget, pcPlus4)
-val pcReg = Reg(next = pcNext, init = UInt(0, 32))
-pcPlus4 := pcReg + UInt(4)
-...
-brTarget := addOut
-\end{scala}
-
-\noindent
-The wiring operator
-\verb!:=! is used to wire up
-the connection after \verb!pcReg! and \verb!addOut! are defined.
-
-\subsection{Conditional Updates}
-
-In our previous examples using registers, we simply wired their inputs
-to combinational logic blocks. When describing the operation of state
-elements, it is often useful to instead specify when updates to the
-registers will occur and to specify these updates spread across
-several separate statements. Chisel provides conditional update rules
-in the form of the \code{when} construct to support this style of
-sequential logic description. For example,
-\begin{scala}
-val r = Reg(UInt(16))
-when (c === UInt(0) ) {
- r := r + UInt(1)
-}
-\end{scala}
-
-\noindent
-where register \code{r} is updated at the end of the current clock
-cycle only if \verb+c+ is zero. The argument to \code{when} is a
-predicate circuit expression that returns a \code{Bool}. The update
-block following \code{when} can only contain update statements using
-the assignment operator \verb+:=+, simple expressions, and named wires
-defined with \code{val}.
-
-In a sequence of conditional updates, the last conditional update
-whose condition is true takes priority. For example,
-\begin{scala}
-when (c1) { r := UInt(1) }
-when (c2) { r := UInt(2) }
-\end{scala}
-
-\noindent
-leads to \code{r} being updated according to the following truth table:
-\begin{center}
-{\small
-\begin{tabular}{|c|c|c|l|}
-\hline
-c1 & c2 & r & \\
-\hline
-0 & 0 & r & r unchanged \\
-0 & 1 & 2 & \\
-1 & 0 & 1 & \\
-1 & 1 & 2& c2 takes precedence over c1 \\
-\hline
-\end{tabular}
-}
-\end{center}
-
-\begin{figure}[h]
-\centering
-\includegraphics[width=3in]{figs/condupdates.pdf}
-\caption{Equivalent hardware constructed for conditional updates.
- Each \code{when} statement adds another level of data mux and ORs
- the predicate into the enable chain. The compiler effectively adds
- the termination values to the end of the chain automatically.}
-\label{fig:condupdates}
-\end{figure}
-
-Figure~\ref{fig:condupdates} shows how each conditional update can be
-viewed as inserting a mux before the input of a register to select
-either the update expression or the previous input according to the
-\code{when} predicate. In addition, the predicate is OR-ed into a
-firing signal that drives the load enable of the register. The
-compiler places initialization values at the beginning of the chain so
-that if no conditional updates fire in a clock cycle, the load enable
-of the register will be deasserted and the register value will not
-change.
-
-Chisel provides some syntactic sugar for other common forms of
-conditional update. The \verb+unless+ construct is the same as
-\verb+when+ but negates its condition. In other words,
-\begin{scala}
-unless (c) { body }
-\end{scala}
-is the same as
-\begin{scala}
-when (!c) { body }
-\end{scala}
-
-% The \verb+otherwise+ construct is the same as \verb+when+ with a true
-% condition. In other words,
-% \begin{scala}
-% otherwise { body }
-% \end{scala}
-%
-% \noindent
-% is the same as
-% \begin{scala}
-% when (Bool(true)) { body }
-% \end{scala}
-
-The update block can target multiple registers, and there can be
-different overlapping subsets of registers present in different update
-blocks. Each register is only affected by conditions in which it
-appears. The same is possible for combinational circuits (update
-of a \code{Wire}). Note that all combinational
-circuits need a default value. For example:
-\begin{scala}
-r := SInt(3); s := SInt(3)
-when (c1) { r := SInt(1); s := SInt(1) }
-when (c2) { r := SInt(2) }
-\end{scala}
-
-\noindent
-leads to \code{r} and \code{s} being updated according to the
-following truth table:
-\begin{scala}
-c1 c2 r s
-0 0 3 3
-0 1 2 3 // r updated in c2 block, s at top level.
-1 0 1 1
-1 1 2 1
-\end{scala}
-
-\begin{commentary}
-We are considering adding a different form of conditional update,
-where only a single update block will take effect. These atomic
-updates are similar to Bluespec guarded atomic actions.
-% TODO: when / .elsewhen / .otherwise
-\end{commentary}
-
-Conditional update constructs can be nested and any given block is
-executed under the conjunction of all outer nesting conditions. For
-example,
-\begin{scala}
-when (a) { when (b) { body } }
-\end{scala}
-
-\noindent
-is the same as:
-\begin{scala}
-when (a && b) { body }
-\end{scala}
-
-Conditionals can be chained together using
-\verb+when+, \verb+.elsewhen+, \verb+.otherwise+ corresponding to
-\verb+if+, \verb+else if+ and \verb+else+ in Scala. For example,
-\begin{scala}
-when (c1) { u1 }
-.elsewhen (c2) { u2 }
-.otherwise { ud }
-\end{scala}
-\noindent
-is the same as:
-\begin{scala}
-when (c1) { u1 }
-when (!c1 && c2) { u2 }
-when (!(c1 || c2)) { ud }
-\end{scala}
-
-We introduce the \code{switch} statement for conditional updates
-involving a series of comparisons against a common key. For example,
-\begin{scala}
-switch(idx) {
- is(v1) { u1 }
- is(v2) { u2 }
-}
-\end{scala}
-
-\noindent
-is equivalent to:
-\begin{scala}
-when (idx === v1) { u1 }
-.elsewhen (idx === v2) { u2 }
-\end{scala}
-
-Chisel also allows a \code{Wire}, i.e., the output of some
-combinational logic, to be the target of conditional update statements
-to allow complex combinational logic expressions to be built
-incrementally. Chisel does not allow a combinational output to be
-incompletely specified and will report an error if an unconditional
-update is not encountered for a combinational output.
-\begin{commentary}
-In Verilog, if a procedural specification of a combinational logic
-block is incomplete, a latch will silently be inferred causing many
-frustrating bugs.
-
-It could be possible to add more analysis to the Chisel compiler, to
-determine if a set of predicates covers all possibilities. But for
-now, we require a single predicate that is always true in the
-chain of conditional updates to a \code{Wire}.
-\end{commentary}
-
-
-\subsection{Finite State Machines}
-
-A common type of sequential circuit used in digital design is a Finite
-State Machine (FSM). An example of a simple FSM is a parity
-generator:
-
-% \begin{scala}
-% class Parity extends Module {
-% val io = new Bundle {
-% val in = Bool(INPUT)
-% val out = Bool(OUTPUT) }
-% val s_even :: s_odd :: Nil = Enum(2, UInt())
-% val state = Reg(init = s_even)
-% switch(state, Array(
-% (s_even, () => { when (io.in) { state := s_odd } }),
-% (s_odd, () => { when (io.in) { state := s_even } }) ))
-% io.out := state === s_odd
-% }
-% \end{scala}
-
-\begin{scala}
-class Parity extends Module {
- val io = new Bundle {
- val in = Bool(dir = INPUT)
- val out = Bool(dir = OUTPUT) }
- val s_even :: s_odd :: Nil = Enum(UInt(), 2)
- val state = Reg(init = s_even)
- when (io.in) {
- when (state === s_even) { state := s_odd }
- when (state === s_odd) { state := s_even }
- }
- io.out := (state === s_odd)
-}
-\end{scala}
-
-\noindent
-where \verb+Enum(UInt(), 2)+ generates two \verb+UInt+ literals and
-where the states are updated when \verb+in+ is true. It is worth
-noting that all of the mechanisms for FSMs are built upon registers,
-wires, and conditional updates.
-
-Below is a more complicated FSM example which is a circuit for
-accepting money for a vending machine:
-\begin{scala}
-class VendingMachine extends Module {
- val io = new Bundle {
- val nickel = Bool(dir = INPUT)
- val dime = Bool(dir = INPUT)
- val rdy = Bool(dir = OUTPUT) }
- val s_idle :: s_5 :: s_10 :: s_15 :: s_ok :: Nil =
- Enum(UInt(), 2)
- val state = Reg(init = s_idle)
- when (state === s_idle) {
- when (io.nickel) { state := s_5 }
- when (io.dime) { state := s_10 }
- }
- when (state === s_5) {
- when (io.nickel) { state := s_10 }
- when (io.dime) { state := s_15 }
- }
- when (state === s_10) {
- when (io.nickel) { state := s_15 }
- when (io.dime) { state := s_ok }
- }
- when (state === s_15) {
- when (io.nickel) { state := s_ok }
- when (io.dime) { state := s_ok }
- }
- when (state === s_ok) {
- state := s_idle
- }
- io.rdy := (state === s_ok)
-}
-\end{scala}
-
-\noindent
-Here is the vending machine FSM defined with \code{switch} statement:
-\begin{scala}
-class VendingMachine extends Module {
- val io = new Bundle {
- val nickel = Bool(dir = INPUT)
- val dime = Bool(dir = INPUT)
- val rdy = Bool(dir = OUTPUT) }
- val s_idle :: s_5 :: s_10 :: s_15 :: s_ok :: Nil = Enum(UFIx(), 5)
- val state = Reg(init = s_idle)
- switch (state) {
- is (s_idle) {
- when (io.nickel) { state := s_5 }
- when (io.dime) { state := s_10 }
- } is (s_5) {
- when (io.nickel) { state := s_10 }
- when (io.dime) { state := s_15 }
- } is (s_10) {
- when (io.nickel) { state := s_15 }
- when (io.dime) { state := s_ok }
- } is (s_15) {
- when (io.nickel) { state := s_ok }
- when (io.dime) { state := s_ok }
- } is (s_ok) {
- state := s_idle
- }
- }
- io.rdy := (state === s_ok)
-}
-\end{scala}
-
-\section{Memories}
-
-Chisel provides facilities for creating both read only and
-read/write memories.
-
-\subsection{ROM}
-
-Users can define read only memories with a \code{Vec}:
-
-\begin{scala}
-Vec(inits: Seq[T])
-Vec(elt0: T, elts: T*)
-\end{scala}
-
-\noindent
-where \verb+inits+ is a sequence of initial \verb+Data+ literals that
-initialize the ROM.
-For example, users can
-create a small ROM initialized to \verb+1, 2, 4, 8+ and
-loop through all values using a counter as an address generator as follows:
-
-\begin{scala}
-val m = Vec(Array(UInt(1), UInt(2), UInt(4), UInt(8)))
-val r = m(counter(UInt(m.length)))
-\end{scala}
-
-\noindent
-We can create an \verb+n+ value sine lookup table using a ROM initialized as follows:
-
-\begin{scala}
-def sinTable (amp: Double, n: Int) = {
- val times =
- Range(0, n, 1).map(i => (i*2*Pi)/(n.toDouble-1) - Pi)
- val inits =
- times.map(t => SInt(round(amp * sin(t)), width = 32))
- Vec(inits)
-}
-def sinWave (amp: Double, n: Int) =
- sinTable(amp, n)(counter(UInt(n))
-\end{scala}
-
-\noindent
-where \verb+amp+ is used to scale the fixpoint values stored in the ROM.
-
-\subsection{Mem}
-
-Memories are given special treatment in Chisel since hardware
-implementations of memory have many variations, e.g., FPGA memories
-are instantiated quite differently from ASIC memories. Chisel defines
-a memory abstraction that can map to either simple Verilog behavioral
-descriptions, or to instances of memory modules that are available
-from external memory generators provided by foundry or IP vendors.
-
-Chisel supports random-access memories via the \code{Mem} construct.
-Writes to Mems are positive-edge-triggered and reads are either
-combinational or positive-edge-triggered.
-
-\begin{scala}
-object Mem {
- def apply[T <: Data](type: T, depth: Int,
- seqRead: Boolean = false): Mem
-}
-
-class Mem[T <: Data](type: T, depth: Int,
- seqRead: Boolean = false)
- extends Updateable {
- def apply(idx: UInt): T
-}
-\end{scala}
-
-Ports into Mems are created by applying a \code{UInt} index. A 32-entry
-register file with one write port and two combinational read ports might be
-expressed as follows:
-
-\begin{scala}
-val rf = Mem(UInt(width = 64), 32)
-when (wen) { rf(waddr) := wdata }
-val dout1 = rf(waddr1)
-val dout2 = rf(waddr2)
-\end{scala}
-
-If the optional parameter \code{seqRead} is set, Chisel will attempt to infer
-sequential read ports when the read address is a Reg. A one-read,
-one-write SRAM might be described as follows:
-
-\begin{scala}
-val ram1r1w =
- Mem(UInt(width = 32), 1024, seqRead = true)
-val reg_raddr = Reg(UInt())
-when (wen) { ram1r1w(waddr) := wdata }
-when (ren) { reg_raddr := raddr }
-val rdata = ram1r1w(reg_raddr)
-\end{scala}
-
-Single-ported SRAMs can be inferred when the read and write conditions are
-mutually exclusive in the same \code{when} chain:
-
-\begin{scala}
-val ram1p =
- Mem(UInt(width = 32), 1024, seqRead = true)
-val reg_raddr = Reg(UInt())
-when (wen) { ram1p(waddr) := wdata }
-.elsewhen (ren) { reg_raddr := raddr }
-val rdata = ram1p(reg_raddr)
-\end{scala}
-
-If the same Mem address is both written and sequentially read on the same clock
-edge, or if a sequential read enable is cleared, then the read data is
-undefined.
-
-Mem also supports write masks for subword writes. A given bit is written if
-the corresponding mask bit is set.
-
-\begin{scala}
-val ram = Mem(UInt(width = 32), 256)
-when (wen) { ram.write(waddr, wdata, wmask) }
-\end{scala}
-
-
-% For example, an
-% audio recorder could be defined as follows:
-%
-% \begin{scala}
-% def audioRecorder(n: Int, button: Bool) = {
-% val addr = counter(UInt(n))
-% val ram = Mem(n)
-% ram(addr) := button
-% ram(Mux(button(), UInt(0), addr))
-% }
-% \end{scala}
-%
-% \noindent
-% where a counter is used as an address generator into a memory.
-% The device records while \verb+button+ is \verb+true+, or plays back when \verb+false+.
-
-
-\section{Interfaces and Bulk Connections}
-\label{sec:interfaces}
-
-For more sophisticated modules it is often useful to define and
-instantiate interface classes while defining module IO. First and
-foremost, interface classes promote reuse allowing users to capture
-once and for all common interfaces in a useful form. Secondly,
-interfaces allow users to dramatically reduce wiring by supporting
-{\em bulk connections} between producer and consumer modules. Finally,
-users can make changes in large interfaces in one place reducing the
-number of updates required when adding or removing pieces of the
-interface.
-
-\subsection{Port Classes, Subclasses, and Nesting}
-
-As we saw earlier, users can define their own interfaces by defining a class that subclasses \verb+Bundle+.
-For example, a user could define a simple link for handshaking data as follows:
-
-\begin{scala}
-class SimpleLink extends Bundle {
- val data = UInt(16, OUTPUT)
- val valid = Bool(OUTPUT)
-}
-\end{scala}
-
-\noindent
-We can then extend \verb+SimpleLink+ by adding parity bits using
-bundle inheritance:
-
-\begin{scala}
-class PLink extends SimpleLink {
- val parity = UInt(5, OUTPUT)
-}
-\end{scala}
-
-\noindent
-In general, users can organize their interfaces into hierarchies using inheritance.
-
-From there we can define a filter interface by nesting two
-\verb+PLink+s into a new \verb+FilterIO+ bundle:
-
-\begin{scala}
-class FilterIO extends Bundle {
- val x = new PLink().flip
- val y = new PLink()
-}
-\end{scala}
-
-\noindent
-where \verb+flip+ recursively changes the ``gender'' of a bundle,
-changing input to output and output to input.
-
-We can now define a filter by defining a filter class extending module:
-
-\begin{scala}
-class Filter extends Module {
- val io = new FilterIO()
- ...
-}
-\end{scala}
-
-\noindent
-where the \verb+io+ field contains \verb+FilterIO+.
-
-\subsection{Bundle Vectors}
-
-Beyond single elements, vectors of elements form richer hierarchical interfaces.
-For example, in order to create a crossbar with a vector of inputs, producing a vector of outputs, and selected by a UInt input,
-we utilize the \verb+Vec+ constructor:
-
-\begin{scala}
-class CrossbarIo(n: Int) extends Bundle {
- val in = Vec.fill(n){ new PLink().flip() }
- val sel = UInt(INPUT, sizeof(n))
- val out = Vec.fill(n){ new PLink() }
-}
-\end{scala}
-
-% \begin{scala}
-% class CrossbarIo(n: Int) extends Bundle {
-% val in = Vec.fill(n){ UInt(w, INPUT) }
-% val sel = Vec.fill(n){ UInt(sizeof(n), INPUT) }
-% val out = Vec.fill(n){ UInt(w, OUTPUT) }
-% }
-% \end{scala}
-
-\noindent
-where \verb+Vec+ takes a size as the first argument and a block returning a port as the second argument.
-
-\subsection{Bulk Connections}
-
-We can now compose two filters into a filter block as follows:
-
-\begin{scala}
-class Block extends Module {
- val io = new FilterIO()
- val f1 = Module(new Filter())
- val f2 = Module(new Filter())
-
- f1.io.x <> io.x
- f1.io.y <> f2.io.x
- f2.io.y <> io.y
-}
-\end{scala}
-
-\noindent
-where \verb+<>+ bulk connects interfaces of opposite gender between
-sibling modules or interfaces of same gender between parent/child modules.
-Bulk connections connect leaf ports of the same name to each other.
-After all connections are made and the circuit is being elaborated,
-Chisel warns users if ports have other than exactly one connection to them.
-
-\subsection{Interface Views}
-
-\begin{figure}
-\centerline{\includegraphics[width=3in]{figs/cpu.png}}
-\caption{Simple CPU involving control and data path submodules and host and memory interfaces.}
-\label{fig:cpu}
-\end{figure}
-
-Consider a simple CPU consisting of control path and data path submodules and host and memory interfaces shown in Figure~\ref{fig:cpu}.
-In this CPU we can see that the control path and data path each connect only to a part of the instruction and data memory interfaces.
-Chisel allows users to do this with partial fulfillment of interfaces.
-A user first defines the complete interface to a ROM and Mem as follows:
-
-\begin{scala}
-class RomIo extends Bundle {
- val isVal = Bool(INPUT)
- val raddr = UInt(INPUT, 32)
- val rdata = UInt(OUTPUT, 32)
-}
-
-class RamIo extends RomIo {
- val isWr = Bool(INPUT)
- val wdata = UInt(INPUT, 32)
-}
-\end{scala}
-
-\noindent
-Now the control path can build an interface in terms of these interfaces:
-
-\begin{scala}
-class CpathIo extends Bundle {
- val imem = RomIo().flip()
- val dmem = RamIo().flip()
- ...
-}
-\end{scala}
-
-\noindent
-and the control and data path modules can be built by partially assigning to
-this interfaces as follows:
-
-\begin{scala}
-class Cpath extends Module {
- val io = new CpathIo();
- ...
- io.imem.isVal := ...;
- io.dmem.isVal := ...;
- io.dmem.isWr := ...;
- ...
-}
-
-class Dpath extends Module {
- val io = new DpathIo();
- ...
- io.imem.raddr := ...;
- io.dmem.raddr := ...;
- io.dmem.wdata := ...;
- ...
-}
-\end{scala}
-
-\noindent
-We can now wire up the CPU using bulk connects as we would with other bundles:
-
-\begin{scala}
-class Cpu extends Module {
- val io = new CpuIo()
- val c = Module(new CtlPath())
- val d = Module(new DatPath())
- c.io.ctl <> d.io.ctl
- c.io.dat <> d.io.dat
- c.io.imem <> io.imem
- d.io.imem <> io.imem
- c.io.dmem <> io.dmem
- d.io.dmem <> io.dmem
- d.io.host <> io.host
-}
-\end{scala}
-
-\noindent
-Repeated bulk connections of partially assigned control and data path interfaces
-completely connect up the CPU interface.
-
-% A Bool can be automatically treated as a single bit UInt (with values
-% 0 or 1), but an Int or UInt cannot be used as a Bool without an
-% explicit cast.
-%
-% Lit(5) // means a constant node with decimal value 5. Bit width will
-% // be inferred automatically if possible
-%
-% A node is a hardware operator that has zero or more inputs and that
-% drives one output. An example of a node with zero inputs is a
-% constant generator.
-%
-% \begin{scala}
-% Lit(10, 4) // means a constant node of type UInt that is 4 bits
-% // wide with decimal 10.
-% Lit(10)
-% LitInt(10, 4)
-% LitUInt(10, 4)
-% Lit(-1,4)
-% \end{scala}
-%
-% can more concisely write:
-%
-% Module correspond to Verilog modules
-% Cell is a sub-module, Chisel Module
-
-\section{Functional Creation of Modules}
-\label{sec:funconstructor}
-
-It is also useful to be able to make a functional interface for
-module construction. For instance, we could build a constructor
-that takes multiplexer inputs as parameters and returns the
-multiplexer output:
-
-\begin{scala}
-object Mux2 {
- def apply (sel: UInt, in0: UInt, in1: UInt) = {
- val m = new Mux2()
- m.io.in0 := in0
- m.io.in1 := in1
- m.io.sel := sel
- m.io.out
- }
-}
-\end{scala}
-
-\noindent
-where \code{object Mux2} creates a Scala singleton object on the \code{Mux2}
-module class, and \code{apply} defines a method for creation of a \code{Mux2} instance.
-%
-With this \code{Mux2} creation function, the specification of \code{Mux4} now is
-significantly simpler.
-
-\begin{scala}
-class Mux4 extends Module {
- val io = new Bundle {
- val in0 = UInt(INPUT, 1)
- val in1 = UInt(INPUT, 1)
- val in2 = UInt(INPUT, 1)
- val in3 = UInt(INPUT, 1)
- val sel = UInt(INPUT, 2)
- val out = UInt(OUTPUT, 1)
- }
- io.out := Mux2(io.sel(1),
- Mux2(io.sel(0), io.in0, io.in1),
- Mux2(io.sel(0), io.in2, io.in3))
-}
-\end{scala}
-
-Selecting inputs is so useful that Chisel builds it in and calls it
-\code{Mux}. However, unlike \code{Mux2} defined above, the builtin version allows any datatype on
-\code{in0} and \code{in1} as long as they have a common super class.
-In Section~\ref{sec:parameterization} we will see how to define this
-ourselves.
-
-Chisel provides \code{MuxCase} which is an n-way \code{Mux}
-\begin{scala}
-MuxCase(default, Array(c1 -> a, c2 -> b, ...))
-\end{scala}
-
-\noindent
-where each condition / value is represented as a tuple in a Scala
-array and where \code{MuxCase} can be translated into the following
-\code{Mux} expression:
-
-\begin{scala}
-Mux(c1, a, Mux(c2, b, Mux(..., default)))
-\end{scala}
-
-\noindent
-Chisel also provides \code{MuxLookup} which is an n-way indexed multiplexer:
-
-\begin{scala}
-MuxLookup(idx, default,
- Array(UInt(0) -> a, UInt(1) -> b, ...))
-\end{scala}
-
-\noindent
-which can be rewritten in terms of:\verb+MuxCase+ as follows:
-
-\begin{scala}
-MuxCase(default,
- Array((idx === UInt(0)) -> a,
- (idx === UInt(1)) -> b, ...))
-\end{scala}
-
-\noindent
-Note that the cases (eg. c1, c2) must be in parentheses.
-
-% TODO: higher order filter
-
-% \Noindent
-% where the overall expression returns the value corresponding to the first condition evaluating to true.
-
-% FUNCTIONAL CREATION
-%
-% want to go from io to constructor
-%
-% \begin{scala}
-% val io = new Bundle{
-% val sel = UInt(INPUT, 1)
-% val in0 = UInt(INPUT, 1)
-% val in1 = UInt(INPUT, 1)
-% val out = UInt(OUTPUT, 1)
-% }
-% def Mux2(sel: UInt, in0: UInt, in0: UInt): UInt = {
-% val m = new Mux2()
-% m.io.wire(Array("sel" => sel, "in0" => in0, "in1" => in1), "out")
-% }
-% \end{scala}
-
-% picture of box in box
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\section{Polymorphism and Parameterization}
-\label{sec:parameterization}
-
-Scala is a strongly typed language and uses parameterized types to specify generic functions and classes.
-In this section, we show how Chisel users can define their own reusable functions and classes using parameterized classes.
-\begin{commentary}
-This section is advanced and can be skipped at first reading.
-\end{commentary}
-
-\subsection{Parameterized Functions}
-
-Earlier we defined \code{Mux2} on \code{Bool}, but now we show how we can define a generic multiplexer function.
-We define this function as taking a boolean condition and con and alt arguments (corresponding to then and else expressions) of type \code{T}:
-
-\begin{scala}
-def Mux[T <: Bits](c: Bool, con: T, alt: T): T { ... }
-\end{scala}
-
-\noindent
-where \code{T} is required to be a subclass of \code{Bits}.
-Scala ensures that in each usage of \code{Mux}, it can find a common superclass of the actual con and alt argument types,
-otherwise it causes a Scala compilation type error.
-For example,
-
-\begin{scala}
-Mux(c, UInt(10), UInt(11))
-\end{scala}
-
-\noindent
-yields a \code{UInt} wire because the \code{con} and \code{alt} arguments are each of type \code{UInt}.
-
-% Earlier we defined \code{Mux2} on \code{Bool}, but now we show how we can define a generic \code{Mux}.
-% We define a function that takes a condition and two functions of no arguments (called thunks) for the {\it then} and {\it else} cases:
-%
-% \begin{scala}
-% def Mux[T <: UInt](c: Bool, con: T, alt: T): T
-% def Mux[T <: UInt](c: Bool)(con: => T)(alt: => T): T
-% \end{scala}
-%
-% \noindent
-% where the two thunk return types are parameterized to be a type \code{T} that is a subclass of \code{UInt}.
-% Scala ensures that it finds a common superclass of the two thunks' return types.
-
-We now present a more advanced example of parameterized functions for defining an inner product FIR digital filter generically over Chisel \code{Num}'s.
-The inner product FIR filter can be mathematically defined as:
-\begin{equation}
-y[t] = \sum_j w_j * x_j[t-j]
-\end{equation}
-
-\noindent
-where $x$ is the input and $w$ is a vector of weights.
-In Chisel this can be defined as:
-
-% MS: just out of curiosity: does this example generate several delay lines?
-\begin{scala}
-def delays[T <: Data](x: T, n: Int): List[T] =
- if (n <= 1) List(x) else x :: Delays(RegNext(x), n-1)
-
-def FIR[T <: Data with Num[T]](ws: Seq[T], x: T): T =
- (ws, Delays(x, ws.length)).zipped.
- map( _ * _ ).reduce( _ + _ )
-\end{scala}
-
-\noindent
-where
-\code{delays} creates a list of incrementally increasing delays of its input and
-\code{reduce} constructs a reduction circuit given a binary combiner function \code{f}.
-In this case, \code{reduce} creates a summation circuit.
-Finally, the \code{FIR} function is constrained to work on inputs of type \code{Num} where Chisel multiplication and addition are defined.
-
-\subsection{Parameterized Classes}
-
-Like parameterized functions, we can also parameterize classes to make them more reusable.
-For instance, we can generalize the Filter class to use any kind of link.
-We do so by parameterizing the \verb+FilterIO+ class and defining the constructor to take a zero argument type constructor function as follow:
-
-\begin{scala}
-class FilterIO[T <: Data](type: T) extends Bundle {
- val x = type.asInput.flip
- val y = type.asOutput
-}
-\end{scala}
-
-\noindent
-We can now define \verb+Filter+ by defining a module class that also takes a link type constructor argument and passes it through to the \verb+FilterIO+ interface constructor:
-
-\begin{scala}
-class Filter[T <: Data](type: T) extends Module {
- val io = new FilterIO(type)
- ...
-}
-\end{scala}
-
-\noindent
-We can now define a \verb+PLink+ based \verb+Filter+ as follows:
-\begin{scala}
-val f = Module(new Filter(new PLink()))
-\end{scala}
-
-\noindent
-where the curly braces \verb+{ }+ denote a zero argument function (aka thunk) that in this case creates the link type.
-
-A generic FIFO could be defined as shown in Figure~\ref{fig:fifo} and
-used as follows:
-
-\begin{scala}
-class DataBundle extends Bundle {
- val A = UInt(width = 32)
- val B = UInt(width = 32)
-}
-
-object FifoDemo {
- def apply () = new Fifo(new DataBundle, 32)
-}
-\end{scala}
-
-\begin{figure}[ht]
-\begin{scala}
-class Fifo[T <: Data] (type: T, n: Int)
- extends Module {
- val io = new Bundle {
- val enq_val = Bool(INPUT)
- val enq_rdy = Bool(OUTPUT)
- val deq_val = Bool(OUTPUT)
- val deq_rdy = Bool(INPUT)
- val enq_dat = type.asInput
- val deq_dat = type.asOutput
- }
- val enq_ptr = Reg(init = UInt(0, sizeof(n)))
- val deq_ptr = Reg(init = UInt(0, sizeof(n)))
- val is_full = Reg(init = Bool(false))
- val do_enq = io.enq_rdy && io.enq_val
- val do_deq = io.deq_rdy && io.deq_val
- val is_empty = !is_full && (enq_ptr === deq_ptr)
- val deq_ptr_inc = deq_ptr + UInt(1)
- val enq_ptr_inc = enq_ptr + UInt(1)
- val is_full_next =
- Mux(do_enq && ~do_deq && (enq_ptr_inc === deq_ptr),
- Bool(true),
- Mux(do_deq && is_full, Bool(false), is_full))
- enq_ptr := Mux(do_enq, enq_ptr_inc, enq_ptr)
- deq_ptr := Mux(do_deq, deq_ptr_inc, deq_ptr)
- is_full := is_full_next
- val ram = Mem(n)
- when (do_enq) {
- ram(enq_ptr) := io.enq_dat
- }
- io.enq_rdy := !is_full
- io.deq_val := !is_empty
- ram(deq_ptr) <> io.deq_dat
-}
-\end{scala}
-\caption{Parameterized FIFO example.}
-\label{fig:fifo}
-\end{figure}
-
-It is also possible to define a generic decoupled interface:
-
-\begin{scala}
-class DecoupledIO[T <: Data](data: T)
- extends Bundle {
- val ready = Bool(INPUT)
- val valid = Bool(OUTPUT)
- val bits = data.clone.asOutput
-}
-\end{scala}
-
-\noindent
-This template can then be used to add a handshaking protocol to any
-set of signals:
-
-\begin{scala}
-class DecoupledDemo
- extends DecoupledIO()( new DataBundle )
-\end{scala}
-
-\noindent
-The FIFO interface in Figure~\ref{fig:fifo} can be now be simplified as
-follows:
-
-\begin{scala}
-class Fifo[T <: Data] (data: T, n: Int)
- extends Module {
- val io = new Bundle {
- val enq = new DecoupledIO( data ).flip()
- val deq = new DecoupledIO( data )
- }
- ...
-}
-\end{scala}
-
-
-\section{Multiple Clock Domains}
-
-Chisel 2.0 introduces support of multiple clock domains.
-
-\subsection{Creating Clock domains}
-
-In order to use multiple clock domains, users must create multiple clocks.
-In Chisel, clocks are first class nodes created with a reset signal parameter and defined as follows:
-
-\begin{scala}
-class Clock (reset: Bool) extends Node {
- def reset: Bool // returns reset pin
-}
-\end{scala}
-
-\noindent
-% Having reset in clock makes it easier to pass around.
-In Chisel there is a builtin implicit clock that state elements use by default:
-
-\begin{scala}
-var implicitClock = new Clock( implicitReset )
-\end{scala}
-
-The clock for state elements and modules can be defined using an additional named parameter called clock:
-
-\begin{scala}
-Reg(... clock: Clock = implicitClock)
-Mem(... clock: Clock = implicitClock)
-Module(... clock: Clock = implicitClock)
-\end{scala}
-
-\subsection{Crossing Clock Domains}
-
-There are two ways that circuits can be defined to send data between clock domains.
-The first and most primitive way is by using a synchronizer circuit comprised of two registers as follows:
-
-\begin{scala}
-// signalA is in clock domain clockA,
-// want a version in clockB as signalB
-val s1 = Reg(init = UInt(0), clock = clockB)
-val s2 = Reg(init = UInt(0), clock = clockB)
-s1 := signalA
-s2 := s1;
-signalB := s2
-\end{scala}
-
-\noindent
-Due to metastability issues, this technique is limited to communicating one bit data between domains.
-
-The second and more general way to send data between domains is by using an asynchronous queue:
-
-\begin{scala}
-class AsyncQueue[T<:Data]
- (gen: T, depth: Int, enq_clk: Clock, deq_clock: Clock)
- extends Module
-\end{scala}
-
-\noindent
-When get a version of signalA from clock domains clockA to clockB by specifying the standard queue parameters and the two clocks and then using the standard decoupled ready/valid signals:
-
-\begin{scala}
-val queue =
- new AsyncQueue(Uint(width = 32), 2, clockA, clockB)
-fifo.enq.bits := signalA
-signalB := fifo.deq.bits
-fifo.valid := condA
-fifo.ready := condB
-...
-\end{scala}
-
-\subsection{Backend Specific Multiple Clock Domains}
-
-Each Chisel backend requires the user to setup up and control multiple clocks in a backend specific manner. For the purposes of showing how to drive a multi clock design, consider the example of hardware with two modules communicating using an AsyncQueue with each module on separate clocks: \verb+fastClock+ and \verb+slowClock+.
-
-\subsubsection{C++}
-
-In the C++ backend, for every clock \verb+i+ there is a
-\begin{itemize}
-\item \verb+uint64_t clk_i+ field representing the clock \verb+i+'s period,
-\item \verb+uint63_t clk_i_cnt+ field representing the clock \verb+i+'s current count,
-\item \verb+clock_lo_i+ and \verb+clock_hi_i+,
-\item \verb+int reset()+ function which ensures that all \verb+clock_lo+ and \verb+clock_hi+ functions are called at least once, and
-\item \verb+int clock(reset)+ function which computes min delta, invokes appropriate \verb+clock_lo+ and \verb+clock_hi+'s and returns min delta used.
-\end{itemize}
-
-\noindent
-In order to set up a C++ simulation, the user
-\begin{itemize}
-\item initializes all period fields to desired period
-\item initializes all count fields to desired phase,
-\item calls \verb+reset+ and then
-\item repeated calls clock to step the simulation.
-\end{itemize}
-
-\noindent
-The following is a C++ example of a main function for the \verb+slowClock+ / \verb+fastClock+ example:
-
-\begin{scala}
-int main(int argc, char** argv) {
- ClkDomainTest_t dut;
- dut.init(1);
- dut.clk = 2;
- dut.clk_cnt = 1;
- dut.fastClock = 4;
- dut.fastClock_cnt = 0;
- dut.slowClock = 6;
- dut.slowClock_cnt = 0;
- for (int i = 0; i < 12; i ++)
- dut.reset();
- for (int i = 0; i < 96; i ++)
- dut.clock(LIT<1>(0));
-}
-\end{scala}
-
-\subsubsection{Verilog}
-
-In Verilog,
-
-\begin{itemize}
-\item Chisel creates a new port for each clock / reset,
-\item Chisel wires all the clocks to the top module, and
-\item the user must create an \verb+always+ block clock driver for every clock \verb+i+.
-\end{itemize}
-
-\noindent
-The following is a Verilog example of a top level harness to drive the \verb+slowClock+ / \verb+fastClock+ example circuit:
-
-\begin{scala}
-module emulator;
- reg fastClock = 0, slowClock = 0,
- resetFast = 1, resetSlow = 1;
- wire [31:0] add, mul, test;
- always #2 fastClock = ~fastClock;
- always #4 slowClock = ~slowClock;
- initial begin
- #8
- resetFast = 0;
- resetSlow = 0;
- #400
- $finish;
- end
- ClkDomainTest dut (
- .fastClock(fastClock),
- .slowClock(slowClock),
- .io_resetFast(resetFast),
- .io_resetSlow(resetSlow),
- .io_add(add), .io_mul(mul), .io_test(test));
-endmodule
-\end{scala}
-
-\noindent
-See \url{http://www.asic-world.com/verilog/verifaq2.html} for more information about simulating clocks in Verilog.
-
-\section{Acknowlegements}
-
-Many people have helped out in the design of Chisel, and we thank them
-for their patience, bravery, and belief in a better way. Many
-Berkeley EECS students in the Isis group gave weekly feedback as the
-design evolved including but not limited to Yunsup Lee, Andrew
-Waterman, Scott Beamer, Chris Celio, etc. Yunsup Lee gave us feedback
-in response to the first RISC-V implementation, called TrainWreck,
-translated from Verilog to Chisel. Andrew Waterman and Yunsup Lee
-helped us get our Verilog backend up and running and Chisel TrainWreck
-running on an FPGA. Brian Richards was the first actual Chisel user,
-first translating (with Huy Vo) John Hauser's FPU Verilog code to
-Chisel, and later implementing generic memory blocks. Brian gave many
-invaluable comments on the design and brought a vast experience in
-hardware design and design tools. Chris Batten shared his fast
-multiword C++ template library that inspired our fast emulation
-library. Huy Vo became our undergraduate research assistant and was
-the first to actually assist in the Chisel implementation. We
-appreciate all the EECS students who participated in the Chisel
-bootcamp and proposed and worked on hardware design projects all of
-which pushed the Chisel envelope. We appreciate the work that James
-Martin and Alex Williams did in writing and translating network and
-memory controllers and non-blocking caches. Finally, Chisel's
-functional programming and bit-width inference ideas were inspired by
-earlier work on a hardware description language called Gel~\cite{gel} designed in
-collaboration with Dany Qumsiyeh and Mark Tobenkin.
-
-% \note{Who else?}
-
-\begin{thebibliography}{50}
-\bibitem{chisel-dac12} Bachrach, J., Vo, H., Richards, B., Lee, Y., Waterman,
- A., Avi\v{z}ienis, Wawrzynek, J., Asanovi\'{c} \textsl{Chisel:
- Constructing Hardware in a Scala Embedded Language}.
-in DAC '12.
-\bibitem{gel} Bachrach, J., Qumsiyeh, D., Tobenkin, M. \textsl{Hardware Scripting in Gel}.
-in Field-Programmable Custom Computing Machines, 2008. FCCM '08. 16th.
-\end{thebibliography}
-
-\end{document}
diff --git a/install_maven_libs b/install_maven_libs
deleted file mode 100755
index 849eb8ee..00000000
--- a/install_maven_libs
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/bash
-pushd lib
-
-mvn install:install-file -Dfile=oscar-algo_2.10-1.0-M1.jar -DgroupId=ucl.ac.be -DartifactId=oscar-algo -Dversion=2.10-1.0-M1 -Dpackaging=jar
-mvn install:install-file -Dfile=oscar-cp_2.10-1.0-M1.jar -DgroupId=ucl.ac.be -DartifactId=oscar-cp -Dversion=2.10-1.0-M1 -Dpackaging=jar
-mvn install:install-file -Dfile=oscar-util_2.10-1.0-M1.jar -DgroupId=ucl.ac.be -DartifactId=oscar-util -Dversion=2.10-1.0-M1 -Dpackaging=jar
-mvn install:install-file -Dfile=oscar-visual_2.10-1.0-M1.jar -DgroupId=ucl.ac.be -DartifactId=oscar-visual -Dversion=2.10-1.0-M1 -Dpackaging=jar
-
-popd
diff --git a/man.mk b/man.mk
new file mode 100644
index 00000000..be0a296e
--- /dev/null
+++ b/man.mk
@@ -0,0 +1,19 @@
+# make fragment to build man pages.
+
+LATEX2MAN := latex2man
+MAN_PAGES := chisel.man
+
+# Set the current release info
+# RELEASE_TAGTEXT is something like: v2.2.18 125 g3501d7f
+# i.e., the output of git describe with dashes replaced by spaces
+RELEASE_TAGTEXT=$(subst -, ,$(shell git describe --tags release))
+RELEASE_TAG=$(firstword $(RELEASE_TAGTEXT))
+RELEASE_DATETEXT=$(shell git log -1 --format="%ai" $(RELEASE_TAG))
+RELEASE_DATE=$(firstword $(RELEASE_DATETEXT))
+
+all: $(MAN_PAGES)
+
+%.man: %.mtt
+ sed -e "s/@VERSION@/$(RELEASE_TAG)/" -e "s/@DATE@/$(RELEASE_DATE)/" $(notdir $<) > $(basename $@).ttex ;\
+ latex2man $(basename $@).ttex $@
+
diff --git a/pom.xml b/pom.xml
deleted file mode 100644
index 3384db01..00000000
--- a/pom.xml
+++ /dev/null
@@ -1,147 +0,0 @@
-
-
-
- 4.0.0
-
- edu.berkeley.eecs
- chisel
- 2.3-SNAPSHOT
- Chisel HDL
- Chisel HDL DSL based in Scala.
-
-
-
- org.scala-lang
- scala-library
- 2.10.3
-
-
-
- ucl.ac.be
- oscar-algo
- 2.10-1.0-M1
-
-
-
- ucl.ac.be
- oscar-cp
- 2.10-1.0-M1
-
-
-
- ucl.ac.be
- oscar-util
- 2.10-1.0-M1
-
-
-
- ucl.ac.be
- oscar-visual
- 2.10-1.0-M1
-
-
-
- junit
- junit
- 4.11
- test
-
-
-
- org.scalatest
- scalatest_2.10
- 2.0.RC2
- test
-
-
-
-
-
-
-
-
- net.alchim31.maven
- scala-maven-plugin
- 3.1.6
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 2.0.2
-
-
-
-
-
-
-
-
- net.alchim31.maven
- scala-maven-plugin
-
-
- scala-compile-first
- process-resources
-
- add-source
- compile
-
-
-
- scala-test-compile
- process-test-resources
-
- testCompile
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
-
- compile
-
- compile
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- **/*Suite.class
-
-
-
-
-
-
-
-
-
-
- skip
-
- true
-
-
-
-
-
- ignore
-
- true
- true
-
-
-
-
-
diff --git a/project/build.properties b/project/build.properties
index 748703f7..c091b86c 100644
--- a/project/build.properties
+++ b/project/build.properties
@@ -1 +1 @@
-sbt.version=0.13.7
+sbt.version=0.13.16
diff --git a/project/build.scala b/project/build.scala
deleted file mode 100644
index aaf1bfca..00000000
--- a/project/build.scala
+++ /dev/null
@@ -1,78 +0,0 @@
-import sbt._
-import Keys._
-
-object BuildSettings extends Build {
-
- val buildSettings = Defaults.defaultSettings ++ Seq (
- organization := "edu.berkeley.cs",
- // version := "2.2.26",
- version := "2.3-SNAPSHOT",
- name := "chisel",
- scalaVersion := "2.10.4",
- crossScalaVersions := Seq("2.10.4", "2.11.5"),
- //sourceDirectory := new File("@srcTop@"),
- publishMavenStyle := true,
- publishArtifact in Test := false,
- pomIncludeRepository := { x => false },
- pomExtra := (
-
http://chisel.eecs.berkeley.edu/
-
-
- BSD-style
- http://www.opensource.org/licenses/bsd-license.php
- repo
-
-
-
- https://github.com/ucb-bar/chisel.git
- scm:git:github.com/ucb-bar/chisel.git
-
-
-
- jackbackrack
- Jonathan Bachrach
- http://people.csail.mit.edu/jrb/
-
-
- huytbvo
- Huy Vo
-
-
- ),
-
- publishTo <<= version { v: String =>
- val nexus = "https://oss.sonatype.org/"
- if (v.trim.endsWith("SNAPSHOT"))
- Some("snapshots" at nexus + "content/repositories/snapshots")
- else
- Some("releases" at nexus + "service/local/staging/deploy/maven2")
- },
-
- resolvers ++= Seq(
- "Sonatype Snapshots" at "http://oss.sonatype.org/content/repositories/snapshots",
- "Sonatype Releases" at "http://oss.sonatype.org/content/repositories/releases"
- ),
-
- /* Bumping "com.novocode" % "junit-interface" % "0.11", causes DelayTest testSeqReadBundle to fail
- * in subtly disturbing ways on Linux (but not on Mac):
- * - some fields in the generated .h file are re-named,
- * - an additional field is added
- * - the generated .cpp file has additional differences:
- * - different temps in clock_lo
- * - missing assignments
- * - change of assignment order
- * - use of "Tx" vs. "Tx.values"
- */
- libraryDependencies += "com.novocode" % "junit-interface" % "0.10" % "test",
- libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.4" % "test",
- libraryDependencies <+= (scalaVersion)("org.scala-lang" % "scala-reflect" % _),
-
- // Execute tests in the current project serially.
- // Tests from other projects may still run concurrently.
- parallelExecution in Test := false,
- scalacOptions ++= Seq("-deprecation", "-feature", "-language:reflectiveCalls", "-language:implicitConversions", "-language:existentials")
- ) ++ org.scalastyle.sbt.ScalastylePlugin.Settings
-
- lazy val root = Project("chisel", file("."), settings=buildSettings)
-}
-
diff --git a/project/plugins.sbt b/project/plugins.sbt
index 2aa5113c..daa639b3 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -2,9 +2,8 @@ resolvers += Resolver.url("scalasbt", new URL("http://scalasbt.artifactoryonline
resolvers += Classpaths.sbtPluginReleases
-addSbtPlugin("com.typesafe.sbt" % "sbt-pgp" % "0.8")
+addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "0.8.0")
-addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "0.3.2")
-
-addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.0.4")
+addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.3.5")
+addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.6.1")
diff --git a/scalastyle-config.xml b/scalastyle-config.xml
index bc9620e4..a2fad84b 100644
--- a/scalastyle-config.xml
+++ b/scalastyle-config.xml
@@ -9,7 +9,7 @@