# What is this?

This is Project Shodan, a project to research the fusion of novel hardware and
software architectures to produce a low-power, ambient AI core. For more
information, see our internal site at
[sites/cerebrahardware/shodan](https://sites.google.com/corp/google.com/cerebrahardware/shodan).

## Developing in this Codebase

We've stored our code in Gerrit, and like the Android developers before us, we
use `repo` to manage the projects in our Gerrit repositories.

To get started, first make sure you have a Git login for all our projects
by going to [googlesource.com/new-password](https://www.googlesource.com/new-password)
and pasting the provided script into a terminal.

Now you need to pull down a copy of the `repo`
tool from our public facing sites and add it to your path:

```bash
mkdir -p bin
export PATH=$PATH:$HOME/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
```

Make sure you've initialized git with your name and email address, and have
configured it properly for fetching the sources:

```bash
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
```

Once you've done this, you're actually ready to check out the sources. Make a
new directory where you'd like it to live, and initialize `repo` with the
current release branch.

```bash
repo init -u https://spacebeaker.googlesource.com/shodan/manifest -g default,internal
repo sync -j$(nproc)
```

## System Setup for Development

Development for shodan requires that the necessary tools and prerequisites be
installed.

To setup the build system:

```bash
source build/setup.sh
```

Install the prerequisites:

```bash
m prereqs
```

Install the RISCV toolchain:

```bash
m tools
```

Install the instruction set simulator:

```bash
m sim
```

## Day-to-day Development Workflow

In general, working with repo is relatively simple:

  1. Create a working topic branch to make changes on with `repo start
     ${TOPICNAME}`
  2. Make your changes to the files. Add them with `git add -A` and commit with
     `git commit`.
  3. Upload your changes with `repo upload --re ${REVIEWER} --cc ${CC_LIST}`
  4. Go to the URL repo spits out to read and reply to comments.
  5. Eventually your reviewer will give you a +2 LGTM on your change. To submit,
     click the "SUBMIT" button on the change in the web interface.
  6. Run `repo sync -j$(nproc)` to update.
  7. Run `repo prune` to remove your topic branch.

For more information on how to use repo and git effectively, take a look at the
[official documentation](https://source.android.com/setup/create/coding-tasks).

### How to sync my local copy with latest?

```bash
repo sync -j$(nproc)
```

Then if you have any outstanding branches, a `repo rebase` will help.

### How to send code for review?

To upload a branch to gerrit for review, do this:

```bash
repo upload --re reviewer1,reviewer2 --cc email@host.com,email2@host2.com
```

Reviewers can be specified as usernames or full email addresses, likewise for
`--cc`.

Repo will then output a URL for you to visit that allows you to make comments
and abandon and merge the changes into the repository. To make changes during
the review process, make your changes to the files, then:

```bash
git add -A                                    # To add the files you've changed
git commit --amend                            # To update the previous change
repo upload -t --re ${REVIEWER} --cc ${CC_LIST} # To upload the change to Gerrit for review
```

## Repository Layout

Our layout is pretty simple:

### hw/

Contains all of the source code and RTL required to build the Shodan
hardware, as well as simulate it in Verilator.

### build/

Contains build scripts for the whole tree. This is effectively just an
orchestration layer to make building the whole shebang easier. Each subtree may
have its own build systems and have their own ways of building.

### cache/

The cached cross-compilation toolchain, including rust and RISC-V GCC/LLVM
toolchain.

### cicd/

Contains continuous integration scripts and tooling for Jenkins, our CI/CD tool.

### docs/

Lots of extra documentation (we hope) about how the repo is laid out, how the
build system works, code reviews, licensing, etc.

### manifest/

The repo manifest used to glue all the git repositories together.

### scripts/

Contains utility scripts to help automate a few things.

### sim/

Contains tools and src for simulation of the shodan hw.

### toolchain/

Contains the src to build the RISCV QEMU emulator, and
[IREE](https://github/com/google/iree) toolchain for ML models.

## Start a simulation

The simulator used for Shodan is [Renode](https://renode.io/).
After building and installing the simulator it can be run
by using the alias `renode`.

This alias is equivalent to the command:

```bash
mono cache/renode/Renode.exe
```

The configuration for the Shodan SoC is `sim/config/shodan.repl`,
and an example of running zephyr on Shodan can be run as below:

```bash
include @sim/config/shodan_zephyr.resc
start
```

## Build and test ML artifacts

The ML executable is built with [IREE](https://github.com/google/iree) workflow,
targeted to RISCV 32-bit bare-metal config.

To retrieve the IREE RISC-V toolchain and Renode emulator:

```bash
m tools
```

To build the IREE targets:

```bash
m iree
```

The IREE compiler sits in `out/host/iree_compiler`, while the runtime library/example
sits in `out/springbok_iree`.
To run the toy example (four-element vector element-wise multiplication) for
testing:

```bash
sim_springbok out/springbok_iree/iree/iree/samples/simple_embedding/simple_embedding_embedded_sync
```

The output should be shown as:

```bash
(machine-0) 18:05:23.6463 [INFO] cpu2: simprint: "simple_embedding done", 0 (0x0)
18:05:23.6475 [INFO] cpu2: simprint: "main returned: ", 0 (0x0)
```

(Enter quit to exit the Renode simulation)

## More Information

- [Information on how to use repo](https://go/repo)
