Truss: A user-friendly platform for industrial-scale EDA research

Truss provides a functionality layer and static timing engine for OpenAccess, similar in concept to those in OpenAccess Gear, except faster and simpler. The goal is to both be user-friendly and scale to industrial size designs. This white paper describes some of the problems with OA Gear that are fixed in Truss.

Truss also provides a few Tcl bindings, which are useful for quickly trying out some optimizations with the static timer.

set timer [truss::create_timer -design $top -sdc {
    set_input_delay -rise .10 [all_inputs]
    set_input_delay -min -fall .15 G0
}]

foreachOA term [oa::getTerms $occ] {
    puts [$timer getArr -obj $term]
}

Dependencies

Most dependencies should already be satisfied in a recent Linux system, and you probably already have OpenAccess if you've stumbled upon this page. I have not tested against the "debug" version of the OpenAccess libraries, because they are enormous and I don't plan on fixing bugs in OpenAccess.

FYI, I run Debian stable: if your toolchain is older than mine and you do not have root access on your machine, I pity you.

Quick Start

Compilation

  1. Install the dependencies. The Liberty parser's make install doesn't copy si2dr_liberty.h, so you need to copy that to the destination yourself.
  2. Edit config.mk so that the dependency paths are correct. OpenAccess is a bit strange in that the script oaGetLibPath picks up a few environment variables, so you need to make sure that variables such as OA_MODE and OA_BIT are set properly.
  3. make -j2
  4. Optional: pushd testprogs; make -j2; popd
  5. ???
  6. Profit!

Use

For the functionality layer, you need to first annotate the OpenAccess design library using the following Tcl code:

lappend auto_path $trusslibdir
package require truss
truss::annotate_lib -lib $lib -view abstract -liberty $liberty

OpenAccess (and OpenAccess Gear) use a kludge called "equivalent nets" to support Verilog assign statements. There isn't a clean way to support them in Truss, because they can be modified without Truss seeing the change. Therefore, equivalences are completely ignored in Truss, and you may want to merge equivalent nets as follows:

truss::mergeEquivs $top

Download: truss-0.1.tar.gz