MARCO GSRC Calibrating Achievable Design: Bookshelf

Capo: a large-scale fixed-die Floorplacer

Saurabh Adya, Andrew Caldwell, Andrew B. Kahng, Igor Markov, and Jarrod Roy

Last updated: Sun Oct 9, 2005 by royj


Capo is a fast and high-quality routability-driven placer for standard-cell ASICs developed at UCLA and the University of Michigan. Global placement is performed with recursive bisection using leading-edge multi-level partitioner. Detailed placement is performed with optimal branch-and-bound partitioner and placer. Capo reads the industry-standard LEF/DEF format (and also a simplified format for academic researchers, see more ) and works in the fixed-die context. Capo favorably compares with commercial tools and is available, with all support libraries, under a liberal open-source license.

Source code and executables

Complete source code for Capo in C++ is distributed as a part of UCLA/UMich PD tools release. Currently, the installation scripts target Unix systems (Linux and Solaris) and require PERL 5.002 or higher. The code requires g++ 2.95.2 or higher (configured to use GNU linker) or SunPro CC 5.1 or higher (Workshop 5.0 and earlier are not supported) that come with Sun Forte C++ (formerly Workshop). In order to use Sun compilers, you must have Solaris 2.7 or higher. The code can also be compiled with MSVC++ 7.0, but installation can be non-trivial without the .NET environment.

Executables are provided for the following systems: (Sun Solaris) (Intel Linux) (Win95/98/NT)
These executables are of "MetaPlacer" that includes Capo, orientation optimizer and "row ironing" that improves wirelength by applying a branch-and-bound placer in sliding windows. By default neither orientation improver nor row ironing are invoked.

Command-line options

The main two command-line options are -help and -f filename.aux, where filename.aux has one line of the form
RowBasedPlacement : test.nodes test.nets test.wts test.scl
LEFDEF : file.lef file.def
LEFDEFq : file.lef file.def
these correspond to the input in the "bookshelf" format and the industry-standard LEF/DEF format (LEFDEFq will turn on Cadence's LEFDEF parsers). Multiple LEF files are now supported.

Additionally, the following options may be useful:
-save --- causes the output to be saved into files with base out,
-plotNodes basefilename --- saves a gnuplot script that plots cells and macros,
-verb X_Y_Z --- where X, Y and Z are integers, controls the verbosity of diagnostic output (-verb silent is equivalent to -verb 0_0_0),
-faster N and -tryHarder N --- control the quality/runtime tradeoff in Capo; N is an integer, but can be skipped. -unifWS --- distribute whitespace (approximately) uniformly; this option currently leads to best results by routed wirelength.
Numerous other options are available (and listed when Capo/MetaPlacer is launched with -help). Also see recent options.

Data formats and benchmarks

See the Placement Slot and follow links to "old" (i.e., no-XML) formats. Alternatively, follow these links: 1 and 2.
As Capo is a Floorplacer, it can also natively read the blocks/pl/nets format of floorplanning.
For more information on using Capo as a floorplanner, read the following FAQ.
Recommendation: browse a sample benchmark before reading formal descriptions.

Features and limitations

Capo can run on many recent industrial circuits with movable cells of potentially variying widths, pre-routed power and ground nets, fixed and movable macros, etc. A 64-bit version of Capo placed netlists with over 4 million movable objects.

Performance results

Recent performance results are available in this up-coming paper

Documentation and support

Here's our documentation and support advisory.
User groups, mailing lists and FAQs are maintained at and
Algorithms used in Capo are described in a series of publications (please cite some of them if you are using Capo in your work).

Back to the Placement Slot,,