# Build Instructions

##### Based on [openroad build instructions](https://github.com/The-OpenROAD-Project/alpha-release/tree/master/build) with addition of opendp, opensta and original yosys and some modifications to the dockerfiles and the makefile.

The goal of these instructions is to build a single image that contains all the openroad tools used by openlane.
This is done through three stages.

1. Building
2. Exporting
3. Merging

### Note

The repo already provides a snapshot of the tarballs which are generated by going through steps 1 and 2, so you can jump to 3 if we wish to save time building the tools.

## Building

The following make target iteratively builds each tool in a separate docker image (i.e. one docker image per tool).

```bash
make build-all
```

## Exporting

Then we export the binaries generated by each tool's image to tarballs in `tar` directory.

```plain
make export-all
```

## Merging

Finally, we merge all the tools in a single docker image.

```bash
make merge
```

## Additional information 

### Building and exporting a specific tool

You can choose to build a specific tool by running:

```bash
make build-<tool>
```

And exporting it by running:

```bash
make export-<tool>
```

The following are the available tools:

```bash
replace ioplacer opendp route fastroute opensta yosys tapcell magic resizer addspacers
```

### Rebuilding
If you wish to update the *all* the tools, you should first remove the generated tarballs:

```bash
rm tar/*
```

Following that, go through steps 1-3 to generate and update docker image.

You may also want to update a single or multiple tools which an be done as follows:

```bash
rm tar/<tool1>.tar.gz 
rm tar/<tool2>.tar.gz 
.
.
rm tar/openroad_tools.tar.gz tar/openLANE_flow.tar.gz

make build-<tool1> DOCKER_BUILD_OPTS=--no-cache
make export-<tool1>

make build-<tool2> DOCKER_BUILD_OPTS=--no-cache
make export-<tool2>
.
.

make merge
```

This should you remove the existing tarballs. Then, build and export specific tool(s).



