# 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](https://sites.google.com/corp/google.com/cerebrahardware/projects/current-projects/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 --no-use-superproject
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
```

For non-gLinux systems: Add the bazel apt repository to your machines sources.
Instructions @ https://bazel.build/install/ubuntu#add-dis-uri

Install the prerequisites:

```bash
m prereqs
```

Install the tools used for development:

```bash
m tools -j$(nproc)
```

## 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).

### A Note on Code Review Policies

In the Shodan project, we follow a "sticky +2" policy.

What this means is that you *must* get a +2 Code Review from a peer, or a TL.
Gerrit will automatically pass any +2 Code Review scores you receive when you
upload a patchset with minor changes. This policy is in place so that we can
quickly get through code review and get our code submitted without requiring
lots of round-trips with your reviewers.

If you change significant parts of the CL post-+2, please ask for additional
review from your peers in a reply. Note: two +1s does *not* count as a +2!

You can't self-+2 your own CL, no matter the urgency or how simple the
change is! This policy ensures the code change is peer reviewed, and prevent us
from getting in trouble with security/compliance. If you don't know who to send
a CL to, put one of the TLs on the review list, and they'll redirect it
appropriately, or review your change.

As a reviewer, please use good judgement to help the team keep the good
momentum: If you provide a +1 score, please note in your comment who should
provide the +2; if your comments are minor changes about style, format, etc.,
and not related to the functionality of the code, please provide +2 so the code
owner can address the comments and submit the code without further review.

### Who are the TLs?

At the time of this writing, the TLs are:

Cindy Liu <hcindyl@>
June Tate-Gans <jtgans@>
Bangfei Pan <pbf@>
Steve Xu <stevexu@>

Finally, if you can't get one of the above people, please put Kai Yick
<kingkai@> on the review line.

*Special note if you're listed above*: you still must get your +2 from someone
else -- we need the TLs to lead by example and demonstrate the appropriate
behavior.

### 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
```

### Help! I'm on a limited-bandwidth connection, and need to stop downloading tooling!

There's an environment variable you can set called `PIN_TOOLCHAINS` to prevent
download attempts for various toolchains in the system. The format is a
space-delimited list of words that includes which toolchains you wish to prevent
downloading automatically during a build.

At the moment, this environment variable can be set to any of the following
words:

  `renode` - prevents downloading of the latest Renode binary build.

  `iree`   - prevents downloading of the latest IREE compiler toolchain.

Ie:

```bash
export PIN_TOOLCHAINS="renode iree"
```

*Note well*: if you set this variable, the output or behavior of any of the
preceding toolchains may be bad or incorrect. Please do not file bugs against
these components if you have this variable set!

### Help! IREE, Renode, or another toolchain is misbehaving!

Did you set `PIN_TOOLCHAINS`? If so, please unset this environment variable and
retry your build.

## Repository Layout

Our layout is pretty simple:

### 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.

### hw/

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

#### opentitan

Security core.

#### ibex

System management controller (SMC).

#### springbok

Vector core for ML acceleration.

### kata/

Operating system software for the SMC; including seL4 kernel & CAmkES framework,
and custom CAmkES components that support Shodan (or maybe KataOS) applications.

### 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 simulators (Renode and Verilator) of the shodan system.

### sw/

Contains the source code of applications running in all shodan cores.

#### libtock-rs

**TODO**: add more details

#### multihart_boot_rom

Bootstrap for System Management Controller, Security Core, and Vector Core. This
is the first software to run after reset; it does low-level hardware setup and
starts TockOs (SC) and seL4 (SMC).

#### pigweed

pigweed frameworks. Currently it is used for vector core functional tests.

#### tock

The operating system running on the Security Core.

#### vec

Springbok BSP, as well as the RVV instruction functional tests.

#### vec_iree

Springbok IREE application. It builds IREE runtime applications for ML models
using IREE libraries and Spingbok BSP.

### toolchain/

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

## 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 build the IREE targets:

```bash
m iree_no_wmmu
```

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

```bash
sim_springbok out/springbok_iree_no_wmmu/springbok_iree/samples/simple_vec_mul/simple_int_vec_mul_bytecode_static
```

The output should be shown as:

```bash
21:27:11.0241 [INFO] cpu2: simprint: "INFO |simple_vec_mul finished successfully", 0 (0x0)
21:27:11.0248 [INFO] cpu2: simprint: "main returned: ", 0 (0x0)
```

(Enter `quit` or `q` to exit the Renode simulation)

## Running The Full Shodan System Simulation

The simulator used for Shodan is [Renode](https://renode.io/). The configuration
for the Shodan system is `sim/config/platforms/shodan.repl`, while and starting script
is in `sim/config/shodan.resc`

To run the full system simulation, build the default target:

```bash
m
```

After all the artifacts are bulit, the Renode simulation session automatically
starts, and you should see the secured core and SMC booted

```bash
10:11:43.1993 [INFO] uart5: init_kernel()
10:11:43.2012 [INFO] uart5: Init local IRQ
10:11:43.2018 [INFO] uart5: Bootstrapping kernel
10:11:43.2053 [INFO] uart5: Initialing PLIC...
10:11:43.2830 [INFO] uart5: Booting all finished, dropped to user space
10:11:43.2978 [INFO] uart5: kata_os_rootserver::Bootinfo: 130550 empty slots 1 nodes 56 untyped 131072 cnode slots
10:11:43.3008 [INFO] uart5: kata_os_rootserver::Model: 3750 objects 32 irqs 0 untypeds 2 asids
10:11:43.3123 [INFO] uart5: kata_os_rootserver::capDL spec: 0.33 Mbytes
10:11:43.3142 [INFO] uart5: kata_os_rootserver::CAmkES components: 1.02 Mbytes
10:11:43.3191 [INFO] uart5: kata_os_rootserver::Rootserver executable: 0.40 Mbytes
```

At this point, you should be able to connect to the SMC debug console.

### Setting Up Debug Console Communication

Install socat to your machine

```bash
sudo apt install socat
```

In a new shell session, launch the debug console with

```bash
scripts/kshell.sh
```

You will see the kataOS prompt showing up when you hit `enter`. Use `ctrl-c` to leave the console.

### Connecting to Renode Console

Renode has its own console to control the emulation environment. You can connect to it by

```bash
telnet localhost 1234
```

For example, you can check the core status

```bash
(matcha) cpu1 IsHalted
False
```

or stop the whole emulation with

```bash
(matcha) quit
```

### Launch ML Job on the Vector Core

You can launch the ML workload execution by communicating through the debug console

Check existing builtin applications

```bash
KATA> builtins
```

Install the embedded ML model app; for example,

```bash
KATA> install mobilenet_v1_emitc_static.model
```

and you should see model installed with a bundle ID issued.

```bash
KATA> Bundle "fake.26" installed
```

You can then launch the ML job with `test_mlexecute <bundle ID> <model name>`

```bash
KATA> test_mlexecute fake.26 mobilenet_v1_emitc_static.model
```

with the Renode console log printed as

```bash
15:17:59.9864 [INFO] uart5: kata_ml_coordinator::Load successful.
...
15:18:02.6868 [INFO] cpu2: simprint: "main returned: ", 0 (0x0)

```

## More Information

For more available Shodan build targets, please see [Build target lists](./BuildTargetsExplained.md),
or use the in-project command of `hmm` and `hmm <target name>`.

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